From: Lennart Poettering Date: Sat, 10 Apr 2010 15:43:12 +0000 (+0200) Subject: strv: introduce strv_new_ap() call X-Git-Tag: v1~566 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=257eca1a9c2d0ef110c21e74952e9723d778e267;ds=sidebyside strv: introduce strv_new_ap() call --- diff --git a/strv.c b/strv.c index b5459a986..ed5755a0d 100644 --- a/strv.c +++ b/strv.c @@ -85,21 +85,20 @@ unsigned strv_length(char **l) { return n; } -char **strv_new(const char *x, ...) { +char **strv_new_ap(const char *x, va_list ap) { const char *s; char **a; unsigned n = 0, i = 0; - va_list ap; + va_list aq; + if (x) { n = 1; - va_start(ap, x); - - while (va_arg(ap, const char*)) + va_copy(aq, ap); + while (va_arg(aq, const char*)) n++; - - va_end(ap); + va_end(aq); } if (!(a = new(char*, n+1))) @@ -113,19 +112,16 @@ char **strv_new(const char *x, ...) { i++; - va_start(ap, x); - while ((s = va_arg(ap, const char*))) { if (!(a[i] = strdup(s))) goto fail; i++; } - - va_end(ap); } a[i] = NULL; + return a; fail: @@ -135,9 +131,21 @@ fail: free(a[i-1]); free(a); + return NULL; } +char **strv_new(const char *x, ...) { + char **r; + va_list ap; + + va_start(ap, x); + r = strv_new_ap(x, ap); + va_end(ap); + + return r; +} + char **strv_merge(char **a, char **b) { char **r, **k; diff --git a/strv.h b/strv.h index 9bdf287a2..7ee9a95a8 100644 --- a/strv.h +++ b/strv.h @@ -39,6 +39,7 @@ char **strv_uniq(char **l); #define strv_contains(l, s) (!!strv_find((l), (s))) char **strv_new(const char *x, ...) _sentinel; +char **strv_new_ap(const char *x, va_list ap); static inline bool strv_isempty(char **l) { return !l || !*l;