chiark / gitweb /
Prep v228: Substitute declaration masks (3/4)
[elogind.git] / src / basic / strv.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2010 Lennart Poettering
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 #include <fnmatch.h>
25 #include <stdarg.h>
26 #include <stdbool.h>
27
28 #include "extract-word.h"
29 #include "util.h"
30
31 char *strv_find(char **l, const char *name) _pure_;
32 char *strv_find_prefix(char **l, const char *name) _pure_;
33 char *strv_find_startswith(char **l, const char *name) _pure_;
34
35 char **strv_free(char **l);
36 DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free);
37 #define _cleanup_strv_free_ _cleanup_(strv_freep)
38
39 char **strv_free_erase(char **l);
40 DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free_erase);
41 #define _cleanup_strv_free_erase_ _cleanup_(strv_free_erasep)
42
43 void strv_clear(char **l);
44
45 char **strv_copy(char * const *l);
46 unsigned strv_length(char * const *l) _pure_;
47
48 int strv_extend_strv(char ***a, char **b, bool filter_duplicates);
49 /// UNNEEDED by elogind
50 #if 0
51 int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
52 #endif // 0
53 int strv_extend(char ***l, const char *value);
54 /// UNNEEDED by elogind
55 #if 0
56 int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
57 #endif // 0
58 int strv_push(char ***l, char *value);
59 int strv_push_pair(char ***l, char *a, char *b);
60 int strv_push_prepend(char ***l, char *value);
61 int strv_consume(char ***l, char *value);
62 /// UNNEEDED by elogind
63 #if 0
64 int strv_consume_pair(char ***l, char *a, char *b);
65 #endif // 0
66 int strv_consume_prepend(char ***l, char *value);
67
68 char **strv_remove(char **l, const char *s);
69 char **strv_uniq(char **l);
70 /// UNNEEDED by elogind
71 #if 0
72 bool strv_is_uniq(char **l);
73
74 bool strv_equal(char **a, char **b);
75 #endif // 0
76
77 #define strv_contains(l, s) (!!strv_find((l), (s)))
78
79 char **strv_new(const char *x, ...) _sentinel_;
80 char **strv_new_ap(const char *x, va_list ap);
81
82 static inline const char* STRV_IFNOTNULL(const char *x) {
83         return x ? x : (const char *) -1;
84 }
85
86 static inline bool strv_isempty(char * const *l) {
87         return !l || !*l;
88 }
89
90 char **strv_split(const char *s, const char *separator);
91 /// UNNEEDED by elogind
92 #if 0
93 char **strv_split_newlines(const char *s);
94
95 int strv_split_extract(char ***t, const char *s, const char *separators, ExtractFlags flags);
96 #endif // 0
97 char *strv_join(char **l, const char *separator);
98 /// UNNEEDED by elogind
99 #if 0
100 char *strv_join_quoted(char **l);
101 #endif // 0
102
103 char **strv_parse_nulstr(const char *s, size_t l);
104 char **strv_split_nulstr(const char *s);
105 /// UNNEEDED by elogind
106 #if 0
107 int strv_make_nulstr(char **l, char **p, size_t *n);
108
109 bool strv_overlap(char **a, char **b) _pure_;
110 #endif // 0
111 #define STRV_FOREACH(s, l)                      \
112         for ((s) = (l); (s) && *(s); (s)++)
113
114 #define STRV_FOREACH_BACKWARDS(s, l)            \
115         STRV_FOREACH(s, l)                      \
116                 ;                               \
117         for ((s)--; (l) && ((s) >= (l)); (s)--)
118
119 #define STRV_FOREACH_PAIR(x, y, l)               \
120         for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
121
122 char **strv_sort(char **l);
123 /// UNNEEDED by elogind
124 #if 0
125 void strv_print(char **l);
126 #endif // 0
127
128 #define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
129
130 #define STRV_MAKE_EMPTY ((char*[1]) { NULL })
131
132 #define strv_from_stdarg_alloca(first)                          \
133         ({                                                      \
134                 char **_l;                                      \
135                                                                 \
136                 if (!first)                                     \
137                         _l = (char**) &first;                   \
138                 else {                                          \
139                         unsigned _n;                            \
140                         va_list _ap;                            \
141                                                                 \
142                         _n = 1;                                 \
143                         va_start(_ap, first);                   \
144                         while (va_arg(_ap, char*))              \
145                                 _n++;                           \
146                         va_end(_ap);                            \
147                                                                 \
148                         _l = newa(char*, _n+1);                 \
149                         _l[_n = 0] = (char*) first;             \
150                         va_start(_ap, first);                   \
151                         for (;;) {                              \
152                                 _l[++_n] = va_arg(_ap, char*);  \
153                                 if (!_l[_n])                    \
154                                         break;                  \
155                         }                                       \
156                         va_end(_ap);                            \
157                 }                                               \
158                 _l;                                             \
159         })
160
161 #define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
162
163 #define FOREACH_STRING(x, ...)                               \
164         for (char **_l = ({                                  \
165                 char **_ll = STRV_MAKE(__VA_ARGS__);         \
166                 x = _ll ? _ll[0] : NULL;                     \
167                 _ll;                                         \
168         });                                                  \
169         _l && *_l;                                           \
170         x = ({                                               \
171                 _l ++;                                       \
172                 _l[0];                                       \
173         }))
174
175 /// UNNEEDED by elogind
176 #if 0
177 char **strv_reverse(char **l);
178 char **strv_shell_escape(char **l, const char *bad);
179
180 bool strv_fnmatch(char* const* patterns, const char *s, int flags);
181
182 static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
183         assert(s);
184         return strv_isempty(patterns) ||
185                strv_fnmatch(patterns, s, flags);
186 }
187
188 char ***strv_free_free(char ***l);
189
190 char **strv_skip(char **l, size_t n);
191
192 int strv_extend_n(char ***l, const char *value, size_t n);
193 #endif // 0