*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);
+}
#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);
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);