diff --git a/src/util-strings.c b/src/util-strings.c index 587e03e..dea4b6b 100644 --- a/src/util-strings.c +++ b/src/util-strings.c @@ -220,6 +220,86 @@ strreplace(const char *string, const char *separator, const char *replacement) return tmp; } +size_t +strv_len(char **strv) +{ + if (!strv) + return 0; + + size_t size = 1; + while (*strv) { + size++; + strv++; + } + return size; +} + +char ** +strv_append_take(char **strv, char **str) +{ + if (str && *str) { + size_t len = max(strv_len(strv) + 1, 2); + + char **s = realloc(strv, len * sizeof(*strv)); + if (!s) + abort(); + s[len - 1] = NULL; + s[len - 2] = *str; + *str = NULL; + return s; + } else { + return strv; + } +} + +char ** +strv_append_strdup(char **strv, const char *str) +{ + char *dup = xstrdup(str); + return strv_append_take(strv, &dup); +} + +bool +strv_find(char **strv, const char *needle, size_t *index_out) +{ + if (!strv) + return false; + + size_t index = 0; + char **s = strv; + while (*s != NULL) { + if (streq(*s, needle)) { + if (index_out) + *index_out = index; + return true; + } + s++; + index++; + } + + return false; +} + +bool +strv_find_substring(char **strv, const char *needle, size_t *index_out) +{ + if (!strv || !needle) + return false; + + size_t index = 0; + char **s = strv; + while (*s != NULL) { + if (strstr(*s, needle)) { + if (index_out) + *index_out = index; + return true; + } + s++; + index++; + } + + return false; +} char ** strv_from_mem(const uint8_t *buffer, size_t sz, size_t stride) diff --git a/src/util-strings.h b/src/util-strings.h index 4642d99..d0c4edd 100644 --- a/src/util-strings.h +++ b/src/util-strings.h @@ -254,9 +254,16 @@ xatod(const char *str, double *val) return true; } +size_t strv_len(char **strv); +/* Takes ownership of the string and appends it to strv, s is set to NULL */ +char **strv_append_take(char **strv, char **s); +char **strv_append_strdup(char **strv, const char *s); char **strv_from_string(const char *string, const char *separator); char *strv_join(char **strv, const char *separator); +bool strv_find(char **strv, const char *needle, size_t *index_out); +bool strv_find_substring(char **strv, const char *needle, size_t *index_out); + static inline void strv_free(char **strv) { char **s = strv;