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