1.1 --- a/ucx/string.c Mon Jun 02 16:04:11 2014 +0200 1.2 +++ b/ucx/string.c Tue Jun 10 15:43:13 2014 +0200 1.3 @@ -97,13 +97,15 @@ 1.4 sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) { 1.5 sstr_t new_sstr; 1.6 if (start >= s.length) { 1.7 - return s; 1.8 + new_sstr.ptr = NULL; 1.9 + new_sstr.length = 0; 1.10 + } else { 1.11 + if (length > s.length-start) { 1.12 + length = s.length-start; 1.13 + } 1.14 + new_sstr.ptr = &s.ptr[start]; 1.15 + new_sstr.length = length; 1.16 } 1.17 - if (length > s.length-start) { 1.18 - length = s.length-start; 1.19 - } 1.20 - new_sstr.ptr = &s.ptr[start]; 1.21 - new_sstr.length = length; 1.22 return new_sstr; 1.23 } 1.24 1.25 @@ -133,18 +135,18 @@ 1.26 return n; 1.27 } 1.28 1.29 -sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) { 1.30 +sstr_t* sstrsplit(sstr_t s, sstr_t d, ssize_t *n) { 1.31 return sstrsplit_a(ucx_default_allocator(), s, d, n); 1.32 } 1.33 1.34 -sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t s, sstr_t d, size_t *n) { 1.35 +sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t s, sstr_t d, ssize_t *n) { 1.36 if (s.length == 0 || d.length == 0) { 1.37 *n = -1; 1.38 return NULL; 1.39 } 1.40 1.41 sstr_t* result; 1.42 - size_t nmax = *n; 1.43 + ssize_t nmax = *n; 1.44 *n = 1; 1.45 1.46 /* special case: exact match - no processing needed */ 1.47 @@ -179,18 +181,27 @@ 1.48 } 1.49 if ((*n) == nmax) break; 1.50 } 1.51 - result = (sstr_t*) allocator->malloc(allocator->pool, sizeof(sstr_t)*(*n)); 1.52 + result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)*(*n)); 1.53 1.54 if (result) { 1.55 char *pptr = sv.ptr; 1.56 - for (size_t i = 0 ; i < *n ; i++) { 1.57 + for (ssize_t i = 0 ; i < *n ; i++) { 1.58 size_t l = strlen(pptr); 1.59 - char* ptr = (char*) allocator->malloc(allocator->pool, l + 1); 1.60 - memcpy(ptr, pptr, l); 1.61 - ptr[l] = 0; 1.62 + char* ptr = (char*) almalloc(allocator, l + 1); 1.63 + if (ptr) { 1.64 + memcpy(ptr, pptr, l); 1.65 + ptr[l] = 0; 1.66 1.67 - result[i] = sstrn(ptr, l); 1.68 - pptr += l + d.length; 1.69 + result[i] = sstrn(ptr, l); 1.70 + pptr += l + d.length; 1.71 + } else { 1.72 + for (ssize_t j = i-1 ; j >= 0 ; j--) { 1.73 + alfree(allocator, result[j].ptr); 1.74 + } 1.75 + alfree(allocator, result); 1.76 + *n = -2; 1.77 + break; 1.78 + } 1.79 } 1.80 } else { 1.81 *n = -2; 1.82 @@ -231,7 +242,7 @@ 1.83 1.84 sstr_t sstrdup_a(UcxAllocator *allocator, sstr_t s) { 1.85 sstr_t newstring; 1.86 - newstring.ptr = (char*)allocator->malloc(allocator->pool, s.length + 1); 1.87 + newstring.ptr = (char*)almalloc(allocator, s.length + 1); 1.88 if (newstring.ptr) { 1.89 newstring.length = s.length; 1.90 newstring.ptr[newstring.length] = 0;