LCOV - code coverage report
Current view: top level - basic - strv.h (source / functions) Hit Total Coverage
Test: systemd test coverage Lines: 9 9 100.0 %
Date: 2015-07-29 18:47:03 Functions: 4 4 100.0 %

          Line data    Source code
       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 <stdarg.h>
      25             : #include <stdbool.h>
      26             : #include <fnmatch.h>
      27             : 
      28             : #include "util.h"
      29             : 
      30             : char *strv_find(char **l, const char *name) _pure_;
      31             : char *strv_find_prefix(char **l, const char *name) _pure_;
      32             : char *strv_find_startswith(char **l, const char *name) _pure_;
      33             : 
      34             : char **strv_free(char **l);
      35       34209 : DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free);
      36             : #define _cleanup_strv_free_ _cleanup_(strv_freep)
      37             : 
      38             : void strv_clear(char **l);
      39             : 
      40             : char **strv_copy(char * const *l);
      41             : unsigned strv_length(char * const *l) _pure_;
      42             : 
      43             : int strv_extend_strv(char ***a, char **b);
      44             : int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
      45             : int strv_extend(char ***l, const char *value);
      46             : int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
      47             : int strv_push(char ***l, char *value);
      48             : int strv_push_pair(char ***l, char *a, char *b);
      49             : int strv_push_prepend(char ***l, char *value);
      50             : int strv_consume(char ***l, char *value);
      51             : int strv_consume_pair(char ***l, char *a, char *b);
      52             : int strv_consume_prepend(char ***l, char *value);
      53             : 
      54             : char **strv_remove(char **l, const char *s);
      55             : char **strv_uniq(char **l);
      56             : bool strv_is_uniq(char **l);
      57             : 
      58             : bool strv_equal(char **a, char **b);
      59             : 
      60             : #define strv_contains(l, s) (!!strv_find((l), (s)))
      61             : 
      62             : char **strv_new(const char *x, ...) _sentinel_;
      63             : char **strv_new_ap(const char *x, va_list ap);
      64             : 
      65          12 : static inline const char* STRV_IFNOTNULL(const char *x) {
      66          12 :         return x ? x : (const char *) -1;
      67             : }
      68             : 
      69        2026 : static inline bool strv_isempty(char * const *l) {
      70        2026 :         return !l || !*l;
      71             : }
      72             : 
      73             : char **strv_split(const char *s, const char *separator);
      74             : char **strv_split_newlines(const char *s);
      75             : 
      76             : int strv_split_quoted(char ***t, const char *s, UnquoteFlags flags);
      77             : 
      78             : char *strv_join(char **l, const char *separator);
      79             : char *strv_join_quoted(char **l);
      80             : 
      81             : char **strv_parse_nulstr(const char *s, size_t l);
      82             : char **strv_split_nulstr(const char *s);
      83             : 
      84             : bool strv_overlap(char **a, char **b) _pure_;
      85             : 
      86             : #define STRV_FOREACH(s, l)                      \
      87             :         for ((s) = (l); (s) && *(s); (s)++)
      88             : 
      89             : #define STRV_FOREACH_BACKWARDS(s, l)            \
      90             :         STRV_FOREACH(s, l)                      \
      91             :                 ;                               \
      92             :         for ((s)--; (l) && ((s) >= (l)); (s)--)
      93             : 
      94             : #define STRV_FOREACH_PAIR(x, y, l)               \
      95             :         for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
      96             : 
      97             : char **strv_sort(char **l);
      98             : void strv_print(char **l);
      99             : 
     100             : #define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL }))
     101             : 
     102             : #define STRV_MAKE_EMPTY ((char*[1]) { NULL })
     103             : 
     104             : #define strv_from_stdarg_alloca(first)                          \
     105             :         ({                                                      \
     106             :                 char **_l;                                      \
     107             :                                                                 \
     108             :                 if (!first)                                     \
     109             :                         _l = (char**) &first;                   \
     110             :                 else {                                          \
     111             :                         unsigned _n;                            \
     112             :                         va_list _ap;                            \
     113             :                                                                 \
     114             :                         _n = 1;                                 \
     115             :                         va_start(_ap, first);                   \
     116             :                         while (va_arg(_ap, char*))              \
     117             :                                 _n++;                           \
     118             :                         va_end(_ap);                            \
     119             :                                                                 \
     120             :                         _l = newa(char*, _n+1);                 \
     121             :                         _l[_n = 0] = (char*) first;             \
     122             :                         va_start(_ap, first);                   \
     123             :                         for (;;) {                              \
     124             :                                 _l[++_n] = va_arg(_ap, char*);  \
     125             :                                 if (!_l[_n])                    \
     126             :                                         break;                  \
     127             :                         }                                       \
     128             :                         va_end(_ap);                            \
     129             :                 }                                               \
     130             :                 _l;                                             \
     131             :         })
     132             : 
     133             : #define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
     134             : 
     135             : #define FOREACH_STRING(x, ...)                               \
     136             :         for (char **_l = ({                                  \
     137             :                 char **_ll = STRV_MAKE(__VA_ARGS__);         \
     138             :                 x = _ll ? _ll[0] : NULL;                     \
     139             :                 _ll;                                         \
     140             :         });                                                  \
     141             :         _l && *_l;                                           \
     142             :         x = ({                                               \
     143             :                 _l ++;                                       \
     144             :                 _l[0];                                       \
     145             :         }))
     146             : 
     147             : char **strv_reverse(char **l);
     148             : 
     149             : bool strv_fnmatch(char* const* patterns, const char *s, int flags);
     150             : 
     151           1 : static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, int flags) {
     152           1 :         assert(s);
     153           2 :         return strv_isempty(patterns) ||
     154           1 :                strv_fnmatch(patterns, s, flags);
     155             : }

Generated by: LCOV version 1.11