]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
strv-util: add strv_filter_prefix() helper
authorLennart Poettering <lennart@poettering.net>
Thu, 6 Feb 2025 11:00:10 +0000 (12:00 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 17 Feb 2025 14:00:00 +0000 (15:00 +0100)
src/basic/strv.c
src/basic/strv.h
src/test/test-strv.c

index 1eea73fa7b7a746bf07ab7351ae1f2ffa89c75d8..d81c9f127c95a79bf20c70742f3b87a2c94bd7ae 100644 (file)
@@ -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);
+}
index 529afc386d137ef339e326c1f7fb7def0e70cb47..64787237157171de9645cceba55300c5dc1c67e1 100644 (file)
@@ -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);
index b1d30d73a546fca6ee4914e58978a907866a201e..f0e9031b9a1695397a8cc6deaf0a430f72d88060 100644 (file)
@@ -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);