[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.18 and 1.23.8.1

version 1.18, 2006/12/01 18:57:29 version 1.23.8.1, 2009/05/13 19:18:23
Line 59  __RCSID("$NetBSD$");
Line 59  __RCSID("$NetBSD$");
  *      expand ~user/foo to the /home/dir/of/user/foo   *      expand ~user/foo to the /home/dir/of/user/foo
  * GLOB_BRACE:   * GLOB_BRACE:
  *      expand {1,2}{a,b} to 1a 1b 2a 2b   *      expand {1,2}{a,b} to 1a 1b 2a 2b
    * GLOB_PERIOD:
    *      allow metacharacters to match leading dots in filenames.
    * GLOB_NO_DOTDIRS:
    *      . and .. are hidden from wildcards, even if GLOB_PERIOD is set.
  * gl_matchc:   * gl_matchc:
  *      Number of matches in the current invocation of glob.   *      Number of matches in the current invocation of glob.
  */   */
Line 74  __RCSID("$NetBSD$");
Line 78  __RCSID("$NetBSD$");
 #include <glob.h>  #include <glob.h>
 #include <pwd.h>  #include <pwd.h>
 #include <stdio.h>  #include <stdio.h>
   #include <stddef.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
Line 82  __RCSID("$NetBSD$");
Line 87  __RCSID("$NetBSD$");
 #define NO_GETPW_R  #define NO_GETPW_R
 #endif  #endif
   
   #if !defined(ARG_MAX)
   #include <limits.h>
   #define ARG_MAX _POSIX_ARG_MAX
   #endif
   
 /*  /*
  * XXX: For NetBSD 1.4.x compatibility. (kill me l8r)   * XXX: For NetBSD 1.4.x compatibility. (kill me l8r)
  */   */
Line 582  glob2(Char *pathbuf, Char *pathend, Char
Line 592  glob2(Char *pathbuf, Char *pathend, Char
         __gl_stat_t sb;          __gl_stat_t sb;
         Char *p, *q;          Char *p, *q;
         int anymeta;          int anymeta;
           Char *pend;
           ptrdiff_t diff;
   
         _DIAGASSERT(pathbuf != NULL);          _DIAGASSERT(pathbuf != NULL);
         _DIAGASSERT(pathend != NULL);          _DIAGASSERT(pathend != NULL);
Line 623  glob2(Char *pathbuf, Char *pathend, Char
Line 635  glob2(Char *pathbuf, Char *pathend, Char
                         *q++ = *p++;                          *q++ = *p++;
                 }                  }
   
                 if (!anymeta) {         /* No expansion, do next segment. */                  /*
                    * No expansion, or path ends in slash-dot shash-dot-dot,
                    * do next segment.
                    */
                   if (pglob->gl_flags & GLOB_PERIOD) {
                           for (pend = pathend; pend > pathbuf && pend[-1] == '/';
                               pend--)
                                   continue;
                           diff = pend - pathbuf;
                   } else {
                           /* XXX: GCC */
                           diff = 0;
                           pend = pathend;
                   }
   
                   if ((!anymeta) ||
                       ((pglob->gl_flags & GLOB_PERIOD) &&
                        (diff >= 1 && pend[-1] == DOT) &&
                        (diff >= 2 && (pend[-2] == SLASH || pend[-2] == DOT)) &&
                        (diff < 3 || pend[-3] == SLASH))) {
                         pathend = q;                          pathend = q;
                         pattern = p;                          pattern = p;
                         while (*pattern == SEP) {                          while (*pattern == SEP) {
Line 695  glob3(Char *pathbuf, Char *pathend, Char
Line 726  glob3(Char *pathbuf, Char *pathend, Char
                 u_char *sc;                  u_char *sc;
                 Char *dc;                  Char *dc;
   
                 /* Initial DOT must be matched literally. */                  /*
                 if (dp->d_name[0] == DOT && *pattern != DOT)                   * Initial DOT must be matched literally, unless we have
                    * GLOB_PERIOD set.
                    */
                   if ((pglob->gl_flags & GLOB_PERIOD) == 0)
                           if (dp->d_name[0] == DOT && *pattern != DOT)
                                   continue;
                   /*
                    * If GLOB_NO_DOTDIRS is set, . and .. vanish.
                    */
                   if ((pglob->gl_flags & GLOB_NO_DOTDIRS) &&
                       (dp->d_name[0] == DOT) &&
                       ((dp->d_name[1] == EOS) ||
                        ((dp->d_name[1] == DOT) && (dp->d_name[2] == EOS))))
                         continue;                          continue;
                 /*                  /*
                  * The resulting string contains EOS, so we can                   * The resulting string contains EOS, so we can
Line 884  globfree(glob_t *pglob)
Line 927  globfree(glob_t *pglob)
         }          }
 }  }
   
   #ifndef __LIBC12_SOURCE__
   int
   glob_pattern_p(const char *pattern, int quote)
   {
           int range = 0;
   
           for (; *pattern; pattern++)
                   switch (*pattern) {
                   case QUESTION:
                   case STAR:
                           return 1;
   
                   case QUOTE:
                           if (quote && pattern[1] != '\0')
                                 ++pattern;
                           break;
   
                   case LBRACKET:
                           range = 1;
                           break;
   
                   case RBRACKET:
                           if (range)
                                 return 1;
                           break;
                   default:
                           break;
                   }
   
             return 0;
   }
   #endif
   
 static DIR *  static DIR *
 g_opendir(Char *str, glob_t *pglob)  g_opendir(Char *str, glob_t *pglob)
 {  {

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.23.8.1

CVSweb <webmaster@jp.NetBSD.org>