chiark / gitweb /
add functions for dumping server state
[elogind.git] / strv.c
1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
2
3 #include <assert.h>
4 #include <stdlib.h>
5 #include <stdarg.h>
6 #include <string.h>
7
8 #include "util.h"
9 #include "strv.h"
10
11 char *strv_find(char **l, const char *name) {
12         assert(l);
13         assert(name);
14
15         for (; *l; l++)
16                 if (streq(*l, name))
17                         return *l;
18
19         return NULL;
20 }
21
22 void strv_free(char **l) {
23         char **k;
24
25         if (!l)
26                 return;
27
28         for (k = l; *k; k++)
29                 free(*k);
30
31         free(l);
32 }
33
34 char **strv_copy(char **l) {
35         char **r, **k;
36
37         if (!(r = new(char*, strv_length(l)+1)))
38                 return NULL;
39
40         for (k = r; *l; k++, l++)
41                 if (!(*k = strdup(*l)))
42                         goto fail;
43
44         *k = NULL;
45         return r;
46
47 fail:
48         for (k--, l--; k >= r; k--, l--)
49                 free(*k);
50
51         return NULL;
52 }
53
54 unsigned strv_length(char **l) {
55         unsigned n = 0;
56
57         if (!l)
58                 return 0;
59
60         for (; *l; l++)
61                 n++;
62
63         return n;
64 }
65
66 char **strv_new(const char *x, ...) {
67         const char *s;
68         char **a;
69         unsigned n = 0, i = 0;
70         va_list ap;
71
72         if (x) {
73                 n = 1;
74
75                 va_start(ap, x);
76
77                 while (va_arg(ap, const char*))
78                         n++;
79
80                 va_end(ap);
81         }
82
83         if (!(a = new(char*, n+1)))
84                 return NULL;
85
86         if (x) {
87                 if (!(a[i] = strdup(x))) {
88                         free(a);
89                         return NULL;
90                 }
91
92                 i++;
93
94                 va_start(ap, x);
95
96                 while ((s = va_arg(ap, const char*))) {
97                         if (!(a[i] = strdup(s)))
98                                 goto fail;
99
100                         i++;
101                 }
102
103                 va_end(ap);
104         }
105
106         a[i] = NULL;
107         return a;
108
109 fail:
110
111         for (; i > 0; i--)
112                 if (a[i-1])
113                         free(a[i-1]);
114
115         free(a);
116         return NULL;
117 }