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) |
{ |
{ |