Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: third_party/libxml/src/triostr.c

Issue 1193533007: Upgrade to libxml 2.9.2 and libxslt 1.1.28 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no iconv Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libxml/src/trionan.c ('k') | third_party/libxml/src/uri.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /************************************************************************* 1 /*************************************************************************
2 * 2 *
3 * $Id$ 3 * $Id$
4 * 4 *
5 * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. 5 * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg.
6 * 6 *
7 * Permission to use, copy, modify, and distribute this software for any 7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above 8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies. 9 * copyright notice and this permission notice appear in all copies.
10 * 10 *
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 # define NIL ((char)0) 45 # define NIL ((char)0)
46 #endif 46 #endif
47 #if !defined(FALSE) 47 #if !defined(FALSE)
48 # define FALSE (1 == 0) 48 # define FALSE (1 == 0)
49 # define TRUE (! FALSE) 49 # define TRUE (! FALSE)
50 #endif 50 #endif
51 #if !defined(BOOLEAN_T) 51 #if !defined(BOOLEAN_T)
52 # define BOOLEAN_T int 52 # define BOOLEAN_T int
53 #endif 53 #endif
54 54
55 #if defined(TRIO_COMPILER_SUPPORTS_C99) 55 #ifdef __VMS
56 # define USE_STRTOD
57 #elif defined(TRIO_COMPILER_SUPPORTS_C99)
56 # define USE_STRTOD 58 # define USE_STRTOD
57 # define USE_STRTOF 59 # define USE_STRTOF
58 #elif defined(TRIO_COMPILER_MSVC) 60 #elif defined(TRIO_COMPILER_MSVC)
59 # define USE_STRTOD 61 # define USE_STRTOD
60 #endif 62 #endif
61 63
62 #if defined(TRIO_PLATFORM_UNIX) 64 #if defined(TRIO_PLATFORM_UNIX)
63 # define USE_STRCASECMP 65 # define USE_STRCASECMP
64 # define USE_STRNCASECMP 66 # define USE_STRNCASECMP
65 # if defined(TRIO_PLATFORM_SUNOS) 67 # if defined(TRIO_PLATFORM_SUNOS)
66 # define USE_SYS_ERRLIST 68 # define USE_SYS_ERRLIST
67 # else 69 # else
68 # define USE_STRERROR 70 # define USE_STRERROR
69 # endif 71 # endif
70 # if defined(TRIO_PLATFORM_QNX) 72 # if defined(TRIO_PLATFORM_QNX)
71 # define strcasecmp(x,y) stricmp(x,y) 73 # define strcasecmp(x,y) stricmp(x,y)
72 # define strncasecmp(x,y,n) strnicmp(x,y,n) 74 # define strncasecmp(x,y,n) strnicmp(x,y,n)
73 # endif 75 # endif
74 #elif defined(TRIO_PLATFORM_WIN32) 76 #elif defined(TRIO_PLATFORM_WIN32)
75 # define USE_STRCASECMP 77 # define USE_STRCASECMP
76 # if defined(_WIN32_WCE) 78 # if defined(_WIN32_WCE)
77 # define strcasecmp(x,y) _stricmp(x,y) 79 # define strcasecmp(x,y) _stricmp(x,y)
78 # else 80 # else
79 # define strcasecmp(x,y) strcmpi(x,y) 81 # define strcasecmp(x,y) strcmpi(x,y)
80 # endif 82 # endif
83 #elif defined(TRIO_PLATFORM_OS400)
84 # define USE_STRCASECMP
85 # define USE_STRNCASECMP
86 # include <strings.h>
81 #endif 87 #endif
82 88
83 #if !(defined(TRIO_PLATFORM_SUNOS)) 89 #if !(defined(TRIO_PLATFORM_SUNOS))
84 # define USE_TOLOWER 90 # define USE_TOLOWER
85 # define USE_TOUPPER 91 # define USE_TOUPPER
86 #endif 92 #endif
87 93
88 /************************************************************************* 94 /*************************************************************************
89 * Structures 95 * Structures
90 */ 96 */
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 TRIO_ARGS1((string), 164 TRIO_ARGS1((string),
159 TRIO_CONST char *string) 165 TRIO_CONST char *string)
160 { 166 {
161 return strlen(string); 167 return strlen(string);
162 } 168 }
163 169
164 170
165 #if !defined(TRIO_MINIMAL) 171 #if !defined(TRIO_MINIMAL)
166 /** 172 /**
167 Append @p source at the end of @p target. 173 Append @p source at the end of @p target.
168 174
169 @param target Target string. 175 @param target Target string.
170 @param source Source string. 176 @param source Source string.
171 @return Boolean value indicating success or failure. 177 @return Boolean value indicating success or failure.
172 178
173 @pre @p target must point to a memory chunk with sufficient room to 179 @pre @p target must point to a memory chunk with sufficient room to
174 contain the @p target string and @p source string. 180 contain the @p target string and @p source string.
175 @pre No boundary checking is performed, so insufficient memory will 181 @pre No boundary checking is performed, so insufficient memory will
176 result in a buffer overrun. 182 result in a buffer overrun.
177 @post @p target will be zero terminated. 183 @post @p target will be zero terminated.
178 */ 184 */
179 TRIO_STRING_PUBLIC int 185 TRIO_STRING_PUBLIC int
180 trio_append 186 trio_append
181 TRIO_ARGS2((target, source), 187 TRIO_ARGS2((target, source),
182 char *target, 188 char *target,
183 TRIO_CONST char *source) 189 TRIO_CONST char *source)
184 { 190 {
185 assert(target); 191 assert(target);
186 assert(source); 192 assert(source);
187 193
188 return (strcat(target, source) != NULL); 194 return (strcat(target, source) != NULL);
189 } 195 }
190 #endif /* !defined(TRIO_MINIMAL) */ 196 #endif /* !defined(TRIO_MINIMAL) */
191 197
192 #if !defined(TRIO_MINIMAL) 198 #if !defined(TRIO_MINIMAL)
193 /** 199 /**
194 Append at most @p max characters from @p source to @p target. 200 Append at most @p max characters from @p source to @p target.
195 201
196 @param target Target string. 202 @param target Target string.
197 @param max Maximum number of characters to append. 203 @param max Maximum number of characters to append.
198 @param source Source string. 204 @param source Source string.
199 @return Boolean value indicating success or failure. 205 @return Boolean value indicating success or failure.
200 206
201 @pre @p target must point to a memory chuck with sufficient room to 207 @pre @p target must point to a memory chuck with sufficient room to
202 contain the @p target string and the @p source string (at most @p max 208 contain the @p target string and the @p source string (at most @p max
203 characters). 209 characters).
204 @pre No boundary checking is performed, so insufficient memory will 210 @pre No boundary checking is performed, so insufficient memory will
205 result in a buffer overrun. 211 result in a buffer overrun.
206 @post @p target will be zero terminated. 212 @post @p target will be zero terminated.
207 */ 213 */
208 TRIO_STRING_PUBLIC int 214 TRIO_STRING_PUBLIC int
209 trio_append_max 215 trio_append_max
210 TRIO_ARGS3((target, max, source), 216 TRIO_ARGS3((target, max, source),
211 char *target, 217 char *target,
212 size_t max, 218 size_t max,
213 TRIO_CONST char *source) 219 TRIO_CONST char *source)
214 { 220 {
215 size_t length; 221 size_t length;
216 222
217 assert(target); 223 assert(target);
218 assert(source); 224 assert(source);
219 225
220 length = trio_length(target); 226 length = trio_length(target);
221 227
222 if (max > length) 228 if (max > length)
223 { 229 {
224 strncat(target, source, max - length - 1); 230 strncat(target, source, max - length - 1);
225 } 231 }
226 return TRUE; 232 return TRUE;
227 } 233 }
228 #endif /* !defined(TRIO_MINIMAL) */ 234 #endif /* !defined(TRIO_MINIMAL) */
229 235
230 236
231 #if !defined(TRIO_MINIMAL) 237 #if !defined(TRIO_MINIMAL)
232 /** 238 /**
233 Determine if a string contains a substring. 239 Determine if a string contains a substring.
234 240
235 @param string String to be searched. 241 @param string String to be searched.
236 @param substring String to be found. 242 @param substring String to be found.
237 @return Boolean value indicating success or failure. 243 @return Boolean value indicating success or failure.
238 */ 244 */
239 TRIO_STRING_PUBLIC int 245 TRIO_STRING_PUBLIC int
240 trio_contains 246 trio_contains
241 TRIO_ARGS2((string, substring), 247 TRIO_ARGS2((string, substring),
242 TRIO_CONST char *string, 248 TRIO_CONST char *string,
243 TRIO_CONST char *substring) 249 TRIO_CONST char *substring)
244 { 250 {
245 assert(string); 251 assert(string);
246 assert(substring); 252 assert(substring);
247 253
248 return (0 != strstr(string, substring)); 254 return (0 != strstr(string, substring));
249 } 255 }
250 #endif /* !defined(TRIO_MINIMAL) */ 256 #endif /* !defined(TRIO_MINIMAL) */
251 257
252 258
253 #if !defined(TRIO_MINIMAL) 259 #if !defined(TRIO_MINIMAL)
254 /** 260 /**
255 Copy @p source to @p target. 261 Copy @p source to @p target.
256 262
257 @param target Target string. 263 @param target Target string.
258 @param source Source string. 264 @param source Source string.
259 @return Boolean value indicating success or failure. 265 @return Boolean value indicating success or failure.
260 266
261 @pre @p target must point to a memory chunk with sufficient room to 267 @pre @p target must point to a memory chunk with sufficient room to
262 contain the @p source string. 268 contain the @p source string.
263 @pre No boundary checking is performed, so insufficient memory will 269 @pre No boundary checking is performed, so insufficient memory will
264 result in a buffer overrun. 270 result in a buffer overrun.
265 @post @p target will be zero terminated. 271 @post @p target will be zero terminated.
266 */ 272 */
267 TRIO_STRING_PUBLIC int 273 TRIO_STRING_PUBLIC int
268 trio_copy 274 trio_copy
269 TRIO_ARGS2((target, source), 275 TRIO_ARGS2((target, source),
270 char *target, 276 char *target,
271 TRIO_CONST char *source) 277 TRIO_CONST char *source)
272 { 278 {
273 assert(target); 279 assert(target);
274 assert(source); 280 assert(source);
275 281
276 (void)strcpy(target, source); 282 (void)strcpy(target, source);
277 return TRUE; 283 return TRUE;
278 } 284 }
279 #endif /* !defined(TRIO_MINIMAL) */ 285 #endif /* !defined(TRIO_MINIMAL) */
280 286
281 287
282 /** 288 /**
283 Copy at most @p max characters from @p source to @p target. 289 Copy at most @p max characters from @p source to @p target.
284 290
285 @param target Target string. 291 @param target Target string.
286 @param max Maximum number of characters to append. 292 @param max Maximum number of characters to append.
287 @param source Source string. 293 @param source Source string.
288 @return Boolean value indicating success or failure. 294 @return Boolean value indicating success or failure.
289 295
290 @pre @p target must point to a memory chunk with sufficient room to 296 @pre @p target must point to a memory chunk with sufficient room to
291 contain the @p source string (at most @p max characters). 297 contain the @p source string (at most @p max characters).
292 @pre No boundary checking is performed, so insufficient memory will 298 @pre No boundary checking is performed, so insufficient memory will
293 result in a buffer overrun. 299 result in a buffer overrun.
294 @post @p target will be zero terminated. 300 @post @p target will be zero terminated.
295 */ 301 */
296 TRIO_STRING_PUBLIC int 302 TRIO_STRING_PUBLIC int
297 trio_copy_max 303 trio_copy_max
298 TRIO_ARGS3((target, max, source), 304 TRIO_ARGS3((target, max, source),
299 char *target, 305 char *target,
(...skipping 29 matching lines...) Expand all
329 if (target) 335 if (target)
330 { 336 {
331 trio_copy_max(target, size, source); 337 trio_copy_max(target, size, source);
332 } 338 }
333 return target; 339 return target;
334 } 340 }
335 341
336 342
337 /** 343 /**
338 Duplicate @p source. 344 Duplicate @p source.
339 345
340 @param source Source string. 346 @param source Source string.
341 @return A copy of the @p source string. 347 @return A copy of the @p source string.
342 348
343 @post @p target will be zero terminated. 349 @post @p target will be zero terminated.
344 */ 350 */
345 TRIO_STRING_PUBLIC char * 351 TRIO_STRING_PUBLIC char *
346 trio_duplicate 352 trio_duplicate
347 TRIO_ARGS1((source), 353 TRIO_ARGS1((source),
348 TRIO_CONST char *source) 354 TRIO_CONST char *source)
349 { 355 {
350 return TrioDuplicateMax(source, trio_length(source)); 356 return TrioDuplicateMax(source, trio_length(source));
351 } 357 }
352 358
353 359
354 #if !defined(TRIO_MINIMAL) 360 #if !defined(TRIO_MINIMAL)
355 /** 361 /**
356 Duplicate at most @p max characters of @p source. 362 Duplicate at most @p max characters of @p source.
357 363
358 @param source Source string. 364 @param source Source string.
359 @param max Maximum number of characters to duplicate. 365 @param max Maximum number of characters to duplicate.
360 @return A copy of the @p source string. 366 @return A copy of the @p source string.
361 367
362 @post @p target will be zero terminated. 368 @post @p target will be zero terminated.
363 */ 369 */
364 TRIO_STRING_PUBLIC char * 370 TRIO_STRING_PUBLIC char *
365 trio_duplicate_max TRIO_ARGS2((source, max), 371 trio_duplicate_max TRIO_ARGS2((source, max),
366 TRIO_CONST char *source, 372 TRIO_CONST char *source,
367 size_t max) 373 size_t max)
368 { 374 {
369 size_t length; 375 size_t length;
370 376
371 assert(source); 377 assert(source);
372 assert(max > 0); 378 assert(max > 0);
373 379
374 length = trio_length(source); 380 length = trio_length(source);
375 if (length > max) 381 if (length > max)
376 { 382 {
377 length = max; 383 length = max;
378 } 384 }
379 return TrioDuplicateMax(source, length); 385 return TrioDuplicateMax(source, length);
380 } 386 }
381 #endif /* !defined(TRIO_MINIMAL) */ 387 #endif /* !defined(TRIO_MINIMAL) */
382 388
383 389
384 /** 390 /**
385 Compare if two strings are equal. 391 Compare if two strings are equal.
386 392
387 @param first First string. 393 @param first First string.
388 @param second Second string. 394 @param second Second string.
389 @return Boolean indicating whether the two strings are equal or not. 395 @return Boolean indicating whether the two strings are equal or not.
390 396
391 Case-insensitive comparison. 397 Case-insensitive comparison.
392 */ 398 */
393 TRIO_STRING_PUBLIC int 399 TRIO_STRING_PUBLIC int
394 trio_equal 400 trio_equal
395 TRIO_ARGS2((first, second), 401 TRIO_ARGS2((first, second),
396 TRIO_CONST char *first, 402 TRIO_CONST char *first,
397 TRIO_CONST char *second) 403 TRIO_CONST char *second)
398 { 404 {
399 assert(first); 405 assert(first);
400 assert(second); 406 assert(second);
(...skipping 14 matching lines...) Expand all
415 } 421 }
416 return ((*first == NIL) && (*second == NIL)); 422 return ((*first == NIL) && (*second == NIL));
417 #endif 423 #endif
418 } 424 }
419 return FALSE; 425 return FALSE;
420 } 426 }
421 427
422 428
423 /** 429 /**
424 Compare if two strings are equal. 430 Compare if two strings are equal.
425 431
426 @param first First string. 432 @param first First string.
427 @param second Second string. 433 @param second Second string.
428 @return Boolean indicating whether the two strings are equal or not. 434 @return Boolean indicating whether the two strings are equal or not.
429 435
430 Case-sensitive comparison. 436 Case-sensitive comparison.
431 */ 437 */
432 TRIO_STRING_PUBLIC int 438 TRIO_STRING_PUBLIC int
433 trio_equal_case 439 trio_equal_case
434 TRIO_ARGS2((first, second), 440 TRIO_ARGS2((first, second),
435 TRIO_CONST char *first, 441 TRIO_CONST char *first,
436 TRIO_CONST char *second) 442 TRIO_CONST char *second)
437 { 443 {
438 assert(first); 444 assert(first);
439 assert(second); 445 assert(second);
440 446
441 if ((first != NULL) && (second != NULL)) 447 if ((first != NULL) && (second != NULL))
442 { 448 {
443 return (0 == strcmp(first, second)); 449 return (0 == strcmp(first, second));
444 } 450 }
445 return FALSE; 451 return FALSE;
446 } 452 }
447 453
448 454
449 #if !defined(TRIO_MINIMAL) 455 #if !defined(TRIO_MINIMAL)
450 /** 456 /**
451 Compare if two strings up until the first @p max characters are equal. 457 Compare if two strings up until the first @p max characters are equal.
452 458
453 @param first First string. 459 @param first First string.
454 @param max Maximum number of characters to compare. 460 @param max Maximum number of characters to compare.
455 @param second Second string. 461 @param second Second string.
456 @return Boolean indicating whether the two strings are equal or not. 462 @return Boolean indicating whether the two strings are equal or not.
457 463
458 Case-sensitive comparison. 464 Case-sensitive comparison.
459 */ 465 */
460 TRIO_STRING_PUBLIC int 466 TRIO_STRING_PUBLIC int
461 trio_equal_case_max 467 trio_equal_case_max
462 TRIO_ARGS3((first, max, second), 468 TRIO_ARGS3((first, max, second),
463 TRIO_CONST char *first, 469 TRIO_CONST char *first,
464 size_t max, 470 size_t max,
465 TRIO_CONST char *second) 471 TRIO_CONST char *second)
466 { 472 {
467 assert(first); 473 assert(first);
468 assert(second); 474 assert(second);
469 475
470 if ((first != NULL) && (second != NULL)) 476 if ((first != NULL) && (second != NULL))
471 { 477 {
472 return (0 == strncmp(first, second, max)); 478 return (0 == strncmp(first, second, max));
473 } 479 }
474 return FALSE; 480 return FALSE;
475 } 481 }
476 #endif /* !defined(TRIO_MINIMAL) */ 482 #endif /* !defined(TRIO_MINIMAL) */
477 483
478 484
479 /** 485 /**
480 Compare if two strings are equal. 486 Compare if two strings are equal.
481 487
482 @param first First string. 488 @param first First string.
483 @param second Second string. 489 @param second Second string.
484 @return Boolean indicating whether the two strings are equal or not. 490 @return Boolean indicating whether the two strings are equal or not.
485 491
486 Collating characters are considered equal. 492 Collating characters are considered equal.
487 */ 493 */
488 TRIO_STRING_PUBLIC int 494 TRIO_STRING_PUBLIC int
489 trio_equal_locale 495 trio_equal_locale
490 TRIO_ARGS2((first, second), 496 TRIO_ARGS2((first, second),
491 TRIO_CONST char *first, 497 TRIO_CONST char *first,
492 TRIO_CONST char *second) 498 TRIO_CONST char *second)
493 { 499 {
494 assert(first); 500 assert(first);
495 assert(second); 501 assert(second);
496 502
497 #if defined(LC_COLLATE) 503 #if defined(LC_COLLATE)
498 return (strcoll(first, second) == 0); 504 return (strcoll(first, second) == 0);
499 #else 505 #else
500 return trio_equal(first, second); 506 return trio_equal(first, second);
501 #endif 507 #endif
502 } 508 }
503 509
504 510
505 /** 511 /**
506 Compare if two strings up until the first @p max characters are equal. 512 Compare if two strings up until the first @p max characters are equal.
507 513
508 @param first First string. 514 @param first First string.
509 @param max Maximum number of characters to compare. 515 @param max Maximum number of characters to compare.
510 @param second Second string. 516 @param second Second string.
511 @return Boolean indicating whether the two strings are equal or not. 517 @return Boolean indicating whether the two strings are equal or not.
512 518
513 Case-insensitive comparison. 519 Case-insensitive comparison.
514 */ 520 */
515 TRIO_STRING_PUBLIC int 521 TRIO_STRING_PUBLIC int
516 trio_equal_max 522 trio_equal_max
517 TRIO_ARGS3((first, max, second), 523 TRIO_ARGS3((first, max, second),
518 TRIO_CONST char *first, 524 TRIO_CONST char *first,
519 size_t max, 525 size_t max,
520 TRIO_CONST char *second) 526 TRIO_CONST char *second)
521 { 527 {
522 assert(first); 528 assert(first);
(...skipping 28 matching lines...) Expand all
551 557
552 @param error_number Error number. 558 @param error_number Error number.
553 @return Textual description of @p error_number. 559 @return Textual description of @p error_number.
554 */ 560 */
555 TRIO_STRING_PUBLIC TRIO_CONST char * 561 TRIO_STRING_PUBLIC TRIO_CONST char *
556 trio_error 562 trio_error
557 TRIO_ARGS1((error_number), 563 TRIO_ARGS1((error_number),
558 int error_number) 564 int error_number)
559 { 565 {
560 #if defined(USE_STRERROR) 566 #if defined(USE_STRERROR)
561 567
562 return strerror(error_number); 568 return strerror(error_number);
563 569
564 #elif defined(USE_SYS_ERRLIST) 570 #elif defined(USE_SYS_ERRLIST)
565 571
566 extern char *sys_errlist[]; 572 extern char *sys_errlist[];
567 extern int sys_nerr; 573 extern int sys_nerr;
568 574
569 return ((error_number < 0) || (error_number >= sys_nerr)) 575 return ((error_number < 0) || (error_number >= sys_nerr))
570 ? "unknown" 576 ? "unknown"
571 : sys_errlist[error_number]; 577 : sys_errlist[error_number];
572 578
573 #else 579 #else
574 580
575 return "unknown"; 581 return "unknown";
576 582
577 #endif 583 #endif
578 } 584 }
579 585
580 586
581 #if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE) 587 #if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE)
582 /** 588 /**
583 Format the date/time according to @p format. 589 Format the date/time according to @p format.
584 590
585 @param target Target string. 591 @param target Target string.
586 @param max Maximum number of characters to format. 592 @param max Maximum number of characters to format.
587 @param format Formatting string. 593 @param format Formatting string.
588 @param datetime Date/time structure. 594 @param datetime Date/time structure.
589 @return Number of formatted characters. 595 @return Number of formatted characters.
590 596
591 The formatting string accepts the same specifiers as the standard C 597 The formatting string accepts the same specifiers as the standard C
592 function strftime. 598 function strftime.
593 */ 599 */
594 TRIO_STRING_PUBLIC size_t 600 TRIO_STRING_PUBLIC size_t
595 trio_format_date_max 601 trio_format_date_max
596 TRIO_ARGS4((target, max, format, datetime), 602 TRIO_ARGS4((target, max, format, datetime),
597 char *target, 603 char *target,
598 size_t max, 604 size_t max,
599 TRIO_CONST char *format, 605 TRIO_CONST char *format,
600 TRIO_CONST struct tm *datetime) 606 TRIO_CONST struct tm *datetime)
601 { 607 {
602 assert(target); 608 assert(target);
603 assert(format); 609 assert(format);
604 assert(datetime); 610 assert(datetime);
605 assert(max > 0); 611 assert(max > 0);
606 612
607 return strftime(target, max, format, datetime); 613 return strftime(target, max, format, datetime);
608 } 614 }
609 #endif /* !defined(TRIO_MINIMAL) */ 615 #endif /* !defined(TRIO_MINIMAL) */
610 616
611 617
612 #if !defined(TRIO_MINIMAL) 618 #if !defined(TRIO_MINIMAL)
613 /** 619 /**
614 Calculate a hash value for a string. 620 Calculate a hash value for a string.
615 621
616 @param string String to be calculated on. 622 @param string String to be calculated on.
617 @param type Hash function. 623 @param type Hash function.
618 @return Calculated hash value. 624 @return Calculated hash value.
619 625
620 @p type can be one of the following 626 @p type can be one of the following
621 @li @c TRIO_HASH_PLAIN Plain hash function. 627 @li @c TRIO_HASH_PLAIN Plain hash function.
622 */ 628 */
623 TRIO_STRING_PUBLIC unsigned long 629 TRIO_STRING_PUBLIC unsigned long
624 trio_hash 630 trio_hash
625 TRIO_ARGS2((string, type), 631 TRIO_ARGS2((string, type),
626 TRIO_CONST char *string, 632 TRIO_CONST char *string,
627 int type) 633 int type)
628 { 634 {
629 unsigned long value = 0L; 635 unsigned long value = 0L;
630 char ch; 636 char ch;
631 637
632 assert(string); 638 assert(string);
633 639
634 switch (type) 640 switch (type)
635 { 641 {
636 case TRIO_HASH_PLAIN: 642 case TRIO_HASH_PLAIN:
637 while ( (ch = *string++) != NIL ) 643 while ( (ch = *string++) != NIL )
638 { 644 {
639 value *= 31; 645 value *= 31;
640 value += (unsigned long)ch; 646 value += (unsigned long)ch;
641 } 647 }
642 break; 648 break;
643 default: 649 default:
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 718
713 #if !defined(TRIO_MINIMAL) 719 #if !defined(TRIO_MINIMAL)
714 /** 720 /**
715 Compare two strings using wildcards. 721 Compare two strings using wildcards.
716 722
717 @param string String to be searched. 723 @param string String to be searched.
718 @param pattern Pattern, including wildcards, to search for. 724 @param pattern Pattern, including wildcards, to search for.
719 @return Boolean value indicating success or failure. 725 @return Boolean value indicating success or failure.
720 726
721 Case-insensitive comparison. 727 Case-insensitive comparison.
722 728
723 The following wildcards can be used 729 The following wildcards can be used
724 @li @c * Match any number of characters. 730 @li @c * Match any number of characters.
725 @li @c ? Match a single character. 731 @li @c ? Match a single character.
726 */ 732 */
727 TRIO_STRING_PUBLIC int 733 TRIO_STRING_PUBLIC int
728 trio_match 734 trio_match
729 TRIO_ARGS2((string, pattern), 735 TRIO_ARGS2((string, pattern),
730 TRIO_CONST char *string, 736 TRIO_CONST char *string,
731 TRIO_CONST char *pattern) 737 TRIO_CONST char *pattern)
732 { 738 {
733 assert(string); 739 assert(string);
734 assert(pattern); 740 assert(pattern);
735 741
736 for (; ('*' != *pattern); ++pattern, ++string) 742 for (; ('*' != *pattern); ++pattern, ++string)
737 { 743 {
738 if (NIL == *string) 744 if (NIL == *string)
739 { 745 {
740 return (NIL == *pattern); 746 return (NIL == *pattern);
741 } 747 }
742 if ((trio_to_upper((int)*string) != trio_to_upper((int)*pattern)) 748 if ((trio_to_upper((int)*string) != trio_to_upper((int)*pattern))
743 && ('?' != *pattern)) 749 && ('?' != *pattern))
744 { 750 {
745 return FALSE; 751 return FALSE;
746 } 752 }
747 } 753 }
748 /* two-line patch to prevent *too* much recursiveness: */ 754 /* two-line patch to prevent *too* much recursiveness: */
749 while ('*' == pattern[1]) 755 while ('*' == pattern[1])
750 pattern++; 756 pattern++;
751 757
752 do 758 do
753 { 759 {
754 if ( trio_match(string, &pattern[1]) ) 760 if ( trio_match(string, &pattern[1]) )
755 { 761 {
756 return TRUE; 762 return TRUE;
757 } 763 }
758 } 764 }
759 while (*string++); 765 while (*string++);
760 766
761 return FALSE; 767 return FALSE;
762 } 768 }
763 #endif /* !defined(TRIO_MINIMAL) */ 769 #endif /* !defined(TRIO_MINIMAL) */
764 770
765 771
766 #if !defined(TRIO_MINIMAL) 772 #if !defined(TRIO_MINIMAL)
767 /** 773 /**
768 Compare two strings using wildcards. 774 Compare two strings using wildcards.
769 775
770 @param string String to be searched. 776 @param string String to be searched.
771 @param pattern Pattern, including wildcards, to search for. 777 @param pattern Pattern, including wildcards, to search for.
772 @return Boolean value indicating success or failure. 778 @return Boolean value indicating success or failure.
773 779
774 Case-sensitive comparison. 780 Case-sensitive comparison.
775 781
776 The following wildcards can be used 782 The following wildcards can be used
777 @li @c * Match any number of characters. 783 @li @c * Match any number of characters.
778 @li @c ? Match a single character. 784 @li @c ? Match a single character.
779 */ 785 */
780 TRIO_STRING_PUBLIC int 786 TRIO_STRING_PUBLIC int
781 trio_match_case 787 trio_match_case
782 TRIO_ARGS2((string, pattern), 788 TRIO_ARGS2((string, pattern),
783 TRIO_CONST char *string, 789 TRIO_CONST char *string,
784 TRIO_CONST char *pattern) 790 TRIO_CONST char *pattern)
785 { 791 {
786 assert(string); 792 assert(string);
787 assert(pattern); 793 assert(pattern);
788 794
789 for (; ('*' != *pattern); ++pattern, ++string) 795 for (; ('*' != *pattern); ++pattern, ++string)
790 { 796 {
791 if (NIL == *string) 797 if (NIL == *string)
792 { 798 {
793 return (NIL == *pattern); 799 return (NIL == *pattern);
794 } 800 }
795 if ((*string != *pattern) 801 if ((*string != *pattern)
796 && ('?' != *pattern)) 802 && ('?' != *pattern))
797 { 803 {
798 return FALSE; 804 return FALSE;
799 } 805 }
800 } 806 }
801 /* two-line patch to prevent *too* much recursiveness: */ 807 /* two-line patch to prevent *too* much recursiveness: */
802 while ('*' == pattern[1]) 808 while ('*' == pattern[1])
803 pattern++; 809 pattern++;
804 810
805 do 811 do
806 { 812 {
807 if ( trio_match_case(string, &pattern[1]) ) 813 if ( trio_match_case(string, &pattern[1]) )
808 { 814 {
809 return TRUE; 815 return TRUE;
810 } 816 }
811 } 817 }
812 while (*string++); 818 while (*string++);
813 819
814 return FALSE; 820 return FALSE;
815 } 821 }
816 #endif /* !defined(TRIO_MINIMAL) */ 822 #endif /* !defined(TRIO_MINIMAL) */
817 823
818 824
819 #if !defined(TRIO_MINIMAL) 825 #if !defined(TRIO_MINIMAL)
820 /** 826 /**
821 Execute a function on each character in string. 827 Execute a function on each character in string.
822 828
823 @param target Target string. 829 @param target Target string.
824 @param source Source string. 830 @param source Source string.
825 @param Function Function to be executed. 831 @param Function Function to be executed.
826 @return Number of processed characters. 832 @return Number of processed characters.
827 */ 833 */
828 TRIO_STRING_PUBLIC size_t 834 TRIO_STRING_PUBLIC size_t
829 trio_span_function 835 trio_span_function
830 TRIO_ARGS3((target, source, Function), 836 TRIO_ARGS3((target, source, Function),
831 char *target, 837 char *target,
832 TRIO_CONST char *source, 838 TRIO_CONST char *source,
833 int (*Function) TRIO_PROTO((int))) 839 int (*Function) TRIO_PROTO((int)))
834 { 840 {
835 size_t count = 0; 841 size_t count = 0;
836 842
837 assert(target); 843 assert(target);
838 assert(source); 844 assert(source);
839 assert(Function); 845 assert(Function);
840 846
841 while (*source != NIL) 847 while (*source != NIL)
842 { 848 {
843 *target++ = Function(*source++); 849 *target++ = Function(*source++);
844 count++; 850 count++;
845 } 851 }
846 return count; 852 return count;
847 } 853 }
848 #endif /* !defined(TRIO_MINIMAL) */ 854 #endif /* !defined(TRIO_MINIMAL) */
849 855
850 856
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 TRIO_CONST char *string, 893 TRIO_CONST char *string,
888 size_t max, 894 size_t max,
889 TRIO_CONST char *substring) 895 TRIO_CONST char *substring)
890 { 896 {
891 size_t count; 897 size_t count;
892 size_t size; 898 size_t size;
893 char *result = NULL; 899 char *result = NULL;
894 900
895 assert(string); 901 assert(string);
896 assert(substring); 902 assert(substring);
897 903
898 size = trio_length(substring); 904 size = trio_length(substring);
899 if (size <= max) 905 if (size <= max)
900 { 906 {
901 for (count = 0; count <= max - size; count++) 907 for (count = 0; count <= max - size; count++)
902 { 908 {
903 if (trio_equal_max(substring, size, &string[count])) 909 if (trio_equal_max(substring, size, &string[count]))
904 { 910 {
905 result = (char *)&string[count]; 911 result = (char *)&string[count];
906 break; 912 break;
907 } 913 }
(...skipping 14 matching lines...) Expand all
922 928
923 @warning @p string will be destroyed. 929 @warning @p string will be destroyed.
924 */ 930 */
925 TRIO_STRING_PUBLIC char * 931 TRIO_STRING_PUBLIC char *
926 trio_tokenize 932 trio_tokenize
927 TRIO_ARGS2((string, delimiters), 933 TRIO_ARGS2((string, delimiters),
928 char *string, 934 char *string,
929 TRIO_CONST char *delimiters) 935 TRIO_CONST char *delimiters)
930 { 936 {
931 assert(delimiters); 937 assert(delimiters);
932 938
933 return strtok(string, delimiters); 939 return strtok(string, delimiters);
934 } 940 }
935 #endif /* !defined(TRIO_MINIMAL) */ 941 #endif /* !defined(TRIO_MINIMAL) */
936 942
937 943
938 /** 944 /**
939 Convert string to floating-point number. 945 Convert string to floating-point number.
940 946
941 @param source String to be converted. 947 @param source String to be converted.
942 @param endp Pointer to end of the converted string. 948 @param endp Pointer to end of the converted string.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 if ((*source == '+') || (*source == '-')) 1063 if ((*source == '+') || (*source == '-'))
1058 source++; 1064 source++;
1059 while (isdigit((int)*source)) 1065 while (isdigit((int)*source))
1060 { 1066 {
1061 exponent *= (int)base; 1067 exponent *= (int)base;
1062 exponent += (*source - '0'); 1068 exponent += (*source - '0');
1063 source++; 1069 source++;
1064 } 1070 }
1065 } 1071 }
1066 } 1072 }
1067 1073
1068 value = integer + fraction; 1074 value = integer + fraction;
1069 if (exponent != 0) 1075 if (exponent != 0)
1070 { 1076 {
1071 if (isExponentNegative) 1077 if (isExponentNegative)
1072 value /= pow(base, (double)exponent); 1078 value /= pow(base, (double)exponent);
1073 else 1079 else
1074 value *= pow(base, (double)exponent); 1080 value *= pow(base, (double)exponent);
1075 } 1081 }
1076 if (isNegative) 1082 if (isNegative)
1077 value = -value; 1083 value = -value;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1139 */ 1145 */
1140 TRIO_STRING_PUBLIC long 1146 TRIO_STRING_PUBLIC long
1141 trio_to_long 1147 trio_to_long
1142 TRIO_ARGS3((string, endp, base), 1148 TRIO_ARGS3((string, endp, base),
1143 TRIO_CONST char *string, 1149 TRIO_CONST char *string,
1144 char **endp, 1150 char **endp,
1145 int base) 1151 int base)
1146 { 1152 {
1147 assert(string); 1153 assert(string);
1148 assert((base >= 2) && (base <= 36)); 1154 assert((base >= 2) && (base <= 36));
1149 1155
1150 return strtol(string, endp, base); 1156 return strtol(string, endp, base);
1151 } 1157 }
1152 1158
1153 1159
1154 #if !defined(TRIO_MINIMAL) 1160 #if !defined(TRIO_MINIMAL)
1155 /** 1161 /**
1156 Convert one alphabetic letter to lower-case. 1162 Convert one alphabetic letter to lower-case.
1157 1163
1158 @param source The letter to be converted. 1164 @param source The letter to be converted.
1159 @return The converted letter. 1165 @return The converted letter.
1160 */ 1166 */
1161 TRIO_STRING_PUBLIC int 1167 TRIO_STRING_PUBLIC int
1162 trio_to_lower 1168 trio_to_lower
1163 TRIO_ARGS1((source), 1169 TRIO_ARGS1((source),
1164 int source) 1170 int source)
1165 { 1171 {
1166 #if defined(USE_TOLOWER) 1172 #if defined(USE_TOLOWER)
1167 1173
1168 return tolower(source); 1174 return tolower(source);
1169 1175
1170 #else 1176 #else
1171 1177
1172 /* Does not handle locales or non-contiguous alphabetic characters */ 1178 /* Does not handle locales or non-contiguous alphabetic characters */
1173 return ((source >= (int)'A') && (source <= (int)'Z')) 1179 return ((source >= (int)'A') && (source <= (int)'Z'))
1174 ? source - 'A' + 'a' 1180 ? source - 'A' + 'a'
1175 : source; 1181 : source;
1176 1182
1177 #endif 1183 #endif
1178 } 1184 }
1179 #endif /* !defined(TRIO_MINIMAL) */ 1185 #endif /* !defined(TRIO_MINIMAL) */
1180 1186
1181 #if !defined(TRIO_MINIMAL) 1187 #if !defined(TRIO_MINIMAL)
1182 /** 1188 /**
1183 Convert string to unsigned integer. 1189 Convert string to unsigned integer.
1184 1190
1185 @param string String to be converted. 1191 @param string String to be converted.
1186 @param endp Pointer to end of converted string. 1192 @param endp Pointer to end of converted string.
1187 @param base Radix number of number. 1193 @param base Radix number of number.
1188 */ 1194 */
1189 TRIO_STRING_PUBLIC unsigned long 1195 TRIO_STRING_PUBLIC unsigned long
1190 trio_to_unsigned_long 1196 trio_to_unsigned_long
1191 TRIO_ARGS3((string, endp, base), 1197 TRIO_ARGS3((string, endp, base),
1192 TRIO_CONST char *string, 1198 TRIO_CONST char *string,
1193 char **endp, 1199 char **endp,
1194 int base) 1200 int base)
1195 { 1201 {
1196 assert(string); 1202 assert(string);
1197 assert((base >= 2) && (base <= 36)); 1203 assert((base >= 2) && (base <= 36));
1198 1204
1199 return strtoul(string, endp, base); 1205 return strtoul(string, endp, base);
1200 } 1206 }
1201 #endif /* !defined(TRIO_MINIMAL) */ 1207 #endif /* !defined(TRIO_MINIMAL) */
1202 1208
1203 1209
1204 /** 1210 /**
1205 Convert one alphabetic letter to upper-case. 1211 Convert one alphabetic letter to upper-case.
1206 1212
1207 @param source The letter to be converted. 1213 @param source The letter to be converted.
1208 @return The converted letter. 1214 @return The converted letter.
1209 */ 1215 */
1210 TRIO_STRING_PUBLIC int 1216 TRIO_STRING_PUBLIC int
1211 trio_to_upper 1217 trio_to_upper
1212 TRIO_ARGS1((source), 1218 TRIO_ARGS1((source),
1213 int source) 1219 int source)
1214 { 1220 {
1215 #if defined(USE_TOUPPER) 1221 #if defined(USE_TOUPPER)
1216 1222
1217 return toupper(source); 1223 return toupper(source);
1218 1224
1219 #else 1225 #else
1220 1226
1221 /* Does not handle locales or non-contiguous alphabetic characters */ 1227 /* Does not handle locales or non-contiguous alphabetic characters */
1222 return ((source >= (int)'a') && (source <= (int)'z')) 1228 return ((source >= (int)'a') && (source <= (int)'z'))
1223 ? source - 'a' + 'A' 1229 ? source - 'a' + 'A'
1224 : source; 1230 : source;
1225 1231
1226 #endif 1232 #endif
1227 } 1233 }
1228 1234
1229 #if !defined(TRIO_MINIMAL) 1235 #if !defined(TRIO_MINIMAL)
1230 /** 1236 /**
1231 Convert the alphabetic letters in the string to upper-case. 1237 Convert the alphabetic letters in the string to upper-case.
1232 1238
1233 @param target The string to be converted. 1239 @param target The string to be converted.
1234 @return The number of processed characters (converted or not). 1240 @return The number of processed characters (converted or not).
1235 */ 1241 */
(...skipping 23 matching lines...) Expand all
1259 @{ 1265 @{
1260 */ 1266 */
1261 1267
1262 /* 1268 /*
1263 * TrioStringAlloc 1269 * TrioStringAlloc
1264 */ 1270 */
1265 TRIO_STRING_PRIVATE trio_string_t * 1271 TRIO_STRING_PRIVATE trio_string_t *
1266 TrioStringAlloc(TRIO_NOARGS) 1272 TrioStringAlloc(TRIO_NOARGS)
1267 { 1273 {
1268 trio_string_t *self; 1274 trio_string_t *self;
1269 1275
1270 self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t)); 1276 self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t));
1271 if (self) 1277 if (self)
1272 { 1278 {
1273 self->content = NULL; 1279 self->content = NULL;
1274 self->length = 0; 1280 self->length = 0;
1275 self->allocated = 0; 1281 self->allocated = 0;
1276 } 1282 }
1277 return self; 1283 return self;
1278 } 1284 }
1279 1285
(...skipping 10 matching lines...) Expand all
1290 trio_string_t *self, 1296 trio_string_t *self,
1291 size_t delta) 1297 size_t delta)
1292 { 1298 {
1293 BOOLEAN_T status = FALSE; 1299 BOOLEAN_T status = FALSE;
1294 char *new_content; 1300 char *new_content;
1295 size_t new_size; 1301 size_t new_size;
1296 1302
1297 new_size = (delta == 0) 1303 new_size = (delta == 0)
1298 ? ( (self->allocated == 0) ? 1 : self->allocated * 2 ) 1304 ? ( (self->allocated == 0) ? 1 : self->allocated * 2 )
1299 : self->allocated + delta; 1305 : self->allocated + delta;
1300 1306
1301 new_content = (char *)TRIO_REALLOC(self->content, new_size); 1307 new_content = (char *)TRIO_REALLOC(self->content, new_size);
1302 if (new_content) 1308 if (new_content)
1303 { 1309 {
1304 self->content = new_content; 1310 self->content = new_content;
1305 self->allocated = new_size; 1311 self->allocated = new_size;
1306 status = TRUE; 1312 status = TRUE;
1307 } 1313 }
1308 return status; 1314 return status;
1309 } 1315 }
1310 1316
(...skipping 16 matching lines...) Expand all
1327 return (self->allocated < length) 1333 return (self->allocated < length)
1328 ? TrioStringGrow(self, length - self->allocated) 1334 ? TrioStringGrow(self, length - self->allocated)
1329 : TRUE; 1335 : TRUE;
1330 } 1336 }
1331 #endif /* !defined(TRIO_MINIMAL) */ 1337 #endif /* !defined(TRIO_MINIMAL) */
1332 1338
1333 1339
1334 #if !defined(TRIO_MINIMAL) 1340 #if !defined(TRIO_MINIMAL)
1335 /** 1341 /**
1336 Create a new dynamic string. 1342 Create a new dynamic string.
1337 1343
1338 @param initial_size Initial size of the buffer. 1344 @param initial_size Initial size of the buffer.
1339 @return Newly allocated dynamic string, or NULL if memory allocation failed. 1345 @return Newly allocated dynamic string, or NULL if memory allocation failed.
1340 */ 1346 */
1341 TRIO_STRING_PUBLIC trio_string_t * 1347 TRIO_STRING_PUBLIC trio_string_t *
1342 trio_string_create 1348 trio_string_create
1343 TRIO_ARGS1((initial_size), 1349 TRIO_ARGS1((initial_size),
1344 int initial_size) 1350 int initial_size)
1345 { 1351 {
1346 trio_string_t *self; 1352 trio_string_t *self;
1347 1353
(...skipping 12 matching lines...) Expand all
1360 self = NULL; 1366 self = NULL;
1361 } 1367 }
1362 } 1368 }
1363 return self; 1369 return self;
1364 } 1370 }
1365 #endif /* !defined(TRIO_MINIMAL) */ 1371 #endif /* !defined(TRIO_MINIMAL) */
1366 1372
1367 1373
1368 /** 1374 /**
1369 Deallocate the dynamic string and its contents. 1375 Deallocate the dynamic string and its contents.
1370 1376
1371 @param self Dynamic string 1377 @param self Dynamic string
1372 */ 1378 */
1373 TRIO_STRING_PUBLIC void 1379 TRIO_STRING_PUBLIC void
1374 trio_string_destroy 1380 trio_string_destroy
1375 TRIO_ARGS1((self), 1381 TRIO_ARGS1((self),
1376 trio_string_t *self) 1382 trio_string_t *self)
1377 { 1383 {
1378 assert(self); 1384 assert(self);
1379 1385
1380 if (self) 1386 if (self)
1381 { 1387 {
1382 trio_destroy(self->content); 1388 trio_destroy(self->content);
1383 TRIO_FREE(self); 1389 TRIO_FREE(self);
1384 } 1390 }
1385 } 1391 }
1386 1392
1387 1393
1388 #if !defined(TRIO_MINIMAL) 1394 #if !defined(TRIO_MINIMAL)
1389 /** 1395 /**
1390 Get a pointer to the content. 1396 Get a pointer to the content.
1391 1397
1392 @param self Dynamic string. 1398 @param self Dynamic string.
1393 @param offset Offset into content. 1399 @param offset Offset into content.
1394 @return Pointer to the content. 1400 @return Pointer to the content.
1395 1401
1396 @p Offset can be zero, positive, or negative. If @p offset is zero, 1402 @p Offset can be zero, positive, or negative. If @p offset is zero,
1397 then the start of the content will be returned. If @p offset is positive, 1403 then the start of the content will be returned. If @p offset is positive,
1398 then a pointer to @p offset number of characters from the beginning of the 1404 then a pointer to @p offset number of characters from the beginning of the
1399 content is returned. If @p offset is negative, then a pointer to @p offset 1405 content is returned. If @p offset is negative, then a pointer to @p offset
1400 number of characters from the ending of the string, starting at the 1406 number of characters from the ending of the string, starting at the
1401 terminating zero, is returned. 1407 terminating zero, is returned.
1402 */ 1408 */
1403 TRIO_STRING_PUBLIC char * 1409 TRIO_STRING_PUBLIC char *
1404 trio_string_get 1410 trio_string_get
1405 TRIO_ARGS2((self, offset), 1411 TRIO_ARGS2((self, offset),
1406 trio_string_t *self, 1412 trio_string_t *self,
1407 int offset) 1413 int offset)
1408 { 1414 {
1409 char *result = NULL; 1415 char *result = NULL;
1410 1416
1411 assert(self); 1417 assert(self);
1412 1418
1413 if (self->content != NULL) 1419 if (self->content != NULL)
1414 { 1420 {
1415 if (self->length == 0) 1421 if (self->length == 0)
1416 { 1422 {
1417 (void)trio_string_length(self); 1423 (void)trio_string_length(self);
1418 } 1424 }
1419 if (offset >= 0) 1425 if (offset >= 0)
1420 { 1426 {
(...skipping 12 matching lines...) Expand all
1433 } 1439 }
1434 result = &(self->content[offset]); 1440 result = &(self->content[offset]);
1435 } 1441 }
1436 return result; 1442 return result;
1437 } 1443 }
1438 #endif /* !defined(TRIO_MINIMAL) */ 1444 #endif /* !defined(TRIO_MINIMAL) */
1439 1445
1440 1446
1441 /** 1447 /**
1442 Extract the content. 1448 Extract the content.
1443 1449
1444 @param self Dynamic String 1450 @param self Dynamic String
1445 @return Content of dynamic string. 1451 @return Content of dynamic string.
1446 1452
1447 The content is removed from the dynamic string. This enables destruction 1453 The content is removed from the dynamic string. This enables destruction
1448 of the dynamic string without deallocation of the content. 1454 of the dynamic string without deallocation of the content.
1449 */ 1455 */
1450 TRIO_STRING_PUBLIC char * 1456 TRIO_STRING_PUBLIC char *
1451 trio_string_extract 1457 trio_string_extract
1452 TRIO_ARGS1((self), 1458 TRIO_ARGS1((self),
1453 trio_string_t *self) 1459 trio_string_t *self)
1454 { 1460 {
1455 char *result; 1461 char *result;
1456 1462
1457 assert(self); 1463 assert(self);
1458 1464
1459 result = self->content; 1465 result = self->content;
1460 /* FIXME: Allocate new empty buffer? */ 1466 /* FIXME: Allocate new empty buffer? */
1461 self->content = NULL; 1467 self->content = NULL;
1462 self->length = self->allocated = 0; 1468 self->length = self->allocated = 0;
1463 return result; 1469 return result;
1464 } 1470 }
1465 1471
1466 1472
1467 #if !defined(TRIO_MINIMAL) 1473 #if !defined(TRIO_MINIMAL)
1468 /** 1474 /**
1469 Set the content of the dynamic string. 1475 Set the content of the dynamic string.
1470 1476
1471 @param self Dynamic String 1477 @param self Dynamic String
1472 @param buffer The new content. 1478 @param buffer The new content.
1473 1479
1474 Sets the content of the dynamic string to a copy @p buffer. 1480 Sets the content of the dynamic string to a copy @p buffer.
1475 An existing content will be deallocated first, if necessary. 1481 An existing content will be deallocated first, if necessary.
1476 1482
1477 @remark 1483 @remark
1478 This function will make a copy of @p buffer. 1484 This function will make a copy of @p buffer.
1479 You are responsible for deallocating @p buffer yourself. 1485 You are responsible for deallocating @p buffer yourself.
1480 */ 1486 */
1481 TRIO_STRING_PUBLIC void 1487 TRIO_STRING_PUBLIC void
1482 trio_xstring_set 1488 trio_xstring_set
1483 TRIO_ARGS2((self, buffer), 1489 TRIO_ARGS2((self, buffer),
1484 trio_string_t *self, 1490 trio_string_t *self,
1485 char *buffer) 1491 char *buffer)
1486 { 1492 {
(...skipping 27 matching lines...) Expand all
1514 TRIO_ARGS1((self), 1520 TRIO_ARGS1((self),
1515 trio_string_t *self) 1521 trio_string_t *self)
1516 { 1522 {
1517 trio_xstring_append_char(self, 0); 1523 trio_xstring_append_char(self, 0);
1518 } 1524 }
1519 1525
1520 1526
1521 #if !defined(TRIO_MINIMAL) 1527 #if !defined(TRIO_MINIMAL)
1522 /** 1528 /**
1523 Append the second string to the first. 1529 Append the second string to the first.
1524 1530
1525 @param self Dynamic string to be modified. 1531 @param self Dynamic string to be modified.
1526 @param other Dynamic string to copy from. 1532 @param other Dynamic string to copy from.
1527 @return Boolean value indicating success or failure. 1533 @return Boolean value indicating success or failure.
1528 */ 1534 */
1529 TRIO_STRING_PUBLIC int 1535 TRIO_STRING_PUBLIC int
1530 trio_string_append 1536 trio_string_append
1531 TRIO_ARGS2((self, other), 1537 TRIO_ARGS2((self, other),
1532 trio_string_t *self, 1538 trio_string_t *self,
1533 trio_string_t *other) 1539 trio_string_t *other)
1534 { 1540 {
1535 size_t length; 1541 size_t length;
1536 1542
1537 assert(self); 1543 assert(self);
1538 assert(other); 1544 assert(other);
1539 1545
1540 length = self->length + other->length; 1546 length = self->length + other->length;
1541 if (!TrioStringGrowTo(self, length)) 1547 if (!TrioStringGrowTo(self, length))
1542 goto error; 1548 goto error;
1543 trio_copy(&self->content[self->length], other->content); 1549 trio_copy(&self->content[self->length], other->content);
1544 self->length = length; 1550 self->length = length;
1545 return TRUE; 1551 return TRUE;
1546 1552
1547 error: 1553 error:
1548 return FALSE; 1554 return FALSE;
1549 } 1555 }
1550 #endif /* !defined(TRIO_MINIMAL) */ 1556 #endif /* !defined(TRIO_MINIMAL) */
1551 1557
1552 1558
1553 #if !defined(TRIO_MINIMAL) 1559 #if !defined(TRIO_MINIMAL)
1554 /* 1560 /*
1555 * trio_xstring_append 1561 * trio_xstring_append
1556 */ 1562 */
1557 TRIO_STRING_PUBLIC int 1563 TRIO_STRING_PUBLIC int
1558 trio_xstring_append 1564 trio_xstring_append
1559 TRIO_ARGS2((self, other), 1565 TRIO_ARGS2((self, other),
1560 trio_string_t *self, 1566 trio_string_t *self,
1561 TRIO_CONST char *other) 1567 TRIO_CONST char *other)
1562 { 1568 {
1563 size_t length; 1569 size_t length;
1564 1570
1565 assert(self); 1571 assert(self);
1566 assert(other); 1572 assert(other);
1567 1573
1568 length = self->length + trio_length(other); 1574 length = self->length + trio_length(other);
1569 if (!TrioStringGrowTo(self, length)) 1575 if (!TrioStringGrowTo(self, length))
1570 goto error; 1576 goto error;
1571 trio_copy(&self->content[self->length], other); 1577 trio_copy(&self->content[self->length], other);
1572 self->length = length; 1578 self->length = length;
1573 return TRUE; 1579 return TRUE;
1574 1580
1575 error: 1581 error:
1576 return FALSE; 1582 return FALSE;
1577 } 1583 }
1578 #endif /* !defined(TRIO_MINIMAL) */ 1584 #endif /* !defined(TRIO_MINIMAL) */
1579 1585
1580 1586
1581 /* 1587 /*
1582 * trio_xstring_append_char 1588 * trio_xstring_append_char
1583 */ 1589 */
1584 TRIO_STRING_PUBLIC int 1590 TRIO_STRING_PUBLIC int
1585 trio_xstring_append_char 1591 trio_xstring_append_char
1586 TRIO_ARGS2((self, character), 1592 TRIO_ARGS2((self, character),
1587 trio_string_t *self, 1593 trio_string_t *self,
1588 char character) 1594 char character)
1589 { 1595 {
1590 assert(self); 1596 assert(self);
1591 1597
1592 if ((int)self->length >= trio_string_size(self)) 1598 if ((int)self->length >= trio_string_size(self))
1593 { 1599 {
1594 if (!TrioStringGrow(self, 0)) 1600 if (!TrioStringGrow(self, 0))
1595 goto error; 1601 goto error;
1596 } 1602 }
1597 self->content[self->length] = character; 1603 self->content[self->length] = character;
1598 self->length++; 1604 self->length++;
1599 return TRUE; 1605 return TRUE;
1600 1606
1601 error: 1607 error:
1602 return FALSE; 1608 return FALSE;
1603 } 1609 }
1604 1610
1605 1611
1606 #if !defined(TRIO_MINIMAL) 1612 #if !defined(TRIO_MINIMAL)
1607 /** 1613 /**
1608 Search for the first occurrence of second parameter in the first. 1614 Search for the first occurrence of second parameter in the first.
1609 1615
1610 @param self Dynamic string to be modified. 1616 @param self Dynamic string to be modified.
1611 @param other Dynamic string to copy from. 1617 @param other Dynamic string to copy from.
1612 @return Boolean value indicating success or failure. 1618 @return Boolean value indicating success or failure.
1613 */ 1619 */
1614 TRIO_STRING_PUBLIC int 1620 TRIO_STRING_PUBLIC int
1615 trio_string_contains 1621 trio_string_contains
1616 TRIO_ARGS2((self, other), 1622 TRIO_ARGS2((self, other),
1617 trio_string_t *self, 1623 trio_string_t *self,
1618 trio_string_t *other) 1624 trio_string_t *other)
1619 { 1625 {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1684 #if !defined(TRIO_MINIMAL) 1690 #if !defined(TRIO_MINIMAL)
1685 /* 1691 /*
1686 * trio_string_duplicate 1692 * trio_string_duplicate
1687 */ 1693 */
1688 TRIO_STRING_PUBLIC trio_string_t * 1694 TRIO_STRING_PUBLIC trio_string_t *
1689 trio_string_duplicate 1695 trio_string_duplicate
1690 TRIO_ARGS1((other), 1696 TRIO_ARGS1((other),
1691 trio_string_t *other) 1697 trio_string_t *other)
1692 { 1698 {
1693 trio_string_t *self; 1699 trio_string_t *self;
1694 1700
1695 assert(other); 1701 assert(other);
1696 1702
1697 self = TrioStringAlloc(); 1703 self = TrioStringAlloc();
1698 if (self) 1704 if (self)
1699 { 1705 {
1700 self->content = TrioDuplicateMax(other->content, other->length); 1706 self->content = TrioDuplicateMax(other->content, other->length);
1701 if (self->content) 1707 if (self->content)
1702 { 1708 {
1703 self->length = other->length; 1709 self->length = other->length;
1704 self->allocated = self->length + 1; 1710 self->allocated = self->length + 1;
(...skipping 10 matching lines...) Expand all
1715 1721
1716 /* 1722 /*
1717 * trio_xstring_duplicate 1723 * trio_xstring_duplicate
1718 */ 1724 */
1719 TRIO_STRING_PUBLIC trio_string_t * 1725 TRIO_STRING_PUBLIC trio_string_t *
1720 trio_xstring_duplicate 1726 trio_xstring_duplicate
1721 TRIO_ARGS1((other), 1727 TRIO_ARGS1((other),
1722 TRIO_CONST char *other) 1728 TRIO_CONST char *other)
1723 { 1729 {
1724 trio_string_t *self; 1730 trio_string_t *self;
1725 1731
1726 assert(other); 1732 assert(other);
1727 1733
1728 self = TrioStringAlloc(); 1734 self = TrioStringAlloc();
1729 if (self) 1735 if (self)
1730 { 1736 {
1731 self->content = TrioDuplicateMax(other, trio_length(other)); 1737 self->content = TrioDuplicateMax(other, trio_length(other));
1732 if (self->content) 1738 if (self->content)
1733 { 1739 {
1734 self->length = trio_length(self->content); 1740 self->length = trio_length(self->content);
1735 self->allocated = self->length + 1; 1741 self->allocated = self->length + 1;
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
2097 TRIO_ARGS1((self), 2103 TRIO_ARGS1((self),
2098 trio_string_t *self) 2104 trio_string_t *self)
2099 { 2105 {
2100 assert(self); 2106 assert(self);
2101 2107
2102 return trio_upper(self->content); 2108 return trio_upper(self->content);
2103 } 2109 }
2104 #endif /* !defined(TRIO_MINIMAL) */ 2110 #endif /* !defined(TRIO_MINIMAL) */
2105 2111
2106 /** @} End of DynamicStrings */ 2112 /** @} End of DynamicStrings */
OLDNEW
« no previous file with comments | « third_party/libxml/src/trionan.c ('k') | third_party/libxml/src/uri.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698