]> git.ipfire.org Git - people/ms/systemd.git/blob - strv.c
first attempt at proper service/socket logic
[people/ms/systemd.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 }
118
119 char **strv_merge(char **a, char **b) {
120 char **r, **k;
121
122 if (!a)
123 return strv_copy(b);
124
125 if (!b)
126 return strv_copy(a);
127
128 if (!(r = new(char*, strv_length(a)+strv_length(b)+1)))
129 return NULL;
130
131 for (k = r; *a; k++, a++)
132 if (!(*k = strdup(*a)))
133 goto fail;
134 for (; *b; k++, b++)
135 if (!(*k = strdup(*b)))
136 goto fail;
137
138 *k = NULL;
139 return r;
140
141 fail:
142 for (k--; k >= r; k--)
143 free(*k);
144
145 return NULL;
146
147 }