99#define SEP DEFAULT_SLASH
102#define UNDERSCORE '_'
110#define M_QUOTE 0x8000
111#define M_PROTECT 0x4000
113#define M_ASCII 0x00ff
120#define M_PROTECT 0x40
129#define CHAR(c) ((Char)((c)&M_ASCII))
130#define META(c) ((Char)((c)|M_QUOTE))
131#define M_ALL META('*')
132#define M_END META(']')
133#define M_NOT META('!')
134#define M_ONE META('?')
135#define M_RNG META('-')
136#define M_SET META('[')
137#define ismeta(c) (((c)&M_QUOTE) != 0)
139static int compare(
const void *,
const void *);
140static int g_Ctoc(
const Char *,
char *, u_int);
151static int globextend(
const Char *,
glob_t *,
size_t *);
157static void qprintf(
const char *,
Char *);
162 const uint8_t *patnext;
173 patnext = (uint8_t *) pattern;
187 while (bufnext < bufend && (c = *patnext++) !=
EOS)
191 while (bufnext < bufend && (c = *patnext++) !=
EOS)
193 if ((c = *patnext++) ==
EOS) {
204 return globexp1(patbuf, pglob);
206 return glob0(patbuf, pglob);
214static int globexp1(
const Char *pattern,
glob_t *pglob)
221 return glob0(pattern, pglob);
224 if (!globexp2(
ptr, pattern, pglob, &
rv))
227 return glob0(pattern, pglob);
240 const Char *pe, *pm, *pl;
244 for (lm = patbuf, pm = pattern; pm !=
ptr; *lm++ = *pm++)
250 for (i = 0, pe = ++
ptr; *pe; pe++)
253 for (pm = pe++; *pe !=
RBRACKET && *pe !=
EOS; pe++)
271 if (i != 0 || *pe ==
EOS) {
272 *
rv = glob0(patbuf, pglob);
276 for (i = 0, pl = pm =
ptr; pm <= pe; pm++) {
282 for (pb = pm++; *pm !=
RBRACKET && *pm !=
EOS; pm++)
304 if (i && *pm ==
COMMA)
308 for (lm = ls; (pl < pm); *lm++ = *pl++)
315 for (pl = pe + 1; (*lm++ = *pl++) !=
EOS; )
320 qprintf(
"globexp2:", patbuf);
322 *
rv = globexp1(patbuf, pglob);
342static const Char *globtilde(
const Char *pattern,
Char *patbuf,
size_t patbuf_len,
glob_t *pglob)
355 eb = &patbuf[patbuf_len - 1];
356 for (
p = pattern + 1, h = (
char *) patbuf;
357 h < (
char *)eb && *
p && *
p !=
SLASH; *h++ = (char) *
p++)
367 if (((
char *) patbuf)[0] ==
EOS) {
374 if ((pwd = getpwuid(getuid())) ==
NULL)
387 if ((pwd = getpwnam((
char*) patbuf)) ==
NULL)
397 for (b = patbuf; b < eb && *h; *b++ = *h++)
401 while (b < eb && (*b++ = *
p++) !=
EOS)
416static int glob0(
const Char *pattern,
glob_t *pglob)
418 const Char *qpatnext;
419 int c,
err, oldpathc;
423 qpatnext = globtilde(pattern, patbuf,
MAXPATHLEN, pglob);
428 while ((c = *qpatnext++) !=
EOS) {
434 if (*qpatnext ==
EOS ||
446 *bufnext++ =
CHAR(c);
447 if (*qpatnext ==
RANGE &&
450 *bufnext++ =
CHAR(c);
453 }
while ((c = *qpatnext++) !=
RBRACKET);
466 if (bufnext == patbuf || bufnext[-1] !=
M_ALL)
470 *bufnext++ =
CHAR(c);
476 qprintf(
"glob0:", patbuf);
479 if ((
err = glob1(patbuf, patbuf+
MAXPATHLEN-1, pglob, &limit)) != 0)
492 return(globextend(pattern, pglob, &limit));
498 pglob->
gl_pathc - oldpathc,
sizeof(
char *), compare);
502static int compare(
const void *
p,
const void *q)
504 return(
strcmp(*(
char **)
p, *(
char **)q));
508glob1(pattern, pattern_last, pglob, limitp)
509 Char *pattern, *pattern_last;
520 pattern, pattern_last, pglob, limitp));
528static int glob2(
Char *pathbuf,
Char *pathbuf_last,
Char *pathend,
Char *pathend_last,
Char *pattern,
529 Char *pattern_last,
glob_t *pglob,
size_t *limitp)
539 for (anymeta = 0;;) {
540 if (*pattern ==
EOS) {
542 if (g_lstat(pathbuf, &sb, pglob))
548 (g_stat(pathbuf, &sb, pglob) == 0) &&
550 if (pathend+1 > pathend_last)
556 return(globextend(pathbuf, pglob, limitp));
565 if (q+1 > pathend_last)
574 if (pathend+1 > pathend_last)
576 *pathend++ = *pattern++;
580 return(glob3(pathbuf, pathbuf_last, pathend,
581 pathend_last, pattern, pattern_last,
582 p, pattern_last, pglob, limitp));
587static int glob3(
Char *pathbuf,
Char *pathbuf_last,
Char *pathend,
Char *pathend_last,
Char *pattern,
Char *pattern_last,
588 Char *restpattern,
Char *restpattern_last,
glob_t *pglob,
size_t *limitp)
590 register struct dirent *dp;
600 struct dirent *(*readdirfunc)();
602 if (pathend > pathend_last)
607 if ((dirp = g_opendir(pathbuf, pglob)) ==
NULL) {
611 if (g_Ctoc(pathbuf,
buf,
sizeof(
buf)))
627 while ((dp = (*readdirfunc)(dirp))) {
628 register uint8_t *sc;
635 sc = (uint8_t *) dp->
d_name;
636 while (dc < pathend_last && (*dc++ = *sc++) !=
EOS)
638 if (dc >= pathend_last) {
644 if (!
match(pathend, pattern, restpattern)) {
648 err = glob2(pathbuf, pathbuf_last, --dc, pathend_last,
649 restpattern, restpattern_last, pglob, limitp);
676static int globextend(
const Char *path,
glob_t *pglob,
size_t *limitp)
678 register char **pathv;
697 pathv += pglob->gl_offs;
698 for (i = pglob->gl_offs; --i >= 0; )
703 for (
p = path; *
p++;)
705 len = (u_int)(
p - path);
717 newsize + *limitp >= ARG_MAX) {
719 return(GLOB_NOSPACE);
732 int ok, negate_range;
735 while (pat < patend) {
759 if (c <= k && k <= pat[1])
764 if (ok == negate_range)
784 for (i = pglob->
gl_pathc; i--; ++pp)
799 if (g_Ctoc(str,
buf,
sizeof(
buf)))
813 if (g_Ctoc(fn,
buf,
sizeof(
buf)))
824 if (g_Ctoc(fn,
buf,
sizeof(
buf)))
840static int g_Ctoc(
const Char *str,
char *
buf, u_int
len)
844 if ((*
buf++ = (
char) *str++) ==
EOS)
852qprintf(
char *str,
Char *
s)
readdir($dir_handle=null)
getenv(?string $name=null, bool $local_only=false)
printf(string $format, mixed ... $values)
closedir($dir_handle=null)
opendir(string $directory, $context=null)
copy(string $from, string $to, $context=null)
zend_ffi_ctype_name_buf buf
PHPAPI void globfree(glob_t *pglob)
PHPAPI int glob(const char *pattern, int flags, int(*errfunc)(const char *, int), glob_t *pglob)
file_private int match(struct magic_set *, struct magic *, size_t, const struct buffer *, size_t, int, int, int, uint16_t *, uint16_t *, int *, int *, int *, int *, int *)
int(* gl_errfunc)(const char *, int)
int(* gl_lstat)(const char *, zend_stat_t *)
void(* gl_closedir)(void *)
void *(* gl_opendir)(const char *)
struct dirent *(* gl_readdir)(void *)
int(* gl_stat)(const char *, zend_stat_t *)
strcmp(string $string1, string $string2)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)