aboutsummaryrefslogtreecommitdiff
path: root/posix
diff options
context:
space:
mode:
Diffstat (limited to 'posix')
-rw-r--r--posix/fnmatch_loop.c28
-rw-r--r--posix/testfnm.c22
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);