pocxxeci 0.30.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pocxxeci might be problematic. Click here for more details.

Files changed (160) hide show
  1. package/LICENSE +19 -0
  2. package/Makefile +18 -0
  3. package/README.md +52 -0
  4. package/binding.gyp +81 -0
  5. package/index.d.ts +273 -0
  6. package/index.js +45 -0
  7. package/lib/bindings.js +1 -0
  8. package/lib/document.js +122 -0
  9. package/lib/element.js +82 -0
  10. package/lib/sax_parser.js +38 -0
  11. package/package.json +70 -0
  12. package/src/html_document.cc +7 -0
  13. package/src/html_document.h +18 -0
  14. package/src/libxmljs.cc +252 -0
  15. package/src/libxmljs.h +53 -0
  16. package/src/xml_attribute.cc +173 -0
  17. package/src/xml_attribute.h +40 -0
  18. package/src/xml_comment.cc +117 -0
  19. package/src/xml_comment.h +30 -0
  20. package/src/xml_document.cc +810 -0
  21. package/src/xml_document.h +67 -0
  22. package/src/xml_element.cc +565 -0
  23. package/src/xml_element.h +61 -0
  24. package/src/xml_namespace.cc +158 -0
  25. package/src/xml_namespace.h +39 -0
  26. package/src/xml_node.cc +761 -0
  27. package/src/xml_node.h +73 -0
  28. package/src/xml_pi.cc +161 -0
  29. package/src/xml_pi.h +34 -0
  30. package/src/xml_sax_parser.cc +424 -0
  31. package/src/xml_sax_parser.h +73 -0
  32. package/src/xml_syntax_error.cc +66 -0
  33. package/src/xml_syntax_error.h +25 -0
  34. package/src/xml_text.cc +320 -0
  35. package/src/xml_text.h +48 -0
  36. package/src/xml_textwriter.cc +315 -0
  37. package/src/xml_textwriter.h +62 -0
  38. package/src/xml_xpath_context.cc +70 -0
  39. package/src/xml_xpath_context.h +23 -0
  40. package/vendor/libxml/Copyright +23 -0
  41. package/vendor/libxml/DOCBparser.c +305 -0
  42. package/vendor/libxml/HTMLparser.c +7287 -0
  43. package/vendor/libxml/HTMLtree.c +1200 -0
  44. package/vendor/libxml/Makefile +2983 -0
  45. package/vendor/libxml/SAX.c +180 -0
  46. package/vendor/libxml/SAX2.c +3036 -0
  47. package/vendor/libxml/buf.c +1351 -0
  48. package/vendor/libxml/buf.h +72 -0
  49. package/vendor/libxml/c14n.c +2234 -0
  50. package/vendor/libxml/catalog.c +3828 -0
  51. package/vendor/libxml/chvalid.c +336 -0
  52. package/vendor/libxml/config.h +294 -0
  53. package/vendor/libxml/config.h.gch +0 -0
  54. package/vendor/libxml/debugXML.c +3423 -0
  55. package/vendor/libxml/dict.c +1298 -0
  56. package/vendor/libxml/elfgcchack.h +17818 -0
  57. package/vendor/libxml/enc.h +32 -0
  58. package/vendor/libxml/encoding.c +3975 -0
  59. package/vendor/libxml/entities.c +1163 -0
  60. package/vendor/libxml/error.c +998 -0
  61. package/vendor/libxml/globals.c +1126 -0
  62. package/vendor/libxml/hash.c +1146 -0
  63. package/vendor/libxml/include/libxml/DOCBparser.h +96 -0
  64. package/vendor/libxml/include/libxml/HTMLparser.h +306 -0
  65. package/vendor/libxml/include/libxml/HTMLtree.h +147 -0
  66. package/vendor/libxml/include/libxml/Makefile +725 -0
  67. package/vendor/libxml/include/libxml/Makefile.am +54 -0
  68. package/vendor/libxml/include/libxml/Makefile.in +725 -0
  69. package/vendor/libxml/include/libxml/SAX.h +173 -0
  70. package/vendor/libxml/include/libxml/SAX2.h +178 -0
  71. package/vendor/libxml/include/libxml/c14n.h +128 -0
  72. package/vendor/libxml/include/libxml/catalog.h +182 -0
  73. package/vendor/libxml/include/libxml/chvalid.h +230 -0
  74. package/vendor/libxml/include/libxml/debugXML.h +217 -0
  75. package/vendor/libxml/include/libxml/dict.h +79 -0
  76. package/vendor/libxml/include/libxml/encoding.h +245 -0
  77. package/vendor/libxml/include/libxml/entities.h +151 -0
  78. package/vendor/libxml/include/libxml/globals.h +508 -0
  79. package/vendor/libxml/include/libxml/hash.h +236 -0
  80. package/vendor/libxml/include/libxml/list.h +137 -0
  81. package/vendor/libxml/include/libxml/nanoftp.h +163 -0
  82. package/vendor/libxml/include/libxml/nanohttp.h +81 -0
  83. package/vendor/libxml/include/libxml/parser.h +1243 -0
  84. package/vendor/libxml/include/libxml/parserInternals.h +644 -0
  85. package/vendor/libxml/include/libxml/pattern.h +100 -0
  86. package/vendor/libxml/include/libxml/relaxng.h +217 -0
  87. package/vendor/libxml/include/libxml/schemasInternals.h +958 -0
  88. package/vendor/libxml/include/libxml/schematron.h +142 -0
  89. package/vendor/libxml/include/libxml/threads.h +89 -0
  90. package/vendor/libxml/include/libxml/tree.h +1311 -0
  91. package/vendor/libxml/include/libxml/uri.h +94 -0
  92. package/vendor/libxml/include/libxml/valid.h +458 -0
  93. package/vendor/libxml/include/libxml/xinclude.h +129 -0
  94. package/vendor/libxml/include/libxml/xlink.h +189 -0
  95. package/vendor/libxml/include/libxml/xmlIO.h +368 -0
  96. package/vendor/libxml/include/libxml/xmlautomata.h +146 -0
  97. package/vendor/libxml/include/libxml/xmlerror.h +945 -0
  98. package/vendor/libxml/include/libxml/xmlexports.h +77 -0
  99. package/vendor/libxml/include/libxml/xmlmemory.h +224 -0
  100. package/vendor/libxml/include/libxml/xmlmodule.h +57 -0
  101. package/vendor/libxml/include/libxml/xmlreader.h +428 -0
  102. package/vendor/libxml/include/libxml/xmlregexp.h +222 -0
  103. package/vendor/libxml/include/libxml/xmlsave.h +88 -0
  104. package/vendor/libxml/include/libxml/xmlschemas.h +246 -0
  105. package/vendor/libxml/include/libxml/xmlschemastypes.h +151 -0
  106. package/vendor/libxml/include/libxml/xmlstring.h +140 -0
  107. package/vendor/libxml/include/libxml/xmlunicode.h +202 -0
  108. package/vendor/libxml/include/libxml/xmlversion.h +484 -0
  109. package/vendor/libxml/include/libxml/xmlwin32version.h +239 -0
  110. package/vendor/libxml/include/libxml/xmlwriter.h +488 -0
  111. package/vendor/libxml/include/libxml/xpath.h +564 -0
  112. package/vendor/libxml/include/libxml/xpathInternals.h +632 -0
  113. package/vendor/libxml/include/libxml/xpointer.h +114 -0
  114. package/vendor/libxml/include/win32config.h +122 -0
  115. package/vendor/libxml/include/wsockcompat.h +54 -0
  116. package/vendor/libxml/legacy.c +1343 -0
  117. package/vendor/libxml/libxml.h +134 -0
  118. package/vendor/libxml/list.c +779 -0
  119. package/vendor/libxml/nanoftp.c +2118 -0
  120. package/vendor/libxml/nanohttp.c +1899 -0
  121. package/vendor/libxml/parser.c +15553 -0
  122. package/vendor/libxml/parserInternals.c +2164 -0
  123. package/vendor/libxml/pattern.c +2621 -0
  124. package/vendor/libxml/relaxng.c +11101 -0
  125. package/vendor/libxml/rngparser.c +1595 -0
  126. package/vendor/libxml/runsuite.c +1157 -0
  127. package/vendor/libxml/save.h +36 -0
  128. package/vendor/libxml/schematron.c +1787 -0
  129. package/vendor/libxml/threads.c +1049 -0
  130. package/vendor/libxml/timsort.h +601 -0
  131. package/vendor/libxml/tree.c +10183 -0
  132. package/vendor/libxml/trio.c +6895 -0
  133. package/vendor/libxml/trio.h +230 -0
  134. package/vendor/libxml/triodef.h +228 -0
  135. package/vendor/libxml/trionan.c +914 -0
  136. package/vendor/libxml/trionan.h +84 -0
  137. package/vendor/libxml/triop.h +150 -0
  138. package/vendor/libxml/triostr.c +2112 -0
  139. package/vendor/libxml/triostr.h +144 -0
  140. package/vendor/libxml/uri.c +2561 -0
  141. package/vendor/libxml/valid.c +7138 -0
  142. package/vendor/libxml/xinclude.c +2657 -0
  143. package/vendor/libxml/xlink.c +183 -0
  144. package/vendor/libxml/xmlIO.c +4135 -0
  145. package/vendor/libxml/xmlcatalog.c +624 -0
  146. package/vendor/libxml/xmllint.c +3796 -0
  147. package/vendor/libxml/xmlmemory.c +1163 -0
  148. package/vendor/libxml/xmlmodule.c +468 -0
  149. package/vendor/libxml/xmlreader.c +6033 -0
  150. package/vendor/libxml/xmlregexp.c +8271 -0
  151. package/vendor/libxml/xmlsave.c +2735 -0
  152. package/vendor/libxml/xmlschemas.c +29173 -0
  153. package/vendor/libxml/xmlschemastypes.c +6276 -0
  154. package/vendor/libxml/xmlstring.c +1050 -0
  155. package/vendor/libxml/xmlunicode.c +3179 -0
  156. package/vendor/libxml/xmlwriter.c +4738 -0
  157. package/vendor/libxml/xpath.c +14734 -0
  158. package/vendor/libxml/xpointer.c +2969 -0
  159. package/vendor/libxml/xzlib.c +815 -0
  160. package/vendor/libxml/xzlib.h +19 -0
