]> git.ipfire.org Git - people/ms/systemd.git/blame - strv.c
add simple event loop
[people/ms/systemd.git] / strv.c
CommitLineData
60918275
LP
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
11char *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
22void 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
34char **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
47fail:
48 for (k--, l--; k >= r; k--, l--)
49 free(*k);
50
51 return NULL;
52}
53
54unsigned 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
66char **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
109fail:
110
111 for (; i > 0; i--)
112 if (a[i-1])
113 free(a[i-1]);
114
115 free(a);
116 return NULL;
117}