chiark / gitweb /
machined: add early checks for unrealistically large image/pool sizes
[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 #include <stddef.h>
28
29 #include "alloc-util.h"
30 #include "extract-word.h"
31 #include "macro.h"
32 #include "util.h"
33
34 char *strv_find(char **l, const char *name) _pure_;
35 char *strv_find_prefix(char **l, const char *name) _pure_;
36 char *strv_find_startswith(char **l, const char *name) _pure_;
37
38 char **strv_free(char **l);
39 DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free);
40 #define _cleanup_strv_free_ _cleanup_(strv_freep)
41
42 char **strv_free_erase(char **l);
43 DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free_erase);
44 #define _cleanup_strv_free_erase_ _cleanup_(strv_free_erasep)
45
46 void strv_clear(char **l);
47
48 char **strv_copy(char * const *l);
49 unsigned strv_length(char * const *l) _pure_;
50
51 #if 0 /// UNNEEDED by elogind
52 int strv_extend_strv(char ***a, char **b, bool filter_duplicates);
53 int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
54 #endif // 0
55 int strv_extend(char ***l, const char *value);
56 #if 0 /// UNNEEDED by elogind
57 int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
58 #endif // 0
59 int strv_push(char ***l, char *value);
60 int strv_push_pair(char ***l, char *a, char *b);
61 int strv_push_prepend(char ***l, char *value);
62 int strv_consume(char ***l, char *value);
63 #if 0 /// UNNEEDED by elogind
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 #if 0 /// UNNEEDED by elogind
71 bool strv_is_uniq(char **l);
72
73 bool strv_equal(char **a, char **b);
74 #endif // 0
75
76 #define strv_contains(l, s) (!!strv_find((l), (s)))
77
78 char **strv_new(const char *x, ...) _sentinel_;
79 char **strv_new_ap(const char *x, va_list ap);
80
81 static inline const char* STRV_IFNOTNULL(const char *x) {
82         return x ? x : (const char *) -1;
83 }
84
85 static inline bool strv_isempty(char * const *l) {
86         return !l || !*l;
87 }
88
89 char **strv_split(const char *s, const char *separator);
90 #if 0 /// UNNEEDED by elogind
91 char **strv_split_newlines(const char *s);
92
93 int strv_split_extract(char ***t, const char *s, const char *separators, ExtractFlags flags);
94 #endif // 0
95 char *strv_join(char **l, const char *separator);
96 #if 0 /// UNNEEDED by elogind
97 char *strv_join_quoted(char **l);
98 #endif // 0
99
100 char **strv_parse_nulstr(const char *s, size_t l);
101 char **strv_split_nulstr(const char *s);
102 #if 0 /// UNNEEDED by elogind
103 int strv_make_nulstr(char **l, char **p, size_t *n);
104
105 bool strv_overlap(char **a, char **b) _pure_;
106 #endif // 0
107 #define STRV_FOREACH(s, l)                      \
108         for ((s) = (l); (s) && *(s); (s)++)
109
110 #define STRV_FOREACH_BACKWARDS(s, l)            \
111         STRV_FOREACH(s, l)                      \
112                 ;                               \
113         for ((s)--; (l) && ((s) >= (l)); (s)--)
114
115 #define STRV_FOREACH_PAIR(x, y, l)               \
116         for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
117
118 char **strv_sort(char **l);
119 #if 0 /// UNNEEDED by elogind
120 void strv_print(char **l);
121 #endif // 0
122
123 #define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
124
125 #define STRV_MAKE_EMPTY ((char*[1]) { NULL })
126
127 #define strv_from_stdarg_alloca(first)                          \
128         ({                                                      \
129                 char **_l;                                      \
130                                                                 \
131                 if (!first)                                     \
132                         _l = (char**) &first;                   \
133                 else {                                          \
134                         unsigned _n;                            \
135                         va_list _ap;                            \
136                                                                 \
137                         _n = 1;                                 \
138                         va_start(_ap, first);                   \
139                         while (va_arg(_ap, char*))              \
140                                 _n++;                           \
141                         va_end(_ap);                            \
142                                                                 \
143                         _l = newa(char*, _n+1);                 \
144                         _l[_n = 0] = (char*) first;             \
145                         va_start(_ap, first);                   \
146                         for (;;) {                              \
147                                 _l[++_n] = va_arg(_ap, char*);  \
148                                 if (!_l[_n])                    \
149                                         break;                  \
150                         }                                       \
151                         va_end(_ap);                            \
152                 }                                               \
153                 _l;                                             \
154         })
155
156 #define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
157
158 #define FOREACH_STRING(x, ...)                               \
159         for (char **_l = ({                                  \
160                 char **_ll = STRV_MAKE(__VA_ARGS__);         \
161                 x = _ll ? _ll[0] : NULL;                     \
162                 _ll;                                         \
163         });                                                  \
164         _l && *_l;                                           \
165         x = ({                                               \
166                 _l ++;                                       \
167                 _l[0];                                       \
168         }))
169
170 #if 0 /// UNNEEDED by elogind
171 char **strv_reverse(char **l);
172 char **strv_shell_escape(char **l, const char *bad);
173
174 bool strv_fnmatch(char* const* patterns, const char *s, int flags);
175
176 static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
177         assert(s);
178         return strv_isempty(patterns) ||
179                strv_fnmatch(patterns, s, flags);
180 }
181
182 char ***strv_free_free(char ***l);
183
184 char **strv_skip(char **l, size_t n);
185
186 int strv_extend_n(char ***l, const char *value, size_t n);
187 #endif // 0