From: Lennart Poettering Date: Fri, 23 Nov 2018 15:50:39 +0000 (+0100) Subject: path-util: beef up PATH_STARTSWITH_SET() macro a bit X-Git-Tag: v240~220^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d898ed65ab89e374848eb8a3de916124dd2df1fe;p=thirdparty%2Fsystemd.git path-util: beef up PATH_STARTSWITH_SET() macro a bit Let's remove duplicate evaluation, and let's return the result of the succesful path_startswith() call, i.e. the suffix to the matching prefix. --- diff --git a/src/basic/path-util.h b/src/basic/path-util.h index 52a93b1c3fb..e2a51ff33a2 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -71,13 +71,13 @@ static inline bool path_equal_ptr(const char *a, const char *b) { #define PATH_STARTSWITH_SET(p, ...) \ ({ \ - char **s; \ - bool _found = false; \ - STRV_FOREACH(s, STRV_MAKE(__VA_ARGS__)) \ - if (path_startswith(p, *s)) { \ - _found = true; \ - break; \ - } \ + const char *_p = (p); \ + char *_found = NULL, **_i; \ + STRV_FOREACH(_i, STRV_MAKE(__VA_ARGS__)) { \ + _found = path_startswith(_p, *_i); \ + if (_found) \ + break; \ + } \ _found; \ }) diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c index fd5f5987017..b5030ea494a 100644 --- a/src/test/test-path-util.c +++ b/src/test/test-path-util.c @@ -506,6 +506,27 @@ static void test_empty_or_root(void) { assert_se(!empty_or_root("//yy//")); } +static void test_path_startswith_set(void) { + + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar", "/foo/quux", "/foo/bar", "/zzz"), "")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar", "/foo/quux", "/foo/", "/zzz"), "bar")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar", "/foo/quux", "/foo", "/zzz"), "bar")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar", "/foo/quux", "/", "/zzz"), "foo/bar")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar", "/foo/quux", "", "/zzz"), NULL)); + + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar2", "/foo/quux", "/foo/bar", "/zzz"), NULL)); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar2", "/foo/quux", "/foo/", "/zzz"), "bar2")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar2", "/foo/quux", "/foo", "/zzz"), "bar2")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar2", "/foo/quux", "/", "/zzz"), "foo/bar2")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo/bar2", "/foo/quux", "", "/zzz"), NULL)); + + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo2/bar", "/foo/quux", "/foo/bar", "/zzz"), NULL)); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo2/bar", "/foo/quux", "/foo/", "/zzz"), NULL)); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo2/bar", "/foo/quux", "/foo", "/zzz"), NULL)); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo2/bar", "/foo/quux", "/", "/zzz"), "foo2/bar")); + assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo2/bar", "/foo/quux", "", "/zzz"), NULL)); +} + int main(int argc, char **argv) { test_setup_logging(LOG_DEBUG); @@ -525,6 +546,7 @@ int main(int argc, char **argv) { test_hidden_or_backup_file(); test_skip_dev_prefix(); test_empty_or_root(); + test_path_startswith_set(); test_systemd_installation_has_version(argv[1]); /* NULL is OK */