summaryrefslogtreecommitdiff
path: root/src/shared/strv.h
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-10-29 19:53:43 +0100
committerLennart Poettering <lennart@poettering.net>2013-10-29 19:53:43 +0100
commit250a918dc4c8a15d927deecc3b3f6a0604657ae4 (patch)
tree18faf995d700c26c67ad500b81e7cce007bc0b95 /src/shared/strv.h
parent7b1132f60d2a447c31556c23ea90ea31447ac557 (diff)
strv: introduce new strv_from_stdarg_alloca() macro to generate a string array from stdarg function parameters
This allows us to turn lists of strings passed in easily into string arrays without having to allocate memory.
Diffstat (limited to 'src/shared/strv.h')
-rw-r--r--src/shared/strv.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/shared/strv.h b/src/shared/strv.h
index cccf2e6a92..737728a3c6 100644
--- a/src/shared/strv.h
+++ b/src/shared/strv.h
@@ -85,3 +85,32 @@ bool strv_overlap(char **a, char **b) _pure_;
char **strv_sort(char **l);
void strv_print(char **l);
+
+#define strv_from_stdarg_alloca(first) \
+ ({ \
+ char **_l; \
+ \
+ if (!first) \
+ _l = ((char*[1]) { NULL }); \
+ else { \
+ unsigned _n; \
+ va_list _ap; \
+ \
+ _n = 1; \
+ va_start(_ap, first); \
+ while (va_arg(_ap, char*)) \
+ _n++; \
+ va_end(_ap); \
+ \
+ _l = newa(char*, _n+1); \
+ _l[_n = 0] = (char*) first; \
+ va_start(_ap, first); \
+ for (;;) { \
+ _l[++_n] = va_arg(_ap, char*); \
+ if (!_l[_n]) \
+ break; \
+ } \
+ va_end(_ap); \
+ } \
+ _l; \
+ })