summaryrefslogtreecommitdiff
path: root/minecctl/misc.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-28 19:25:20 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-28 19:25:20 +0200
commit8f29a4d23dd13a80aa26951b17e2a71f4e651cb1 (patch)
treed09dee2d148e781d31ffd7e95581bf155a9f050f /minecctl/misc.c
parent105ad577b367cfda224f0cbcf9f7e688615437e0 (diff)
Introduce the possibility of specifying serveral commands in one go
Diffstat (limited to 'minecctl/misc.c')
-rw-r--r--minecctl/misc.c77
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)