summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-07-18 20:22:29 +0200
committerLennart Poettering <lennart@poettering.net>2013-07-18 20:22:29 +0200
commitd4ac85c6f6d8547f8b835009ae431438de72df28 (patch)
treec18be6d1c1af7efaa740beeac594be8cd61d62e9 /src
parent2f5df74a5ec135ab2baebf26af6f088e5b4b8205 (diff)
util: add split_pair() for splitting foo=bar strings
Diffstat (limited to 'src')
-rw-r--r--src/shared/util.c31
-rw-r--r--src/shared/util.h2
-rw-r--r--src/test/test-util.c23
3 files changed, 56 insertions, 0 deletions
diff --git a/src/shared/util.c b/src/shared/util.c
index 5b602ea46d..c8ed53c8b6 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 fac08ca43c..ac999c624c 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 4768310fbe..315bc419c2 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;
}