ucx/string.c

changeset 39
bf8ab7bb74ff
parent 31
91ac86557290
child 47
22fb97e9f58a
     1.1 --- a/ucx/string.c	Tue Oct 02 11:18:47 2012 +0200
     1.2 +++ b/ucx/string.c	Tue Oct 02 13:43:17 2012 +0200
     1.3 @@ -86,6 +86,62 @@
     1.4      return new_sstr;
     1.5  }
     1.6  
     1.7 +sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) {
     1.8 +    if (d.length == 0) {
     1.9 +        return NULL;
    1.10 +    }
    1.11 +
    1.12 +    sstr_t* result;
    1.13 +    size_t nmax = *n;
    1.14 +    *n = 1;
    1.15 +
    1.16 +    /* special case: exact match - no processing needed */
    1.17 +    if (s.length == d.length && strncmp(s.ptr, d.ptr, s.length) == 0) {
    1.18 +        result = malloc(sizeof(sstr_t));
    1.19 +        result[0] = sstrn("", 0);
    1.20 +        return result;
    1.21 +    }
    1.22 +    sstr_t sv = sstrdup(s);
    1.23 +
    1.24 +    for (int i = 0 ; i < s.length ; i++) {
    1.25 +        if (sv.ptr[i] == d.ptr[0]) {
    1.26 +            _Bool match = 1;
    1.27 +            for (int j = 1 ; j < d.length ; j++) {
    1.28 +                if (j+i < s.length) {
    1.29 +                    match &= (sv.ptr[i+j] == d.ptr[j]);
    1.30 +                } else {
    1.31 +                    match = 0;
    1.32 +                    break;
    1.33 +                }
    1.34 +            }
    1.35 +            if (match) {
    1.36 +                (*n)++;
    1.37 +                for (int j = 0 ; j < d.length ; j++) {
    1.38 +                    sv.ptr[i+j] = 0;
    1.39 +                }
    1.40 +                i += d.length;
    1.41 +            }
    1.42 +        }
    1.43 +        if ((*n) == nmax) break;
    1.44 +    }
    1.45 +    result = malloc(sizeof(sstr_t) * (*n));
    1.46 +
    1.47 +    char *pptr = sv.ptr;
    1.48 +    for (int i = 0 ; i < *n ; i++) {
    1.49 +        size_t l = strlen(pptr);
    1.50 +        char* ptr = malloc(l + 1);
    1.51 +        memcpy(ptr, pptr, l);
    1.52 +        ptr[l] = 0;
    1.53 +
    1.54 +        result[i] = sstrn(ptr, l);
    1.55 +        pptr += l + d.length;
    1.56 +    }
    1.57 +
    1.58 +    free(sv.ptr);
    1.59 +
    1.60 +    return result;
    1.61 +}
    1.62 +
    1.63  int sstrcmp(sstr_t s1, sstr_t s2) {
    1.64      return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length);
    1.65  }

mercurial