From 257eca1a9c2d0ef110c21e74952e9723d778e267 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 10 Apr 2010 17:43:12 +0200 Subject: [PATCH] strv: introduce strv_new_ap() call --- strv.c | 30 +++++++++++++++++++----------- strv.h | 1 + 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/strv.c b/strv.c index b5459a98..ed5755a0 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 9bdf287a..7ee9a95a 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; -- 2.39.5