From: Lennart Poettering Date: Thu, 18 Jul 2013 18:22:29 +0000 (+0200) Subject: util: add split_pair() for splitting foo=bar strings X-Git-Tag: v206~40 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=d4ac85c6f6d8547f8b835009ae431438de72df28 util: add split_pair() for splitting foo=bar strings --- diff --git a/src/shared/util.c b/src/shared/util.c index 5b602ea46..c8ed53c8b 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -5946,3 +5946,34 @@ void parse_user_at_host(char *arg, char **user, char **host) { *user = arg; } } + +int split_pair(const char *s, const char *sep, char **l, char **r) { + char *x, *a, *b; + + assert(s); + assert(sep); + assert(l); + assert(r); + + if (isempty(sep)) + return -EINVAL; + + x = strstr(s, sep); + if (!x) + return -EINVAL; + + a = strndup(s, x - s); + if (!a) + return -ENOMEM; + + b = strdup(x + strlen(sep)); + if (!b) { + free(a); + return -ENOMEM; + } + + *l = a; + *r = b; + + return 0; +} diff --git a/src/shared/util.h b/src/shared/util.h index fac08ca43..ac999c624 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -735,3 +735,5 @@ static inline void _reset_locale_(struct _locale_struct_ *s) { bool id128_is_valid(const char *s) _pure_; void parse_user_at_host(char *arg, char **user, char **host); + +int split_pair(const char *s, const char *sep, char **l, char **r); diff --git a/src/test/test-util.c b/src/test/test-util.c index 4768310fb..315bc419c 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -521,6 +521,28 @@ static void test_parse_user_at_host(void) { assert_se(streq(host, "mikescomputer")); } +static void test_split_pair(void) { + _cleanup_free_ char *a = NULL, *b = NULL; + + assert_se(split_pair("", "", &a, &b) == -EINVAL); + assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL); + assert_se(split_pair("", "=", &a, &b) == -EINVAL); + assert_se(split_pair("foo=bar", "=", &a, &b) >= 0); + assert_se(streq(a, "foo")); + assert_se(streq(b, "bar")); + free(a); + free(b); + assert_se(split_pair("==", "==", &a, &b) >= 0); + assert_se(streq(a, "")); + assert_se(streq(b, "")); + free(a); + free(b); + + assert_se(split_pair("===", "==", &a, &b) >= 0); + assert_se(streq(a, "")); + assert_se(streq(b, "=")); +} + int main(int argc, char *argv[]) { test_streq_ptr(); test_first_word(); @@ -555,6 +577,7 @@ int main(int argc, char *argv[]) { test_strextend(); test_strrep(); test_parse_user_at_host(); + test_split_pair(); return 0; }