diff options
author | David Härdeman <david@hardeman.nu> | 2020-06-28 19:25:20 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2020-06-28 19:25:20 +0200 |
commit | 8f29a4d23dd13a80aa26951b17e2a71f4e651cb1 (patch) | |
tree | d09dee2d148e781d31ffd7e95581bf155a9f050f /minecctl/misc.c | |
parent | 105ad577b367cfda224f0cbcf9f7e688615437e0 (diff) |
Introduce the possibility of specifying serveral commands in one go
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) |