|
|
17aa40 |
From 3539a72c260063713e4ecba17966ba9a768d8af9 Mon Sep 17 00:00:00 2001
|
|
|
eb8b6e |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
eb8b6e |
Date: Wed, 16 Jan 2019 00:13:38 +0100
|
|
|
eb8b6e |
Subject: [PATCH] strv: rework FOREACH_STRING() macro
|
|
|
eb8b6e |
|
|
|
eb8b6e |
So it's apparently problematic that we use STRV_MAKE() (i.e. a compound
|
|
|
eb8b6e |
initializer) outside of the {} block we use it in (and that includes
|
|
|
eb8b6e |
outside of the ({}) block, too). Hence, let's rework the macro to not
|
|
|
eb8b6e |
need that.
|
|
|
eb8b6e |
|
|
|
eb8b6e |
This also makes the macro shorter, which is definitely a good and more
|
|
|
eb8b6e |
readable. Moreover, it will now complain if the iterator is a "char*"
|
|
|
eb8b6e |
instead of a "const char*", which is good too.
|
|
|
eb8b6e |
|
|
|
eb8b6e |
Fixes: #11394
|
|
|
eb8b6e |
(cherry picked from commit 66a64081f82dfad90f2f9394a477820a2e3e6510)
|
|
|
eb8b6e |
|
|
|
17aa40 |
Related: #2017033
|
|
|
eb8b6e |
---
|
|
|
eb8b6e |
src/basic/strv.h | 15 ++++-----------
|
|
|
eb8b6e |
1 file changed, 4 insertions(+), 11 deletions(-)
|
|
|
eb8b6e |
|
|
|
eb8b6e |
diff --git a/src/basic/strv.h b/src/basic/strv.h
|
|
|
eb8b6e |
index c1e4c973b6..a09d76706d 100644
|
|
|
eb8b6e |
--- a/src/basic/strv.h
|
|
|
eb8b6e |
+++ b/src/basic/strv.h
|
|
|
eb8b6e |
@@ -148,17 +148,10 @@ void strv_print(char **l);
|
|
|
eb8b6e |
_found; \
|
|
|
eb8b6e |
})
|
|
|
eb8b6e |
|
|
|
eb8b6e |
-#define FOREACH_STRING(x, ...) \
|
|
|
eb8b6e |
- for (char **_l = ({ \
|
|
|
eb8b6e |
- char **_ll = STRV_MAKE(__VA_ARGS__); \
|
|
|
eb8b6e |
- x = _ll ? _ll[0] : NULL; \
|
|
|
eb8b6e |
- _ll; \
|
|
|
eb8b6e |
- }); \
|
|
|
eb8b6e |
- _l && *_l; \
|
|
|
eb8b6e |
- x = ({ \
|
|
|
eb8b6e |
- _l ++; \
|
|
|
eb8b6e |
- _l[0]; \
|
|
|
eb8b6e |
- }))
|
|
|
eb8b6e |
+#define FOREACH_STRING(x, y, ...) \
|
|
|
eb8b6e |
+ for (char **_l = STRV_MAKE(({ x = y; }), ##__VA_ARGS__); \
|
|
|
eb8b6e |
+ x; \
|
|
|
eb8b6e |
+ x = *(++_l))
|
|
|
eb8b6e |
|
|
|
eb8b6e |
char **strv_reverse(char **l);
|
|
|
eb8b6e |
char **strv_shell_escape(char **l, const char *bad);
|