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 universe@69: #include olaf@20: #include olaf@20: olaf@20: #include "string.h" olaf@20: olaf@68: 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@68: 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@68: 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: universe@95: for (size_t i = 0 ; i < n-1 ; i++) { olaf@20: sstr_t str = va_arg(ap, sstr_t); olaf@20: size += str.length; olaf@20: } universe@24: va_end(ap); olaf@20: olaf@20: return size; olaf@20: } olaf@20: olaf@68: sstr_t sstrcat(sstr_t s, ...) { olaf@20: va_list ap; olaf@20: va_start(ap, s); olaf@20: s.ptr[0] = 0; olaf@20: olaf@20: sstr_t str = va_arg (ap, sstr_t); olaf@20: while (str.ptr != NULL) { olaf@20: s.ptr = strncat (s.ptr, str.ptr, s.length); olaf@20: str = va_arg (ap, sstr_t); olaf@20: } universe@24: va_end(ap); olaf@20: olaf@20: return s; olaf@20: } olaf@20: olaf@68: sstr_t sstrncat(size_t n, sstr_t s, sstr_t c1, ...) { olaf@20: va_list ap; olaf@20: va_start(ap, c1); olaf@20: s.ptr[0] = 0; olaf@47: olaf@47: size_t len = s.length; olaf@47: size_t cplen = c1.length > len ? len : c1.length; olaf@47: char *ptr = s.ptr; olaf@47: olaf@47: memcpy(ptr, c1.ptr, cplen); olaf@47: len -= cplen; olaf@47: ptr += cplen; universe@95: for (size_t i = 0 ; i < n-1 ; i++) { olaf@20: sstr_t str = va_arg (ap, sstr_t); olaf@47: cplen = str.length > len ? len : str.length; olaf@47: if(cplen <= 0) { olaf@47: va_end(ap); olaf@47: return s; olaf@47: } olaf@47: memcpy(ptr, str.ptr, cplen); olaf@47: len -= cplen; olaf@47: ptr += cplen; olaf@20: } universe@24: va_end(ap); olaf@20: olaf@20: return s; olaf@20: } olaf@20: olaf@68: sstr_t sstrsubs(sstr_t s, size_t start) { olaf@20: return sstrsubsl (s, start, s.length-start); olaf@20: } olaf@20: olaf@68: sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) { olaf@20: sstr_t new_sstr; olaf@20: if (start < 0 || start >= 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: olaf@68: 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@71: *n = 0; universe@71: return NULL; universe@39: } universe@39: sstr_t sv = sstrdup(s); universe@39: universe@95: for (size_t i = 0 ; i < s.length ; i++) { universe@39: if (sv.ptr[i] == d.ptr[0]) { universe@39: _Bool match = 1; universe@95: for (size_t 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@95: for (size_t 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@69: result = (sstr_t*) malloc(sizeof(sstr_t) * (*n)); universe@39: universe@39: char *pptr = sv.ptr; universe@95: for (size_t i = 0 ; i < *n ; i++) { universe@39: size_t l = strlen(pptr); universe@69: char* ptr = (char*) 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@68: 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@68: sstr_t sstrdup(sstr_t s) { olaf@20: sstr_t newstring; universe@24: newstring.ptr = (char*) malloc(s.length + 1); olaf@96: newstring.length = 0; universe@87: if (newstring.ptr) { 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@87: } else { universe@87: newstring.length = 0; universe@24: } olaf@20: olaf@20: return newstring; olaf@20: } olaf@96: olaf@96: sstr_t sstrtrim(sstr_t string) { olaf@96: sstr_t newstr = string; olaf@96: int i; olaf@96: for(i=0;i 32) { olaf@96: break; olaf@96: } olaf@96: } olaf@96: newstr.ptr = &string.ptr[i]; olaf@96: newstr.length = string.length - i; olaf@96: olaf@96: for(i=newstr.length-1;i>=0;i--) { olaf@96: char c = newstr.ptr[i]; olaf@96: if(c > 32) { olaf@96: break; olaf@96: } olaf@96: } olaf@96: newstr.length = i + 1; olaf@96: olaf@96: return newstr; olaf@96: }