]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/strv.h
core: introduce a "control" unit file directory
[thirdparty/systemd.git] / src / basic / strv.h
CommitLineData
c2f1db8f 1#pragma once
60918275 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
84ac7bea 22#include <fnmatch.h>
15ae422b
LP
23#include <stdarg.h>
24#include <stdbool.h>
11c3a366 25#include <stddef.h>
15ae422b 26
11c3a366 27#include "alloc-util.h"
93cc7779 28#include "extract-word.h"
11c3a366 29#include "macro.h"
1ca208fb 30#include "util.h"
60918275 31
44a6b1b6
ZJS
32char *strv_find(char **l, const char *name) _pure_;
33char *strv_find_prefix(char **l, const char *name) _pure_;
28849dba 34char *strv_find_startswith(char **l, const char *name) _pure_;
a4bfb399 35
33c2ce7b 36char **strv_free(char **l);
14bf2c9d 37DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free);
dfb33a97
LP
38#define _cleanup_strv_free_ _cleanup_(strv_freep)
39
ab84f5b9
ZJS
40char **strv_free_erase(char **l);
41DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free_erase);
42#define _cleanup_strv_free_erase_ _cleanup_(strv_free_erasep)
43
dd9c7723
TG
44void strv_clear(char **l);
45
b231b547 46char **strv_copy(char * const *l);
44a6b1b6 47unsigned strv_length(char * const *l) _pure_;
60918275 48
e287086b 49int strv_extend_strv(char ***a, char **b, bool filter_duplicates);
e3e45d4f 50int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
5926ccca 51int strv_extend(char ***l, const char *value);
20e265d4 52int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
4468addc 53int strv_push(char ***l, char *value);
98940a3c 54int strv_push_pair(char ***l, char *a, char *b);
9a00f57a 55int strv_push_prepend(char ***l, char *value);
6e18964d 56int strv_consume(char ***l, char *value);
98940a3c 57int strv_consume_pair(char ***l, char *a, char *b);
9a00f57a 58int strv_consume_prepend(char ***l, char *value);
034c6ed7 59
5f9a22c3
LP
60char **strv_remove(char **l, const char *s);
61char **strv_uniq(char **l);
e1dd6790 62bool strv_is_uniq(char **l);
5f9a22c3 63
0f84a72e
DH
64bool strv_equal(char **a, char **b);
65
5f9a22c3 66#define strv_contains(l, s) (!!strv_find((l), (s)))
cba8922f 67
b231b547
ZJS
68char **strv_new(const char *x, ...) _sentinel_;
69char **strv_new_ap(const char *x, va_list ap);
60918275 70
07719a21
LP
71static inline const char* STRV_IFNOTNULL(const char *x) {
72 return x ? x : (const char *) -1;
73}
74
2fd9ae2e 75static inline bool strv_isempty(char * const *l) {
5f9a22c3
LP
76 return !l || !*l;
77}
78
b231b547 79char **strv_split(const char *s, const char *separator);
b231b547 80char **strv_split_newlines(const char *s);
5f9a22c3 81
8adaf7bd 82int strv_split_extract(char ***t, const char *s, const char *separators, ExtractFlags flags);
f88e6be5 83
b231b547 84char *strv_join(char **l, const char *separator);
a6fde353 85char *strv_join_quoted(char **l);
5f9a22c3 86
21bc923a 87char **strv_parse_nulstr(const char *s, size_t l);
fabe5c0e 88char **strv_split_nulstr(const char *s);
e287086b 89int strv_make_nulstr(char **l, char **p, size_t *n);
21bc923a 90
44a6b1b6 91bool strv_overlap(char **a, char **b) _pure_;
0c85a4f3 92
60918275 93#define STRV_FOREACH(s, l) \
cba8922f 94 for ((s) = (l); (s) && *(s); (s)++)
60918275
LP
95
96#define STRV_FOREACH_BACKWARDS(s, l) \
ca5c4105
TG
97 STRV_FOREACH(s, l) \
98 ; \
99 for ((s)--; (l) && ((s) >= (l)); (s)--)
857a493d 100
246aa6dd 101#define STRV_FOREACH_PAIR(x, y, l) \
961e4526 102 for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
246aa6dd 103
857a493d 104char **strv_sort(char **l);
7c2d8094 105void strv_print(char **l);
250a918d 106
897e7561
LP
107#define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
108
109#define STRV_MAKE_EMPTY ((char*[1]) { NULL })
110
250a918d
LP
111#define strv_from_stdarg_alloca(first) \
112 ({ \
113 char **_l; \
114 \
115 if (!first) \
897e7561 116 _l = (char**) &first; \
250a918d
LP
117 else { \
118 unsigned _n; \
119 va_list _ap; \
120 \
121 _n = 1; \
122 va_start(_ap, first); \
123 while (va_arg(_ap, char*)) \
124 _n++; \
125 va_end(_ap); \
126 \
127 _l = newa(char*, _n+1); \
128 _l[_n = 0] = (char*) first; \
129 va_start(_ap, first); \
130 for (;;) { \
131 _l[++_n] = va_arg(_ap, char*); \
132 if (!_l[_n]) \
133 break; \
134 } \
135 va_end(_ap); \
136 } \
137 _l; \
138 })
53ede806
LP
139
140#define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
c4a7b2c5
LP
141
142#define FOREACH_STRING(x, ...) \
143 for (char **_l = ({ \
144 char **_ll = STRV_MAKE(__VA_ARGS__); \
145 x = _ll ? _ll[0] : NULL; \
146 _ll; \
147 }); \
148 _l && *_l; \
149 x = ({ \
150 _l ++; \
151 _l[0]; \
152 }))
e1dd6790
LP
153
154char **strv_reverse(char **l);
04c14b25 155char **strv_shell_escape(char **l, const char *bad);
bceccd5e 156
2404701e 157bool strv_fnmatch(char* const* patterns, const char *s, int flags);
bceccd5e 158
2404701e 159static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
bceccd5e
ZJS
160 assert(s);
161 return strv_isempty(patterns) ||
2404701e 162 strv_fnmatch(patterns, s, flags);
bceccd5e 163}
fe382237
LP
164
165char ***strv_free_free(char ***l);
e3ead6bb
LP
166
167char **strv_skip(char **l, size_t n);
8dd4c05b
LP
168
169int strv_extend_n(char ***l, const char *value, size_t n);
3df9bec5
LP
170
171int fputstrv(FILE *f, char **l, const char *separator, bool *space);