X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fbasic%2Fstrv.c;h=7757a444346725fa448bee8b8525eb443099aecd;hb=5f7e5870f06e8ffa0603ae971de74e3f3f6344e5;hp=d4a1b80d073c4a3fac5e8c83359ee9a7dbe171b6;hpb=64b485bf89b90042c9a624633b038ef417b0325e;p=elogind.git diff --git a/src/basic/strv.c b/src/basic/strv.c index d4a1b80d0..7757a4443 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,13 +17,20 @@ along with systemd; If not, see . ***/ -#include +#include +#include #include +#include +#include #include -#include -#include "util.h" +#include "alloc-util.h" +#include "escape.h" +#include "extract-word.h" +//#include "fileio.h" +#include "string-util.h" #include "strv.h" +#include "util.h" char *strv_find(char **l, const char *name) { char **i; @@ -86,6 +91,15 @@ char **strv_free(char **l) { return NULL; } +char **strv_free_erase(char **l) { + char **i; + + STRV_FOREACH(i, l) + string_erase(*i); + + return strv_free(l); +} + char **strv_copy(char * const *l) { char **r, **k; @@ -188,6 +202,7 @@ char **strv_new(const char *x, ...) { return r; } +#if 0 /// UNNEEDED by elogind int strv_extend_strv(char ***a, char **b, bool filter_duplicates) { char **s, **t; size_t p, q, i = 0, j; @@ -232,8 +247,6 @@ rollback: return -ENOMEM; } -/// UNNEEDED by elogind -#if 0 int strv_extend_strv_concat(char ***a, char **b, const char *suffix) { int r; char **s; @@ -287,8 +300,7 @@ char **strv_split(const char *s, const char *separator) { return r; } -/// UNNEEDED by elogind -#if 0 +#if 0 /// UNNEEDED by elogind char **strv_split_newlines(const char *s) { char **l; unsigned n; @@ -363,7 +375,7 @@ char *strv_join(char **l, const char *separator) { n = 0; STRV_FOREACH(s, l) { - if (n != 0) + if (s != l) n += k; n += strlen(*s); } @@ -374,7 +386,7 @@ char *strv_join(char **l, const char *separator) { e = r; STRV_FOREACH(s, l) { - if (e != r) + if (s != l) e = stpcpy(e, separator); e = stpcpy(e, *s); @@ -385,8 +397,7 @@ char *strv_join(char **l, const char *separator) { return r; } -/// UNNEEDED by elogind -#if 0 +#if 0 /// UNNEEDED by elogind char *strv_join_quoted(char **l) { char *buf = NULL; char **s; @@ -518,8 +529,7 @@ int strv_consume(char ***l, char *value) { return r; } -/// UNNEEDED by elogind -#if 0 +#if 0 /// UNNEEDED by elogind int strv_consume_pair(char ***l, char *a, char *b) { int r; @@ -556,6 +566,42 @@ int strv_extend(char ***l, const char *value) { return strv_consume(l, v); } +int strv_extend_front(char ***l, const char *value) { + size_t n, m; + char *v, **c; + + assert(l); + + /* Like strv_extend(), but prepends rather than appends the new entry */ + + if (!value) + return 0; + + n = strv_length(*l); + + /* Increase and overflow check. */ + m = n + 2; + if (m < n) + return -ENOMEM; + + v = strdup(value); + if (!v) + return -ENOMEM; + + c = realloc_multiply(*l, sizeof(char*), m); + if (!c) { + free(v); + return -ENOMEM; + } + + memmove(c+1, c, n * sizeof(char*)); + c[0] = v; + c[n+1] = NULL; + + *l = c; + return 0; +} + char **strv_uniq(char **l) { char **i; @@ -568,8 +614,7 @@ char **strv_uniq(char **l) { return l; } -/// UNNEEDED by elogind -#if 0 +#if 0 /// UNNEEDED by elogind bool strv_is_uniq(char **l) { char **i; @@ -664,6 +709,7 @@ char **strv_split_nulstr(const char *s) { return r; } +#if 0 /// UNNEEDED by elogind int strv_make_nulstr(char **l, char **p, size_t *q) { size_t n_allocated = 0, n = 0; _cleanup_free_ char *m = NULL; @@ -699,8 +745,6 @@ int strv_make_nulstr(char **l, char **p, size_t *q) { return 0; } -/// UNNEEDED by elogind -#if 0 bool strv_overlap(char **a, char **b) { char **i; @@ -710,6 +754,7 @@ bool strv_overlap(char **a, char **b) { return false; } +#endif // 0 static int str_compare(const void *_a, const void *_b) { const char **a = (const char**) _a, **b = (const char**) _b; @@ -726,6 +771,7 @@ char **strv_sort(char **l) { return l; } +#if 0 /// UNNEEDED by elogind bool strv_equal(char **a, char **b) { if (strv_isempty(a)) @@ -800,7 +846,6 @@ char **strv_shell_escape(char **l, const char *bad) { return l; } -#endif // 0 bool strv_fnmatch(char* const* patterns, const char *s, int flags) { char* const* p; @@ -874,3 +919,23 @@ rollback: nl[k] = NULL; return -ENOMEM; } + +int fputstrv(FILE *f, char **l, const char *separator, bool *space) { + bool b = false; + char **s; + int r; + + /* Like fputs(), but for strv, and with a less stupid argument order */ + + if (!space) + space = &b; + + STRV_FOREACH(s, l) { + r = fputs_with_space(f, *s, separator, space); + if (r < 0) + return r; + } + + return 0; +} +#endif // 0