Blame posix/fnmatch.c

Packit 6c4009
/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#if HAVE_CONFIG_H
Packit 6c4009
# include <config.h>
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Enable GNU extensions in fnmatch.h.  */
Packit 6c4009
#ifndef _GNU_SOURCE
Packit 6c4009
# define _GNU_SOURCE	1
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#include <assert.h>
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <fnmatch.h>
Packit 6c4009
#include <ctype.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
Packit 6c4009
#if defined STDC_HEADERS || defined _LIBC
Packit 6c4009
# include <stdlib.h>
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#ifdef _LIBC
Packit 6c4009
# include <alloca.h>
Packit 6c4009
#else
Packit 6c4009
# define alloca_account(size., var) alloca (size)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* For platform which support the ISO C amendement 1 functionality we
Packit 6c4009
   support user defined character classes.  */
Packit 6c4009
#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
Packit 6c4009
/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
Packit 6c4009
# include <wchar.h>
Packit 6c4009
# include <wctype.h>
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* We need some of the locale data (the collation sequence information)
Packit 6c4009
   but there is no interface to get this information in general.  Therefore
Packit 6c4009
   we support a correct implementation only in glibc.  */
Packit 6c4009
#ifdef _LIBC
Packit 6c4009
# include "../locale/localeinfo.h"
Packit 6c4009
# include "../locale/elem-hash.h"
Packit 6c4009
# include "../locale/coll-lookup.h"
Packit 6c4009
# include <shlib-compat.h>
Packit 6c4009
Packit 6c4009
# define CONCAT(a,b) __CONCAT(a,b)
Packit 6c4009
# define mbsrtowcs __mbsrtowcs
Packit 6c4009
# define fnmatch __fnmatch
Packit 6c4009
extern int fnmatch (const char *pattern, const char *string, int flags);
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* We often have to test for FNM_FILE_NAME and FNM_PERIOD being both set.  */
Packit 6c4009
#define NO_LEADING_PERIOD(flags) \
Packit 6c4009
  ((flags & (FNM_FILE_NAME | FNM_PERIOD)) == (FNM_FILE_NAME | FNM_PERIOD))
Packit 6c4009
Packit 6c4009
/* Comment out all this code if we are using the GNU C Library, and are not
Packit 6c4009
   actually compiling the library itself.  This code is part of the GNU C
Packit 6c4009
   Library, but also included in many other GNU distributions.  Compiling
Packit 6c4009
   and linking in this code is a waste when using the GNU C library
Packit 6c4009
   (especially if it is a shared library).  Rather than having every GNU
Packit 6c4009
   program understand `configure --with-gnu-libc' and omit the object files,
Packit 6c4009
   it is simpler to just do this in the source for each such file.  */
Packit 6c4009
Packit 6c4009
#if defined _LIBC || !defined __GNU_LIBRARY__
Packit 6c4009
Packit 6c4009
Packit 6c4009
# if defined STDC_HEADERS || !defined isascii
Packit 6c4009
#  define ISASCII(c) 1
Packit 6c4009
# else
Packit 6c4009
#  define ISASCII(c) isascii(c)
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
# ifdef isblank
Packit 6c4009
#  define ISBLANK(c) (ISASCII (c) && isblank (c))
Packit 6c4009
# else
Packit 6c4009
#  define ISBLANK(c) ((c) == ' ' || (c) == '\t')
Packit 6c4009
# endif
Packit 6c4009
# ifdef isgraph
Packit 6c4009
#  define ISGRAPH(c) (ISASCII (c) && isgraph (c))
Packit 6c4009
# else
Packit 6c4009
#  define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
# define ISPRINT(c) (ISASCII (c) && isprint (c))
Packit 6c4009
# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
Packit 6c4009
# define ISALNUM(c) (ISASCII (c) && isalnum (c))
Packit 6c4009
# define ISALPHA(c) (ISASCII (c) && isalpha (c))
Packit 6c4009
# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
Packit 6c4009
# define ISLOWER(c) (ISASCII (c) && islower (c))
Packit 6c4009
# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
Packit 6c4009
# define ISSPACE(c) (ISASCII (c) && isspace (c))
Packit 6c4009
# define ISUPPER(c) (ISASCII (c) && isupper (c))
Packit 6c4009
# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
Packit 6c4009
Packit 6c4009
# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
Packit 6c4009
Packit 6c4009
# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
Packit 6c4009
/* The GNU C library provides support for user-defined character classes
Packit 6c4009
   and the functions from ISO C amendement 1.  */
