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