1 /* glob.c -- file-name wildcard pattern matching for Bash.
3 Copyright (C) 1985-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne-Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
21 /* To whomever it may concern: I have never seen the code which most
22 Unix programs use to perform this function. I wrote this from scratch
23 based on specifications for the pattern matching. --RMS. */
27 #if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
29 #endif /* _AIX && RISC6000 && !__GNUC__ */
31 #include "bashtypes.h"
33 #if defined (HAVE_UNISTD_H)
39 #include "posixstat.h"
58 #if !defined (HAVE_BCOPY) && !defined (bcopy)
59 # define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
60 #endif /* !HAVE_BCOPY && !bcopy */
63 # if defined (__STDC__)
64 # define NULL ((void *) 0)
67 # endif /* __STDC__ */
71 # define FREE(x) if (x) free (x)
74 /* Don't try to alloca() more than this much memory for `struct globval'
77 # define ALLOCA_MAX 100000
86 extern void throw_to_top_level __P((void));
87 extern int sh_eaccess __P((char *, int));
88 extern char *sh_makepath __P((const char *, const char *, int));
89 extern int signal_is_pending __P((int));
90 extern void run_pending_traps __P((void));
92 extern int extended_glob;
94 /* Global variable which controls whether or not * matches .*.
95 Non-zero means don't match .*. */
96 int noglob_dot_filenames = 1;
98 /* Global variable which controls whether or not filename globbing
99 is done without regard to case. */
100 int glob_ignore_case = 0;
102 /* Global variable to return to signify an error in globbing. */
103 char *glob_error_return;
105 static struct globval finddirs_error_return;
107 /* Some forward declarations. */
108 static int skipname __P((char *, char *, int));
110 static int mbskipname __P((char *, char *, int));
113 static void udequote_pathname __P((char *));
114 static void wdequote_pathname __P((char *));
116 # define dequote_pathname udequote_pathname
118 static void dequote_pathname __P((char *));
119 static int glob_testdir __P((char *, int));
120 static char **glob_dir_to_array __P((char *, char **, int));
122 /* Make sure these names continue to agree with what's in smatch.c */
123 extern char *glob_patscan __P((char *, char *, int));
124 extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
126 /* Compile `glob_loop.c' for single-byte characters. */
127 #define CHAR unsigned char
130 #define INTERNAL_GLOB_PATTERN_P internal_glob_pattern_p
131 #include "glob_loop.c"
133 /* Compile `glob_loop.c' again for multibyte characters. */
139 #define INTERNAL_GLOB_PATTERN_P internal_glob_wpattern_p
140 #include "glob_loop.c"
142 #endif /* HANDLE_MULTIBYTE */
144 /* And now a function that calls either the single-byte or multibyte version
145 of internal_glob_pattern_p. */
147 glob_pattern_p (pattern)
156 return (internal_glob_pattern_p ((unsigned char *)pattern));
158 /* Convert strings to wide chars, and call the multibyte version. */
159 n = xdupmbstowcs (&wpattern, NULL, pattern);
161 /* Oops. Invalid multibyte sequence. Try it as single-byte sequence. */
162 return (internal_glob_pattern_p ((unsigned char *)pattern));
164 r = internal_glob_wpattern_p (wpattern);
169 return (internal_glob_pattern_p (pattern));
174 /* Return 1 if all subpatterns in the extended globbing pattern PAT indicate
175 that the name should be skipped. XXX - doesn't handle pattern negation,
176 not sure if it should */
178 extglob_skipname (pat, dname, flags)
182 char *pp, *pe, *t, *se;
185 negate = *pat == '!';
187 se = pp + strlen (pp) - 1; /* end of string */
188 pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
189 /* we should check for invalid extglob pattern here */
190 /* if pe != se we have more of the pattern at the end of the extglob
191 pattern. Check the easy case first ( */
192 if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
195 #if defined (HANDLE_MULTIBYTE)
196 r = mbskipname (pp, dname, flags);
198 r = skipname (pp, dname, flags); /*(*/
204 /* check every subpattern */
205 while (t = glob_patscan (pp, pe, '|'))
209 #if defined (HANDLE_MULTIBYTE)
210 r = mbskipname (pp, dname, flags);
212 r = skipname (pp, dname, flags);
215 if (r == 0) /* if any pattern says not skip, we don't skip */
220 /* glob_patscan might find end of pattern */
224 /* but if it doesn't then we didn't match a leading dot */
229 /* Return 1 if DNAME should be skipped according to PAT. Mostly concerned
230 with matching leading `.'. */
232 skipname (pat, dname, flags)
238 if (extglob_pattern_p (pat)) /* XXX */
239 return (extglob_skipname (pat, dname, flags));
242 /* If a leading dot need not be explicitly matched, and the pattern
243 doesn't start with a `.', don't match `.' or `..' */
244 if (noglob_dot_filenames == 0 && pat[0] != '.' &&
245 (pat[0] != '\\' || pat[1] != '.') &&
247 (dname[1] == '\0' || (dname[1] == '.' && dname[2] == '\0'))))
250 /* If a dot must be explicitly matched, check to see if they do. */
251 else if (noglob_dot_filenames && dname[0] == '.' && pat[0] != '.' &&
252 (pat[0] != '\\' || pat[1] != '.'))
261 wchkname (pat_wc, dn_wc)
262 wchar_t *pat_wc, *dn_wc;
264 /* If a leading dot need not be explicitly matched, and the
265 pattern doesn't start with a `.', don't match `.' or `..' */
266 if (noglob_dot_filenames == 0 && pat_wc[0] != L'.' &&
267 (pat_wc[0] != L'\\' || pat_wc[1] != L'.') &&
269 (dn_wc[1] == L'\0' || (dn_wc[1] == L'.' && dn_wc[2] == L'\0'))))
272 /* If a leading dot must be explicitly matched, check to see if the
273 pattern and dirname both have one. */
274 else if (noglob_dot_filenames && dn_wc[0] == L'.' &&
276 (pat_wc[0] != L'\\' || pat_wc[1] != L'.'))
283 wextglob_skipname (pat, dname, flags)
284 wchar_t *pat, *dname;
288 wchar_t *pp, *pe, *t, n, *se;
291 negate = *pat == L'!';
293 se = pp + wcslen (pp) - 1; /*(*/
294 pe = glob_patscan_wc (pp, se, 0);
296 if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0)
299 r = wchkname (pp, dname); /*(*/
304 /* check every subpattern */
305 while (t = glob_patscan_wc (pp, pe, '|'))
309 r = wchkname (pp, dname);
316 if (pp == pe) /* glob_patscan_wc might find end of pattern */
319 /* but if it doesn't then we didn't match a leading dot */
322 return (wchkname (pat, dname));
326 /* Return 1 if DNAME should be skipped according to PAT. Handles multibyte
327 characters in PAT and DNAME. Mostly concerned with matching leading `.'. */
329 mbskipname (pat, dname, flags)
334 wchar_t *pat_wc, *dn_wc;
337 if (mbsmbchar (dname) == 0 && mbsmbchar (pat) == 0)
338 return (skipname (pat, dname, flags));
342 ext = extglob_pattern_p (pat);
345 pat_wc = dn_wc = (wchar_t *)NULL;
347 pat_n = xdupmbstowcs (&pat_wc, NULL, pat);
348 if (pat_n != (size_t)-1)
349 dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
352 if (pat_n != (size_t)-1 && dn_n !=(size_t)-1)
353 ret = ext ? wextglob_skipname (pat_wc, dn_wc, flags) : wchkname (pat_wc, dn_wc);
355 ret = skipname (pat, dname, flags);
362 #endif /* HANDLE_MULTIBYTE */
364 /* Remove backslashes quoting characters in PATHNAME by modifying PATHNAME. */
366 udequote_pathname (pathname)
371 for (i = j = 0; pathname && pathname[i]; )
373 if (pathname[i] == '\\')
376 pathname[j++] = pathname[i++];
378 if (pathname[i - 1] == 0)
386 /* Remove backslashes quoting characters in PATHNAME by modifying PATHNAME. */
388 wdequote_pathname (pathname)
395 wchar_t *orig_wpathname;
397 len = strlen (pathname);
398 /* Convert the strings into wide characters. */
399 n = xdupmbstowcs (&wpathname, NULL, pathname);
400 if (n == (size_t) -1)
402 /* Something wrong. Fall back to single-byte */
403 udequote_pathname (pathname);
406 orig_wpathname = wpathname;
408 for (i = j = 0; wpathname && wpathname[i]; )
410 if (wpathname[i] == L'\\')
413 wpathname[j++] = wpathname[i++];
415 if (wpathname[i - 1] == L'\0')
419 wpathname[j] = L'\0';
421 /* Convert the wide character string into unibyte character set. */
422 memset (&ps, '\0', sizeof(mbstate_t));
423 n = wcsrtombs(pathname, (const wchar_t **)&wpathname, len, &ps);
424 pathname[len] = '\0';
426 /* Can't just free wpathname here; wcsrtombs changes it in many cases. */
427 free (orig_wpathname);
431 dequote_pathname (pathname)
435 wdequote_pathname (pathname);
437 udequote_pathname (pathname);
439 #endif /* HANDLE_MULTIBYTE */
441 /* Test whether NAME exists. */
443 #if defined (HAVE_LSTAT)
444 # define GLOB_TESTNAME(name) (lstat (name, &finfo))
445 #else /* !HAVE_LSTAT */
447 # define GLOB_TESTNAME(name) (sh_eaccess (name, F_OK))
449 # define GLOB_TESTNAME(name) (access (name, F_OK))
451 #endif /* !HAVE_LSTAT */
453 /* Return 0 if DIR is a directory, -1 otherwise. */
455 glob_testdir (dir, flags)
462 /*itrace("glob_testdir: testing %s" flags = %d, dir, flags);*/
463 #if defined (HAVE_LSTAT)
464 r = (flags & GX_ALLDIRS) ? lstat (dir, &finfo) : stat (dir, &finfo);
466 r = stat (dir, &finfo);
471 if (S_ISDIR (finfo.st_mode) == 0)
477 /* Recursively scan SDIR for directories matching PAT (PAT is always `**').
478 FLAGS is simply passed down to the recursive call to glob_vector. Returns
479 a list of matching directory names. EP, if non-null, is set to the last
480 element of the returned list. NP, if non-null, is set to the number of
481 directories in the returned list. These two variables exist for the
482 convenience of the caller (always glob_vector). */
483 static struct globval *
484 finddirs (pat, sdir, flags, ep, np)
493 struct globval *ret, *e, *g;
495 /*itrace("finddirs: pat = `%s' sdir = `%s' flags = 0x%x", pat, sdir, flags);*/
497 r = glob_vector (pat, sdir, flags);
498 if (r == 0 || r[0] == 0)
504 if (r && r != &glob_error_return)
506 return (struct globval *)0;
508 for (ndirs = 0; r[ndirs] != 0; ndirs++)
510 g = (struct globval *) malloc (sizeof (struct globval));
513 while (ret) /* free list built so far */
525 return (&finddirs_error_return);
545 /* Return a vector of names of files in directory DIR
546 whose names match glob pattern PAT.
547 The names are not in any particular order.
548 Wildcards at the beginning of PAT do not match an initial period.
550 The vector is terminated by an element that is a null pointer.
552 To free the space allocated, first free the vector's elements,
553 then free the vector.
555 Return 0 if cannot get enough memory to hold the pointer
558 Return -1 if cannot access directory DIR.
559 Look in errno for more information. */
562 glob_vector (pat, dir, flags)
568 register struct dirent *dp;
569 struct globval *lastlink, *e, *dirlist;
570 register struct globval *nextlink;
571 register char *nextname, *npat, *subdir;
573 int lose, skip, ndirs, isdir, sdlen, add_current, patlen;
574 register char **name_vector;
575 register unsigned int i;
576 int mflags; /* Flags passed to strmatch (). */
577 int pflags; /* flags passed to sh_makepath () */
579 struct globval *firstmalloc, *tmplink;
583 count = lose = skip = add_current = 0;
588 /*itrace("glob_vector: pat = `%s' dir = `%s' flags = 0x%x", pat, dir, flags);*/
589 /* If PAT is empty, skip the loop, but return one (empty) filename. */
590 if (pat == 0 || *pat == '\0')
592 if (glob_testdir (dir, 0) < 0)
593 return ((char **) &glob_error_return);
595 nextlink = (struct globval *)alloca (sizeof (struct globval));
596 if (nextlink == NULL)
597 return ((char **) NULL);
599 nextlink->next = (struct globval *)0;
600 nextname = (char *) malloc (1);
606 nextlink->name = nextname;
614 patlen = (pat && *pat) ? strlen (pat) : 0;
616 /* If the filename pattern (PAT) does not contain any globbing characters,
617 we can dispense with reading the directory, and just see if there is
618 a filename `DIR/PAT'. If there is, and we can access it, just make the
619 vector to return and bail immediately. */
620 if (skip == 0 && glob_pattern_p (pat) == 0)
625 if (glob_testdir (dir, 0) < 0)
626 return ((char **) &glob_error_return);
628 dirlen = strlen (dir);
629 nextname = (char *)malloc (dirlen + patlen + 2);
630 npat = (char *)malloc (patlen + 1);
631 if (nextname == 0 || npat == 0)
640 dequote_pathname (npat);
642 strcpy (nextname, dir);
643 nextname[dirlen++] = '/';
644 strcpy (nextname + dirlen, npat);
646 if (GLOB_TESTNAME (nextname) >= 0)
649 nextlink = (struct globval *)alloca (sizeof (struct globval));
652 nextlink->next = (struct globval *)0;
654 nextlink->name = npat;
675 /* Open the directory, punting immediately if we cannot. If opendir
676 is not robust (i.e., it opens non-directories successfully), test
677 that DIR is a directory and punt if it's not. */
678 #if defined (OPENDIR_NOT_ROBUST)
679 if (glob_testdir (dir, 0) < 0)
680 return ((char **) &glob_error_return);
685 return ((char **) &glob_error_return);
687 /* Compute the flags that will be passed to strmatch(). We don't
688 need to do this every time through the loop. */
689 mflags = (noglob_dot_filenames ? FNM_PERIOD : 0) | FNM_PATHNAME;
692 if (glob_ignore_case)
693 mflags |= FNM_CASEFOLD;
697 mflags |= FNM_EXTMATCH;
699 add_current = ((flags & (GX_ALLDIRS|GX_ADDCURDIR)) == (GX_ALLDIRS|GX_ADDCURDIR));
701 /* Scan the directory, finding all names that match.
702 For each name that matches, allocate a struct globval
703 on the stack and store the name in it.
704 Chain those structs together; lastlink is the front of the chain. */
707 /* Make globbing interruptible in the shell. */
708 if (interrupt_state || terminating_signal)
713 else if (signal_is_pending (SIGINT)) /* XXX - make SIGINT traps responsive */
723 /* If this directory entry is not to be used, try again. */
724 if (REAL_DIR_ENTRY (dp) == 0)
728 if (dp->d_name == 0 || *dp->d_name == 0)
733 if (MB_CUR_MAX > 1 && mbskipname (pat, dp->d_name, flags))
737 if (skipname (pat, dp->d_name, flags))
740 /* If we're only interested in directories, don't bother with files */
741 if (flags & (GX_MATCHDIRS|GX_ALLDIRS))
743 pflags = (flags & GX_ALLDIRS) ? MP_RMDOT : 0;
744 if (flags & GX_NULLDIR)
746 subdir = sh_makepath (dir, dp->d_name, pflags);
747 isdir = glob_testdir (subdir, flags);
748 if (isdir < 0 && (flags & GX_MATCHDIRS))
755 if (flags & GX_ALLDIRS)
759 dirlist = finddirs (pat, subdir, (flags & ~GX_ADDCURDIR), &e, &ndirs);
760 if (dirlist == &finddirs_error_return)
766 if (ndirs) /* add recursive directories to list */
768 if (firstmalloc == 0)
776 nextlink = (struct globval *) malloc (sizeof (struct globval));
777 if (firstmalloc == 0)
778 firstmalloc = nextlink;
779 sdlen = strlen (subdir);
780 nextname = (char *) malloc (sdlen + 1);
781 if (nextlink == 0 || nextname == 0)
789 nextlink->next = lastlink;
791 nextlink->name = nextname;
792 bcopy (subdir, nextname, sdlen + 1);
797 else if (flags & GX_MATCHDIRS)
800 convfn = fnx_fromfs (dp->d_name, D_NAMLEN (dp));
801 if (strmatch (pat, convfn, mflags) != FNM_NOMATCH)
803 if (nalloca < ALLOCA_MAX)
805 nextlink = (struct globval *) alloca (sizeof (struct globval));
806 nalloca += sizeof (struct globval);
810 nextlink = (struct globval *) malloc (sizeof (struct globval));
811 if (firstmalloc == 0)
812 firstmalloc = nextlink;
815 nextname = (char *) malloc (D_NAMLEN (dp) + 1);
816 if (nextlink == 0 || nextname == 0)
823 nextlink->next = lastlink;
825 nextlink->name = nextname;
826 bcopy (dp->d_name, nextname, D_NAMLEN (dp) + 1);
834 /* compat: if GX_ADDCURDIR, add the passed directory also. Add an empty
835 directory name as a placeholder if GX_NULLDIR (in which case the passed
836 directory name is "."). */
839 sdlen = strlen (dir);
840 nextname = (char *)malloc (sdlen + 1);
841 nextlink = (struct globval *) malloc (sizeof (struct globval));
842 if (nextlink == 0 || nextname == 0)
850 nextlink->name = nextname;
851 nextlink->next = lastlink;
853 if (flags & GX_NULLDIR)
856 bcopy (dir, nextname, sdlen + 1);
863 name_vector = (char **) malloc ((count + 1) * sizeof (char *));
864 lose |= name_vector == NULL;
867 /* Have we run out of memory? */
872 /* Here free the strings we have got. */
875 /* Since we build the list in reverse order, the first N entries
876 will be allocated with malloc, if firstmalloc is set, from
877 lastlink to firstmalloc. */
880 if (lastlink == firstmalloc)
886 free (lastlink->name);
887 lastlink = lastlink->next;
891 /* Don't call QUIT; here; let higher layers deal with it. */
893 return ((char **)NULL);
896 /* Copy the name pointers from the linked list into the vector. */
897 for (tmplink = lastlink, i = 0; i < count; ++i)
899 name_vector[i] = tmplink->name;
900 tmplink = tmplink->next;
903 name_vector[count] = NULL;
905 /* If we allocated some of the struct globvals, free them now. */
912 if (lastlink == firstmalloc)
913 lastlink = firstmalloc = 0;
915 lastlink = lastlink->next;
920 return (name_vector);
923 /* Return a new array which is the concatenation of each string in ARRAY
924 to DIR. This function expects you to pass in an allocated ARRAY, and
925 it takes care of free()ing that array. Thus, you might think of this
926 function as side-effecting ARRAY. This should handle GX_MARKDIRS. */
928 glob_dir_to_array (dir, array, flags)
932 register unsigned int i, l;
940 if (flags & GX_MARKDIRS)
941 for (i = 0; array[i]; i++)
943 if ((stat (array[i], &sb) == 0) && S_ISDIR (sb.st_mode))
945 l = strlen (array[i]);
946 new = (char *)realloc (array[i], l + 2);
957 add_slash = dir[l - 1] != '/';
960 while (array[i] != NULL)
963 result = (char **) malloc ((i + 1) * sizeof (char *));
967 for (i = 0; array[i] != NULL; i++)
969 /* 3 == 1 for NUL, 1 for slash at end of DIR, 1 for GX_MARKDIRS */
970 result[i] = (char *) malloc (l + strlen (array[i]) + 3);
972 if (result[i] == NULL)
975 for (ind = 0; ind < i; ind++)
981 strcpy (result[i], dir);
984 strcpy (result[i] + l + add_slash, array[i]);
985 if (flags & GX_MARKDIRS)
987 if ((stat (result[i], &sb) == 0) && S_ISDIR (sb.st_mode))
990 rlen = strlen (result[i]);
991 result[i][rlen] = '/';
992 result[i][rlen+1] = '\0';
998 /* Free the input array. */
999 for (i = 0; array[i] != NULL; i++)
1001 free ((char *) array);
1006 /* Do globbing on PATHNAME. Return an array of pathnames that match,
1007 marking the end of the array with a null-pointer as an element.
1008 If no pathnames match, then the array is empty (first element is null).
1009 If there isn't enough memory, then return NULL.
1010 If a file system error occurs, return -1; `errno' has the error code. */
1012 glob_filename (pathname, flags)
1017 unsigned int result_size;
1018 char *directory_name, *filename, *dname;
1019 unsigned int directory_len;
1020 int free_dirname; /* flag */
1023 result = (char **) malloc (sizeof (char *));
1030 directory_name = NULL;
1032 /* Find the filename. */
1033 filename = strrchr (pathname, '/');
1034 if (filename == NULL)
1036 filename = pathname;
1037 directory_name = "";
1043 directory_len = (filename - pathname) + 1;
1044 directory_name = (char *) malloc (directory_len + 1);
1046 if (directory_name == 0) /* allocation failed? */
1049 bcopy (pathname, directory_name, directory_len);
1050 directory_name[directory_len] = '\0';
1055 /* If directory_name contains globbing characters, then we
1056 have to expand the previous levels. Just recurse. */
1057 if (directory_len > 0 && glob_pattern_p (directory_name))
1059 char **directories, *d, *p;
1060 register unsigned int i;
1061 int all_starstar, last_starstar;
1063 all_starstar = last_starstar = 0;
1065 dflags = flags & ~GX_MARKDIRS;
1066 /* Collapse a sequence of ** patterns separated by one or more slashes
1067 to a single ** terminated by a slash or NUL */
1068 if ((flags & GX_GLOBSTAR) && d[0] == '*' && d[1] == '*' && (d[2] == '/' || d[2] == '\0'))
1071 while (d[0] == '*' && d[1] == '*' && (d[2] == '/' || d[2] == '\0'))
1086 dflags |= GX_ALLDIRS|GX_ADDCURDIR;
1087 directory_len = strlen (d);
1090 /* If there is a non [star][star]/ component in directory_name, we
1091 still need to collapse trailing sequences of [star][star]/ into
1092 a single one and note that the directory name ends with [star][star],
1093 so we can compensate if filename is [star][star] */
1094 if ((flags & GX_GLOBSTAR) && all_starstar == 0)
1097 prev = dl = directory_len;
1098 while (dl >= 4 && d[dl - 1] == '/' &&
1103 if (dl != directory_len)
1105 directory_len = prev;
1108 /* If the directory name ends in [star][star]/ but the filename is
1109 [star][star], just remove the final [star][star] from the directory
1110 so we don't have to scan everything twice. */
1111 if (last_starstar && directory_len > 4 &&
1112 filename[0] == '*' && filename[1] == '*' && filename[2] == 0)
1117 if (d[directory_len - 1] == '/')
1118 d[directory_len - 1] = '\0';
1120 directories = glob_filename (d, dflags);
1124 free (directory_name);
1125 directory_name = NULL;
1128 if (directories == NULL)
1130 else if (directories == (char **)&glob_error_return)
1132 free ((char *) result);
1133 return ((char **) &glob_error_return);
1135 else if (*directories == NULL)
1137 free ((char *) directories);
1138 free ((char *) result);
1139 return ((char **) &glob_error_return);
1142 /* If we have something like [star][star]/[star][star], it's no use to
1143 glob **, then do it again, and throw half the results away. */
1144 if (all_starstar && filename[0] == '*' && filename[1] == '*' && filename[2] == 0)
1146 free ((char *) directories);
1147 free (directory_name);
1148 directory_name = NULL;
1153 /* We have successfully globbed the preceding directory name.
1154 For each name in DIRECTORIES, call glob_vector on it and
1155 FILENAME. Concatenate the results together. */
1156 for (i = 0; directories[i] != NULL; ++i)
1158 char **temp_results;
1162 /* XXX -- we've recursively scanned any directories resulting from
1163 a `**', so turn off the flag. We turn it on again below if
1165 /* Scan directory even on a NULL filename. That way, `*h/'
1166 returns only directories ending in `h', instead of all
1167 files ending in `h' with a `/' appended. */
1168 dname = directories[i];
1169 dflags = flags & ~(GX_MARKDIRS|GX_ALLDIRS|GX_ADDCURDIR);
1170 if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0')
1171 dflags |= GX_ALLDIRS|GX_ADDCURDIR;
1172 if (dname[0] == '\0' && filename[0])
1174 dflags |= GX_NULLDIR;
1175 dname = "."; /* treat null directory name and non-null filename as current directory */
1177 temp_results = glob_vector (filename, dname, dflags);
1179 /* Handle error cases. */
1180 if (temp_results == NULL)
1182 else if (temp_results == (char **)&glob_error_return)
1183 /* This filename is probably not a directory. Ignore it. */
1188 register unsigned int l;
1190 /* If we're expanding **, we don't need to glue the directory
1191 name to the results; we've already done it in glob_vector */
1192 if ((dflags & GX_ALLDIRS) && filename[0] == '*' && filename[1] == '*' && (filename[2] == '\0' || filename[2] == '/'))
1194 /* When do we remove null elements from temp_results? And
1195 how to avoid duplicate elements in the final result? */
1196 /* If (dflags & GX_NULLDIR) glob_filename potentially left a
1197 NULL placeholder in the temp results just in case
1198 glob_vector/glob_dir_to_array did something with it, but
1199 if it didn't, and we're not supposed to be passing them
1200 through for some reason ((flags & GX_NULLDIR) == 0) we
1201 need to remove all the NULL elements from the beginning
1203 /* If we have a null directory name and ** as the filename,
1204 we have just searched for everything from the current
1205 directory on down. Break now (shouldbreak = 1) to avoid
1206 duplicate entries in the final result. */
1207 #define NULL_PLACEHOLDER(x) ((x) && *(x) && **(x) == 0)
1208 if ((dflags & GX_NULLDIR) && (flags & GX_NULLDIR) == 0 &&
1209 NULL_PLACEHOLDER (temp_results))
1210 #undef NULL_PLACEHOLDER
1213 for (n = 0; temp_results[n] && *temp_results[n] == 0; n++)
1217 temp_results[i - n] = temp_results[i];
1218 while (temp_results[i++] != 0);
1219 array = temp_results;
1223 array = temp_results;
1226 array = glob_dir_to_array (directories[i], temp_results, flags);
1228 while (array[l] != NULL)
1232 (char **)realloc (result, (result_size + l) * sizeof (char *));
1237 for (l = 0; array[l] != NULL; ++l)
1238 result[result_size++ - 1] = array[l];
1240 result[result_size - 1] = NULL;
1242 /* Note that the elements of ARRAY are not freed. */
1243 if (array != temp_results)
1244 free ((char *) array);
1245 else if ((dflags & GX_ALLDIRS) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0')
1246 free (temp_results); /* expanding ** case above */
1252 /* Free the directories. */
1253 for (i = 0; directories[i]; i++)
1254 free (directories[i]);
1256 free ((char *) directories);
1262 /* If there is only a directory name, return it. */
1263 if (*filename == '\0')
1265 result = (char **) realloc ((char *) result, 2 * sizeof (char *));
1268 /* Handle GX_MARKDIRS here. */
1269 result[0] = (char *) malloc (directory_len + 1);
1270 if (result[0] == NULL)
1272 bcopy (directory_name, result[0], directory_len + 1);
1274 free (directory_name);
1280 char **temp_results;
1282 /* There are no unquoted globbing characters in DIRECTORY_NAME.
1283 Dequote it before we try to open the directory since there may
1284 be quoted globbing characters which should be treated verbatim. */
1285 if (directory_len > 0)
1286 dequote_pathname (directory_name);
1288 /* We allocated a small array called RESULT, which we won't be using.
1289 Free that memory now. */
1292 /* Just return what glob_vector () returns appended to the
1294 /* If flags & GX_ALLDIRS, we're called recursively */
1295 dflags = flags & ~GX_MARKDIRS;
1296 if (directory_len == 0)
1297 dflags |= GX_NULLDIR;
1298 if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0')
1300 dflags |= GX_ALLDIRS|GX_ADDCURDIR;
1302 /* If we want all directories (dflags & GX_ALLDIRS) and we're not
1303 being called recursively as something like `echo [star][star]/[star].o'
1304 ((flags & GX_ALLDIRS) == 0), we want to prevent glob_vector from
1305 adding a null directory name to the front of the temp_results
1306 array. We turn off ADDCURDIR if not called recursively and
1309 if (directory_len == 0 && (flags & GX_ALLDIRS) == 0)
1310 dflags &= ~GX_ADDCURDIR;
1312 temp_results = glob_vector (filename,
1313 (directory_len == 0 ? "." : directory_name),
1316 if (temp_results == NULL || temp_results == (char **)&glob_error_return)
1319 free (directory_name);
1320 QUIT; /* XXX - shell */
1321 run_pending_traps ();
1322 return (temp_results);
1325 result = glob_dir_to_array ((dflags & GX_ALLDIRS) ? "" : directory_name, temp_results, flags);
1328 free (directory_name);
1332 /* We get to memory_error if the program has run out of memory, or
1333 if this is the shell, and we have been interrupted. */
1337 register unsigned int i;
1338 for (i = 0; result[i] != NULL; ++i)
1340 free ((char *) result);
1343 if (free_dirname && directory_name)
1344 free (directory_name);
1347 run_pending_traps ();
1360 for (i = 1; i < argc; ++i)
1362 char **value = glob_filename (argv[i], 0);
1364 puts ("Out of memory.");
1365 else if (value == &glob_error_return)
1368 for (i = 0; value[i] != NULL; i++)