olaf@20: /* olaf@20: * File: sstring.c olaf@20: * Author: olaf olaf@20: * olaf@20: * Created on 17. Juni 2010, 13:27 olaf@20: */ olaf@20: olaf@20: #include olaf@30: #include olaf@20: #include olaf@20: olaf@20: #include "string.h" olaf@20: olaf@20: sstr_t sstr (char *s) { olaf@20: sstr_t string; olaf@20: string.ptr = s; olaf@20: string.length = strlen(s); olaf@20: return string; olaf@20: } olaf@20: olaf@20: sstr_t sstrn (char *s, size_t n) { olaf@20: sstr_t string; olaf@20: string.ptr = s; olaf@20: string.length = n; olaf@20: return string; olaf@20: } olaf@20: olaf@20: size_t sstrnlen (size_t n, sstr_t s, ...) { olaf@20: va_list ap; olaf@20: size_t size = s.length; olaf@20: va_start(ap, s); olaf@20: olaf@20: for (int i=0;i= s.length || length < 0) { olaf@20: return s; olaf@20: } olaf@20: if (length > s.length-start) { olaf@20: length = s.length-start; olaf@20: } olaf@20: new_sstr.ptr = &s.ptr[start]; olaf@20: new_sstr.length = length; olaf@20: return new_sstr; olaf@20: } olaf@20: universe@39: sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) { universe@39: if (d.length == 0) { universe@39: return NULL; universe@39: } universe@39: universe@39: sstr_t* result; universe@39: size_t nmax = *n; universe@39: *n = 1; universe@39: universe@39: /* special case: exact match - no processing needed */ universe@39: if (s.length == d.length && strncmp(s.ptr, d.ptr, s.length) == 0) { universe@39: result = malloc(sizeof(sstr_t)); universe@39: result[0] = sstrn("", 0); universe@39: return result; universe@39: } universe@39: sstr_t sv = sstrdup(s); universe@39: universe@39: for (int i = 0 ; i < s.length ; i++) { universe@39: if (sv.ptr[i] == d.ptr[0]) { universe@39: _Bool match = 1; universe@39: for (int j = 1 ; j < d.length ; j++) { universe@39: if (j+i < s.length) { universe@39: match &= (sv.ptr[i+j] == d.ptr[j]); universe@39: } else { universe@39: match = 0; universe@39: break; universe@39: } universe@39: } universe@39: if (match) { universe@39: (*n)++; universe@39: for (int j = 0 ; j < d.length ; j++) { universe@39: sv.ptr[i+j] = 0; universe@39: } universe@39: i += d.length; universe@39: } universe@39: } universe@39: if ((*n) == nmax) break; universe@39: } universe@39: result = malloc(sizeof(sstr_t) * (*n)); universe@39: universe@39: char *pptr = sv.ptr; universe@39: for (int i = 0 ; i < *n ; i++) { universe@39: size_t l = strlen(pptr); universe@39: char* ptr = malloc(l + 1); universe@39: memcpy(ptr, pptr, l); universe@39: ptr[l] = 0; universe@39: universe@39: result[i] = sstrn(ptr, l); universe@39: pptr += l + d.length; universe@39: } universe@39: universe@39: free(sv.ptr); universe@39: universe@39: return result; universe@39: } universe@39: olaf@20: int sstrcmp(sstr_t s1, sstr_t s2) { olaf@20: return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length); olaf@20: } olaf@20: olaf@31: sstr_t sstrdup(sstr_t s) { olaf@20: sstr_t newstring; universe@24: newstring.ptr = (char*) malloc(s.length + 1); universe@24: if (newstring.ptr != NULL) { universe@24: newstring.length = s.length; universe@24: newstring.ptr[newstring.length] = 0; olaf@20: universe@24: memcpy(newstring.ptr, s.ptr, s.length); universe@24: } olaf@20: olaf@20: return newstring; olaf@20: }