42 #if defined _AIX && !defined __GNUC__
56 #define __alloca alloca
58 #define NAMLEN(_d) NLENGTH(_d)
61 # if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
62 # define CONVERT_D_NAMLEN(d64, d32)
64 # define CONVERT_D_NAMLEN(d64, d32) \
65 (d64)->d_namlen = (d32)->d_namlen;
68 # if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
69 # define CONVERT_D_INO(d64, d32)
71 # define CONVERT_D_INO(d64, d32) \
72 (d64)->d_ino = (d32)->d_ino;
75 # ifdef _DIRENT_HAVE_D_TYPE
76 # define CONVERT_D_TYPE(d64, d32) \
77 (d64)->d_type = (d32)->d_type;
79 # define CONVERT_D_TYPE(d64, d32)
82 # define CONVERT_DIRENT_DIRENT64(d64, d32) \
83 memcpy ((d64)->d_name, (d32)->d_name, NAMLEN (d32) + 1); \
84 CONVERT_D_NAMLEN (d64, d32) \
85 CONVERT_D_INO (d64, d32) \
86 CONVERT_D_TYPE (d64, d32)
88 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
91 # define REAL_DIR_ENTRY(dp) 1
93 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
98 # define __set_errno(val) errno = (val)
104 #define GLOB_INTERFACE_VERSION 1
109 static int glob_in_dir __P ((
const char *pattern,
const char *directory,
111 int (*errfunc) (
const char *,
int),
115 static int prefix_array __P ((
const char *prefix,
char **array,
size_t n))
123 static inline const char *
126 unsigned int depth = 0;
127 const char *cp = begin;
133 if (*cp !=
',' && *cp !=
'}' && *cp !=
'\0')
143 while (*cp !=
'\0' && (*cp !=
'}' || depth > 0))
172 glob (
const char *pattern,
int flags,
173 int (*errfunc)
__P ((
const char *,
int)),
glob_t *pglob)
175 const char *filename;
181 if (pattern == NULL || pglob == NULL || (flags & ~
__GLOB_FLAGS) != 0)
189 const char *begin = strchr (pattern,
'{');
201 char onealt[strlen (pattern) - 1];
203 char *onealt = (
char *)
xmalloc (strlen (pattern) - 1);
214 alt_start = mempcpy (onealt, pattern, begin - pattern);
216 memcpy (onealt, pattern, begin - pattern);
217 alt_start = &onealt[begin - pattern];
229 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
243 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
248 rest_len = strlen (++rest) + 1;
272 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
274 memcpy (alt_start, p, next - p);
275 memcpy (&alt_start[next - p], rest, rest_len);
278 result =
glob (onealt,
280 | GLOB_APPEND), errfunc, pglob);
288 if (!(flags & GLOB_APPEND))
299 assert (next != NULL);
315 filename = strrchr (pattern,
'/');
316 #if defined __MSDOS__ || defined WINDOWS32
321 if (filename == NULL)
322 filename = strchr (pattern,
':');
324 if (filename == NULL)
331 dirlen = strlen (pattern);
349 else if (filename == pattern)
359 dirlen = filename - pattern;
360 #if defined __MSDOS__ || defined WINDOWS32
362 || (filename > pattern + 1 && filename[-1] ==
':'))
367 drive_spec = (
char *)
__alloca (dirlen + 1);
369 *((
char *) mempcpy (drive_spec, pattern, dirlen)) =
'\0';
371 memcpy (drive_spec, pattern, dirlen);
372 drive_spec[dirlen] =
'\0';
383 newp = (
char *)
__alloca (dirlen + 1);
385 *((
char *) mempcpy (newp, pattern, dirlen)) =
'\0';
387 memcpy (newp, pattern, dirlen);
393 if (filename[0] ==
'\0'
394 #
if defined __MSDOS__ || defined WINDOWS32
395 && dirname[dirlen - 1] !=
':'
396 && (dirlen < 3 || dirname[dirlen - 2] !=
':'
397 || dirname[dirlen - 1] !=
'/')
421 if (dirname[1] ==
'\0' || dirname[1] ==
'/')
424 const char *home_dir =
getenv (
"HOME");
426 if (home_dir == NULL || home_dir[0] ==
'\0')
430 if (home_dir == NULL || home_dir[0] ==
'\0')
431 home_dir =
"c:/users/default";
433 if (home_dir == NULL || home_dir[0] ==
'\0')
437 # if defined HAVE_GETLOGIN_R || defined _LIBC
438 size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
446 success = getlogin_r (name, buflen) >= 0;
448 success = (name = getlogin ()) != NULL;
453 # if defined HAVE_GETPWNAM_R || defined _LIBC
454 size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
463 pwtmpbuf = (
char *)
__alloca (pwbuflen);
465 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
474 pwtmpbuf = (
char *)
__alloca (pwbuflen);
481 home_dir = p->pw_dir;
484 if (home_dir == NULL || home_dir[0] ==
'\0')
494 if (dirname[1] ==
'\0')
499 size_t home_len = strlen (home_dir);
500 newp = (
char *)
__alloca (home_len + dirlen);
502 mempcpy (mempcpy (newp, home_dir, home_len),
503 &dirname[1], dirlen);
505 memcpy (newp, home_dir, home_len);
506 memcpy (&newp[home_len], &dirname[1], dirlen);
511 # if !defined _AMIGA && !defined WINDOWS32
514 char *end_name = strchr (dirname,
'/');
515 const char *user_name;
516 const char *home_dir;
518 if (end_name == NULL)
519 user_name = dirname + 1;
523 newp = (
char *)
__alloca (end_name - dirname);
525 *((
char *) mempcpy (newp, dirname + 1, end_name - dirname))
528 memcpy (newp, dirname + 1, end_name - dirname);
529 newp[end_name - dirname - 1] =
'\0';
537 # if defined HAVE_GETPWNAM_R || defined _LIBC
538 size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
547 pwtmpbuf = (
char *)
__alloca (buflen);
549 while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
561 p = getpwnam (user_name);
564 home_dir = p->pw_dir;
569 if (home_dir != NULL)
572 size_t home_len = strlen (home_dir);
573 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
574 newp = (
char *)
__alloca (home_len + rest_len + 1);
576 *((
char *) mempcpy (mempcpy (newp, home_dir, home_len),
577 end_name, rest_len)) =
'\0';
579 memcpy (newp, home_dir, home_len);
580 memcpy (&newp[home_len], end_name, rest_len);
581 newp[home_len + rest_len] =
'\0';
597 if (filename == NULL)
604 ? (*pglob->
gl_stat) (dirname, &st)
605 :
__stat (dirname, &st)) == 0
606 && S_ISDIR (st.st_mode)))
618 if (flags & GLOB_DOOFFS)
622 #if defined HAVE_STRDUP || defined _LIBC
626 size_t len = strlen (dirname) + 1;
667 status =
glob (dirname,
678 for (i = 0; i < (int)dirs.
gl_pathc; ++i)
685 extern int interrupt_state;
698 ((flags | GLOB_APPEND)
729 if ((
int)pglob->
gl_pathc == oldcount)
734 size_t filename_len = strlen (filename) + 1;
752 if (flags & GLOB_DOOFFS)
756 for (i = 0; i < (int)dirs.
gl_pathc; ++i)
759 size_t dir_len = strlen (dir);
762 if (((flags & GLOB_ALTDIRFUNC)
764 || !S_ISDIR (st.st_mode))
781 filename, filename_len);
786 filename, filename_len);
798 if (new_pathv != NULL)
809 status =
glob_in_dir (filename, dirname, flags, errfunc, pglob);
816 int ignore = oldcount;
836 for (i = oldcount; i < (int)pglob->
gl_pathc; ++i)
840 && S_ISDIR (st.st_mode))
842 size_t len = strlen (pglob->
gl_pathv[i]) + 2;
849 strcpy (&
new[len - 2],
"/");
857 int non_sort = oldcount;
878 for (i = 0; i < (int)pglob->
gl_pathc; ++i)
890 const char *
const s1 = *(
const char *
const *
const) a;
891 const char *
const s2 = *(
const char *
const *
const) b;
899 return strcoll (s1, s2);
911 size_t dirlen = strlen (dirname);
912 #if defined __MSDOS__ || defined WINDOWS32
914 # define DIRSEP_CHAR sep_char
916 # define DIRSEP_CHAR '/'
919 if (dirlen == 1 && dirname[0] ==
'/')
923 #if defined __MSDOS__ || defined WINDOWS32
926 if (dirname[dirlen - 1] ==
'/')
929 else if (dirname[dirlen - 1] ==
':')
938 for (i = 0; i < n; ++i)
940 size_t eltlen = strlen (array[i]) + 1;
941 char *
new = (
char *)
xmalloc (dirlen + 1 + eltlen);
951 char *endp = (
char *) mempcpy (
new, dirname, dirlen);
953 mempcpy (endp, array[i], eltlen);
956 memcpy (
new, dirname, dirlen);
958 memcpy (&
new[dirlen + 1], array[i], eltlen);
969 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
975 register const char *p;
978 for (p = pattern; *p !=
'\0'; ++p)
986 if (quote && p[1] !=
'\0')
1014 int (*errfunc)
__P ((
const char *,
int)),
glob_t *pglob)
1020 struct globlink *next;
1023 struct globlink *names = NULL;
1041 size_t patlen = strlen (pattern);
1042 size_t dirlen = strlen (directory);
1043 char *fullname = (
char *)
__alloca (dirlen + 1 + patlen + 1);
1045 # ifdef HAVE_MEMPCPY
1046 mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
1048 pattern, patlen + 1);
1050 memcpy (fullname, directory, dirlen);
1051 fullname[dirlen] =
'/';
1052 memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
1055 ? (*pglob->
gl_stat) (fullname, &st)
1056 :
__stat (fullname, &st)) == 0)
1066 if (pattern[0] ==
'\0')
1070 names = (
struct globlink *)
__alloca (
sizeof (
struct globlink));
1071 names->name = (
char *)
xmalloc (1);
1072 if (names->name == NULL)
1074 names->name[0] =
'\0';
1083 : (
__ptr_t) opendir (directory));
1086 if (
errno != ENOTDIR
1087 && ((errfunc != NULL && (*errfunc) (directory,
errno))
1097 #if defined _AMIGA || defined VMS
1108 #ifdef _LARGEFILE64_SOURCE
1112 struct dirent64 d64;
1113 char room [offsetof (
struct dirent64, d_name[0])
1130 d = readdir64 (stream);
1134 : readdir ((DIR *) stream));
1151 if (
fnmatch (pattern, name, fnm_flags) == 0)
1153 struct globlink *
new = (
struct globlink *)
1154 __alloca (
sizeof (
struct globlink));
1156 new->name = (
char *)
xmalloc (len + 1);
1157 if (new->name == NULL)
1160 *((
char *) mempcpy ((
__ptr_t)
new->name,
name, len))
1163 memcpy ((
__ptr_t) new->name, name, len);
1164 new->name[len] =
'\0';
1177 size_t len = strlen (pattern);
1179 names = (
struct globlink *)
__alloca (
sizeof (
struct globlink));
1181 names->name = (
char *)
xmalloc (len + 1);
1182 if (names->name == NULL)
1185 *((
char *) mempcpy (names->name, pattern, len)) =
'\0';
1187 memcpy (names->name, pattern, len);
1188 names->name[len] =
'\0';
1203 if (flags & GLOB_DOOFFS)
1207 for (; names != NULL; names = names->next)
1220 closedir ((DIR *) stream);
1232 closedir ((DIR *) stream);
1235 while (names != NULL)
1237 if (names->name != NULL)
1239 names = names->next;