From 6658f7c7920856d638028cd6b9932f14f65b42e1 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Tue, 30 Aug 2022 15:21:05 +0200 Subject: [PATCH] basic: Add strv_extend_assignment() --- src/basic/strv.c | 16 ++++++++++++++++ src/basic/strv.h | 2 ++ src/test/test-strv.c | 12 ++++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/basic/strv.c b/src/basic/strv.c index 74e87046cc..2b7a61d442 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -789,6 +789,22 @@ rollback: return -ENOMEM; } +int strv_extend_assignment(char ***l, const char *lhs, const char *rhs) { + char *j; + + assert(l); + assert(lhs); + + if (!rhs) /* value is optional, in which case we suppress the field */ + return 0; + + j = strjoin(lhs, "=", rhs); + if (!j) + return -ENOMEM; + + return strv_consume(l, j); +} + int fputstrv(FILE *f, char * const *l, const char *separator, bool *space) { bool b = false; int r; diff --git a/src/basic/strv.h b/src/basic/strv.h index f82c76589d..1f8da85fcc 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -241,6 +241,8 @@ char** strv_skip(char **l, size_t n); int strv_extend_n(char ***l, const char *value, size_t n); +int strv_extend_assignment(char ***l, const char *lhs, const char *rhs); + int fputstrv(FILE *f, char * const *l, const char *separator, bool *space); #define strv_free_and_replace(a, b) \ diff --git a/src/test/test-strv.c b/src/test/test-strv.c index 9208faafa4..5c03eaa960 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -942,4 +942,16 @@ TEST(strv_fnmatch) { assert_se(pos == 1); } +TEST(strv_extend_join) { + _cleanup_strv_free_ char **v = NULL; + + assert_se(strv_extend_assignment(&v, "MESSAGE", "ABC") >= 0); + assert_se(strv_extend_assignment(&v, "ABC", "QER") >= 0); + assert_se(strv_extend_assignment(&v, "MISSING", NULL) >= 0); + + assert_se(strv_length(v) == 2); + assert_se(streq(v[0], "MESSAGE=ABC")); + assert_se(streq(v[1], "ABC=QER")); +} + DEFINE_TEST_MAIN(LOG_INFO);