1.1 --- a/ucx/string.c Tue Oct 02 11:18:47 2012 +0200 1.2 +++ b/ucx/string.c Tue Oct 02 13:43:17 2012 +0200 1.3 @@ -86,6 +86,62 @@ 1.4 return new_sstr; 1.5 } 1.6 1.7 +sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) { 1.8 + if (d.length == 0) { 1.9 + return NULL; 1.10 + } 1.11 + 1.12 + sstr_t* result; 1.13 + size_t nmax = *n; 1.14 + *n = 1; 1.15 + 1.16 + /* special case: exact match - no processing needed */ 1.17 + if (s.length == d.length && strncmp(s.ptr, d.ptr, s.length) == 0) { 1.18 + result = malloc(sizeof(sstr_t)); 1.19 + result[0] = sstrn("", 0); 1.20 + return result; 1.21 + } 1.22 + sstr_t sv = sstrdup(s); 1.23 + 1.24 + for (int i = 0 ; i < s.length ; i++) { 1.25 + if (sv.ptr[i] == d.ptr[0]) { 1.26 + _Bool match = 1; 1.27 + for (int j = 1 ; j < d.length ; j++) { 1.28 + if (j+i < s.length) { 1.29 + match &= (sv.ptr[i+j] == d.ptr[j]); 1.30 + } else { 1.31 + match = 0; 1.32 + break; 1.33 + } 1.34 + } 1.35 + if (match) { 1.36 + (*n)++; 1.37 + for (int j = 0 ; j < d.length ; j++) { 1.38 + sv.ptr[i+j] = 0; 1.39 + } 1.40 + i += d.length; 1.41 + } 1.42 + } 1.43 + if ((*n) == nmax) break; 1.44 + } 1.45 + result = malloc(sizeof(sstr_t) * (*n)); 1.46 + 1.47 + char *pptr = sv.ptr; 1.48 + for (int i = 0 ; i < *n ; i++) { 1.49 + size_t l = strlen(pptr); 1.50 + char* ptr = malloc(l + 1); 1.51 + memcpy(ptr, pptr, l); 1.52 + ptr[l] = 0; 1.53 + 1.54 + result[i] = sstrn(ptr, l); 1.55 + pptr += l + d.length; 1.56 + } 1.57 + 1.58 + free(sv.ptr); 1.59 + 1.60 + return result; 1.61 +} 1.62 + 1.63 int sstrcmp(sstr_t s1, sstr_t s2) { 1.64 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length); 1.65 }