[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.10 and 1.11

version 1.10, 1993/11/24 19:43:51 version 1.11, 1995/02/27 03:43:06
Line 1 
Line 1 
   /*      $NetBSD$        */
   
 /*  /*
  * Copyright (c) 1989, 1993   * Copyright (c) 1989, 1993, 1994
  *      The Regents of the University of California.  All rights reserved.   *      The Regents of the University of California.  All rights reserved.
  *   *
  * This code is derived from software contributed to Berkeley by   * This code is derived from software contributed to Berkeley by
Line 35 
Line 37 
  */   */
   
 #if defined(LIBC_SCCS) && !defined(lint)  #if defined(LIBC_SCCS) && !defined(lint)
 /* from: static char sccsid[] = "@(#)fnmatch.c  8.1 (Berkeley) 6/4/93"; */  #if 0
 static char *rcsid = "$Id$";  static char sccsid[] = "@(#)fnmatch.c   8.2 (Berkeley) 4/16/94";
   #else
   static char rcsid[] = "$NetBSD$";
   #endif
 #endif /* LIBC_SCCS and not lint */  #endif /* LIBC_SCCS and not lint */
   
 /*  /*
Line 53  static const char *rangematch __P((const
Line 58  static const char *rangematch __P((const
   
 int  int
 fnmatch(pattern, string, flags)  fnmatch(pattern, string, flags)
         register const char *pattern, *string;          const char *pattern, *string;
         int flags;          int flags;
 {  {
         const char *stringstart = string;          const char *stringstart;
         register char c;          char c, test;
         char test;  
   
         for (;;)          for (stringstart = string;;)
                 switch (c = *pattern++) {                  switch (c = *pattern++) {
                 case EOS:                  case EOS:
                         return (*string == EOS ? 0 : FNM_NOMATCH);                          return (*string == EOS ? 0 : FNM_NOMATCH);
Line 70  fnmatch(pattern, string, flags)
Line 74  fnmatch(pattern, string, flags)
                         if (*string == '/' && (flags & FNM_PATHNAME))                          if (*string == '/' && (flags & FNM_PATHNAME))
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         if (*string == '.' && (flags & FNM_PERIOD) &&                          if (*string == '.' && (flags & FNM_PERIOD) &&
                             (string == stringstart || ((flags & FNM_PATHNAME) && *(string - 1) == '/')))                              (string == stringstart ||
                               ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         ++string;                          ++string;
                         break;                          break;
Line 81  fnmatch(pattern, string, flags)
Line 86  fnmatch(pattern, string, flags)
                                 c = *++pattern;                                  c = *++pattern;
   
                         if (*string == '.' && (flags & FNM_PERIOD) &&                          if (*string == '.' && (flags & FNM_PERIOD) &&
                             (string == stringstart || ((flags & FNM_PATHNAME) && *(string - 1) == '/')))                              (string == stringstart ||
                               ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
   
                         /* Optimize for pattern with * at end or before /. */                          /* Optimize for pattern with * at end or before /. */
Line 111  fnmatch(pattern, string, flags)
Line 117  fnmatch(pattern, string, flags)
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         if (*string == '/' && flags & FNM_PATHNAME)                          if (*string == '/' && flags & FNM_PATHNAME)
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         if ((pattern = rangematch(pattern, *string, flags)) == NULL)                          if ((pattern =
                               rangematch(pattern, *string, flags)) == NULL)
                                 return (FNM_NOMATCH);                                  return (FNM_NOMATCH);
                         ++string;                          ++string;
                         break;                          break;
Line 133  fnmatch(pattern, string, flags)
Line 140  fnmatch(pattern, string, flags)
   
 static const char *  static const char *
 rangematch(pattern, test, flags)  rangematch(pattern, test, flags)
         register const char *pattern;          const char *pattern;
         register int test;          int test, flags;
         int flags;  
 {  {
         register char c, c2;  
         int negate, ok;          int negate, ok;
           char c, c2;
   
         /* A bracket expression starting with an unquoted circumflex          /*
            * A bracket expression starting with an unquoted circumflex
          * character produces unspecified results (IEEE 1003.2-1992,           * character produces unspecified results (IEEE 1003.2-1992,
          * 3.13.2).  I have chosen to treat it like '!', for           * 3.13.2).  This implementation treats it like '!', for
          * consistancy with regular expression syntax.           * consistency with the regular expression syntax.
            * J.T. Conklin (conklin@ngai.kaleida.com)
          */           */
         if (negate = (*pattern == '!' || *pattern == '^')) {          if (negate = (*pattern == '!' || *pattern == '^'))
                 pattern++;                  ++pattern;
         }  
   
         for (ok = 0; (c = *pattern++) != ']';) {          for (ok = 0; (c = *pattern++) != ']';) {
                 if (c == '\\' && !(flags & FNM_NOESCAPE)) {                  if (c == '\\' && !(flags & FNM_NOESCAPE))
                         c = *pattern++;                          c = *pattern++;
                 }                  if (c == EOS)
                 if (c == EOS) {  
                         return (NULL);                          return (NULL);
                 }  
   
                 if (*pattern == '-'                  if (*pattern == '-'
                     && (c2 = *(pattern+1)) != EOS && c2 != ']') {                      && (c2 = *(pattern+1)) != EOS && c2 != ']') {
                         pattern += 2;                          pattern += 2;
                         if (c2 == '\\' && !(flags & FNM_NOESCAPE)) {                          if (c2 == '\\' && !(flags & FNM_NOESCAPE))
                                 c2 = *pattern++;                                  c2 = *pattern++;
                         }                          if (c2 == EOS)
                         if (c2 == EOS) {  
                                 return (NULL);                                  return (NULL);
                         }                          if (c <= test && test <= c2)
   
                         if (c <= test && test <= c2) {  
                                 ok = 1;                                  ok = 1;
                         }                  } else if (c == test)
                 } else if (c == test) {  
                         ok = 1;                          ok = 1;
                 }  
         }          }
   
         return (ok == negate ? NULL : pattern);          return (ok == negate ? NULL : pattern);
 }  }

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.11

CVSweb <webmaster@jp.NetBSD.org>