1 /* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 Free
2 Software Foundation, Inc.
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the Free
16 Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
19 /* AIX requires this to be the first thing in the file. */
20 #if defined _AIX && !defined __GNUC__
28 /* Enable GNU extensions in glob.h. */
30 # define _GNU_SOURCE 1
34 #include <sys/types.h>
37 /* Outcomment the following line for production quality code. */
38 /* #define NDEBUG 1 */
41 #include <stdio.h> /* Needed on stupid SunOS for assert. */
44 /* Comment out all this code if we are using the GNU C Library, and are not
45 actually compiling the library itself. This code is part of the GNU C
46 Library, but also included in many other GNU distributions. Compiling
47 and linking in this code is a waste when using the GNU C library
48 (especially if it is a shared library). Rather than having every GNU
49 program understand `configure --with-gnu-libc' and omit the object files,
50 it is simpler to just do this in the source for each such file. */
52 #define GLOB_INTERFACE_VERSION 1
53 #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
54 # include <gnu-versions.h>
55 # if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
62 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
66 #if defined HAVE_UNISTD_H || defined _LIBC
69 # ifdef _POSIX_VERSION
75 #if !defined _AMIGA && !defined VMS && !defined WINDOWS32
79 #if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS
83 # define __set_errno(val) errno = (val)
91 #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
93 # define NAMLEN(dirent) strlen((dirent)->d_name)
95 # define dirent direct
96 # define NAMLEN(dirent) (dirent)->d_namlen
97 # ifdef HAVE_SYS_NDIR_H
98 # include <sys/ndir.h>
100 # ifdef HAVE_SYS_DIR_H
101 # include <sys/dir.h>
106 # ifdef HAVE_VMSDIR_H
108 # endif /* HAVE_VMSDIR_H */
112 /* In GNU systems, <dirent.h> defines this macro for us. */
115 # define NAMLEN(d) _D_NAMLEN(d)
118 /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
119 if the `d_type' member for `struct dirent' is available. */
120 #ifdef _DIRENT_HAVE_D_TYPE
121 # define HAVE_D_TYPE 1
125 #if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
126 /* Posix does not require that the d_ino field be present, and some
127 systems do not provide it. */
128 # define REAL_DIR_ENTRY(dp) 1
130 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
133 #if defined STDC_HEADERS || defined __GNU_LIBRARY__
137 #else /* No standard headers. */
139 extern char *getenv ();
141 # ifdef HAVE_STRING_H
145 # include <strings.h>
147 # ifdef HAVE_MEMORY_H
151 extern char *malloc (), *realloc ();
154 extern void qsort ();
155 extern void abort (), exit ();
157 #endif /* Standard headers. */
162 extern void bzero ();
165 extern void bcopy ();
168 # define memcpy(d, s, n) bcopy ((s), (d), (n))
169 # define strrchr rindex
170 /* memset is only used for zero here, but let's be paranoid. */
171 # define memset(s, better_be_zero, n) \
172 ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
173 #endif /* Not ANSI_STRING. */
175 #if !defined HAVE_STRCOLL && !defined _LIBC
176 # define strcoll strcmp
179 #if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
180 # define HAVE_MEMPCPY 1
182 # define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
185 #ifndef __GNU_LIBRARY__
192 my_realloc (void *p
, unsigned int n
)
200 /* These casts are the for sake of the broken Ultrix compiler,
201 which warns of illegal pointer combinations otherwise. */
203 return (char *) malloc (n
);
204 return (char *) realloc (p
, n
);
206 # define realloc my_realloc
208 #endif /* __GNU_LIBRARY__ */
211 #if !defined __alloca && !defined __GNU_LIBRARY__
215 # define alloca(n) __builtin_alloca (n)
216 # else /* Not GCC. */
217 # ifdef HAVE_ALLOCA_H
219 # else /* Not HAVE_ALLOCA_H. */
224 extern char *alloca ();
225 # endif /* WINDOWS32 */
226 # endif /* Not _AIX. */
227 # endif /* sparc or HAVE_ALLOCA_H. */
230 # define __alloca alloca
234 #ifndef __GNU_LIBRARY__
236 # ifdef STAT_MACROS_BROKEN
240 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
246 # define strdup(str) __strdup (str)
247 # define sysconf(id) __sysconf (id)
248 # define closedir(dir) __closedir (dir)
249 # define opendir(name) __opendir (name)
250 # define readdir(str) __readdir (str)
251 # define getpwnam_r(name, bufp, buf, len, res) \
252 __getpwnam_r (name, bufp, buf, len, res)
254 # define __stat(fname, buf) __xstat (_STAT_VER, fname, buf)
258 #if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
260 # define size_t unsigned int
263 /* Some system header files erroneously define these.
264 We want our own definitions from <fnmatch.h> to take precedence. */
265 #ifndef __GNU_LIBRARY__
272 /* Some system header files erroneously define these.
273 We want our own definitions from <glob.h> to take precedence. */
274 #ifndef __GNU_LIBRARY__
281 # undef GLOB_NOESCAPE
286 #ifdef HAVE_GETLOGIN_R
287 extern int getlogin_r
__P ((char *, size_t));
289 extern char *getlogin
__P ((void));
293 #if __GNUC__ - 0 >= 2
296 const char *next_brace_sub
__P ((const char *begin
));
297 static int glob_in_dir
__P ((const char *pattern
, const char *directory
,
299 int (*errfunc
) (const char *, int),
301 static int prefix_array
__P ((const char *prefix
, char **array
, size_t n
));
302 static int collated_compare
__P ((const __ptr_t
, const __ptr_t
));
304 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
305 int __glob_pattern_p
__P ((const char *pattern
, int quote
));
308 /* Find the end of the sub-pattern in a brace expression. We define
309 this as an inline function if the compiler permits. */
311 #if __GNUC__ - 0 >= 2
315 next_brace_sub (begin
)
318 unsigned int depth
= 0;
319 const char *cp
= begin
;
325 if (*cp
!= ',' && *cp
!= '}' && *cp
!= '\0')
335 while (*cp
!= '\0' && (*cp
!= '}' || depth
> 0))
342 /* An incorrectly terminated brace expression. */
353 /* Do glob searching for PATTERN, placing results in PGLOB.
354 The bits defined above may be set in FLAGS.
355 If a directory cannot be opened or read and ERRFUNC is not nil,
356 it is called with the pathname that caused the error, and the
357 `errno' value from the failing call; if it returns non-zero
358 `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
359 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
360 Otherwise, `glob' returns zero. */
362 glob (pattern
, flags
, errfunc
, pglob
)
365 int (*errfunc
) __P ((const char *, int));
368 const char *filename
;
374 if (pattern
== NULL
|| pglob
== NULL
|| (flags
& ~__GLOB_FLAGS
) != 0)
376 __set_errno (EINVAL
);
380 if (flags
& GLOB_BRACE
)
382 const char *begin
= strchr (pattern
, '{');
385 /* Allocate working buffer large enough for our work. Note that
386 we have at least an opening and closing brace. */
394 char onealt
[strlen (pattern
) - 1];
396 char *onealt
= (char *) malloc (strlen (pattern
) - 1);
399 if (!(flags
& GLOB_APPEND
))
405 /* We know the prefix for all sub-patterns. */
407 alt_start
= mempcpy (onealt
, pattern
, begin
- pattern
);
409 memcpy (onealt
, pattern
, begin
- pattern
);
410 alt_start
= &onealt
[begin
- pattern
];
413 /* Find the first sub-pattern and at the same time find the
414 rest after the closing brace. */
415 next
= next_brace_sub (begin
+ 1);
418 /* It is an illegal expression. */
422 return glob (pattern
, flags
& ~GLOB_BRACE
, errfunc
, pglob
);
425 /* Now find the end of the whole brace expression. */
429 rest
= next_brace_sub (rest
+ 1);
432 /* It is an illegal expression. */
436 return glob (pattern
, flags
& ~GLOB_BRACE
, errfunc
, pglob
);
439 /* Please note that we now can be sure the brace expression
441 rest_len
= strlen (++rest
) + 1;
443 /* We have a brace expression. BEGIN points to the opening {,
444 NEXT points past the terminator of the first element, and END
445 points past the final }. We will accumulate result names from
446 recursive runs for each brace alternative in the buffer using
449 if (!(flags
& GLOB_APPEND
))
451 /* This call is to set a new vector, so clear out the
452 vector so we can append to it. */
454 pglob
->gl_pathv
= NULL
;
456 firstc
= pglob
->gl_pathc
;
463 /* Construct the new glob expression. */
465 mempcpy (mempcpy (alt_start
, p
, next
- p
), rest
, rest_len
);
467 memcpy (alt_start
, p
, next
- p
);
468 memcpy (&alt_start
[next
- p
], rest
, rest_len
);
471 result
= glob (onealt
,
472 ((flags
& ~(GLOB_NOCHECK
|GLOB_NOMAGIC
))
473 | GLOB_APPEND
), errfunc
, pglob
);
475 /* If we got an error, return it. */
476 if (result
&& result
!= GLOB_NOMATCH
)
481 if (!(flags
& GLOB_APPEND
))
487 /* We saw the last entry. */
491 next
= next_brace_sub (p
);
492 assert (next
!= NULL
);
499 if (pglob
->gl_pathc
!= firstc
)
500 /* We found some entries. */
502 else if (!(flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
)))
507 /* Find the filename. */
508 filename
= strrchr (pattern
, '/');
509 #if defined __MSDOS__ || defined WINDOWS32
510 /* The case of "d:pattern". Since `:' is not allowed in
511 file names, we can safely assume that wherever it
512 happens in pattern, it signals the filename part. This
513 is so we could some day support patterns like "[a-z]:foo". */
514 if (filename
== NULL
)
515 filename
= strchr (pattern
, ':');
516 #endif /* __MSDOS__ || WINDOWS32 */
517 if (filename
== NULL
)
519 /* This can mean two things: a simple name or "~name". The later
520 case is nothing but a notation for a directory. */
521 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && pattern
[0] == '~')
524 dirlen
= strlen (pattern
);
526 /* Set FILENAME to NULL as a special flag. This is ugly but
527 other solutions would require much more code. We test for
528 this special case below. */
542 else if (filename
== pattern
)
552 dirlen
= filename
- pattern
;
553 #if defined __MSDOS__ || defined WINDOWS32
555 || (filename
> pattern
+ 1 && filename
[-1] == ':'))
560 drive_spec
= (char *) __alloca (dirlen
+ 1);
562 *((char *) mempcpy (drive_spec
, pattern
, dirlen
)) = '\0';
564 memcpy (drive_spec
, pattern
, dirlen
);
565 drive_spec
[dirlen
] = '\0';
567 /* For now, disallow wildcards in the drive spec, to
568 prevent infinite recursion in glob. */
569 if (__glob_pattern_p (drive_spec
, !(flags
& GLOB_NOESCAPE
)))
571 /* If this is "d:pattern", we need to copy `:' to DIRNAME
572 as well. If it's "d:/pattern", don't remove the slash
573 from "d:/", since "d:" and "d:/" are not the same.*/
576 newp
= (char *) __alloca (dirlen
+ 1);
578 *((char *) mempcpy (newp
, pattern
, dirlen
)) = '\0';
580 memcpy (newp
, pattern
, dirlen
);
586 if (filename
[0] == '\0'
587 #if defined __MSDOS__ || defined WINDOWS32
588 && dirname
[dirlen
- 1] != ':'
589 && (dirlen
< 3 || dirname
[dirlen
- 2] != ':'
590 || dirname
[dirlen
- 1] != '/')
593 /* "pattern/". Expand "pattern", appending slashes. */
595 int val
= glob (dirname
, flags
| GLOB_MARK
, errfunc
, pglob
);
597 pglob
->gl_flags
= ((pglob
->gl_flags
& ~GLOB_MARK
)
598 | (flags
& GLOB_MARK
));
603 if (!(flags
& GLOB_APPEND
))
606 pglob
->gl_pathv
= NULL
;
609 oldcount
= pglob
->gl_pathc
;
612 if ((flags
& (GLOB_TILDE
|GLOB_TILDE_CHECK
)) && dirname
[0] == '~')
614 if (dirname
[1] == '\0' || dirname
[1] == '/')
616 /* Look up home directory. */
618 /* This isn't obvious, RTLs of DECC and VAXC know about "HOME" */
619 const char *home_dir
= getenv ("SYS$LOGIN");
621 const char *home_dir
= getenv ("HOME");
624 if (home_dir
== NULL
|| home_dir
[0] == '\0')
628 if (home_dir
== NULL
|| home_dir
[0] == '\0')
629 home_dir
= "c:/users/default"; /* poor default */
632 /* Again, this isn't obvious, if "HOME" isn't known "SYS$LOGIN" should be set */
633 if (home_dir
== NULL
|| home_dir
[0] == '\0')
634 home_dir
= "SYS$DISK:[]";
636 if (home_dir
== NULL
|| home_dir
[0] == '\0')
640 # if defined HAVE_GETLOGIN_R || defined _LIBC
641 size_t buflen
= sysconf (_SC_LOGIN_NAME_MAX
) + 1;
644 /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
647 name
= (char *) __alloca (buflen
);
649 success
= getlogin_r (name
, buflen
) >= 0;
651 success
= (name
= getlogin ()) != NULL
;
656 # if defined HAVE_GETPWNAM_R || defined _LIBC
657 size_t pwbuflen
= sysconf (_SC_GETPW_R_SIZE_MAX
);
663 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
664 Try a moderate value. */
666 pwtmpbuf
= (char *) __alloca (pwbuflen
);
668 while (getpwnam_r (name
, &pwbuf
, pwtmpbuf
, pwbuflen
, &p
)
677 pwtmpbuf
= (char *) __alloca (pwbuflen
);
684 home_dir
= p
->pw_dir
;
687 if (home_dir
== NULL
|| home_dir
[0] == '\0')
689 if (flags
& GLOB_TILDE_CHECK
)
692 home_dir
= "~"; /* No luck. */
695 # endif /* WINDOWS32 */
697 /* Now construct the full directory. */
698 if (dirname
[1] == '\0')
703 size_t home_len
= strlen (home_dir
);
704 newp
= (char *) __alloca (home_len
+ dirlen
);
706 mempcpy (mempcpy (newp
, home_dir
, home_len
),
707 &dirname
[1], dirlen
);
709 memcpy (newp
, home_dir
, home_len
);
710 memcpy (&newp
[home_len
], &dirname
[1], dirlen
);
715 # if !defined _AMIGA && !defined WINDOWS32 && !defined VMS
718 char *end_name
= strchr (dirname
, '/');
719 const char *user_name
;
720 const char *home_dir
;
722 if (end_name
== NULL
)
723 user_name
= dirname
+ 1;
727 newp
= (char *) __alloca (end_name
- dirname
);
729 *((char *) mempcpy (newp
, dirname
+ 1, end_name
- dirname
))
732 memcpy (newp
, dirname
+ 1, end_name
- dirname
);
733 newp
[end_name
- dirname
- 1] = '\0';
738 /* Look up specific user's home directory. */
741 # if defined HAVE_GETPWNAM_R || defined _LIBC
742 size_t buflen
= sysconf (_SC_GETPW_R_SIZE_MAX
);
748 /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
751 pwtmpbuf
= (char *) __alloca (buflen
);
753 while (getpwnam_r (user_name
, &pwbuf
, pwtmpbuf
, buflen
, &p
) != 0)
761 pwtmpbuf
= __alloca (buflen
);
765 p
= getpwnam (user_name
);
768 home_dir
= p
->pw_dir
;
772 /* If we found a home directory use this. */
773 if (home_dir
!= NULL
)
776 size_t home_len
= strlen (home_dir
);
777 size_t rest_len
= end_name
== NULL
? 0 : strlen (end_name
);
778 newp
= (char *) __alloca (home_len
+ rest_len
+ 1);
780 *((char *) mempcpy (mempcpy (newp
, home_dir
, home_len
),
781 end_name
, rest_len
)) = '\0';
783 memcpy (newp
, home_dir
, home_len
);
784 memcpy (&newp
[home_len
], end_name
, rest_len
);
785 newp
[home_len
+ rest_len
] = '\0';
790 if (flags
& GLOB_TILDE_CHECK
)
791 /* We have to regard it as an error if we cannot find the
795 # endif /* Not Amiga && not WINDOWS32 && not VMS. */
797 #endif /* Not VMS. */
799 /* Now test whether we looked for "~" or "~NAME". In this case we
800 can give the answer now. */
801 if (filename
== NULL
)
805 /* Return the directory if we don't check for error or if it exists. */
806 if ((flags
& GLOB_NOCHECK
)
807 || (((flags
& GLOB_ALTDIRFUNC
)
808 ? (*pglob
->gl_stat
) (dirname
, &st
)
809 : __stat (dirname
, &st
)) == 0
810 && S_ISDIR (st
.st_mode
)))
813 = (char **) realloc (pglob
->gl_pathv
,
815 ((flags
& GLOB_DOOFFS
) ?
816 pglob
->gl_offs
: 0) +
819 if (pglob
->gl_pathv
== NULL
)
822 if (flags
& GLOB_DOOFFS
)
823 while (pglob
->gl_pathc
< pglob
->gl_offs
)
824 pglob
->gl_pathv
[pglob
->gl_pathc
++] = NULL
;
826 #if defined HAVE_STRDUP || defined _LIBC
827 pglob
->gl_pathv
[pglob
->gl_pathc
] = strdup (dirname
);
830 size_t len
= strlen (dirname
) + 1;
831 char *dircopy
= malloc (len
);
833 pglob
->gl_pathv
[pglob
->gl_pathc
] = memcpy (dircopy
, dirname
,
837 if (pglob
->gl_pathv
[pglob
->gl_pathc
] == NULL
)
839 free (pglob
->gl_pathv
);
842 pglob
->gl_pathv
[++pglob
->gl_pathc
] = NULL
;
843 pglob
->gl_flags
= flags
;
852 if (__glob_pattern_p (dirname
, !(flags
& GLOB_NOESCAPE
)))
854 /* The directory name contains metacharacters, so we
855 have to glob for the directory, and then glob for
856 the pattern in each directory found. */
860 status
= glob (dirname
,
861 ((flags
& (GLOB_ERR
| GLOB_NOCHECK
| GLOB_NOESCAPE
))
862 | GLOB_NOSORT
| GLOB_ONLYDIR
),
867 /* We have successfully globbed the preceding directory name.
868 For each name we found, call glob_in_dir on it and FILENAME,
869 appending the results to PGLOB. */
870 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
876 /* Make globbing interruptible in the bash shell. */
877 extern int interrupt_state
;
888 old_pathc
= pglob
->gl_pathc
;
889 status
= glob_in_dir (filename
, dirs
.gl_pathv
[i
],
890 ((flags
| GLOB_APPEND
)
891 & ~(GLOB_NOCHECK
| GLOB_ERR
)),
893 if (status
== GLOB_NOMATCH
)
894 /* No matches in this directory. Try the next. */
904 /* Stick the directory on the front of each name. */
905 if (prefix_array (dirs
.gl_pathv
[i
],
906 &pglob
->gl_pathv
[old_pathc
],
907 pglob
->gl_pathc
- old_pathc
))
915 flags
|= GLOB_MAGCHAR
;
917 /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
918 But if we have not found any matching entry and thie GLOB_NOCHECK
919 flag was set we must return the list consisting of the disrectory
920 names followed by the filename. */
921 if (pglob
->gl_pathc
== oldcount
)
924 if (flags
& GLOB_NOCHECK
)
926 size_t filename_len
= strlen (filename
) + 1;
930 /* This is an pessimistic guess about the size. */
932 = (char **) realloc (pglob
->gl_pathv
,
934 ((flags
& GLOB_DOOFFS
) ?
935 pglob
->gl_offs
: 0) +
938 if (pglob
->gl_pathv
== NULL
)
944 if (flags
& GLOB_DOOFFS
)
945 while (pglob
->gl_pathc
< pglob
->gl_offs
)
946 pglob
->gl_pathv
[pglob
->gl_pathc
++] = NULL
;
948 for (i
= 0; i
< dirs
.gl_pathc
; ++i
)
950 const char *dir
= dirs
.gl_pathv
[i
];
951 size_t dir_len
= strlen (dir
);
953 /* First check whether this really is a directory. */
954 if (((flags
& GLOB_ALTDIRFUNC
)
955 ? (*pglob
->gl_stat
) (dir
, &st
) : __stat (dir
, &st
)) != 0
956 || !S_ISDIR (st
.st_mode
))
957 /* No directory, ignore this entry. */
960 pglob
->gl_pathv
[pglob
->gl_pathc
] = malloc (dir_len
+ 1
962 if (pglob
->gl_pathv
[pglob
->gl_pathc
] == NULL
)
970 mempcpy (mempcpy (mempcpy (pglob
->gl_pathv
[pglob
->gl_pathc
],
973 filename
, filename_len
);
975 memcpy (pglob
->gl_pathv
[pglob
->gl_pathc
], dir
, dir_len
);
976 pglob
->gl_pathv
[pglob
->gl_pathc
][dir_len
] = '/';
977 memcpy (&pglob
->gl_pathv
[pglob
->gl_pathc
][dir_len
+ 1],
978 filename
, filename_len
);
983 pglob
->gl_pathv
[pglob
->gl_pathc
] = NULL
;
984 pglob
->gl_flags
= flags
;
986 /* Now we know how large the gl_pathv vector must be. */
987 new_pathv
= (char **) realloc (pglob
->gl_pathv
,
988 ((pglob
->gl_pathc
+ 1)
990 if (new_pathv
!= NULL
)
991 pglob
->gl_pathv
= new_pathv
;
1001 status
= glob_in_dir (filename
, dirname
, flags
, errfunc
, pglob
);
1007 /* Stick the directory on the front of each name. */
1008 int ignore
= oldcount
;
1010 if ((flags
& GLOB_DOOFFS
) && ignore
< pglob
->gl_offs
)
1011 ignore
= pglob
->gl_offs
;
1013 if (prefix_array (dirname
,
1014 &pglob
->gl_pathv
[ignore
],
1015 pglob
->gl_pathc
- ignore
))
1018 return GLOB_NOSPACE
;
1023 if (flags
& GLOB_MARK
)
1025 /* Append slashes to directory names. */
1028 for (i
= oldcount
; i
< pglob
->gl_pathc
; ++i
)
1029 if (((flags
& GLOB_ALTDIRFUNC
)
1030 ? (*pglob
->gl_stat
) (pglob
->gl_pathv
[i
], &st
)
1031 : __stat (pglob
->gl_pathv
[i
], &st
)) == 0
1032 && S_ISDIR (st
.st_mode
))
1034 size_t len
= strlen (pglob
->gl_pathv
[i
]) + 2;
1035 char *new = realloc (pglob
->gl_pathv
[i
], len
);
1039 return GLOB_NOSPACE
;
1041 strcpy (&new[len
- 2], "/");
1042 pglob
->gl_pathv
[i
] = new;
1046 if (!(flags
& GLOB_NOSORT
))
1048 /* Sort the vector. */
1049 int non_sort
= oldcount
;
1051 if ((flags
& GLOB_DOOFFS
) && pglob
->gl_offs
> oldcount
)
1052 non_sort
= pglob
->gl_offs
;
1054 qsort ((__ptr_t
) &pglob
->gl_pathv
[non_sort
],
1055 pglob
->gl_pathc
- non_sort
,
1056 sizeof (char *), collated_compare
);
1063 /* Free storage allocated in PGLOB by a previous `glob' call. */
1066 register glob_t
*pglob
;
1068 if (pglob
->gl_pathv
!= NULL
)
1071 for (i
= 0; i
< pglob
->gl_pathc
; ++i
)
1072 if (pglob
->gl_pathv
[i
] != NULL
)
1073 free ((__ptr_t
) pglob
->gl_pathv
[i
]);
1074 free ((__ptr_t
) pglob
->gl_pathv
);
1079 /* Do a collated comparison of A and B. */
1081 collated_compare (a
, b
)
1085 const char *const s1
= *(const char *const * const) a
;
1086 const char *const s2
= *(const char *const * const) b
;
1094 return strcoll (s1
, s2
);
1098 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1099 elements in place. Return nonzero if out of memory, zero if successful.
1100 A slash is inserted between DIRNAME and each elt of ARRAY,
1101 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1103 prefix_array (dirname
, array
, n
)
1104 const char *dirname
;
1109 size_t dirlen
= strlen (dirname
);
1110 #if defined __MSDOS__ || defined WINDOWS32
1112 # define DIRSEP_CHAR sep_char
1114 # define DIRSEP_CHAR '/'
1117 if (dirlen
== 1 && dirname
[0] == '/')
1118 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1119 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1121 #if defined __MSDOS__ || defined WINDOWS32
1122 else if (dirlen
> 1)
1124 if (dirname
[dirlen
- 1] == '/' && dirname
[dirlen
- 2] == ':')
1125 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1127 else if (dirname
[dirlen
- 1] == ':')
1129 /* DIRNAME is "d:". Use `:' instead of `/'. */
1136 for (i
= 0; i
< n
; ++i
)
1138 size_t eltlen
= strlen (array
[i
]) + 1;
1139 char *new = (char *) malloc (dirlen
+ 1 + eltlen
);
1143 free ((__ptr_t
) array
[--i
]);
1149 char *endp
= (char *) mempcpy (new, dirname
, dirlen
);
1150 *endp
++ = DIRSEP_CHAR
;
1151 mempcpy (endp
, array
[i
], eltlen
);
1154 memcpy (new, dirname
, dirlen
);
1155 new[dirlen
] = DIRSEP_CHAR
;
1156 memcpy (&new[dirlen
+ 1], array
[i
], eltlen
);
1158 free ((__ptr_t
) array
[i
]);
1166 /* We must not compile this function twice. */
1167 #if !defined _LIBC || !defined NO_GLOB_PATTERN_P
1168 /* Return nonzero if PATTERN contains any metacharacters.
1169 Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
1171 __glob_pattern_p (pattern
, quote
)
1172 const char *pattern
;
1175 register const char *p
;
1178 for (p
= pattern
; *p
!= '\0'; ++p
)
1186 if (quote
&& p
[1] != '\0')
1203 weak_alias (__glob_pattern_p
, glob_pattern_p
)
1208 /* Like `glob', but PATTERN is a final pathname component,
1209 and matches are searched for in DIRECTORY.
1210 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1211 The GLOB_APPEND flag is assumed to be set (always appends). */
1213 glob_in_dir (pattern
, directory
, flags
, errfunc
, pglob
)
1214 const char *pattern
;
1215 const char *directory
;
1217 int (*errfunc
) __P ((const char *, int));
1220 __ptr_t stream
= NULL
;
1224 struct globlink
*next
;
1227 struct globlink
*names
= NULL
;
1233 if (*directory
== 0)
1236 meta
= __glob_pattern_p (pattern
, !(flags
& GLOB_NOESCAPE
));
1239 if (flags
& (GLOB_NOCHECK
|GLOB_NOMAGIC
))
1240 /* We need not do any tests. The PATTERN contains no meta
1241 characters and we must not return an error therefore the
1242 result will always contain exactly one name. */
1243 flags
|= GLOB_NOCHECK
;
1246 /* Since we use the normal file functions we can also use stat()
1247 to verify the file is there. */
1249 size_t patlen
= strlen (pattern
);
1250 size_t dirlen
= strlen (directory
);
1251 char *fullname
= (char *) __alloca (dirlen
+ 1 + patlen
+ 1);
1253 # ifdef HAVE_MEMPCPY
1254 mempcpy (mempcpy (mempcpy (fullname
, directory
, dirlen
),
1256 pattern
, patlen
+ 1);
1258 memcpy (fullname
, directory
, dirlen
);
1259 fullname
[dirlen
] = '/';
1260 memcpy (&fullname
[dirlen
+ 1], pattern
, patlen
+ 1);
1262 if (((flags
& GLOB_ALTDIRFUNC
)
1263 ? (*pglob
->gl_stat
) (fullname
, &st
)
1264 : __stat (fullname
, &st
)) == 0)
1265 /* We found this file to be existing. Now tell the rest
1266 of the function to copy this name into the result. */
1267 flags
|= GLOB_NOCHECK
;
1274 if (pattern
[0] == '\0')
1276 /* This is a special case for matching directories like in
1278 names
= (struct globlink
*) __alloca (sizeof (struct globlink
));
1279 names
->name
= (char *) malloc (1);
1280 if (names
->name
== NULL
)
1282 names
->name
[0] = '\0';
1289 stream
= ((flags
& GLOB_ALTDIRFUNC
)
1290 ? (*pglob
->gl_opendir
) (directory
)
1291 : (__ptr_t
) opendir (directory
));
1294 if (errno
!= ENOTDIR
1295 && ((errfunc
!= NULL
&& (*errfunc
) (directory
, errno
))
1296 || (flags
& GLOB_ERR
)))
1297 return GLOB_ABORTED
;
1303 int fnm_flags
= ((!(flags
& GLOB_PERIOD
) ? FNM_PERIOD
: 0)
1304 | ((flags
& GLOB_NOESCAPE
) ? FNM_NOESCAPE
: 0)
1305 #if defined HAVE_CASE_INSENSITIVE_FS
1310 flags
|= GLOB_MAGCHAR
;
1316 struct dirent
*d
= ((flags
& GLOB_ALTDIRFUNC
)
1317 ? (*pglob
->gl_readdir
) (stream
)
1318 : readdir ((DIR *) stream
));
1321 if (! REAL_DIR_ENTRY (d
))
1325 /* If we shall match only directories use the information
1326 provided by the dirent call if possible. */
1327 if ((flags
& GLOB_ONLYDIR
)
1328 && d
->d_type
!= DT_UNKNOWN
&& d
->d_type
!= DT_DIR
)
1334 if (fnmatch (pattern
, name
, fnm_flags
) == 0)
1336 struct globlink
*new = (struct globlink
*)
1337 __alloca (sizeof (struct globlink
));
1339 new->name
= (char *) malloc (len
+ 1);
1340 if (new->name
== NULL
)
1343 *((char *) mempcpy ((__ptr_t
) new->name
, name
, len
))
1346 memcpy ((__ptr_t
) new->name
, name
, len
);
1347 new->name
[len
] = '\0';
1358 if (nfound
== 0 && (flags
& GLOB_NOCHECK
))
1360 size_t len
= strlen (pattern
);
1362 names
= (struct globlink
*) __alloca (sizeof (struct globlink
));
1364 names
->name
= (char *) malloc (len
+ 1);
1365 if (names
->name
== NULL
)
1368 *((char *) mempcpy (names
->name
, pattern
, len
)) = '\0';
1370 memcpy (names
->name
, pattern
, len
);
1371 names
->name
[len
] = '\0';
1378 = (char **) realloc (pglob
->gl_pathv
,
1380 ((flags
& GLOB_DOOFFS
) ? pglob
->gl_offs
: 0) +
1383 if (pglob
->gl_pathv
== NULL
)
1386 if (flags
& GLOB_DOOFFS
)
1387 while (pglob
->gl_pathc
< pglob
->gl_offs
)
1388 pglob
->gl_pathv
[pglob
->gl_pathc
++] = NULL
;
1390 for (; names
!= NULL
; names
= names
->next
)
1391 pglob
->gl_pathv
[pglob
->gl_pathc
++] = names
->name
;
1392 pglob
->gl_pathv
[pglob
->gl_pathc
] = NULL
;
1394 pglob
->gl_flags
= flags
;
1400 if (flags
& GLOB_ALTDIRFUNC
)
1401 (*pglob
->gl_closedir
) (stream
);
1403 closedir ((DIR *) stream
);
1407 return nfound
== 0 ? GLOB_NOMATCH
: 0;
1412 if (flags
& GLOB_ALTDIRFUNC
)
1413 (*pglob
->gl_closedir
) (stream
);
1415 closedir ((DIR *) stream
);
1418 while (names
!= NULL
)
1420 if (names
->name
!= NULL
)
1421 free ((__ptr_t
) names
->name
);
1422 names
= names
->next
;
1424 return GLOB_NOSPACE
;
1427 #endif /* Not ELIDE_CODE. */