ucx/string.c

changeset 173
31a8682fffb7
parent 152
3238f65db163
child 177
11ad03783baf
     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;

mercurial