diff options
Diffstat (limited to 'posix')
-rw-r--r-- | posix/fnmatch_loop.c | 28 | ||||
-rw-r--r-- | posix/testfnm.c | 22 |
2 files changed, 38 insertions, 12 deletions
diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c index 2928037cab..5f6c05710e 100644 --- a/posix/fnmatch_loop.c +++ b/posix/fnmatch_loop.c @@ -90,9 +90,31 @@ FCT (pattern, string, no_leading_period, flags) if (c == L('\0')) /* The wildcard(s) is/are the last element of the pattern. If the name is a file name and contains another slash - this does mean it cannot match. */ - return ((flags & FNM_FILE_NAME) && STRCHR (n, L('/')) != NULL - ? FNM_NOMATCH : 0); + this does mean it cannot match. If the FNM_LEADING_DIR + flag is set and exactly one slash is following, we have + a match. */ + { + int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH; + + if (flags & FNM_FILE_NAME) + { + const CHAR *slashp = STRCHR (n, L('/')); + + if (flags & FNM_LEADING_DIR) + { + if (slashp != NULL + && STRCHR (slashp + 1, L('/')) == NULL) + result = 0; + } + else + { + if (slashp == NULL) + result = 0; + } + } + + return result; + } else { const CHAR *endp; diff --git a/posix/testfnm.c b/posix/testfnm.c index ebdfab41de..bec08b2b1a 100644 --- a/posix/testfnm.c +++ b/posix/testfnm.c @@ -13,9 +13,9 @@ struct { { "a/b", "a[/]b", 0, 0 }, { "a/b", "a[/]b", FNM_PATHNAME, FNM_NOMATCH }, { "a/b", "[a-z]/[a-z]", 0, 0 }, - { "a/b", "*", FNM_FILE_NAME, FNM_NOMATCH }, - { "a/b", "*[/]b", FNM_FILE_NAME, FNM_NOMATCH }, - { "a/b", "*[b]", FNM_FILE_NAME, FNM_NOMATCH }, + { "a/b", "*", FNM_PATHNAME, FNM_NOMATCH }, + { "a/b", "*[/]b", FNM_PATHNAME, FNM_NOMATCH }, + { "a/b", "*[b]", FNM_PATHNAME, FNM_NOMATCH }, { "a/b", "[*]/b", 0, FNM_NOMATCH }, { "*/b", "[*]/b", 0, 0 }, { "a/b", "[?]/b", 0, FNM_NOMATCH }, @@ -51,6 +51,9 @@ struct { { "a.b", "a?b", FNM_PATHNAME|FNM_PERIOD, 0 }, { "a.b", "a*b", FNM_PATHNAME|FNM_PERIOD, 0 }, { "a.b", "a[.]b", FNM_PATHNAME|FNM_PERIOD, 0 }, + { "a/b", "*a*", FNM_PATHNAME|FNM_LEADING_DIR, 0 }, + { "ab/c", "*a?", FNM_PATHNAME|FNM_LEADING_DIR, 0 }, + { "ab/c", "a?", FNM_PATHNAME|FNM_LEADING_DIR, 0 }, }; int @@ -64,13 +67,14 @@ main (void) int match; match = fnmatch (tests[i].pattern, tests[i].name, tests[i].flags); + + printf ("[%2zd] %s %s %s -> %s\n", i, tests[i].pattern, + match == 0 ? "matches" : "does not match", + tests[i].name, + match != tests[i].expected ? "FAIL" : "OK"); + if (match != tests[i].expected) - { - printf ("%s %s %s\n", tests[i].pattern, - match == 0 ? "matches" : "does not match", - tests[i].name); - errors++; - } + ++errors ; } exit (errors != 0); |