]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/strv.h
tree-wide: whenever we deal with passwords, erase them from memory after use
[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
e287086b 43int strv_extend_strv(char ***a, char **b, bool filter_duplicates);
e3e45d4f 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);
e287086b 83int strv_make_nulstr(char **l, char **p, size_t *n);
21bc923a 84
44a6b1b6 85bool strv_overlap(char **a, char **b) _pure_;
0c85a4f3 86
60918275 87#define STRV_FOREACH(s, l) \
cba8922f 88 for ((s) = (l); (s) && *(s); (s)++)
60918275
LP
89
90#define STRV_FOREACH_BACKWARDS(s, l) \
ca5c4105
TG
91 STRV_FOREACH(s, l) \
92 ; \
93 for ((s)--; (l) && ((s) >= (l)); (s)--)
857a493d 94
246aa6dd 95#define STRV_FOREACH_PAIR(x, y, l) \
961e4526 96 for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
246aa6dd 97
857a493d 98char **strv_sort(char **l);
7c2d8094 99void strv_print(char **l);
250a918d 100
897e7561
LP
101#define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
102
103#define STRV_MAKE_EMPTY ((char*[1]) { NULL })
104
250a918d
LP
105#define strv_from_stdarg_alloca(first) \
106 ({ \
107 char **_l; \
108 \
109 if (!first) \
897e7561 110 _l = (char**) &first; \
250a918d
LP
111 else { \
112 unsigned _n; \
113 va_list _ap; \
114 \
115 _n = 1; \
116 va_start(_ap, first); \
117 while (va_arg(_ap, char*)) \
118 _n++; \
119 va_end(_ap); \
120 \
121 _l = newa(char*, _n+1); \
122 _l[_n = 0] = (char*) first; \
123 va_start(_ap, first); \
124 for (;;) { \
125 _l[++_n] = va_arg(_ap, char*); \
126 if (!_l[_n]) \
127 break; \
128 } \
129 va_end(_ap); \
130 } \
131 _l; \
132 })
53ede806
LP
133
134#define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
c4a7b2c5
LP
135
136#define FOREACH_STRING(x, ...) \
137 for (char **_l = ({ \
138 char **_ll = STRV_MAKE(__VA_ARGS__); \
139 x = _ll ? _ll[0] : NULL; \
140 _ll; \
141 }); \
142 _l && *_l; \
143 x = ({ \
144 _l ++; \
145 _l[0]; \
146 }))
e1dd6790
LP
147
148char **strv_reverse(char **l);
04c14b25 149char **strv_shell_escape(char **l, const char *bad);
bceccd5e 150
2404701e 151bool strv_fnmatch(char* const* patterns, const char *s, int flags);
bceccd5e 152
2404701e 153static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
bceccd5e
ZJS
154 assert(s);
155 return strv_isempty(patterns) ||
2404701e 156 strv_fnmatch(patterns, s, flags);
bceccd5e 157}
fe382237
LP
158
159char ***strv_free_free(char ***l);
e3ead6bb
LP
160
161char **strv_skip(char **l, size_t n);
8dd4c05b
LP
162
163int strv_extend_n(char ***l, const char *value, size_t n);