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 extern char *glob_dirscan __P((char *, int));
128 /* Compile `glob_loop.c' for single-byte characters. */
129 #define CHAR unsigned char
132 #define INTERNAL_GLOB_PATTERN_P internal_glob_pattern_p
133 #include "glob_loop.c"
135 /* Compile `glob_loop.c' again for multibyte characters. */
141 #define INTERNAL_GLOB_PATTERN_P internal_glob_wpattern_p
142 #include "glob_loop.c"
144 #endif /* HANDLE_MULTIBYTE */
146 /* And now a function that calls either the single-byte or multibyte version
147 of internal_glob_pattern_p. */
149 glob_pattern_p (pattern)
158 return (internal_glob_pattern_p ((unsigned char *)pattern));
160 /* Convert strings to wide chars, and call the multibyte version. */
161 n = xdupmbstowcs (&wpattern, NULL, pattern);
163 /* Oops. Invalid multibyte sequence. Try it as single-byte sequence. */
164 return (internal_glob_pattern_p ((unsigned char *)pattern));
166 r = internal_glob_wpattern_p (wpattern);
171 return (internal_glob_pattern_p (pattern));
176 /* Return 1 if all subpatterns in the extended globbing pattern PAT indicate
177 that the name should be skipped. XXX - doesn't handle pattern negation,
178 not sure if it should */
180 extglob_skipname (pat, dname, flags)
184 char *pp, *pe, *t, *se;
187 negate = *pat == '!';
189 se = pp + strlen (pp) - 1; /* end of string */
190 pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
191 /* we should check for invalid extglob pattern here */
195 /* if pe != se we have more of the pattern at the end of the extglob
196 pattern. Check the easy case first ( */
197 if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
200 #if defined (HANDLE_MULTIBYTE)
201 r = mbskipname (pp, dname, flags);
203 r = skipname (pp, dname, flags); /*(*/
209 /* check every subpattern */
210 while (t = glob_patscan (pp, pe, '|'))
214 #if defined (HANDLE_MULTIBYTE)
215 r = mbskipname (pp, dname, flags);
217 r = skipname (pp, dname, flags);
220 if (r == 0) /* if any pattern says not skip, we don't skip */
225 /* glob_patscan might find end of pattern */
229 /* but if it doesn't then we didn't match a leading dot */
234 /* Return 1 if DNAME should be skipped according to PAT. Mostly concerned
235 with matching leading `.'. */
237 skipname (pat, dname, flags)
243 if (extglob_pattern_p (pat)) /* XXX */
244 return (extglob_skipname (pat, dname, flags));
247 /* If a leading dot need not be explicitly matched, and the pattern
248 doesn't start with a `.', don't match `.' or `..' */
249 if (noglob_dot_filenames == 0 && pat[0] != '.' &&
250 (pat[0] != '\\' || pat[1] != '.') &&
252 (dname[1] == '\0' || (dname[1] == '.' && dname[2] == '\0'))))
255 /* If a dot must be explicitly matched, check to see if they do. */
256 else if (noglob_dot_filenames && dname[0] == '.' && pat[0] != '.' &&
257 (pat[0] != '\\' || pat[1] != '.'))
266 wchkname (pat_wc, dn_wc)
267 wchar_t *pat_wc, *dn_wc;
269 /* If a leading dot need not be explicitly matched, and the
270 pattern doesn't start with a `.', don't match `.' or `..' */
271 if (noglob_dot_filenames == 0 && pat_wc[0] != L'.' &&
272 (pat_wc[0] != L'\\' || pat_wc[1] != L'.') &&
274 (dn_wc[1] == L'\0' || (dn_wc[1] == L'.' && dn_wc[2] == L'\0'))))
277 /* If a leading dot must be explicitly matched, check to see if the
278 pattern and dirname both have one. */
279 else if (noglob_dot_filenames && dn_wc[0] == L'.' &&
281 (pat_wc[0] != L'\\' || pat_wc[1] != L'.'))
288 wextglob_skipname (pat, dname, flags)
289 wchar_t *pat, *dname;
293 wchar_t *pp, *pe, *t, n, *se;
296 negate = *pat == L'!';
298 se = pp + wcslen (pp) - 1; /*(*/
299 pe = glob_patscan_wc (pp, se, 0);
301 if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0)
304 r = wchkname (pp, dname); /*(*/
309 /* check every subpattern */
310 while (t = glob_patscan_wc (pp, pe, '|'))
314 r = wchkname (pp, dname);
321 if (pp == pe) /* glob_patscan_wc might find end of pattern */
324 /* but if it doesn't then we didn't match a leading dot */
327 return (wchkname (pat, dname));
331 /* Return 1 if DNAME should be skipped according to PAT. Handles multibyte
332 characters in PAT and DNAME. Mostly concerned with matching leading `.'. */
334 mbskipname (pat, dname, flags)
339 wchar_t *pat_wc, *dn_wc;
342 if (mbsmbchar (dname) == 0 && mbsmbchar (pat) == 0)
343 return (skipname (pat, dname, flags));
347 ext = extglob_pattern_p (pat);
350 pat_wc = dn_wc = (wchar_t *)NULL;
352 pat_n = xdupmbstowcs (&pat_wc, NULL, pat);
353 if (pat_n != (size_t)-1)
354 dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
357 if (pat_n != (size_t)-1 && dn_n !=(size_t)-1)
358 ret = ext ? wextglob_skipname (pat_wc, dn_wc, flags) : wchkname (pat_wc, dn_wc);
360 ret = skipname (pat, dname, flags);
367 #endif /* HANDLE_MULTIBYTE */
369 /* Remove backslashes quoting characters in PATHNAME by modifying PATHNAME. */
371 udequote_pathname (pathname)
376 for (i = j = 0; pathname && pathname[i]; )
378 if (pathname[i] == '\\')
381 pathname[j++] = pathname[i++];
383 if (pathname[i - 1] == 0)
391 /* Remove backslashes quoting characters in PATHNAME by modifying PATHNAME. */
393 wdequote_pathname (pathname)
400 wchar_t *orig_wpathname;
402 len = strlen (pathname);
403 /* Convert the strings into wide characters. */
404 n = xdupmbstowcs (&wpathname, NULL, pathname);
405 if (n == (size_t) -1)
407 /* Something wrong. Fall back to single-byte */
408 udequote_pathname (pathname);
411 orig_wpathname = wpathname;
413 for (i = j = 0; wpathname && wpathname[i]; )
415 if (wpathname[i] == L'\\')
418 wpathname[j++] = wpathname[i++];
420 if (wpathname[i - 1] == L'\0')
424 wpathname[j] = L'\0';
426 /* Convert the wide character string into unibyte character set. */
427 memset (&ps, '\0', sizeof(mbstate_t));
428 n = wcsrtombs(pathname, (const wchar_t **)&wpathname, len, &ps);
429 pathname[len] = '\0';
431 /* Can't just free wpathname here; wcsrtombs changes it in many cases. */
432 free (orig_wpathname);
436 dequote_pathname (pathname)
440 wdequote_pathname (pathname);
442 udequote_pathname (pathname);
444 #endif /* HANDLE_MULTIBYTE */
446 /* Test whether NAME exists. */
448 #if defined (HAVE_LSTAT)
449 # define GLOB_TESTNAME(name) (lstat (name, &finfo))
450 #else /* !HAVE_LSTAT */
452 # define GLOB_TESTNAME(name) (sh_eaccess (name, F_OK))
454 # define GLOB_TESTNAME(name) (access (name, F_OK))
456 #endif /* !HAVE_LSTAT */
458 /* Return 0 if DIR is a directory, -1 otherwise. */
460 glob_testdir (dir, flags)
467 /*itrace("glob_testdir: testing %s" flags = %d, dir, flags);*/
468 #if defined (HAVE_LSTAT)
469 r = (flags & GX_ALLDIRS) ? lstat (dir, &finfo) : stat (dir, &finfo);
471 r = stat (dir, &finfo);
476 if (S_ISDIR (finfo.st_mode) == 0)
482 /* Recursively scan SDIR for directories matching PAT (PAT is always `**').
483 FLAGS is simply passed down to the recursive call to glob_vector. Returns
484 a list of matching directory names. EP, if non-null, is set to the last
485 element of the returned list. NP, if non-null, is set to the number of
486 directories in the returned list. These two variables exist for the
487 convenience of the caller (always glob_vector). */
488 static struct globval *
489 finddirs (pat, sdir, flags, ep, np)
498 struct globval *ret, *e, *g;
500 /*itrace("finddirs: pat = `%s' sdir = `%s' flags = 0x%x", pat, sdir, flags);*/
502 r = glob_vector (pat, sdir, flags);
503 if (r == 0 || r[0] == 0)
509 if (r && r != &glob_error_return)
511 return (struct globval *)0;
513 for (ndirs = 0; r[ndirs] != 0; ndirs++)
515 g = (struct globval *) malloc (sizeof (struct globval));
518 while (ret) /* free list built so far */
530 return (&finddirs_error_return);
550 /* Return a vector of names of files in directory DIR
551 whose names match glob pattern PAT.
552 The names are not in any particular order.
553 Wildcards at the beginning of PAT do not match an initial period.
555 The vector is terminated by an element that is a null pointer.
557 To free the space allocated, first free the vector's elements,
558 then free the vector.
560 Return 0 if cannot get enough memory to hold the pointer
563 Return -1 if cannot access directory DIR.
564 Look in errno for more information. */
567 glob_vector (pat, dir, flags)
573 register struct dirent *dp;
574 struct globval *lastlink, *e, *dirlist;
575 register struct globval *nextlink;
576 register char *nextname, *npat, *subdir;
578 int lose, skip, ndirs, isdir, sdlen, add_current, patlen;
579 register char **name_vector;
580 register unsigned int i;
581 int mflags; /* Flags passed to strmatch (). */
582 int pflags; /* flags passed to sh_makepath () */
584 struct globval *firstmalloc, *tmplink;
588 count = lose = skip = add_current = 0;
593 /*itrace("glob_vector: pat = `%s' dir = `%s' flags = 0x%x", pat, dir, flags);*/
594 /* If PAT is empty, skip the loop, but return one (empty) filename. */
595 if (pat == 0 || *pat == '\0')
597 if (glob_testdir (dir, 0) < 0)
598 return ((char **) &glob_error_return);
600 nextlink = (struct globval *)alloca (sizeof (struct globval));
601 if (nextlink == NULL)
602 return ((char **) NULL);
604 nextlink->next = (struct globval *)0;
605 nextname = (char *) malloc (1);
611 nextlink->name = nextname;
619 patlen = (pat && *pat) ? strlen (pat) : 0;
621 /* If the filename pattern (PAT) does not contain any globbing characters,
622 we can dispense with reading the directory, and just see if there is
623 a filename `DIR/PAT'. If there is, and we can access it, just make the
624 vector to return and bail immediately. */
625 if (skip == 0 && glob_pattern_p (pat) == 0)
630 if (glob_testdir (dir, 0) < 0)
631 return ((char **) &glob_error_return);
633 dirlen = strlen (dir);
634 nextname = (char *)malloc (dirlen + patlen + 2);
635 npat = (char *)malloc (patlen + 1);
636 if (nextname == 0 || npat == 0)
645 dequote_pathname (npat);
647 strcpy (nextname, dir);
648 nextname[dirlen++] = '/';
649 strcpy (nextname + dirlen, npat);
651 if (GLOB_TESTNAME (nextname) >= 0)
654 nextlink = (struct globval *)alloca (sizeof (struct globval));
657 nextlink->next = (struct globval *)0;
659 nextlink->name = npat;
680 /* Open the directory, punting immediately if we cannot. If opendir
681 is not robust (i.e., it opens non-directories successfully), test
682 that DIR is a directory and punt if it's not. */
683 #if defined (OPENDIR_NOT_ROBUST)
684 if (glob_testdir (dir, 0) < 0)
685 return ((char **) &glob_error_return);
690 return ((char **) &glob_error_return);
692 /* Compute the flags that will be passed to strmatch(). We don't
693 need to do this every time through the loop. */
694 mflags = (noglob_dot_filenames ? FNM_PERIOD : 0) | FNM_PATHNAME;
697 if (glob_ignore_case)
698 mflags |= FNM_CASEFOLD;
702 mflags |= FNM_EXTMATCH;
704 add_current = ((flags & (GX_ALLDIRS|GX_ADDCURDIR)) == (GX_ALLDIRS|GX_ADDCURDIR));
706 /* Scan the directory, finding all names that match.
707 For each name that matches, allocate a struct globval
708 on the stack and store the name in it.
709 Chain those structs together; lastlink is the front of the chain. */
712 /* Make globbing interruptible in the shell. */
713 if (interrupt_state || terminating_signal)
718 else if (signal_is_pending (SIGINT)) /* XXX - make SIGINT traps responsive */
728 /* If this directory entry is not to be used, try again. */
729 if (REAL_DIR_ENTRY (dp) == 0)
733 if (dp->d_name == 0 || *dp->d_name == 0)
738 if (MB_CUR_MAX > 1 && mbskipname (pat, dp->d_name, flags))
742 if (skipname (pat, dp->d_name, flags))
745 /* If we're only interested in directories, don't bother with files */
746 if (flags & (GX_MATCHDIRS|GX_ALLDIRS))
748 pflags = (flags & GX_ALLDIRS) ? MP_RMDOT : 0;
749 if (flags & GX_NULLDIR)
751 subdir = sh_makepath (dir, dp->d_name, pflags);
752 isdir = glob_testdir (subdir, flags);
753 if (isdir < 0 && (flags & GX_MATCHDIRS))
760 if (flags & GX_ALLDIRS)
764 dirlist = finddirs (pat, subdir, (flags & ~GX_ADDCURDIR), &e, &ndirs);
765 if (dirlist == &finddirs_error_return)
771 if (ndirs) /* add recursive directories to list */
773 if (firstmalloc == 0)
781 nextlink = (struct globval *) malloc (sizeof (struct globval));
782 if (firstmalloc == 0)
783 firstmalloc = nextlink;
784 sdlen = strlen (subdir);
785 nextname = (char *) malloc (sdlen + 1);
786 if (nextlink == 0 || nextname == 0)
794 nextlink->next = lastlink;
796 nextlink->name = nextname;
797 bcopy (subdir, nextname, sdlen + 1);
802 else if (flags & GX_MATCHDIRS)
805 convfn = fnx_fromfs (dp->d_name, D_NAMLEN (dp));
806 if (strmatch (pat, convfn, mflags) != FNM_NOMATCH)
808 if (nalloca < ALLOCA_MAX)
810 nextlink = (struct globval *) alloca (sizeof (struct globval));
811 nalloca += sizeof (struct globval);
815 nextlink = (struct globval *) malloc (sizeof (struct globval));
816 if (firstmalloc == 0)
817 firstmalloc = nextlink;
820 nextname = (char *) malloc (D_NAMLEN (dp) + 1);
821 if (nextlink == 0 || nextname == 0)
828 nextlink->next = lastlink;
830 nextlink->name = nextname;
831 bcopy (dp->d_name, nextname, D_NAMLEN (dp) + 1);
839 /* compat: if GX_ADDCURDIR, add the passed directory also. Add an empty
840 directory name as a placeholder if GX_NULLDIR (in which case the passed
841 directory name is "."). */
844 sdlen = strlen (dir);
845 nextname = (char *)malloc (sdlen + 1);
846 nextlink = (struct globval *) malloc (sizeof (struct globval));
847 if (nextlink == 0 || nextname == 0)
855 nextlink->name = nextname;
856 nextlink->next = lastlink;
858 if (flags & GX_NULLDIR)
861 bcopy (dir, nextname, sdlen + 1);
868 name_vector = (char **) malloc ((count + 1) * sizeof (char *));
869 lose |= name_vector == NULL;
872 /* Have we run out of memory? */
877 /* Here free the strings we have got. */
880 /* Since we build the list in reverse order, the first N entries
881 will be allocated with malloc, if firstmalloc is set, from
882 lastlink to firstmalloc. */
885 if (lastlink == firstmalloc)
891 free (lastlink->name);
892 lastlink = lastlink->next;
896 /* Don't call QUIT; here; let higher layers deal with it. */
898 return ((char **)NULL);
901 /* Copy the name pointers from the linked list into the vector. */
902 for (tmplink = lastlink, i = 0; i < count; ++i)
904 name_vector[i] = tmplink->name;
905 tmplink = tmplink->next;
908 name_vector[count] = NULL;
910 /* If we allocated some of the struct globvals, free them now. */
917 if (lastlink == firstmalloc)
918 lastlink = firstmalloc = 0;
920 lastlink = lastlink->next;
925 return (name_vector);
928 /* Return a new array which is the concatenation of each string in ARRAY
929 to DIR. This function expects you to pass in an allocated ARRAY, and
930 it takes care of free()ing that array. Thus, you might think of this
931 function as side-effecting ARRAY. This should handle GX_MARKDIRS. */
933 glob_dir_to_array (dir, array, flags)
937 register unsigned int i, l;
945 if (flags & GX_MARKDIRS)
946 for (i = 0; array[i]; i++)
948 if ((stat (array[i], &sb) == 0) && S_ISDIR (sb.st_mode))
950 l = strlen (array[i]);
951 new = (char *)realloc (array[i], l + 2);
962 add_slash = dir[l - 1] != '/';
965 while (array[i] != NULL)
968 result = (char **) malloc ((i + 1) * sizeof (char *));
972 for (i = 0; array[i] != NULL; i++)
974 /* 3 == 1 for NUL, 1 for slash at end of DIR, 1 for GX_MARKDIRS */
975 result[i] = (char *) malloc (l + strlen (array[i]) + 3);
977 if (result[i] == NULL)
980 for (ind = 0; ind < i; ind++)
986 strcpy (result[i], dir);
989 strcpy (result[i] + l + add_slash, array[i]);
990 if (flags & GX_MARKDIRS)
992 if ((stat (result[i], &sb) == 0) && S_ISDIR (sb.st_mode))
995 rlen = strlen (result[i]);
996 result[i][rlen] = '/';
997 result[i][rlen+1] = '\0';
1003 /* Free the input array. */
1004 for (i = 0; array[i] != NULL; i++)
1006 free ((char *) array);
1011 /* Do globbing on PATHNAME. Return an array of pathnames that match,
1012 marking the end of the array with a null-pointer as an element.
1013 If no pathnames match, then the array is empty (first element is null).
1014 If there isn't enough memory, then return NULL.
1015 If a file system error occurs, return -1; `errno' has the error code. */
1017 glob_filename (pathname, flags)
1022 unsigned int result_size;
1023 char *directory_name, *filename, *dname, *fn;
1024 unsigned int directory_len;
1025 int free_dirname; /* flag */
1028 result = (char **) malloc (sizeof (char *));
1035 directory_name = NULL;
1037 /* Find the filename. */
1038 filename = strrchr (pathname, '/');
1039 #if defined (EXTENDED_GLOB)
1040 if (filename && extended_glob)
1042 fn = glob_dirscan (pathname, '/');
1045 fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
1051 if (filename == NULL)
1053 filename = pathname;
1054 directory_name = "";
1060 directory_len = (filename - pathname) + 1;
1061 directory_name = (char *) malloc (directory_len + 1);
1063 if (directory_name == 0) /* allocation failed? */
1066 bcopy (pathname, directory_name, directory_len);
1067 directory_name[directory_len] = '\0';
1072 /* If directory_name contains globbing characters, then we
1073 have to expand the previous levels. Just recurse. */
1074 if (directory_len > 0 && glob_pattern_p (directory_name))
1076 char **directories, *d, *p;
1077 register unsigned int i;
1078 int all_starstar, last_starstar;
1080 all_starstar = last_starstar = 0;
1082 dflags = flags & ~GX_MARKDIRS;
1083 /* Collapse a sequence of ** patterns separated by one or more slashes
1084 to a single ** terminated by a slash or NUL */
1085 if ((flags & GX_GLOBSTAR) && d[0] == '*' && d[1] == '*' && (d[2] == '/' || d[2] == '\0'))
1088 while (d[0] == '*' && d[1] == '*' && (d[2] == '/' || d[2] == '\0'))
1103 dflags |= GX_ALLDIRS|GX_ADDCURDIR;
1104 directory_len = strlen (d);
1107 /* If there is a non [star][star]/ component in directory_name, we
1108 still need to collapse trailing sequences of [star][star]/ into
1109 a single one and note that the directory name ends with [star][star],
1110 so we can compensate if filename is [star][star] */
1111 if ((flags & GX_GLOBSTAR) && all_starstar == 0)
1114 prev = dl = directory_len;
1115 while (dl >= 4 && d[dl - 1] == '/' &&
1120 if (dl != directory_len)
1122 directory_len = prev;
1125 /* If the directory name ends in [star][star]/ but the filename is
1126 [star][star], just remove the final [star][star] from the directory
1127 so we don't have to scan everything twice. */
1128 if (last_starstar && directory_len > 4 &&
1129 filename[0] == '*' && filename[1] == '*' && filename[2] == 0)
1134 if (d[directory_len - 1] == '/')
1135 d[directory_len - 1] = '\0';
1137 directories = glob_filename (d, dflags);
1141 free (directory_name);
1142 directory_name = NULL;
1145 if (directories == NULL)
1147 else if (directories == (char **)&glob_error_return)
1149 free ((char *) result);
1150 return ((char **) &glob_error_return);
1152 else if (*directories == NULL)
1154 free ((char *) directories);
1155 free ((char *) result);
1156 return ((char **) &glob_error_return);
1159 /* If we have something like [star][star]/[star][star], it's no use to
1160 glob **, then do it again, and throw half the results away. */
1161 if (all_starstar && filename[0] == '*' && filename[1] == '*' && filename[2] == 0)
1163 free ((char *) directories);
1164 free (directory_name);
1165 directory_name = NULL;
1170 /* We have successfully globbed the preceding directory name.
1171 For each name in DIRECTORIES, call glob_vector on it and
1172 FILENAME. Concatenate the results together. */
1173 for (i = 0; directories[i] != NULL; ++i)
1175 char **temp_results;
1179 /* XXX -- we've recursively scanned any directories resulting from
1180 a `**', so turn off the flag. We turn it on again below if
1182 /* Scan directory even on a NULL filename. That way, `*h/'
1183 returns only directories ending in `h', instead of all
1184 files ending in `h' with a `/' appended. */
1185 dname = directories[i];
1186 dflags = flags & ~(GX_MARKDIRS|GX_ALLDIRS|GX_ADDCURDIR);
1187 if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0')
1188 dflags |= GX_ALLDIRS|GX_ADDCURDIR;
1189 if (dname[0] == '\0' && filename[0])
1191 dflags |= GX_NULLDIR;
1192 dname = "."; /* treat null directory name and non-null filename as current directory */
1194 temp_results = glob_vector (filename, dname, dflags);
1196 /* Handle error cases. */
1197 if (temp_results == NULL)
1199 else if (temp_results == (char **)&glob_error_return)
1200 /* This filename is probably not a directory. Ignore it. */
1205 register unsigned int l;
1207 /* If we're expanding **, we don't need to glue the directory
1208 name to the results; we've already done it in glob_vector */
1209 if ((dflags & GX_ALLDIRS) && filename[0] == '*' && filename[1] == '*' && (filename[2] == '\0' || filename[2] == '/'))
1211 /* When do we remove null elements from temp_results? And
1212 how to avoid duplicate elements in the final result? */
1213 /* If (dflags & GX_NULLDIR) glob_filename potentially left a
1214 NULL placeholder in the temp results just in case
1215 glob_vector/glob_dir_to_array did something with it, but
1216 if it didn't, and we're not supposed to be passing them
1217 through for some reason ((flags & GX_NULLDIR) == 0) we
1218 need to remove all the NULL elements from the beginning
1220 /* If we have a null directory name and ** as the filename,
1221 we have just searched for everything from the current
1222 directory on down. Break now (shouldbreak = 1) to avoid
1223 duplicate entries in the final result. */
1224 #define NULL_PLACEHOLDER(x) ((x) && *(x) && **(x) == 0)
1225 if ((dflags & GX_NULLDIR) && (flags & GX_NULLDIR) == 0 &&
1226 NULL_PLACEHOLDER (temp_results))
1227 #undef NULL_PLACEHOLDER
1230 for (n = 0; temp_results[n] && *temp_results[n] == 0; n++)
1234 temp_results[i - n] = temp_results[i];
1235 while (temp_results[i++] != 0);
1236 array = temp_results;
1240 array = temp_results;
1243 array = glob_dir_to_array (directories[i], temp_results, flags);
1245 while (array[l] != NULL)
1249 (char **)realloc (result, (result_size + l) * sizeof (char *));
1254 for (l = 0; array[l] != NULL; ++l)
1255 result[result_size++ - 1] = array[l];
1257 result[result_size - 1] = NULL;
1259 /* Note that the elements of ARRAY are not freed. */
1260 if (array != temp_results)
1261 free ((char *) array);
1262 else if ((dflags & GX_ALLDIRS) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0')
1263 free (temp_results); /* expanding ** case above */
1269 /* Free the directories. */
1270 for (i = 0; directories[i]; i++)
1271 free (directories[i]);
1273 free ((char *) directories);
1279 /* If there is only a directory name, return it. */
1280 if (*filename == '\0')
1282 result = (char **) realloc ((char *) result, 2 * sizeof (char *));
1285 /* Handle GX_MARKDIRS here. */
1286 result[0] = (char *) malloc (directory_len + 1);
1287 if (result[0] == NULL)
1289 bcopy (directory_name, result[0], directory_len + 1);
1291 free (directory_name);
1297 char **temp_results;
1299 /* There are no unquoted globbing characters in DIRECTORY_NAME.
1300 Dequote it before we try to open the directory since there may
1301 be quoted globbing characters which should be treated verbatim. */
1302 if (directory_len > 0)
1303 dequote_pathname (directory_name);
1305 /* We allocated a small array called RESULT, which we won't be using.
1306 Free that memory now. */
1309 /* Just return what glob_vector () returns appended to the
1311 /* If flags & GX_ALLDIRS, we're called recursively */
1312 dflags = flags & ~GX_MARKDIRS;
1313 if (directory_len == 0)
1314 dflags |= GX_NULLDIR;
1315 if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0')
1317 dflags |= GX_ALLDIRS|GX_ADDCURDIR;
1319 /* If we want all directories (dflags & GX_ALLDIRS) and we're not
1320 being called recursively as something like `echo [star][star]/[star].o'
1321 ((flags & GX_ALLDIRS) == 0), we want to prevent glob_vector from
1322 adding a null directory name to the front of the temp_results
1323 array. We turn off ADDCURDIR if not called recursively and
1326 if (directory_len == 0 && (flags & GX_ALLDIRS) == 0)
1327 dflags &= ~GX_ADDCURDIR;
1329 temp_results = glob_vector (filename,
1330 (directory_len == 0 ? "." : directory_name),
1333 if (temp_results == NULL || temp_results == (char **)&glob_error_return)
1336 free (directory_name);
1337 QUIT; /* XXX - shell */
1338 run_pending_traps ();
1339 return (temp_results);
1342 result = glob_dir_to_array ((dflags & GX_ALLDIRS) ? "" : directory_name, temp_results, flags);
1345 free (directory_name);
1349 /* We get to memory_error if the program has run out of memory, or
1350 if this is the shell, and we have been interrupted. */
1354 register unsigned int i;
1355 for (i = 0; result[i] != NULL; ++i)
1357 free ((char *) result);
1360 if (free_dirname && directory_name)
1361 free (directory_name);
1364 run_pending_traps ();
1377 for (i = 1; i < argc; ++i)
1379 char **value = glob_filename (argv[i], 0);
1381 puts ("Out of memory.");
1382 else if (value == &glob_error_return)
1385 for (i = 0; value[i] != NULL; i++)