1 /* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 Free
2 Software Foundation, Inc.
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the Free
16 Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
19 /* AIX requires this to be the first thing in the file. */
20 #if defined _AIX && !defined __GNUC__
28 /* Enable GNU extensions in glob.h. */
30 # define _GNU_SOURCE 1
34 #include <sys/types.h>
37 /* Outcomment the following line for production quality code. */
38 /* #define NDEBUG 1 */
41 #include <stdio.h> /* Needed on stupid SunOS for assert. */
44 /* Comment out all this code if we are using the GNU C Library, and are not
45 actually compiling the library itself. This code is part of the GNU C
46 Library, but also included in many other GNU distributions. Compiling
47 and linking in this code is a waste when using the GNU C library
48 (especially if it is a shared library). Rather than having every GNU
49 program understand `configure --with-gnu-libc' and omit the object files,
50 it is simpler to just do this in the source for each such file. */
52 #define GLOB_INTERFACE_VERSION 1
53 #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
54 # include <gnu-versions.h>
55 # if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
62 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
66 #if defined HAVE_UNISTD_H || defined _LIBC
69 # ifdef _POSIX_VERSION
75 #if !defined _AMIGA && !defined VMS && !defined WINDOWS32
79 #if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS
83 # define __set_errno(val) errno = (val)
91 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
93 # define NAMLEN(dirent) strlen((dirent)->d_name)
95 # define dirent direct
96 # define NAMLEN(dirent) (dirent)->d_namlen
97 # ifdef HAVE_SYS_NDIR_H
98 # include <sys/ndir.h>
100 # ifdef HAVE_SYS_DIR_H
101 # include <sys/dir.h>
106 # ifdef HAVE_VMSDIR_H
108 # endif /* HAVE_VMSDIR_H */
112 /* In GNU systems, <dirent.h> defines this macro for us. */
115 # define NAMLEN(d) _D_NAMLEN(d)
118 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
119 if the `d_type' member for `struct dirent' is available. */
120 #ifdef _DIRENT_HAVE_D_TYPE
121 # define HAVE_D_TYPE 1
125 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
126 /* Posix does not require that the d_ino field be present, and some
127 systems do not provide it. */
128 # define REAL_DIR_ENTRY(dp) 1
130 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
133 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
137 #else /* No standard headers. */
139 extern char *getenv ();
141 # ifdef HAVE_STRING_H
145 # include <strings.h>
147 # ifdef HAVE_MEMORY_H
151 extern char *malloc (), *realloc ();
154 extern void qsort ();
155 extern void abort (), exit ();
157 #endif /* Standard headers. */
162 extern void bzero ();
165 extern void bcopy ();
168 # define memcpy(d, s, n) bcopy ((s), (d), (n))
169 # define strrchr rindex
170 /* memset is only used for zero here, but let's be paranoid. */
171 # define memset(s, better_be_zero, n) \
172 ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
173 #endif /* Not ANSI_STRING. */
175 #if !defined HAVE_STRCOLL && !defined _LIBC
176 # define strcoll strcmp
179 #if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
180 # define HAVE_MEMPCPY 1
182 # define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
185 #if !defined __GNU_LIBRARY__ && !defined __DJGPP__
192 my_realloc (void *p, unsigned int n)
200 /* These casts are the for sake of the broken Ultrix compiler,
201 which warns of illegal pointer combinations otherwise. */
203 return (char *) malloc (n);
204 return (char *) realloc (p, n);
206 # define realloc my_realloc
208 #endif /* __GNU_LIBRARY__ || __DJGPP__ */
211 #if !defined __alloca && !defined __GNU_LIBRARY__
215 # define alloca(n) __builtin_alloca (n)
216 # else /* Not GCC. */
217 # ifdef HAVE_ALLOCA_H
219 # else /* Not HAVE_ALLOCA_H. */
224 extern char *alloca ();
225 # endif /* WINDOWS32 */
226 # endif /* Not _AIX. */
227 # endif /* sparc or HAVE_ALLOCA_H. */
230 # define __alloca alloca
234 #ifndef __GNU_LIBRARY__
236 # ifdef STAT_MACROS_BROKEN
240 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
246 # define strdup(str) __strdup (str)
247 # define sysconf(id) __sysconf (id)
248 # define closedir(dir) __closedir (dir)
249 # define opendir(name) __opendir (name)
250 # define readdir(str) __readdir (str)
251 # define getpwnam_r(name, bufp, buf, len, res) \
252 __getpwnam_r (name, bufp, buf, len, res)
254 # define __stat(fname, buf) __xstat (_STAT_VER, fname, buf)
258 #if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
260 # define size_t unsigned int
263 /* Some system header files erroneously define these.
264 We want our own definitions from <fnmatch.h> to take precedence. */
265 #ifndef __GNU_LIBRARY__
272 /* Some system header files erroneously define these.
273 We want our own definitions from <glob.h> to take precedence. */
274 #ifndef __GNU_LIBRARY__
281 # undef GLOB_NOESCAPE
286 #ifdef HAVE_GETLOGIN_R
287 extern int getlogin_r __P ((char *, size_t));
289 extern char *getlogin __P ((void));
293 #if __GNUC__ - 0 >= 2
296 const char *next_brace_sub __P ((const char *begin));
297 static int glob_in_dir __P ((const char *pattern, const char *directory,
299 int (*errfunc) (const char *, int),
301 static int prefix_array __P ((const char *prefix, char **array, size_t n));
302 static int collated_compare __P ((const __ptr_t, const __ptr_t));
304 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
305 int __glob_pattern_p __P ((const char *pattern, int quote));
308 /* Find the end of the sub-pattern in a brace expression. We define
309 this as an inline function if the compiler permits. */
311 #if __GNUC__ - 0 >= 2
315 next_brace_sub (begin)
318 unsigned int depth = 0;
319 const char *cp = begin;
325 if (*cp != ',' && *cp != '}' && *cp != '\0')
335 while (*cp != '\0' && (*cp != '}' || depth > 0))
342 /* An incorrectly terminated brace expression. */
353 /* Do glob searching for PATTERN, placing results in PGLOB.
354 The bits defined above may be set in FLAGS.
355 If a directory cannot be opened or read and ERRFUNC is not nil,
356 it is called with the pathname that caused the error, and the
357 `errno' value from the failing call; if it returns non-zero
358 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
359 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
360 Otherwise, `glob' returns zero. */
362 glob (pattern, flags, errfunc, pglob)
365 int (*errfunc) __P ((const char *, int));
368 const char *filename;
374 if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
376 __set_errno (EINVAL);
380 /* POSIX requires all slashes to be matched. This means that with
381 a trailing slash we must match only directories. */
382 if (pattern[0] && pattern[strlen (pattern) - 1] == '/')
383 flags |= GLOB_ONLYDIR;
385 if (flags & GLOB_BRACE)
387 const char *begin = strchr (pattern, '{');
390 /* Allocate working buffer large enough for our work. Note that
391 we have at least an opening and closing brace. */
399 char onealt[strlen (pattern) - 1];
401 char *onealt = (char *) malloc (strlen (pattern) - 1);
404 if (!(flags & GLOB_APPEND))
410 /* We know the prefix for all sub-patterns. */
412 alt_start = mempcpy (onealt, pattern, begin - pattern);
414 memcpy (onealt, pattern, begin - pattern);
415 alt_start = &onealt[begin - pattern];
418 /* Find the first sub-pattern and at the same time find the
419 rest after the closing brace. */
420 next = next_brace_sub (begin + 1);
423 /* It is an illegal expression. */
427 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
430 /* Now find the end of the whole brace expression. */
434 rest = next_brace_sub (rest + 1);
437 /* It is an illegal expression. */
441 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
444 /* Please note that we now can be sure the brace expression
446 rest_len = strlen (++rest) + 1;
448 /* We have a brace expression. BEGIN points to the opening {,
449 NEXT points past the terminator of the first element, and END
450 points past the final }. We will accumulate result names from
451 recursive runs for each brace alternative in the buffer using
454 if (!(flags & GLOB_APPEND))
456 /* This call is to set a new vector, so clear out the
457 vector so we can append to it. */
459 pglob->gl_pathv = NULL;
461 firstc = pglob->gl_pathc;
468 /* Construct the new glob expression. */
470 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
472 memcpy (alt_start, p, next - p);
473 memcpy (&alt_start[next - p], rest, rest_len);
476 result = glob (onealt,
477 ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
478 | GLOB_APPEND), errfunc, pglob);
480 /* If we got an error, return it. */
481 if (result && result != GLOB_NOMATCH)
486 if (!(flags & GLOB_APPEND))
492 /* We saw the last entry. */
496 next = next_brace_sub (p);
497 assert (next != NULL);
504 if (pglob->gl_pathc != firstc)
505 /* We found some entries. */
507 else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
512 /* Find the filename. */
513 filename = strrchr (pattern, '/');
514 #if defined __MSDOS__ || defined WINDOWS32
515 /* The case of "d:pattern". Since `:' is not allowed in
516 file names, we can safely assume that wherever it
517 happens in pattern, it signals the filename part. This
518 is so we could some day support patterns like "[a-z]:foo". */
519 if (filename == NULL)
520 filename = strchr (pattern, ':');
521 #endif /* __MSDOS__ || WINDOWS32 */
522 if (filename == NULL)
524 /* This can mean two things: a simple name or "~name". The later
525 case is nothing but a notation for a directory. */
526 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
529 dirlen = strlen (pattern);
531 /* Set FILENAME to NULL as a special flag. This is ugly but
532 other solutions would require much more code. We test for
533 this special case below. */
547 else if (filename == pattern)
557 dirlen = filename - pattern;
558 #if defined __MSDOS__ || defined WINDOWS32
560 || (filename > pattern + 1 && filename[-1] == ':'))
565 drive_spec = (char *) __alloca (dirlen + 1);
567 *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
569 memcpy (drive_spec, pattern, dirlen);
570 drive_spec[dirlen] = '\0';
572 /* For now, disallow wildcards in the drive spec, to
573 prevent infinite recursion in glob. */
574 if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
576 /* If this is "d:pattern", we need to copy `:' to DIRNAME
577 as well. If it's "d:/pattern", don't remove the slash
578 from "d:/", since "d:" and "d:/" are not the same.*/
581 newp = (char *) __alloca (dirlen + 1);
583 *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
585 memcpy (newp, pattern, dirlen);
591 if (filename[0] == '\0'
592 #if defined __MSDOS__ || defined WINDOWS32
593 && dirname[dirlen - 1] != ':'
594 && (dirlen < 3 || dirname[dirlen - 2] != ':'
595 || dirname[dirlen - 1] != '/')
598 /* "pattern/". Expand "pattern", appending slashes. */
600 int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
602 pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
603 | (flags & GLOB_MARK));
608 if (!(flags & GLOB_APPEND))
611 pglob->gl_pathv = NULL;
614 oldcount = pglob->gl_pathc;
617 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
619 if (dirname[1] == '\0' || dirname[1] == '/')
621 /* Look up home directory. */
623 /* This isn't obvious, RTLs of DECC and VAXC know about "HOME" */
624 const char *home_dir = getenv ("SYS$LOGIN");
626 const char *home_dir = getenv ("HOME");
629 if (home_dir == NULL || home_dir[0] == '\0')
633 if (home_dir == NULL || home_dir[0] == '\0')
634 home_dir = "c:/users/default"; /* poor default */
637 /* Again, this isn't obvious, if "HOME" isn't known "SYS$LOGIN" should be set */
638 if (home_dir == NULL || home_dir[0] == '\0')
639 home_dir = "SYS$DISK:[]";
641 if (home_dir == NULL || home_dir[0] == '\0')
645 # if defined HAVE_GETLOGIN_R || defined _LIBC
646 size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
649 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
652 name = (char *) __alloca (buflen);
654 success = getlogin_r (name, buflen) >= 0;
656 success = (name = getlogin ()) != NULL;
661 # if defined HAVE_GETPWNAM_R || defined _LIBC
662 size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
668 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
669 Try a moderate value. */
671 pwtmpbuf = (char *) __alloca (pwbuflen);
673 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
682 pwtmpbuf = (char *) __alloca (pwbuflen);
689 home_dir = p->pw_dir;
692 if (home_dir == NULL || home_dir[0] == '\0')
694 if (flags & GLOB_TILDE_CHECK)
697 home_dir = "~"; /* No luck. */
700 # endif /* WINDOWS32 */
702 /* Now construct the full directory. */
703 if (dirname[1] == '\0')
708 size_t home_len = strlen (home_dir);
709 newp = (char *) __alloca (home_len + dirlen);
711 mempcpy (mempcpy (newp, home_dir, home_len),
712 &dirname[1], dirlen);
714 memcpy (newp, home_dir, home_len);
715 memcpy (&newp[home_len], &dirname[1], dirlen);
720 # if !defined _AMIGA && !defined WINDOWS32 && !defined VMS
723 char *end_name = strchr (dirname, '/');
724 const char *user_name;
725 const char *home_dir;
727 if (end_name == NULL)
728 user_name = dirname + 1;
732 newp = (char *) __alloca (end_name - dirname);
734 *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
737 memcpy (newp, dirname + 1, end_name - dirname);
738 newp[end_name - dirname - 1] = '\0';
743 /* Look up specific user's home directory. */
746 # if defined HAVE_GETPWNAM_R || defined _LIBC
747 size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
753 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
756 pwtmpbuf = (char *) __alloca (buflen);
758 while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
766 pwtmpbuf = __alloca (buflen);
770 p = getpwnam (user_name);
773 home_dir = p->pw_dir;
777 /* If we found a home directory use this. */
778 if (home_dir != NULL)
781 size_t home_len = strlen (home_dir);
782 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
783 newp = (char *) __alloca (home_len + rest_len + 1);
785 *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
786 end_name, rest_len)) = '\0';
788 memcpy (newp, home_dir, home_len);
789 memcpy (&newp[home_len], end_name, rest_len);
790 newp[home_len + rest_len] = '\0';
795 if (flags & GLOB_TILDE_CHECK)
796 /* We have to regard it as an error if we cannot find the
800 # endif /* Not Amiga && not WINDOWS32 && not VMS. */
802 #endif /* Not VMS. */
804 /* Now test whether we looked for "~" or "~NAME". In this case we
805 can give the answer now. */
806 if (filename == NULL)
810 /* Return the directory if we don't check for error or if it exists. */
811 if ((flags & GLOB_NOCHECK)
812 || (((flags & GLOB_ALTDIRFUNC)
813 ? (*pglob->gl_stat) (dirname, &st)
814 : __stat (dirname, &st)) == 0
815 && S_ISDIR (st.st_mode)))
818 = (char **) realloc (pglob->gl_pathv,
820 ((flags & GLOB_DOOFFS) ?
821 pglob->gl_offs : 0) +
824 if (pglob->gl_pathv == NULL)
827 if (flags & GLOB_DOOFFS)
828 while (pglob->gl_pathc < pglob->gl_offs)
829 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
831 #if defined HAVE_STRDUP || defined _LIBC
832 pglob->gl_pathv[pglob->gl_pathc] = strdup (dirname);
835 size_t len = strlen (dirname) + 1;
836 char *dircopy = malloc (len);
838 pglob->gl_pathv[pglob->gl_pathc] = memcpy (dircopy, dirname,
842 if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
844 free (pglob->gl_pathv);
847 pglob->gl_pathv[++pglob->gl_pathc] = NULL;
848 pglob->gl_flags = flags;
857 if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
859 /* The directory name contains metacharacters, so we
860 have to glob for the directory, and then glob for
861 the pattern in each directory found. */
865 status = glob (dirname,
866 ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE))
867 | GLOB_NOSORT | GLOB_ONLYDIR),
872 /* We have successfully globbed the preceding directory name.
873 For each name we found, call glob_in_dir on it and FILENAME,
874 appending the results to PGLOB. */
875 for (i = 0; i < dirs.gl_pathc; ++i)
881 /* Make globbing interruptible in the bash shell. */
882 extern int interrupt_state;
893 old_pathc = pglob->gl_pathc;
894 status = glob_in_dir (filename, dirs.gl_pathv[i],
895 ((flags | GLOB_APPEND)
896 & ~(GLOB_NOCHECK | GLOB_ERR)),
898 if (status == GLOB_NOMATCH)
899 /* No matches in this directory. Try the next. */
909 /* Stick the directory on the front of each name. */
910 if (prefix_array (dirs.gl_pathv[i],
911 &pglob->gl_pathv[old_pathc],
912 pglob->gl_pathc - old_pathc))
920 flags |= GLOB_MAGCHAR;
922 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
923 But if we have not found any matching entry and thie GLOB_NOCHECK
924 flag was set we must return the list consisting of the disrectory
925 names followed by the filename. */
926 if (pglob->gl_pathc == oldcount)
929 if (flags & GLOB_NOCHECK)
931 size_t filename_len = strlen (filename) + 1;
935 /* This is an pessimistic guess about the size. */
937 = (char **) realloc (pglob->gl_pathv,
939 ((flags & GLOB_DOOFFS) ?
940 pglob->gl_offs : 0) +
943 if (pglob->gl_pathv == NULL)
949 if (flags & GLOB_DOOFFS)
950 while (pglob->gl_pathc < pglob->gl_offs)
951 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
953 for (i = 0; i < dirs.gl_pathc; ++i)
955 const char *dir = dirs.gl_pathv[i];
956 size_t dir_len = strlen (dir);
958 /* First check whether this really is a directory. */
959 if (((flags & GLOB_ALTDIRFUNC)
960 ? (*pglob->gl_stat) (dir, &st) : __stat (dir, &st)) != 0
961 || !S_ISDIR (st.st_mode))
962 /* No directory, ignore this entry. */
965 pglob->gl_pathv[pglob->gl_pathc] = malloc (dir_len + 1
967 if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
975 mempcpy (mempcpy (mempcpy (pglob->gl_pathv[pglob->gl_pathc],
978 filename, filename_len);
980 memcpy (pglob->gl_pathv[pglob->gl_pathc], dir, dir_len);
981 pglob->gl_pathv[pglob->gl_pathc][dir_len] = '/';
982 memcpy (&pglob->gl_pathv[pglob->gl_pathc][dir_len + 1],
983 filename, filename_len);
988 pglob->gl_pathv[pglob->gl_pathc] = NULL;
989 pglob->gl_flags = flags;
991 /* Now we know how large the gl_pathv vector must be. */
992 new_pathv = (char **) realloc (pglob->gl_pathv,
993 ((pglob->gl_pathc + 1)
995 if (new_pathv != NULL)
996 pglob->gl_pathv = new_pathv;
1006 status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
1012 /* Stick the directory on the front of each name. */
1013 int ignore = oldcount;
1015 if ((flags & GLOB_DOOFFS) && ignore < pglob->gl_offs)
1016 ignore = pglob->gl_offs;
1018 if (prefix_array (dirname,
1019 &pglob->gl_pathv[ignore],
1020 pglob->gl_pathc - ignore))
1023 return GLOB_NOSPACE;
1028 if (flags & GLOB_MARK)
1030 /* Append slashes to directory names. */
1033 for (i = oldcount; i < pglob->gl_pathc; ++i)
1034 if (((flags & GLOB_ALTDIRFUNC)
1035 ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
1036 : __stat (pglob->gl_pathv[i], &st)) == 0
1037 && S_ISDIR (st.st_mode))
1039 size_t len = strlen (pglob->gl_pathv[i]) + 2;
1040 char *new = realloc (pglob->gl_pathv[i], len);
1044 return GLOB_NOSPACE;
1046 strcpy (&new[len - 2], "/");
1047 pglob->gl_pathv[i] = new;
1051 if (!(flags & GLOB_NOSORT))
1053 /* Sort the vector. */
1054 int non_sort = oldcount;
1056 if ((flags & GLOB_DOOFFS) && pglob->gl_offs > oldcount)
1057 non_sort = pglob->gl_offs;
1059 qsort ((__ptr_t) &pglob->gl_pathv[non_sort],
1060 pglob->gl_pathc - non_sort,
1061 sizeof (char *), collated_compare);
1068 /* Free storage allocated in PGLOB by a previous `glob' call. */
1071 register glob_t *pglob;
1073 if (pglob->gl_pathv != NULL)
1076 for (i = 0; i < pglob->gl_pathc; ++i)
1077 if (pglob->gl_pathv[i] != NULL)
1078 free ((__ptr_t) pglob->gl_pathv[i]);
1079 free ((__ptr_t) pglob->gl_pathv);
1084 /* Do a collated comparison of A and B. */
1086 collated_compare (a, b)
1090 const char *const s1 = *(const char *const * const) a;
1091 const char *const s2 = *(const char *const * const) b;
1099 return strcoll (s1, s2);
1103 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1104 elements in place. Return nonzero if out of memory, zero if successful.
1105 A slash is inserted between DIRNAME and each elt of ARRAY,
1106 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1108 prefix_array (dirname, array, n)
1109 const char *dirname;
1114 size_t dirlen = strlen (dirname);
1115 #if defined __MSDOS__ || defined WINDOWS32
1117 # define DIRSEP_CHAR sep_char
1119 # define DIRSEP_CHAR '/'
1122 if (dirlen == 1 && dirname[0] == '/')
1123 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1124 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1126 #if defined __MSDOS__ || defined WINDOWS32
1127 else if (dirlen > 1)
1129 if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
1130 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1132 else if (dirname[dirlen - 1] == ':')
1134 /* DIRNAME is "d:". Use `:' instead of `/'. */
1141 for (i = 0; i < n; ++i)
1143 size_t eltlen = strlen (array[i]) + 1;
1144 char *new = (char *) malloc (dirlen + 1 + eltlen);
1148 free ((__ptr_t) array[--i]);
1154 char *endp = (char *) mempcpy (new, dirname, dirlen);
1155 *endp++ = DIRSEP_CHAR;
1156 mempcpy (endp, array[i], eltlen);
1159 memcpy (new, dirname, dirlen);
1160 new[dirlen] = DIRSEP_CHAR;
1161 memcpy (&new[dirlen + 1], array[i], eltlen);
1163 free ((__ptr_t) array[i]);
1171 /* We must not compile this function twice. */
1172 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1173 /* Return nonzero if PATTERN contains any metacharacters.
1174 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1176 __glob_pattern_p (pattern, quote)
1177 const char *pattern;
1180 register const char *p;
1183 for (p = pattern; *p != '\0'; ++p)
1191 if (quote && p[1] != '\0')
1208 weak_alias (__glob_pattern_p, glob_pattern_p)
1213 /* Like `glob', but PATTERN is a final pathname component,
1214 and matches are searched for in DIRECTORY.
1215 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1216 The GLOB_APPEND flag is assumed to be set (always appends). */
1218 glob_in_dir (pattern, directory, flags, errfunc, pglob)
1219 const char *pattern;
1220 const char *directory;
1222 int (*errfunc) __P ((const char *, int));
1225 __ptr_t stream = NULL;
1229 struct globlink *next;
1232 struct globlink *names = NULL;
1238 if (*directory == 0)
1241 meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
1244 if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))
1245 /* We need not do any tests. The PATTERN contains no meta
1246 characters and we must not return an error therefore the
1247 result will always contain exactly one name. */
1248 flags |= GLOB_NOCHECK;
1251 /* Since we use the normal file functions we can also use stat()
1252 to verify the file is there. */
1254 size_t patlen = strlen (pattern);
1255 size_t dirlen = strlen (directory);
1256 char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
1258 # ifdef HAVE_MEMPCPY
1259 mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
1261 pattern, patlen + 1);
1263 memcpy (fullname, directory, dirlen);
1264 fullname[dirlen] = '/';
1265 memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
1267 if (((flags & GLOB_ALTDIRFUNC)
1268 ? (*pglob->gl_stat) (fullname, &st)
1269 : __stat (fullname, &st)) == 0)
1270 /* We found this file to be existing. Now tell the rest
1271 of the function to copy this name into the result. */
1272 flags |= GLOB_NOCHECK;
1279 if (pattern[0] == '\0')
1281 /* This is a special case for matching directories like in
1283 names = (struct globlink *) __alloca (sizeof (struct globlink));
1284 names->name = (char *) malloc (1);
1285 if (names->name == NULL)
1287 names->name[0] = '\0';
1294 stream = ((flags & GLOB_ALTDIRFUNC)
1295 ? (*pglob->gl_opendir) (directory)
1296 : (__ptr_t) opendir (directory));
1299 if (errno != ENOTDIR
1300 && ((errfunc != NULL && (*errfunc) (directory, errno))
1301 || (flags & GLOB_ERR)))
1302 return GLOB_ABORTED;
1308 int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
1309 | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
1310 #if defined HAVE_CASE_INSENSITIVE_FS
1315 flags |= GLOB_MAGCHAR;
1321 struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
1322 ? (*pglob->gl_readdir) (stream)
1323 : readdir ((DIR *) stream));
1326 if (! REAL_DIR_ENTRY (d))
1330 /* If we shall match only directories use the information
1331 provided by the dirent call if possible. */
1332 if ((flags & GLOB_ONLYDIR)
1333 && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
1339 if (fnmatch (pattern, name, fnm_flags) == 0)
1341 struct globlink *new = (struct globlink *)
1342 __alloca (sizeof (struct globlink));
1344 new->name = (char *) malloc (len + 1);
1345 if (new->name == NULL)
1348 *((char *) mempcpy ((__ptr_t) new->name, name, len))
1351 memcpy ((__ptr_t) new->name, name, len);
1352 new->name[len] = '\0';
1363 if (nfound == 0 && (flags & GLOB_NOCHECK))
1365 size_t len = strlen (pattern);
1367 names = (struct globlink *) __alloca (sizeof (struct globlink));
1369 names->name = (char *) malloc (len + 1);
1370 if (names->name == NULL)
1373 *((char *) mempcpy (names->name, pattern, len)) = '\0';
1375 memcpy (names->name, pattern, len);
1376 names->name[len] = '\0';
1383 = (char **) realloc (pglob->gl_pathv,
1385 ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
1388 if (pglob->gl_pathv == NULL)
1391 if (flags & GLOB_DOOFFS)
1392 while (pglob->gl_pathc < pglob->gl_offs)
1393 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
1395 for (; names != NULL; names = names->next)
1396 pglob->gl_pathv[pglob->gl_pathc++] = names->name;
1397 pglob->gl_pathv[pglob->gl_pathc] = NULL;
1399 pglob->gl_flags = flags;
1405 if (flags & GLOB_ALTDIRFUNC)
1406 (*pglob->gl_closedir) (stream);
1408 closedir ((DIR *) stream);
1412 return nfound == 0 ? GLOB_NOMATCH : 0;
1417 if (flags & GLOB_ALTDIRFUNC)
1418 (*pglob->gl_closedir) (stream);
1420 closedir ((DIR *) stream);
1423 while (names != NULL)
1425 if (names->name != NULL)
1426 free ((__ptr_t) names->name);
1427 names = names->next;
1429 return GLOB_NOSPACE;
1432 #endif /* Not ELIDE_CODE. */