[BACK]Return to glob.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/glob.c between version 1.36 and 1.37

version 1.36, 2016/09/04 18:27:08 version 1.37, 2017/04/26 14:56:54
Line 936  nospace:
Line 936  nospace:
   
   
 /*  /*
  * pattern matching function for filenames.  Each occurrence of the *   * pattern matching function for filenames.
  * pattern causes a recursion level.  
  */   */
 static int  static int
 match(const Char *name, const Char *pat, const Char *patend)  match(const Char *name, const Char *pat, const Char *patend)
 {  {
         int ok, negate_range;          int ok, negate_range;
         Char c, k;          Char c, k;
           const Char *patNext, *nameNext, *nameStart, *nameEnd;
   
         _DIAGASSERT(name != NULL);          _DIAGASSERT(name != NULL);
         _DIAGASSERT(pat != NULL);          _DIAGASSERT(pat != NULL);
         _DIAGASSERT(patend != NULL);          _DIAGASSERT(patend != NULL);
           patNext = pat;
         while (pat < patend) {          nameStart = nameNext = name;
                 c = *pat++;          nameEnd = NULL;
   
           while (pat < patend || *name) {
                   c = *pat;
                   if (*name == EOS)
                           nameEnd = name;
                 switch (c & M_MASK) {                  switch (c & M_MASK) {
                 case M_ALL:                  case M_ALL:
                         while (pat < patend && (*pat & M_MASK) == M_ALL)                          while (pat[1] == '*') pat++;
                                 pat++;  /* eat consecutive '*' */                          patNext = pat;
                         if (pat == patend)                          nameNext = name + 1;
                                 return 1;                          pat++;
                         for (; !match(name, pat, patend); name++)                          continue;
                                 if (*name == EOS)  
                                         return 0;  
                         return 1;  
                 case M_ONE:                  case M_ONE:
                         if (*name++ == EOS)                          if (*name == EOS)
                                 return 0;                                  break;
                         break;                          pat++;
                           name++;
                           continue;
                 case M_SET:                  case M_SET:
                         ok = 0;                          ok = 0;
                         if ((k = *name++) == EOS)                          if ((k = *name) == EOS)
                                 return 0;                                  break;
                           pat++;
                           name++;
                         if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS)                          if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS)
                                 ++pat;                                  ++pat;
                         while (((c = *pat++) & M_MASK) != M_END)                          while (((c = *pat++) & M_MASK) != M_END)
Line 979  match(const Char *name, const Char *pat,
Line 985  match(const Char *name, const Char *pat,
                                 } else if (c == k)                                  } else if (c == k)
                                         ok = 1;                                          ok = 1;
                         if (ok == negate_range)                          if (ok == negate_range)
                                 return 0;                                  break;
                         break;                          continue;
                 default:                  default:
                         if (*name++ != c)                          if (*name != c)
                                 return 0;                                  break;
                         break;                          pat++;
                           name++;
                           continue;
                   }
                   if (nameNext != nameStart
                       && (nameEnd == NULL || nameNext <= nameEnd)) {
                           pat = patNext;
                           name = nameNext;
                           continue;
                 }                  }
                   return 0;
         }          }
         return *name == EOS;          return 1;
 }  }
   
 /* Free allocated data belonging to a glob_t structure. */  /* Free allocated data belonging to a glob_t structure. */

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.37

CVSweb <webmaster@jp.NetBSD.org>