@@ -0,0 +1,2112 @@
1
+ /*************************************************************************
2
+ *
3
+ * $Id$
4
+ *
5
+ * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg.
6
+ *
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
9
+ * copyright notice and this permission notice appear in all copies.
10
+ *
11
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
12
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
13
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
14
+ * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
15
+ *
16
+ ************************************************************************/
17
+
18
+ /*************************************************************************
19
+ * Include files
20
+ */
21
+
22
+ #include <assert.h>
23
+ #include <stdlib.h>
24
+ #include <string.h>
25
+ #include <ctype.h>
26
+ #include <math.h>
27
+ #include "triodef.h"
28
+ #include "triostr.h"
29
+
30
+ /*************************************************************************
31
+ * Definitions
32
+ */
33
+
34
+ #if !defined(TRIO_STRING_PUBLIC)
35
+ # define TRIO_STRING_PUBLIC TRIO_PUBLIC
36
+ #endif
37
+ #if !defined(TRIO_STRING_PRIVATE)
38
+ # define TRIO_STRING_PRIVATE TRIO_PRIVATE
39
+ #endif
40
+
41
+ #if !defined(NULL)
42
+ # define NULL 0
43
+ #endif
44
+ #if !defined(NIL)
45
+ # define NIL ((char)0)
46
+ #endif
47
+ #if !defined(FALSE)
48
+ # define FALSE (1 == 0)
49
+ # define TRUE (! FALSE)
50
+ #endif
51
+ #if !defined(BOOLEAN_T)
52
+ # define BOOLEAN_T int
53
+ #endif
54
+
55
+ #ifdef __VMS
56
+ # define USE_STRTOD
57
+ #elif defined(TRIO_COMPILER_SUPPORTS_C99)
58
+ # define USE_STRTOD
59
+ # define USE_STRTOF
60
+ #elif defined(TRIO_COMPILER_MSVC)
61
+ # define USE_STRTOD
62
+ #endif
63
+
64
+ #if defined(TRIO_PLATFORM_UNIX)
65
+ # define USE_STRCASECMP
66
+ # define USE_STRNCASECMP
67
+ # if defined(TRIO_PLATFORM_SUNOS)
68
+ # define USE_SYS_ERRLIST
69
+ # else
70
+ # define USE_STRERROR
71
+ # endif
72
+ # if defined(TRIO_PLATFORM_QNX)
73
+ # define strcasecmp(x,y) stricmp(x,y)
74
+ # define strncasecmp(x,y,n) strnicmp(x,y,n)
75
+ # endif
76
+ #elif defined(TRIO_PLATFORM_WIN32)
77
+ # define USE_STRCASECMP
78
+ # if defined(_WIN32_WCE)
79
+ # define strcasecmp(x,y) _stricmp(x,y)
80
+ # else
81
+ # define strcasecmp(x,y) strcmpi(x,y)
82
+ # endif
83
+ #elif defined(TRIO_PLATFORM_OS400)
84
+ # define USE_STRCASECMP
85
+ # define USE_STRNCASECMP
86
+ # include <strings.h>
87
+ #endif
88
+
89
+ #if !(defined(TRIO_PLATFORM_SUNOS))
90
+ # define USE_TOLOWER
91
+ # define USE_TOUPPER
92
+ #endif
93
+
94
+ /*************************************************************************
95
+ * Structures
96
+ */
97
+
98
+ struct _trio_string_t
99
+ {
100
+ char *content;
101
+ size_t length;
102
+ size_t allocated;
103
+ };
104
+
105
+ /*************************************************************************
106
+ * Constants
107
+ */
108
+
109
+ #if !defined(TRIO_MINIMAL)
110
+ static TRIO_CONST char rcsid[] = "@(#)$Id$";
111
+ #endif
112
+
113
+ /*************************************************************************
114
+ * Static String Functions
115
+ */
116
+
117
+ #if defined(TRIO_DOCUMENTATION)
118
+ # include "doc/doc_static.h"
119
+ #endif
120
+ /** @addtogroup StaticStrings
121
+ @{
122
+ */
123
+
124
+ /**
125
+ Create new string.
126
+
127
+ @param size Size of new string.
128
+ @return Pointer to string, or NULL if allocation failed.
129
+ */
130
+ TRIO_STRING_PUBLIC char *
131
+ trio_create
132
+ TRIO_ARGS1((size),
133
+ size_t size)
134
+ {
135
+ return (char *)TRIO_MALLOC(size);
136
+ }
137
+
138
+
139
+ /**
140
+ Destroy string.
141
+
142
+ @param string String to be freed.
143
+ */
144
+ TRIO_STRING_PUBLIC void
145
+ trio_destroy
146
+ TRIO_ARGS1((string),
147
+ char *string)
148
+ {
149
+ if (string)
150
+ {
151
+ TRIO_FREE(string);
152
+ }
153
+ }
154
+
155
+
156
+ /**
157
+ Count the number of characters in a string.
158
+
159
+ @param string String to measure.
160
+ @return Number of characters in @string.
161
+ */
162
+ TRIO_STRING_PUBLIC size_t
163
+ trio_length
164
+ TRIO_ARGS1((string),
165
+ TRIO_CONST char *string)
166
+ {
167
+ return strlen(string);
168
+ }
169
+
170
+
171
+ #if !defined(TRIO_MINIMAL)
172
+ /**
173
+ Append @p source at the end of @p target.
174
+
175
+ @param target Target string.
176
+ @param source Source string.
177
+ @return Boolean value indicating success or failure.
178
+
179
+ @pre @p target must point to a memory chunk with sufficient room to
180
+ contain the @p target string and @p source string.
181
+ @pre No boundary checking is performed, so insufficient memory will
182
+ result in a buffer overrun.
183
+ @post @p target will be zero terminated.
184
+ */
185
+ TRIO_STRING_PUBLIC int
186
+ trio_append
187
+ TRIO_ARGS2((target, source),
188
+ char *target,
189
+ TRIO_CONST char *source)
190
+ {
191
+ assert(target);
192
+ assert(source);
193
+
194
+ return (strcat(target, source) != NULL);
195
+ }
196
+ #endif /* !defined(TRIO_MINIMAL) */
197
+
198
+ #if !defined(TRIO_MINIMAL)
199
+ /**
200
+ Append at most @p max characters from @p source to @p target.
201
+
202
+ @param target Target string.
203
+ @param max Maximum number of characters to append.
204
+ @param source Source string.
205
+ @return Boolean value indicating success or failure.
206
+
207
+ @pre @p target must point to a memory chuck with sufficient room to
208
+ contain the @p target string and the @p source string (at most @p max
209
+ characters).
210
+ @pre No boundary checking is performed, so insufficient memory will
211
+ result in a buffer overrun.
212
+ @post @p target will be zero terminated.
213
+ */
214
+ TRIO_STRING_PUBLIC int
215
+ trio_append_max
216
+ TRIO_ARGS3((target, max, source),
217
+ char *target,
218
+ size_t max,
219
+ TRIO_CONST char *source)
220
+ {
221
+ size_t length;
222
+
223
+ assert(target);
224
+ assert(source);
225
+
226
+ length = trio_length(target);
227
+
228
+ if (max > length)
229
+ {
230
+ strncat(target, source, max - length - 1);
231
+ }
232
+ return TRUE;
233
+ }
234
+ #endif /* !defined(TRIO_MINIMAL) */
235
+
236
+
237
+ #if !defined(TRIO_MINIMAL)
238
+ /**
239
+ Determine if a string contains a substring.
240
+
241
+ @param string String to be searched.
242
+ @param substring String to be found.
243
+ @return Boolean value indicating success or failure.
244
+ */
245
+ TRIO_STRING_PUBLIC int
246
+ trio_contains
247
+ TRIO_ARGS2((string, substring),
248
+ TRIO_CONST char *string,
249
+ TRIO_CONST char *substring)
250
+ {
251
+ assert(string);
252
+ assert(substring);
253
+
254
+ return (0 != strstr(string, substring));
255
+ }
256
+ #endif /* !defined(TRIO_MINIMAL) */
257
+
258
+
259
+ #if !defined(TRIO_MINIMAL)
260
+ /**
261
+ Copy @p source to @p target.
262
+
263
+ @param target Target string.
264
+ @param source Source string.
265
+ @return Boolean value indicating success or failure.
266
+
267
+ @pre @p target must point to a memory chunk with sufficient room to
268
+ contain the @p source string.
269
+ @pre No boundary checking is performed, so insufficient memory will
270
+ result in a buffer overrun.
271
+ @post @p target will be zero terminated.
272
+ */
273
+ TRIO_STRING_PUBLIC int
274
+ trio_copy
275
+ TRIO_ARGS2((target, source),
276
+ char *target,
277
+ TRIO_CONST char *source)
278
+ {
279
+ assert(target);
280
+ assert(source);
281
+
282
+ (void)strcpy(target, source);
283
+ return TRUE;
284
+ }
285
+ #endif /* !defined(TRIO_MINIMAL) */
286
+
287
+
288
+ /**
289
+ Copy at most @p max characters from @p source to @p target.
290
+
291
+ @param target Target string.
292
+ @param max Maximum number of characters to append.
293
+ @param source Source string.
294
+ @return Boolean value indicating success or failure.
295
+
296
+ @pre @p target must point to a memory chunk with sufficient room to
297
+ contain the @p source string (at most @p max characters).
298
+ @pre No boundary checking is performed, so insufficient memory will
299
+ result in a buffer overrun.
300
+ @post @p target will be zero terminated.
301
+ */
302
+ TRIO_STRING_PUBLIC int
303
+ trio_copy_max
304
+ TRIO_ARGS3((target, max, source),
305
+ char *target,
306
+ size_t max,
307
+ TRIO_CONST char *source)
308
+ {
309
+ assert(target);
310
+ assert(source);
311
+ assert(max > 0); /* Includes != 0 */
312
+
313
+ (void)strncpy(target, source, max - 1);
314
+ target[max - 1] = (char)0;
315
+ return TRUE;
316
+ }
317
+
318
+
319
+ /*
320
+ * TrioDuplicateMax
321
+ */
322
+ TRIO_STRING_PRIVATE char *
323
+ TrioDuplicateMax
324
+ TRIO_ARGS2((source, size),
325
+ TRIO_CONST char *source,
326
+ size_t size)
327
+ {
328
+ char *target;
329
+
330
+ assert(source);
331
+
332
+ /* Make room for string plus a terminating zero */
333
+ size++;
334
+ target = trio_create(size);
335
+ if (target)
336
+ {
337
+ trio_copy_max(target, size, source);
338
+ }
339
+ return target;
340
+ }
341
+
342
+
343
+ /**
344
+ Duplicate @p source.
345
+
346
+ @param source Source string.
347
+ @return A copy of the @p source string.
348
+
349
+ @post @p target will be zero terminated.
350
+ */
351
+ TRIO_STRING_PUBLIC char *
352
+ trio_duplicate
353
+ TRIO_ARGS1((source),
354
+ TRIO_CONST char *source)
355
+ {
356
+ return TrioDuplicateMax(source, trio_length(source));
357
+ }
358
+
359
+
360
+ #if !defined(TRIO_MINIMAL)
361
+ /**
362
+ Duplicate at most @p max characters of @p source.
363
+
364
+ @param source Source string.
365
+ @param max Maximum number of characters to duplicate.
366
+ @return A copy of the @p source string.
367
+
368
+ @post @p target will be zero terminated.
369
+ */
370
+ TRIO_STRING_PUBLIC char *
371
+ trio_duplicate_max TRIO_ARGS2((source, max),
372
+ TRIO_CONST char *source,
373
+ size_t max)
374
+ {
375
+ size_t length;
376
+
377
+ assert(source);
378
+ assert(max > 0);
379
+
380
+ length = trio_length(source);
381
+ if (length > max)
382
+ {
383
+ length = max;
384
+ }
385
+ return TrioDuplicateMax(source, length);
386
+ }
387
+ #endif /* !defined(TRIO_MINIMAL) */
388
+
389
+
390
+ /**
391
+ Compare if two strings are equal.
392
+
393
+ @param first First string.
394
+ @param second Second string.
395
+ @return Boolean indicating whether the two strings are equal or not.
396
+
397
+ Case-insensitive comparison.
398
+ */
399
+ TRIO_STRING_PUBLIC int
400
+ trio_equal
401
+ TRIO_ARGS2((first, second),
402
+ TRIO_CONST char *first,
403
+ TRIO_CONST char *second)
404
+ {
405
+ assert(first);
406
+ assert(second);
407
+
408
+ if ((first != NULL) && (second != NULL))
409
+ {
410
+ #if defined(USE_STRCASECMP)
411
+ return (0 == strcasecmp(first, second));
412
+ #else
413
+ while ((*first != NIL) && (*second != NIL))
414
+ {
415
+ if (trio_to_upper(*first) != trio_to_upper(*second))
416
+ {
417
+ break;
418
+ }
419
+ first++;
420
+ second++;
421
+ }
422
+ return ((*first == NIL) && (*second == NIL));
423
+ #endif
424
+ }
425
+ return FALSE;
426
+ }
427
+
428
+
429
+ /**
430
+ Compare if two strings are equal.
431
+
432
+ @param first First string.
433
+ @param second Second string.
434
+ @return Boolean indicating whether the two strings are equal or not.
435
+
436
+ Case-sensitive comparison.
437
+ */
438
+ TRIO_STRING_PUBLIC int
439
+ trio_equal_case
440
+ TRIO_ARGS2((first, second),
441
+ TRIO_CONST char *first,
442
+ TRIO_CONST char *second)
443
+ {
444
+ assert(first);
445
+ assert(second);
446
+
447
+ if ((first != NULL) && (second != NULL))
448
+ {
449
+ return (0 == strcmp(first, second));
450
+ }
451
+ return FALSE;
452
+ }
453
+
454
+
455
+ #if !defined(TRIO_MINIMAL)
456
+ /**
457
+ Compare if two strings up until the first @p max characters are equal.
458
+
459
+ @param first First string.
460
+ @param max Maximum number of characters to compare.
461
+ @param second Second string.
462
+ @return Boolean indicating whether the two strings are equal or not.
463
+
464
+ Case-sensitive comparison.
465
+ */
466
+ TRIO_STRING_PUBLIC int
467
+ trio_equal_case_max
468
+ TRIO_ARGS3((first, max, second),
469
+ TRIO_CONST char *first,
470
+ size_t max,
471
+ TRIO_CONST char *second)
472
+ {
473
+ assert(first);
474
+ assert(second);
475
+
476
+ if ((first != NULL) && (second != NULL))
477
+ {
478
+ return (0 == strncmp(first, second, max));
479
+ }
480
+ return FALSE;
481
+ }
482
+ #endif /* !defined(TRIO_MINIMAL) */
483
+
484
+
485
+ /**
486
+ Compare if two strings are equal.
487
+
488
+ @param first First string.
489
+ @param second Second string.
490
+ @return Boolean indicating whether the two strings are equal or not.
491
+
492
+ Collating characters are considered equal.
493
+ */
494
+ TRIO_STRING_PUBLIC int
495
+ trio_equal_locale
496
+ TRIO_ARGS2((first, second),
497
+ TRIO_CONST char *first,
498
+ TRIO_CONST char *second)
499
+ {
500
+ assert(first);
501
+ assert(second);
502
+
503
+ #if defined(LC_COLLATE)
504
+ return (strcoll(first, second) == 0);
505
+ #else
506
+ return trio_equal(first, second);
507
+ #endif
508
+ }
509
+
510
+
511
+ /**
512
+ Compare if two strings up until the first @p max characters are equal.
513
+
514
+ @param first First string.
515
+ @param max Maximum number of characters to compare.
516
+ @param second Second string.
517
+ @return Boolean indicating whether the two strings are equal or not.
518
+
519
+ Case-insensitive comparison.
520
+ */
521
+ TRIO_STRING_PUBLIC int
522
+ trio_equal_max
523
+ TRIO_ARGS3((first, max, second),
524
+ TRIO_CONST char *first,
525
+ size_t max,
526
+ TRIO_CONST char *second)
527
+ {
528
+ assert(first);
529
+ assert(second);
530
+
531
+ if ((first != NULL) && (second != NULL))
532
+ {
533
+ #if defined(USE_STRNCASECMP)
534
+ return (0 == strncasecmp(first, second, max));
535
+ #else
536
+ /* Not adequately tested yet */
537
+ size_t cnt = 0;
538
+ while ((*first != NIL) && (*second != NIL) && (cnt <= max))
539
+ {
540
+ if (trio_to_upper(*first) != trio_to_upper(*second))
541
+ {
542
+ break;
543
+ }
544
+ first++;
545
+ second++;
546
+ cnt++;
547
+ }
548
+ return ((cnt == max) || ((*first == NIL) && (*second == NIL)));
549
+ #endif
550
+ }
551
+ return FALSE;
552
+ }
553
+
554
+
555
+ /**
556
+ Provide a textual description of an error code (errno).
557
+
558
+ @param error_number Error number.
559
+ @return Textual description of @p error_number.
560
+ */
561
+ TRIO_STRING_PUBLIC TRIO_CONST char *
562
+ trio_error
563
+ TRIO_ARGS1((error_number),
564
+ int error_number)
565
+ {
566
+ #if defined(USE_STRERROR)
567
+
568
+ return strerror(error_number);
569
+
570
+ #elif defined(USE_SYS_ERRLIST)
571
+
572
+ extern char *sys_errlist[];
573
+ extern int sys_nerr;
574
+
575
+ return ((error_number < 0) || (error_number >= sys_nerr))
576
+ ? "unknown"
577
+ : sys_errlist[error_number];
578
+
579
+ #else
580
+
581
+ return "unknown";
582
+
583
+ #endif
584
+ }
585
+
586
+
587
+ #if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE)
588
+ /**
589
+ Format the date/time according to @p format.
590
+
591
+ @param target Target string.
592
+ @param max Maximum number of characters to format.
593
+ @param format Formatting string.
594
+ @param datetime Date/time structure.
595
+ @return Number of formatted characters.
596
+
597
+ The formatting string accepts the same specifiers as the standard C
598
+ function strftime.
599
+ */
600
+ TRIO_STRING_PUBLIC size_t
601
+ trio_format_date_max
602
+ TRIO_ARGS4((target, max, format, datetime),
603
+ char *target,
604
+ size_t max,
605
+ TRIO_CONST char *format,
606
+ TRIO_CONST struct tm *datetime)
607
+ {
608
+ assert(target);
609
+ assert(format);
610
+ assert(datetime);
611
+ assert(max > 0);
612
+
613
+ return strftime(target, max, format, datetime);
614
+ }
615
+ #endif /* !defined(TRIO_MINIMAL) */
616
+
617
+
618
+ #if !defined(TRIO_MINIMAL)
619
+ /**
620
+ Calculate a hash value for a string.
621
+
622
+ @param string String to be calculated on.
623
+ @param type Hash function.
624
+ @return Calculated hash value.
625
+
626
+ @p type can be one of the following
627
+ @li @c TRIO_HASH_PLAIN Plain hash function.
628
+ */
629
+ TRIO_STRING_PUBLIC unsigned long
630
+ trio_hash
631
+ TRIO_ARGS2((string, type),
632
+ TRIO_CONST char *string,
633
+ int type)
634
+ {
635
+ unsigned long value = 0L;
636
+ char ch;
637
+
638
+ assert(string);
639
+
640
+ switch (type)
641
+ {
642
+ case TRIO_HASH_PLAIN:
643
+ while ( (ch = *string++) != NIL )
644
+ {
645
+ value *= 31;
646
+ value += (unsigned long)ch;
647
+ }
648
+ break;
649
+ default:
650
+ assert(FALSE);
651
+ break;
652
+ }
653
+ return value;
654
+ }
655
+ #endif /* !defined(TRIO_MINIMAL) */
656
+
657
+
658
+ #if !defined(TRIO_MINIMAL)
659
+ /**
660
+ Find first occurrence of a character in a string.
661
+
662
+ @param string String to be searched.
663
+ @param character Character to be found.
664
+ @param A pointer to the found character, or NULL if character was not found.
665
+ */
666
+ TRIO_STRING_PUBLIC char *
667
+ trio_index
668
+ TRIO_ARGS2((string, character),
669
+ TRIO_CONST char *string,
670
+ int character)
671
+ {
672
+ assert(string);
673
+
674
+ return strchr(string, character);
675
+ }
676
+ #endif /* !defined(TRIO_MINIMAL) */
677
+
678
+
679
+ #if !defined(TRIO_MINIMAL)
680
+ /**
681
+ Find last occurrence of a character in a string.
682
+
683
+ @param string String to be searched.
684
+ @param character Character to be found.
685
+ @param A pointer to the found character, or NULL if character was not found.
686
+ */
687
+ TRIO_STRING_PUBLIC char *
688
+ trio_index_last
689
+ TRIO_ARGS2((string, character),
690
+ TRIO_CONST char *string,
691
+ int character)
692
+ {
693
+ assert(string);
694
+
695
+ return strchr(string, character);
696
+ }
697
+ #endif /* !defined(TRIO_MINIMAL) */
698
+
699
+
700
+ #if !defined(TRIO_MINIMAL)
701
+ /**
702
+ Convert the alphabetic letters in the string to lower-case.
703
+
704
+ @param target String to be converted.
705
+ @return Number of processed characters (converted or not).
706
+ */
707
+ TRIO_STRING_PUBLIC int
708
+ trio_lower
709
+ TRIO_ARGS1((target),
710
+ char *target)
711
+ {
712
+ assert(target);
713
+
714
+ return trio_span_function(target, target, trio_to_lower);
715
+ }
716
+ #endif /* !defined(TRIO_MINIMAL) */
717
+
718
+
719
+ #if !defined(TRIO_MINIMAL)
720
+ /**
721
+ Compare two strings using wildcards.
722
+
723
+ @param string String to be searched.
724
+ @param pattern Pattern, including wildcards, to search for.
725
+ @return Boolean value indicating success or failure.
726
+
727
+ Case-insensitive comparison.
728
+
729
+ The following wildcards can be used
730
+ @li @c * Match any number of characters.
731
+ @li @c ? Match a single character.
732
+ */
733
+ TRIO_STRING_PUBLIC int
734
+ trio_match
735
+ TRIO_ARGS2((string, pattern),
736
+ TRIO_CONST char *string,
737
+ TRIO_CONST char *pattern)
738
+ {
739
+ assert(string);
740
+ assert(pattern);
741
+
742
+ for (; ('*' != *pattern); ++pattern, ++string)
743
+ {
744
+ if (NIL == *string)
745
+ {
746
+ return (NIL == *pattern);
747
+ }
748
+ if ((trio_to_upper((int)*string) != trio_to_upper((int)*pattern))
749
+ && ('?' != *pattern))
750
+ {
751
+ return FALSE;
752
+ }
753
+ }
754
+ /* two-line patch to prevent *too* much recursiveness: */
755
+ while ('*' == pattern[1])
756
+ pattern++;
757
+
758
+ do
759
+ {
760
+ if ( trio_match(string, &pattern[1]) )
761
+ {
762
+ return TRUE;
763
+ }
764
+ }
765
+ while (*string++);
766
+
767
+ return FALSE;
768
+ }
769
+ #endif /* !defined(TRIO_MINIMAL) */
770
+
771
+
772
+ #if !defined(TRIO_MINIMAL)
773
+ /**
774
+ Compare two strings using wildcards.
775
+
776
+ @param string String to be searched.
777
+ @param pattern Pattern, including wildcards, to search for.
778
+ @return Boolean value indicating success or failure.
779
+
780
+ Case-sensitive comparison.
781
+
782
+ The following wildcards can be used
783
+ @li @c * Match any number of characters.
784
+ @li @c ? Match a single character.
785
+ */
786
+ TRIO_STRING_PUBLIC int
787
+ trio_match_case
788
+ TRIO_ARGS2((string, pattern),
789
+ TRIO_CONST char *string,
790
+ TRIO_CONST char *pattern)
791
+ {
792
+ assert(string);
793
+ assert(pattern);
794
+
795
+ for (; ('*' != *pattern); ++pattern, ++string)
796
+ {
797
+ if (NIL == *string)
798
+ {
799
+ return (NIL == *pattern);
800
+ }
801
+ if ((*string != *pattern)
802
+ && ('?' != *pattern))
803
+ {
804
+ return FALSE;
805
+ }
806
+ }
807
+ /* two-line patch to prevent *too* much recursiveness: */
808
+ while ('*' == pattern[1])
809
+ pattern++;
810
+
811
+ do
812
+ {
813
+ if ( trio_match_case(string, &pattern[1]) )
814
+ {
815
+ return TRUE;
816
+ }
817
+ }
818
+ while (*string++);
819
+
820
+ return FALSE;
821
+ }
822
+ #endif /* !defined(TRIO_MINIMAL) */
823
+
824
+
825
+ #if !defined(TRIO_MINIMAL)
826
+ /**
827
+ Execute a function on each character in string.
828
+
829
+ @param target Target string.
830
+ @param source Source string.
831
+ @param Function Function to be executed.
832
+ @return Number of processed characters.
833
+ */
834
+ TRIO_STRING_PUBLIC size_t
835
+ trio_span_function
836
+ TRIO_ARGS3((target, source, Function),
837
+ char *target,
838
+ TRIO_CONST char *source,
839
+ int (*Function) TRIO_PROTO((int)))
840
+ {
841
+ size_t count = 0;
842
+
843
+ assert(target);
844
+ assert(source);
845
+ assert(Function);
846
+
847
+ while (*source != NIL)
848
+ {
849
+ *target++ = Function(*source++);
850
+ count++;
851
+ }
852
+ return count;
853
+ }
854
+ #endif /* !defined(TRIO_MINIMAL) */
855
+
856
+
857
+ #if !defined(TRIO_MINIMAL)
858
+ /**
859
+ Search for a substring in a string.
860
+
861
+ @param string String to be searched.
862
+ @param substring String to be found.
863
+ @return Pointer to first occurrence of @p substring in @p string, or NULL
864
+ if no match was found.
865
+ */
866
+ TRIO_STRING_PUBLIC char *
867
+ trio_substring
868
+ TRIO_ARGS2((string, substring),
869
+ TRIO_CONST char *string,
870
+ TRIO_CONST char *substring)
871
+ {
872
+ assert(string);
873
+ assert(substring);
874
+
875
+ return strstr(string, substring);
876
+ }
877
+ #endif /* !defined(TRIO_MINIMAL) */
878
+
879
+
880
+ #if !defined(TRIO_MINIMAL)
881
+ /**
882
+ Search for a substring in the first @p max characters of a string.
883
+
884
+ @param string String to be searched.
885
+ @param max Maximum characters to be searched.
886
+ @param substring String to be found.
887
+ @return Pointer to first occurrence of @p substring in @p string, or NULL
888
+ if no match was found.
889
+ */
890
+ TRIO_STRING_PUBLIC char *
891
+ trio_substring_max
892
+ TRIO_ARGS3((string, max, substring),
893
+ TRIO_CONST char *string,
894
+ size_t max,
895
+ TRIO_CONST char *substring)
896
+ {
897
+ size_t count;
898
+ size_t size;
899
+ char *result = NULL;
900
+
901
+ assert(string);
902
+ assert(substring);
903
+
904
+ size = trio_length(substring);
905
+ if (size <= max)
906
+ {
907
+ for (count = 0; count <= max - size; count++)
908
+ {
909
+ if (trio_equal_max(substring, size, &string[count]))
910
+ {
911
+ result = (char *)&string[count];
912
+ break;
913
+ }
914
+ }
915
+ }
916
+ return result;
917
+ }
918
+ #endif /* !defined(TRIO_MINIMAL) */
919
+
920
+
921
+ #if !defined(TRIO_MINIMAL)
922
+ /**
923
+ Tokenize string.
924
+
925
+ @param string String to be tokenized.
926
+ @param tokens String containing list of delimiting characters.
927
+ @return Start of new token.
928
+
929
+ @warning @p string will be destroyed.
930
+ */
931
+ TRIO_STRING_PUBLIC char *
932
+ trio_tokenize
933
+ TRIO_ARGS2((string, delimiters),
934
+ char *string,
935
+ TRIO_CONST char *delimiters)
936
+ {
937
+ assert(delimiters);
938
+
939
+ return strtok(string, delimiters);
940
+ }
941
+ #endif /* !defined(TRIO_MINIMAL) */
942
+
943
+
944
+ /**
945
+ Convert string to floating-point number.
946
+
947
+ @param source String to be converted.
948
+ @param endp Pointer to end of the converted string.
949
+ @return A floating-point number.
950
+
951
+ The following Extended Backus-Naur form is used
952
+ @verbatim
953
+ double ::= [ <sign> ]
954
+ ( <number> |
955
+ <number> <decimal_point> <number> |
956
+ <decimal_point> <number> )
957
+ [ <exponential> [ <sign> ] <number> ]
958
+ number ::= 1*( <digit> )
959
+ digit ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' )
960
+ exponential ::= ( 'e' | 'E' )
961
+ sign ::= ( '-' | '+' )
962
+ decimal_point ::= '.'
963
+ @endverbatim
964
+ */
965
+ /* FIXME: Add EBNF for hex-floats */
966
+ TRIO_STRING_PUBLIC trio_long_double_t
967
+ trio_to_long_double
968
+ TRIO_ARGS2((source, endp),
969
+ TRIO_CONST char *source,
970
+ char **endp)
971
+ {
972
+ #if defined(USE_STRTOLD)
973
+ return strtold(source, endp);
974
+ #else
975
+ int isNegative = FALSE;
976
+ int isExponentNegative = FALSE;
977
+ trio_long_double_t integer = 0.0;
978
+ trio_long_double_t fraction = 0.0;
979
+ unsigned long exponent = 0;
980
+ trio_long_double_t base;
981
+ trio_long_double_t fracdiv = 1.0;
982
+ trio_long_double_t value = 0.0;
983
+
984
+ /* First try hex-floats */
985
+ if ((source[0] == '0') && ((source[1] == 'x') || (source[1] == 'X')))
986
+ {
987
+ base = 16.0;
988
+ source += 2;
989
+ while (isxdigit((int)*source))
990
+ {
991
+ integer *= base;
992
+ integer += (isdigit((int)*source)
993
+ ? (*source - '0')
994
+ : 10 + (trio_to_upper((int)*source) - 'A'));
995
+ source++;
996
+ }
997
+ if (*source == '.')
998
+ {
999
+ source++;
1000
+ while (isxdigit((int)*source))
1001
+ {
1002
+ fracdiv /= base;
1003
+ fraction += fracdiv * (isdigit((int)*source)
1004
+ ? (*source - '0')
1005
+ : 10 + (trio_to_upper((int)*source) - 'A'));
1006
+ source++;
1007
+ }
1008
+ if ((*source == 'p') || (*source == 'P'))
1009
+ {
1010
+ source++;
1011
+ if ((*source == '+') || (*source == '-'))
1012
+ {
1013
+ isExponentNegative = (*source == '-');
1014
+ source++;
1015
+ }
1016
+ while (isdigit((int)*source))
1017
+ {
1018
+ exponent *= 10;
1019
+ exponent += (*source - '0');
1020
+ source++;
1021
+ }
1022
+ }
1023
+ }
1024
+ /* For later use with exponent */
1025
+ base = 2.0;
1026
+ }
1027
+ else /* Then try normal decimal floats */
1028
+ {
1029
+ base = 10.0;
1030
+ isNegative = (*source == '-');
1031
+ /* Skip sign */
1032
+ if ((*source == '+') || (*source == '-'))
1033
+ source++;
1034
+
1035
+ /* Integer part */
1036
+ while (isdigit((int)*source))
1037
+ {
1038
+ integer *= base;
1039
+ integer += (*source - '0');
1040
+ source++;
1041
+ }
1042
+
1043
+ if (*source == '.')
1044
+ {
1045
+ source++; /* skip decimal point */
1046
+ while (isdigit((int)*source))
1047
+ {
1048
+ fracdiv /= base;
1049
+ fraction += (*source - '0') * fracdiv;
1050
+ source++;
1051
+ }
1052
+ }
1053
+ if ((*source == 'e')
1054
+ || (*source == 'E')
1055
+ #if TRIO_MICROSOFT
1056
+ || (*source == 'd')
1057
+ || (*source == 'D')
1058
+ #endif
1059
+ )
1060
+ {
1061
+ source++; /* Skip exponential indicator */
1062
+ isExponentNegative = (*source == '-');
1063
+ if ((*source == '+') || (*source == '-'))
1064
+ source++;
1065
+ while (isdigit((int)*source))
1066
+ {
1067
+ exponent *= (int)base;
1068
+ exponent += (*source - '0');
1069
+ source++;
1070
+ }
1071
+ }
1072
+ }
1073
+
1074
+ value = integer + fraction;
1075
+ if (exponent != 0)
1076
+ {
1077
+ if (isExponentNegative)
1078
+ value /= pow(base, (double)exponent);
1079
+ else
1080
+ value *= pow(base, (double)exponent);
1081
+ }
1082
+ if (isNegative)
1083
+ value = -value;
1084
+
1085
+ if (endp)
1086
+ *endp = (char *)source;
1087
+ return value;
1088
+ #endif
1089
+ }
1090
+
1091
+
1092
+ /**
1093
+ Convert string to floating-point number.
1094
+
1095
+ @param source String to be converted.
1096
+ @param endp Pointer to end of the converted string.
1097
+ @return A floating-point number.
1098
+
1099
+ See @ref trio_to_long_double.
1100
+ */
1101
+ TRIO_STRING_PUBLIC double
1102
+ trio_to_double
1103
+ TRIO_ARGS2((source, endp),
1104
+ TRIO_CONST char *source,
1105
+ char **endp)
1106
+ {
1107
+ #if defined(USE_STRTOD)
1108
+ return strtod(source, endp);
1109
+ #else
1110
+ return (double)trio_to_long_double(source, endp);
1111
+ #endif
1112
+ }
1113
+
1114
+ #if !defined(TRIO_MINIMAL)
1115
+ /**
1116
+ Convert string to floating-point number.
1117
+
1118
+ @param source String to be converted.
1119
+ @param endp Pointer to end of the converted string.
1120
+ @return A floating-point number.
1121
+
1122
+ See @ref trio_to_long_double.
1123
+ */
1124
+ TRIO_STRING_PUBLIC float
1125
+ trio_to_float
1126
+ TRIO_ARGS2((source, endp),
1127
+ TRIO_CONST char *source,
1128
+ char **endp)
1129
+ {
1130
+ #if defined(USE_STRTOF)
1131
+ return strtof(source, endp);
1132
+ #else
1133
+ return (float)trio_to_long_double(source, endp);
1134
+ #endif
1135
+ }
1136
+ #endif /* !defined(TRIO_MINIMAL) */
1137
+
1138
+
1139
+ /**
1140
+ Convert string to signed integer.
1141
+
1142
+ @param string String to be converted.
1143
+ @param endp Pointer to end of converted string.
1144
+ @param base Radix number of number.
1145
+ */
1146
+ TRIO_STRING_PUBLIC long
1147
+ trio_to_long
1148
+ TRIO_ARGS3((string, endp, base),
1149
+ TRIO_CONST char *string,
1150
+ char **endp,
1151
+ int base)
1152
+ {
1153
+ assert(string);
1154
+ assert((base >= 2) && (base <= 36));
1155
+
1156
+ return strtol(string, endp, base);
1157
+ }
1158
+
1159
+
1160
+ #if !defined(TRIO_MINIMAL)
1161
+ /**
1162
+ Convert one alphabetic letter to lower-case.
1163
+
1164
+ @param source The letter to be converted.
1165
+ @return The converted letter.
1166
+ */
1167
+ TRIO_STRING_PUBLIC int
1168
+ trio_to_lower
1169
+ TRIO_ARGS1((source),
1170
+ int source)
1171
+ {
1172
+ #if defined(USE_TOLOWER)
1173
+
1174
+ return tolower(source);
1175
+
1176
+ #else
1177
+
1178
+ /* Does not handle locales or non-contiguous alphabetic characters */
1179
+ return ((source >= (int)'A') && (source <= (int)'Z'))
1180
+ ? source - 'A' + 'a'
1181
+ : source;
1182
+
1183
+ #endif
1184
+ }
1185
+ #endif /* !defined(TRIO_MINIMAL) */
1186
+
1187
+ #if !defined(TRIO_MINIMAL)
1188
+ /**
1189
+ Convert string to unsigned integer.
1190
+
1191
+ @param string String to be converted.
1192
+ @param endp Pointer to end of converted string.
1193
+ @param base Radix number of number.
1194
+ */
1195
+ TRIO_STRING_PUBLIC unsigned long
1196
+ trio_to_unsigned_long
1197
+ TRIO_ARGS3((string, endp, base),
1198
+ TRIO_CONST char *string,
1199
+ char **endp,
1200
+ int base)
1201
+ {
1202
+ assert(string);
1203
+ assert((base >= 2) && (base <= 36));
1204
+
1205
+ return strtoul(string, endp, base);
1206
+ }
1207
+ #endif /* !defined(TRIO_MINIMAL) */
1208
+
1209
+
1210
+ /**
1211
+ Convert one alphabetic letter to upper-case.
1212
+
1213
+ @param source The letter to be converted.
1214
+ @return The converted letter.
1215
+ */
1216
+ TRIO_STRING_PUBLIC int
1217
+ trio_to_upper
1218
+ TRIO_ARGS1((source),
1219
+ int source)
1220
+ {
1221
+ #if defined(USE_TOUPPER)
1222
+
1223
+ return toupper(source);
1224
+
1225
+ #else
1226
+
1227
+ /* Does not handle locales or non-contiguous alphabetic characters */
1228
+ return ((source >= (int)'a') && (source <= (int)'z'))
1229
+ ? source - 'a' + 'A'
1230
+ : source;
1231
+
1232
+ #endif
1233
+ }
1234
+
1235
+ #if !defined(TRIO_MINIMAL)
1236
+ /**
1237
+ Convert the alphabetic letters in the string to upper-case.
1238
+
1239
+ @param target The string to be converted.
1240
+ @return The number of processed characters (converted or not).
1241
+ */
1242
+ TRIO_STRING_PUBLIC int
1243
+ trio_upper
1244
+ TRIO_ARGS1((target),
1245
+ char *target)
1246
+ {
1247
+ assert(target);
1248
+
1249
+ return trio_span_function(target, target, trio_to_upper);
1250
+ }
1251
+ #endif /* !defined(TRIO_MINIMAL) */
1252
+
1253
+
1254
+ /** @} End of StaticStrings */
1255
+
1256
+
1257
+ /*************************************************************************
1258
+ * Dynamic String Functions
1259
+ */
1260
+
1261
+ #if defined(TRIO_DOCUMENTATION)
1262
+ # include "doc/doc_dynamic.h"
1263
+ #endif
1264
+ /** @addtogroup DynamicStrings
1265
+ @{
1266
+ */
1267
+
1268
+ /*
1269
+ * TrioStringAlloc
1270
+ */
1271
+ TRIO_STRING_PRIVATE trio_string_t *
1272
+ TrioStringAlloc(TRIO_NOARGS)
1273
+ {
1274
+ trio_string_t *self;
1275
+
1276
+ self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t));
1277
+ if (self)
1278
+ {
1279
+ self->content = NULL;
1280
+ self->length = 0;
1281
+ self->allocated = 0;
1282
+ }
1283
+ return self;
1284
+ }
1285
+
1286
+
1287
+ /*
1288
+ * TrioStringGrow
1289
+ *
1290
+ * The size of the string will be increased by 'delta' characters. If
1291
+ * 'delta' is zero, the size will be doubled.
1292
+ */
1293
+ TRIO_STRING_PRIVATE BOOLEAN_T
1294
+ TrioStringGrow
1295
+ TRIO_ARGS2((self, delta),
1296
+ trio_string_t *self,
1297
+ size_t delta)
1298
+ {
1299
+ BOOLEAN_T status = FALSE;
1300
+ char *new_content;
1301
+ size_t new_size;
1302
+
1303
+ new_size = (delta == 0)
1304
+ ? ( (self->allocated == 0) ? 1 : self->allocated * 2 )
1305
+ : self->allocated + delta;
1306
+
1307
+ new_content = (char *)TRIO_REALLOC(self->content, new_size);
1308
+ if (new_content)
1309
+ {
1310
+ self->content = new_content;
1311
+ self->allocated = new_size;
1312
+ status = TRUE;
1313
+ }
1314
+ return status;
1315
+ }
1316
+
1317
+
1318
+ #if !defined(TRIO_MINIMAL)
1319
+ /*
1320
+ * TrioStringGrowTo
1321
+ *
1322
+ * The size of the string will be increased to 'length' plus one characters.
1323
+ * If 'length' is less than the original size, the original size will be
1324
+ * used (that is, the size of the string is never decreased).
1325
+ */
1326
+ TRIO_STRING_PRIVATE BOOLEAN_T
1327
+ TrioStringGrowTo
1328
+ TRIO_ARGS2((self, length),
1329
+ trio_string_t *self,
1330
+ size_t length)
1331
+ {
1332
+ length++; /* Room for terminating zero */
1333
+ return (self->allocated < length)
1334
+ ? TrioStringGrow(self, length - self->allocated)
1335
+ : TRUE;
1336
+ }
1337
+ #endif /* !defined(TRIO_MINIMAL) */
1338
+
1339
+
1340
+ #if !defined(TRIO_MINIMAL)
1341
+ /**
1342
+ Create a new dynamic string.
1343
+
1344
+ @param initial_size Initial size of the buffer.
1345
+ @return Newly allocated dynamic string, or NULL if memory allocation failed.
1346
+ */
1347
+ TRIO_STRING_PUBLIC trio_string_t *
1348
+ trio_string_create
1349
+ TRIO_ARGS1((initial_size),
1350
+ int initial_size)
1351
+ {
1352
+ trio_string_t *self;
1353
+
1354
+ self = TrioStringAlloc();
1355
+ if (self)
1356
+ {
1357
+ if (TrioStringGrow(self,
1358
+ (size_t)((initial_size > 0) ? initial_size : 1)))
1359
+ {
1360
+ self->content[0] = (char)0;
1361
+ self->allocated = initial_size;
1362
+ }
1363
+ else
1364
+ {
1365
+ trio_string_destroy(self);
1366
+ self = NULL;
1367
+ }
1368
+ }
1369
+ return self;
1370
+ }
1371
+ #endif /* !defined(TRIO_MINIMAL) */
1372
+
1373
+
1374
+ /**
1375
+ Deallocate the dynamic string and its contents.
1376
+
1377
+ @param self Dynamic string
1378
+ */
1379
+ TRIO_STRING_PUBLIC void
1380
+ trio_string_destroy
1381
+ TRIO_ARGS1((self),
1382
+ trio_string_t *self)
1383
+ {
1384
+ assert(self);
1385
+
1386
+ if (self)
1387
+ {
1388
+ trio_destroy(self->content);
1389
+ TRIO_FREE(self);
1390
+ }
1391
+ }
1392
+
1393
+
1394
+ #if !defined(TRIO_MINIMAL)
1395
+ /**
1396
+ Get a pointer to the content.
1397
+
1398
+ @param self Dynamic string.
1399
+ @param offset Offset into content.
1400
+ @return Pointer to the content.
1401
+
1402
+ @p Offset can be zero, positive, or negative. If @p offset is zero,
1403
+ then the start of the content will be returned. If @p offset is positive,
1404
+ then a pointer to @p offset number of characters from the beginning of the
1405
+ content is returned. If @p offset is negative, then a pointer to @p offset
1406
+ number of characters from the ending of the string, starting at the
1407
+ terminating zero, is returned.
1408
+ */
1409
+ TRIO_STRING_PUBLIC char *
1410
+ trio_string_get
1411
+ TRIO_ARGS2((self, offset),
1412
+ trio_string_t *self,
1413
+ int offset)
1414
+ {
1415
+ char *result = NULL;
1416
+
1417
+ assert(self);
1418
+
1419
+ if (self->content != NULL)
1420
+ {
1421
+ if (self->length == 0)
1422
+ {
1423
+ (void)trio_string_length(self);
1424
+ }
1425
+ if (offset >= 0)
1426
+ {
1427
+ if (offset > (int)self->length)
1428
+ {
1429
+ offset = self->length;
1430
+ }
1431
+ }
1432
+ else
1433
+ {
1434
+ offset += self->length + 1;
1435
+ if (offset < 0)
1436
+ {
1437
+ offset = 0;
1438
+ }
1439
+ }
1440
+ result = &(self->content[offset]);
1441
+ }
1442
+ return result;
1443
+ }
1444
+ #endif /* !defined(TRIO_MINIMAL) */
1445
+
1446
+
1447
+ /**
1448
+ Extract the content.
1449
+
1450
+ @param self Dynamic String
1451
+ @return Content of dynamic string.
1452
+
1453
+ The content is removed from the dynamic string. This enables destruction
1454
+ of the dynamic string without deallocation of the content.
1455
+ */
1456
+ TRIO_STRING_PUBLIC char *
1457
+ trio_string_extract
1458
+ TRIO_ARGS1((self),
1459
+ trio_string_t *self)
1460
+ {
1461
+ char *result;
1462
+
1463
+ assert(self);
1464
+
1465
+ result = self->content;
1466
+ /* FIXME: Allocate new empty buffer? */
1467
+ self->content = NULL;
1468
+ self->length = self->allocated = 0;
1469
+ return result;
1470
+ }
1471
+
1472
+
1473
+ #if !defined(TRIO_MINIMAL)
1474
+ /**
1475
+ Set the content of the dynamic string.
1476
+
1477
+ @param self Dynamic String
1478
+ @param buffer The new content.
1479
+
1480
+ Sets the content of the dynamic string to a copy @p buffer.
1481
+ An existing content will be deallocated first, if necessary.
1482
+
1483
+ @remark
1484
+ This function will make a copy of @p buffer.
1485
+ You are responsible for deallocating @p buffer yourself.
1486
+ */
1487
+ TRIO_STRING_PUBLIC void
1488
+ trio_xstring_set
1489
+ TRIO_ARGS2((self, buffer),
1490
+ trio_string_t *self,
1491
+ char *buffer)
1492
+ {
1493
+ assert(self);
1494
+
1495
+ trio_destroy(self->content);
1496
+ self->content = trio_duplicate(buffer);
1497
+ }
1498
+ #endif /* !defined(TRIO_MINIMAL) */
1499
+
1500
+
1501
+ /*
1502
+ * trio_string_size
1503
+ */
1504
+ TRIO_STRING_PUBLIC int
1505
+ trio_string_size
1506
+ TRIO_ARGS1((self),
1507
+ trio_string_t *self)
1508
+ {
1509
+ assert(self);
1510
+
1511
+ return self->allocated;
1512
+ }
1513
+
1514
+
1515
+ /*
1516
+ * trio_string_terminate
1517
+ */
1518
+ TRIO_STRING_PUBLIC void
1519
+ trio_string_terminate
1520
+ TRIO_ARGS1((self),
1521
+ trio_string_t *self)
1522
+ {
1523
+ trio_xstring_append_char(self, 0);
1524
+ }
1525
+
1526
+
1527
+ #if !defined(TRIO_MINIMAL)
1528
+ /**
1529
+ Append the second string to the first.
1530
+
1531
+ @param self Dynamic string to be modified.
1532
+ @param other Dynamic string to copy from.
1533
+ @return Boolean value indicating success or failure.
1534
+ */
1535
+ TRIO_STRING_PUBLIC int
1536
+ trio_string_append
1537
+ TRIO_ARGS2((self, other),
1538
+ trio_string_t *self,
1539
+ trio_string_t *other)
1540
+ {
1541
+ size_t length;
1542
+
1543
+ assert(self);
1544
+ assert(other);
1545
+
1546
+ length = self->length + other->length;
1547
+ if (!TrioStringGrowTo(self, length))
1548
+ goto error;
1549
+ trio_copy(&self->content[self->length], other->content);
1550
+ self->length = length;
1551
+ return TRUE;
1552
+
1553
+ error:
1554
+ return FALSE;
1555
+ }
1556
+ #endif /* !defined(TRIO_MINIMAL) */
1557
+
1558
+
1559
+ #if !defined(TRIO_MINIMAL)
1560
+ /*
1561
+ * trio_xstring_append
1562
+ */
1563
+ TRIO_STRING_PUBLIC int
1564
+ trio_xstring_append
1565
+ TRIO_ARGS2((self, other),
1566
+ trio_string_t *self,
1567
+ TRIO_CONST char *other)
1568
+ {
1569
+ size_t length;
1570
+
1571
+ assert(self);
1572
+ assert(other);
1573
+
1574
+ length = self->length + trio_length(other);
1575
+ if (!TrioStringGrowTo(self, length))
1576
+ goto error;
1577
+ trio_copy(&self->content[self->length], other);
1578
+ self->length = length;
1579
+ return TRUE;
1580
+
1581
+ error:
1582
+ return FALSE;
1583
+ }
1584
+ #endif /* !defined(TRIO_MINIMAL) */
1585
+
1586
+
1587
+ /*
1588
+ * trio_xstring_append_char
1589
+ */
1590
+ TRIO_STRING_PUBLIC int
1591
+ trio_xstring_append_char
1592
+ TRIO_ARGS2((self, character),
1593
+ trio_string_t *self,
1594
+ char character)
1595
+ {
1596
+ assert(self);
1597
+
1598
+ if ((int)self->length >= trio_string_size(self))
1599
+ {
1600
+ if (!TrioStringGrow(self, 0))
1601
+ goto error;
1602
+ }
1603
+ self->content[self->length] = character;
1604
+ self->length++;
1605
+ return TRUE;
1606
+
1607
+ error:
1608
+ return FALSE;
1609
+ }
1610
+
1611
+
1612
+ #if !defined(TRIO_MINIMAL)
1613
+ /**
1614
+ Search for the first occurrence of second parameter in the first.
1615
+
1616
+ @param self Dynamic string to be modified.
1617
+ @param other Dynamic string to copy from.
1618
+ @return Boolean value indicating success or failure.
1619
+ */
1620
+ TRIO_STRING_PUBLIC int
1621
+ trio_string_contains
1622
+ TRIO_ARGS2((self, other),
1623
+ trio_string_t *self,
1624
+ trio_string_t *other)
1625
+ {
1626
+ assert(self);
1627
+ assert(other);
1628
+
1629
+ return trio_contains(self->content, other->content);
1630
+ }
1631
+ #endif /* !defined(TRIO_MINIMAL) */
1632
+
1633
+
1634
+ #if !defined(TRIO_MINIMAL)
1635
+ /*
1636
+ * trio_xstring_contains
1637
+ */
1638
+ TRIO_STRING_PUBLIC int
1639
+ trio_xstring_contains
1640
+ TRIO_ARGS2((self, other),
1641
+ trio_string_t *self,
1642
+ TRIO_CONST char *other)
1643
+ {
1644
+ assert(self);
1645
+ assert(other);
1646
+
1647
+ return trio_contains(self->content, other);
1648
+ }
1649
+ #endif /* !defined(TRIO_MINIMAL) */
1650
+
1651
+
1652
+ #if !defined(TRIO_MINIMAL)
1653
+ /*
1654
+ * trio_string_copy
1655
+ */
1656
+ TRIO_STRING_PUBLIC int
1657
+ trio_string_copy
1658
+ TRIO_ARGS2((self, other),
1659
+ trio_string_t *self,
1660
+ trio_string_t *other)
1661
+ {
1662
+ assert(self);
1663
+ assert(other);
1664
+
1665
+ self->length = 0;
1666
+ return trio_string_append(self, other);
1667
+ }
1668
+ #endif /* !defined(TRIO_MINIMAL) */
1669
+
1670
+
1671
+ #if !defined(TRIO_MINIMAL)
1672
+ /*
1673
+ * trio_xstring_copy
1674
+ */
1675
+ TRIO_STRING_PUBLIC int
1676
+ trio_xstring_copy
1677
+ TRIO_ARGS2((self, other),
1678
+ trio_string_t *self,
1679
+ TRIO_CONST char *other)
1680
+ {
1681
+ assert(self);
1682
+ assert(other);
1683
+
1684
+ self->length = 0;
1685
+ return trio_xstring_append(self, other);
1686
+ }
1687
+ #endif /* !defined(TRIO_MINIMAL) */
1688
+
1689
+
1690
+ #if !defined(TRIO_MINIMAL)
1691
+ /*
1692
+ * trio_string_duplicate
1693
+ */
1694
+ TRIO_STRING_PUBLIC trio_string_t *
1695
+ trio_string_duplicate
1696
+ TRIO_ARGS1((other),
1697
+ trio_string_t *other)
1698
+ {
1699
+ trio_string_t *self;
1700
+
1701
+ assert(other);
1702
+
1703
+ self = TrioStringAlloc();
1704
+ if (self)
1705
+ {
1706
+ self->content = TrioDuplicateMax(other->content, other->length);
1707
+ if (self->content)
1708
+ {
1709
+ self->length = other->length;
1710
+ self->allocated = self->length + 1;
1711
+ }
1712
+ else
1713
+ {
1714
+ self->length = self->allocated = 0;
1715
+ }
1716
+ }
1717
+ return self;
1718
+ }
1719
+ #endif /* !defined(TRIO_MINIMAL) */
1720
+
1721
+
1722
+ /*
1723
+ * trio_xstring_duplicate
1724
+ */
1725
+ TRIO_STRING_PUBLIC trio_string_t *
1726
+ trio_xstring_duplicate
1727
+ TRIO_ARGS1((other),
1728
+ TRIO_CONST char *other)
1729
+ {
1730
+ trio_string_t *self;
1731
+
1732
+ assert(other);
1733
+
1734
+ self = TrioStringAlloc();
1735
+ if (self)
1736
+ {
1737
+ self->content = TrioDuplicateMax(other, trio_length(other));
1738
+ if (self->content)
1739
+ {
1740
+ self->length = trio_length(self->content);
1741
+ self->allocated = self->length + 1;
1742
+ }
1743
+ else
1744
+ {
1745
+ self->length = self->allocated = 0;
1746
+ }
1747
+ }
1748
+ return self;
1749
+ }
1750
+
1751
+
1752
+ #if !defined(TRIO_MINIMAL)
1753
+ /*
1754
+ * trio_string_equal
1755
+ */
1756
+ TRIO_STRING_PUBLIC int
1757
+ trio_string_equal
1758
+ TRIO_ARGS2((self, other),
1759
+ trio_string_t *self,
1760
+ trio_string_t *other)
1761
+ {
1762
+ assert(self);
1763
+ assert(other);
1764
+
1765
+ return trio_equal(self->content, other->content);
1766
+ }
1767
+ #endif /* !defined(TRIO_MINIMAL) */
1768
+
1769
+
1770
+ #if !defined(TRIO_MINIMAL)
1771
+ /*
1772
+ * trio_xstring_equal
1773
+ */
1774
+ TRIO_STRING_PUBLIC int
1775
+ trio_xstring_equal
1776
+ TRIO_ARGS2((self, other),
1777
+ trio_string_t *self,
1778
+ TRIO_CONST char *other)
1779
+ {
1780
+ assert(self);
1781
+ assert(other);
1782
+
1783
+ return trio_equal(self->content, other);
1784
+ }
1785
+ #endif /* !defined(TRIO_MINIMAL) */
1786
+
1787
+
1788
+ #if !defined(TRIO_MINIMAL)
1789
+ /*
1790
+ * trio_string_equal_max
1791
+ */
1792
+ TRIO_STRING_PUBLIC int
1793
+ trio_string_equal_max
1794
+ TRIO_ARGS3((self, max, other),
1795
+ trio_string_t *self,
1796
+ size_t max,
1797
+ trio_string_t *other)
1798
+ {
1799
+ assert(self);
1800
+ assert(other);
1801
+
1802
+ return trio_equal_max(self->content, max, other->content);
1803
+ }
1804
+ #endif /* !defined(TRIO_MINIMAL) */
1805
+
1806
+
1807
+ #if !defined(TRIO_MINIMAL)
1808
+ /*
1809
+ * trio_xstring_equal_max
1810
+ */
1811
+ TRIO_STRING_PUBLIC int
1812
+ trio_xstring_equal_max
1813
+ TRIO_ARGS3((self, max, other),
1814
+ trio_string_t *self,
1815
+ size_t max,
1816
+ TRIO_CONST char *other)
1817
+ {
1818
+ assert(self);
1819
+ assert(other);
1820
+
1821
+ return trio_equal_max(self->content, max, other);
1822
+ }
1823
+ #endif /* !defined(TRIO_MINIMAL) */
1824
+
1825
+
1826
+ #if !defined(TRIO_MINIMAL)
1827
+ /*
1828
+ * trio_string_equal_case
1829
+ */
1830
+ TRIO_STRING_PUBLIC int
1831
+ trio_string_equal_case
1832
+ TRIO_ARGS2((self, other),
1833
+ trio_string_t *self,
1834
+ trio_string_t *other)
1835
+ {
1836
+ assert(self);
1837
+ assert(other);
1838
+
1839
+ return trio_equal_case(self->content, other->content);
1840
+ }
1841
+ #endif /* !defined(TRIO_MINIMAL) */
1842
+
1843
+
1844
+ #if !defined(TRIO_MINIMAL)
1845
+ /*
1846
+ * trio_xstring_equal_case
1847
+ */
1848
+ TRIO_STRING_PUBLIC int
1849
+ trio_xstring_equal_case
1850
+ TRIO_ARGS2((self, other),
1851
+ trio_string_t *self,
1852
+ TRIO_CONST char *other)
1853
+ {
1854
+ assert(self);
1855
+ assert(other);
1856
+
1857
+ return trio_equal_case(self->content, other);
1858
+ }
1859
+ #endif /* !defined(TRIO_MINIMAL) */
1860
+
1861
+
1862
+ #if !defined(TRIO_MINIMAL)
1863
+ /*
1864
+ * trio_string_equal_case_max
1865
+ */
1866
+ TRIO_STRING_PUBLIC int
1867
+ trio_string_equal_case_max
1868
+ TRIO_ARGS3((self, max, other),
1869
+ trio_string_t *self,
1870
+ size_t max,
1871
+ trio_string_t *other)
1872
+ {
1873
+ assert(self);
1874
+ assert(other);
1875
+
1876
+ return trio_equal_case_max(self->content, max, other->content);
1877
+ }
1878
+ #endif /* !defined(TRIO_MINIMAL) */
1879
+
1880
+
1881
+ #if !defined(TRIO_MINIMAL)
1882
+ /*
1883
+ * trio_xstring_equal_case_max
1884
+ */
1885
+ TRIO_STRING_PUBLIC int
1886
+ trio_xstring_equal_case_max
1887
+ TRIO_ARGS3((self, max, other),
1888
+ trio_string_t *self,
1889
+ size_t max,
1890
+ TRIO_CONST char *other)
1891
+ {
1892
+ assert(self);
1893
+ assert(other);
1894
+
1895
+ return trio_equal_case_max(self->content, max, other);
1896
+ }
1897
+ #endif /* !defined(TRIO_MINIMAL) */
1898
+
1899
+
1900
+ #if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE)
1901
+ /*
1902
+ * trio_string_format_data_max
1903
+ */
1904
+ TRIO_STRING_PUBLIC size_t
1905
+ trio_string_format_date_max
1906
+ TRIO_ARGS4((self, max, format, datetime),
1907
+ trio_string_t *self,
1908
+ size_t max,
1909
+ TRIO_CONST char *format,
1910
+ TRIO_CONST struct tm *datetime)
1911
+ {
1912
+ assert(self);
1913
+
1914
+ return trio_format_date_max(self->content, max, format, datetime);
1915
+ }
1916
+ #endif /* !defined(TRIO_MINIMAL) */
1917
+
1918
+
1919
+ #if !defined(TRIO_MINIMAL)
1920
+ /*
1921
+ * trio_string_index
1922
+ */
1923
+ TRIO_STRING_PUBLIC char *
1924
+ trio_string_index
1925
+ TRIO_ARGS2((self, character),
1926
+ trio_string_t *self,
1927
+ int character)
1928
+ {
1929
+ assert(self);
1930
+
1931
+ return trio_index(self->content, character);
1932
+ }
1933
+ #endif /* !defined(TRIO_MINIMAL) */
1934
+
1935
+
1936
+ #if !defined(TRIO_MINIMAL)
1937
+ /*
1938
+ * trio_string_index_last
1939
+ */
1940
+ TRIO_STRING_PUBLIC char *
1941
+ trio_string_index_last
1942
+ TRIO_ARGS2((self, character),
1943
+ trio_string_t *self,
1944
+ int character)
1945
+ {
1946
+ assert(self);
1947
+
1948
+ return trio_index_last(self->content, character);
1949
+ }
1950
+ #endif /* !defined(TRIO_MINIMAL) */
1951
+
1952
+
1953
+ #if !defined(TRIO_MINIMAL)
1954
+ /*
1955
+ * trio_string_length
1956
+ */
1957
+ TRIO_STRING_PUBLIC int
1958
+ trio_string_length
1959
+ TRIO_ARGS1((self),
1960
+ trio_string_t *self)
1961
+ {
1962
+ assert(self);
1963
+
1964
+ if (self->length == 0)
1965
+ {
1966
+ self->length = trio_length(self->content);
1967
+ }
1968
+ return self->length;
1969
+ }
1970
+ #endif /* !defined(TRIO_MINIMAL) */
1971
+
1972
+
1973
+ #if !defined(TRIO_MINIMAL)
1974
+ /*
1975
+ * trio_string_lower
1976
+ */
1977
+ TRIO_STRING_PUBLIC int
1978
+ trio_string_lower
1979
+ TRIO_ARGS1((self),
1980
+ trio_string_t *self)
1981
+ {
1982
+ assert(self);
1983
+
1984
+ return trio_lower(self->content);
1985
+ }
1986
+ #endif /* !defined(TRIO_MINIMAL) */
1987
+
1988
+
1989
+ #if !defined(TRIO_MINIMAL)
1990
+ /*
1991
+ * trio_string_match
1992
+ */
1993
+ TRIO_STRING_PUBLIC int
1994
+ trio_string_match
1995
+ TRIO_ARGS2((self, other),
1996
+ trio_string_t *self,
1997
+ trio_string_t *other)
1998
+ {
1999
+ assert(self);
2000
+ assert(other);
2001
+
2002
+ return trio_match(self->content, other->content);
2003
+ }
2004
+ #endif /* !defined(TRIO_MINIMAL) */
2005
+
2006
+
2007
+ #if !defined(TRIO_MINIMAL)
2008
+ /*
2009
+ * trio_xstring_match
2010
+ */
2011
+ TRIO_STRING_PUBLIC int
2012
+ trio_xstring_match
2013
+ TRIO_ARGS2((self, other),
2014
+ trio_string_t *self,
2015
+ TRIO_CONST char *other)
2016
+ {
2017
+ assert(self);
2018
+ assert(other);
2019
+
2020
+ return trio_match(self->content, other);
2021
+ }
2022
+ #endif /* !defined(TRIO_MINIMAL) */
2023
+
2024
+
2025
+ #if !defined(TRIO_MINIMAL)
2026
+ /*
2027
+ * trio_string_match_case
2028
+ */
2029
+ TRIO_STRING_PUBLIC int
2030
+ trio_string_match_case
2031
+ TRIO_ARGS2((self, other),
2032
+ trio_string_t *self,
2033
+ trio_string_t *other)
2034
+ {
2035
+ assert(self);
2036
+ assert(other);
2037
+
2038
+ return trio_match_case(self->content, other->content);
2039
+ }
2040
+ #endif /* !defined(TRIO_MINIMAL) */
2041
+
2042
+
2043
+ #if !defined(TRIO_MINIMAL)
2044
+ /*
2045
+ * trio_xstring_match_case
2046
+ */
2047
+ TRIO_STRING_PUBLIC int
2048
+ trio_xstring_match_case
2049
+ TRIO_ARGS2((self, other),
2050
+ trio_string_t *self,
2051
+ TRIO_CONST char *other)
2052
+ {
2053
+ assert(self);
2054
+ assert(other);
2055
+
2056
+ return trio_match_case(self->content, other);
2057
+ }
2058
+ #endif /* !defined(TRIO_MINIMAL) */
2059
+
2060
+
2061
+ #if !defined(TRIO_MINIMAL)
2062
+ /*
2063
+ * trio_string_substring
2064
+ */
2065
+ TRIO_STRING_PUBLIC char *
2066
+ trio_string_substring
2067
+ TRIO_ARGS2((self, other),
2068
+ trio_string_t *self,
2069
+ trio_string_t *other)
2070
+ {
2071
+ assert(self);
2072
+ assert(other);
2073
+
2074
+ return trio_substring(self->content, other->content);
2075
+ }
2076
+ #endif /* !defined(TRIO_MINIMAL) */
2077
+
2078
+
2079
+ #if !defined(TRIO_MINIMAL)
2080
+ /*
2081
+ * trio_xstring_substring
2082
+ */
2083
+ TRIO_STRING_PUBLIC char *
2084
+ trio_xstring_substring
2085
+ TRIO_ARGS2((self, other),
2086
+ trio_string_t *self,
2087
+ TRIO_CONST char *other)
2088
+ {
2089
+ assert(self);
2090
+ assert(other);
2091
+
2092
+ return trio_substring(self->content, other);
2093
+ }
2094
+ #endif /* !defined(TRIO_MINIMAL) */
2095
+
2096
+
2097
+ #if !defined(TRIO_MINIMAL)
2098
+ /*
2099
+ * trio_string_upper
2100
+ */
2101
+ TRIO_STRING_PUBLIC int
2102
+ trio_string_upper
2103
+ TRIO_ARGS1((self),
2104
+ trio_string_t *self)
2105
+ {
2106
+ assert(self);
2107
+
2108
+ return trio_upper(self->content);
2109
+ }
2110
+ #endif /* !defined(TRIO_MINIMAL) */
2111
+
2112
+ /** @} End of DynamicStrings */