Packit 6c4009
#  ifdef CHARCLASS_NAME_MAX
Packit 6c4009
#   define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
Packit 6c4009
#  else
Packit 6c4009
/* This shouldn't happen but some implementation might still have this
Packit 6c4009
   problem.  Use a reasonable default value.  */
Packit 6c4009
#   define CHAR_CLASS_MAX_LENGTH 256
Packit 6c4009
#  endif
Packit 6c4009
Packit 6c4009
#  ifdef _LIBC
Packit 6c4009
#   define IS_CHAR_CLASS(string) __wctype (string)
Packit 6c4009
#  else
Packit 6c4009
#   define IS_CHAR_CLASS(string) wctype (string)
Packit 6c4009
#  endif
Packit 6c4009
Packit 6c4009
#  ifdef _LIBC
Packit 6c4009
#   define ISWCTYPE(WC, WT)	__iswctype (WC, WT)
Packit 6c4009
#  else
Packit 6c4009
#   define ISWCTYPE(WC, WT)	iswctype (WC, WT)
Packit 6c4009
#  endif
Packit 6c4009
Packit 6c4009
#  if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC
Packit 6c4009
/* In this case we are implementing the multibyte character handling.  */
Packit 6c4009
#   define HANDLE_MULTIBYTE	1
Packit 6c4009
#  endif
Packit 6c4009
Packit 6c4009
# else
Packit 6c4009
#  define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
Packit 6c4009
Packit 6c4009
#  define IS_CHAR_CLASS(string)						      \
Packit 6c4009
   (STREQ (string, "alpha") || STREQ (string, "upper")			      \
Packit 6c4009
    || STREQ (string, "lower") || STREQ (string, "digit")		      \
Packit 6c4009
    || STREQ (string, "alnum") || STREQ (string, "xdigit")		      \
Packit 6c4009
    || STREQ (string, "space") || STREQ (string, "print")		      \
Packit 6c4009
    || STREQ (string, "punct") || STREQ (string, "graph")		      \
Packit 6c4009
    || STREQ (string, "cntrl") || STREQ (string, "blank"))
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
/* Avoid depending on library functions or files
Packit 6c4009
   whose names are inconsistent.  */
