X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fexclude.c;h=f38abf2ba657a2beca56fd924b222faa859217f0;hb=d4300b64e12f5ed6eb0634a7de21e9479b18bfbe;hp=f5978a966e01fca373bbd2914b7d3d2ff3953a2b;hpb=4fde4952d5a3db51a122f96a31bfcd6879399fea;p=gnulib.git diff --git a/lib/exclude.c b/lib/exclude.c index f5978a966..f38abf2ba 100644 --- a/lib/exclude.c +++ b/lib/exclude.c @@ -1,12 +1,12 @@ /* exclude.c -- exclude file names Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006 Free Software Foundation, Inc. + 2004, 2005, 2006, 2007 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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. + 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 @@ -14,15 +14,11 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. - If not, write to the Free Software Foundation, - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* Written by Paul Eggert */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include #include @@ -35,7 +31,6 @@ #include "exclude.h" #include "fnmatch.h" -#include "strcase.h" #include "xalloc.h" #include "verify.h" @@ -47,13 +42,16 @@ #ifndef FNM_CASEFOLD # define FNM_CASEFOLD 0 #endif +#ifndef FNM_EXTMATCH +# define FNM_EXTMATCH 0 +#endif #ifndef FNM_LEADING_DIR # define FNM_LEADING_DIR 0 #endif verify (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS) & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR - | FNM_CASEFOLD)) + | FNM_CASEFOLD | FNM_EXTMATCH)) == 0); /* An exclude pattern-options pair. The options are fnmatch options @@ -99,14 +97,12 @@ fnmatch_no_wildcards (char const *pattern, char const *f, int options) { if (! (options & FNM_LEADING_DIR)) return ((options & FNM_CASEFOLD) - ? strcasecmp (pattern, f) + ? mbscasecmp (pattern, f) : strcmp (pattern, f)); - else + else if (! (options & FNM_CASEFOLD)) { size_t patlen = strlen (pattern); - int r = ((options & FNM_CASEFOLD) - ? strncasecmp (pattern, f, patlen) - : strncmp (pattern, f, patlen)); + int r = strncmp (pattern, f, patlen); if (! r) { r = f[patlen]; @@ -115,6 +111,30 @@ fnmatch_no_wildcards (char const *pattern, char const *f, int options) } return r; } + else + { + /* Walk through a copy of F, seeing whether P matches any prefix + of F. + + FIXME: This is an O(N**2) algorithm; it should be O(N). + Also, the copy should not be necessary. However, fixing this + will probably involve a change to the mbs* API. */ + + char *fcopy = xstrdup (f); + char *p; + int r; + for (p = fcopy; ; *p++ = '/') + { + p = strchr (p, '/'); + if (p) + *p = '\0'; + r = mbscasecmp (pattern, fcopy); + if (!p || r <= 0) + break; + } + free (fcopy); + return r; + } } bool