]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
strv: add helper to find value in key/value pairs from list of keys
authorLuca Boccassi <bluca@debian.org>
Mon, 27 Mar 2023 11:05:28 +0000 (12:05 +0100)
committerLuca Boccassi <bluca@debian.org>
Tue, 28 Mar 2023 09:36:01 +0000 (10:36 +0100)
src/basic/strv.c
src/basic/strv.h
src/test/test-strv.c

index 5fcf3620a60ca7932a90e590c9a4643cbc8da837..822dadeeb4a1bcdedbbfa9fc8b94344553c713d5 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 
 #include "alloc-util.h"
+#include "env-util.h"
 #include "escape.h"
 #include "extract-word.h"
 #include "fileio.h"
@@ -63,6 +64,16 @@ char* strv_find_startswith(char * const *l, const char *name) {
         return NULL;
 }
 
+char* strv_find_first_field(char * const *needles, char * const *haystack) {
+        STRV_FOREACH(k, needles) {
+                char *value = strv_env_pairs_get((char **)haystack, *k);
+                if (value)
+                        return value;
+        }
+
+        return NULL;
+}
+
 char** strv_free(char **l) {
         STRV_FOREACH(k, l)
                 free(*k);
index 419cda1ee3f9456a4eb1178a9f66c971352b3f83..b4d3f121f9a296fab22ba9b95a14fcff1f8e6967 100644 (file)
@@ -17,6 +17,9 @@ char* strv_find(char * const *l, const char *name) _pure_;
 char* strv_find_case(char * const *l, const char *name) _pure_;
 char* strv_find_prefix(char * const *l, const char *name) _pure_;
 char* strv_find_startswith(char * const *l, const char *name) _pure_;
+/* Given two vectors, the first a list of keys and the second a list of key-value pairs, returns the value
+ * of the first key from the first vector that is found in the second vector. */
+char* strv_find_first_field(char * const *needles, char * const *haystack) _pure_;
 
 #define strv_contains(l, s) (!!strv_find((l), (s)))
 #define strv_contains_case(l, s) (!!strv_find_case((l), (s)))
index 0f08dd4615b3c0a497a84e38c95457afc87c7a8c..a39a2d812203f52dd268c7fbd4df496928b65f86 100644 (file)
@@ -994,4 +994,16 @@ TEST(strv_copy_n) {
         assert_se(strv_equal(l, STRV_MAKE("a", "b", "c", "d", "e")));
 }
 
+TEST(strv_find_first_field) {
+        char **haystack = STRV_MAKE("a", "b", "c", "d", "e", "f", "g", "h", "i", "j");
+
+        assert_se(strv_find_first_field(NULL, NULL) == NULL);
+        assert_se(strv_find_first_field(NULL, haystack) == NULL);
+        assert_se(strv_find_first_field(STRV_MAKE("k", "l", "m", "d", "b"), NULL) == NULL);
+        assert_se(strv_find_first_field(STRV_MAKE("k", "l", "m", "d", "b"), haystack) == NULL);
+        assert_se(streq_ptr(strv_find_first_field(STRV_MAKE("k", "l", "m", "d", "a", "c"), haystack), "b"));
+        assert_se(streq_ptr(strv_find_first_field(STRV_MAKE("k", "l", "m", "d", "c", "a"), haystack), "d"));
+        assert_se(streq_ptr(strv_find_first_field(STRV_MAKE("i", "k", "l", "m", "d", "c", "a", "b"), haystack), "j"));
+}
+
 DEFINE_TEST_MAIN(LOG_INFO);