From: Daan De Meyer Date: Tue, 30 Aug 2022 13:21:05 +0000 (+0200) Subject: basic: Add strv_extend_assignment() X-Git-Tag: v253-rc1~56^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6658f7c7920856d638028cd6b9932f14f65b42e1;p=thirdparty%2Fsystemd.git basic: Add strv_extend_assignment() --- diff --git a/src/basic/strv.c b/src/basic/strv.c index 74e87046cca..2b7a61d442b 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 f82c76589d0..1f8da85fccd 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 9208faafa47..5c03eaa960b 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);