From: Lennart Poettering Date: Thu, 6 Feb 2025 11:00:10 +0000 (+0100) Subject: strv-util: add strv_filter_prefix() helper X-Git-Tag: v258-rc1~1322^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=428146dc89506725f777ae82d288439340926a83;p=thirdparty%2Fsystemd.git strv-util: add strv_filter_prefix() helper --- diff --git a/src/basic/strv.c b/src/basic/strv.c index 1eea73fa7b7..d81c9f127c9 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -1238,3 +1238,24 @@ int strv_rebreak_lines(char **l, size_t width, char ***ret) { *ret = TAKE_PTR(broken); return 0; } + +char** strv_filter_prefix(char *const*l, const char *prefix) { + _cleanup_strv_free_ char **f = NULL; + + /* Allocates a copy of 'l', but only copies over entries starting with 'prefix' */ + + if (isempty(prefix)) + return strv_copy(l); + + size_t sz = 0; + + STRV_FOREACH(i, l) { + if (!startswith(*i, prefix)) + continue; + + if (strv_extend_with_size(&f, &sz, *i) < 0) + return NULL; + } + + return TAKE_PTR(f); +} diff --git a/src/basic/strv.h b/src/basic/strv.h index 529afc386d1..64787237157 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -268,3 +268,5 @@ int _string_strv_ordered_hashmap_put(OrderedHashmap **h, const char *key, const #define string_strv_ordered_hashmap_put(h, k, v) _string_strv_ordered_hashmap_put(h, k, v HASHMAP_DEBUG_SRC_ARGS) int strv_rebreak_lines(char **l, size_t width, char ***ret); + +char** strv_filter_prefix(char *const*l, const char *prefix); diff --git a/src/test/test-strv.c b/src/test/test-strv.c index b1d30d73a54..f0e9031b9a1 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -1277,4 +1277,23 @@ TEST(strv_equal_ignore_order) { ASSERT_TRUE(strv_equal_ignore_order(STRV_MAKE("bar", "foo"), STRV_MAKE("bar", "foo", "bar", "foo", "foo"))); } +TEST(strv_filter_prefix) { + char **base = STRV_MAKE("foo", "bar", "baz", "foox", "zzz", "farb", "foerb"); + + _cleanup_strv_free_ char **x = ASSERT_PTR(strv_filter_prefix(base, "fo")); + ASSERT_TRUE(strv_equal(x, STRV_MAKE("foo", "foox", "foerb"))); + x = strv_free(x); + + x = ASSERT_PTR(strv_filter_prefix(base, "")); + ASSERT_TRUE(strv_equal(x, base)); + x = strv_free(x); + + x = ASSERT_PTR(strv_filter_prefix(base, "z")); + ASSERT_TRUE(strv_equal(x, STRV_MAKE("zzz"))); + x = strv_free(x); + + x = ASSERT_PTR(strv_filter_prefix(base, "zzz")); + ASSERT_TRUE(strv_equal(x, STRV_MAKE("zzz"))); +} + DEFINE_TEST_MAIN(LOG_INFO);