diff options
author | Chet Ramey <chet.ramey@case.edu> | 2011-12-12 22:03:58 -0500 |
---|---|---|
committer | Chet Ramey <chet.ramey@case.edu> | 2011-12-12 22:03:58 -0500 |
commit | 5f8cde236aa72470a886bf8e7d8aaca32506d8dd (patch) | |
tree | 6472b60e768f40b20cac3c3da60ffea9d3cb26cb /lib/glob | |
parent | 9ec5ed66405529e0d4d7edc5636c692e75edfccd (diff) | |
download | bash-5f8cde236aa72470a886bf8e7d8aaca32506d8dd.tar.gz |
commit bash-20100728 snapshot
Diffstat (limited to 'lib/glob')
-rw-r--r-- | lib/glob/Makefile.in | 7 | ||||
-rw-r--r-- | lib/glob/Makefile.in~ | 162 | ||||
-rw-r--r-- | lib/glob/gmisc.c | 311 | ||||
-rw-r--r-- | lib/glob/gmisc.c~ | 311 |
4 files changed, 790 insertions, 1 deletions
diff --git a/lib/glob/Makefile.in b/lib/glob/Makefile.in index 000c231a..12cbb61c 100644 --- a/lib/glob/Makefile.in +++ b/lib/glob/Makefile.in @@ -71,7 +71,7 @@ CSOURCES = $(srcdir)/glob.c $(srcdir)/strmatch.c $(srcdir)/smatch.c \ # The header files for this library. HSOURCES = $(srcdir)/strmatch.h -OBJECTS = glob.o strmatch.o smatch.o xmbsrtowcs.o +OBJECTS = glob.o strmatch.o smatch.o xmbsrtowcs.o gmisc.o # The texinfo files which document this library. DOCSOURCE = doc/glob.texi @@ -147,12 +147,17 @@ glob.o: strmatch.h glob.h glob.o: $(BASHINCDIR)/shmbutil.h glob.o: $(topdir)/xmalloc.h +gmisc.o: $(BUILD_DIR)/config.h +gmisc.o: $(topdir)/bashtypes.h $(BASHINCDIR)/ansi_stdlib.h $(topdir)/bashansi.h +gmisc.o: $(BASHINCDIR)/shmbutil.h + xmbsrtowcs.o: ${BUILD_DIR}/config.h xmbsrtowcs.o: ${topdir}/bashansi.h ${BASHINCDIR}/ansi_stdlib.h xmbsrtowcs.o: ${BASHINCDIR}/shmbutil.h # Rules for deficient makes, like SunOS and Solaris glob.o: glob.c +gmisc.o: gmisc.c strmatch.o: strmatch.c smatch.o: smatch.c xmbsrtowcs.o: xmbsrtowcs.c diff --git a/lib/glob/Makefile.in~ b/lib/glob/Makefile.in~ new file mode 100644 index 00000000..000c231a --- /dev/null +++ b/lib/glob/Makefile.in~ @@ -0,0 +1,162 @@ +## -*- text -*- #################################################### +# # +# Makefile for the GNU Glob Library. # +# # +#################################################################### +# +# 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 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. + +# 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@ +topdir = @top_srcdir@ +BUILD_DIR = @BUILD_DIR@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +CC = @CC@ +RANLIB = @RANLIB@ +AR = @AR@ +ARFLAGS = @ARFLAGS@ +RM = rm -f +CP = cp +MV = mv + +SHELL = @MAKE_SHELL@ + +PROFILE_FLAGS = @PROFILE_FLAGS@ + +CFLAGS = @CFLAGS@ +LOCAL_CFLAGS = @LOCAL_CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ + +DEFS = @DEFS@ +LOCAL_DEFS = @LOCAL_DEFS@ + +BASHINCDIR = ${topdir}/include + +INCLUDES = -I. -I../.. -I$(topdir) -I$(BASHINCDIR) -I$(topdir)/lib + +CCFLAGS = $(PROFILE_FLAGS) $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) ${INCLUDES} \ + $(LOCAL_CFLAGS) $(CFLAGS) + +# Here is a rule for making .o files from .c files that doesn't force +# the type of the machine (like -sun3) into the flags. +.c.o: + $(RM) $@ + $(CC) -c $(CCFLAGS) $< + +# The name of the library target. +LIBRARY_NAME = libglob.a + +# The C code source files for this library. +CSOURCES = $(srcdir)/glob.c $(srcdir)/strmatch.c $(srcdir)/smatch.c \ + $(srcdir)/xmbsrtowcs.c + +# The header files for this library. +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) + +THINGS_TO_TAR = $(SOURCES) $(SUPPORT) + +###################################################################### + +all: $(LIBRARY_NAME) + +$(LIBRARY_NAME): $(OBJECTS) + $(RM) -f $@ + $(AR) $(ARFLAGS) $@ $(OBJECTS) + -test -n "$(RANLIB)" && $(RANLIB) $@ + +what-tar: + @for file in $(THINGS_TO_TAR); do \ + echo $(selfdir)$$file; \ + done + +documentation: force + -(cd doc; $(MAKE) $(MFLAGS)) +force: + +# The rule for 'includes' is written funny so that the if statement +# always returns TRUE unless there really was an error installing the +# include files. +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) $@ ) + +${BUILD_DIR}/pathnames.h: ${BUILD_DIR}/config.h ${BUILD_DIR}/Makefile Makefile + -( cd ${BUILD_DIR} && ${MAKE} ${MFLAGS} pathnames.h ) + +###################################################################### +# # +# Dependencies for the object files which make up this library. # +# # +###################################################################### + +smatch.o: strmatch.h +smatch.o: $(BUILD_DIR)/config.h +smatch.o: $(BASHINCDIR)/chartypes.h +smatch.o: $(BASHINCDIR)/ansi_stdlib.h $(topdir)/bashansi.h +smatch.o: $(BASHINCDIR)/shmbutil.h +smatch.o: $(topdir)/xmalloc.h + +strmatch.o: strmatch.h +strmatch.o: $(BUILD_DIR)/config.h +strmatch.o: $(BASHINCDIR)/stdc.h + +glob.o: $(BUILD_DIR)/config.h +glob.o: $(topdir)/shell.h $(BUILD_DIR)/pathnames.h +glob.o: $(topdir)/bashtypes.h $(BASHINCDIR)/ansi_stdlib.h $(topdir)/bashansi.h +glob.o: $(BASHINCDIR)/posixstat.h $(BASHINCDIR)/memalloc.h +glob.o: strmatch.h glob.h +glob.o: $(BASHINCDIR)/shmbutil.h +glob.o: $(topdir)/xmalloc.h + +xmbsrtowcs.o: ${BUILD_DIR}/config.h +xmbsrtowcs.o: ${topdir}/bashansi.h ${BASHINCDIR}/ansi_stdlib.h +xmbsrtowcs.o: ${BASHINCDIR}/shmbutil.h + +# Rules for deficient makes, like SunOS and Solaris +glob.o: glob.c +strmatch.o: strmatch.c +smatch.o: smatch.c +xmbsrtowcs.o: xmbsrtowcs.c + +# dependencies for C files that include other C files +glob.o: glob_loop.c +smatch.o: sm_loop.c diff --git a/lib/glob/gmisc.c b/lib/glob/gmisc.c new file mode 100644 index 00000000..2499ba1d --- /dev/null +++ b/lib/glob/gmisc.c @@ -0,0 +1,311 @@ +/* gmisc.c -- miscellaneous pattern matching utility functions for Bash. + + Copyright (C) 2010 Free Software Foundation, Inc. + + 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/>. +*/ + +#include <config.h> + +#include "bashtypes.h" + +#if defined (HAVE_UNISTD_H) +# include <unistd.h> +#endif + +#include "bashansi.h" +#include "shmbutil.h" + +#include "stdc.h" + +#ifndef RPAREN +# define RPAREN '(' +#endif +#ifndef LPAREN +# define LPAREN ')' +#endif + +#if defined (HANDLE_MULTIBYTE) +/* Return 1 of the first character of WSTRING could match the first + character of pattern WPAT. Wide character version. */ +int +match_pattern_wchar (wpat, wstring) + wchar_t *wpat, *wstring; +{ + wchar_t wc; + + if (*wstring == 0) + return (0); + + switch (wc = *wpat++) + { + default: + return (*wstring == wc); + case L'\\': + return (*wstring == *wpat); + case L'?': + return (*wpat == LPAREN ? 1 : (*wstring != L'\0')); + case L'*': + return (1); + case L'+': + case L'!': + case L'@': + return (*wpat == LPAREN ? 1 : (*wstring == wc)); + case L'[': + return (*wstring != L'\0'); + } +} + +int +wmatchlen (wpat, wmax) + wchar_t *wpat; + size_t wmax; +{ + wchar_t wc, *wbrack; + int matlen, t, in_cclass, in_collsym, in_equiv; + + if (*wpat == 0) + return (0); + + matlen = 0; + while (wc = *wpat++) + { + switch (wc) + { + default: + matlen++; + break; + case L'\\': + if (*wpat == 0) + return ++matlen; + else + { + matlen++; + wpat++; + } + break; + case L'?': + if (*wpat == LPAREN) + return (matlen = -1); /* XXX for now */ + else + matlen++; + break; + case L'*': + return (matlen = -1); + case L'+': + case L'!': + case L'@': + if (*wpat == LPAREN) + return (matlen = -1); /* XXX for now */ + else + matlen++; + break; + case L'[': + /* scan for ending `]', skipping over embedded [:...:] */ + wbrack = wpat; + wc = *wpat++; + do + { + if (wc == 0) + { + matlen += wpat - wbrack - 1; /* incremented below */ + break; + } + else if (wc == L'\\') + { + wc = *wpat++; + if (*wpat == 0) + break; + } + else if (wc == L'[' && *wpat == L':') /* character class */ + { + wpat++; + in_cclass = 1; + } + else if (in_cclass && wc == L':' && *wpat == L']') + { + wpat++; + in_cclass = 0; + } + else if (wc == L'[' && *wpat == L'.') /* collating symbol */ + { + wpat++; + if (*wpat == L']') /* right bracket can appear as collating symbol */ + wpat++; + in_collsym = 1; + } + else if (in_collsym && wc == L'.' && *wpat == L']') + { + wpat++; + in_collsym = 0; + } + else if (wc == L'[' && *wpat == L'=') /* equivalence class */ + { + wpat++; + if (*wpat == L']') /* right bracket can appear as equivalence class */ + wpat++; + in_equiv = 1; + } + else if (in_equiv && wc == L'=' && *wpat == L']') + { + wpat++; + in_equiv = 0; + } + } + while ((wc = *wpat++) != L']'); + matlen++; /* bracket expression can only match one char */ + break; + } + } + + return matlen; +} +#endif + +/* Return 1 of the first character of STRING could match the first + character of pattern PAT. Used to avoid n2 calls to strmatch(). */ +int +match_pattern_char (pat, string) + char *pat, *string; +{ + char c; + + if (*string == 0) + return (0); + + switch (c = *pat++) + { + default: + return (*string == c); + case '\\': + return (*string == *pat); + case '?': + return (*pat == LPAREN ? 1 : (*string != '\0')); + case '*': + return (1); + case '+': + case '!': + case '@': + return (*pat == LPAREN ? 1 : (*string == c)); + case '[': + return (*string != '\0'); + } +} + +int +umatchlen (pat, max) + char *pat; + size_t max; +{ + char c, *brack; + int matlen, t, in_cclass, in_collsym, in_equiv; + + if (*pat == 0) + return (0); + + matlen = 0; + while (c = *pat++) + { + switch (c) + { + default: + matlen++; + break; + case L'\\': + if (*pat == 0) + return ++matlen; + else + { + matlen++; + pat++; + } + break; + case L'?': + if (*pat == LPAREN) + return (matlen = -1); /* XXX for now */ + else + matlen++; + break; + case L'*': + return (matlen = -1); + case L'+': + case L'!': + case L'@': + if (*pat == LPAREN) + return (matlen = -1); /* XXX for now */ + else + matlen++; + break; + case L'[': + /* scan for ending `]', skipping over embedded [:...:] */ + brack = pat; + c = *pat++; + do + { + if (c == 0) + { + matlen += pat - brack - 1; /* incremented below */ + break; + } + else if (c == '\\') + { + c = *pat++; + if (*pat == 0) + break; + } + else if (c == '[' && *pat == ':') /* character class */ + { + pat++; + in_cclass = 1; + } + else if (in_cclass && c == ':' && *pat == ']') + { + pat++; + in_cclass = 0; + } + else if (c == '[' && *pat == '.') /* collating symbol */ + { + pat++; + if (*pat == ']') /* right bracket can appear as collating symbol */ + pat++; + in_collsym = 1; + } + else if (in_collsym && c == '.' && *pat == ']') + { + pat++; + in_collsym = 0; + } + else if (c == '[' && *pat == '=') /* equivalence class */ + { + pat++; + if (*pat == ']') /* right bracket can appear as equivalence class */ + pat++; + in_equiv = 1; + } + else if (in_equiv && c == '=' && *pat == ']') + { + pat++; + in_equiv = 0; + } + } + while ((c = *pat++) != ']'); + matlen++; /* bracket expression can only match one char */ + break; + } + } + + return matlen; +} diff --git a/lib/glob/gmisc.c~ b/lib/glob/gmisc.c~ new file mode 100644 index 00000000..2de3b7b1 --- /dev/null +++ b/lib/glob/gmisc.c~ @@ -0,0 +1,311 @@ +/* gmisc.c -- miscellaneous pattern matching utility functions for Bash. + + Copyright (C) 2010 Free Software Foundation, Inc. + + 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/>. +*/ + +#include <config.h> + +#include "bashtypes.h" + +#if defined (HAVE_UNISTD_H) +# include <unistd.h> +#endif + +#include "bashansi.h" +#include "shmbutil.h" + +#include "stdc.h" + +#ifndef RPAREN +# define RPAREN '(' +#endif +#ifndef LPAREN +# define LPAREN ')' +#endif + +#if defined (HANDLE_MULTIBYTE) +/* Return 1 of the first character of WSTRING could match the first + character of pattern WPAT. Wide character version. */ +int +match_pattern_wchar (wpat, wstring) + wchar_t *wpat, *wstring; +{ + wchar_t wc; + + if (*wstring == 0) + return (0); + + switch (wc = *wpat++) + { + default: + return (*wstring == wc); + case L'\\': + return (*wstring == *wpat); + case L'?': + return (*wpat == LPAREN ? 1 : (*wstring != L'\0')); + case L'*': + return (1); + case L'+': + case L'!': + case L'@': + return (*wpat == LPAREN ? 1 : (*wstring == wc)); + case L'[': + return (*wstring != L'\0'); + } +} + +int +wmatchlen (wpat, wmax) + wchar_t *wpat; + size_t wmax; +{ + wchar_t wc, *wbrack; + int matlen, t, in_cclass, in_collsym, in_equiv; + + if (*wpat == 0) + return (0); + + matlen = 0; + while (wc = *wpat++) + { + switch (wc) + { + default: + matlen++; + break; + case L'\\': + if (*wpat == 0) + return ++matlen; + else + { + matlen++; + wpat++; + } + break; + case L'?': + if (*wpat == LPAREN) + return (matlen = -1); /* XXX for now */ + else + matlen++; + break; + case L'*': + return (matlen = -1); + case L'+': + case L'!': + case L'@': + if (*wpat == LPAREN) + return (matlen = -1); /* XXX for now */ + else + matlen++; + break; + case L'[': + /* scan for ending `]', skipping over embedded [:...:] */ + wbrack = wpat; + wc = *wpat++; + do + { + if (wc == 0) + { + matlen += wpat - wbrack - 1; /* incremented below */ + break; + } + else if (wc == L'\\') + { + wc = *wpat++; + if (*wpat == 0) + break; + } + else if (wc == L'[' && *wpat == L':') /* character class */ + { + wpat++; + in_cclass = 1; + } + else if (in_cclass && wc == L':' && *wpat == L']') + { + wpat++; + in_cclass = 0; + } + else if (wc == L'[' && *wpat == L'.') /* collating symbol */ + { + wpat++; + if (*wpat == L']') /* right bracket can appear as collating symbol */ + wpat++; + in_collsym = 1; + } + else if (in_collsym && wc == L'.' && *wpat == L']') + { + wpat++; + in_collsym = 0; + } + else if (wc == L'[' && *wpat == L'=') /* equivalence class */ + { + wpat++; + if (*wpat == L']') /* right bracket can appear as equivalence class */ + wpat++; + in_equiv = 1; + } + else if (in_equiv && wc == L'=' && *wpat == L']') + { + wpat++; + in_equiv = 0; + } + } + while ((wc = *wpat++) != L']'); + matlen++; /* bracket expression can only match one char */ + break; + } + } + + return matlen; +} +#endif + +/* Return 1 of the first character of STRING could match the first + character of pattern PAT. Used to avoid n2 calls to strmatch(). */ +int +match_pattern_char (pat, string) + char *pat, *string; +{ + char c; + + if (*string == 0) + return (0); + + switch (c = *pat++) + { + default: + return (*string == c); + case '\\': + return (*string == *pat); + case '?': + return (*pat == LPAREN ? 1 : (*string != '\0')); + case '*': + return (1); + case '+': + case '!': + case '@': + return (*pat == LPAREN ? 1 : (*string == c)); + case '[': + return (*string != '\0'); + } +} + +int +umatchlen (pat, max) + char *pat; + size_t max; +{ + char c, *brack; + int matlen, t, in_cclass, in_collsym, in_equiv; + + if (*pat == 0) + return (0); + + matlen = 0; + while (c = *pat++) + { + switch (c) + { + default: + matlen++; + break; + case L'\\': + if (*pat == 0) + return ++matlen; + else + { + matlen++; + pat++; + } + break; + case L'?': + if (*pat == LPAREN) + return (matlen = max); /* XXX for now */ + else + matlen++; + break; + case L'*': + return (matlen = max); + case L'+': + case L'!': + case L'@': + if (*pat == LPAREN) + return (matlen = max); /* XXX for now */ + else + matlen++; + break; + case L'[': + /* scan for ending `]', skipping over embedded [:...:] */ + brack = pat; + c = *pat++; + do + { + if (c == 0) + { + matlen += pat - brack - 1; /* incremented below */ + break; + } + else if (c == '\\') + { + c = *pat++; + if (*pat == 0) + break; + } + else if (c == '[' && *pat == ':') /* character class */ + { + pat++; + in_cclass = 1; + } + else if (in_cclass && c == ':' && *pat == ']') + { + pat++; + in_cclass = 0; + } + else if (c == '[' && *pat == '.') /* collating symbol */ + { + pat++; + if (*pat == ']') /* right bracket can appear as collating symbol */ + pat++; + in_collsym = 1; + } + else if (in_collsym && c == '.' && *pat == ']') + { + pat++; + in_collsym = 0; + } + else if (c == '[' && *pat == '=') /* equivalence class */ + { + pat++; + if (*pat == ']') /* right bracket can appear as equivalence class */ + pat++; + in_equiv = 1; + } + else if (in_equiv && c == '=' && *pat == ']') + { + pat++; + in_equiv = 0; + } + } + while ((c = *pat++) != ']'); + matlen++; /* bracket expression can only match one char */ + break; + } + } + + return matlen; +} |