util: add new FOREACH_STRING() macro as syntactic sugar to iterate through a number of fixed strings

This commit is contained in:
Lennart Poettering 2014-03-19 00:54:41 +01:00
parent cb9da7f24f
commit c4a7b2c56e
2 changed files with 32 additions and 0 deletions

View 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]; \
}))

View 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;
}