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