ucx/string.c

changeset 214
2bc19726c340
parent 213
fa8b745be7b5
child 225
a1a068c2c4ef
     1.1 --- a/ucx/string.c	Mon Oct 26 14:09:45 2015 +0100
     1.2 +++ b/ucx/string.c	Tue Oct 27 15:29:34 2015 +0100
     1.3 @@ -175,6 +175,24 @@
     1.4      return n;
     1.5  }
     1.6  
     1.7 +sstr_t sstrstr(sstr_t string, sstr_t match) {
     1.8 +    if (match.length == 0) {
     1.9 +        return string;
    1.10 +    }
    1.11 +    
    1.12 +    for (size_t i = 0 ; i < string.length ; i++) {
    1.13 +        sstr_t substr = sstrsubs(string, i);
    1.14 +        if (sstrprefix(substr, match)) {
    1.15 +            return substr;
    1.16 +        }
    1.17 +    }
    1.18 +    
    1.19 +    sstr_t emptystr;
    1.20 +    emptystr.length = 0;
    1.21 +    emptystr.ptr = NULL;
    1.22 +    return emptystr;
    1.23 +}
    1.24 +
    1.25  sstr_t* sstrsplit(sstr_t s, sstr_t d, ssize_t *n) {
    1.26      return sstrsplit_a(ucx_default_allocator(), s, d, n);
    1.27  }
    1.28 @@ -201,23 +219,13 @@
    1.29      }
    1.30  
    1.31      for (size_t i = 0 ; i < s.length ; i++) {
    1.32 -        if (sv.ptr[i] == d.ptr[0]) {
    1.33 -            _Bool match = 1;
    1.34 -            for (size_t j = 1 ; j < d.length ; j++) {
    1.35 -                if (j+i < s.length) {
    1.36 -                    match &= (sv.ptr[i+j] == d.ptr[j]);
    1.37 -                } else {
    1.38 -                    match = 0;
    1.39 -                    break;
    1.40 -                }
    1.41 +        sstr_t substr = sstrsubs(sv, i);
    1.42 +        if (sstrprefix(substr, d)) {
    1.43 +            (*n)++;
    1.44 +            for (size_t j = 0 ; j < d.length ; j++) {
    1.45 +                sv.ptr[i+j] = 0;
    1.46              }
    1.47 -            if (match) {
    1.48 -                (*n)++;
    1.49 -                for (size_t j = 0 ; j < d.length ; j++) {
    1.50 -                    sv.ptr[i+j] = 0;
    1.51 -                }
    1.52 -                i += d.length - 1; // -1, because the loop will do a i++
    1.53 -            }
    1.54 +            i += d.length - 1; // -1, because the loop will do a i++
    1.55          }
    1.56          if ((*n) == nmax) break;
    1.57      }

mercurial