diff options
author | Eric Andersen <andersen@codepoet.org> | 2006-07-05 18:31:40 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2006-07-05 18:31:40 +0000 |
commit | f0b65da69adce2fe14d03e29782fae1a41537902 (patch) | |
tree | 55fa27953240496ba5f386d8a7e23707c4e1710e /libc/misc/glob/glob.c | |
parent | 7cfcff9c58239ad012d56c1a25aac0477963de25 (diff) |
minor updates
Diffstat (limited to 'libc/misc/glob/glob.c')
-rw-r--r-- | libc/misc/glob/glob.c | 101 |
1 files changed, 55 insertions, 46 deletions
diff --git a/libc/misc/glob/glob.c b/libc/misc/glob/glob.c index d36d048bf..f8200757f 100644 --- a/libc/misc/glob/glob.c +++ b/libc/misc/glob/glob.c @@ -1,19 +1,23 @@ -/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1991-2002,2003,2004,2005,2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#undef ENABLE_GLOB_BRACE_EXPANSION +#undef ENABLE_GLOB_TILDE_EXPANSION #include <features.h> #include <stdlib.h> @@ -26,7 +30,6 @@ Cambridge, MA 02139, USA. */ #include <malloc.h> #include <fnmatch.h> #include <glob.h> -#include <pwd.h> libc_hidden_proto(memcpy) libc_hidden_proto(strcat) @@ -38,8 +41,11 @@ libc_hidden_proto(opendir) libc_hidden_proto(closedir) libc_hidden_proto(fnmatch) libc_hidden_proto(qsort) -libc_hidden_proto(lstat) + +#ifdef ENABLE_GLOB_TILDE_EXPANSION +#include <pwd.h> libc_hidden_proto(getpwnam_r) +#endif /* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available if the `d_type' member for `struct dirent' is available. @@ -89,40 +95,33 @@ libc_hidden_proto(getpwnam_r) CONVERT_D_INO (d64, d32) \ CONVERT_D_TYPE (d64, d32) - extern __ptr_t (*__glob_opendir_hook) (const char *directory) attribute_hidden; extern void (*__glob_closedir_hook) (__ptr_t stream) attribute_hidden; extern const char *(*__glob_readdir_hook) (__ptr_t stream) attribute_hidden; -extern int collated_compare (const __ptr_t a, const __ptr_t b); -extern int prefix_array (const char *dirname, char **array, size_t n); -extern const char * next_brace_sub (const char *cp, int flags); - -static int link_exists_p (const char *dir, size_t dirlen, const char *fname, - glob_t *pglob, int flags); -static int glob_in_dir (const char *pattern, const char *directory, int flags, - int (*errfunc) (const char *, int), - glob_t *pglob); +extern int __collated_compare (const void *a, const void *b) attribute_hidden; +extern int __prefix_array (const char *dirname, char **array, size_t n) attribute_hidden; +#if defined ENABLE_GLOB_BRACE_EXPANSION +extern const char *__next_brace_sub (const char *cp, int flags) attribute_hidden; +#endif libc_hidden_proto(glob_pattern_p) -libc_hidden_proto(collated_compare) -libc_hidden_proto(prefix_array) -libc_hidden_proto(next_brace_sub) #ifdef COMPILE_GLOB64 libc_hidden_proto(glob64) libc_hidden_proto(globfree64) libc_hidden_proto(readdir64) -# define struct_stat64 struct stat64 -# define __stat64(fname, buf) stat64 (fname, buf) +#define __readdir readdir64 +#define __readdir64 readdir64 +#define struct_stat64 struct stat64 +#define __stat64(fname, buf) stat64 (fname, buf) #else libc_hidden_proto(glob) libc_hidden_proto(globfree) #define __readdir readdir #define __readdir64 readdir64 -//#define __stat64(fname, buf) stat64 (fname, buf) +#define struct_stat64 struct stat +#define __stat64(fname, buf) stat (fname, buf) libc_hidden_proto(readdir) -# define struct_stat64 struct stat -# define __stat64(fname, buf) stat (fname, buf) /* Return nonzero if PATTERN contains any metacharacters. Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ int glob_pattern_p(const char *pattern, int quote) @@ -158,7 +157,7 @@ libc_hidden_def(glob_pattern_p) /* Do a collated comparison of A and B. */ -int collated_compare (const void *a, const void *b) +int __collated_compare (const void *a, const void *b) { const char *const s1 = *(const char *const * const) a; const char *const s2 = *(const char *const * const) b; @@ -172,11 +171,14 @@ int collated_compare (const void *a, const void *b) return strcoll (s1, s2); } + /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's elements in place. Return nonzero if out of memory, zero if successful. A slash is inserted between DIRNAME and each elt of ARRAY, - unless DIRNAME is just "/". Each old element of ARRAY is freed. */ -int prefix_array (const char *dirname, char **array, size_t n) + unless DIRNAME is just "/". Each old element of ARRAY is freed. + If ADD_SLASH is non-zero, allocate one character more than + necessary, so that a slash can be appended later. */ +int __prefix_array (const char *dirname, char **array, size_t n) { register size_t i; size_t dirlen = strlen (dirname); @@ -210,9 +212,10 @@ int prefix_array (const char *dirname, char **array, size_t n) return 0; } +#if defined ENABLE_GLOB_BRACE_EXPANSION /* Find the end of the sub-pattern in a brace expression. */ const char * -next_brace_sub (const char *cp, int flags) +__next_brace_sub (const char *cp, int flags) { unsigned int depth = 0; while (*cp != '\0') @@ -234,6 +237,8 @@ next_brace_sub (const char *cp, int flags) return *cp != '\0' ? cp : NULL; } #endif +#endif + static int link_exists_p (const char *dir, size_t dirlen, const char *fname, @@ -472,7 +477,6 @@ static int glob_in_dir (const char *pattern, const char *directory, int flags, return GLOB_NOSPACE; } - /* Do glob searching for PATTERN, placing results in PGLOB. The bits defined above may be set in FLAGS. If a directory cannot be opened or read and ERRFUNC is not nil, @@ -500,11 +504,13 @@ glob (pattern, flags, errfunc, pglob) return -1; } + if (!(flags & GLOB_DOOFFS)) /* Have to do this so `globfree' knows where to start freeing. It also makes all the code that uses gl_offs simpler. */ pglob->gl_offs = 0; +#if defined ENABLE_GLOB_BRACE_EXPANSION if (flags & GLOB_BRACE) { const char *begin; @@ -548,7 +554,7 @@ glob (pattern, flags, errfunc, pglob) /* Find the first sub-pattern and at the same time find the rest after the closing brace. */ - next = next_brace_sub (begin + 1, flags); + next = __next_brace_sub (begin + 1, flags); if (next == NULL) { /* It is an illegal expression. */ @@ -559,7 +565,7 @@ glob (pattern, flags, errfunc, pglob) rest = next; while (*rest != '}') { - rest = next_brace_sub (rest + 1, flags); + rest = __next_brace_sub (rest + 1, flags); if (rest == NULL) { /* It is an illegal expression. */ @@ -613,7 +619,7 @@ glob (pattern, flags, errfunc, pglob) break; p = next + 1; - next = next_brace_sub (p, flags); + next = __next_brace_sub (p, flags); /* assert (next != NULL); */ } @@ -625,6 +631,7 @@ glob (pattern, flags, errfunc, pglob) return GLOB_NOMATCH; } } +#endif /* Find the filename. */ filename = strrchr (pattern, '/'); @@ -697,6 +704,7 @@ glob (pattern, flags, errfunc, pglob) oldcount = pglob->gl_pathc + pglob->gl_offs; +#if defined ENABLE_GLOB_TILDE_EXPANSION if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~') { if (dirname[1] == '\0' || dirname[1] == '/') @@ -868,6 +876,7 @@ glob (pattern, flags, errfunc, pglob) /* Not found. */ return GLOB_NOMATCH; } +#endif if (glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE))) { @@ -921,7 +930,7 @@ glob (pattern, flags, errfunc, pglob) } /* Stick the directory on the front of each name. */ - if (prefix_array (dirs.gl_pathv[i], + if (__prefix_array (dirs.gl_pathv[i], &pglob->gl_pathv[old_pathc + pglob->gl_offs], pglob->gl_pathc - old_pathc)) { @@ -990,7 +999,7 @@ glob (pattern, flags, errfunc, pglob) if (dirlen > 0) { /* Stick the directory on the front of each name. */ - if (prefix_array (dirname, + if (__prefix_array (dirname, &pglob->gl_pathv[old_pathc + pglob->gl_offs], pglob->gl_pathc - old_pathc)) { @@ -1015,9 +1024,9 @@ glob (pattern, flags, errfunc, pglob) : (__stat64 (pglob->gl_pathv[i], &st64) == 0 && S_ISDIR (st64.st_mode)))) { - size_t len = strlen (pglob->gl_pathv[i]) + 2; + size_t len = strlen (pglob->gl_pathv[i]) + 2; char *new = realloc (pglob->gl_pathv[i], len); - if (new == NULL) + if (new == NULL) { globfree (pglob); pglob->gl_pathc = 0; @@ -1033,7 +1042,7 @@ glob (pattern, flags, errfunc, pglob) /* Sort the vector. */ qsort (&pglob->gl_pathv[oldcount], pglob->gl_pathc + pglob->gl_offs - oldcount, - sizeof (char *), collated_compare); + sizeof (char *), __collated_compare); } return 0; |