]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Update 'fnmatch' module from gnulib.
authorBruno Haible <bruno@clisp.org>
Wed, 12 Jan 2005 12:36:38 +0000 (12:36 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 23 Jun 2009 10:12:00 +0000 (12:12 +0200)
gettext-tools/ChangeLog
gettext-tools/Makefile.am
gettext-tools/lib/ChangeLog
gettext-tools/lib/Makefile.am
gettext-tools/lib/Makefile.vms
gettext-tools/lib/fnmatch.c
gettext-tools/lib/fnmatch_.h
gettext-tools/m4/ChangeLog
gettext-tools/m4/fnmatch.m4

index 01979c9aedaadf961d9b831788d02ab9a1b4f48d..d1c15e0703620013f3d0086fc69ecc3237b3e42e 100644 (file)
@@ -1,3 +1,8 @@
+2005-01-06  Bruno Haible  <bruno@clisp.org>
+
+       * Makefile.am (config.h_vms, config.h.msvc): Define HAVE_WMEMCHR and
+       HAVE_WMEMCPY to 1.
+
 2005-01-06  Bruno Haible  <bruno@clisp.org>
 
        * Makefile.am (config.h_vms, config.h.msvc): Define USE_UNLOCKED_IO
index 3b2d1bb1a27fa9e419e0ebeba1b0a70b00aa59c3..e1d34b1480721b3aff6d6eeccaf1ac8a6f1d098e 100644 (file)
@@ -127,6 +127,8 @@ config.h_vms: config.h.in ../version.sh
             -e 's/#undef HAVE_WCTYPE_H$$/#define HAVE_WCTYPE_H 1/' \
             -e 's/#undef HAVE_WCWIDTH$$/#define HAVE_WCWIDTH 1/' \
             -e 's/#undef HAVE_WINT_T$$/#define HAVE_WINT_T 1/' \
+            -e 's/#undef HAVE_WMEMCHR$$/#define HAVE_WMEMCHR 1/' \
+            -e 's/#undef HAVE_WMEMCPY$$/#define HAVE_WMEMCPY 1/' \
             -e 's/#undef HAVE_WORKING_VFORK$$/#define HAVE_WORKING_VFORK 1/' \
             -e 's/#undef HAVE_WPRINTF$$/#define HAVE_WPRINTF 1/' \
             -e 's/#undef ICONV_CONST$$/#define ICONV_CONST/' \
@@ -197,6 +199,8 @@ config.h.msvc: config.h.in ../version.sh
            -e 's/#undef HAVE_WCHAR_H$$/#define HAVE_WCHAR_H 1/' \
            -e 's/#undef HAVE_WCSLEN$$/#define HAVE_WCSLEN 1/' \
            -e 's/#undef HAVE_WINT_T$$/#define HAVE_WINT_T 1/' \
+           -e 's/#undef HAVE_WMEMCHR$$/#define HAVE_WMEMCHR 1/' \
+           -e 's/#undef HAVE_WMEMCPY$$/#define HAVE_WMEMCPY 1/' \
            -e 's/#undef HAVE_WPRINTF$$/#define HAVE_WPRINTF 1/' \
            -e 's/#undef ICONV_CONST$$/#define ICONV_CONST const/' \
            -e 's/#undef MALLOC_0_IS_NONNULL$$/#define MALLOC_0_IS_NONNULL 1/' \
index e4939391792c086b5f2867a90f745eb5771ddb8f..c159eec6d5fb21cb3c730a8de59711fb792ecae0 100644 (file)
@@ -1,3 +1,13 @@
+2005-01-06  Bruno Haible  <bruno@clisp.org>
+
+       * fnmatch_.h: Upgrade from gnulib.
+       * fnmatch.c: Upgrade from gnulib.
+       * fnmatch_loop.c: New file, from gnulib.
+       * Makefile.am (DISTCLEANFILES): Remove fnmatch.h.
+       (BUILT_SOURCES): New variable.
+       (EXTRA_DIST): Add fnmatch_loop.c.
+       * Makefile.vms (fnmatch.obj): Depend also on fnmatch_loop.c.
+
 2004-12-19  Paul Eggert  <eggert@cs.ucla.edu>
 
        * alloca_.h: Conditionalize on _GNULIB_ALLOCA_H, not _ALLOCA_H.
index 5552ac45a56b990934124bccc8b936a1412ad8ea..0086428a0e52b35ddf8ca2b3740f675bfdda68c5 100644 (file)
@@ -1,5 +1,5 @@
 ## Makefile for the gettext-tools/lib subdirectory of GNU gettext
-## Copyright (C) 1995-1998, 2000-2004 Free Software Foundation, Inc.
+## Copyright (C) 1995-1998, 2000-2005 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
@@ -19,6 +19,7 @@
 
 AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies
 EXTRA_DIST =
+BUILT_SOURCES =
 MOSTLYCLEANFILES =
 CLEANFILES =
 DISTCLEANFILES =
@@ -154,9 +155,6 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I.. -I../intl -I$(top_srcdir)/intl
 DEFS = -DEXEEXT=\"$(EXEEXT)\" -DDEPENDS_ON_LIBINTL=1 -DDEPENDS_ON_LIBICONV=1 @DEFS@
 
 
-DISTCLEANFILES += fnmatch.h
-
-
 # >>> gnulib module stdbool.
 EXTRA_DIST += stdbool_.h
 
@@ -182,7 +180,8 @@ MOSTLYCLEANFILES += alloca.h
 
 
 # >>> gnulib module fnmatch.
-EXTRA_DIST += fnmatch_.h
+BUILT_SOURCES += $(FNMATCH_H)
+EXTRA_DIST += fnmatch_.h fnmatch_loop.c
 
 # The following is needed in order to create an <fnmatch.h> when the system
 # doesn't have one that works.
index 04b7891221066b2728e215ed20502c2d953df964..4170dde568b2c5e714fe0b58183adb1b9186ab95 100644 (file)
@@ -232,7 +232,7 @@ xerror.obj : xerror.c
 xsetenv.obj : xsetenv.c
        $(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) xsetenv.c
 
-fnmatch.obj : fnmatch.c fnmatch.h
+fnmatch.obj : fnmatch.c fnmatch.h fnmatch_loop.c
        $(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) fnmatch.c
 
 getline.obj : getline.c
index 209d598b799c82ebe5420c94f22103d68dbad2f1..011a145038f8141daa48a63aee9cb498fe56c76e 100644 (file)
@@ -1,5 +1,5 @@
-/* POSIX fnmatch().
-   Copyright 1991-1993, 1996-1997, 2000-2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2004
+       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
    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-1307, USA.  */
+   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-1307, USA.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
 
 /* Enable GNU extensions in fnmatch.h.  */
 #ifndef _GNU_SOURCE
 # define _GNU_SOURCE   1
 #endif
 
-#if HAVE_CONFIG_H
-# include <config.h>
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
 #endif
 
-/* Specification.  */
-#include "fnmatch.h"
+#include <fnmatch.h>
 
+#include <alloca.h>
+#include <assert.h>
+#include <ctype.h>
 #include <errno.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define WIDE_CHAR_SUPPORT \
+  (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC \
+   && HAVE_WMEMCHR && (HAVE_WMEMCPY || HAVE_WMEMPCPY))
+
+/* For platform which support the ISO C amendement 1 functionality we
+   support user defined character classes.  */
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
+# include <wchar.h>
+# include <wctype.h>
+#endif
 
+/* We need some of the locale data (the collation sequence information)
+   but there is no interface to get this information in general.  Therefore
+   we support a correct implementation only in glibc.  */
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# include "../locale/elem-hash.h"
+# include "../locale/coll-lookup.h"
+# include <shlib-compat.h>
+
+# define CONCAT(a,b) __CONCAT(a,b)
+# define mbsrtowcs __mbsrtowcs
+# define fnmatch __fnmatch
+extern int fnmatch (const char *pattern, const char *string, int flags);
+#endif
 
-/* Match STRING against the filename pattern PATTERN, returning zero if
-   it matches, nonzero if not.  */
-int
-fnmatch (const char *pattern, const char *string, int flags)
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* We often have to test for FNM_FILE_NAME and FNM_PERIOD being both set.  */
+#define NO_LEADING_PERIOD(flags) \
+  ((flags & (FNM_FILE_NAME | FNM_PERIOD)) == (FNM_FILE_NAME | FNM_PERIOD))
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself, and have not detected a bug
+   in the library.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined _LIBC || !defined __GNU_LIBRARY__ || !HAVE_FNMATCH_GNU
+
+
+# if defined STDC_HEADERS || !defined isascii
+#  define ISASCII(c) 1
+# else
+#  define ISASCII(c) isascii(c)
+# endif
+
+# ifdef isblank
+#  define ISBLANK(c) (ISASCII (c) && isblank (c))
+# else
+#  define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+# endif
+# ifdef isgraph
+#  define ISGRAPH(c) (ISASCII (c) && isgraph (c))
+# else
+#  define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
+# endif
+
+# define ISPRINT(c) (ISASCII (c) && isprint (c))
+# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
+# define ISALNUM(c) (ISASCII (c) && isalnum (c))
+# define ISALPHA(c) (ISASCII (c) && isalpha (c))
+# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
+# define ISLOWER(c) (ISASCII (c) && islower (c))
+# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
+# define ISSPACE(c) (ISASCII (c) && isspace (c))
+# define ISUPPER(c) (ISASCII (c) && isupper (c))
+# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
+
+# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+# if defined _LIBC || WIDE_CHAR_SUPPORT
+/* The GNU C library provides support for user-defined character classes
+   and the functions from ISO C amendement 1.  */
+#  ifdef CHARCLASS_NAME_MAX
+#   define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+#  else
+/* This shouldn't happen but some implementation might still have this
+   problem.  Use a reasonable default value.  */
+#   define CHAR_CLASS_MAX_LENGTH 256
+#  endif
+
+#  ifdef _LIBC
+#   define IS_CHAR_CLASS(string) __wctype (string)
+#  else
+#   define IS_CHAR_CLASS(string) wctype (string)
+#  endif
+
+#  ifdef _LIBC
+#   define ISWCTYPE(WC, WT)    __iswctype (WC, WT)
+#  else
+#   define ISWCTYPE(WC, WT)    iswctype (WC, WT)
+#  endif
+
+#  if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC
+/* In this case we are implementing the multibyte character handling.  */
+#   define HANDLE_MULTIBYTE    1
+#  endif
+
+# else
+#  define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#  define IS_CHAR_CLASS(string)                                                      \
+   (STREQ (string, "alpha") || STREQ (string, "upper")                       \
+    || STREQ (string, "lower") || STREQ (string, "digit")                    \
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")                   \
+    || STREQ (string, "space") || STREQ (string, "print")                    \
+    || STREQ (string, "punct") || STREQ (string, "graph")                    \
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+/* Global variable.  */
+static int posixly_correct;
+
+# ifndef internal_function
+/* Inside GNU libc we mark some function in a special way.  In other
+   environments simply ignore the marking.  */
+#  define internal_function
+# endif
+
+/* Note that this evaluates C many times.  */
+# ifdef _LIBC
+#  define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+# else
+#  define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# endif
+# define CHAR  char
+# define UCHAR unsigned char
+# define INT   int
+# define FCT   internal_fnmatch
+# define EXT   ext_match
+# define END   end_pattern
+# define L(CS) CS
+# ifdef _LIBC
+#  define BTOWC(C)     __btowc (C)
+# else
+#  define BTOWC(C)     btowc (C)
+# endif
+# define STRLEN(S) strlen (S)
+# define STRCAT(D, S) strcat (D, S)
+# ifdef _LIBC
+#  define MEMPCPY(D, S, N) __mempcpy (D, S, N)
+# else
+#  if HAVE_MEMPCPY
+#   define MEMPCPY(D, S, N) mempcpy (D, S, N)
+#  else
+#   define MEMPCPY(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+#  endif
+# endif
+# define MEMCHR(S, C, N) memchr (S, C, N)
+# define STRCOLL(S1, S2) strcoll (S1, S2)
+# include "fnmatch_loop.c"
+
+
+# if HANDLE_MULTIBYTE
+#  define FOLD(c) ((flags & FNM_CASEFOLD) ? towlower (c) : (c))
+#  define CHAR wchar_t
+#  define UCHAR        wint_t
+#  define INT  wint_t
+#  define FCT  internal_fnwmatch
+#  define EXT  ext_wmatch
+#  define END  end_wpattern
+#  define L(CS)        L##CS
+#  define BTOWC(C)     (C)
+#  ifdef _LIBC
+#   define STRLEN(S) __wcslen (S)
+#   define STRCAT(D, S) __wcscat (D, S)
+#   define MEMPCPY(D, S, N) __wmempcpy (D, S, N)
+#  else
+#   define STRLEN(S) wcslen (S)
+#   define STRCAT(D, S) wcscat (D, S)
+#   if HAVE_WMEMPCPY
+#    define MEMPCPY(D, S, N) wmempcpy (D, S, N)
+#   else
+#    define MEMPCPY(D, S, N) (wmemcpy (D, S, N) + (N))
+#   endif
+#  endif
+#  define MEMCHR(S, C, N) wmemchr (S, C, N)
+#  define STRCOLL(S1, S2) wcscoll (S1, S2)
+#  define WIDE_CHAR_VERSION 1
+
+#  undef IS_CHAR_CLASS
+/* We have to convert the wide character string in a multibyte string.  But
+   we know that the character class names consist of alphanumeric characters
+   from the portable character set, and since the wide character encoding
+   for a member of the portable character set is the same code point as
+   its single-byte encoding, we can use a simplified method to convert the
+   string to a multibyte character string.  */
+static wctype_t
+is_char_class (const wchar_t *wcs)
 {
-  register const char *p = pattern, *n = string;
-  register char c;
+  char s[CHAR_CLASS_MAX_LENGTH + 1];
+  char *cp = s;
 
-  while ((c = *p++) != '\0')
+  do
     {
-      switch (c)
+      /* Test for a printable character from the portable character set.  */
+#  ifdef _LIBC
+      if (*wcs < 0x20 || *wcs > 0x7e
+         || *wcs == 0x24 || *wcs == 0x40 || *wcs == 0x60)
+       return (wctype_t) 0;
+#  else
+      switch (*wcs)
        {
-       case '?':
-         if (*n == '\0')
-           return FNM_NOMATCH;
-         else if ((flags & FNM_FILE_NAME) && *n == '/')
-           return FNM_NOMATCH;
-         else if ((flags & FNM_PERIOD) && *n == '.' &&
-                  (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
-           return FNM_NOMATCH;
+       case L' ': case L'!': case L'"': case L'#': case L'%':
+       case L'&': case L'\'': case L'(': case L')': case L'*':
+       case L'+': case L',': case L'-': case L'.': case L'/':
+       case L'0': case L'1': case L'2': case L'3': case L'4':
+       case L'5': case L'6': case L'7': case L'8': case L'9':
+       case L':': case L';': case L'<': case L'=': case L'>':
+       case L'?':
+       case L'A': case L'B': case L'C': case L'D': case L'E':
+       case L'F': case L'G': case L'H': case L'I': case L'J':
+       case L'K': case L'L': case L'M': case L'N': case L'O':
+       case L'P': case L'Q': case L'R': case L'S': case L'T':
+       case L'U': case L'V': case L'W': case L'X': case L'Y':
+       case L'Z':
+       case L'[': case L'\\': case L']': case L'^': case L'_':
+       case L'a': case L'b': case L'c': case L'd': case L'e':
+       case L'f': case L'g': case L'h': case L'i': case L'j':
+       case L'k': case L'l': case L'm': case L'n': case L'o':
+       case L'p': case L'q': case L'r': case L's': case L't':
+       case L'u': case L'v': case L'w': case L'x': case L'y':
+       case L'z': case L'{': case L'|': case L'}': case L'~':
          break;
+       default:
+         return (wctype_t) 0;
+       }
+#  endif
 
-       case '\\':
-         if (!(flags & FNM_NOESCAPE))
-           {
-             c = *p++;
-             if (c == '\0')
-               /* Trailing \ loses.  */
-               return FNM_NOMATCH;
-           }
-         if (*n != c)
-           return FNM_NOMATCH;
-         break;
+      /* Avoid overrunning the buffer.  */
+      if (cp == s + CHAR_CLASS_MAX_LENGTH)
+       return (wctype_t) 0;
 
-       case '*':
-         if ((flags & FNM_PERIOD) && *n == '.' &&
-             (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
-           return FNM_NOMATCH;
+      *cp++ = (char) *wcs++;
+    }
+  while (*wcs != L'\0');
 
-         for (c = *p++; c == '?' || c == '*'; c = *p++)
-           {
-             if (c == '?')
-               {
-                 /* A ? needs to match one character.  */
-                 if (*n == '\0' || (*n == '/' && (flags & FNM_FILE_NAME)))
-                   /* There isn't another character; no match.  */
-                   return FNM_NOMATCH;
-                 else
-                   /* One character of the string is consumed in matching
-                      this ? wildcard, so *??? won't match if there are
-                      less than three characters.  */
-                   ++n;
-               }
-           }
+  *cp = '\0';
 
-         if (c == '\0')
-           {
-             if ((flags & (FNM_FILE_NAME | FNM_LEADING_DIR)) == FNM_FILE_NAME)
-               for (; *n != '\0'; n++)
-                 if (*n == '/')
-                   return FNM_NOMATCH;
-             return 0;
-           }
+#  ifdef _LIBC
+  return __wctype (s);
+#  else
+  return wctype (s);
+#  endif
+}
+#  define IS_CHAR_CLASS(string) is_char_class (string)
 
-         {
-           char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
-           for (--p; *n != '\0'; ++n)
-             if ((c == '[' || *n == c1) &&
-                 fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
-               return 0;
-             else if (*n == '/' && (flags & FNM_FILE_NAME))
-               break;
-           return FNM_NOMATCH;
-         }
-
-       case '[':
-         {
-           /* Nonzero if the sense of the character class is inverted.  */
-           register int not;
-
-           if (*n == '\0')
-             return FNM_NOMATCH;
-
-           if ((flags & FNM_PERIOD) && *n == '.' &&
-               (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
-             return FNM_NOMATCH;
-
-           not = (*p == '!' || *p == '^');
-           if (not)
-             ++p;
-
-           c = *p++;
-           for (;;)
-             {
-               register char cstart = c, cend = c;
-
-               if (!(flags & FNM_NOESCAPE) && c == '\\')
-                 {
-                   if (*p == '\0')
-                     return FNM_NOMATCH;
-                   cstart = cend = *p++;
-                 }
-
-               cend = cstart;
-
-               if (c == '\0')
-                 /* [ (unterminated) loses.  */
-                 return FNM_NOMATCH;
-
-               c = *p++;
-
-               if ((flags & FNM_FILE_NAME) && c == '/')
-                 /* [/] can never match.  */
-                 return FNM_NOMATCH;
-
-               if (c == '-' && *p != ']')
-                 {
-                   cend = *p++;
-                   if (!(flags & FNM_NOESCAPE) && cend == '\\')
-                     cend = *p++;
-                   if (cend == '\0')
-                     return FNM_NOMATCH;
-
-                   c = *p++;
-                 }
-
-               if ((unsigned char) *n >= (unsigned char) cstart
-                   && (unsigned char) *n <= (unsigned char) cend)
-                 goto matched;
-
-               if (c == ']')
-                 break;
-             }
-           if (!not)
-             return FNM_NOMATCH;
-           break;
-
-         matched:;
-           /* Skip the rest of the [...] that already matched.  */
-           while (c != ']')
-             {
-               if (c == '\0')
-                 /* [... (unterminated) loses.  */
-                 return FNM_NOMATCH;
-
-               c = *p++;
-               if (!(flags & FNM_NOESCAPE) && c == '\\')
-                 {
-                   if (*p == '\0')
-                     return FNM_NOMATCH;
-                   /* XXX 1003.2d11 is unclear if this is right.  */
-                   ++p;
-                 }
-             }
-           if (not)
-             return FNM_NOMATCH;
-         }
-         break;
+#  include "fnmatch_loop.c"
+# endif
 
-       default:
-         if (c != *n)
-           return FNM_NOMATCH;
+
+int
+fnmatch (const char *pattern, const char *string, int flags)
+{
+# if HANDLE_MULTIBYTE
+#  define ALLOCA_LIMIT 2000
+  if (__builtin_expect (MB_CUR_MAX, 1) != 1)
+    {
+      mbstate_t ps;
+      size_t patsize;
+      size_t strsize;
+      size_t totsize;
+      wchar_t *wpattern;
+      wchar_t *wstring;
+      int res;
+
+      /* Calculate the size needed to convert the strings to
+        wide characters.  */
+      memset (&ps, '\0', sizeof (ps));
+      patsize = mbsrtowcs (NULL, &pattern, 0, &ps) + 1;
+      if (__builtin_expect (patsize == 0, 0))
+       /* Something wrong.
+          XXX Do we have to set `errno' to something which mbsrtows hasn't
+          already done?  */
+       return -1;
+      assert (mbsinit (&ps));
+      strsize = mbsrtowcs (NULL, &string, 0, &ps) + 1;
+      if (__builtin_expect (strsize == 0, 0))
+       /* Something wrong.
+          XXX Do we have to set `errno' to something which mbsrtows hasn't
+          already done?  */
+       return -1;
+      assert (mbsinit (&ps));
+      totsize = patsize + strsize;
+      if (__builtin_expect (! (patsize <= totsize
+                              && totsize <= SIZE_MAX / sizeof (wchar_t)),
+                           0))
+       {
+         errno = ENOMEM;
+         return -1;
        }
 
-      ++n;
-    }
+      /* Allocate room for the wide characters.  */
+      if (__builtin_expect (totsize < ALLOCA_LIMIT, 1))
+       wpattern = (wchar_t *) alloca (totsize * sizeof (wchar_t));
+      else
+       {
+         wpattern = malloc (totsize * sizeof (wchar_t));
+         if (__builtin_expect (! wpattern, 0))
+           {
+             errno = ENOMEM;
+             return -1;
+           }
+       }
+      wstring = wpattern + patsize;
+
+      /* Convert the strings into wide characters.  */
+      mbsrtowcs (wpattern, &pattern, patsize, &ps);
+      assert (mbsinit (&ps));
+      mbsrtowcs (wstring, &string, strsize, &ps);
 
-  if (*n == '\0')
-    return 0;
+      res = internal_fnwmatch (wpattern, wstring, wstring + strsize - 1,
+                              flags & FNM_PERIOD, flags);
 
-  if ((flags & FNM_LEADING_DIR) && *n == '/')
-    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
-    return 0;
+      if (__builtin_expect (! (totsize < ALLOCA_LIMIT), 0))
+       free (wpattern);
+      return res;
+    }
+# endif /* HANDLE_MULTIBYTE */
 
-  return FNM_NOMATCH;
+  return internal_fnmatch (pattern, string, string + strlen (string),
+                          flags & FNM_PERIOD, flags);
 }
+
+# ifdef _LIBC
+#  undef fnmatch
+versioned_symbol (libc, __fnmatch, fnmatch, GLIBC_2_2_3);
+#  if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_3)
+strong_alias (__fnmatch, __fnmatch_old)
+compat_symbol (libc, __fnmatch_old, fnmatch, GLIBC_2_0);
+#  endif
+libc_hidden_ver (__fnmatch, fnmatch)
+# endif
+
+#endif /* _LIBC or not __GNU_LIBRARY__.  */
index c2d2a36392e02c7ddbafcced0edb1a4640ce8606..87e661f725b49d6524579bc1e27e8d7cf03a2a50 100644 (file)
@@ -1,10 +1,10 @@
-/* POSIX <fnmatch.h>.
-   Copyright (C) 1991-1993, 2001-2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2001, 2002, 2003
+   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 2, 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
    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifndef        _FNMATCH_H
-#define        _FNMATCH_H      1
+# define _FNMATCH_H    1
 
-#ifdef __cplusplus
+# ifdef        __cplusplus
 extern "C" {
-#endif
-
+# endif
 
 /* We #undef these before defining them because some losing systems
    (HP-UX A.08.07 for example) define these in <unistd.h>.  */
-#undef FNM_PATHNAME
-#undef FNM_NOESCAPE
-#undef FNM_PERIOD
+# undef        FNM_PATHNAME
+# undef        FNM_NOESCAPE
+# undef        FNM_PERIOD
 
 /* Bits set in the FLAGS argument to `fnmatch'.  */
-#define        FNM_PATHNAME    (1 << 0) /* No wildcard can ever match `/'.  */
-#define        FNM_NOESCAPE    (1 << 1) /* Backslashes don't quote special chars.  */
-#define        FNM_PERIOD      (1 << 2) /* Leading `.' is matched only explicitly.  */
+# define FNM_PATHNAME  (1 << 0) /* No wildcard can ever match `/'.  */
+# define FNM_NOESCAPE  (1 << 1) /* Backslashes don't quote special chars.  */
+# define FNM_PERIOD    (1 << 2) /* Leading `.' is matched only explicitly.  */
 
-#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE)
-#define        FNM_FILE_NAME   FNM_PATHNAME /* Preferred GNU name.  */
-#define        FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match.  */
-#endif
+# if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
+#  define FNM_FILE_NAME         FNM_PATHNAME   /* Preferred GNU name.  */
+#  define FNM_LEADING_DIR (1 << 3)     /* Ignore `/...' after a match.  */
+#  define FNM_CASEFOLD  (1 << 4)       /* Compare without regard to case.  */
+#  define FNM_EXTMATCH  (1 << 5)       /* Use ksh-like extended matching. */
+# endif
 
 /* Value returned by `fnmatch' if STRING does not match PATTERN.  */
-#define        FNM_NOMATCH     1
+# define FNM_NOMATCH   1
+
+/* This value is returned if the implementation does not support
+   `fnmatch'.  Since this is not the case here it will never be
+   returned but the conformance test suites still require the symbol
+   to be defined.  */
+# ifdef _XOPEN_SOURCE
+#  define FNM_NOSYS    (-1)
+# endif
 
-/* Match STRING against the filename pattern PATTERN,
+/* Match NAME against the filename pattern PATTERN,
    returning zero if it matches, FNM_NOMATCH if not.  */
-extern int fnmatch (const char *__pattern, const char *__string, int __flags);
+extern int fnmatch (const char *__pattern, const char *__name,
+                   int __flags);
 
-#ifdef __cplusplus
+# ifdef        __cplusplus
 }
-#endif
+# endif
 
 #endif /* fnmatch.h */
index cc347fda5c079ecad76a65ffd6cc591542bdb729..fe134683df0ba2b1539925dcc96d3f3fde419c57 100644 (file)
@@ -1,3 +1,7 @@
+2005-01-06  Bruno Haible  <bruno@clisp.org>
+
+       * fnmatch.m4: Upgrade from gnulib.
+
 2005-01-06  Bruno Haible  <bruno@clisp.org>
 
        * stdbool.m4: Upgrade to gnulib version.
        * extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Require AC_AIX
        and AC_MINIX, too, so that their extensions are available.
 
+2003-09-10  Bruno Haible  <bruno@clisp.org>
+
+       * xreadlink.m4 (gl_XREADLINK): Remove <stdlib.h> check.
+
 2003-09-10  Bruno Haible  <bruno@clisp.org>
 
        * setenv.m4 (gl_PREREQ_SETENV, gl_PREREQ_UNSETENV): Remove
index befb73e2772e6afce95d6d0ca16117feb74cf890..92a8f2b58b79ea946e7e74cdfdac1b008ecbfc7c 100644 (file)
@@ -3,7 +3,7 @@
 # This is a modified version of autoconf's AC_FUNC_FNMATCH.
 # This file should be simplified after Autoconf 2.57 is required.
 
-# Copyright (C) 2000-2003 Free Software Foundation, Inc.
+# Copyright (C) 2000, 2001, 2002, 2003, 2004 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
@@ -28,10 +28,10 @@ AC_DEFUN([_AC_FUNC_FNMATCH_IF],
 [AC_CACHE_CHECK(
    [for working $1 fnmatch],
    [$2],
-  [# Some versions of Solaris, SCO, and the GNU C Library
-   # have a broken or incompatible fnmatch.
-   # So we run a test program.  If we are cross-compiling, take no chance.
-   # Thanks to John Oleynick, Franc,ois Pinard, and Paul Eggert for this test.
+  [dnl Some versions of Solaris, SCO, and the GNU C Library
+   dnl have a broken or incompatible fnmatch.
+   dnl So we run a test program.  If we are cross-compiling, take no chance.
+   dnl Thanks to John Oleynick, François Pinard, and Paul Eggert for this test.
    AC_RUN_IFELSE(
       [AC_LANG_PROGRAM(
         [
@@ -70,21 +70,13 @@ AC_DEFUN([_AC_LIBOBJ_FNMATCH],
 AC_REQUIRE([AC_FUNC_ALLOCA])dnl
 AC_REQUIRE([AC_TYPE_MBSTATE_T])dnl
 AC_CHECK_DECLS([getenv])
-AC_CHECK_FUNCS([btowc mbsrtowcs mempcpy wmempcpy])
+AC_CHECK_FUNCS([btowc mbsrtowcs mempcpy wmemchr wmemcpy wmempcpy])
 AC_CHECK_HEADERS([wchar.h wctype.h])
 AC_LIBOBJ([fnmatch])
 FNMATCH_H=fnmatch.h
 ])# _AC_LIBOBJ_FNMATCH
 
 
-# Additional prerequisites of lib/fnmatch.c, not part of _AC_LIBOBJ_FNMATCH.
-AC_DEFUN([gl_PREREQ_FNMATCH_EXTRA],
-[
-  AC_REQUIRE([AC_HEADER_STDC])
-  AC_CHECK_HEADERS_ONCE(string.h strings.h)
-])
-
-
 AC_DEFUN([gl_FUNC_FNMATCH_POSIX],
 [
   FNMATCH_H=
@@ -92,7 +84,6 @@ AC_DEFUN([gl_FUNC_FNMATCH_POSIX],
                       [rm -f lib/fnmatch.h],
                       [_AC_LIBOBJ_FNMATCH])
   if test $ac_cv_func_fnmatch_posix != yes; then
-    gl_PREREQ_FNMATCH_EXTRA
     dnl We must choose a different name for our function, since on ELF systems
     dnl a broken fnmatch() in libc.so would override our fnmatch() if it is
     dnl compiled into a shared library.
@@ -113,7 +104,6 @@ AC_DEFUN([gl_FUNC_FNMATCH_GNU],
                       [rm -f lib/fnmatch.h],
                       [_AC_LIBOBJ_FNMATCH])
   if test $ac_cv_func_fnmatch_gnu != yes; then
-    gl_PREREQ_FNMATCH_EXTRA
     dnl We must choose a different name for our function, since on ELF systems
     dnl a broken fnmatch() in libc.so would override our fnmatch() if it is
     dnl compiled into a shared library.