chiark / gitweb /
util: add new FOREACH_STRING() macro as syntactic sugar to iterate through a number...
authorLennart Poettering <lennart@poettering.net>
Tue, 18 Mar 2014 23:54:41 +0000 (00:54 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 18 Mar 2014 23:54:41 +0000 (00:54 +0100)
src/shared/strv.h
src/test/test-util.c

index b356d03..e26ab82 100644 (file)
@@ -119,3 +119,15 @@ void strv_print(char **l);
         })
 
 #define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
+
+#define FOREACH_STRING(x, ...)                               \
+        for (char **_l = ({                                  \
+                char **_ll = STRV_MAKE(__VA_ARGS__);         \
+                x = _ll ? _ll[0] : NULL;                     \
+                _ll;                                         \
+        });                                                  \
+        _l && *_l;                                           \
+        x = ({                                               \
+                _l ++;                                       \
+                _l[0];                                       \
+        }))
index 1d952eb..93929cd 100644 (file)
@@ -656,6 +656,25 @@ static void test_log2i(void) {
         assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
 }
 
+static void test_foreach_string(void) {
+        const char * const t[] = {
+                "foo",
+                "bar",
+                "waldo",
+                NULL
+        };
+        const char *x;
+        unsigned i = 0;
+
+        FOREACH_STRING(x, "foo", "bar", "waldo")
+                assert_se(streq_ptr(t[i++], x));
+
+        assert_se(i == 3);
+
+        FOREACH_STRING(x, "zzz")
+                assert_se(streq(x, "zzz"));
+}
+
 int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
@@ -699,6 +718,7 @@ int main(int argc, char *argv[]) {
         test_writing_tmpfile();
         test_hexdump();
         test_log2i();
+        test_foreach_string();
 
         return 0;
 }