10 #include <platon/str/strplus.h>
11 #include <platon/str/strdyn.h>
14 PLATON_FUNC(strdyn_free)(ar)
19 for (i = 0; ar[i] != NULL; i++)
26 PLATON_FUNC(strdyn_safe_free)(ar)
32 PLATON_FUNC(strdyn_free)(ar);
38 PLATON_FUNC(strdyn_get_size)(ar)
43 for (i = 0; ar[i] != NULL; i++)
50 PLATON_FUNC(strdyn_create)(void)
54 if ((ar = (char **) malloc(1 * sizeof(char *))) == NULL)
63 PLATON_FUNC(strdyn_create_va)(
69 if ((ar = PLATON_FUNC(strdyn_create)()) == NULL)
76 if ((ar = PLATON_FUNC(strdyn_add)(ar, s1)) == NULL)
81 while ((s = va_arg(ap, char *)) != NULL)
82 if ((ar = PLATON_FUNC(strdyn_add)(ar, s)) == NULL)
92 PLATON_FUNC(strdyn_create_ar)(ar)
96 register char **new_ar;
98 if ((new_ar = (char**) malloc((PLATON_FUNC(strdyn_get_size)(ar) + 1)
99 * sizeof(char*))) == NULL)
102 for (i = 0; ar[i] != NULL; i++)
103 new_ar[i] = strdup(ar[i]);
111 PLATON_FUNC(strdyn_safe_create_ar)(ar)
117 return PLATON_FUNC(strdyn_create_ar)(ar);
121 PLATON_FUNC(strdyn_add)(ar, s)
128 if ((ar = PLATON_FUNC(strdyn_create)()) == NULL)
131 count = PLATON_FUNC(strdyn_get_size)(ar);
133 if ((ar = (char **) realloc(ar, (count + 2) * sizeof(char *))) == NULL)
136 ar[count] = strdup(s);
137 ar[count + 1] = NULL;
143 PLATON_FUNC(strdyn_add_va)(
151 if ((ar = PLATON_FUNC(strdyn_create)()) == NULL)
156 while ((s = va_arg(ap, char *)) != NULL)
157 if ((ar = PLATON_FUNC(strdyn_add)(ar, s)) == NULL)
166 PLATON_FUNC(strdyn_add_ar)(ar, s_ar)
172 for (k = 0; s_ar[k] != NULL; k++)
173 if ((ar = PLATON_FUNC(strdyn_add)(ar, s_ar[k])) == NULL)
180 PLATON_FUNC(strdyn_remove_idx)(ar, idx)
186 for (i = 0; ar[i] != NULL; i++) {
194 if ((ar = (char**) realloc(ar, i * sizeof(char*))) == NULL)
201 PLATON_FUNC(strdyn_remove_str)(ar, s)
207 idx = PLATON_FUNC(strdyn_search)(ar, s);
212 return PLATON_FUNC(strdyn_remove_idx)(ar, idx);
216 PLATON_FUNC(strdyn_remove_str_all)(ar, s)
220 char **new_ar = NULL;
222 while (new_ar != ar) {
226 if ((new_ar = PLATON_FUNC(strdyn_remove_str)(ar, s)) == NULL)
234 PLATON_FUNC(strdyn_remove_empty)(ar)
239 for (i = 0; ar[i] != NULL; ) {
241 if (strlen(ar[i]) == 0) {
244 for (j = i; ar[j] != NULL; j++)
251 if ((ar = (char**) realloc(ar, (i + 1) * sizeof(char*))) == NULL)
258 PLATON_FUNC(strdyn_remove_all)(ar)
263 for (i = 0; ar[i] != NULL; i++)
266 if ((ar = (char**) realloc(ar, /* 1 * */ sizeof(char*))) == NULL)
275 PLATON_FUNC(strdyn_explode_chr)(str, sep)
281 sep_str[0] = (char) sep;
284 return PLATON_FUNC(strdyn_explode_str)(str, sep_str);
288 PLATON_FUNC(strdyn_explode2_chr)(str, sep)
293 return PLATON_FUNC(strdyn_remove_empty)(PLATON_FUNC(strdyn_explode_chr)(str, sep));
297 PLATON_FUNC(strdyn_explode_str)(str, sep)
303 register int ar_size, s_size, sep_size, i;
305 if (str == NULL || sep == NULL)
308 ar_size = PLATON_FUNC(strcnt_sepstr)(str, sep);
310 if ((ar = (char**) malloc((ar_size + 2) * sizeof(char*))) == NULL)
313 sep_size = strlen(sep);
315 for (s = str, i = 0; i < ar_size; i++, s += s_size + sep_size) {
317 s_size = strstr(s, sep) - s;
319 if ((ar[i] = (char*) malloc((s_size + 1) * sizeof(char))) == NULL) {
320 PLATON_FUNC(strdyn_free)(ar);
324 strncpy(ar[i], s, s_size);
325 ar[i][s_size] = '\0';
328 if ((ar[ar_size] = strdup(s)) == NULL) {
329 PLATON_FUNC(strdyn_free)(ar);
333 ar[ar_size + 1] = NULL;
340 PLATON_FUNC(strdyn_explode2_str)(str, sep)
344 return PLATON_FUNC(strdyn_remove_empty)(PLATON_FUNC(strdyn_explode_str)(str, sep));
348 PLATON_FUNC(strdyn_explode_ar)(str, sep)
352 /* WARNING: Unefective recursion used! */
353 /* TODO: Various code optimalizations. */
357 if ((ar1 = PLATON_FUNC(strdyn_explode_str)(str, sep[0])) == NULL)
360 if (sep[1] != NULL) {
364 if ((ar = PLATON_FUNC(strdyn_create)()) == NULL) {
365 PLATON_FUNC(strdyn_free)(ar1);
369 for (i = 0; i < strdyn_count(ar1); i++) {
370 if ((ar2 = PLATON_FUNC(strdyn_explode_ar)(ar1[i], sep + 1)) == NULL) {
371 PLATON_FUNC(strdyn_free)(ar1);
372 PLATON_FUNC(strdyn_free)(ar);
376 if ((ar = PLATON_FUNC(strdyn_add_ar)(ar, ar2)) == NULL) {
377 PLATON_FUNC(strdyn_free)(ar1);
378 PLATON_FUNC(strdyn_free)(ar);
379 PLATON_FUNC(strdyn_free)(ar2);
383 PLATON_FUNC(strdyn_free)(ar2);
386 PLATON_FUNC(strdyn_free)(ar1);
395 PLATON_FUNC(strdyn_explode2_ar)(str, sep)
399 return PLATON_FUNC(strdyn_remove_empty)(PLATON_FUNC(strdyn_explode_ar)(str, sep));
403 PLATON_FUNC(strdyn_implode_chr)(ar, sep)
409 sep_str[0] = (char) sep;
412 return PLATON_FUNC(strdyn_implode_str)(ar, sep_str);
416 PLATON_FUNC(strdyn_implode2_chr)(ar, sep)
420 register char **new_ar;
423 new_ar = PLATON_FUNC(strdyn_remove_empty)(strdyn_duplicate(ar));
425 s = PLATON_FUNC(strdyn_implode_chr)(new_ar, sep);
427 PLATON_FUNC(strdyn_free)(new_ar);
433 PLATON_FUNC(strdyn_implode_str)(ar, sep)
437 register int i, str_size, sep_size;
438 register char *str, *s;
440 sep_size = strlen(sep);
442 for (i = 0, str_size = 0; ar[i] != NULL; i++)
443 str_size += strlen(ar[i]) + sep_size;
445 str_size -= sep_size;
447 if ((str = (char*) malloc((str_size + 1) * sizeof(char))) == NULL)
450 for (i = 0, s = str; ar[i] != NULL; i++) {
454 if (ar[i + 1] != NULL)
463 PLATON_FUNC(strdyn_implode2_str)(ar, str)
467 register char **new_ar;
470 new_ar = PLATON_FUNC(strdyn_remove_empty)(strdyn_duplicate(ar));
472 s = PLATON_FUNC(strdyn_implode_str)(new_ar, str);
474 PLATON_FUNC(strdyn_free)(new_ar);
480 PLATON_FUNC(strdyn_conjunct)(ar1, ar2)
487 if ((ar = PLATON_FUNC(strdyn_create)()) == NULL)
490 for (i = 0; ar2[i] != NULL; i++) {
491 if (! PLATON_FUNC(strdyn_compare)(ar1, ar2[i])) {
492 if ((ar = PLATON_FUNC(strdyn_add)(ar, ar2[i])) == NULL)
501 PLATON_FUNC(strdyn_consolide)(ar1, ar2)
508 if ((ar = PLATON_FUNC(strdyn_create)()) == NULL)
511 for (i = 0; ar1[i] != NULL; i++) {
512 if (PLATON_FUNC(strdyn_compare)(ar, ar1[i])) {
513 if ((ar = PLATON_FUNC(strdyn_add)(ar, ar1[i])) == NULL)
518 for (i = 0; ar2[i] != NULL; i++) {
519 if (PLATON_FUNC(strdyn_compare)(ar, ar2[i])) {
520 if ((ar = PLATON_FUNC(strdyn_add)(ar, ar2[i])) == NULL)
529 PLATON_FUNC(strdyn_search)(ar, s)
535 for (i = 0; ar[i] != NULL; i++)
536 if (! strcmp(ar[i], s))
543 PLATON_FUNC(strdyn_casesearch)(ar, s)
549 for (i = 0; ar[i] != NULL; i++)
550 if (! strcasecmp(ar[i], s))
557 PLATON_FUNC(strdyn_compare)(ar, s)
561 return PLATON_FUNC(strdyn_search)(ar, s) < 0 ? -1 : 0;
565 PLATON_FUNC(strdyn_casecompare)(ar, s)
569 return PLATON_FUNC(strdyn_casesearch)(ar, s) < 0 ? -1 : 0;
573 PLATON_FUNC(strdyn_compare_all)(ar, s)
579 for (i = 0; ar[i] != NULL; i++)
580 if (strcmp(ar[i], s))
587 PLATON_FUNC(strdyn_str2)(s, ar, idx)
592 register char *ret, *tmp_s;
595 for (ret = NULL, i = 0; ar[i] != NULL; i++)
596 if ((tmp_s = strstr(s, ar[i])) != NULL
597 && (ret == NULL || tmp_s < ret)) {
607 #if defined(SELF) || defined(SELFTEST) || defined(SELF_STRDYN)
609 #define TESTSTR1 "___AAA_BBBB__C_DaDaD____"
611 #define TESTSEP2 "__"
618 char **ar1, **ar2, **ar_join, **ar_intersect;
621 ar2 = strdyn_create_va("A", "B", "C", "D", NULL);
624 while (ar2[i] != NULL) {
625 printf("ar2[%d] = \"%s\"\n", i, ar2[i]);
629 printf("strdyn_explode2_chr(\"%s\", '%c') = ar1\n", TESTSTR1, TESTSEP1);
630 ar1 = strdyn_explode2_chr(TESTSTR1, TESTSEP1);
632 puts("strdyn_free(ar1)");
635 printf("strdyn_explode_str(\"%s\", \"%s\") = ar1\n", TESTSTR1, TESTSEP2);
636 ar1 = strdyn_explode_str(TESTSTR1, TESTSEP2);
638 for (i = 0; ar1[i] != NULL; i++)
639 printf("ar1[%d] = \"%s\"\n", i, ar1[i]);
641 s = strdyn_implode2_chr(ar1, TESTSEP1);
642 printf("strdyn_implode2_chr(ar1, '%c') = \"%s\"\n", TESTSEP1, s);
647 s = strdyn_implode2_str(ar1, TESTSEP2);
648 printf("strdyn_implode2_str(ar1, \"%s\") = \"%s\"\n", TESTSEP2, s);
653 ar_join = strdyn_join(ar1, ar2);
654 ar_intersect = strdyn_intersect(ar1, ar2);
657 while (ar_join[i] != NULL) {
658 printf("ar_join[%d] = \"%s\"\n", i, ar_join[i]);
663 while (ar_intersect[i] != NULL) {
664 printf("ar_intersect[%d] = \"%s\"\n", i, ar_intersect[i]);
668 puts("strdyn_free(ar1)");
671 puts("strdyn_free(ar2)");
674 puts("strdyn_free(ar_join)");
675 strdyn_free(ar_join);
677 puts("strdyn_free(ar_intersect)");
678 strdyn_free(ar_intersect);