]> git.proxmox.com Git - systemd.git/blame - src/basic/strv.h
Merge tag 'upstream/229'
[systemd.git] / src / basic / strv.h
CommitLineData
663996b3
MS
1#pragma once
2
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
db2df898 22#include <fnmatch.h>
663996b3
MS
23#include <stdarg.h>
24#include <stdbool.h>
4c89c718 25#include <stddef.h>
663996b3 26
4c89c718 27#include "alloc-util.h"
db2df898 28#include "extract-word.h"
4c89c718 29#include "macro.h"
60f067b4 30#include "util.h"
663996b3
MS
31
32char *strv_find(char **l, const char *name) _pure_;
33char *strv_find_prefix(char **l, const char *name) _pure_;
5eef597e 34char *strv_find_startswith(char **l, const char *name) _pure_;
663996b3 35
e3bff60a 36char **strv_free(char **l);
60f067b4 37DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free);
663996b3
MS
38#define _cleanup_strv_free_ _cleanup_(strv_freep)
39
db2df898
MP
40char **strv_free_erase(char **l);
41DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free_erase);
42#define _cleanup_strv_free_erase_ _cleanup_(strv_free_erasep)
43
e735f4d4
MP
44void strv_clear(char **l);
45
663996b3
MS
46char **strv_copy(char * const *l);
47unsigned strv_length(char * const *l) _pure_;
48
6300502b 49int strv_extend_strv(char ***a, char **b, bool filter_duplicates);
60f067b4 50int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
663996b3 51int strv_extend(char ***l, const char *value);
60f067b4 52int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
663996b3 53int strv_push(char ***l, char *value);
f47781d8 54int strv_push_pair(char ***l, char *a, char *b);
e842803a 55int strv_push_prepend(char ***l, char *value);
60f067b4 56int strv_consume(char ***l, char *value);
f47781d8 57int strv_consume_pair(char ***l, char *a, char *b);
e842803a 58int strv_consume_prepend(char ***l, char *value);
663996b3
MS
59
60char **strv_remove(char **l, const char *s);
663996b3 61char **strv_uniq(char **l);
e735f4d4 62bool strv_is_uniq(char **l);
663996b3 63
f47781d8
MP
64bool strv_equal(char **a, char **b);
65
663996b3
MS
66#define strv_contains(l, s) (!!strv_find((l), (s)))
67
68char **strv_new(const char *x, ...) _sentinel_;
69char **strv_new_ap(const char *x, va_list ap);
70
71static inline const char* STRV_IFNOTNULL(const char *x) {
72 return x ? x : (const char *) -1;
73}
74
75static inline bool strv_isempty(char * const *l) {
76 return !l || !*l;
77}
78
79char **strv_split(const char *s, const char *separator);
663996b3
MS
80char **strv_split_newlines(const char *s);
81
13d276d0 82int strv_split_extract(char ***t, const char *s, const char *separators, ExtractFlags flags);
f47781d8 83
663996b3 84char *strv_join(char **l, const char *separator);
14228c0d 85char *strv_join_quoted(char **l);
663996b3
MS
86
87char **strv_parse_nulstr(const char *s, size_t l);
88char **strv_split_nulstr(const char *s);
6300502b 89int strv_make_nulstr(char **l, char **p, size_t *n);
663996b3
MS
90
91bool strv_overlap(char **a, char **b) _pure_;
92
93#define STRV_FOREACH(s, l) \
94 for ((s) = (l); (s) && *(s); (s)++)
95
96#define STRV_FOREACH_BACKWARDS(s, l) \
60f067b4
JS
97 STRV_FOREACH(s, l) \
98 ; \
99 for ((s)--; (l) && ((s) >= (l)); (s)--)
663996b3
MS
100
101#define STRV_FOREACH_PAIR(x, y, l) \
102 for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
103
663996b3
MS
104char **strv_sort(char **l);
105void strv_print(char **l);
60f067b4
JS
106
107#define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
108
109#define STRV_MAKE_EMPTY ((char*[1]) { NULL })
110
111#define strv_from_stdarg_alloca(first) \
112 ({ \
113 char **_l; \
114 \
115 if (!first) \
116 _l = (char**) &first; \
117 else { \
118 unsigned _n; \
119 va_list _ap; \
120 \
121 _n = 1; \
122 va_start(_ap, first); \
123 while (va_arg(_ap, char*)) \
124 _n++; \
125 va_end(_ap); \
126 \
127 _l = newa(char*, _n+1); \
128 _l[_n = 0] = (char*) first; \
129 va_start(_ap, first); \
130 for (;;) { \
131 _l[++_n] = va_arg(_ap, char*); \
132 if (!_l[_n]) \
133 break; \
134 } \
135 va_end(_ap); \
136 } \
137 _l; \
138 })
139
140#define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
141
142#define FOREACH_STRING(x, ...) \
143 for (char **_l = ({ \
144 char **_ll = STRV_MAKE(__VA_ARGS__); \
145 x = _ll ? _ll[0] : NULL; \
146 _ll; \
147 }); \
148 _l && *_l; \
149 x = ({ \
150 _l ++; \
151 _l[0]; \
152 }))
e735f4d4
MP
153
154char **strv_reverse(char **l);
13d276d0 155char **strv_shell_escape(char **l, const char *bad);
e735f4d4
MP
156
157bool strv_fnmatch(char* const* patterns, const char *s, int flags);
158
159static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
160 assert(s);
161 return strv_isempty(patterns) ||
162 strv_fnmatch(patterns, s, flags);
163}
6300502b
MP
164
165char ***strv_free_free(char ***l);
166
167char **strv_skip(char **l, size_t n);
168
169int strv_extend_n(char ***l, const char *value, size_t n);
4c89c718
MP
170
171int fputstrv(FILE *f, char **l, const char *separator, bool *space);