X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Futils%2Fstrings.c;h=b6a49e10ab36831d709f559cda7de4f5cfd8d79a;hp=c07cfa1c2de1e0153f661c2a1553753d451788bb;hb=61e96ed1855b508dc544c5ab2a39de450483f208;hpb=3dea9329ce61105077cda3d2a9102589360de878 diff --git a/src/utils/strings.c b/src/utils/strings.c index c07cfa1..b6a49e1 100644 --- a/src/utils/strings.c +++ b/src/utils/strings.c @@ -31,34 +31,66 @@ #include "utils/strings.h" +#include + #include #include /* - * public API + * private helper functions */ -int -stringv_copy(char ***dst, size_t *dst_len, - const char * const *src, size_t src_len) +static int +ensure_len(char ***s, size_t *s_len, size_t len) { char **tmp; - size_t i; - if (*dst) { - tmp = realloc(*dst, src_len * sizeof(*tmp)); - if (tmp) - memset(tmp, 0, src_len * sizeof(*tmp)); + if ((! s) || (! s_len)) + return -1; + + if (! len) { + if (*s) + free(*s); + *s = NULL; + *s_len = 0; + return 0; + } + + if (*s) { + tmp = realloc(*s, len * sizeof(*tmp)); + if (tmp && (len > *s_len)) + memset(tmp + *s_len, 0, (len - *s_len) * sizeof(*tmp)); } else - tmp = calloc(src_len, sizeof(*tmp)); + tmp = calloc(len, sizeof(*tmp)); if (! tmp) return -1; - *dst = tmp; - *dst_len = src_len; + *s = tmp; + *s_len = len; + return 0; +} /* ensure_len */ + +/* + * public API + */ + +int +stringv_copy(char ***dst, size_t *dst_len, + const char * const *src, size_t src_len) +{ + size_t i; + + if (src_len && (! src)) + return -1; + if (ensure_len(dst, dst_len, src_len)) + return -1; + assert(dst); + for (i = 0; i < src_len; ++i) { + if ((*dst)[i]) + free((*dst)[i]); (*dst)[i] = strdup(src[i]); if (! (*dst)[i]) return -1; @@ -66,6 +98,22 @@ stringv_copy(char ***dst, size_t *dst_len, return 0; } /* stringv_copy */ +int +stringv_append(char ***s, size_t *s_len, const char *elem) +{ + size_t i; + + if ((! s_len) || ensure_len(s, s_len, *s_len + 1)) + return -1; + assert(s); + + i = *s_len - 1; + (*s)[i] = strdup(elem); + if (! (*s)[i]) + return -1; + return 0; +} /* stringv_append */ + void stringv_free(char ***s, size_t *s_len) {