ucx/string.c

changeset 119
baa839a7633f
parent 116
234920008754
child 120
8170f658f017
     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;

mercurial