Enable the fpucw handling also for x86_64.
[gnulib.git] / lib / exclude.c
index 5b726ff..f38abf2 100644 (file)
@@ -3,10 +3,10 @@
    Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003,
    2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
    Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003,
    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
    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
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -14,9 +14,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    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 <http://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert <eggert@twinsun.com>  */
 
 
 /* Written by Paul Eggert <eggert@twinsun.com>  */
 
 #ifndef FNM_CASEFOLD
 # define FNM_CASEFOLD 0
 #endif
 #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
 #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
        == 0);
 
 /* An exclude pattern-options pair.  The options are fnmatch options
@@ -96,14 +97,12 @@ fnmatch_no_wildcards (char const *pattern, char const *f, int options)
 {
   if (! (options & FNM_LEADING_DIR))
     return ((options & FNM_CASEFOLD)
 {
   if (! (options & FNM_LEADING_DIR))
     return ((options & FNM_CASEFOLD)
-           ? strcasecmp (pattern, f)
+           ? mbscasecmp (pattern, f)
            : strcmp (pattern, f));
            : strcmp (pattern, f));
-  else
+  else if (! (options & FNM_CASEFOLD))
     {
       size_t patlen = strlen (pattern);
     {
       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];
       if (! r)
        {
          r = f[patlen];
@@ -112,6 +111,30 @@ fnmatch_no_wildcards (char const *pattern, char const *f, int options)
        }
       return r;
     }
        }
       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
 }
 
 bool