1 /* Copyright (C) 1991,92,93,94,95,96,97,98 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)
117 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
118 if the `d_type' member for `struct dirent' is available. */
119 #ifdef _DIRENT_HAVE_D_TYPE
120 # define HAVE_D_TYPE 1
124 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
125 /* Posix does not require that the d_ino field be present, and some
126 systems do not provide it. */
127 # define REAL_DIR_ENTRY(dp) 1
129 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
132 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
136 #else /* No standard headers. */
138 extern char *getenv ();
140 # ifdef HAVE_STRING_H
144 # include <strings.h>
146 # ifdef HAVE_MEMORY_H
150 extern char *malloc (), *realloc ();
153 extern void qsort ();
154 extern void abort (), exit ();
156 #endif /* Standard headers. */
158 #ifdef HAVE_GETLOGIN_R
159 extern int getlogin_r
__P ((char *, size_t));
161 extern char *getlogin
__P ((void));
167 extern void bzero ();
170 extern void bcopy ();
173 # define memcpy(d, s, n) bcopy ((s), (d), (n))
174 # define strrchr rindex
175 /* memset is only used for zero here, but let's be paranoid. */
176 # define memset(s, better_be_zero, n) \
177 ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
178 #endif /* Not ANSI_STRING. */
180 #if !defined HAVE_STRCOLL && !defined _LIBC
181 # define strcoll strcmp
184 #if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
185 # define HAVE_MEMPCPY 1
186 # define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
189 #ifndef __GNU_LIBRARY__
203 /* These casts are the for sake of the broken Ultrix compiler,
204 which warns of illegal pointer combinations otherwise. */
206 return (char *) malloc (n
);
207 return (char *) realloc (p
, n
);
209 # define realloc my_realloc
211 #endif /* __GNU_LIBRARY__ */
214 #if !defined __alloca && !defined __GNU_LIBRARY__
218 # define alloca(n) __builtin_alloca (n)
219 # else /* Not GCC. */
220 # ifdef HAVE_ALLOCA_H
222 # else /* Not HAVE_ALLOCA_H. */
227 extern char *alloca ();
228 # endif /* WINDOWS32 */
229 # endif /* Not _AIX. */
230 # endif /* sparc or HAVE_ALLOCA_H. */
233 # define __alloca alloca
237 #ifndef __GNU_LIBRARY__
239 # ifdef STAT_MACROS_BROKEN
243 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
249 # define strdup(str) __strdup (str)
250 # define sysconf(id) __sysconf (id)
251 # define closedir(dir) __closedir (dir)
252 # define opendir(name) __opendir (name)
253 # define readdir(str) __readdir (str)
254 # define getpwnam_r(name, bufp, buf, len, res) \
255 __getpwnam_r (name, bufp, buf, len, res)
256 # define __stat(fname, buf) __xstat (_STAT_VER, fname, buf)
259 #if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
261 # define size_t unsigned int
264 /* Some system header files erroneously define these.
265 We want our own definitions from <fnmatch.h> to take precedence. */
266 #ifndef __GNU_LIBRARY__
273 /* Some system header files erroneously define these.
274 We want our own definitions from <glob.h> to take precedence. */
275 #ifndef __GNU_LIBRARY__
282 # undef GLOB_NOESCAPE
288 #if __GNUC__ - 0 >= 2
291 const char *next_brace_sub
__P ((const char *begin
));
292 static int glob_in_dir
__P ((const char *pattern
, const char *directory
,
294 int (*errfunc
) __P ((const char *, int)),
296 static int prefix_array
__P ((const char *prefix
, char **array
, size_t n
));
297 static int collated_compare
__P ((const __ptr_t
, const __ptr_t
));
300 /* Find the end of the sub-pattern in a brace expression. We define
301 this as an inline function if the compiler permits. */
303 #if __GNUC__ - 0 >= 2
307 next_brace_sub (begin
)
310 unsigned int depth
= 0;
311 const char *cp
= begin
;
317 if (*cp
!= ',' && *cp
!= '}' && *cp
!= '\0')
327 while (*cp
!= '\0' && (*cp
!= '}' || depth
> 0))
334 /* An incorrectly terminated brace expression. */
345 /* Do glob searching for PATTERN, placing results in PGLOB.
346 The bits defined above may be set in FLAGS.
347 If a directory cannot be opened or read and ERRFUNC is not nil,
348 it is called with the pathname that caused the error, and the
349 `errno' value from the failing call; if it returns non-zero
350 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
351 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
352 Otherwise, `glob' returns zero. */
354 glob (pattern
, flags
, errfunc
, pglob
)
357 int (*errfunc
) __P ((const char *, int));
360 const char *filename
;
366 if (pattern
== NULL
|| pglob
== NULL
|| (flags
& ~__GLOB_FLAGS
) != 0)
368 __set_errno (EINVAL
);
372 if (flags
& GLOB_BRACE
)
374 const char *begin
= strchr (pattern
, '{');
377 /* Allocate working buffer large enough for our work. Note that
378 we have at least an opening and closing brace. */
386 char onealt
[strlen (pattern
) - 1];
388 char *onealt
= (char *) malloc (strlen (pattern
) - 1);
391 if (!(flags
& GLOB_APPEND
))
397 /* We know the prefix for all sub-patterns. */
399 alt_start
= mempcpy (onealt
, pattern
, begin
- pattern
);
401 memcpy (onealt
, pattern
, begin
- pattern
);
402 alt_start
= &onealt
[begin
- pattern
];
405 /* Find the first sub-pattern and at the same time find the
406 rest after the closing brace. */
407 next
= next_brace_sub (begin
+ 1);
410 /* It is an illegal expression. */
414 return glob (pattern
, flags
& ~GLOB_BRACE
, errfunc
, pglob
);
417 /* Now find the end of the whole brace expression. */
421 rest
= next_brace_sub (rest
+ 1);
424 /* It is an illegal expression. */
428 return glob (pattern
, flags
& ~GLOB_BRACE
, errfunc
, pglob
);
431 /* Please note that we now can be sure the brace expression
433 rest_len
= strlen (++rest
) + 1;
435 /* We have a brace expression. BEGIN points to the opening {,
436 NEXT points past the terminator of the first element, and END
437 points past the final }. We will accumulate result names from
438 recursive runs for each brace alternative in the buffer using
441 if (!(flags
& GLOB_APPEND
))
443 /* This call is to set a new vector, so clear out the
444 vector so we can append to it. */
446 pglob
->gl_pathv
= NULL
;
448 firstc
= pglob
->gl_pathc
;
455 /* Construct the new glob expression. */
457 mempcpy (mempcpy (alt_start
, p
, next
- p
), rest
, rest_len
);
459 memcpy (alt_start
, p
, next
- p
);
460 memcpy (&alt_start
[next
- p
], rest
, rest_len
);
463 result
= glob (onealt
,
464 ((flags
& ~(GLOB_NOCHECK
|GLOB_NOMAGIC
))
465 | GLOB_APPEND
), errfunc
, pglob
);
467 /* If we got an error, return it. */
468 if (result
&& result
!= GLOB_NOMATCH
)
473 if (!(flags
& GLOB_APPEND
))
479 /* We saw the last entry. */
483 next
= next_brace_sub (p
);
484 assert (next
!= NULL
);
491 if (pglob
->gl_pathc
!= firstc
)
492 /* We found some entries. */
494 else if (!(flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
499 /* Find the filename. */
500 filename
= strrchr (pattern
, '/');
501 #if defined __MSDOS__ || defined WINDOWS32
502 /* The case of "d:pattern". Since `:' is not allowed in
503 file names, we can safely assume that wherever it
504 happens in pattern, it signals the filename part. This
505 is so we could some day support patterns like "[a-z]:foo". */
506 if (filename
== NULL
)
507 filename
= strchr (pattern
, ':');
508 #endif /* __MSDOS__ || WINDOWS32 */
509 if (filename
== NULL
)
511 /* This can mean two things: a simple name or "~name". The later
512 case is nothing but a notation for a directory. */
513 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && pattern
[0] == '~')
516 dirlen
= strlen (pattern
);
518 /* Set FILENAME to NULL as a special flag. This is ugly but
519 other solutions would require much more code. We test for
520 this special case below. */
534 else if (filename
== pattern
)
544 dirlen
= filename
- pattern
;
545 #if defined __MSDOS__ || defined WINDOWS32
547 || (filename
> pattern
+ 1 && filename
[-1] == ':'))
552 drive_spec
= (char *) __alloca (dirlen
+ 1);
554 *((char *) mempcpy (drive_spec
, pattern
, dirlen
)) = '\0';
556 memcpy (drive_spec
, pattern
, dirlen
);
557 drive_spec
[dirlen
] = '\0';
559 /* For now, disallow wildcards in the drive spec, to
560 prevent infinite recursion in glob. */
561 if (__glob_pattern_p (drive_spec
, !(flags
& GLOB_NOESCAPE
)))
563 /* If this is "d:pattern", we need to copy `:' to DIRNAME
564 as well. If it's "d:/pattern", don't remove the slash
565 from "d:/", since "d:" and "d:/" are not the same.*/
568 newp
= (char *) __alloca (dirlen
+ 1);
570 *((char *) mempcpy (newp
, pattern
, dirlen
)) = '\0';
572 memcpy (newp
, pattern
, dirlen
);
578 if (filename
[0] == '\0'
579 #if defined __MSDOS__ || defined WINDOWS32
580 && dirname
[dirlen
- 1] != ':'
581 && (dirlen
< 3 || dirname
[dirlen
- 2] != ':'
582 || dirname
[dirlen
- 1] != '/')
585 /* "pattern/". Expand "pattern", appending slashes. */
587 int val
= glob (dirname
, flags
| GLOB_MARK
, errfunc
, pglob
);
589 pglob
->gl_flags
= ((pglob
->gl_flags
& ~GLOB_MARK
)
590 | (flags
& GLOB_MARK
));
595 if (!(flags
& GLOB_APPEND
))
598 pglob
->gl_pathv
= NULL
;
601 oldcount
= pglob
->gl_pathc
;
604 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && dirname
[0] == '~')
606 if (dirname
[1] == '\0' || dirname
[1] == '/')
608 /* Look up home directory. */
609 const char *home_dir
= getenv ("HOME");
611 if (home_dir
== NULL
|| home_dir
[0] == '\0')
615 if (home_dir
== NULL
|| home_dir
[0] == '\0')
616 home_dir
= "c:/users/default"; /* poor default */
618 if (home_dir
== NULL
|| home_dir
[0] == '\0')
622 # if defined HAVE_GETLOGIN_R || defined _LIBC
623 size_t buflen
= sysconf (_SC_LOGIN_NAME_MAX
) + 1;
626 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
629 name
= (char *) __alloca (buflen
);
631 success
= getlogin_r (name
, buflen
) >= 0;
633 success
= (name
= getlogin ()) != NULL
;
638 # if defined HAVE_GETPWNAM_R || defined _LIBC
639 size_t pwbuflen
= sysconf (_SC_GETPW_R_SIZE_MAX
);
644 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
645 Try a moderate value. */
647 pwtmpbuf
= (char *) __alloca (pwbuflen
);
649 success
= (getpwnam_r (name
, &pwbuf
, pwtmpbuf
, pwbuflen
, &p
)
656 home_dir
= p
->pw_dir
;
659 if (home_dir
== NULL
|| home_dir
[0] == '\0')
660 if (flags
& GLOB_TILDE_CHECK
)
663 home_dir
= "~"; /* No luck. */
664 # endif /* WINDOWS32 */
666 /* Now construct the full directory. */
667 if (dirname
[1] == '\0')
672 size_t home_len
= strlen (home_dir
);
673 newp
= (char *) __alloca (home_len
+ dirlen
);
675 mempcpy (mempcpy (newp
, home_dir
, home_len
),
676 &dirname
[1], dirlen
);
678 memcpy (newp
, home_dir
, home_len
);
679 memcpy (&newp
[home_len
], &dirname
[1], dirlen
);
684 # if !defined _AMIGA && !defined WINDOWS32
687 char *end_name
= strchr (dirname
, '/');
688 const char *user_name
;
689 const char *home_dir
;
691 if (end_name
== NULL
)
692 user_name
= dirname
+ 1;
696 newp
= (char *) __alloca (end_name
- dirname
);
698 *((char *) mempcpy (newp
, dirname
+ 1, end_name
- dirname
))
701 memcpy (newp
, dirname
+ 1, end_name
- dirname
);
702 newp
[end_name
- dirname
- 1] = '\0';
707 /* Look up specific user's home directory. */
710 # if defined HAVE_GETPWNAM_R || defined _LIBC
711 size_t buflen
= sysconf (_SC_GETPW_R_SIZE_MAX
);
716 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
719 pwtmpbuf
= (char *) __alloca (buflen
);
721 if (getpwnam_r (user_name
, &pwbuf
, pwtmpbuf
, buflen
, &p
) >= 0)
722 home_dir
= p
->pw_dir
;
726 p
= getpwnam (user_name
);
728 home_dir
= p
->pw_dir
;
733 /* If we found a home directory use this. */
734 if (home_dir
!= NULL
)
737 size_t home_len
= strlen (home_dir
);
738 size_t rest_len
= end_name
== NULL
? 0 : strlen (end_name
);
739 newp
= (char *) __alloca (home_len
+ rest_len
+ 1);
741 *((char *) mempcpy (mempcpy (newp
, home_dir
, home_len
),
742 end_name
, rest_len
)) = '\0';
744 memcpy (newp
, home_dir
, home_len
);
745 memcpy (&newp
[home_len
], end_name
, rest_len
);
746 newp
[home_len
+ rest_len
] = '\0';
751 if (flags
& GLOB_TILDE_CHECK
)
752 /* We have to regard it as an error if we cannot find the
756 # endif /* Not Amiga && not WINDOWS32. */
758 #endif /* Not VMS. */
760 /* Now test whether we looked for "~" or "~NAME". In this case we
761 can give the answer now. */
762 if (filename
== NULL
)
766 /* Return the directory if we don't check for error or if it exists. */
767 if ((flags
& GLOB_NOCHECK
)
768 || (((flags
& GLOB_ALTDIRFUNC
)
769 ? (*pglob
->gl_stat
) (dirname
, &st
)
770 : __stat (dirname
, &st
)) == 0
771 && S_ISDIR (st
.st_mode
)))
774 = (char **) realloc (pglob
->gl_pathv
,
776 ((flags
& GLOB_DOOFFS
) ?
777 pglob
->gl_offs
: 0) +
780 if (pglob
->gl_pathv
== NULL
)
783 if (flags
& GLOB_DOOFFS
)
784 while (pglob
->gl_pathc
< pglob
->gl_offs
)
785 pglob
->gl_pathv
[pglob
->gl_pathc
++] = NULL
;
787 #if defined HAVE_STRDUP || defined _LIBC
788 pglob
->gl_pathv
[pglob
->gl_pathc
] = strdup (dirname
);
791 size_t len
= strlen (dirname
) + 1;
792 char *dircopy
= malloc (len
);
794 pglob
->gl_pathv
[pglob
->gl_pathc
] = memcpy (dircopy
, dirname
,
798 if (pglob
->gl_pathv
[pglob
->gl_pathc
] == NULL
)
800 free (pglob
->gl_pathv
);
803 pglob
->gl_pathv
[++pglob
->gl_pathc
] = NULL
;
804 pglob
->gl_flags
= flags
;
813 if (__glob_pattern_p (dirname
, !(flags
& GLOB_NOESCAPE
)))
815 /* The directory name contains metacharacters, so we
816 have to glob for the directory, and then glob for
817 the pattern in each directory found. */
821 status
= glob (dirname
,
822 ((flags
& (GLOB_ERR
| GLOB_NOCHECK
| GLOB_NOESCAPE
))
823 | GLOB_NOSORT
| GLOB_ONLYDIR
),
828 /* We have successfully globbed the preceding directory name.
829 For each name we found, call glob_in_dir on it and FILENAME,
830 appending the results to PGLOB. */
831 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
837 /* Make globbing interruptible in the bash shell. */
838 extern int interrupt_state
;
849 old_pathc
= pglob
->gl_pathc
;
850 status
= glob_in_dir (filename
, dirs
.gl_pathv
[i
],
851 ((flags
| GLOB_APPEND
)
852 & ~(GLOB_NOCHECK
| GLOB_ERR
)),
854 if (status
== GLOB_NOMATCH
)
855 /* No matches in this directory. Try the next. */
865 /* Stick the directory on the front of each name. */
866 if (prefix_array (dirs
.gl_pathv
[i
],
867 &pglob
->gl_pathv
[old_pathc
],
868 pglob
->gl_pathc
- old_pathc
))
876 flags
|= GLOB_MAGCHAR
;
878 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
879 But if we have not found any matching entry and thie GLOB_NOCHECK
880 flag was set we must return the list consisting of the disrectory
881 names followed by the filename. */
882 if (pglob
->gl_pathc
== oldcount
)
884 if (flags
& GLOB_NOCHECK
)
886 size_t filename_len
= strlen (filename
) + 1;
890 /* This is an pessimistic guess about the size. */
892 = (char **) realloc (pglob
->gl_pathv
,
894 ((flags
& GLOB_DOOFFS
) ?
895 pglob
->gl_offs
: 0) +
898 if (pglob
->gl_pathv
== NULL
)
904 if (flags
& GLOB_DOOFFS
)
905 while (pglob
->gl_pathc
< pglob
->gl_offs
)
906 pglob
->gl_pathv
[pglob
->gl_pathc
++] = NULL
;
908 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
910 const char *dir
= dirs
.gl_pathv
[i
];
911 size_t dir_len
= strlen (dir
);
913 /* First check whether this really is a directory. */
914 if (((flags
& GLOB_ALTDIRFUNC
)
915 ? (*pglob
->gl_stat
) (dir
, &st
) : __stat (dir
, &st
)) != 0
916 || !S_ISDIR (st
.st_mode
))
917 /* No directory, ignore this entry. */
920 pglob
->gl_pathv
[pglob
->gl_pathc
] = malloc (dir_len
+ 1
922 if (pglob
->gl_pathv
[pglob
->gl_pathc
] == NULL
)
930 mempcpy (mempcpy (mempcpy (pglob
->gl_pathv
[pglob
->gl_pathc
],
933 filename
, filename_len
);
935 memcpy (pglob
->gl_pathv
[pglob
->gl_pathc
], dir
, dir_len
);
936 pglob
->gl_pathv
[pglob
->gl_pathc
][dir_len
] = '/';
937 memcpy (&pglob
->gl_pathv
[pglob
->gl_pathc
][dir_len
+ 1],
938 filename
, filename_len
);
943 pglob
->gl_pathv
[pglob
->gl_pathc
] = NULL
;
944 pglob
->gl_flags
= flags
;
946 /* Now we know how large the gl_pathv vector must be. */
947 new_pathv
= (char **) realloc (pglob
->gl_pathv
,
948 ((pglob
->gl_pathc
+ 1)
950 if (new_pathv
!= NULL
)
951 pglob
->gl_pathv
= new_pathv
;
960 status
= glob_in_dir (filename
, dirname
, flags
, errfunc
, pglob
);
966 /* Stick the directory on the front of each name. */
967 int ignore
= oldcount
;
969 if ((flags
& GLOB_DOOFFS
) && ignore
< pglob
->gl_offs
)
970 ignore
= pglob
->gl_offs
;
972 if (prefix_array (dirname
,
973 &pglob
->gl_pathv
[ignore
],
974 pglob
->gl_pathc
- ignore
))
982 if (flags
& GLOB_MARK
)
984 /* Append slashes to directory names. */
987 for (i
= oldcount
; i
< pglob
->gl_pathc
; ++i
)
988 if (((flags
& GLOB_ALTDIRFUNC
)
989 ? (*pglob
->gl_stat
) (pglob
->gl_pathv
[i
], &st
)
990 : __stat (pglob
->gl_pathv
[i
], &st
)) == 0
991 && S_ISDIR (st
.st_mode
))
993 size_t len
= strlen (pglob
->gl_pathv
[i
]) + 2;
994 char *new = realloc (pglob
->gl_pathv
[i
], len
);
1000 strcpy (&new[len
- 2], "/");
1001 pglob
->gl_pathv
[i
] = new;
1005 if (!(flags
& GLOB_NOSORT
))
1007 /* Sort the vector. */
1008 int non_sort
= oldcount
;
1010 if ((flags
& GLOB_DOOFFS
) && pglob
->gl_offs
> oldcount
)
1011 non_sort
= pglob
->gl_offs
;
1013 qsort ((__ptr_t
) &pglob
->gl_pathv
[non_sort
],
1014 pglob
->gl_pathc
- non_sort
,
1015 sizeof (char *), collated_compare
);
1022 /* Free storage allocated in PGLOB by a previous `glob' call. */
1025 register glob_t
*pglob
;
1027 if (pglob
->gl_pathv
!= NULL
)
1030 for (i
= 0; i
< pglob
->gl_pathc
; ++i
)
1031 if (pglob
->gl_pathv
[i
] != NULL
)
1032 free ((__ptr_t
) pglob
->gl_pathv
[i
]);
1033 free ((__ptr_t
) pglob
->gl_pathv
);
1038 /* Do a collated comparison of A and B. */
1040 collated_compare (a
, b
)
1044 const char *const s1
= *(const char *const * const) a
;
1045 const char *const s2
= *(const char *const * const) b
;
1053 return strcoll (s1
, s2
);
1057 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1058 elements in place. Return nonzero if out of memory, zero if successful.
1059 A slash is inserted between DIRNAME and each elt of ARRAY,
1060 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1062 prefix_array (dirname
, array
, n
)
1063 const char *dirname
;
1068 size_t dirlen
= strlen (dirname
);
1069 #if defined __MSDOS__ || defined WINDOWS32
1071 # define DIRSEP_CHAR sep_char
1073 # define DIRSEP_CHAR '/'
1076 if (dirlen
== 1 && dirname
[0] == '/')
1077 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1078 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1080 #if defined __MSDOS__ || defined WINDOWS32
1081 else if (dirlen
> 1)
1083 if (dirname
[dirlen
- 1] == '/')
1084 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1086 else if (dirname
[dirlen
- 1] == ':')
1088 /* DIRNAME is "d:". Use `:' instead of `/'. */
1095 for (i
= 0; i
< n
; ++i
)
1097 size_t eltlen
= strlen (array
[i
]) + 1;
1098 char *new = (char *) malloc (dirlen
+ 1 + eltlen
);
1102 free ((__ptr_t
) array
[--i
]);
1108 char *endp
= (char *) mempcpy (new, dirname
, dirlen
);
1109 *endp
++ = DIRSEP_CHAR
;
1110 mempcpy (endp
, array
[i
], eltlen
);
1113 memcpy (new, dirname
, dirlen
);
1114 new[dirlen
] = DIRSEP_CHAR
;
1115 memcpy (&new[dirlen
+ 1], array
[i
], eltlen
);
1117 free ((__ptr_t
) array
[i
]);
1125 /* We must not compile this function twice. */
1126 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1127 /* Return nonzero if PATTERN contains any metacharacters.
1128 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1130 __glob_pattern_p (pattern
, quote
)
1131 const char *pattern
;
1134 register const char *p
;
1137 for (p
= pattern
; *p
!= '\0'; ++p
)
1145 if (quote
&& p
[1] != '\0')
1162 weak_alias (__glob_pattern_p
, glob_pattern_p
)
1167 /* Like `glob', but PATTERN is a final pathname component,
1168 and matches are searched for in DIRECTORY.
1169 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1170 The GLOB_APPEND flag is assumed to be set (always appends). */
1172 glob_in_dir (pattern
, directory
, flags
, errfunc
, pglob
)
1173 const char *pattern
;
1174 const char *directory
;
1176 int (*errfunc
) __P ((const char *, int));
1179 __ptr_t stream
= NULL
;
1183 struct globlink
*next
;
1186 struct globlink
*names
= NULL
;
1191 meta
= __glob_pattern_p (pattern
, !(flags
& GLOB_NOESCAPE
));
1194 if (flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
))
1195 /* We need not do any tests. The PATTERN contains no meta
1196 characters and we must not return an error therefore the
1197 result will always contain exactly one name. */
1198 flags
|= GLOB_NOCHECK
;
1201 /* Since we use the normal file functions we can also use stat()
1202 to verify the file is there. */
1204 size_t patlen
= strlen (pattern
);
1205 size_t dirlen
= strlen (directory
);
1206 char *fullname
= (char *) __alloca (dirlen
+ 1 + patlen
+ 1);
1208 # ifdef HAVE_MEMPCPY
1209 mempcpy (mempcpy (mempcpy (fullname
, directory
, dirlen
),
1211 pattern
, patlen
+ 1);
1213 memcpy (fullname
, directory
, dirlen
);
1214 fullname
[dirlen
] = '/';
1215 memcpy (&fullname
[dirlen
+ 1], pattern
, patlen
+ 1);
1217 if (((flags
& GLOB_ALTDIRFUNC
)
1218 ? (*pglob
->gl_stat
) (fullname
, &st
)
1219 : __stat (fullname
, &st
)) == 0)
1220 /* We found this file to be existing. Now tell the rest
1221 of the function to copy this name into the result. */
1222 flags
|= GLOB_NOCHECK
;
1229 if (pattern
[0] == '\0')
1231 /* This is a special case for matching directories like in
1233 names
= (struct globlink
*) __alloca (sizeof (struct globlink
));
1234 names
->name
= (char *) malloc (1);
1235 if (names
->name
== NULL
)
1237 names
->name
[0] = '\0';
1244 stream
= ((flags
& GLOB_ALTDIRFUNC
)
1245 ? (*pglob
->gl_opendir
) (directory
)
1246 : (__ptr_t
) opendir (directory
));
1249 if ((errfunc
!= NULL
&& (*errfunc
) (directory
, errno
))
1250 || (flags
& GLOB_ERR
))
1251 return GLOB_ABORTED
;
1257 int fnm_flags
= ((!(flags
& GLOB_PERIOD
) ? FNM_PERIOD
: 0)
1258 | ((flags
& GLOB_NOESCAPE
) ? FNM_NOESCAPE
: 0)
1259 #if defined _AMIGA || defined VMS
1264 flags
|= GLOB_MAGCHAR
;
1270 struct dirent
*d
= ((flags
& GLOB_ALTDIRFUNC
)
1271 ? (*pglob
->gl_readdir
) (stream
)
1272 : readdir ((DIR *) stream
));
1275 if (! REAL_DIR_ENTRY (d
))
1279 /* If we shall match only directories use the information
1280 provided by the dirent call if possible. */
1281 if ((flags
& GLOB_ONLYDIR
)
1282 && d
->d_type
!= DT_UNKNOWN
&& d
->d_type
!= DT_DIR
)
1288 if (fnmatch (pattern
, name
, fnm_flags
) == 0)
1290 struct globlink
*new = (struct globlink
*)
1291 __alloca (sizeof (struct globlink
));
1293 new->name
= (char *) malloc (len
+ 1);
1294 if (new->name
== NULL
)
1297 *((char *) mempcpy ((__ptr_t
) new->name
, name
, len
))
1300 memcpy ((__ptr_t
) new->name
, name
, len
);
1301 new->name
[len
] = '\0';
1312 if (nfound
== 0 && (flags
& GLOB_NOCHECK
))
1314 size_t len
= strlen (pattern
);
1316 names
= (struct globlink
*) __alloca (sizeof (struct globlink
));
1318 names
->name
= (char *) malloc (len
+ 1);
1319 if (names
->name
== NULL
)
1322 *((char *) mempcpy (names
->name
, pattern
, len
)) = '\0';
1324 memcpy (names
->name
, pattern
, len
);
1325 names
->name
[len
] = '\0';
1332 = (char **) realloc (pglob
->gl_pathv
,
1334 ((flags
& GLOB_DOOFFS
) ? pglob
->gl_offs
: 0) +
1337 if (pglob
->gl_pathv
== NULL
)
1340 if (flags
& GLOB_DOOFFS
)
1341 while (pglob
->gl_pathc
< pglob
->gl_offs
)
1342 pglob
->gl_pathv
[pglob
->gl_pathc
++] = NULL
;
1344 for (; names
!= NULL
; names
= names
->next
)
1345 pglob
->gl_pathv
[pglob
->gl_pathc
++] = names
->name
;
1346 pglob
->gl_pathv
[pglob
->gl_pathc
] = NULL
;
1348 pglob
->gl_flags
= flags
;
1353 if (flags
& GLOB_ALTDIRFUNC
)
1354 (*pglob
->gl_closedir
) (stream
);
1356 closedir ((DIR *) stream
);
1359 return nfound
== 0 ? GLOB_NOMATCH
: 0;
1364 if (flags
& GLOB_ALTDIRFUNC
)
1365 (*pglob
->gl_closedir
) (stream
);
1367 closedir ((DIR *) stream
);
1370 while (names
!= NULL
)
1372 if (names
->name
!= NULL
)
1373 free ((__ptr_t
) names
->name
);
1374 names
= names
->next
;
1376 return GLOB_NOSPACE
;
1379 #endif /* Not ELIDE_CODE. */