Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 26 Jan 2000 03:46:22 +0000 (03:46 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 26 Jan 2000 03:46:22 +0000 (03:46 +0000)
2000-01-25  Ulrich Drepper  <drepper@cygnus.com>

* posix/fnmatch_loop.c: Fix problem with FNM_LEADING_DIR.
* posix/testfnm.c: Add a few more tests.  Rearrange test output.

ChangeLog
posix/fnmatch_loop.c
posix/testfnm.c

index 2af39fe..6bd0d85 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2000-01-25  Ulrich Drepper  <drepper@cygnus.com>
+
+       * posix/fnmatch_loop.c: Fix problem with FNM_LEADING_DIR.
+       * posix/testfnm.c: Add a few more tests.  Rearrange test output.
+
 2000-01-25  Andreas Schwab  <schwab@suse.de>
 
        * posix/testfnm.c: Add new test case.  Use FNM_PATHNAME instead of
index 2928037..5f6c057 100644 (file)
@@ -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;
index ebdfab4..bec08b2 100644 (file)
@@ -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);