1.1 --- a/ucx/string.c Wed Jul 17 20:03:01 2013 +0200 1.2 +++ b/ucx/string.c Fri Jul 19 14:17:12 2013 +0200 1.3 @@ -73,7 +73,7 @@ 1.4 memcpy(ptr, c1.ptr, cplen); 1.5 len -= cplen; 1.6 ptr += cplen; 1.7 - for (size_t i = 0 ; i < n-1 ; i++) { 1.8 + for (size_t i = 1 ; i < n ; i++) { 1.9 sstr_t str = va_arg (ap, sstr_t); 1.10 cplen = str.length > len ? len : str.length; 1.11 if(cplen <= 0) { 1.12 @@ -120,7 +120,12 @@ 1.13 } 1.14 1.15 sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) { 1.16 - if (d.length == 0) { 1.17 + return sstrsplita(s, d, n, ucx_default_allocator()); 1.18 +} 1.19 + 1.20 +sstr_t* sstrsplita(sstr_t s, sstr_t d, size_t *n, UcxAllocator *allocator) { 1.21 + if (s.length == 0 || d.length == 0) { 1.22 + *n = -1; 1.23 return NULL; 1.24 } 1.25 1.26 @@ -129,11 +134,15 @@ 1.27 *n = 1; 1.28 1.29 /* special case: exact match - no processing needed */ 1.30 - if (s.length == d.length && strncmp(s.ptr, d.ptr, s.length) == 0) { 1.31 + if (sstrcmp(s, d) == 0) { 1.32 *n = 0; 1.33 return NULL; 1.34 } 1.35 sstr_t sv = sstrdup(s); 1.36 + if (sv.length == 0) { 1.37 + *n = -2; 1.38 + return NULL; 1.39 + } 1.40 1.41 for (size_t i = 0 ; i < s.length ; i++) { 1.42 if (sv.ptr[i] == d.ptr[0]) { 1.43 @@ -156,19 +165,23 @@ 1.44 } 1.45 if ((*n) == nmax) break; 1.46 } 1.47 - result = (sstr_t*) malloc(sizeof(sstr_t) * (*n)); 1.48 + result = (sstr_t*) allocator->malloc(sizeof(sstr_t) * (*n)); 1.49 1.50 - char *pptr = sv.ptr; 1.51 - for (size_t i = 0 ; i < *n ; i++) { 1.52 - size_t l = strlen(pptr); 1.53 - char* ptr = (char*) malloc(l + 1); 1.54 - memcpy(ptr, pptr, l); 1.55 - ptr[l] = 0; 1.56 + if (result) { 1.57 + char *pptr = sv.ptr; 1.58 + for (size_t i = 0 ; i < *n ; i++) { 1.59 + size_t l = strlen(pptr); 1.60 + char* ptr = (char*) allocator->malloc(l + 1); 1.61 + memcpy(ptr, pptr, l); 1.62 + ptr[l] = 0; 1.63 1.64 - result[i] = sstrn(ptr, l); 1.65 - pptr += l + d.length; 1.66 + result[i] = sstrn(ptr, l); 1.67 + pptr += l + d.length; 1.68 + } 1.69 + } else { 1.70 + *n = -2; 1.71 } 1.72 - 1.73 + 1.74 free(sv.ptr); 1.75 1.76 return result;