[BACK]Return to fnmatch.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / gen

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/gen/fnmatch.c between version 1.17 and 1.17.4.1

version 1.17, 2000/01/22 22:19:10 version 1.17.4.1, 2000/07/03 22:30:13
Line 53  __RCSID("$NetBSD$");
Line 53  __RCSID("$NetBSD$");
 #include "namespace.h"  #include "namespace.h"
   
 #include <assert.h>  #include <assert.h>
   #include <ctype.h>
 #include <fnmatch.h>  #include <fnmatch.h>
 #include <string.h>  #include <string.h>
   
Line 64  __weak_alias(fnmatch,_fnmatch)
Line 65  __weak_alias(fnmatch,_fnmatch)
   
 static const char *rangematch __P((const char *, int, int));  static const char *rangematch __P((const char *, int, int));
   
   static __inline int
   foldcase(int ch, int flags)
   {
   
           if ((flags & FNM_CASEFOLD) != 0 && isupper(ch))
                   return (tolower(ch));
           return (ch);
   }
   
   #define FOLDCASE(ch, flags)     foldcase((unsigned char)(ch), (flags))
   
 int  int
 fnmatch(pattern, string, flags)  fnmatch(pattern, string, flags)
         const char *pattern, *string;          const char *pattern, *string;
Line 76  fnmatch(pattern, string, flags)
Line 88  fnmatch(pattern, string, flags)
         _DIAGASSERT(string != NULL);          _DIAGASSERT(string != NULL);
   
         for (stringstart = string;;)          for (stringstart = string;;)
                 switch (c = *pattern++) {                  switch (c = FOLDCASE(*pattern++, flags)) {
                 case EOS:                  case EOS:
                         return (*string == EOS ? 0 : FNM_NOMATCH);                          return (*string == EOS ? 0 : FNM_NOMATCH);
                 case '?':                  case '?':
Line 91  fnmatch(pattern, string, flags)
Line 103  fnmatch(pattern, string, flags)
                         ++string;                          ++string;
                         break;                          break;
                 case '*':                  case '*':
                         c = *pattern;                          c = FOLDCASE(*pattern, flags);
                         /* Collapse multiple stars. */                          /* Collapse multiple stars. */
                         while (c == '*')                          while (c == '*')
                                 c = *++pattern;                                  c = FOLDCASE(*++pattern, flags);
   
                         if (*string == '.' && (flags & FNM_PERIOD) &&                          if (*string == '.' && (flags & FNM_PERIOD) &&
                             (string == stringstart ||                              (string == stringstart ||
Line 115  fnmatch(pattern, string, flags)
Line 127  fnmatch(pattern, string, flags)
                         }                          }
   
                         /* General case, use recursion. */                          /* General case, use recursion. */
                         while ((test = *string) != EOS) {                          while ((test = FOLDCASE(*string, flags)) != EOS) {
                                 if (!fnmatch(pattern, string, flags & ~FNM_PERIOD))                                  if (!fnmatch(pattern, string,
                                                flags & ~FNM_PERIOD))
                                         return (0);                                          return (0);
                                 if (test == '/' && flags & FNM_PATHNAME)                                  if (test == '/' && flags & FNM_PATHNAME)
                                         break;                                          break;
Line 129  fnmatch(pattern, string, flags)
Line 142  fnmatch(pattern, string, flags)
                         if (*string == '/' && flags & FNM_PATHNAME)                          if (*string == '/' && flags & FNM_PATHNAME)
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         if ((pattern =                          if ((pattern =
                             rangematch(pattern, *string, flags)) == NULL)                              rangematch(pattern, FOLDCASE(*string, flags),
                                          flags)) == NULL)
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         ++string;                          ++string;
                         break;                          break;
                 case '\\':                  case '\\':
                         if (!(flags & FNM_NOESCAPE)) {                          if (!(flags & FNM_NOESCAPE)) {
                                 if ((c = *pattern++) == EOS) {                                  if ((c = FOLDCASE(*pattern++, flags)) == EOS) {
                                         c = '\\';                                          c = '\\';
                                         --pattern;                                          --pattern;
                                 }                                  }
                         }                          }
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 default:                  default:
                         if (c != *string++)                          if (c != FOLDCASE(*string++, flags))
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         break;                          break;
                 }                  }
Line 169  rangematch(pattern, test, flags)
Line 183  rangematch(pattern, test, flags)
         if ((negate = (*pattern == '!' || *pattern == '^')) != 0)          if ((negate = (*pattern == '!' || *pattern == '^')) != 0)
                 ++pattern;                  ++pattern;
   
         for (ok = 0; (c = *pattern++) != ']';) {          for (ok = 0; (c = FOLDCASE(*pattern++, flags)) != ']';) {
                 if (c == '\\' && !(flags & FNM_NOESCAPE))                  if (c == '\\' && !(flags & FNM_NOESCAPE))
                         c = *pattern++;                          c = FOLDCASE(*pattern++, flags);
                 if (c == EOS)                  if (c == EOS)
                         return (NULL);                          return (NULL);
                 if (*pattern == '-'                  if (*pattern == '-'
                     && (c2 = *(pattern+1)) != EOS && c2 != ']') {                      && (c2 = FOLDCASE(*(pattern+1), flags)) != EOS &&
                           c2 != ']') {
                         pattern += 2;                          pattern += 2;
                         if (c2 == '\\' && !(flags & FNM_NOESCAPE))                          if (c2 == '\\' && !(flags & FNM_NOESCAPE))
                                 c2 = *pattern++;                                  c2 = FOLDCASE(*pattern++, flags);
                         if (c2 == EOS)                          if (c2 == EOS)
                                 return (NULL);                                  return (NULL);
                         if (c <= test && test <= c2)                          if (c <= test && test <= c2)

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.17.4.1

CVSweb <webmaster@jp.NetBSD.org>