Packit 6c4009
Packit 6c4009
# if !defined _LIBC && !defined getenv
Packit 6c4009
extern char *getenv ();
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
# ifndef errno
Packit 6c4009
extern int errno;
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
/* Global variable.  */
Packit 6c4009
static int posixly_correct;
Packit 6c4009
Packit 6c4009
/* This function doesn't exist on most systems.  */
Packit 6c4009
Packit 6c4009
# if !defined HAVE___STRCHRNUL && !defined _LIBC
Packit 6c4009
static char *
Packit 6c4009
__strchrnul (const char *s, int c)
Packit 6c4009
{
Packit 6c4009
  char *result = strchr (s, c);
Packit 6c4009
  if (result == NULL)
Packit 6c4009
    result = strchr (s, '\0');
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
# if HANDLE_MULTIBYTE && !defined HAVE___STRCHRNUL && !defined _LIBC
Packit 6c4009
static wchar_t *
Packit 6c4009
__wcschrnul (const wchar_t *s, wint_t c)
Packit 6c4009
{
Packit 6c4009
  wchar_t *result = wcschr (s, c);
Packit 6c4009
  if (result == NULL)
Packit 6c4009
    result = wcschr (s, '\0');
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
/* Note that this evaluates C many times.  */
Packit 6c4009
# ifdef _LIBC
Packit 6c4009
#  define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
Packit 6c4009
# else
Packit 6c4009
#  define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
Packit 6c4009
# endif
Packit 6c4009
# define CHAR	char
Packit 6c4009
# define UCHAR	unsigned char
Packit 6c4009
# define INT	int
Packit 6c4009
# define FCT	internal_fnmatch
Packit 6c4009
# define EXT	ext_match
Packit 6c4009
# define END	end_pattern
Packit 6c4009
# define STRUCT	fnmatch_struct
Packit 6c4009
# define L(CS)	CS
Packit 6c4009
# ifdef _LIBC
Packit 6c4009
#  define BTOWC(C)	__btowc (C)
Packit 6c4009
# else
Packit 6c4009
#  define BTOWC(C)	btowc (C)
Packit 6c4009
# endif
Packit 6c4009
# define STRLEN(S) strlen (S)
Packit 6c4009
# define STRCAT(D, S) strcat (D, S)
Packit 6c4009
# define MEMPCPY(D, S, N) __mempcpy (D, S, N)
Packit 6c4009
# define MEMCHR(S, C, N) memchr (S, C, N)
Packit 6c4009
# define STRCOLL(S1, S2) strcoll (S1, S2)
Packit 6c4009
# define WIDE_CHAR_VERSION 0
Packit 6c4009
# include <locale/weight.h>
Packit 6c4009
# define FINDIDX findidx
Packit 6c4009
# include "fnmatch_loop.c"
Packit 6c4009
Packit 6c4009
Packit 6c4009
# if HANDLE_MULTIBYTE
Packit 6c4009
/* Note that this evaluates C many times.  */
Packit 6c4009
#  ifdef _LIBC
Packit 6c4009
#   define FOLD(c) ((flags & FNM_CASEFOLD) ? __towlower (c) : (c))
Packit 6c4009
#  else
Packit 6c4009
#   define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? towlower (c) : (c))
Packit 6c4009
#  endif
Packit 6c4009
#  define CHAR	wchar_t
Packit 6c4009
#  define UCHAR	wint_t
Packit 6c4009
#  define INT	wint_t
Packit 6c4009
#  define FCT	internal_fnwmatch
Packit 6c4009
#  define EXT	ext_wmatch
Packit 6c4009
#  define END	end_wpattern
Packit 6c4009
#  define STRUCT fnwmatch_struct
Packit 6c4009
#  define L(CS)	L##CS
Packit 6c4009
#  define BTOWC(C)	(C)
Packit 6c4009
#  define STRLEN(S) __wcslen (S)
Packit 6c4009
#  define STRCAT(D, S) __wcscat (D, S)
Packit 6c4009
#  define MEMPCPY(D, S, N) __wmempcpy (D, S, N)
Packit 6c4009
#  define MEMCHR(S, C, N) __wmemchr (S, C, N)
Packit 6c4009
#  define STRCOLL(S1, S2) wcscoll (S1, S2)
Packit 6c4009
#  define WIDE_CHAR_VERSION 1
Packit 6c4009
/* Change the name the header defines so it doesn't conflict with
Packit 6c4009
   the <locale/weight.h> version included above.  */
Packit 6c4009
#  define findidx findidxwc
Packit 6c4009
#  include <locale/weightwc.h>
Packit 6c4009
#  undef findidx
Packit 6c4009
#  define FINDIDX findidxwc
Packit 6c4009
Packit 6c4009
#  undef IS_CHAR_CLASS
Packit 6c4009
/* We have to convert the wide character string in a multibyte string.  But
Packit 6c4009
   we know that the character class names consist of alphanumeric characters
Packit 6c4009
   from the portable character set, and since the wide character encoding
Packit 6c4009
   for a member of the portable character set is the same code point as
Packit 6c4009
   its single-byte encoding, we can use a simplified method to convert the
Packit 6c4009
   string to a multibyte character string.  */
Packit 6c4009
static wctype_t
Packit 6c4009
is_char_class (const wchar_t *wcs)
Packit 6c4009
{
Packit 6c4009
  char s[CHAR_CLASS_MAX_LENGTH + 1];
Packit 6c4009
  char *cp = s;
Packit 6c4009
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      /* Test for a printable character from the portable character set.  */
Packit 6c4009
#  ifdef _LIBC
Packit 6c4009
      if (*wcs < 0x20 || *wcs > 0x7e
Packit 6c4009
	  || *wcs == 0x24 || *wcs == 0x40 || *wcs == 0x60)
Packit 6c4009
	return (wctype_t) 0;
Packit 6c4009
#  else
Packit 6c4009
      switch (*wcs)
Packit 6c4009
	{
Packit 6c4009
	case L' ': case L'!': case L'"': case L'#': case L'%':
Packit 6c4009
	case L'&': case L'\'': case L'(': case L')': case L'*':
Packit 6c4009
	case L'+': case L',': case L'-': case L'.': case L'/':
Packit 6c4009
	case L'0': case L'1': case L'2': case L'3': case L'4':
Packit 6c4009
	case L'5': case L'6': case L'7': case L'8': case L'9':
Packit 6c4009
	case L':': case L';': case L'<': case L'=': case L'>':
Packit 6c4009
	case L'?':
Packit 6c4009
	case L'A': case L'B': case L'C': case L'D': case L'E':
Packit 6c4009
	case L'F': case L'G': case L'H': case L'I': case L'J':
Packit 6c4009
	case L'K': case L'L': case L'M': case L'N': case L'O':
Packit 6c4009
	case L'P': case L'Q': case L'R': case L'S': case L'T':
Packit 6c4009
	case L'U': case L'V': case L'W': case L'X': case L'Y':
Packit 6c4009
	case L'Z':
Packit 6c4009
	case L'[': case L'\\': case L']': case L'^': case L'_':
Packit 6c4009
	case L'a': case L'b': case L'c': case L'd': case L'e':
Packit 6c4009
	case L'f': case L'g': case L'h': case L'i': case L'j':
Packit 6c4009
	case L'k': case L'l': case L'm': case L'n': case L'o':
Packit 6c4009
	case L'p': case L'q': case L'r': case L's': case L't':
Packit 6c4009
	case L'u': case L'v': case L'w': case L'x': case L'y':
Packit 6c4009
	case L'z': case L'{': case L'|': case L'}': case L'~':
Packit 6c4009
	  break;
Packit 6c4009
	default:
Packit 6c4009
	  return (wctype_t) 0;
Packit 6c4009
	}
Packit 6c4009
#  endif
Packit 6c4009
Packit 6c4009
      /* Avoid overrunning the buffer.  */
Packit 6c4009
      if (cp == s + CHAR_CLASS_MAX_LENGTH)
Packit 6c4009
	return (wctype_t) 0;
Packit 6c4009
Packit 6c4009
      *cp++ = (char) *wcs++;
Packit 6c4009
    }
Packit 6c4009
  while (*wcs != L'\0');
Packit 6c4009
Packit 6c4009
  *cp = '\0';
Packit 6c4009
Packit 6c4009
#  ifdef _LIBC
Packit 6c4009
  return __wctype (s);
Packit 6c4009
#  else
Packit 6c4009
  return wctype (s);
Packit 6c4009
#  endif
Packit 6c4009
}
Packit 6c4009
#  define IS_CHAR_CLASS(string) is_char_class (string)
Packit 6c4009
Packit 6c4009
#  include "fnmatch_loop.c"
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
fnmatch (const char *pattern, const char *string, int flags)
Packit 6c4009
{
Packit 6c4009
# if HANDLE_MULTIBYTE
Packit 6c4009
  if (__builtin_expect (MB_CUR_MAX, 1) != 1)
Packit 6c4009
    {
Packit Service d210f5
      const char *orig_pattern = pattern;
Packit 6c4009
      mbstate_t ps;
Packit 6c4009
      size_t n;
Packit 6c4009
      const char *p;
Packit 6c4009
      wchar_t *wpattern_malloc = NULL;
Packit 6c4009
      wchar_t *wpattern;
Packit 6c4009
      wchar_t *wstring_malloc = NULL;
Packit 6c4009
      wchar_t *wstring;
Packit 6c4009
      size_t alloca_used = 0;
Packit 6c4009
Packit 6c4009
      /* Convert the strings into wide characters.  */
Packit 6c4009
      memset (&ps, '\0', sizeof (ps));
Packit 6c4009
      p = pattern;
Packit 6c4009
#ifdef _LIBC
Packit 6c4009
      n = __strnlen (pattern, 1024);
Packit 6c4009
#else
Packit 6c4009
      n = strlen (pattern);
Packit 6c4009
#endif
Packit 6c4009
      if (__glibc_likely (n < 1024))
Packit 6c4009
	{
Packit 6c4009
	  wpattern = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
Packit 6c4009
						 alloca_used);
Packit 6c4009
	  n = mbsrtowcs (wpattern, &p, n + 1, &ps);
Packit 6c4009
	  if (__glibc_unlikely (n == (size_t) -1))
Packit Service d210f5
	    /* Something wrong: Fall back to single byte matching. */
Packit Service d210f5
	    goto try_singlebyte;
Packit 6c4009
	  if (p)
Packit 6c4009
	    {
Packit 6c4009
	      memset (&ps, '\0', sizeof (ps));
Packit 6c4009
	      goto prepare_wpattern;
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
      else
Packit 6c4009
	{
Packit 6c4009
	prepare_wpattern:
Packit 6c4009
	  n = mbsrtowcs (NULL, &pattern, 0, &ps);
Packit 6c4009
	  if (__glibc_unlikely (n == (size_t) -1))
Packit Service d210f5
	    /*Something wrong: Fall back to single byte matching. */
Packit Service d210f5
	    goto try_singlebyte;
Packit 6c4009
	  if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t)))
Packit 6c4009
	    {
Packit 6c4009
	      __set_errno (ENOMEM);
Packit 6c4009
	      return -2;
Packit 6c4009
	    }
Packit 6c4009
	  wpattern_malloc = wpattern
Packit 6c4009
	    = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
Packit 6c4009
	  assert (mbsinit (&ps);;
Packit 6c4009
	  if (wpattern == NULL)
Packit 6c4009
	    return -2;
Packit 6c4009
	  (void) mbsrtowcs (wpattern, &pattern, n + 1, &ps);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      assert (mbsinit (&ps);;
Packit 6c4009
#ifdef _LIBC
Packit 6c4009
      n = __strnlen (string, 1024);
Packit 6c4009
#else
Packit 6c4009
      n = strlen (string);
Packit 6c4009
#endif
Packit 6c4009
      p = string;
Packit 6c4009
      if (__glibc_likely (n < 1024))
Packit 6c4009
	{
Packit 6c4009
	  wstring = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
Packit 6c4009
						alloca_used);
Packit 6c4009
	  n = mbsrtowcs (wstring, &p, n + 1, &ps);
Packit 6c4009
	  if (__glibc_unlikely (n == (size_t) -1))
Packit Service d210f5
	    /* Something wrong: Fall back to single byte matching. */
Packit Service d210f5
	    goto free_and_try_singlebyte;
Packit 6c4009
	  if (p)
Packit 6c4009
	    {
Packit 6c4009
	      memset (&ps, '\0', sizeof (ps));
Packit 6c4009
	      goto prepare_wstring;
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
      else
Packit 6c4009
	{
Packit 6c4009
	prepare_wstring:
Packit 6c4009
	  n = mbsrtowcs (NULL, &string, 0, &ps);
Packit 6c4009
	  if (__glibc_unlikely (n == (size_t) -1))
Packit Service d210f5
	    /* Something wrong: Fall back to singlebyte matching. */
Packit Service d210f5
	    goto free_and_try_singlebyte;
Packit 6c4009
	  if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t)))
Packit 6c4009
	    {
Packit 6c4009
	      free (wpattern_malloc);
Packit 6c4009
	      __set_errno (ENOMEM);
Packit 6c4009
	      return -2;
Packit 6c4009
	    }
Packit 6c4009
Packit 6c4009
	  wstring_malloc = wstring
Packit 6c4009
	    = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
Packit 6c4009
	  if (wstring == NULL)
Packit 6c4009
	    {
Packit 6c4009
	      free (wpattern_malloc);
Packit 6c4009
	      return -2;
Packit 6c4009
	    }
Packit 6c4009
	  assert (mbsinit (&ps);;
Packit 6c4009
	  (void) mbsrtowcs (wstring, &string, n + 1, &ps);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      int res = internal_fnwmatch (wpattern, wstring, wstring + n,
Packit 6c4009
				   flags & FNM_PERIOD, flags, NULL,
Packit 6c4009
				   alloca_used);
Packit 6c4009
Packit 6c4009
      free (wstring_malloc);
Packit 6c4009
      free (wpattern_malloc);
Packit 6c4009
Packit 6c4009
      return res;
Packit Service d210f5
      free_and_try_singlebyte:
Packit Service d210f5
	free(wpattern_malloc);
Packit Service d210f5
      try_singlebyte:
Packit Service d210f5
	pattern = orig_pattern;
Packit 6c4009
    }
Packit 6c4009
# endif  /* mbstate_t and mbsrtowcs or _LIBC.  */
Packit 6c4009
Packit 6c4009
  return internal_fnmatch (pattern, string, string + strlen (string),
Packit 6c4009
			   flags & FNM_PERIOD, flags, NULL, 0);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
# ifdef _LIBC
Packit 6c4009
#  undef fnmatch
Packit 6c4009
versioned_symbol (libc, __fnmatch, fnmatch, GLIBC_2_2_3);
Packit 6c4009
#  if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_3)
Packit 6c4009
strong_alias (__fnmatch, __fnmatch_old)
Packit 6c4009
compat_symbol (libc, __fnmatch_old, fnmatch, GLIBC_2_0);
Packit 6c4009
#  endif
Packit 6c4009
libc_hidden_ver (__fnmatch, fnmatch)
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
#endif	/* _LIBC or not __GNU_LIBRARY__.  */