File: | eel/eel-string.c |
Warning: | line 585, column 9 Access of the heap area at index 1, while it holds only a single 'ConversionInfo' element |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- | |||
2 | ||||
3 | eel-string.c: String routines to augment <string.h>. | |||
4 | ||||
5 | Copyright (C) 2000 Eazel, Inc. | |||
6 | ||||
7 | The Cafe Library is free software; you can redistribute it and/or | |||
8 | modify it under the terms of the GNU Library General Public License as | |||
9 | published by the Free Software Foundation; either version 2 of the | |||
10 | License, or (at your option) any later version. | |||
11 | ||||
12 | The Cafe Library is distributed in the hope that it will be useful, | |||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
15 | Library General Public License for more details. | |||
16 | ||||
17 | You should have received a copy of the GNU Library General Public | |||
18 | License along with the Cafe Library; see the file COPYING.LIB. If not, | |||
19 | write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | |||
20 | Boston, MA 02110-1301, USA. | |||
21 | ||||
22 | Authors: Darin Adler <darin@eazel.com> | |||
23 | */ | |||
24 | ||||
25 | #include <config.h> | |||
26 | #include "eel-glib-extensions.h" | |||
27 | #include "eel-string.h" | |||
28 | ||||
29 | #include <errno(*__errno_location ()).h> | |||
30 | #include <locale.h> | |||
31 | #include <stdlib.h> | |||
32 | #include <string.h> | |||
33 | ||||
34 | #if !defined (EEL_OMIT_SELF_CHECK) | |||
35 | #include "eel-lib-self-check-functions.h" | |||
36 | #endif | |||
37 | ||||
38 | size_t | |||
39 | eel_strlen (const char *string) | |||
40 | { | |||
41 | return string == NULL((void*)0) ? 0 : strlen (string); | |||
42 | } | |||
43 | ||||
44 | char * | |||
45 | eel_strchr (const char *haystack, char needle) | |||
46 | { | |||
47 | return haystack == NULL((void*)0) ? NULL((void*)0) : strchr (haystack, needle); | |||
48 | } | |||
49 | ||||
50 | int | |||
51 | eel_strcmp (const char *string_a, const char *string_b) | |||
52 | { | |||
53 | /* FIXME bugzilla.eazel.com 5450: Maybe we need to make this | |||
54 | * treat 'NULL < ""', or have a flavor that does that. If we | |||
55 | * didn't have code that already relies on 'NULL == ""', I | |||
56 | * would change it right now. | |||
57 | */ | |||
58 | return strcmp (string_a == NULL((void*)0) ? "" : string_a, | |||
59 | string_b == NULL((void*)0) ? "" : string_b); | |||
60 | } | |||
61 | ||||
62 | gboolean | |||
63 | eel_str_is_empty (const char *string_or_null) | |||
64 | { | |||
65 | return eel_strcmp (string_or_null, NULL((void*)0)) == 0; | |||
66 | } | |||
67 | ||||
68 | gboolean | |||
69 | eel_str_has_prefix (const char *haystack, const char *needle) | |||
70 | { | |||
71 | return g_str_has_prefix (haystack == NULL ? "" : haystack,(__builtin_constant_p (needle == ((void*)0) ? "" : needle)? __extension__ ({ const char * const __str = (haystack == ((void*)0) ? "" : haystack); const char * const __prefix = (needle == ((void*) 0) ? "" : needle); gboolean __result = (0); if (__str == ((void *)0) || __prefix == ((void*)0)) __result = (g_str_has_prefix) (__str, __prefix); else { const size_t __str_len = strlen (( (__str) + !(__str))); const size_t __prefix_len = strlen (((__prefix ) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len ) == 0; } __result; }) : (g_str_has_prefix) (haystack == ((void *)0) ? "" : haystack, needle == ((void*)0) ? "" : needle) ) | |||
72 | needle == NULL ? "" : needle)(__builtin_constant_p (needle == ((void*)0) ? "" : needle)? __extension__ ({ const char * const __str = (haystack == ((void*)0) ? "" : haystack); const char * const __prefix = (needle == ((void*) 0) ? "" : needle); gboolean __result = (0); if (__str == ((void *)0) || __prefix == ((void*)0)) __result = (g_str_has_prefix) (__str, __prefix); else { const size_t __str_len = strlen (( (__str) + !(__str))); const size_t __prefix_len = strlen (((__prefix ) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len ) == 0; } __result; }) : (g_str_has_prefix) (haystack == ((void *)0) ? "" : haystack, needle == ((void*)0) ? "" : needle) ); | |||
73 | } | |||
74 | ||||
75 | gboolean | |||
76 | eel_istr_has_prefix (const char *haystack, const char *needle) | |||
77 | { | |||
78 | const char *h, *n; | |||
79 | char hc, nc; | |||
80 | ||||
81 | /* Eat one character at a time. */ | |||
82 | h = haystack == NULL((void*)0) ? "" : haystack; | |||
83 | n = needle == NULL((void*)0) ? "" : needle; | |||
84 | do | |||
85 | { | |||
86 | if (*n == '\0') | |||
87 | { | |||
88 | return TRUE(!(0)); | |||
89 | } | |||
90 | if (*h == '\0') | |||
91 | { | |||
92 | return FALSE(0); | |||
93 | } | |||
94 | hc = *h++; | |||
95 | nc = *n++; | |||
96 | hc = g_ascii_tolower (hc); | |||
97 | nc = g_ascii_tolower (nc); | |||
98 | } | |||
99 | while (hc == nc); | |||
100 | return FALSE(0); | |||
101 | } | |||
102 | ||||
103 | /** | |||
104 | * eel_str_get_prefix: | |||
105 | * Get a new string containing the first part of an existing string. | |||
106 | * | |||
107 | * @source: The string whose prefix should be extracted. | |||
108 | * @delimiter: The string that marks the end of the prefix. | |||
109 | * | |||
110 | * Return value: A newly-allocated string that that matches the first part | |||
111 | * of @source, up to but not including the first occurrence of | |||
112 | * @delimiter. If @source is NULL, returns NULL. If | |||
113 | * @delimiter is NULL, returns a copy of @source. | |||
114 | * If @delimiter does not occur in @source, returns | |||
115 | * a copy of @source. | |||
116 | **/ | |||
117 | char * | |||
118 | eel_str_get_prefix (const char *source, | |||
119 | const char *delimiter) | |||
120 | { | |||
121 | char *prefix_start; | |||
122 | ||||
123 | if (source == NULL((void*)0)) | |||
124 | { | |||
125 | return NULL((void*)0); | |||
126 | } | |||
127 | ||||
128 | if (delimiter == NULL((void*)0)) | |||
129 | { | |||
130 | return g_strdup (source)g_strdup_inline (source); | |||
131 | } | |||
132 | ||||
133 | prefix_start = strstr (source, delimiter); | |||
134 | ||||
135 | if (prefix_start == NULL((void*)0)) | |||
136 | { | |||
137 | return g_strdup ("")g_strdup_inline (""); | |||
138 | } | |||
139 | ||||
140 | return g_strndup (source, prefix_start - source); | |||
141 | } | |||
142 | ||||
143 | char * | |||
144 | eel_str_double_underscores (const char *string) | |||
145 | { | |||
146 | int underscores; | |||
147 | const char *p; | |||
148 | char *q; | |||
149 | char *escaped; | |||
150 | ||||
151 | if (string == NULL((void*)0)) | |||
152 | { | |||
153 | return NULL((void*)0); | |||
154 | } | |||
155 | ||||
156 | underscores = 0; | |||
157 | for (p = string; *p != '\0'; p++) | |||
158 | { | |||
159 | underscores += (*p == '_'); | |||
160 | } | |||
161 | ||||
162 | if (underscores == 0) | |||
163 | { | |||
164 | return g_strdup (string)g_strdup_inline (string); | |||
165 | } | |||
166 | ||||
167 | escaped = g_new (char, strlen (string) + underscores + 1)((char *) g_malloc_n ((strlen (string) + underscores + 1), sizeof (char))); | |||
168 | for (p = string, q = escaped; *p != '\0'; p++, q++) | |||
169 | { | |||
170 | /* Add an extra underscore. */ | |||
171 | if (*p == '_') | |||
172 | { | |||
173 | *q++ = '_'; | |||
174 | } | |||
175 | *q = *p; | |||
176 | } | |||
177 | *q = '\0'; | |||
178 | ||||
179 | return escaped; | |||
180 | } | |||
181 | ||||
182 | char * | |||
183 | eel_str_capitalize (const char *string) | |||
184 | { | |||
185 | char *capitalized; | |||
186 | ||||
187 | if (string == NULL((void*)0)) | |||
188 | { | |||
189 | return NULL((void*)0); | |||
190 | } | |||
191 | ||||
192 | capitalized = g_strdup (string)g_strdup_inline (string); | |||
193 | ||||
194 | capitalized[0] = g_ascii_toupper (capitalized[0]); | |||
195 | ||||
196 | return capitalized; | |||
197 | } | |||
198 | ||||
199 | /* Note: eel_string_ellipsize_* that use a length in pixels | |||
200 | * rather than characters can be found in eel_cdk_extensions.h | |||
201 | * | |||
202 | * FIXME bugzilla.eazel.com 5089: | |||
203 | * we should coordinate the names of eel_string_ellipsize_* | |||
204 | * and eel_str_*_truncate so that they match better and reflect | |||
205 | * their different behavior. | |||
206 | */ | |||
207 | char * | |||
208 | eel_str_middle_truncate (const char *string, | |||
209 | guint truncate_length) | |||
210 | { | |||
211 | char *truncated; | |||
212 | guint length; | |||
213 | guint num_left_chars; | |||
214 | guint num_right_chars; | |||
215 | ||||
216 | const char delimter[] = "..."; | |||
217 | const guint delimter_length = strlen (delimter); | |||
218 | const guint min_truncate_length = delimter_length + 2; | |||
219 | ||||
220 | if (string == NULL((void*)0)) | |||
221 | { | |||
222 | return NULL((void*)0); | |||
223 | } | |||
224 | ||||
225 | /* It doesnt make sense to truncate strings to less than | |||
226 | * the size of the delimiter plus 2 characters (one on each | |||
227 | * side) | |||
228 | */ | |||
229 | if (truncate_length < min_truncate_length) | |||
230 | { | |||
231 | return g_strdup (string)g_strdup_inline (string); | |||
232 | } | |||
233 | ||||
234 | length = g_utf8_strlen (string, -1); | |||
235 | ||||
236 | /* Make sure the string is not already small enough. */ | |||
237 | if (length <= truncate_length) | |||
238 | { | |||
239 | return g_strdup (string)g_strdup_inline (string); | |||
240 | } | |||
241 | ||||
242 | /* Find the 'middle' where the truncation will occur. */ | |||
243 | num_left_chars = (truncate_length - delimter_length) / 2; | |||
244 | num_right_chars = truncate_length - num_left_chars - delimter_length; | |||
245 | ||||
246 | truncated = g_new (char, strlen (string) + 1)((char *) g_malloc_n ((strlen (string) + 1), sizeof (char))); | |||
247 | ||||
248 | g_utf8_strncpy (truncated, string, num_left_chars); | |||
249 | g_strlcat (truncated, delimter, (truncate_length + 1)); | |||
250 | g_strlcat (truncated, g_utf8_offset_to_pointer (string, length - num_right_chars), (truncate_length + 1)); | |||
251 | ||||
252 | return truncated; | |||
253 | } | |||
254 | ||||
255 | char * | |||
256 | eel_str_strip_substring_and_after (const char *string, | |||
257 | const char *substring) | |||
258 | { | |||
259 | const char *substring_position; | |||
260 | ||||
261 | g_return_val_if_fail (substring != NULL, g_strdup (string))do { if ((substring != ((void*)0))) { } else { g_return_if_fail_warning ("Eel", ((const char*) (__func__)), "substring != NULL"); return (g_strdup_inline (string)); } } while (0); | |||
262 | g_return_val_if_fail (substring[0] != '\0', g_strdup (string))do { if ((substring[0] != '\0')) { } else { g_return_if_fail_warning ("Eel", ((const char*) (__func__)), "substring[0] != '\\0'") ; return (g_strdup_inline (string)); } } while (0); | |||
263 | ||||
264 | if (string == NULL((void*)0)) | |||
265 | { | |||
266 | return NULL((void*)0); | |||
267 | } | |||
268 | ||||
269 | substring_position = strstr (string, substring); | |||
270 | if (substring_position == NULL((void*)0)) | |||
271 | { | |||
272 | return g_strdup (string)g_strdup_inline (string); | |||
273 | } | |||
274 | ||||
275 | return g_strndup (string, | |||
276 | substring_position - string); | |||
277 | } | |||
278 | ||||
279 | char * | |||
280 | eel_str_replace_substring (const char *string, | |||
281 | const char *substring, | |||
282 | const char *replacement) | |||
283 | { | |||
284 | int substring_length, replacement_length, result_length, remaining_length; | |||
285 | const char *p, *substring_position; | |||
286 | char *result, *result_position; | |||
287 | ||||
288 | g_return_val_if_fail (substring != NULL, g_strdup (string))do { if ((substring != ((void*)0))) { } else { g_return_if_fail_warning ("Eel", ((const char*) (__func__)), "substring != NULL"); return (g_strdup_inline (string)); } } while (0); | |||
289 | g_return_val_if_fail (substring[0] != '\0', g_strdup (string))do { if ((substring[0] != '\0')) { } else { g_return_if_fail_warning ("Eel", ((const char*) (__func__)), "substring[0] != '\\0'") ; return (g_strdup_inline (string)); } } while (0); | |||
290 | ||||
291 | if (string == NULL((void*)0)) | |||
292 | { | |||
293 | return NULL((void*)0); | |||
294 | } | |||
295 | ||||
296 | if (replacement == NULL((void*)0)) | |||
297 | { | |||
298 | replacement = ""; | |||
299 | } | |||
300 | ||||
301 | substring_length = strlen (substring); | |||
302 | replacement_length = eel_strlen (replacement); | |||
303 | ||||
304 | result_length = strlen (string); | |||
305 | for (p = string; ; p = substring_position + substring_length) | |||
306 | { | |||
307 | substring_position = strstr (p, substring); | |||
308 | if (substring_position == NULL((void*)0)) | |||
309 | { | |||
310 | break; | |||
311 | } | |||
312 | if (replacement_length > substring_length) | |||
313 | result_length += replacement_length - substring_length; | |||
314 | } | |||
315 | ||||
316 | result = g_malloc (result_length + 1); | |||
317 | ||||
318 | result_position = result; | |||
319 | for (p = string; ; p = substring_position + substring_length) | |||
320 | { | |||
321 | substring_position = strstr (p, substring); | |||
322 | if (substring_position == NULL((void*)0)) | |||
323 | { | |||
324 | remaining_length = strlen (p); | |||
325 | memcpy (result_position, p, remaining_length); | |||
326 | result_position += remaining_length; | |||
327 | break; | |||
328 | } | |||
329 | memcpy (result_position, p, substring_position - p); | |||
330 | result_position += substring_position - p; | |||
331 | memcpy (result_position, replacement, replacement_length); | |||
332 | result_position += replacement_length; | |||
333 | } | |||
334 | ||||
335 | result_position[0] = '\0'; | |||
336 | ||||
337 | return result; | |||
338 | } | |||
339 | ||||
340 | /**************** Custom printf ***********/ | |||
341 | ||||
342 | typedef struct | |||
343 | { | |||
344 | const char *start; | |||
345 | const char *end; | |||
346 | GString *format; | |||
347 | int arg_pos; | |||
348 | int width_pos; | |||
349 | int width_format_index; | |||
350 | int precision_pos; | |||
351 | int precision_format_index; | |||
352 | } ConversionInfo; | |||
353 | ||||
354 | enum | |||
355 | { | |||
356 | ARG_TYPE_INVALID, | |||
357 | ARG_TYPE_INT, | |||
358 | ARG_TYPE_LONG, | |||
359 | ARG_TYPE_LONG_LONG, | |||
360 | ARG_TYPE_SIZE, | |||
361 | ARG_TYPE_LONG_DOUBLE, | |||
362 | ARG_TYPE_DOUBLE, | |||
363 | ARG_TYPE_POINTER | |||
364 | }; | |||
365 | ||||
366 | typedef int ArgType; /* An int, because custom are < 0 */ | |||
367 | ||||
368 | ||||
369 | static const char * | |||
370 | get_position (const char *format, int *i) | |||
371 | { | |||
372 | const char *p; | |||
373 | ||||
374 | p = format; | |||
375 | ||||
376 | if (g_ascii_isdigit (*p)((g_ascii_table[(guchar) (*p)] & G_ASCII_DIGIT) != 0)) | |||
377 | { | |||
378 | p++; | |||
379 | ||||
380 | while (g_ascii_isdigit (*p)((g_ascii_table[(guchar) (*p)] & G_ASCII_DIGIT) != 0)) | |||
381 | { | |||
382 | p++; | |||
383 | } | |||
384 | ||||
385 | if (*p == '$') | |||
386 | { | |||
387 | if (i != NULL((void*)0)) | |||
388 | { | |||
389 | *i = atoi (format) - 1; | |||
390 | } | |||
391 | return p + 1; | |||
392 | } | |||
393 | } | |||
394 | ||||
395 | return format; | |||
396 | } | |||
397 | ||||
398 | static gboolean | |||
399 | is_flag (char c) | |||
400 | { | |||
401 | return strchr ("#0- +'I", c) != NULL((void*)0); | |||
402 | } | |||
403 | ||||
404 | static gboolean | |||
405 | is_length_modifier (char c) | |||
406 | { | |||
407 | return strchr ("hlLjzt", c) != NULL((void*)0); | |||
408 | } | |||
409 | ||||
410 | ||||
411 | static ArgType | |||
412 | get_arg_type_from_format (EelPrintfHandler *custom_handlers, | |||
413 | const char *format, | |||
414 | int len) | |||
415 | { | |||
416 | char c; | |||
417 | ||||
418 | c = format[len-1]; | |||
419 | ||||
420 | if (custom_handlers != NULL((void*)0)) | |||
421 | { | |||
422 | int i; | |||
423 | ||||
424 | for (i = 0; custom_handlers[i].character != 0; i++) | |||
425 | { | |||
426 | if (custom_handlers[i].character == c) | |||
427 | { | |||
428 | return -(i + 1); | |||
429 | } | |||
430 | } | |||
431 | } | |||
432 | ||||
433 | switch (c) | |||
434 | { | |||
435 | case 'd': | |||
436 | case 'i': | |||
437 | case 'o': | |||
438 | case 'u': | |||
439 | case 'x': | |||
440 | case 'X': | |||
441 | if (g_str_has_prefix (format, "ll")(__builtin_constant_p ("ll")? __extension__ ({ const char * const __str = (format); const char * const __prefix = ("ll"); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void *)0)) __result = (g_str_has_prefix) (__str, __prefix); else { const size_t __str_len = strlen (((__str) + !(__str))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0; } __result; }) : (g_str_has_prefix) (format, "ll") )) | |||
442 | { | |||
443 | return ARG_TYPE_LONG_LONG; | |||
444 | } | |||
445 | if (g_str_has_prefix (format, "l")(__builtin_constant_p ("l")? __extension__ ({ const char * const __str = (format); const char * const __prefix = ("l"); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void *)0)) __result = (g_str_has_prefix) (__str, __prefix); else { const size_t __str_len = strlen (((__str) + !(__str))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0; } __result; }) : (g_str_has_prefix) (format, "l") )) | |||
446 | { | |||
447 | return ARG_TYPE_LONG; | |||
448 | } | |||
449 | if (g_str_has_prefix (format, "l")(__builtin_constant_p ("l")? __extension__ ({ const char * const __str = (format); const char * const __prefix = ("l"); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void *)0)) __result = (g_str_has_prefix) (__str, __prefix); else { const size_t __str_len = strlen (((__str) + !(__str))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0; } __result; }) : (g_str_has_prefix) (format, "l") )) | |||
450 | { | |||
451 | return ARG_TYPE_LONG; | |||
452 | } | |||
453 | if (g_str_has_prefix (format, "z")(__builtin_constant_p ("z")? __extension__ ({ const char * const __str = (format); const char * const __prefix = ("z"); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void *)0)) __result = (g_str_has_prefix) (__str, __prefix); else { const size_t __str_len = strlen (((__str) + !(__str))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0; } __result; }) : (g_str_has_prefix) (format, "z") )) | |||
454 | { | |||
455 | return ARG_TYPE_SIZE; | |||
456 | } | |||
457 | return ARG_TYPE_INT; | |||
458 | case 'e': | |||
459 | case 'E': | |||
460 | case 'f': | |||
461 | case 'F': | |||
462 | case 'g': | |||
463 | case 'G': | |||
464 | case 'a': | |||
465 | case 'A': | |||
466 | if (g_str_has_prefix (format, "L")(__builtin_constant_p ("L")? __extension__ ({ const char * const __str = (format); const char * const __prefix = ("L"); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void *)0)) __result = (g_str_has_prefix) (__str, __prefix); else { const size_t __str_len = strlen (((__str) + !(__str))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0; } __result; }) : (g_str_has_prefix) (format, "L") )) | |||
467 | { | |||
468 | return ARG_TYPE_LONG_DOUBLE; | |||
469 | } | |||
470 | return ARG_TYPE_DOUBLE; | |||
471 | case 'c': | |||
472 | return ARG_TYPE_INT; | |||
473 | case 's': | |||
474 | case 'p': | |||
475 | case 'n': | |||
476 | return ARG_TYPE_POINTER; | |||
477 | } | |||
478 | return ARG_TYPE_INVALID; | |||
479 | } | |||
480 | ||||
481 | static void | |||
482 | skip_argv (va_list *va, | |||
483 | ArgType type, | |||
484 | EelPrintfHandler *custom_handlers) | |||
485 | { | |||
486 | if (type < 0) | |||
487 | { | |||
488 | custom_handlers[-type - 1].skip (va); | |||
489 | return; | |||
490 | } | |||
491 | ||||
492 | switch (type) | |||
493 | { | |||
494 | default: | |||
495 | case ARG_TYPE_INVALID: | |||
496 | return; | |||
497 | ||||
498 | case ARG_TYPE_INT: | |||
499 | (void) va_arg (*va, int)__builtin_va_arg(*va, int); | |||
500 | break; | |||
501 | case ARG_TYPE_LONG: | |||
502 | (void) va_arg (*va, long int)__builtin_va_arg(*va, long int); | |||
503 | break; | |||
504 | case ARG_TYPE_LONG_LONG: | |||
505 | (void) va_arg (*va, long long int)__builtin_va_arg(*va, long long int); | |||
506 | break; | |||
507 | case ARG_TYPE_SIZE: | |||
508 | (void) va_arg (*va, gsize)__builtin_va_arg(*va, gsize); | |||
509 | break; | |||
510 | case ARG_TYPE_LONG_DOUBLE: | |||
511 | (void) va_arg (*va, long double)__builtin_va_arg(*va, long double); | |||
512 | break; | |||
513 | case ARG_TYPE_DOUBLE: | |||
514 | (void) va_arg (*va, double)__builtin_va_arg(*va, double); | |||
515 | break; | |||
516 | case ARG_TYPE_POINTER: | |||
517 | (void) va_arg (*va, void *)__builtin_va_arg(*va, void *); | |||
518 | break; | |||
519 | } | |||
520 | } | |||
521 | ||||
522 | static void | |||
523 | skip_to_arg (va_list *va, | |||
524 | ArgType *types, | |||
525 | EelPrintfHandler *custom_handlers, | |||
526 | int n) | |||
527 | { | |||
528 | int i; | |||
529 | for (i = 0; i < n; i++) | |||
530 | { | |||
531 | skip_argv (va, types[i], custom_handlers); | |||
532 | } | |||
533 | } | |||
534 | ||||
535 | char * | |||
536 | eel_strdup_vprintf_with_custom (EelPrintfHandler *custom, | |||
537 | const char *format, | |||
538 | va_list va_orig) | |||
539 | { | |||
540 | va_list va; | |||
541 | const char *p; | |||
542 | int num_args, i, j; | |||
543 | ArgType *args; | |||
544 | ConversionInfo *conversions; | |||
545 | GString *f, *str; | |||
546 | const char *flags, *width, *prec, *mod, *pos; | |||
547 | char *s; | |||
548 | ||||
549 | num_args = 0; | |||
550 | for (p = format; *p != 0; p++) | |||
551 | { | |||
552 | if (*p == '%') | |||
553 | { | |||
554 | p++; | |||
555 | if (*p != '%') | |||
556 | { | |||
557 | num_args++; | |||
558 | } | |||
559 | } | |||
560 | } | |||
561 | ||||
562 | args = g_new0 (ArgType, num_args * 3 + 1)((ArgType *) g_malloc0_n ((num_args * 3 + 1), sizeof (ArgType ))); | |||
563 | conversions = g_new0 (ConversionInfo, num_args)((ConversionInfo *) g_malloc0_n ((num_args), sizeof (ConversionInfo ))); | |||
564 | ||||
565 | /* i indexes conversions, j indexes args */ | |||
566 | i = 0; | |||
567 | j = 0; | |||
568 | p = format; | |||
569 | while (*p != 0) | |||
570 | { | |||
571 | if (*p != '%') | |||
572 | { | |||
573 | p++; | |||
574 | continue; | |||
575 | } | |||
576 | p++; | |||
577 | if (*p == '%') | |||
578 | { | |||
579 | p++; | |||
580 | continue; | |||
581 | } | |||
582 | ||||
583 | /* We got a real conversion: */ | |||
584 | f = g_string_new ("%"); | |||
585 | conversions[i].start = p - 1; | |||
| ||||
586 | ||||
587 | /* First comes the positional arg */ | |||
588 | ||||
589 | pos = p; | |||
590 | p = get_position (p, NULL((void*)0)); | |||
591 | ||||
592 | /* Then flags */ | |||
593 | flags = p; | |||
594 | while (is_flag (*p)) | |||
595 | { | |||
596 | p++; | |||
597 | } | |||
598 | g_string_append_len (f, flags, p - flags)g_string_append_len_inline (f, flags, p - flags); | |||
599 | ||||
600 | /* Field width */ | |||
601 | ||||
602 | if (*p == '*') | |||
603 | { | |||
604 | p++; | |||
605 | p = get_position (p, &j); | |||
606 | args[j] = ARG_TYPE_INT; | |||
607 | conversions[i].width_pos = j++; | |||
608 | conversions[i].width_format_index = f->len; | |||
609 | } | |||
610 | else | |||
611 | { | |||
612 | conversions[i].width_pos = -1; | |||
613 | conversions[i].width_format_index = -1; | |||
614 | width = p; | |||
615 | while (g_ascii_isdigit (*p)((g_ascii_table[(guchar) (*p)] & G_ASCII_DIGIT) != 0)) | |||
616 | { | |||
617 | p++; | |||
618 | } | |||
619 | g_string_append_len (f, width, p - width)g_string_append_len_inline (f, width, p - width); | |||
620 | } | |||
621 | ||||
622 | /* Precision */ | |||
623 | conversions[i].precision_pos = -1; | |||
624 | conversions[i].precision_format_index = -1; | |||
625 | if (*p == '.') | |||
626 | { | |||
627 | g_string_append_c (f, '.')g_string_append_c_inline (f, '.'); | |||
628 | p++; | |||
629 | ||||
630 | if (*p == '*') | |||
631 | { | |||
632 | p++; | |||
633 | p = get_position (p, &j); | |||
634 | args[j] = ARG_TYPE_INT; | |||
635 | conversions[i].precision_pos = j++; | |||
636 | conversions[i].precision_format_index = f->len; | |||
637 | } | |||
638 | else | |||
639 | { | |||
640 | prec = p; | |||
641 | while (g_ascii_isdigit (*p)((g_ascii_table[(guchar) (*p)] & G_ASCII_DIGIT) != 0) || *p == '-') | |||
642 | { | |||
643 | p++; | |||
644 | } | |||
645 | g_string_append_len (f, prec, p - prec)g_string_append_len_inline (f, prec, p - prec); | |||
646 | } | |||
647 | } | |||
648 | ||||
649 | /* length modifier */ | |||
650 | ||||
651 | mod = p; | |||
652 | ||||
653 | while (is_length_modifier (*p)) | |||
654 | { | |||
655 | p++; | |||
656 | } | |||
657 | ||||
658 | /* conversion specifier */ | |||
659 | if (*p != 0) | |||
660 | p++; | |||
661 | ||||
662 | g_string_append_len (f, mod, p - mod)g_string_append_len_inline (f, mod, p - mod); | |||
663 | ||||
664 | get_position (pos, &j); | |||
665 | args[j] = get_arg_type_from_format (custom, mod, p - mod); | |||
666 | conversions[i].arg_pos = j++; | |||
667 | conversions[i].format = f; | |||
668 | conversions[i].end = p; | |||
669 | ||||
670 | i++; | |||
671 | } | |||
672 | ||||
673 | g_assert (i == num_args)do { if (i == num_args) ; else g_assertion_message_expr ("Eel" , "eel-string.c", 673, ((const char*) (__func__)), "i == num_args" ); } while (0); | |||
674 | ||||
675 | str = g_string_new (""); | |||
676 | ||||
677 | p = format; | |||
678 | for (i = 0; i < num_args; i++) | |||
679 | { | |||
680 | ArgType type; | |||
681 | ||||
682 | g_string_append_len (str, p, conversions[i].start - p)g_string_append_len_inline (str, p, conversions[i].start - p); | |||
683 | p = conversions[i].end; | |||
684 | ||||
685 | if (conversions[i].precision_pos != -1) | |||
686 | { | |||
687 | char *val; | |||
688 | ||||
689 | va_copy (va, va_orig)__builtin_va_copy(va, va_orig); | |||
690 | skip_to_arg (&va, args, custom, conversions[i].precision_pos); | |||
691 | val = g_strdup_vprintf ("%d", va); | |||
692 | va_end (va)__builtin_va_end(va); | |||
693 | ||||
694 | g_string_insert (conversions[i].format, | |||
695 | conversions[i].precision_format_index, | |||
696 | val); | |||
697 | ||||
698 | g_free (val); | |||
699 | } | |||
700 | ||||
701 | if (conversions[i].width_pos != -1) | |||
702 | { | |||
703 | char *val; | |||
704 | ||||
705 | va_copy (va, va_orig)__builtin_va_copy(va, va_orig); | |||
706 | skip_to_arg (&va, args, custom, conversions[i].width_pos); | |||
707 | val = g_strdup_vprintf ("%d", va); | |||
708 | va_end (va)__builtin_va_end(va); | |||
709 | ||||
710 | g_string_insert (conversions[i].format, | |||
711 | conversions[i].width_format_index, | |||
712 | val); | |||
713 | ||||
714 | g_free (val); | |||
715 | } | |||
716 | ||||
717 | va_copy (va, va_orig)__builtin_va_copy(va, va_orig); | |||
718 | skip_to_arg (&va, args, custom, conversions[i].arg_pos); | |||
719 | type = args[conversions[i].arg_pos]; | |||
720 | if (type < 0) | |||
721 | { | |||
722 | s = custom[-type - 1].to_string (conversions[i].format->str, va); | |||
723 | g_string_append (str, s)(__builtin_constant_p (s) ? __extension__ ({ const char * const __val = (s); g_string_append_len_inline (str, __val, (__val != ((void*)0)) ? (gssize) strlen (((__val) + !(__val))) : (gssize ) -1); }) : g_string_append_len_inline (str, s, (gssize) -1)); | |||
724 | g_free (s); | |||
725 | } | |||
726 | else | |||
727 | { | |||
728 | g_string_append_vprintf (str, conversions[i].format->str, va); | |||
729 | } | |||
730 | va_end (va)__builtin_va_end(va); | |||
731 | ||||
732 | g_string_free (conversions[i].format, TRUE)(__builtin_constant_p ((!(0))) ? (((!(0))) ? (g_string_free) ( (conversions[i].format), ((!(0)))) : g_string_free_and_steal ( conversions[i].format)) : (g_string_free) ((conversions[i].format ), ((!(0))))); | |||
733 | } | |||
734 | g_string_append (str, p)(__builtin_constant_p (p) ? __extension__ ({ const char * const __val = (p); g_string_append_len_inline (str, __val, (__val != ((void*)0)) ? (gssize) strlen (((__val) + !(__val))) : (gssize ) -1); }) : g_string_append_len_inline (str, p, (gssize) -1)); | |||
735 | ||||
736 | g_free (args); | |||
737 | g_free (conversions); | |||
738 | ||||
739 | return g_string_free (str, FALSE)(__builtin_constant_p ((0)) ? (((0)) ? (g_string_free) ((str) , ((0))) : g_string_free_and_steal (str)) : (g_string_free) ( (str), ((0)))); | |||
740 | } | |||
741 | ||||
742 | char * | |||
743 | eel_strdup_printf_with_custom (EelPrintfHandler *handlers, | |||
744 | const char *format, | |||
745 | ...) | |||
746 | { | |||
747 | va_list va; | |||
748 | char *res; | |||
749 | ||||
750 | va_start (va, format)__builtin_va_start(va, format); | |||
751 | res = eel_strdup_vprintf_with_custom (handlers, format, va); | |||
752 | va_end (va)__builtin_va_end(va); | |||
753 | ||||
754 | return res; | |||
755 | } | |||
756 | ||||
757 | #if !defined (EEL_OMIT_SELF_CHECK) | |||
758 | ||||
759 | static void | |||
760 | verify_printf (const char *format, ...) | |||
761 | { | |||
762 | va_list va; | |||
763 | char *orig, *new; | |||
764 | ||||
765 | va_start (va, format)__builtin_va_start(va, format); | |||
766 | orig = g_strdup_vprintf (format, va); | |||
767 | va_end (va)__builtin_va_end(va); | |||
768 | ||||
769 | va_start (va, format)__builtin_va_start(va, format); | |||
770 | new = eel_strdup_vprintf_with_custom (NULL((void*)0), format, va); | |||
771 | va_end (va)__builtin_va_end(va); | |||
772 | ||||
773 | EEL_CHECK_STRING_RESULT (new, orig)do { eel_before_check ("new", "eel-string.c", 773); eel_check_string_result (new, orig); } while (0); | |||
774 | ||||
775 | g_free (orig); | |||
776 | } | |||
777 | ||||
778 | static char * | |||
779 | custom1_to_string (char *format G_GNUC_UNUSED__attribute__ ((__unused__)), | |||
780 | va_list va) | |||
781 | { | |||
782 | int i; | |||
783 | ||||
784 | i = va_arg (va, int)__builtin_va_arg(va, int); | |||
785 | ||||
786 | return g_strdup_printf ("c1-%d-", i); | |||
787 | } | |||
788 | ||||
789 | static void | |||
790 | custom1_skip (va_list *va) | |||
791 | { | |||
792 | (void) va_arg (*va, int)__builtin_va_arg(*va, int); | |||
793 | } | |||
794 | ||||
795 | static char * | |||
796 | custom2_to_string (char *format G_GNUC_UNUSED__attribute__ ((__unused__)), | |||
797 | va_list va) | |||
798 | { | |||
799 | char *s; | |||
800 | ||||
801 | s = va_arg (va, char *)__builtin_va_arg(va, char *); | |||
802 | ||||
803 | return g_strdup_printf ("c2-%s-", s); | |||
804 | } | |||
805 | ||||
806 | static void | |||
807 | custom2_skip (va_list *va) | |||
808 | { | |||
809 | (void) va_arg (*va, char *)__builtin_va_arg(*va, char *); | |||
810 | } | |||
811 | ||||
812 | static EelPrintfHandler handlers[] = | |||
813 | { | |||
814 | { 'N', custom1_to_string, custom1_skip }, | |||
815 | { 'Y', custom2_to_string, custom2_skip }, | |||
816 | { 0 } | |||
817 | }; | |||
818 | ||||
819 | static void | |||
820 | verify_custom (const char *orig, const char *format, ...) | |||
821 | { | |||
822 | char *new; | |||
823 | va_list va; | |||
824 | ||||
825 | va_start (va, format)__builtin_va_start(va, format); | |||
826 | new = eel_strdup_vprintf_with_custom (handlers, format, va); | |||
| ||||
827 | va_end (va)__builtin_va_end(va); | |||
828 | ||||
829 | EEL_CHECK_STRING_RESULT (new, orig)do { eel_before_check ("new", "eel-string.c", 829); eel_check_string_result (new, orig); } while (0); | |||
830 | } | |||
831 | ||||
832 | void | |||
833 | eel_self_check_string (void) | |||
834 | { | |||
835 | EEL_CHECK_INTEGER_RESULT (eel_strlen (NULL), 0)do { eel_before_check ("eel_strlen (((void*)0))", "eel-string.c" , 835); eel_check_integer_result (eel_strlen (((void*)0)), 0) ; } while (0); | |||
836 | EEL_CHECK_INTEGER_RESULT (eel_strlen (""), 0)do { eel_before_check ("eel_strlen (\"\")", "eel-string.c", 836 ); eel_check_integer_result (eel_strlen (""), 0); } while (0); | |||
837 | EEL_CHECK_INTEGER_RESULT (eel_strlen ("abc"), 3)do { eel_before_check ("eel_strlen (\"abc\")", "eel-string.c" , 837); eel_check_integer_result (eel_strlen ("abc"), 3); } while (0); | |||
838 | ||||
839 | EEL_CHECK_INTEGER_RESULT (eel_strcmp (NULL, NULL), 0)do { eel_before_check ("eel_strcmp (((void*)0), ((void*)0))", "eel-string.c", 839); eel_check_integer_result (eel_strcmp ( ((void*)0), ((void*)0)), 0); } while (0); | |||
840 | EEL_CHECK_INTEGER_RESULT (eel_strcmp (NULL, ""), 0)do { eel_before_check ("eel_strcmp (((void*)0), \"\")", "eel-string.c" , 840); eel_check_integer_result (eel_strcmp (((void*)0), "") , 0); } while (0); | |||
841 | EEL_CHECK_INTEGER_RESULT (eel_strcmp ("", NULL), 0)do { eel_before_check ("eel_strcmp (\"\", ((void*)0))", "eel-string.c" , 841); eel_check_integer_result (eel_strcmp ("", ((void*)0)) , 0); } while (0); | |||
842 | EEL_CHECK_INTEGER_RESULT (eel_strcmp ("a", "a"), 0)do { eel_before_check ("eel_strcmp (\"a\", \"a\")", "eel-string.c" , 842); eel_check_integer_result (eel_strcmp ("a", "a"), 0); } while (0); | |||
843 | EEL_CHECK_INTEGER_RESULT (eel_strcmp ("aaab", "aaab"), 0)do { eel_before_check ("eel_strcmp (\"aaab\", \"aaab\")", "eel-string.c" , 843); eel_check_integer_result (eel_strcmp ("aaab", "aaab") , 0); } while (0); | |||
844 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp (NULL, "a") < 0, TRUE)do { eel_before_check ("eel_strcmp (((void*)0), \"a\") < 0" , "eel-string.c", 844); eel_check_boolean_result (eel_strcmp ( ((void*)0), "a") < 0, (!(0))); } while (0); | |||
845 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("a", NULL) > 0, TRUE)do { eel_before_check ("eel_strcmp (\"a\", ((void*)0)) > 0" , "eel-string.c", 845); eel_check_boolean_result (eel_strcmp ( "a", ((void*)0)) > 0, (!(0))); } while (0); | |||
846 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("", "a") < 0, TRUE)do { eel_before_check ("eel_strcmp (\"\", \"a\") < 0", "eel-string.c" , 846); eel_check_boolean_result (eel_strcmp ("", "a") < 0 , (!(0))); } while (0); | |||
847 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("a", "") > 0, TRUE)do { eel_before_check ("eel_strcmp (\"a\", \"\") > 0", "eel-string.c" , 847); eel_check_boolean_result (eel_strcmp ("a", "") > 0 , (!(0))); } while (0); | |||
848 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("a", "b") < 0, TRUE)do { eel_before_check ("eel_strcmp (\"a\", \"b\") < 0", "eel-string.c" , 848); eel_check_boolean_result (eel_strcmp ("a", "b") < 0 , (!(0))); } while (0); | |||
849 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("a", "ab") < 0, TRUE)do { eel_before_check ("eel_strcmp (\"a\", \"ab\") < 0", "eel-string.c" , 849); eel_check_boolean_result (eel_strcmp ("a", "ab") < 0, (!(0))); } while (0); | |||
850 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("ab", "a") > 0, TRUE)do { eel_before_check ("eel_strcmp (\"ab\", \"a\") > 0", "eel-string.c" , 850); eel_check_boolean_result (eel_strcmp ("ab", "a") > 0, (!(0))); } while (0); | |||
851 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("aaa", "aaab") < 0, TRUE)do { eel_before_check ("eel_strcmp (\"aaa\", \"aaab\") < 0" , "eel-string.c", 851); eel_check_boolean_result (eel_strcmp ( "aaa", "aaab") < 0, (!(0))); } while (0); | |||
852 | EEL_CHECK_BOOLEAN_RESULT (eel_strcmp ("aaab", "aaa") > 0, TRUE)do { eel_before_check ("eel_strcmp (\"aaab\", \"aaa\") > 0" , "eel-string.c", 852); eel_check_boolean_result (eel_strcmp ( "aaab", "aaa") > 0, (!(0))); } while (0); | |||
853 | ||||
854 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix (NULL, NULL), TRUE)do { eel_before_check ("eel_str_has_prefix (((void*)0), ((void*)0))" , "eel-string.c", 854); eel_check_boolean_result (eel_str_has_prefix (((void*)0), ((void*)0)), (!(0))); } while (0); | |||
855 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix (NULL, ""), TRUE)do { eel_before_check ("eel_str_has_prefix (((void*)0), \"\")" , "eel-string.c", 855); eel_check_boolean_result (eel_str_has_prefix (((void*)0), ""), (!(0))); } while (0); | |||
856 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("", NULL), TRUE)do { eel_before_check ("eel_str_has_prefix (\"\", ((void*)0))" , "eel-string.c", 856); eel_check_boolean_result (eel_str_has_prefix ("", ((void*)0)), (!(0))); } while (0); | |||
857 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("a", "a"), TRUE)do { eel_before_check ("eel_str_has_prefix (\"a\", \"a\")", "eel-string.c" , 857); eel_check_boolean_result (eel_str_has_prefix ("a", "a" ), (!(0))); } while (0); | |||
858 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("aaab", "aaab"), TRUE)do { eel_before_check ("eel_str_has_prefix (\"aaab\", \"aaab\")" , "eel-string.c", 858); eel_check_boolean_result (eel_str_has_prefix ("aaab", "aaab"), (!(0))); } while (0); | |||
859 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix (NULL, "a"), FALSE)do { eel_before_check ("eel_str_has_prefix (((void*)0), \"a\")" , "eel-string.c", 859); eel_check_boolean_result (eel_str_has_prefix (((void*)0), "a"), (0)); } while (0); | |||
860 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("a", NULL), TRUE)do { eel_before_check ("eel_str_has_prefix (\"a\", ((void*)0))" , "eel-string.c", 860); eel_check_boolean_result (eel_str_has_prefix ("a", ((void*)0)), (!(0))); } while (0); | |||
861 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("", "a"), FALSE)do { eel_before_check ("eel_str_has_prefix (\"\", \"a\")", "eel-string.c" , 861); eel_check_boolean_result (eel_str_has_prefix ("", "a" ), (0)); } while (0); | |||
862 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("a", ""), TRUE)do { eel_before_check ("eel_str_has_prefix (\"a\", \"\")", "eel-string.c" , 862); eel_check_boolean_result (eel_str_has_prefix ("a", "" ), (!(0))); } while (0); | |||
863 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("a", "b"), FALSE)do { eel_before_check ("eel_str_has_prefix (\"a\", \"b\")", "eel-string.c" , 863); eel_check_boolean_result (eel_str_has_prefix ("a", "b" ), (0)); } while (0); | |||
864 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("a", "ab"), FALSE)do { eel_before_check ("eel_str_has_prefix (\"a\", \"ab\")", "eel-string.c" , 864); eel_check_boolean_result (eel_str_has_prefix ("a", "ab" ), (0)); } while (0); | |||
865 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("ab", "a"), TRUE)do { eel_before_check ("eel_str_has_prefix (\"ab\", \"a\")", "eel-string.c" , 865); eel_check_boolean_result (eel_str_has_prefix ("ab", "a" ), (!(0))); } while (0); | |||
866 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("aaa", "aaab"), FALSE)do { eel_before_check ("eel_str_has_prefix (\"aaa\", \"aaab\")" , "eel-string.c", 866); eel_check_boolean_result (eel_str_has_prefix ("aaa", "aaab"), (0)); } while (0); | |||
867 | EEL_CHECK_BOOLEAN_RESULT (eel_str_has_prefix ("aaab", "aaa"), TRUE)do { eel_before_check ("eel_str_has_prefix (\"aaab\", \"aaa\")" , "eel-string.c", 867); eel_check_boolean_result (eel_str_has_prefix ("aaab", "aaa"), (!(0))); } while (0); | |||
868 | ||||
869 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix (NULL, NULL), NULL)do { eel_before_check ("eel_str_get_prefix (((void*)0), ((void*)0))" , "eel-string.c", 869); eel_check_string_result (eel_str_get_prefix (((void*)0), ((void*)0)), ((void*)0)); } while (0); | |||
870 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix (NULL, "foo"), NULL)do { eel_before_check ("eel_str_get_prefix (((void*)0), \"foo\")" , "eel-string.c", 870); eel_check_string_result (eel_str_get_prefix (((void*)0), "foo"), ((void*)0)); } while (0); | |||
871 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("foo", NULL), "foo")do { eel_before_check ("eel_str_get_prefix (\"foo\", ((void*)0))" , "eel-string.c", 871); eel_check_string_result (eel_str_get_prefix ("foo", ((void*)0)), "foo"); } while (0); | |||
872 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("", ""), "")do { eel_before_check ("eel_str_get_prefix (\"\", \"\")", "eel-string.c" , 872); eel_check_string_result (eel_str_get_prefix ("", ""), ""); } while (0); | |||
873 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("", "foo"), "")do { eel_before_check ("eel_str_get_prefix (\"\", \"foo\")", "eel-string.c" , 873); eel_check_string_result (eel_str_get_prefix ("", "foo" ), ""); } while (0); | |||
874 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("foo", ""), "")do { eel_before_check ("eel_str_get_prefix (\"foo\", \"\")", "eel-string.c" , 874); eel_check_string_result (eel_str_get_prefix ("foo", "" ), ""); } while (0); | |||
875 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("foo", "foo"), "")do { eel_before_check ("eel_str_get_prefix (\"foo\", \"foo\")" , "eel-string.c", 875); eel_check_string_result (eel_str_get_prefix ("foo", "foo"), ""); } while (0); | |||
876 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("foo:", ":"), "foo")do { eel_before_check ("eel_str_get_prefix (\"foo:\", \":\")" , "eel-string.c", 876); eel_check_string_result (eel_str_get_prefix ("foo:", ":"), "foo"); } while (0); | |||
877 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("foo:bar", ":"), "foo")do { eel_before_check ("eel_str_get_prefix (\"foo:bar\", \":\")" , "eel-string.c", 877); eel_check_string_result (eel_str_get_prefix ("foo:bar", ":"), "foo"); } while (0); | |||
878 | EEL_CHECK_STRING_RESULT (eel_str_get_prefix ("footle:bar", "tle:"), "foo")do { eel_before_check ("eel_str_get_prefix (\"footle:bar\", \"tle:\")" , "eel-string.c", 878); eel_check_string_result (eel_str_get_prefix ("footle:bar", "tle:"), "foo"); } while (0); | |||
879 | ||||
880 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores (NULL), NULL)do { eel_before_check ("eel_str_double_underscores (((void*)0))" , "eel-string.c", 880); eel_check_string_result (eel_str_double_underscores (((void*)0)), ((void*)0)); } while (0); | |||
881 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores (""), "")do { eel_before_check ("eel_str_double_underscores (\"\")", "eel-string.c" , 881); eel_check_string_result (eel_str_double_underscores ( ""), ""); } while (0); | |||
882 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores ("_"), "__")do { eel_before_check ("eel_str_double_underscores (\"_\")", "eel-string.c" , 882); eel_check_string_result (eel_str_double_underscores ( "_"), "__"); } while (0); | |||
883 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores ("foo"), "foo")do { eel_before_check ("eel_str_double_underscores (\"foo\")" , "eel-string.c", 883); eel_check_string_result (eel_str_double_underscores ("foo"), "foo"); } while (0); | |||
884 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores ("foo_bar"), "foo__bar")do { eel_before_check ("eel_str_double_underscores (\"foo_bar\")" , "eel-string.c", 884); eel_check_string_result (eel_str_double_underscores ("foo_bar"), "foo__bar"); } while (0); | |||
885 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores ("foo_bar_2"), "foo__bar__2")do { eel_before_check ("eel_str_double_underscores (\"foo_bar_2\")" , "eel-string.c", 885); eel_check_string_result (eel_str_double_underscores ("foo_bar_2"), "foo__bar__2"); } while (0); | |||
886 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores ("_foo"), "__foo")do { eel_before_check ("eel_str_double_underscores (\"_foo\")" , "eel-string.c", 886); eel_check_string_result (eel_str_double_underscores ("_foo"), "__foo"); } while (0); | |||
887 | EEL_CHECK_STRING_RESULT (eel_str_double_underscores ("foo_"), "foo__")do { eel_before_check ("eel_str_double_underscores (\"foo_\")" , "eel-string.c", 887); eel_check_string_result (eel_str_double_underscores ("foo_"), "foo__"); } while (0); | |||
888 | ||||
889 | EEL_CHECK_STRING_RESULT (eel_str_capitalize (NULL), NULL)do { eel_before_check ("eel_str_capitalize (((void*)0))", "eel-string.c" , 889); eel_check_string_result (eel_str_capitalize (((void*) 0)), ((void*)0)); } while (0); | |||
890 | EEL_CHECK_STRING_RESULT (eel_str_capitalize (""), "")do { eel_before_check ("eel_str_capitalize (\"\")", "eel-string.c" , 890); eel_check_string_result (eel_str_capitalize (""), "") ; } while (0); | |||
891 | EEL_CHECK_STRING_RESULT (eel_str_capitalize ("foo"), "Foo")do { eel_before_check ("eel_str_capitalize (\"foo\")", "eel-string.c" , 891); eel_check_string_result (eel_str_capitalize ("foo"), "Foo" ); } while (0); | |||
892 | EEL_CHECK_STRING_RESULT (eel_str_capitalize ("Foo"), "Foo")do { eel_before_check ("eel_str_capitalize (\"Foo\")", "eel-string.c" , 892); eel_check_string_result (eel_str_capitalize ("Foo"), "Foo" ); } while (0); | |||
893 | ||||
894 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("foo", 0), "foo")do { eel_before_check ("eel_str_middle_truncate (\"foo\", 0)" , "eel-string.c", 894); eel_check_string_result (eel_str_middle_truncate ("foo", 0), "foo"); } while (0); | |||
895 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("foo", 1), "foo")do { eel_before_check ("eel_str_middle_truncate (\"foo\", 1)" , "eel-string.c", 895); eel_check_string_result (eel_str_middle_truncate ("foo", 1), "foo"); } while (0); | |||
896 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("foo", 3), "foo")do { eel_before_check ("eel_str_middle_truncate (\"foo\", 3)" , "eel-string.c", 896); eel_check_string_result (eel_str_middle_truncate ("foo", 3), "foo"); } while (0); | |||
897 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("foo", 4), "foo")do { eel_before_check ("eel_str_middle_truncate (\"foo\", 4)" , "eel-string.c", 897); eel_check_string_result (eel_str_middle_truncate ("foo", 4), "foo"); } while (0); | |||
898 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("foo", 5), "foo")do { eel_before_check ("eel_str_middle_truncate (\"foo\", 5)" , "eel-string.c", 898); eel_check_string_result (eel_str_middle_truncate ("foo", 5), "foo"); } while (0); | |||
899 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("foo", 6), "foo")do { eel_before_check ("eel_str_middle_truncate (\"foo\", 6)" , "eel-string.c", 899); eel_check_string_result (eel_str_middle_truncate ("foo", 6), "foo"); } while (0); | |||
900 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("foo", 7), "foo")do { eel_before_check ("eel_str_middle_truncate (\"foo\", 7)" , "eel-string.c", 900); eel_check_string_result (eel_str_middle_truncate ("foo", 7), "foo"); } while (0); | |||
901 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 0), "a_much_longer_foo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 0)" , "eel-string.c", 901); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 0), "a_much_longer_foo"); } while (0); | |||
902 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 1), "a_much_longer_foo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 1)" , "eel-string.c", 902); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 1), "a_much_longer_foo"); } while (0); | |||
903 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 2), "a_much_longer_foo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 2)" , "eel-string.c", 903); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 2), "a_much_longer_foo"); } while (0); | |||
904 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 3), "a_much_longer_foo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 3)" , "eel-string.c", 904); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 3), "a_much_longer_foo"); } while (0); | |||
905 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 4), "a_much_longer_foo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 4)" , "eel-string.c", 905); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 4), "a_much_longer_foo"); } while (0); | |||
906 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 5), "a...o")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 5)" , "eel-string.c", 906); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 5), "a...o"); } while (0); | |||
907 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 6), "a...oo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 6)" , "eel-string.c", 907); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 6), "a...oo"); } while (0); | |||
908 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 7), "a_...oo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 7)" , "eel-string.c", 908); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 7), "a_...oo"); } while (0); | |||
909 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 8), "a_...foo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 8)" , "eel-string.c", 909); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 8), "a_...foo"); } while (0); | |||
910 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("a_much_longer_foo", 9), "a_m...foo")do { eel_before_check ("eel_str_middle_truncate (\"a_much_longer_foo\", 9)" , "eel-string.c", 910); eel_check_string_result (eel_str_middle_truncate ("a_much_longer_foo", 9), "a_m...foo"); } while (0); | |||
911 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_even", 8), "so...ven")do { eel_before_check ("eel_str_middle_truncate (\"something_even\", 8)" , "eel-string.c", 911); eel_check_string_result (eel_str_middle_truncate ("something_even", 8), "so...ven"); } while (0); | |||
912 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_odd", 8), "so...odd")do { eel_before_check ("eel_str_middle_truncate (\"something_odd\", 8)" , "eel-string.c", 912); eel_check_string_result (eel_str_middle_truncate ("something_odd", 8), "so...odd"); } while (0); | |||
913 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_even", 9), "som...ven")do { eel_before_check ("eel_str_middle_truncate (\"something_even\", 9)" , "eel-string.c", 913); eel_check_string_result (eel_str_middle_truncate ("something_even", 9), "som...ven"); } while (0); | |||
914 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_odd", 9), "som...odd")do { eel_before_check ("eel_str_middle_truncate (\"something_odd\", 9)" , "eel-string.c", 914); eel_check_string_result (eel_str_middle_truncate ("something_odd", 9), "som...odd"); } while (0); | |||
915 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_even", 10), "som...even")do { eel_before_check ("eel_str_middle_truncate (\"something_even\", 10)" , "eel-string.c", 915); eel_check_string_result (eel_str_middle_truncate ("something_even", 10), "som...even"); } while (0); | |||
916 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_odd", 10), "som..._odd")do { eel_before_check ("eel_str_middle_truncate (\"something_odd\", 10)" , "eel-string.c", 916); eel_check_string_result (eel_str_middle_truncate ("something_odd", 10), "som..._odd"); } while (0); | |||
917 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_even", 11), "some...even")do { eel_before_check ("eel_str_middle_truncate (\"something_even\", 11)" , "eel-string.c", 917); eel_check_string_result (eel_str_middle_truncate ("something_even", 11), "some...even"); } while (0); | |||
918 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_odd", 11), "some..._odd")do { eel_before_check ("eel_str_middle_truncate (\"something_odd\", 11)" , "eel-string.c", 918); eel_check_string_result (eel_str_middle_truncate ("something_odd", 11), "some..._odd"); } while (0); | |||
919 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_even", 12), "some..._even")do { eel_before_check ("eel_str_middle_truncate (\"something_even\", 12)" , "eel-string.c", 919); eel_check_string_result (eel_str_middle_truncate ("something_even", 12), "some..._even"); } while (0); | |||
920 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_odd", 12), "some...g_odd")do { eel_before_check ("eel_str_middle_truncate (\"something_odd\", 12)" , "eel-string.c", 920); eel_check_string_result (eel_str_middle_truncate ("something_odd", 12), "some...g_odd"); } while (0); | |||
921 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_even", 13), "somet..._even")do { eel_before_check ("eel_str_middle_truncate (\"something_even\", 13)" , "eel-string.c", 921); eel_check_string_result (eel_str_middle_truncate ("something_even", 13), "somet..._even"); } while (0); | |||
922 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_odd", 13), "something_odd")do { eel_before_check ("eel_str_middle_truncate (\"something_odd\", 13)" , "eel-string.c", 922); eel_check_string_result (eel_str_middle_truncate ("something_odd", 13), "something_odd"); } while (0); | |||
923 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_even", 14), "something_even")do { eel_before_check ("eel_str_middle_truncate (\"something_even\", 14)" , "eel-string.c", 923); eel_check_string_result (eel_str_middle_truncate ("something_even", 14), "something_even"); } while (0); | |||
924 | EEL_CHECK_STRING_RESULT (eel_str_middle_truncate ("something_odd", 13), "something_odd")do { eel_before_check ("eel_str_middle_truncate (\"something_odd\", 13)" , "eel-string.c", 924); eel_check_string_result (eel_str_middle_truncate ("something_odd", 13), "something_odd"); } while (0); | |||
925 | ||||
926 | EEL_CHECK_STRING_RESULT (eel_str_strip_substring_and_after (NULL, "bar"), NULL)do { eel_before_check ("eel_str_strip_substring_and_after (((void*)0), \"bar\")" , "eel-string.c", 926); eel_check_string_result (eel_str_strip_substring_and_after (((void*)0), "bar"), ((void*)0)); } while (0); | |||
927 | EEL_CHECK_STRING_RESULT (eel_str_strip_substring_and_after ("", "bar"), "")do { eel_before_check ("eel_str_strip_substring_and_after (\"\", \"bar\")" , "eel-string.c", 927); eel_check_string_result (eel_str_strip_substring_and_after ("", "bar"), ""); } while (0); | |||
928 | EEL_CHECK_STRING_RESULT (eel_str_strip_substring_and_after ("foo", "bar"), "foo")do { eel_before_check ("eel_str_strip_substring_and_after (\"foo\", \"bar\")" , "eel-string.c", 928); eel_check_string_result (eel_str_strip_substring_and_after ("foo", "bar"), "foo"); } while (0); | |||
929 | EEL_CHECK_STRING_RESULT (eel_str_strip_substring_and_after ("foo bar", "bar"), "foo ")do { eel_before_check ("eel_str_strip_substring_and_after (\"foo bar\", \"bar\")" , "eel-string.c", 929); eel_check_string_result (eel_str_strip_substring_and_after ("foo bar", "bar"), "foo "); } while (0); | |||
930 | EEL_CHECK_STRING_RESULT (eel_str_strip_substring_and_after ("foo bar xxx", "bar"), "foo ")do { eel_before_check ("eel_str_strip_substring_and_after (\"foo bar xxx\", \"bar\")" , "eel-string.c", 930); eel_check_string_result (eel_str_strip_substring_and_after ("foo bar xxx", "bar"), "foo "); } while (0); | |||
931 | EEL_CHECK_STRING_RESULT (eel_str_strip_substring_and_after ("bar", "bar"), "")do { eel_before_check ("eel_str_strip_substring_and_after (\"bar\", \"bar\")" , "eel-string.c", 931); eel_check_string_result (eel_str_strip_substring_and_after ("bar", "bar"), ""); } while (0); | |||
932 | ||||
933 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring (NULL, "foo", NULL), NULL)do { eel_before_check ("eel_str_replace_substring (((void*)0), \"foo\", ((void*)0))" , "eel-string.c", 933); eel_check_string_result (eel_str_replace_substring (((void*)0), "foo", ((void*)0)), ((void*)0)); } while (0); | |||
934 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring (NULL, "foo", "bar"), NULL)do { eel_before_check ("eel_str_replace_substring (((void*)0), \"foo\", \"bar\")" , "eel-string.c", 934); eel_check_string_result (eel_str_replace_substring (((void*)0), "foo", "bar"), ((void*)0)); } while (0); | |||
935 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("bar", "foo", NULL), "bar")do { eel_before_check ("eel_str_replace_substring (\"bar\", \"foo\", ((void*)0))" , "eel-string.c", 935); eel_check_string_result (eel_str_replace_substring ("bar", "foo", ((void*)0)), "bar"); } while (0); | |||
936 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("", "foo", ""), "")do { eel_before_check ("eel_str_replace_substring (\"\", \"foo\", \"\")" , "eel-string.c", 936); eel_check_string_result (eel_str_replace_substring ("", "foo", ""), ""); } while (0); | |||
937 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("", "foo", "bar"), "")do { eel_before_check ("eel_str_replace_substring (\"\", \"foo\", \"bar\")" , "eel-string.c", 937); eel_check_string_result (eel_str_replace_substring ("", "foo", "bar"), ""); } while (0); | |||
938 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("bar", "foo", ""), "bar")do { eel_before_check ("eel_str_replace_substring (\"bar\", \"foo\", \"\")" , "eel-string.c", 938); eel_check_string_result (eel_str_replace_substring ("bar", "foo", ""), "bar"); } while (0); | |||
939 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("xxx", "x", "foo"), "foofoofoo")do { eel_before_check ("eel_str_replace_substring (\"xxx\", \"x\", \"foo\")" , "eel-string.c", 939); eel_check_string_result (eel_str_replace_substring ("xxx", "x", "foo"), "foofoofoo"); } while (0); | |||
940 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("fff", "f", "foo"), "foofoofoo")do { eel_before_check ("eel_str_replace_substring (\"fff\", \"f\", \"foo\")" , "eel-string.c", 940); eel_check_string_result (eel_str_replace_substring ("fff", "f", "foo"), "foofoofoo"); } while (0); | |||
941 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("foofoofoo", "foo", "f"), "fff")do { eel_before_check ("eel_str_replace_substring (\"foofoofoo\", \"foo\", \"f\")" , "eel-string.c", 941); eel_check_string_result (eel_str_replace_substring ("foofoofoo", "foo", "f"), "fff"); } while (0); | |||
942 | EEL_CHECK_STRING_RESULT (eel_str_replace_substring ("foofoofoo", "f", ""), "oooooo")do { eel_before_check ("eel_str_replace_substring (\"foofoofoo\", \"f\", \"\")" , "eel-string.c", 942); eel_check_string_result (eel_str_replace_substring ("foofoofoo", "f", ""), "oooooo"); } while (0); | |||
943 | ||||
944 | verify_printf ("%.*s", 2, "foo"); | |||
945 | verify_printf ("%*.*s", 2, 4, "foo"); | |||
946 | verify_printf ("before %5$*1$.*2$s between %6$*3$.*4$d after", | |||
947 | 4, 5, 6, 7, "foo", G_PI3.1415926535897932384626433832795028841971693993751); | |||
948 | verify_custom ("c1-42- c2-foo-","%N %Y", 42 ,"foo"); | |||
949 | verify_custom ("c1-42- bar c2-foo-","%N %s %Y", 42, "bar" ,"foo"); | |||
950 | verify_custom ("c1-42- bar c2-foo-","%3$N %2$s %1$Y","foo", "bar", 42); | |||
951 | ||||
952 | } | |||
953 | ||||
954 | #endif /* !EEL_OMIT_SELF_CHECK */ |