diff -r 151f5345f303 -r baa839a7633f ucx/string.c --- a/ucx/string.c Wed Jul 17 20:03:01 2013 +0200 +++ b/ucx/string.c Fri Jul 19 14:17:12 2013 +0200 @@ -73,7 +73,7 @@ memcpy(ptr, c1.ptr, cplen); len -= cplen; ptr += cplen; - for (size_t i = 0 ; i < n-1 ; i++) { + for (size_t i = 1 ; i < n ; i++) { sstr_t str = va_arg (ap, sstr_t); cplen = str.length > len ? len : str.length; if(cplen <= 0) { @@ -120,7 +120,12 @@ } sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) { - if (d.length == 0) { + return sstrsplita(s, d, n, ucx_default_allocator()); +} + +sstr_t* sstrsplita(sstr_t s, sstr_t d, size_t *n, UcxAllocator *allocator) { + if (s.length == 0 || d.length == 0) { + *n = -1; return NULL; } @@ -129,11 +134,15 @@ *n = 1; /* special case: exact match - no processing needed */ - if (s.length == d.length && strncmp(s.ptr, d.ptr, s.length) == 0) { + if (sstrcmp(s, d) == 0) { *n = 0; return NULL; } sstr_t sv = sstrdup(s); + if (sv.length == 0) { + *n = -2; + return NULL; + } for (size_t i = 0 ; i < s.length ; i++) { if (sv.ptr[i] == d.ptr[0]) { @@ -156,19 +165,23 @@ } if ((*n) == nmax) break; } - result = (sstr_t*) malloc(sizeof(sstr_t) * (*n)); + result = (sstr_t*) allocator->malloc(sizeof(sstr_t) * (*n)); - char *pptr = sv.ptr; - for (size_t i = 0 ; i < *n ; i++) { - size_t l = strlen(pptr); - char* ptr = (char*) malloc(l + 1); - memcpy(ptr, pptr, l); - ptr[l] = 0; + if (result) { + char *pptr = sv.ptr; + for (size_t i = 0 ; i < *n ; i++) { + size_t l = strlen(pptr); + char* ptr = (char*) allocator->malloc(l + 1); + memcpy(ptr, pptr, l); + ptr[l] = 0; - result[i] = sstrn(ptr, l); - pptr += l + d.length; + result[i] = sstrn(ptr, l); + pptr += l + d.length; + } + } else { + *n = -2; } - + free(sv.ptr); return result;