Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 28 Apr 1999 09:23:09 +0000 (09:23 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 28 Apr 1999 09:23:09 +0000 (09:23 +0000)
1999-04-28  Ulrich Drepper  <drepper@cygnus.com>

* posix/fnmatch.c (internal_fnmatch): Finish incomplete
no_leading_period change.

* posix/testfnm.c: More test cases.

ChangeLog
posix/fnmatch.c
posix/testfnm.c

index 38a0b6d..200c811 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+1999-04-28  Ulrich Drepper  <drepper@cygnus.com>
+
+       * posix/fnmatch.c (internal_fnmatch): Finish incomplete
+       no_leading_period change.
+
+       * posix/testfnm.c: More test cases.
+
 1999-04-27  Ulrich Drepper  <drepper@cygnus.com>
 
        * include/dirent.h: Remove __getdirentries declaration, add __getdents
index b147f47..eb3f1cc 100644 (file)
@@ -157,7 +157,9 @@ internal_fnmatch (const char *pattern, const char *string,
            return FNM_NOMATCH;
          else if (*n == '/' && (flags & FNM_FILE_NAME))
            return FNM_NOMATCH;
-         else if (*n == '.' && no_leading_period)
+         else if (*n == '.' && no_leading_period
+                  && (n == string
+                      || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
            return FNM_NOMATCH;
          break;
 
@@ -175,7 +177,9 @@ internal_fnmatch (const char *pattern, const char *string,
          break;
 
        case '*':
-         if (*n == '.' && no_leading_period)
+         if (*n == '.' && no_leading_period
+             && (n == string
+                 || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
            return FNM_NOMATCH;
 
          for (c = *p++; c == '?' || c == '*'; c = *p++)
@@ -212,11 +216,17 @@ internal_fnmatch (const char *pattern, const char *string,
 
              if (c == '[')
                {
+                 int flags2 = ((flags & FNM_FILE_NAME)
+                               ? flags : (flags & ~FNM_PERIOD));
+
                  for (--p; n < endp; ++n)
                    if (internal_fnmatch (p, n,
-                                         (n == string) && no_leading_period,
-                                         ((flags & FNM_FILE_NAME)
-                                          ? flags : (flags & ~FNM_PERIOD)))
+                                         (no_leading_period
+                                          && (n == string
+                                              || (n[-1] == '/'
+                                                  && (flags
+                                                      & FNM_FILE_NAME)))),
+                                         flags2)
                        == 0)
                      return 0;
                }
@@ -231,18 +241,21 @@ internal_fnmatch (const char *pattern, const char *string,
                }
              else
                {
+                 int flags2 = ((flags & FNM_FILE_NAME)
+                               ? flags : (flags & ~FNM_PERIOD));
+
                  if (c == '\\' && !(flags & FNM_NOESCAPE))
                    c = *p;
                  c = FOLD (c);
                  for (--p; n < endp; ++n)
                    if (FOLD ((unsigned char) *n) == c
                        && (internal_fnmatch (p, n,
-                                             ((n == string)
-                                              && no_leading_period),
-                                             ((flags & FNM_FILE_NAME)
-                                              flags
-                                              : (flags & ~FNM_PERIOD)))
-                           == 0))
+                                             (no_leading_period
+                                              && (n == string
+                                                  || (n[-1] == '/'
+                                                      && (flags
+                                                          & FNM_FILE_NAME)))),
+                                             flags2) == 0))
                      return 0;
                }
            }
@@ -263,7 +276,10 @@ internal_fnmatch (const char *pattern, const char *string,
            if (*n == '\0')
              return FNM_NOMATCH;
 
-           if (*n == '.' && no_leading_period)
+           if (*n == '.' && no_leading_period && (n == string
+                                                  || (n[-1] == '/'
+                                                      && (flags
+                                                          & FNM_FILE_NAME))))
              return FNM_NOMATCH;
 
            if (*n == '/' && (flags & FNM_FILE_NAME))
@@ -297,7 +313,7 @@ internal_fnmatch (const char *pattern, const char *string,
 # if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
                    wctype_t wt;
 # endif
-                   char *startp = p;
+                   const char *startp = p;
 
                    for (;;)
                      {
index e300565..ebdfab4 100644 (file)
@@ -48,6 +48,9 @@ struct {
   { "a/b", "*[![:digit:]]*/[![:d-d]", FNM_PATHNAME, 0 },
   { "a/[", "*[![:digit:]]*/[[:d-d]", FNM_PATHNAME, 0 },
   { "a/[", "*[![:digit:]]*/[![:d-d]", FNM_PATHNAME, FNM_NOMATCH },
+  { "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 },
 };
 
 int