From 8f29a4d23dd13a80aa26951b17e2a71f4e651cb1 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Sun, 28 Jun 2020 19:25:20 +0200 Subject: Introduce the possibility of specifying serveral commands in one go --- minecctl/misc.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 68 insertions(+), 9 deletions(-) (limited to 'minecctl/misc.c') 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) -- cgit v1.2.3