]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/strv.h
util: Add shell_escape
[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
dd9c7723
TG
38void strv_clear(char **l);
39
b231b547 40char **strv_copy(char * const *l);
44a6b1b6 41unsigned strv_length(char * const *l) _pure_;
60918275 42
e3e45d4f
SP
43int strv_extend_strv(char ***a, char **b);
44int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
5926ccca 45int strv_extend(char ***l, const char *value);
20e265d4 46int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
4468addc 47int strv_push(char ***l, char *value);
98940a3c 48int strv_push_pair(char ***l, char *a, char *b);
9a00f57a 49int strv_push_prepend(char ***l, char *value);
6e18964d 50int strv_consume(char ***l, char *value);
98940a3c 51int strv_consume_pair(char ***l, char *a, char *b);
9a00f57a 52int strv_consume_prepend(char ***l, char *value);
034c6ed7 53
5f9a22c3
LP
54char **strv_remove(char **l, const char *s);
55char **strv_uniq(char **l);
e1dd6790 56bool strv_is_uniq(char **l);
5f9a22c3 57
0f84a72e
DH
58bool strv_equal(char **a, char **b);
59
5f9a22c3 60#define strv_contains(l, s) (!!strv_find((l), (s)))
cba8922f 61
b231b547
ZJS
62char **strv_new(const char *x, ...) _sentinel_;
63char **strv_new_ap(const char *x, va_list ap);
60918275 64
07719a21
LP
65static inline const char* STRV_IFNOTNULL(const char *x) {
66 return x ? x : (const char *) -1;
67}
68
2fd9ae2e 69static inline bool strv_isempty(char * const *l) {
5f9a22c3
LP
70 return !l || !*l;
71}
72
b231b547 73char **strv_split(const char *s, const char *separator);
b231b547 74char **strv_split_newlines(const char *s);
5f9a22c3 75
8adaf7bd 76int strv_split_extract(char ***t, const char *s, const char *separators, ExtractFlags flags);
f88e6be5 77
b231b547 78char *strv_join(char **l, const char *separator);
a6fde353 79char *strv_join_quoted(char **l);
5f9a22c3 80
21bc923a 81char **strv_parse_nulstr(const char *s, size_t l);
fabe5c0e 82char **strv_split_nulstr(const char *s);
21bc923a 83
44a6b1b6 84bool strv_overlap(char **a, char **b) _pure_;
0c85a4f3 85
60918275 86#define STRV_FOREACH(s, l) \
cba8922f 87 for ((s) = (l); (s) && *(s); (s)++)
60918275
LP
88
89#define STRV_FOREACH_BACKWARDS(s, l) \
ca5c4105
TG
90 STRV_FOREACH(s, l) \
91 ; \
92 for ((s)--; (l) && ((s) >= (l)); (s)--)
857a493d 93
246aa6dd 94#define STRV_FOREACH_PAIR(x, y, l) \
961e4526 95 for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
246aa6dd 96
857a493d 97char **strv_sort(char **l);
7c2d8094 98void strv_print(char **l);
250a918d 99
897e7561
LP
100#define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
101
102#define STRV_MAKE_EMPTY ((char*[1]) { NULL })
103
250a918d
LP
104#define strv_from_stdarg_alloca(first) \
105 ({ \
106 char **_l; \
107 \
108 if (!first) \
897e7561 109 _l = (char**) &first; \
250a918d
LP
110 else { \
111 unsigned _n; \
112 va_list _ap; \
113 \
114 _n = 1; \
115 va_start(_ap, first); \
116 while (va_arg(_ap, char*)) \
117 _n++; \
118 va_end(_ap); \
119 \
120 _l = newa(char*, _n+1); \
121 _l[_n = 0] = (char*) first; \
122 va_start(_ap, first); \
123 for (;;) { \
124 _l[++_n] = va_arg(_ap, char*); \
125 if (!_l[_n]) \
126 break; \
127 } \
128 va_end(_ap); \
129 } \
130 _l; \
131 })
53ede806
LP
132
133#define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
c4a7b2c5
LP
134
135#define FOREACH_STRING(x, ...) \
136 for (char **_l = ({ \
137 char **_ll = STRV_MAKE(__VA_ARGS__); \
138 x = _ll ? _ll[0] : NULL; \
139 _ll; \
140 }); \
141 _l && *_l; \
142 x = ({ \
143 _l ++; \
144 _l[0]; \
145 }))
e1dd6790
LP
146
147char **strv_reverse(char **l);
bceccd5e 148
2404701e 149bool strv_fnmatch(char* const* patterns, const char *s, int flags);
bceccd5e 150
2404701e 151static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
bceccd5e
ZJS
152 assert(s);
153 return strv_isempty(patterns) ||
2404701e 154 strv_fnmatch(patterns, s, flags);
bceccd5e 155}