diff options
Diffstat (limited to 'minecctl/misc.c')
-rw-r--r-- | minecctl/misc.c | 77 |
1 files changed, 68 insertions, 9 deletions
diff --git a/minecctl/misc.c b/minecctl/misc.c index 8f0761f..e2d6b02 100644 --- a/minecctl/misc.c +++ b/minecctl/misc.c @@ -36,27 +36,86 @@ void set_use_colors() use_colors = true; } +char **strv_copy(char *const *strv) +{ + size_t len = 1; + char **rv; + char **to; + + for (char *const *str = strv; *str; str++) + len++; + + rv = zmalloc(len * sizeof(char *)); + to = rv; + + for (char *const *str = strv; *str; str++) + *(to++) = xstrdup(*str); + + return rv; +} + +char **strv_from_strs(const char *first, ...) +{ + size_t len = 1; + va_list ap; + char **rv, **to; + + if (first) { + va_start(ap, first); + while (va_arg(ap, const char *)) + len++; + va_end(ap); + } + + rv = zmalloc(len * sizeof(char *)); + to = rv; + *(to++) = first ? xstrdup(first) : NULL; + + if (first) { + const char *str; + + va_start(ap, first); + while ((str = va_arg(ap, const char *))) + *(to++) = xstrdup(str); + va_end(ap); + *to = NULL; + } + + return rv; +} + char *strv_join(char *const *strv) { size_t len = 0; - char *r, *to; + char *rv, *to; - for (unsigned i = 0; strv[i]; i++) - len += strlen(strv[i]) + 1; + for (char *const *str = strv; *str; str++) + len += strlen(*str) + 1; if (len == 0) return NULL; - r = zmalloc(len); - to = r; + rv = zmalloc(len); + to = rv; - for (unsigned i = 0; strv[i]; i++) { - if (i > 0) + for (char *const *str = strv; *str; str++) { + if (str != strv) *(to++) = ' '; - to = stpcpy(to, strv[i]); + to = stpcpy(to, *str); } - return r; + return rv; +} + +void strv_free(char **strv) +{ + if (!strv) + return; + + for (char **str = strv; *str; str++) + xfree(*str); + + xfree(strv); } int connect_any(struct list_head *addrs, bool may_fail) |