]> git.ipfire.org Git - thirdparty/systemd.git/blame_incremental - src/basic/strv.h
Merge pull request #2074 from keszybz/test-acl-util-fix
[thirdparty/systemd.git] / src / basic / strv.h
... / ...
CommitLineData
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3#pragma once
4
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
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
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
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
24#include <fnmatch.h>
25#include <stdarg.h>
26#include <stdbool.h>
27#include <stddef.h>
28
29#include "extract-word.h"
30#include "alloc-util.h"
31#include "macro.h"
32#include "util.h"
33
34char *strv_find(char **l, const char *name) _pure_;
35char *strv_find_prefix(char **l, const char *name) _pure_;
36char *strv_find_startswith(char **l, const char *name) _pure_;
37
38char **strv_free(char **l);
39DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free);
40#define _cleanup_strv_free_ _cleanup_(strv_freep)
41
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
46void strv_clear(char **l);
47
48char **strv_copy(char * const *l);
49unsigned strv_length(char * const *l) _pure_;
50
51int strv_extend_strv(char ***a, char **b, bool filter_duplicates);
52int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
53int strv_extend(char ***l, const char *value);
54int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
55int strv_push(char ***l, char *value);
56int strv_push_pair(char ***l, char *a, char *b);
57int strv_push_prepend(char ***l, char *value);
58int strv_consume(char ***l, char *value);
59int strv_consume_pair(char ***l, char *a, char *b);
60int strv_consume_prepend(char ***l, char *value);
61
62char **strv_remove(char **l, const char *s);
63char **strv_uniq(char **l);
64bool strv_is_uniq(char **l);
65
66bool strv_equal(char **a, char **b);
67
68#define strv_contains(l, s) (!!strv_find((l), (s)))
69
70char **strv_new(const char *x, ...) _sentinel_;
71char **strv_new_ap(const char *x, va_list ap);
72
73static inline const char* STRV_IFNOTNULL(const char *x) {
74 return x ? x : (const char *) -1;
75}
76
77static inline bool strv_isempty(char * const *l) {
78 return !l || !*l;
79}
80
81char **strv_split(const char *s, const char *separator);
82char **strv_split_newlines(const char *s);
83
84int strv_split_extract(char ***t, const char *s, const char *separators, ExtractFlags flags);
85
86char *strv_join(char **l, const char *separator);
87char *strv_join_quoted(char **l);
88
89char **strv_parse_nulstr(const char *s, size_t l);
90char **strv_split_nulstr(const char *s);
91int strv_make_nulstr(char **l, char **p, size_t *n);
92
93bool strv_overlap(char **a, char **b) _pure_;
94
95#define STRV_FOREACH(s, l) \
96 for ((s) = (l); (s) && *(s); (s)++)
97
98#define STRV_FOREACH_BACKWARDS(s, l) \
99 STRV_FOREACH(s, l) \
100 ; \
101 for ((s)--; (l) && ((s) >= (l)); (s)--)
102
103#define STRV_FOREACH_PAIR(x, y, l) \
104 for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
105
106char **strv_sort(char **l);
107void strv_print(char **l);
108
109#define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
110
111#define STRV_MAKE_EMPTY ((char*[1]) { NULL })
112
113#define strv_from_stdarg_alloca(first) \
114 ({ \
115 char **_l; \
116 \
117 if (!first) \
118 _l = (char**) &first; \
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 })
141
142#define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
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 }))
155
156char **strv_reverse(char **l);
157char **strv_shell_escape(char **l, const char *bad);
158
159bool strv_fnmatch(char* const* patterns, const char *s, int flags);
160
161static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
162 assert(s);
163 return strv_isempty(patterns) ||
164 strv_fnmatch(patterns, s, flags);
165}
166
167char ***strv_free_free(char ***l);
168
169char **strv_skip(char **l, size_t n);
170
171int strv_extend_n(char ***l, const char *value, size_t n);