1 /* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
3 This library is free software; you can redistribute it and/or
4 modify it under the terms of the GNU Library General Public License as
5 published by the Free Software Foundation; either version 2 of the
6 License, or (at your option) any later version.
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details.
13 You should have received a copy of the GNU Library General Public
14 License along with this library; see the file COPYING.LIB. If not,
15 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 Boston, MA 02111-1307, USA. */
18 /* AIX requires this to be the first thing in the file. */
19 #if defined _AIX && !defined __GNUC__
27 /* Enable GNU extensions in glob.h. */
29 # define _GNU_SOURCE 1
33 #include <sys/types.h>
36 /* Outcomment the following line for production quality code. */
37 /* #define NDEBUG 1 */
40 #include <stdio.h> /* Needed on stupid SunOS for assert. */
43 /* Comment out all this code if we are using the GNU C Library, and are not
44 actually compiling the library itself. This code is part of the GNU C
45 Library, but also included in many other GNU distributions. Compiling
46 and linking in this code is a waste when using the GNU C library
47 (especially if it is a shared library). Rather than having every GNU
48 program understand `configure --with-gnu-libc' and omit the object files,
49 it is simpler to just do this in the source for each such file. */
51 #define GLOB_INTERFACE_VERSION 1
52 #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
53 # include <gnu-versions.h>
54 # if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
61 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
65 #if defined HAVE_UNISTD_H || defined _LIBC
68 # ifdef _POSIX_VERSION
74 #if !defined _AMIGA && !defined VMS && !defined WINDOWS32
78 #if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS
82 # define __set_errno(val) errno = (val)
90 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
92 # define NAMLEN(dirent) strlen((dirent)->d_name)
94 # define dirent direct
95 # define NAMLEN(dirent) (dirent)->d_namlen
96 # ifdef HAVE_SYS_NDIR_H
97 # include <sys/ndir.h>
99 # ifdef HAVE_SYS_DIR_H
100 # include <sys/dir.h>
105 # ifdef HAVE_VMSDIR_H
107 # endif /* HAVE_VMSDIR_H */
111 /* In GNU systems, <dirent.h> defines this macro for us. */
114 # define NAMLEN(d) _D_NAMLEN(d)
118 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
119 /* Posix does not require that the d_ino field be present, and some
120 systems do not provide it. */
121 # define REAL_DIR_ENTRY(dp) 1
123 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
126 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
130 #else /* No standard headers. */
132 extern char *getenv ();
134 # ifdef HAVE_STRING_H
138 # include <strings.h>
140 # ifdef HAVE_MEMORY_H
144 extern char *malloc (), *realloc ();
147 extern void qsort ();
148 extern void abort (), exit ();
150 #endif /* Standard headers. */
155 extern void bzero ();
158 extern void bcopy ();
161 # define memcpy(d, s, n) bcopy ((s), (d), (n))
162 # define strrchr rindex
163 /* memset is only used for zero here, but let's be paranoid. */
164 # define memset(s, better_be_zero, n) \
165 ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
166 #endif /* Not ANSI_STRING. */
168 #if !defined HAVE_STRCOLL && !defined _LIBC
169 # define strcoll strcmp
172 #if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
173 # define HAVE_MEMPCPY 1
174 # define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
178 #ifndef __GNU_LIBRARY__
192 /* These casts are the for sake of the broken Ultrix compiler,
193 which warns of illegal pointer combinations otherwise. */
195 return (char *) malloc (n);
196 return (char *) realloc (p, n);
198 # define realloc my_realloc
200 #endif /* __GNU_LIBRARY__ */
203 #if !defined __alloca && !defined __GNU_LIBRARY__
207 # define alloca(n) __builtin_alloca (n)
208 # else /* Not GCC. */
209 # ifdef HAVE_ALLOCA_H
211 # else /* Not HAVE_ALLOCA_H. */
216 extern char *alloca ();
217 # endif /* WINDOWS32 */
218 # endif /* Not _AIX. */
219 # endif /* sparc or HAVE_ALLOCA_H. */
222 # define __alloca alloca
226 #ifndef __GNU_LIBRARY__
228 # ifdef STAT_MACROS_BROKEN
232 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
236 #if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
238 # define size_t unsigned int
241 /* Some system header files erroneously define these.
242 We want our own definitions from <fnmatch.h> to take precedence. */
248 /* Some system header files erroneously define these.
249 We want our own definitions from <glob.h> to take precedence. */
261 #if __GNUC__ - 0 >= 2
264 const char *next_brace_sub __P ((const char *begin));
265 static int glob_in_dir __P ((const char *pattern, const char *directory,
267 int (*errfunc) __P ((const char *, int)),
269 static int prefix_array __P ((const char *prefix, char **array, size_t n));
270 static int collated_compare __P ((const __ptr_t, const __ptr_t));
273 /* Find the end of the sub-pattern in a brace expression. We define
274 this as an inline function if the compiler permits. */
276 #if __GNUC__ - 0 >= 2
280 next_brace_sub (begin)
283 unsigned int depth = 0;
284 const char *cp = begin;
290 if (*cp != ',' && *cp != '}' && *cp != '\0')
300 while (*cp != '\0' && (*cp != '}' || depth > 0))
307 /* An incorrectly terminated brace expression. */
318 /* Do glob searching for PATTERN, placing results in PGLOB.
319 The bits defined above may be set in FLAGS.
320 If a directory cannot be opened or read and ERRFUNC is not nil,
321 it is called with the pathname that caused the error, and the
322 `errno' value from the failing call; if it returns non-zero
323 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
324 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
325 Otherwise, `glob' returns zero. */
327 glob (pattern, flags, errfunc, pglob)
330 int (*errfunc) __P ((const char *, int));
333 const char *filename;
339 if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
341 __set_errno (EINVAL);
345 if (flags & GLOB_BRACE)
347 const char *begin = strchr (pattern, '{');
350 /* Allocate working buffer large enough for our work. Note that
351 we have at least an opening and closing brace. */
359 char onealt[strlen (pattern) - 1];
361 char *onealt = (char *) malloc (strlen (pattern) - 1);
364 if (!(flags & GLOB_APPEND))
370 /* We know the prefix for all sub-patterns. */
371 memcpy (onealt, pattern, begin - pattern);
372 alt_start = &onealt[begin - pattern];
374 /* Find the first sub-pattern and at the same time find the
375 rest after the closing brace. */
376 next = next_brace_sub (begin + 1);
379 /* It is an illegal expression. */
383 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
386 /* Now find the end of the whole brace expression. */
390 rest = next_brace_sub (rest + 1);
393 /* It is an illegal expression. */
397 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
400 /* Please note that we now can be sure the brace expression
402 rest_len = strlen (++rest) + 1;
404 /* We have a brace expression. BEGIN points to the opening {,
405 NEXT points past the terminator of the first element, and END
406 points past the final }. We will accumulate result names from
407 recursive runs for each brace alternative in the buffer using
410 if (!(flags & GLOB_APPEND))
412 /* This call is to set a new vector, so clear out the
413 vector so we can append to it. */
415 pglob->gl_pathv = NULL;
417 firstc = pglob->gl_pathc;
424 /* Construct the new glob expression. */
426 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
428 memcpy (alt_start, p, next - p);
429 memcpy (&alt_start[next - p], rest, rest_len);
432 result = glob (onealt,
433 ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
434 | GLOB_APPEND), errfunc, pglob);
436 /* If we got an error, return it. */
437 if (result && result != GLOB_NOMATCH)
442 if (!(flags & GLOB_APPEND))
448 /* We saw the last entry. */
452 next = next_brace_sub (p);
453 assert (next != NULL);
460 if (pglob->gl_pathc != firstc)
461 /* We found some entries. */
463 else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
468 /* Find the filename. */
469 filename = strrchr (pattern, '/');
470 if (filename == NULL)
474 dirname = (char *) "";
476 dirname = (char *) ".";
480 else if (filename == pattern)
483 dirname = (char *) "/";
489 dirlen = filename - pattern;
490 dirname = (char *) __alloca (dirlen + 1);
492 *((char *) mempcpy (dirname, pattern, dirlen)) = '\0';
494 memcpy (dirname, pattern, dirlen);
495 dirname[dirlen] = '\0';
500 if (filename[0] == '\0' && dirlen > 1)
501 /* "pattern/". Expand "pattern", appending slashes. */
503 int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
505 pglob->gl_flags = (pglob->gl_flags & ~GLOB_MARK) | (flags & GLOB_MARK);
509 if (!(flags & GLOB_APPEND))
512 pglob->gl_pathv = NULL;
515 oldcount = pglob->gl_pathc;
518 if ((flags & GLOB_TILDE) && dirname[0] == '~')
520 if (dirname[1] == '\0' || dirname[1] == '/')
522 /* Look up home directory. */
523 char *home_dir = getenv ("HOME");
525 if (home_dir == NULL || home_dir[0] == '\0')
529 if (home_dir == NULL || home_dir[0] == '\0')
530 home_dir = "c:/users/default"; /* poor default */
532 if (home_dir == NULL || home_dir[0] == '\0')
535 # if defined HAVE_GETLOGIN_R || defined _LIBC
536 extern int getlogin_r __P ((char *, size_t));
537 size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
541 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
544 name = (char *) __alloca (buflen);
546 success = getlogin_r (name, buflen) >= 0;
548 extern char *getlogin __P ((void));
551 success = (name = getlogin ()) != NULL;
555 # if defined HAVE_GETPWNAM_R || defined _LIBC
556 size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
558 struct passwd pwbuf, *p;
560 pwtmpbuf = (char *) __alloca (pwbuflen);
562 success = (__getpwnam_r (name, &pwbuf, pwtmpbuf,
565 struct passwd *p = getpwnam (name);
569 home_dir = p->pw_dir;
572 if (home_dir == NULL || home_dir[0] == '\0')
573 home_dir = (char *) "~"; /* No luck. */
574 # endif /* WINDOWS32 */
576 /* Now construct the full directory. */
577 if (dirname[1] == '\0')
582 size_t home_len = strlen (home_dir);
583 newp = (char *) __alloca (home_len + dirlen);
585 mempcpy (mempcpy (newp, home_dir, home_len),
586 &dirname[1], dirlen);
588 memcpy (newp, home_dir, home_len);
589 memcpy (&newp[home_len], &dirname[1], dirlen);
594 # if !defined _AMIGA && !defined WINDOWS32
597 char *end_name = strchr (dirname, '/');
601 if (end_name == NULL)
602 user_name = dirname + 1;
605 user_name = (char *) __alloca (end_name - dirname);
607 *((char *) mempcpy (user_name, dirname + 1, end_name - dirname))
610 memcpy (user_name, dirname + 1, end_name - dirname);
611 user_name[end_name - dirname - 1] = '\0';
615 /* Look up specific user's home directory. */
617 # if defined HAVE_GETPWNAM_R || defined _LIBC
618 size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
619 char *pwtmpbuf = (char *) __alloca (buflen);
620 struct passwd pwbuf, *p;
621 if (__getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) >= 0)
622 home_dir = p->pw_dir;
626 struct passwd *p = getpwnam (user_name);
628 home_dir = p->pw_dir;
633 /* If we found a home directory use this. */
634 if (home_dir != NULL)
637 size_t home_len = strlen (home_dir);
638 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
639 newp = (char *) __alloca (home_len + rest_len + 1);
641 *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
642 end_name, rest_len)) = '\0';
644 memcpy (newp, home_dir, home_len);
645 memcpy (&newp[home_len], end_name, rest_len);
646 newp[home_len + rest_len] = '\0';
651 # endif /* Not Amiga && not WINDOWS32. */
653 #endif /* Not VMS. */
655 if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
657 /* The directory name contains metacharacters, so we
658 have to glob for the directory, and then glob for
659 the pattern in each directory found. */
663 status = glob (dirname,
664 ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE)) |
670 /* We have successfully globbed the preceding directory name.
671 For each name we found, call glob_in_dir on it and FILENAME,
672 appending the results to PGLOB. */
673 for (i = 0; i < dirs.gl_pathc; ++i)
679 /* Make globbing interruptible in the bash shell. */
680 extern int interrupt_state;
691 oldcount = pglob->gl_pathc;
692 status = glob_in_dir (filename, dirs.gl_pathv[i],
693 (flags | GLOB_APPEND) & ~GLOB_NOCHECK,
695 if (status == GLOB_NOMATCH)
696 /* No matches in this directory. Try the next. */
706 /* Stick the directory on the front of each name. */
707 if (prefix_array (dirs.gl_pathv[i],
708 &pglob->gl_pathv[oldcount],
709 pglob->gl_pathc - oldcount))
717 flags |= GLOB_MAGCHAR;
719 if (pglob->gl_pathc == oldcount)
721 if (flags & GLOB_NOCHECK)
723 size_t len = strlen (pattern) + 1;
724 char *patcopy = (char *) malloc (len);
727 memcpy (patcopy, pattern, len);
730 = (char **) realloc (pglob->gl_pathv,
732 ((flags & GLOB_DOOFFS) ?
733 pglob->gl_offs : 0) +
736 if (pglob->gl_pathv == NULL)
742 if (flags & GLOB_DOOFFS)
743 while (pglob->gl_pathc < pglob->gl_offs)
744 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
746 pglob->gl_pathv[pglob->gl_pathc++] = patcopy;
747 pglob->gl_pathv[pglob->gl_pathc] = NULL;
748 pglob->gl_flags = flags;
755 status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
761 /* Stick the directory on the front of each name. */
762 if (prefix_array (dirname,
763 &pglob->gl_pathv[oldcount],
764 pglob->gl_pathc - oldcount))
772 if (flags & GLOB_MARK)
774 /* Append slashes to directory names. */
777 for (i = oldcount; i < pglob->gl_pathc; ++i)
778 if (((flags & GLOB_ALTDIRFUNC) ?
779 (*pglob->gl_stat) (pglob->gl_pathv[i], &st) :
780 __stat (pglob->gl_pathv[i], &st)) == 0 &&
781 S_ISDIR (st.st_mode))
783 size_t len = strlen (pglob->gl_pathv[i]) + 2;
784 char *new = realloc (pglob->gl_pathv[i], len);
790 strcpy (&new[len - 2], "/");
791 pglob->gl_pathv[i] = new;
795 if (!(flags & GLOB_NOSORT))
796 /* Sort the vector. */
797 qsort ((__ptr_t) &pglob->gl_pathv[oldcount],
798 pglob->gl_pathc - oldcount,
799 sizeof (char *), collated_compare);
805 /* Free storage allocated in PGLOB by a previous `glob' call. */
808 register glob_t *pglob;
810 if (pglob->gl_pathv != NULL)
813 for (i = 0; i < pglob->gl_pathc; ++i)
814 if (pglob->gl_pathv[i] != NULL)
815 free ((__ptr_t) pglob->gl_pathv[i]);
816 free ((__ptr_t) pglob->gl_pathv);
821 /* Do a collated comparison of A and B. */
823 collated_compare (a, b)
827 const char *const s1 = *(const char *const * const) a;
828 const char *const s2 = *(const char *const * const) b;
836 return strcoll (s1, s2);
840 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
841 elements in place. Return nonzero if out of memory, zero if successful.
842 A slash is inserted between DIRNAME and each elt of ARRAY,
843 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
845 prefix_array (dirname, array, n)
851 size_t dirlen = strlen (dirname);
853 if (dirlen == 1 && dirname[0] == '/')
854 /* DIRNAME is just "/", so normal prepending would get us "//foo".
855 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
858 for (i = 0; i < n; ++i)
860 size_t eltlen = strlen (array[i]) + 1;
861 char *new = (char *) malloc (dirlen + 1 + eltlen);
865 free ((__ptr_t) array[--i]);
871 char *endp = (char *) mempcpy (new, dirname, dirlen);
873 mempcpy (endp, array[i], eltlen);
876 memcpy (new, dirname, dirlen);
878 memcpy (&new[dirlen + 1], array[i], eltlen);
880 free ((__ptr_t) array[i]);
888 /* Return nonzero if PATTERN contains any metacharacters.
889 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
891 __glob_pattern_p (pattern, quote)
895 register const char *p;
898 for (p = pattern; *p != '\0'; ++p)
906 if (quote && p[1] != '\0')
923 weak_alias (__glob_pattern_p, glob_pattern_p)
927 /* Like `glob', but PATTERN is a final pathname component,
928 and matches are searched for in DIRECTORY.
929 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
930 The GLOB_APPEND flag is assumed to be set (always appends). */
932 glob_in_dir (pattern, directory, flags, errfunc, pglob)
934 const char *directory;
936 int (*errfunc) __P ((const char *, int));
943 struct globlink *next;
946 struct globlink *names = NULL;
949 if (!__glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
951 /* We must check whether the file in this directory exists. */
952 stream = ((flags & GLOB_ALTDIRFUNC) ?
953 (*pglob->gl_opendir) (directory) :
954 (__ptr_t) opendir (directory));
957 if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
961 else if (pattern[0] == '\0')
963 /* This is a special case for matching directories like in
965 names = (struct globlink *) __alloca (sizeof (struct globlink));
966 names->name = (char *) malloc (1);
967 if (names->name == NULL)
969 names->name[0] = '\0';
976 struct dirent *d = ((flags & GLOB_ALTDIRFUNC) ?
977 (*pglob->gl_readdir) (stream) :
978 readdir ((DIR *) stream));
981 if (! REAL_DIR_ENTRY (d))
984 if (strcmp (pattern, d->d_name) == 0)
986 size_t len = NAMLEN (d);
988 (struct globlink *) __alloca (sizeof (struct globlink));
989 names->name = (char *) malloc (len + 1);
990 if (names->name == NULL)
993 *((char *) mempcpy ((__ptr_t) names->name, pattern, len))
996 memcpy ((__ptr_t) names->name, pattern, len);
997 names->name[len] = '\0';
1007 flags |= GLOB_MAGCHAR;
1009 stream = ((flags & GLOB_ALTDIRFUNC) ?
1010 (*pglob->gl_opendir) (directory) :
1011 (__ptr_t) opendir (directory));
1014 if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
1016 return GLOB_ABORTED;
1023 struct dirent *d = ((flags & GLOB_ALTDIRFUNC) ?
1024 (*pglob->gl_readdir) (stream) :
1025 readdir ((DIR *) stream));
1028 if (! REAL_DIR_ENTRY (d))
1033 if (fnmatch (pattern, name,
1034 (!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) |
1035 ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
1041 struct globlink *new
1042 = (struct globlink *) __alloca (sizeof (struct globlink));
1045 = (char *) malloc (len + 1);
1046 if (new->name == NULL)
1049 *((char *) mempcpy ((__ptr_t) new->name, name, len)) = '\0';
1051 memcpy ((__ptr_t) new->name, name, len);
1052 new->name[len] = '\0';
1061 if (nfound == 0 && (flags & GLOB_NOMAGIC) &&
1062 ! __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
1063 flags |= GLOB_NOCHECK;
1065 if (nfound == 0 && (flags & GLOB_NOCHECK))
1067 size_t len = strlen (pattern);
1069 names = (struct globlink *) __alloca (sizeof (struct globlink));
1071 names->name = (char *) malloc (len + 1);
1072 if (names->name == NULL)
1075 *((char *) mempcpy (names->name, pattern, len)) = '\0';
1077 memcpy (names->name, pattern, len);
1078 names->name[len] = '\0';
1085 = (char **) realloc (pglob->gl_pathv,
1087 ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
1090 if (pglob->gl_pathv == NULL)
1093 if (flags & GLOB_DOOFFS)
1094 while (pglob->gl_pathc < pglob->gl_offs)
1095 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
1097 for (; names != NULL; names = names->next)
1098 pglob->gl_pathv[pglob->gl_pathc++] = names->name;
1099 pglob->gl_pathv[pglob->gl_pathc] = NULL;
1101 pglob->gl_flags = flags;
1107 if (flags & GLOB_ALTDIRFUNC)
1108 (*pglob->gl_closedir) (stream);
1110 closedir ((DIR *) stream);
1113 return nfound == 0 ? GLOB_NOMATCH : 0;
1118 if (flags & GLOB_ALTDIRFUNC)
1119 (*pglob->gl_closedir) (stream);
1121 closedir ((DIR *) stream);
1124 while (names != NULL)
1126 if (names->name != NULL)
1127 free ((__ptr_t) names->name);
1128 names = names->next;
1130 return GLOB_NOSPACE;
1133 #endif /* Not ELIDE_CODE. */