1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
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.
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.
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/>.
31 char *strv_find(char **l, const char *name) {
43 char *strv_find_prefix(char **l, const char *name) {
49 if (startswith(*i, name))
55 void strv_free(char **l) {
67 void strv_freep(char ***l) {
75 char **strv_copy(char **l) {
78 k = r = new(char*, strv_length(l) + 1);
83 for (; *l; k++, l++) {
95 unsigned strv_length(char **l) {
107 char **strv_new_ap(const char *x, va_list ap) {
110 unsigned n = 0, i = 0;
113 /* As a special trick we ignore all listed strings that equal
114 * (const char*) -1. This is supposed to be used with the
115 * STRV_IFNOTNULL() macro to include possibly NULL strings in
116 * the string list. */
119 n = x == (const char*) -1 ? 0 : 1;
122 while ((s = va_arg(aq, const char*))) {
123 if (s == (const char*) -1)
137 if (x != (const char*) -1) {
144 while ((s = va_arg(ap, const char*))) {
146 if (s == (const char*) -1)
166 char **strv_new(const char *x, ...) {
171 r = strv_new_ap(x, ap);
177 char **strv_merge(char **a, char **b) {
186 r = new(char*, strv_length(a) + strv_length(b) + 1);
190 for (k = r; *a; k++, a++) {
196 for (; *b; k++, b++) {
210 char **strv_merge_concat(char **a, char **b, const char *suffix) {
213 /* Like strv_merge(), but appends suffix to all strings in b, before adding */
218 r = new(char*, strv_length(a) + strv_length(b) + 1);
224 for (; *a; k++, a++) {
230 for (; *b; k++, b++) {
231 *k = strappend(*b, suffix);
245 char **strv_split(const char *s, const char *separator) {
255 FOREACH_WORD_SEPARATOR(w, l, s, separator, state)
263 FOREACH_WORD_SEPARATOR(w, l, s, separator, state) {
264 r[i] = strndup(w, l);
277 char **strv_split_quoted(const char *s) {
287 FOREACH_WORD_QUOTED(w, l, s, state)
295 FOREACH_WORD_QUOTED(w, l, s, state) {
296 r[i] = cunescape_length(w, l);
308 char **strv_split_newlines(const char *s) {
314 /* Special version of strv_split() that splits on newlines and
315 * suppresses an empty string at the end */
317 l = strv_split(s, NEWLINE);
325 if (isempty(l[n-1])) {
333 char *strv_join(char **l, const char *separator) {
341 k = strlen(separator);
357 e = stpcpy(e, separator);
367 char **strv_append(char **l, const char *s) {
371 return strv_new(s, NULL);
376 r = new(char*, strv_length(l)+2);
380 for (k = r; *l; k++, l++) {
398 int strv_extend(char ***l, const char *value) {
411 c = realloc(*l, sizeof(char*) * (n + 2));
424 char **strv_uniq(char **l) {
427 /* Drops duplicate entries. The first identical string will be
428 * kept, the others dropped */
431 strv_remove(i+1, *i);
436 char **strv_remove(char **l, const char *s) {
444 /* Drops every occurrence of s in the string list, edits
447 for (f = t = l; *f; f++) {
461 char **strv_remove_prefix(char **l, const char *s) {
469 /* Drops every occurrence of a string prefixed with s in the
470 * string list, edits in-place. */
472 for (f = t = l; *f; f++) {
474 if (startswith(*f, s)) {
486 char **strv_parse_nulstr(const char *s, size_t l) {
488 unsigned c = 0, i = 0;
494 return strv_new(NULL, NULL);
496 for (p = s; p < s + l; p++)
503 v = new0(char*, c+1);
511 e = memchr(p, 0, s + l - p);
513 v[i] = strndup(p, e ? e - p : s + l - p);
532 char **strv_split_nulstr(const char *s) {
537 if (strv_extend(&r, i) < 0) {
543 return strv_new(NULL, NULL);
548 bool strv_overlap(char **a, char **b) {
561 static int str_compare(const void *_a, const void *_b) {
562 const char **a = (const char**) _a, **b = (const char**) _b;
564 return strcmp(*a, *b);
567 char **strv_sort(char **l) {
572 qsort(l, strv_length(l), sizeof(char*), str_compare);
576 void strv_print(char **l) {