Mercurial > hg > nnchat
annotate th_string.c @ 361:b3556ff686fc
Fix th_strdup_vprintf().
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 23 Jun 2011 11:10:30 +0300 |
parents | fae4651d37bc |
children | 7f9057e29af2 |
rev | line source |
---|---|
0 | 1 /* |
2 * Miscellaneous string-handling related utility-functions | |
3 * Programmed and designed by Matti 'ccr' Hamalainen | |
4 * (C) Copyright 2002-2008 Tecnic Software productions (TNSP) | |
5 * | |
6 * Please read file 'COPYING' for information on license and distribution. | |
7 */ | |
8 #ifdef HAVE_CONFIG_H | |
2 | 9 #include "config.h" |
0 | 10 #endif |
11 #include "th_string.h" | |
12 | |
79 | 13 /* strdup with a NULL check |
14 */ | |
15 char *th_strdup(const char *s) | |
16 { | |
81 | 17 char *res; |
18 if (s == NULL) | |
19 return NULL; | |
20 | |
21 if ((res = th_malloc(strlen(s) + 1)) == NULL) | |
22 return NULL; | |
23 | |
24 strcpy(res, s); | |
25 return res; | |
79 | 26 } |
27 | |
28 | |
124 | 29 char *th_strncpy(char * dst, const char * src, const size_t n) |
0 | 30 { |
81 | 31 const char *s = src; |
32 char *d = dst; | |
33 size_t i; | |
34 assert(src != NULL); | |
35 assert(dst != NULL); | |
0 | 36 |
81 | 37 /* Copy to the destination */ |
38 i = n; | |
124 | 39 while (*s && i > 0) { |
81 | 40 *(d++) = *(s++); |
41 i--; | |
42 } | |
0 | 43 |
81 | 44 /* Fill rest of space with zeros */ |
45 while (i > 0) { | |
46 *(d++) = 0; | |
47 i--; | |
48 } | |
0 | 49 |
81 | 50 /* Ensure that last is always zero */ |
51 dst[n - 1] = 0; | |
0 | 52 |
81 | 53 return dst; |
0 | 54 } |
55 | |
56 | |
126 | 57 /* Simulate a sprintf() that allocates memory |
124 | 58 */ |
59 char * th_strdup_vprintf(const char *fmt, va_list args) | |
60 { | |
361 | 61 int size = 64; |
126 | 62 char *buf, *nbuf = NULL; |
124 | 63 |
126 | 64 if ((buf = th_malloc(size)) == NULL) |
65 return NULL; | |
66 | |
361 | 67 fprintf(stderr, "th_strdup_vprintf(\"%s\", ...):\n", fmt); |
126 | 68 while (1) { |
361 | 69 int n; |
70 va_list ap; | |
71 va_copy(ap, args); | |
72 n = vsnprintf(buf, size, fmt, ap); | |
73 va_end(ap); | |
74 | |
126 | 75 if (n > -1 && n < size) |
76 return buf; | |
77 if (n > -1) | |
78 size = n + 1; | |
79 else | |
80 size *= 2; | |
361 | 81 |
126 | 82 if ((nbuf = th_realloc(nbuf, size)) == NULL) { |
83 th_free(buf); | |
84 return NULL; | |
124 | 85 } |
126 | 86 |
87 buf = nbuf; | |
124 | 88 } |
89 } | |
90 | |
91 | |
92 char * th_strdup_printf(const char *fmt, ...) | |
93 { | |
94 char *res; | |
95 va_list ap; | |
96 | |
97 va_start(ap, fmt); | |
98 res = th_strdup_vprintf(fmt, ap); | |
99 va_end(ap); | |
100 | |
101 return res; | |
102 } | |
126 | 103 |
124 | 104 |
282
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
105 void th_pstr_vprintf(char **buf, const char *fmt, va_list ap) |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
106 { |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
107 char *tmp = th_strdup_vprintf(fmt, ap); |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
108 th_free(*buf); |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
109 *buf = tmp; |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
110 } |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
111 |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
112 |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
113 void th_pstr_printf(char **buf, const char *fmt, ...) |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
114 { |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
115 char *tmp; |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
116 va_list ap; |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
117 |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
118 va_start(ap, fmt); |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
119 tmp = th_strdup_vprintf(fmt, ap); |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
120 va_end(ap); |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
121 |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
122 th_free(*buf); |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
123 *buf = tmp; |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
124 } |
3dc86d8eb0a9
Added helper functions for easier string manipulation.
Matti Hamalainen <ccr@tnsp.org>
parents:
244
diff
changeset
|
125 |
124 | 126 /* Compare two strings ignoring case [strcasecmp, strncasecmp] |
127 */ | |
128 int th_strcasecmp(const char * str1, const char * str2) | |
129 { | |
130 const char *s1 = str1, *s2 = str2; | |
81 | 131 assert(str1 != NULL); |
132 assert(str2 != NULL); | |
0 | 133 |
81 | 134 if (str1 == str2) |
135 return 0; | |
0 | 136 |
124 | 137 while (*s1 && *s2 && th_tolower(*s1) == th_tolower(*s2)) { |
81 | 138 s1++; |
139 s2++; | |
140 } | |
0 | 141 |
81 | 142 return (th_tolower(*s1) - th_tolower(*s2)); |
0 | 143 } |
144 | |
145 | |
124 | 146 int th_strncasecmp(const char * str1, const char * str2, size_t n) |
0 | 147 { |
124 | 148 const char *s1 = str1, *s2 = str2; |
81 | 149 assert(str1 != NULL); |
150 assert(str2 != NULL); | |
0 | 151 |
81 | 152 if (str1 == str2) |
153 return 0; | |
0 | 154 |
124 | 155 while (n > 0 && *s1 && *s2 && th_tolower(*s1) == th_tolower(*s2)) { |
81 | 156 s1++; |
157 s2++; | |
158 n--; | |
159 } | |
0 | 160 |
124 | 161 return n > 0 ? (th_tolower(*s1) - th_tolower(*s2)) : 0; |
0 | 162 } |
163 | |
164 | |
165 /* Remove all occurences of control characters, in-place. | |
166 * Resulting string is always shorter or same length than original. | |
167 */ | |
11 | 168 void th_strip_ctrlchars(char * str) |
0 | 169 { |
81 | 170 char *i, *j; |
171 assert(str != NULL); | |
0 | 172 |
81 | 173 i = str; |
174 j = str; | |
175 while (*i) { | |
176 if (!th_iscntrl(*i)) | |
177 *(j++) = *i; | |
178 i++; | |
179 } | |
0 | 180 |
81 | 181 *j = 0; |
0 | 182 } |
183 | |
184 | |
11 | 185 /* Copy a given string over in *result. |
0 | 186 */ |
124 | 187 int th_pstrcpy(char ** result, const char * str) |
0 | 188 { |
81 | 189 assert(result != NULL); |
0 | 190 |
81 | 191 if (str == NULL) |
192 return -1; | |
0 | 193 |
81 | 194 th_free(*result); |
124 | 195 if ((*result = th_malloc(strlen(str) + 1)) == NULL) |
81 | 196 return -2; |
0 | 197 |
81 | 198 strcpy(*result, str); |
199 return 0; | |
0 | 200 } |
201 | |
202 | |
11 | 203 /* Concatenates a given string into string pointed by *result. |
0 | 204 */ |
124 | 205 int th_pstrcat(char ** result, const char * str) |
0 | 206 { |
81 | 207 assert(result != NULL); |
0 | 208 |
81 | 209 if (str == NULL) |
210 return -1; | |
0 | 211 |
81 | 212 if (*result != NULL) { |
124 | 213 *result = th_realloc(*result, strlen(*result) + strlen(str) + 1); |
81 | 214 if (*result == NULL) |
215 return -1; | |
0 | 216 |
81 | 217 strcat(*result, str); |
218 } else { | |
124 | 219 *result = th_malloc(strlen(str) + 1); |
81 | 220 if (*result == NULL) |
221 return -1; | |
0 | 222 |
81 | 223 strcpy(*result, str); |
224 } | |
0 | 225 |
81 | 226 return 0; |
0 | 227 } |
228 | |
229 | |
230 /* Find next non-whitespace character in string. | |
231 * Updates iPos into the position of such character and | |
232 * returns pointer to the string. | |
233 */ | |
124 | 234 const char *th_findnext(const char * str, size_t * pos) |
0 | 235 { |
81 | 236 assert(str != NULL); |
0 | 237 |
81 | 238 /* Terminating NULL-character is not whitespace! */ |
124 | 239 while (th_isspace(str[*pos])) |
240 (*pos)++; | |
241 return &str[*pos]; | |
0 | 242 } |
243 | |
244 | |
124 | 245 /* Find next sep-character from string |
0 | 246 */ |
124 | 247 const char *th_findsep(const char * str, size_t * pos, char sep) |
0 | 248 { |
81 | 249 assert(str != NULL); |
0 | 250 |
124 | 251 while (str[*pos] && str[*pos] != sep) |
252 (*pos)++; | |
253 | |
254 return &str[*pos]; | |
0 | 255 } |
256 | |
257 | |
124 | 258 /* Find next sep- or whitespace from string |
0 | 259 */ |
124 | 260 const char *th_findseporspace(const char * str, size_t * pos, char sep) |
0 | 261 { |
81 | 262 assert(str != NULL); |
0 | 263 |
124 | 264 while (!th_isspace(str[*pos]) && str[*pos] != sep) |
265 (*pos)++; | |
266 | |
267 return &str[*pos]; | |
0 | 268 } |
269 | |
270 | |
271 /* Compare a string to a pattern. Case-SENSITIVE version. | |
272 * The matching pattern can consist of any normal characters plus | |
273 * wildcards ? and *. "?" matches any character and "*" matches | |
274 * any number of characters. | |
275 */ | |
124 | 276 BOOL th_strmatch(const char * str, const char * pattern) |
0 | 277 { |
81 | 278 BOOL didMatch = TRUE, isAnyMode = FALSE, isEnd = FALSE; |
124 | 279 const char *tmpPattern = NULL; |
0 | 280 |
81 | 281 /* Check given pattern and string */ |
282 if (str == NULL || pattern == NULL) | |
283 return FALSE; | |
0 | 284 |
81 | 285 /* Start comparision */ |
286 do { | |
287 didMatch = FALSE; | |
288 switch (*pattern) { | |
289 case '?': | |
290 /* Any single character matches */ | |
291 if (*str) { | |
292 didMatch = TRUE; | |
293 pattern++; | |
294 str++; | |
295 } | |
296 break; | |
0 | 297 |
81 | 298 case '*': |
299 didMatch = TRUE; | |
300 pattern++; | |
301 if (!*pattern) | |
302 isEnd = TRUE; | |
303 isAnyMode = TRUE; | |
304 tmpPattern = pattern; | |
305 break; | |
0 | 306 |
81 | 307 case 0: |
308 if (isAnyMode) { | |
309 if (*str) | |
310 str++; | |
311 else | |
312 isEnd = TRUE; | |
313 } else { | |
314 if (*str) { | |
315 if (tmpPattern) { | |
316 isAnyMode = TRUE; | |
317 pattern = tmpPattern; | |
318 } else | |
319 didMatch = FALSE; | |
320 } else | |
321 isEnd = TRUE; | |
322 } | |
323 break; | |
324 default: | |
325 if (isAnyMode) { | |
326 if (*pattern == *str) { | |
327 isAnyMode = FALSE; | |
328 didMatch = TRUE; | |
329 } else { | |
330 if (*str) { | |
331 didMatch = TRUE; | |
332 str++; | |
333 } | |
334 } | |
335 } else { | |
336 if (*pattern == *str) { | |
337 didMatch = TRUE; | |
338 if (*pattern) | |
339 pattern++; | |
340 if (*str) | |
341 str++; | |
342 } else { | |
343 if (tmpPattern) { | |
344 didMatch = TRUE; | |
345 isAnyMode = TRUE; | |
346 pattern = tmpPattern; | |
347 } | |
348 } | |
349 } | |
0 | 350 |
81 | 351 if (!*str && !*pattern) |
352 isEnd = TRUE; | |
353 break; | |
0 | 354 |
81 | 355 } /* switch */ |
0 | 356 |
81 | 357 } while (didMatch && !isEnd); |
0 | 358 |
81 | 359 return didMatch; |
0 | 360 } |
361 | |
362 | |
363 /* Compare a string to a pattern. Case-INSENSITIVE version. | |
364 */ | |
124 | 365 BOOL th_strcasematch(const char * str, const char * pattern) |
0 | 366 { |
81 | 367 BOOL didMatch = TRUE, isAnyMode = FALSE, isEnd = FALSE; |
124 | 368 const char *tmpPattern = NULL; |
0 | 369 |
81 | 370 /* Check given pattern and string */ |
371 if (str == NULL || pattern == NULL) | |
372 return FALSE; | |
0 | 373 |
81 | 374 /* Start comparision */ |
375 do { | |
376 switch (*pattern) { | |
377 case '?': | |
378 /* Any single character matches */ | |
379 if (*str) { | |
380 pattern++; | |
381 str++; | |
382 } else | |
383 didMatch = FALSE; | |
384 break; | |
0 | 385 |
81 | 386 case '*': |
387 pattern++; | |
388 if (!*pattern || *pattern == '?') | |
389 isEnd = TRUE; | |
390 isAnyMode = TRUE; | |
391 tmpPattern = pattern; | |
392 break; | |
0 | 393 |
81 | 394 case 0: |
395 if (isAnyMode) { | |
396 if (*str) | |
397 str++; | |
398 else | |
399 isEnd = TRUE; | |
400 } else { | |
401 if (*str) { | |
402 if (tmpPattern) { | |
403 isAnyMode = TRUE; | |
404 pattern = tmpPattern; | |
405 } else | |
406 didMatch = FALSE; | |
407 } else | |
408 isEnd = TRUE; | |
409 } | |
410 break; | |
0 | 411 |
81 | 412 default: |
413 if (isAnyMode) { | |
414 if (th_tolower(*pattern) == th_tolower(*str)) { | |
415 isAnyMode = FALSE; | |
416 } else { | |
417 if (*str) | |
418 str++; | |
419 else | |
420 didMatch = FALSE; | |
421 } | |
422 } else { | |
423 if (th_tolower(*pattern) == th_tolower(*str)) { | |
424 if (*pattern) | |
425 pattern++; | |
426 if (*str) | |
427 str++; | |
428 } else { | |
429 if (tmpPattern) { | |
430 isAnyMode = TRUE; | |
431 pattern = tmpPattern; | |
432 } else | |
433 didMatch = FALSE; | |
434 } | |
435 } | |
0 | 436 |
81 | 437 if (!*str && !*pattern) |
438 isEnd = TRUE; | |
439 break; | |
0 | 440 |
81 | 441 } /* switch */ |
0 | 442 |
81 | 443 } while (didMatch && !isEnd); |
0 | 444 |
81 | 445 return didMatch; |
0 | 446 } |
447 | |
131
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
448 |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
449 int th_get_hex_triplet(const char *str) |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
450 { |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
451 const char *p = str; |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
452 int len, val = 0; |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
453 |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
454 for (len = 0; *p && len < 6; p++, len++) { |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
455 if (*p >= '0' && *p <= '9') { |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
456 val *= 16; val += (*p - '0'); |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
457 } else if (*p >= 'A' && *p <= 'F') { |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
458 val *= 16; val += (*p - 'A') + 10; |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
459 } else if (*p >= 'a' && *p <= 'f') { |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
460 val *= 16; val += (*p - 'a') + 10; |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
461 } else |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
462 return -1; |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
463 } |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
464 |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
465 return (len == 6) ? val : -1; |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
466 } |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
467 |
3896861974ac
Added th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
127
diff
changeset
|
468 |
327 | 469 BOOL th_growbuf(char **buf, size_t *bufsize, size_t *len, size_t grow) |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
470 { |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
471 if (*buf == NULL) |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
472 *bufsize = *len = 0; |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
473 |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
474 if (*buf == NULL || *len + grow >= *bufsize) { |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
475 *bufsize += grow + TH_BUFGROW; |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
476 *buf = (char *) th_realloc(*buf, *bufsize); |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
477 if (*buf == NULL) |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
478 return FALSE; |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
479 } |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
480 return TRUE; |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
481 } |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
482 |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
483 |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
484 BOOL th_vputch(char **buf, size_t *bufsize, size_t *len, const char ch) |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
485 { |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
486 if (!th_growbuf(buf, bufsize, len, 1)) |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
487 return FALSE; |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
488 |
244
517c7b22b3c9
Buffer pointer handling was wrong in th_vaddch(), fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
243
diff
changeset
|
489 (*buf)[*len] = ch; |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
490 (*len)++; |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
491 |
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
492 return TRUE; |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
493 } |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
494 |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
495 |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
496 BOOL th_vputs(char **buf, size_t *bufsize, size_t *len, const char *str) |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
497 { |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
498 size_t slen; |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
499 if (str == NULL) |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
500 return FALSE; |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
501 |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
502 slen = strlen(str); |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
503 if (!th_growbuf(buf, bufsize, len, slen)) |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
504 return FALSE; |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
505 |
290
f1049f487987
Use strcpy() instead of strcat().
Matti Hamalainen <ccr@tnsp.org>
parents:
287
diff
changeset
|
506 strcpy(*buf + *len, str); |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
507 (*len) += slen; |
287
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
508 |
eb74097b73f5
Make th_vputch() and th_vputs() return a boolean value for success and failure respectively. Also fix a grave bug in th_growbuf().
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
509 return TRUE; |
241
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
510 } |
a1ee6c76ca1c
Functions for growing a string buffer when needed.
Matti Hamalainen <ccr@tnsp.org>
parents:
131
diff
changeset
|
511 |