7 char *strdup(const char *str
)
9 size_t len
= strlen(str
);
10 char *new_str
= malloc(len
+ 1);
12 memcpy(new_str
, str
, len
+ 1);
17 char *strndup(const char *str
, size_t n
)
19 size_t len
= strnlen(str
, n
);
20 char *new_str
= malloc(len
+ 1);
22 memcpy(new_str
, str
, len
+ 1);
27 char *strchrnul(const char *str
, int c
)
29 const char *p
= strchr(str
, c
);
31 p
= (const char *) str
+ strlen(str
);
35 char *strdcat(char **dest
, const char *src
)
39 la
= *dest
? strlen(*dest
) : 0;
41 p
= realloc(*dest
, la
+ lb
+ 1);
45 memcpy(*dest
+ la
, src
, lb
+ 1);
49 char *strdncat(char **dest
, const char *src
, size_t n
)
53 la
= *dest
? strlen(*dest
) : 0;
57 p
= realloc(*dest
, la
+ lb
+ 1);
61 memcpy(*dest
+ la
, src
, lb
);
62 (*dest
)[la
+ lb
] = '\0';
66 char *strdcpy(char **dest
, const char *src
)
71 p
= realloc(*dest
, l
+ 1);
75 memcpy(*dest
, src
, l
+ 1);
79 char *strdncpy(char **dest
, const char *src
, size_t n
)
86 p
= realloc(*dest
, l
+ 1);
90 memcpy(*dest
, src
, l
);
95 char *strdcatc(char **dest
, int ch
)
99 l
= *dest
? strlen(*dest
) : 0;
100 p
= realloc(*dest
, l
+ 2);
105 (*dest
)[l
+ 1] = '\0';
109 char *strldcat(char **dest
, int *dest_len
, const char *src
)
114 p
= realloc(*dest
, *dest_len
+ lb
+ 1);
118 memcpy(*dest
+ *dest_len
, src
, lb
+ 1);
123 char *strldncat(char **dest
, int *dest_len
, const char *src
, size_t n
)
130 p
= realloc(*dest
, *dest_len
+ lb
+ 1);
134 memcpy(*dest
+ *dest_len
, src
, lb
);
135 (*dest
)[*dest_len
+ lb
] = '\0';
140 char *strldcpy(char **dest
, int *dest_len
, const char *src
, int src_len
)
143 p
= realloc(*dest
, src_len
+ 1);
147 memcpy(*dest
, src
, src_len
+ 1);
152 char *strldncpy(char **dest
, int *dest_len
, const char *src
, size_t n
)
159 p
= realloc(*dest
, l
+ 1);
163 memcpy(*dest
, src
, l
);
169 char *strldcatc(char **dest
, int *dest_len
, int ch
)
172 p
= realloc(*dest
, *dest_len
+ 2);
176 (*dest
)[*dest_len
] = ch
;
177 (*dest
)[*dest_len
+ 1] = '\0';
182 char *sdprintf(const char *fmt
, ...)
187 p
= vsdprintf(fmt
, ap
);
192 char *vsdprintf(const char *fmt
, va_list ap
)
196 n
= vsnprintf(buf
, 2, fmt
, ap
);
200 vsprintf(p
, fmt
, ap
);
204 void strtolower(char *str
)
207 *str
= tolower(*str
);
212 void strtoupper(char *str
)
215 *str
= toupper(*str
);
220 char *pathname(const char *str
)
222 char *p
= strrchr(str
, '/');
226 return strndup(str
, p
- str
);
229 char *filesuffix(const char *str
)
231 const char *p
= str
+ strlen(str
) - 1;
234 // Suffix, or hidden file?
235 if (p
== str
|| p
[-1] == '/'){
239 return strdup(p
+ 1);