-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutil.c
More file actions
126 lines (108 loc) · 2.25 KB
/
util.c
File metadata and controls
126 lines (108 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <unistd.h>
#include "util.h"
char *chrtochr(char *str, int cf, int ct)
{
if ((str = astrchr(str, cf, 1)))
*str = ct;
return str;
}
void clean_up(const char *str, ...)
{
va_list ap;
va_start(ap, str);
while (*str != '\0') {
switch (*str++) {
case 'f' :
if (close(va_arg(ap, int)) < 0)
ERR_EXIT("close");
break;
case 'a' :
free(va_arg(ap, void*));
break;
default :
break;
}
}
va_end(ap);
}
int hash_fun(char *inp)
{
int sum;
for (sum=0; *inp != '\0'; inp++)
sum += *inp;
return sum % HASH_MAX;
}
/* null flag decides whether to append '\0' or not */
void astrcpy(char *dst, const char *src, int len, char null_flag)
{
strncpy(dst, src, len);
if (null_flag) {
*(dst+len) = '\0';
}
}
char *astrchr(char *str, int c, int esc_flag)
{
str = strchr(str, c);
if (esc_flag) {
while (str && *(str-1) == '\\')
str = strchr(++str, c);
}
return str;
}
static inline void shift_str(char *str, int n)
{
char temp_str[strlen(str)]; /* stores orig str */
if (n) { /* else don't shift */
astrcpy(temp_str, str, strlen(str), 1);
/* everything that's skipped here is non relevant */
astrcpy(str+n, temp_str, strlen(temp_str), 1);
}
}
void repl_str(const char *pat, const char *rep, char *start_pat)
{
int len_pat , len_rep, len_diff;
len_pat = strlen(pat);
len_rep = strlen(rep);
len_diff = len_rep-len_pat;
/* only if we get the pattern */
if (start_pat) {
shift_str(start_pat+len_pat, len_diff); /* shift only the stuff after the pattern */
astrcpy(start_pat, rep, len_rep, 0); /* just copy the rep without \0 at end */
}
}
char *int_till_txt(char *str, int *res)
{
char *start_inp, s[LINE_MAX];
char *inp = s;
astrcpy(inp, str, strlen(str), 1);
for (start_inp=inp; isdigit(*inp); str++, inp++)
;
*inp = '\0';
*res = atoi(start_inp);
return str;
}
void stringify(char *dst, char **src)
{
for (; NOTNULL(src); src+=1) {
astrcpy(dst, *src, strlen(*src), 1);
dst += strlen(*src);
if (NOTNULL(src+1))
astrcpy(dst++, " ", 1, 1);
}
}
void prints(char *str)
{
for (; NOTNULL(str); str++) {
if (*str == '\n')
printf("\\n");
else if (*str == '\t')
printf("\\t");
else
printf("%c", *str);
}
}