From 6563b66a92c770e6eb0db1f75e64f0167d086348 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 22 Apr 2025 14:16:05 +1000 Subject: [PATCH] utils: add strv_find() Finds and optionally returns the index of a string in a strv Part-of: --- src/util-strings.c | 21 +++++++++++++++++++++ src/util-strings.h | 2 ++ test/test-utils.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/util-strings.c b/src/util-strings.c index e7e68163..9a6a15e0 100644 --- a/src/util-strings.c +++ b/src/util-strings.c @@ -290,6 +290,27 @@ int strv_for_each(const char **strv, strv_foreach_callback_t func, void *data) return strv_for_each_n(strv, SIZE_MAX, func, data); } +bool +strv_find(char **strv, const char *needle, size_t *index_out) +{ + if (!strv) + return false; + + size_t index = 0; + char **s = strv; + while (*s != NULL) { + if (streq(*s, needle)) { + if (index_out) + *index_out = index; + return true; + } + s++; + index++; + } + + return false; +} + /** * Return a pointer to the basename within filename. * If the filename the empty string or a directory (i.e. the last char of diff --git a/src/util-strings.h b/src/util-strings.h index c245f9d3..b3139289 100644 --- a/src/util-strings.h +++ b/src/util-strings.h @@ -315,6 +315,8 @@ char **strv_append_printf(char **strv, const char *fmt, ...); __attribute__ ((format (printf, 2, 0))) char **strv_append_vprintf(char **strv, const char *fmt, va_list args); +bool strv_find(char **strv, const char *needle, size_t *index_out); + typedef int (*strv_foreach_callback_t)(const char *str, size_t index, void *data); int strv_for_each(const char **strv, strv_foreach_callback_t func, void *data); int strv_for_each_n(const char **strv, size_t max, strv_foreach_callback_t func, void *data); diff --git a/test/test-utils.c b/test/test-utils.c index f5a7bbf8..77e5cdf0 100644 --- a/test/test-utils.c +++ b/test/test-utils.c @@ -1279,6 +1279,46 @@ START_TEST(strv_append_test) } END_TEST +START_TEST(strv_find_test) +{ + char *strv[] = {"a", "b", "c", NULL}; + + bool rc; + size_t index; + + rc = strv_find(strv, "a", &index); + litest_assert(rc); + litest_assert_int_eq(index, 0U); + + rc = strv_find(strv, "b", &index); + litest_assert(rc); + litest_assert_int_eq(index, 1U); + + rc = strv_find(strv, "a", NULL); + litest_assert(rc); + + index = 0xffff; + rc = strv_find(strv, "d", &index); + litest_assert(!rc); + litest_assert_int_eq(index, 0xffffU); + + rc = strv_find(strv, "d", NULL); + litest_assert(!rc); + + rc = strv_find(NULL, "a", &index); + litest_assert(!rc); + litest_assert_int_eq(index, 0xffffU); + + rc = strv_find(NULL, NULL, &index); + litest_assert(!rc); + litest_assert_int_eq(index, 0xffffU); + + rc = strv_find(strv, NULL, &index); + litest_assert(!rc); + litest_assert_int_eq(index, 0xffffU); +} +END_TEST + START_TEST(double_array_from_string_test) { struct double_array_from_string_test { @@ -2228,6 +2268,7 @@ int main(void) ADD_TEST(strsplit_test); ADD_TEST(strv_for_each_test); ADD_TEST(strv_append_test); + ADD_TEST(strv_find_test); ADD_TEST(double_array_from_string_test); ADD_TEST(strargv_test); ADD_TEST(kvsplit_double_test);