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 }