diff options
Diffstat (limited to 'lib/glob')
-rw-r--r-- | lib/glob/Makefile.in | 34 | ||||
-rw-r--r-- | lib/glob/collsyms.h | 22 | ||||
-rw-r--r-- | lib/glob/glob.c | 289 | ||||
-rw-r--r-- | lib/glob/glob.h | 27 | ||||
-rw-r--r-- | lib/glob/glob_loop.c | 26 | ||||
-rw-r--r-- | lib/glob/sm_loop.c | 27 | ||||
-rw-r--r-- | lib/glob/smatch.c | 26 | ||||
-rw-r--r-- | lib/glob/strmatch.c | 28 | ||||
-rw-r--r-- | lib/glob/strmatch.h | 32 | ||||
-rw-r--r-- | lib/glob/xmbsrtowcs.c | 71 |
10 files changed, 409 insertions, 173 deletions
diff --git a/lib/glob/Makefile.in b/lib/glob/Makefile.in index a25b7bb..1ccae68 100644 --- a/lib/glob/Makefile.in +++ b/lib/glob/Makefile.in @@ -4,21 +4,20 @@ # # #################################################################### # -# Copyright (C) 1996-2005 Free Software Foundation, Inc. +# Copyright (C) 1996-2009 Free Software Foundation, Inc. -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. -# This program 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 General Public License for more details. +# This program 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 General Public License for more details. -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. srcdir = @srcdir@ VPATH = .:@srcdir@ @@ -74,6 +73,12 @@ HSOURCES = $(srcdir)/strmatch.h OBJECTS = glob.o strmatch.o smatch.o xmbsrtowcs.o +# The texinfo files which document this library. +DOCSOURCE = doc/glob.texi +DOCOBJECT = doc/glob.dvi +DOCSUPPORT = doc/Makefile +DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT) + SUPPORT = Makefile ChangeLog $(DOCSUPPORT) SOURCES = $(CSOURCES) $(HSOURCES) $(DOCSOURCE) @@ -95,7 +100,7 @@ what-tar: done documentation: force - + -(cd doc; $(MAKE) $(MFLAGS)) force: # The rule for 'includes' is written funny so that the if statement @@ -105,11 +110,14 @@ install: clean: rm -f $(OBJECTS) $(LIBRARY_NAME) + -(cd doc && $(MAKE) $(MFLAGS) $@ ) realclean distclean maintainer-clean: clean + -( cd doc && $(MAKE) $(MFLAGS) $@ ) $(RM) -f Makefile mostlyclean: clean + -( cd doc && $(MAKE) $(MFLAGS) $@ ) ###################################################################### # # diff --git a/lib/glob/collsyms.h b/lib/glob/collsyms.h index ccd9f43..d56df61 100644 --- a/lib/glob/collsyms.h +++ b/lib/glob/collsyms.h @@ -5,19 +5,19 @@ This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - Bash 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 General Public License - for more details. + Bash 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 General Public License for more details. - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ /* The upper-case letters, lower-case letters, and digits are omitted from this table. The digits are not included in the table in the POSIX.2 diff --git a/lib/glob/glob.c b/lib/glob/glob.c index 08a7da8..c77618f 100644 --- a/lib/glob/glob.c +++ b/lib/glob/glob.c @@ -1,20 +1,22 @@ /* glob.c -- file-name wildcard pattern matching for Bash. - Copyright (C) 1985-2005 Free Software Foundation, Inc. + Copyright (C) 1985-2009 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + This file is part of GNU Bash, the Bourne-Again SHell. + + Bash is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, + Bash 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 General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ /* To whomever it may concern: I have never seen the code which most Unix programs use to perform this function. I wrote this from scratch @@ -45,7 +47,8 @@ #include "stdc.h" #include "memalloc.h" -#include "quit.h" + +#include "shell.h" #include "glob.h" #include "strmatch.h" @@ -72,8 +75,15 @@ # define ALLOCA_MAX 100000 #endif +struct globval + { + struct globval *next; + char *name; + }; + extern void throw_to_top_level __P((void)); extern int sh_eaccess __P((char *, int)); +extern char *sh_makepath __P((const char *, const char *, int)); extern int extended_glob; @@ -88,10 +98,12 @@ int glob_ignore_case = 0; /* Global variable to return to signify an error in globbing. */ char *glob_error_return; +static struct globval finddirs_error_return; + /* Some forward declarations. */ -static int skipname __P((char *, char *)); +static int skipname __P((char *, char *, int)); #if HANDLE_MULTIBYTE -static int mbskipname __P((char *, char *)); +static int mbskipname __P((char *, char *, int)); #endif #if HANDLE_MULTIBYTE static void udequote_pathname __P((char *)); @@ -154,9 +166,10 @@ glob_pattern_p (pattern) with matching leading `.'. */ static int -skipname (pat, dname) +skipname (pat, dname, flags) char *pat; char *dname; + int flags; { /* If a leading dot need not be explicitly matched, and the pattern doesn't start with a `.', don't match `.' or `..' */ @@ -179,8 +192,9 @@ skipname (pat, dname) characters in PAT and DNAME. Mostly concerned with matching leading `.'. */ static int -mbskipname (pat, dname) +mbskipname (pat, dname, flags) char *pat, *dname; + int flags; { int ret; wchar_t *pat_wc, *dn_wc; @@ -232,7 +246,8 @@ udequote_pathname (pathname) if (pathname[i - 1] == 0) break; } - pathname[j] = '\0'; + if (pathname) + pathname[j] = '\0'; } #if HANDLE_MULTIBYTE @@ -265,7 +280,8 @@ wdequote_pathname (pathname) if (wpathname[i - 1] == L'\0') break; } - wpathname[j] = L'\0'; + if (wpathname) + wpathname[j] = L'\0'; /* Convert the wide character string into unibyte character set. */ memset (&ps, '\0', sizeof(mbstate_t)); @@ -293,9 +309,9 @@ dequote_pathname (pathname) # define GLOB_TESTNAME(name) (lstat (name, &finfo)) #else /* !HAVE_LSTAT */ # if !defined (AFS) -# define GLOB_TESTNAME(name) (sh_eaccess (nextname, F_OK)) +# define GLOB_TESTNAME(name) (sh_eaccess (name, F_OK)) # else /* AFS */ -# define GLOB_TESTNAME(name) (access (nextname, F_OK)) +# define GLOB_TESTNAME(name) (access (name, F_OK)) # endif /* AFS */ #endif /* !HAVE_LSTAT */ @@ -306,6 +322,7 @@ glob_testdir (dir) { struct stat finfo; +/*itrace("glob_testdir: testing %s", dir);*/ if (stat (dir, &finfo) < 0) return (-1); @@ -315,6 +332,75 @@ glob_testdir (dir) return (0); } +/* Recursively scan SDIR for directories matching PAT (PAT is always `**'). + FLAGS is simply passed down to the recursive call to glob_vector. Returns + a list of matching directory names. EP, if non-null, is set to the last + element of the returned list. NP, if non-null, is set to the number of + directories in the returned list. These two variables exist for the + convenience of the caller (always glob_vector). */ +static struct globval * +finddirs (pat, sdir, flags, ep, np) + char *pat; + char *sdir; + int flags; + struct globval **ep; + int *np; +{ + char **r, *n; + int ndirs; + struct globval *ret, *e, *g; + +/*itrace("finddirs: pat = `%s' sdir = `%s' flags = 0x%x", pat, sdir, flags);*/ + e = ret = 0; + r = glob_vector (pat, sdir, flags); + if (r == 0 || r[0] == 0) + { + if (np) + *np = 0; + if (ep) + *ep = 0; + if (r && r != &glob_error_return) + free (r); + return (struct globval *)0; + } + for (ndirs = 0; r[ndirs] != 0; ndirs++) + { + g = (struct globval *) malloc (sizeof (struct globval)); + if (g == 0) + { + while (ret) /* free list built so far */ + { + g = ret->next; + free (ret); + ret = g; + } + + free (r); + if (np) + *np = 0; + if (ep) + *ep = 0; + return (&finddirs_error_return); + } + if (e == 0) + e = g; + + g->next = ret; + ret = g; + + g->name = r[ndirs]; + } + + free (r); + if (ep) + *ep = e; + if (np) + *np = ndirs; + + return ret; +} + + /* Return a vector of names of files in directory DIR whose names match glob pattern PAT. The names are not in any particular order. @@ -337,31 +423,28 @@ glob_vector (pat, dir, flags) char *dir; int flags; { - struct globval - { - struct globval *next; - char *name; - }; - DIR *d; register struct dirent *dp; - struct globval *lastlink; + struct globval *lastlink, *e, *dirlist; register struct globval *nextlink; - register char *nextname, *npat; + register char *nextname, *npat, *subdir; unsigned int count; - int lose, skip; + int lose, skip, ndirs, isdir, sdlen, add_current, patlen; register char **name_vector; register unsigned int i; int mflags; /* Flags passed to strmatch (). */ + int pflags; /* flags passed to sh_makepath () */ int nalloca; struct globval *firstmalloc, *tmplink; + char *convfn; lastlink = 0; - count = lose = skip = 0; + count = lose = skip = add_current = 0; firstmalloc = 0; nalloca = 0; +/*itrace("glob_vector: pat = `%s' dir = `%s' flags = 0x%x", pat, dir, flags);*/ /* If PAT is empty, skip the loop, but return one (empty) filename. */ if (pat == 0 || *pat == '\0') { @@ -387,6 +470,8 @@ glob_vector (pat, dir, flags) skip = 1; } + patlen = strlen (pat); + /* If the filename pattern (PAT) does not contain any globbing characters, we can dispense with reading the directory, and just see if there is a filename `DIR/PAT'. If there is, and we can access it, just make the @@ -400,8 +485,8 @@ glob_vector (pat, dir, flags) return ((char **) &glob_error_return); dirlen = strlen (dir); - nextname = (char *)malloc (dirlen + strlen (pat) + 2); - npat = (char *)malloc (strlen (pat) + 1); + nextname = (char *)malloc (dirlen + patlen + 2); + npat = (char *)malloc (patlen + 1); if (nextname == 0 || npat == 0) lose = 1; else @@ -463,6 +548,8 @@ glob_vector (pat, dir, flags) if (extended_glob) mflags |= FNM_EXTMATCH; + add_current = ((flags & (GX_ALLDIRS|GX_ADDCURDIR)) == (GX_ALLDIRS|GX_ADDCURDIR)); + /* Scan the directory, finding all names that match. For each name that matches, allocate a struct globval on the stack and store the name in it. @@ -490,14 +577,71 @@ glob_vector (pat, dir, flags) #endif #if HANDLE_MULTIBYTE - if (MB_CUR_MAX > 1 && mbskipname (pat, dp->d_name)) + if (MB_CUR_MAX > 1 && mbskipname (pat, dp->d_name, flags)) continue; else #endif - if (skipname (pat, dp->d_name)) + if (skipname (pat, dp->d_name, flags)) continue; - if (strmatch (pat, dp->d_name, mflags) != FNM_NOMATCH) + /* If we're only interested in directories, don't bother with files */ + if (flags & (GX_MATCHDIRS|GX_ALLDIRS)) + { + pflags = (flags & GX_ALLDIRS) ? MP_RMDOT : 0; + if (flags & GX_NULLDIR) + pflags |= MP_IGNDOT; + subdir = sh_makepath (dir, dp->d_name, pflags); + isdir = glob_testdir (subdir); + if (isdir < 0 && (flags & GX_MATCHDIRS)) + { + free (subdir); + continue; + } + } + + if (flags & GX_ALLDIRS) + { + if (isdir == 0) + { + dirlist = finddirs (pat, subdir, (flags & ~GX_ADDCURDIR), &e, &ndirs); + if (dirlist == &finddirs_error_return) + { + free (subdir); + lose = 1; + break; + } + if (ndirs) /* add recursive directories to list */ + { + if (firstmalloc == 0) + firstmalloc = e; + e->next = lastlink; + lastlink = dirlist; + count += ndirs; + } + } + + nextlink = (struct globval *) malloc (sizeof (struct globval)); + if (firstmalloc == 0) + firstmalloc = nextlink; + sdlen = strlen (subdir); + nextname = (char *) malloc (sdlen + 1); + if (nextlink == 0 || nextname == 0) + { + free (subdir); + lose = 1; + break; + } + nextlink->next = lastlink; + lastlink = nextlink; + nextlink->name = nextname; + bcopy (subdir, nextname, sdlen + 1); + free (subdir); + ++count; + continue; + } + + convfn = fnx_fromfs (dp->d_name, D_NAMLEN (dp)); + if (strmatch (pat, convfn, mflags) != FNM_NOMATCH) { if (nalloca < ALLOCA_MAX) { @@ -510,6 +654,7 @@ glob_vector (pat, dir, flags) if (firstmalloc == 0) firstmalloc = nextlink; } + nextname = (char *) malloc (D_NAMLEN (dp) + 1); if (nextlink == 0 || nextname == 0) { @@ -527,6 +672,29 @@ glob_vector (pat, dir, flags) (void) closedir (d); } + /* compat: if GX_ADDCURDIR, add the passed directory also. Add an empty + directory name as a placeholder if GX_NULLDIR (in which case the passed + directory name is "."). */ + if (add_current) + { + sdlen = strlen (dir); + nextname = (char *)malloc (sdlen + 1); + nextlink = (struct globval *) malloc (sizeof (struct globval)); + if (nextlink == 0 || nextname == 0) + lose = 1; + else + { + nextlink->name = nextname; + nextlink->next = lastlink; + lastlink = nextlink; + if (flags & GX_NULLDIR) + nextname[0] = '\0'; + else + bcopy (dir, nextname, sdlen + 1); + ++count; + } + } + if (lose == 0) { name_vector = (char **) malloc ((count + 1) * sizeof (char *)); @@ -585,7 +753,7 @@ glob_vector (pat, dir, flags) free (tmplink); } } - + return (name_vector); } @@ -678,9 +846,10 @@ glob_filename (pathname, flags) { char **result; unsigned int result_size; - char *directory_name, *filename; + char *directory_name, *filename, *dname; unsigned int directory_len; int free_dirname; /* flag */ + int dflags; result = (char **) malloc (sizeof (char *)); result_size = 1; @@ -721,10 +890,14 @@ glob_filename (pathname, flags) char **directories; register unsigned int i; + dflags = flags & ~GX_MARKDIRS; + if ((flags & GX_GLOBSTAR) && directory_name[0] == '*' && directory_name[1] == '*' && (directory_name[2] == '/' || directory_name[2] == '\0')) + dflags |= GX_ALLDIRS|GX_ADDCURDIR; + if (directory_name[directory_len - 1] == '/') directory_name[directory_len - 1] = '\0'; - directories = glob_filename (directory_name, flags & ~GX_MARKDIRS); + directories = glob_filename (directory_name, dflags); if (free_dirname) { @@ -753,10 +926,22 @@ glob_filename (pathname, flags) { char **temp_results; - /* Scan directory even on a NULL pathname. That way, `*h/' + /* XXX -- we've recursively scanned any directories resulting from + a `**', so turn off the flag. We turn it on again below if + filename is `**' */ + /* Scan directory even on a NULL filename. That way, `*h/' returns only directories ending in `h', instead of all files ending in `h' with a `/' appended. */ - temp_results = glob_vector (filename, directories[i], flags & ~GX_MARKDIRS); + dname = directories[i]; + dflags = flags & ~(GX_MARKDIRS|GX_ALLDIRS|GX_ADDCURDIR); + if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0') + dflags |= GX_ALLDIRS|GX_ADDCURDIR; + if (dname[0] == '\0' && filename[0]) + { + dflags |= GX_NULLDIR; + dname = "."; /* treat null directory name and non-null filename as current directory */ + } + temp_results = glob_vector (filename, dname, dflags); /* Handle error cases. */ if (temp_results == NULL) @@ -769,7 +954,12 @@ glob_filename (pathname, flags) char **array; register unsigned int l; - array = glob_dir_to_array (directories[i], temp_results, flags); + /* If we're expanding **, we don't need to glue the directory + name to the results; we've already done it in glob_vector */ + if ((dflags & GX_ALLDIRS) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0') + array = temp_results; + else + array = glob_dir_to_array (directories[i], temp_results, flags); l = 0; while (array[l] != NULL) ++l; @@ -786,7 +976,8 @@ glob_filename (pathname, flags) result[result_size - 1] = NULL; /* Note that the elements of ARRAY are not freed. */ - free ((char *) array); + if (array != temp_results) + free ((char *) array); } } /* Free the directories. */ @@ -830,9 +1021,27 @@ glob_filename (pathname, flags) /* Just return what glob_vector () returns appended to the directory name. */ + /* If flags & GX_ALLDIRS, we're called recursively */ + dflags = flags & ~GX_MARKDIRS; + if (directory_len == 0) + dflags |= GX_NULLDIR; + if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0') + { + dflags |= GX_ALLDIRS|GX_ADDCURDIR; +#if 0 + /* If we want all directories (dflags & GX_ALLDIRS) and we're not + being called recursively as something like `echo [star][star]/[star].o' + ((flags & GX_ALLDIRS) == 0), we want to prevent glob_vector from + adding a null directory name to the front of the temp_results + array. We turn off ADDCURDIR if not called recursively and + dlen == 0 */ +#endif + if (directory_len == 0 && (flags & GX_ALLDIRS) == 0) + dflags &= ~GX_ADDCURDIR; + } temp_results = glob_vector (filename, (directory_len == 0 ? "." : directory_name), - flags & ~GX_MARKDIRS); + dflags); if (temp_results == NULL || temp_results == (char **)&glob_error_return) { @@ -841,7 +1050,7 @@ glob_filename (pathname, flags) return (temp_results); } - result = glob_dir_to_array (directory_name, temp_results, flags); + result = glob_dir_to_array ((dflags & GX_ALLDIRS) ? "" : directory_name, temp_results, flags); if (free_dirname) free (directory_name); return (result); diff --git a/lib/glob/glob.h b/lib/glob/glob.h index 95108a4..993ed70 100644 --- a/lib/glob/glob.h +++ b/lib/glob/glob.h @@ -1,28 +1,35 @@ /* File-name wildcard pattern matching for GNU. - Copyright (C) 1985, 1988, 1989 Free Software Foundation, Inc. + Copyright (C) 1985, 1988, 1989, 2008,2009 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + This file is part of GNU Bash, the Bourne-Again SHell. + + Bash is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, + Bash 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 General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ #ifndef _GLOB_H_ #define _GLOB_H_ #include "stdc.h" -#define GX_MARKDIRS 0x01 /* mark directory names with trailing `/' */ -#define GX_NOCASE 0x02 /* ignore case */ -#define GX_MATCHDOT 0x04 /* match `.' literally */ +#define GX_MARKDIRS 0x001 /* mark directory names with trailing `/' */ +#define GX_NOCASE 0x002 /* ignore case */ +#define GX_MATCHDOT 0x004 /* match `.' literally */ +#define GX_MATCHDIRS 0x008 /* match only directory names */ +#define GX_ALLDIRS 0x010 /* match all directory names, no others */ +#define GX_NULLDIR 0x100 /* internal -- no directory preceding pattern */ +#define GX_ADDCURDIR 0x200 /* internal -- add passed directory name */ +#define GX_GLOBSTAR 0x400 /* turn on special handling of ** */ extern int glob_pattern_p __P((const char *)); extern char **glob_vector __P((char *, char *, int)); diff --git a/lib/glob/glob_loop.c b/lib/glob/glob_loop.c index 253cac9..89e86af 100644 --- a/lib/glob/glob_loop.c +++ b/lib/glob/glob_loop.c @@ -2,19 +2,19 @@ This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. - - Bash 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 General Public License - for more details. - - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ static int INTERNAL_GLOB_PATTERN_P __P((const CHAR *)); diff --git a/lib/glob/sm_loop.c b/lib/glob/sm_loop.c index 41b0759..dfff06c 100644 --- a/lib/glob/sm_loop.c +++ b/lib/glob/sm_loop.c @@ -2,19 +2,20 @@ This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. - - Bash 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 General Public License - for more details. - - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ + int FCT __P((CHAR *, CHAR *, int)); static int GMATCH __P((CHAR *, CHAR *, CHAR *, CHAR *, int)); diff --git a/lib/glob/smatch.c b/lib/glob/smatch.c index be4f927..11d86b0 100644 --- a/lib/glob/smatch.c +++ b/lib/glob/smatch.c @@ -5,19 +5,19 @@ This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. - - Bash 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 General Public License - for more details. - - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ #include <config.h> diff --git a/lib/glob/strmatch.c b/lib/glob/strmatch.c index 4d9c68d..cea9bd8 100644 --- a/lib/glob/strmatch.c +++ b/lib/glob/strmatch.c @@ -5,19 +5,19 @@ This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. - - Bash 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 General Public License - for more details. - - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ #include <config.h> @@ -25,7 +25,7 @@ #include "strmatch.h" extern int xstrmatch __P((char *, char *, int)); -#if defined (HAVE_MULTIBYTE) +#if defined (HANDLE_MULTIBYTE) extern int internal_wstrmatch __P((wchar_t *, wchar_t *, int)); #endif diff --git a/lib/glob/strmatch.h b/lib/glob/strmatch.h index 7471444..5c99e0c 100644 --- a/lib/glob/strmatch.h +++ b/lib/glob/strmatch.h @@ -1,20 +1,20 @@ /* Copyright (C) 1991-2004 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C 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 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. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + + This file is part of GNU Bash, the Bourne-Again SHell. + + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ #ifndef _STRMATCH_H #define _STRMATCH_H 1 diff --git a/lib/glob/xmbsrtowcs.c b/lib/glob/xmbsrtowcs.c index 83b67b4..23fcd8e 100644 --- a/lib/glob/xmbsrtowcs.c +++ b/lib/glob/xmbsrtowcs.c @@ -4,19 +4,20 @@ This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. - - Bash 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 General Public License - for more details. - - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bash 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ + #include <config.h> #include <bashansi.h> @@ -27,6 +28,10 @@ #include <shmbutil.h> #if HANDLE_MULTIBYTE + +#ifndef FREE +# define FREE(x) do { if (x) free (x); } while (0) +#endif /* On some locales (ex. ja_JP.sjis), mbsrtowc doesn't convert 0x5c to U<0x5c>. So, this function is made for converting 0x5c to U<0x5c>. */ @@ -160,12 +165,16 @@ xdupmbstowcs (destp, indicesp, src) return (size_t)-1; } - indices = (char **) malloc (wsbuf_size * sizeof(char *)); - if (indices == NULL) + indices = NULL; + if (indicesp) { - free (wsbuf); - *destp = NULL; - return (size_t)-1; + indices = (char **) malloc (wsbuf_size * sizeof(char *)); + if (indices == NULL) + { + free (wsbuf); + *destp = NULL; + return (size_t)-1; + } } p = src; @@ -196,7 +205,7 @@ xdupmbstowcs (destp, indicesp, src) if (MB_INVALIDCH (mblength)) { free (wsbuf); - free (indices); + FREE (indices); *destp = NULL; return (size_t)-1; } @@ -215,25 +224,29 @@ xdupmbstowcs (destp, indicesp, src) if (wstmp == NULL) { free (wsbuf); - free (indices); + FREE (indices); *destp = NULL; return (size_t)-1; } wsbuf = wstmp; - idxtmp = (char **) realloc (indices, wsbuf_size * sizeof (char **)); - if (idxtmp == NULL) + if (indicesp) { - free (wsbuf); - free (indices); - *destp = NULL; - return (size_t)-1; + idxtmp = (char **) realloc (indices, wsbuf_size * sizeof (char **)); + if (idxtmp == NULL) + { + free (wsbuf); + free (indices); + *destp = NULL; + return (size_t)-1; + } + indices = idxtmp; } - indices = idxtmp; } wsbuf[wcnum - 1] = wc; - indices[wcnum - 1] = (char *)p; + if (indices) + indices[wcnum - 1] = (char *)p; p += mblength; } while (MB_NULLWCH (wc) == 0); @@ -242,8 +255,6 @@ xdupmbstowcs (destp, indicesp, src) *destp = wsbuf; if (indicesp != NULL) *indicesp = indices; - else - free (indices); return (wcnum - 1); } |