chiark / gitweb /
strv: introduce strv_new_ap() call
authorLennart Poettering <lennart@poettering.net>
Sat, 10 Apr 2010 15:43:12 +0000 (17:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 10 Apr 2010 16:00:33 +0000 (18:00 +0200)
strv.c
strv.h

diff --git a/strv.c b/strv.c
index b5459a9..ed5755a 100644 (file)
--- 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 9bdf287..7ee9a95 100644 (file)
--- 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;