Mercurial > hg > nnchat
comparison th_string.c @ 377:9ad157feb99a
Sync th-libs.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 03 Oct 2011 00:04:33 +0300 |
parents | 7f9057e29af2 |
children | afbc3bfd3e03 |
comparison
equal
deleted
inserted
replaced
376:1617d0a0c58e | 377:9ad157feb99a |
---|---|
34 assert(src != NULL); | 34 assert(src != NULL); |
35 assert(dst != NULL); | 35 assert(dst != NULL); |
36 | 36 |
37 /* Copy to the destination */ | 37 /* Copy to the destination */ |
38 i = n; | 38 i = n; |
39 while (*s && i > 0) { | 39 while (*s && i > 0) |
40 { | |
40 *(d++) = *(s++); | 41 *(d++) = *(s++); |
41 i--; | 42 i--; |
42 } | 43 } |
43 | 44 |
44 /* Fill rest of space with zeros */ | 45 /* Fill rest of space with zeros */ |
45 while (i > 0) { | 46 while (i > 0) |
47 { | |
46 *(d++) = 0; | 48 *(d++) = 0; |
47 i--; | 49 i--; |
48 } | 50 } |
49 | 51 |
50 /* Ensure that last is always zero */ | 52 /* Ensure that last is always zero */ |
62 char *buf, *nbuf = NULL; | 64 char *buf, *nbuf = NULL; |
63 | 65 |
64 if ((buf = th_malloc(size)) == NULL) | 66 if ((buf = th_malloc(size)) == NULL) |
65 return NULL; | 67 return NULL; |
66 | 68 |
67 while (1) { | 69 while (1) |
70 { | |
68 int n; | 71 int n; |
69 va_list ap; | 72 va_list ap; |
70 va_copy(ap, args); | 73 va_copy(ap, args); |
71 n = vsnprintf(buf, size, fmt, ap); | 74 n = vsnprintf(buf, size, fmt, ap); |
72 va_end(ap); | 75 va_end(ap); |
76 if (n > -1) | 79 if (n > -1) |
77 size = n + 1; | 80 size = n + 1; |
78 else | 81 else |
79 size *= 2; | 82 size *= 2; |
80 | 83 |
81 if ((nbuf = th_realloc(nbuf, size)) == NULL) { | 84 if ((nbuf = th_realloc(nbuf, size)) == NULL) |
85 { | |
82 th_free(buf); | 86 th_free(buf); |
83 return NULL; | 87 return NULL; |
84 } | 88 } |
85 | 89 |
86 buf = nbuf; | 90 buf = nbuf; |
131 assert(str2 != NULL); | 135 assert(str2 != NULL); |
132 | 136 |
133 if (str1 == str2) | 137 if (str1 == str2) |
134 return 0; | 138 return 0; |
135 | 139 |
136 while (*s1 && *s2 && th_tolower(*s1) == th_tolower(*s2)) { | 140 while (*s1 && *s2 && th_tolower(*s1) == th_tolower(*s2)) |
141 { | |
137 s1++; | 142 s1++; |
138 s2++; | 143 s2++; |
139 } | 144 } |
140 | 145 |
141 return (th_tolower(*s1) - th_tolower(*s2)); | 146 return (th_tolower(*s1) - th_tolower(*s2)); |
149 assert(str2 != NULL); | 154 assert(str2 != NULL); |
150 | 155 |
151 if (str1 == str2) | 156 if (str1 == str2) |
152 return 0; | 157 return 0; |
153 | 158 |
154 while (n > 0 && *s1 && *s2 && th_tolower(*s1) == th_tolower(*s2)) { | 159 while (n > 0 && *s1 && *s2 && th_tolower(*s1) == th_tolower(*s2)) |
160 { | |
155 s1++; | 161 s1++; |
156 s2++; | 162 s2++; |
157 n--; | 163 n--; |
158 } | 164 } |
159 | 165 |
169 char *i, *j; | 175 char *i, *j; |
170 assert(str != NULL); | 176 assert(str != NULL); |
171 | 177 |
172 i = str; | 178 i = str; |
173 j = str; | 179 j = str; |
174 while (*i) { | 180 while (*i) |
181 { | |
175 if (!th_iscntrl(*i)) | 182 if (!th_iscntrl(*i)) |
176 *(j++) = *i; | 183 *(j++) = *i; |
177 i++; | 184 i++; |
178 } | 185 } |
179 | 186 |
206 assert(result != NULL); | 213 assert(result != NULL); |
207 | 214 |
208 if (str == NULL) | 215 if (str == NULL) |
209 return -1; | 216 return -1; |
210 | 217 |
211 if (*result != NULL) { | 218 if (*result != NULL) |
219 { | |
212 *result = th_realloc(*result, strlen(*result) + strlen(str) + 1); | 220 *result = th_realloc(*result, strlen(*result) + strlen(str) + 1); |
213 if (*result == NULL) | 221 if (*result == NULL) |
214 return -1; | 222 return -1; |
215 | 223 |
216 strcat(*result, str); | 224 strcat(*result, str); |
217 } else { | 225 } |
226 else | |
227 { | |
218 *result = th_malloc(strlen(str) + 1); | 228 *result = th_malloc(strlen(str) + 1); |
219 if (*result == NULL) | 229 if (*result == NULL) |
220 return -1; | 230 return -1; |
221 | 231 |
222 strcpy(*result, str); | 232 strcpy(*result, str); |
235 assert(str != NULL); | 245 assert(str != NULL); |
236 | 246 |
237 /* Terminating NULL-character is not whitespace! */ | 247 /* Terminating NULL-character is not whitespace! */ |
238 while (th_isspace(str[*pos])) | 248 while (th_isspace(str[*pos])) |
239 (*pos)++; | 249 (*pos)++; |
250 | |
240 return &str[*pos]; | 251 return &str[*pos]; |
241 } | 252 } |
242 | 253 |
243 | 254 |
244 /* Find next sep-character from string | 255 /* Find next sep-character from string |
282 return FALSE; | 293 return FALSE; |
283 | 294 |
284 /* Start comparision */ | 295 /* Start comparision */ |
285 do { | 296 do { |
286 didMatch = FALSE; | 297 didMatch = FALSE; |
287 switch (*pattern) { | 298 switch (*pattern) |
299 { | |
288 case '?': | 300 case '?': |
289 /* Any single character matches */ | 301 /* Any single character matches */ |
290 if (*str) { | 302 if (*str) |
303 { | |
291 didMatch = TRUE; | 304 didMatch = TRUE; |
292 pattern++; | 305 pattern++; |
293 str++; | 306 str++; |
294 } | 307 } |
295 break; | 308 break; |
302 isAnyMode = TRUE; | 315 isAnyMode = TRUE; |
303 tmpPattern = pattern; | 316 tmpPattern = pattern; |
304 break; | 317 break; |
305 | 318 |
306 case 0: | 319 case 0: |
307 if (isAnyMode) { | 320 if (isAnyMode) |
321 { | |
308 if (*str) | 322 if (*str) |
309 str++; | 323 str++; |
310 else | 324 else |
311 isEnd = TRUE; | 325 isEnd = TRUE; |
312 } else { | 326 } |
313 if (*str) { | 327 else |
314 if (tmpPattern) { | 328 { |
329 if (*str) | |
330 { | |
331 if (tmpPattern) | |
332 { | |
315 isAnyMode = TRUE; | 333 isAnyMode = TRUE; |
316 pattern = tmpPattern; | 334 pattern = tmpPattern; |
317 } else | 335 } |
336 else | |
318 didMatch = FALSE; | 337 didMatch = FALSE; |
319 } else | 338 } else |
320 isEnd = TRUE; | 339 isEnd = TRUE; |
321 } | 340 } |
322 break; | 341 break; |
323 default: | 342 default: |
324 if (isAnyMode) { | 343 if (isAnyMode) |
325 if (*pattern == *str) { | 344 { |
345 if (*pattern == *str) | |
346 { | |
326 isAnyMode = FALSE; | 347 isAnyMode = FALSE; |
327 didMatch = TRUE; | 348 didMatch = TRUE; |
328 } else { | 349 } |
329 if (*str) { | 350 else |
351 { | |
352 if (*str) | |
353 { | |
330 didMatch = TRUE; | 354 didMatch = TRUE; |
331 str++; | 355 str++; |
332 } | 356 } |
333 } | 357 } |
334 } else { | 358 } |
335 if (*pattern == *str) { | 359 else |
360 { | |
361 if (*pattern == *str) | |
362 { | |
336 didMatch = TRUE; | 363 didMatch = TRUE; |
337 if (*pattern) | 364 if (*pattern) |
338 pattern++; | 365 pattern++; |
339 if (*str) | 366 if (*str) |
340 str++; | 367 str++; |
341 } else { | 368 } |
342 if (tmpPattern) { | 369 else |
370 { | |
371 if (tmpPattern) | |
372 { | |
343 didMatch = TRUE; | 373 didMatch = TRUE; |
344 isAnyMode = TRUE; | 374 isAnyMode = TRUE; |
345 pattern = tmpPattern; | 375 pattern = tmpPattern; |
346 } | 376 } |
347 } | 377 } |
373 /* Start comparision */ | 403 /* Start comparision */ |
374 do { | 404 do { |
375 switch (*pattern) { | 405 switch (*pattern) { |
376 case '?': | 406 case '?': |
377 /* Any single character matches */ | 407 /* Any single character matches */ |
378 if (*str) { | 408 if (*str) |
409 { | |
379 pattern++; | 410 pattern++; |
380 str++; | 411 str++; |
381 } else | 412 } else |
382 didMatch = FALSE; | 413 didMatch = FALSE; |
383 break; | 414 break; |
389 isAnyMode = TRUE; | 420 isAnyMode = TRUE; |
390 tmpPattern = pattern; | 421 tmpPattern = pattern; |
391 break; | 422 break; |
392 | 423 |
393 case 0: | 424 case 0: |
394 if (isAnyMode) { | 425 if (isAnyMode) |
426 { | |
395 if (*str) | 427 if (*str) |
396 str++; | 428 str++; |
397 else | 429 else |
398 isEnd = TRUE; | 430 isEnd = TRUE; |
399 } else { | 431 } |
400 if (*str) { | 432 else |
401 if (tmpPattern) { | 433 { |
434 if (*str) | |
435 { | |
436 if (tmpPattern) | |
437 { | |
402 isAnyMode = TRUE; | 438 isAnyMode = TRUE; |
403 pattern = tmpPattern; | 439 pattern = tmpPattern; |
404 } else | 440 } |
441 else | |
405 didMatch = FALSE; | 442 didMatch = FALSE; |
406 } else | 443 } else |
407 isEnd = TRUE; | 444 isEnd = TRUE; |
408 } | 445 } |
409 break; | 446 break; |
410 | 447 |
411 default: | 448 default: |
412 if (isAnyMode) { | 449 if (isAnyMode) |
413 if (th_tolower(*pattern) == th_tolower(*str)) { | 450 { |
451 if (th_tolower(*pattern) == th_tolower(*str)) | |
452 { | |
414 isAnyMode = FALSE; | 453 isAnyMode = FALSE; |
415 } else { | 454 } |
455 else | |
456 { | |
416 if (*str) | 457 if (*str) |
417 str++; | 458 str++; |
418 else | 459 else |
419 didMatch = FALSE; | 460 didMatch = FALSE; |
420 } | 461 } |
421 } else { | 462 } |
422 if (th_tolower(*pattern) == th_tolower(*str)) { | 463 else |
464 { | |
465 if (th_tolower(*pattern) == th_tolower(*str)) | |
466 { | |
423 if (*pattern) | 467 if (*pattern) |
424 pattern++; | 468 pattern++; |
425 if (*str) | 469 if (*str) |
426 str++; | 470 str++; |
427 } else { | 471 } |
428 if (tmpPattern) { | 472 else |
473 { | |
474 if (tmpPattern) | |
475 { | |
429 isAnyMode = TRUE; | 476 isAnyMode = TRUE; |
430 pattern = tmpPattern; | 477 pattern = tmpPattern; |
431 } else | 478 } |
479 else | |
432 didMatch = FALSE; | 480 didMatch = FALSE; |
433 } | 481 } |
434 } | 482 } |
435 | 483 |
436 if (!*str && !*pattern) | 484 if (!*str && !*pattern) |
437 isEnd = TRUE; | 485 isEnd = TRUE; |
486 | |
438 break; | 487 break; |
439 | 488 |
440 } /* switch */ | 489 } /* switch */ |
441 | 490 |
442 } while (didMatch && !isEnd); | 491 } while (didMatch && !isEnd); |
448 int th_get_hex_triplet(const char *str) | 497 int th_get_hex_triplet(const char *str) |
449 { | 498 { |
450 const char *p = str; | 499 const char *p = str; |
451 int len, val = 0; | 500 int len, val = 0; |
452 | 501 |
453 for (len = 0; *p && len < 6; p++, len++) { | 502 for (len = 0; *p && len < 6; p++, len++) |
454 if (*p >= '0' && *p <= '9') { | 503 { |
455 val *= 16; val += (*p - '0'); | 504 if (*p >= '0' && *p <= '9') |
456 } else if (*p >= 'A' && *p <= 'F') { | 505 { |
457 val *= 16; val += (*p - 'A') + 10; | 506 val *= 16; |
458 } else if (*p >= 'a' && *p <= 'f') { | 507 val += (*p - '0'); |
459 val *= 16; val += (*p - 'a') + 10; | 508 } |
460 } else | 509 else if (*p >= 'A' && *p <= 'F') |
510 { | |
511 val *= 16; | |
512 val += (*p - 'A') + 10; | |
513 } | |
514 else if (*p >= 'a' && *p <= 'f') | |
515 { | |
516 val *= 16; | |
517 val += (*p - 'a') + 10; | |
518 } | |
519 else | |
461 return -1; | 520 return -1; |
462 } | 521 } |
463 | 522 |
464 return (len == 6) ? val : -1; | 523 return (len == 6) ? val : -1; |
465 } | 524 } |
468 BOOL th_growbuf(char **buf, size_t *bufsize, size_t *len, size_t grow) | 527 BOOL th_growbuf(char **buf, size_t *bufsize, size_t *len, size_t grow) |
469 { | 528 { |
470 if (*buf == NULL) | 529 if (*buf == NULL) |
471 *bufsize = *len = 0; | 530 *bufsize = *len = 0; |
472 | 531 |
473 if (*buf == NULL || *len + grow >= *bufsize) { | 532 if (*buf == NULL || *len + grow >= *bufsize) |
533 { | |
474 *bufsize += grow + TH_BUFGROW; | 534 *bufsize += grow + TH_BUFGROW; |
475 *buf = (char *) th_realloc(*buf, *bufsize); | 535 *buf = (char *) th_realloc(*buf, *bufsize); |
476 if (*buf == NULL) | 536 if (*buf == NULL) |
477 return FALSE; | 537 return FALSE; |
478 } | 538 } |