diff options
Diffstat (limited to 'src/basic/nulstr-util.h')
-rw-r--r-- | src/basic/nulstr-util.h | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/basic/nulstr-util.h b/src/basic/nulstr-util.h new file mode 100644 index 0000000..d7bc5fd --- /dev/null +++ b/src/basic/nulstr-util.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include <errno.h> +#include <macro.h> +#include <stdbool.h> +#include <string.h> + +#include "set.h" + +#define NULSTR_FOREACH(i, l) \ + for (typeof(*(l)) *(i) = (l); (i) && *(i); (i) = strchr((i), 0)+1) + +#define NULSTR_FOREACH_PAIR(i, j, l) \ + for (typeof(*(l)) *(i) = (l), *(j) = strchr((i), 0)+1; (i) && *(i); (i) = strchr((j), 0)+1, (j) = *(i) ? strchr((i), 0)+1 : (i)) + +const char* nulstr_get(const char *nulstr, const char *needle); + +static inline bool nulstr_contains(const char *nulstr, const char *needle) { + return nulstr_get(nulstr, needle); +} + +char** strv_parse_nulstr_full(const char *s, size_t l, bool drop_trailing_nuls); +static inline char** strv_parse_nulstr(const char *s, size_t l) { + return strv_parse_nulstr_full(s, l, false); +} +char** strv_split_nulstr(const char *s); +int strv_make_nulstr(char * const *l, char **p, size_t *n); +int set_make_nulstr(Set *s, char **ret, size_t *ret_size); + +static inline int strv_from_nulstr(char ***ret, const char *nulstr) { + char **t; + + assert(ret); + + t = strv_split_nulstr(nulstr); + if (!t) + return -ENOMEM; + + *ret = t; + return 0; +} |