mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
698be2d8e5
This fixes two issues on Windows: Update. https://sourceware.org/pipermail/gdb-patches/2020-June/169978.html gnulib/ChangeLog: 2020-08-26 Christian Biesinger <cbiesinger@google.com> Pedro Alves <palves@redhat.com> Joel Brobecker <brobecker@adacore.com> * Makefile.in: Regenerate. * aclocal.m4: Regenerate. * config.in: Regenerate. * configure: Regenerate. * import/Makefile.am: Update. * import/Makefile.in: Regenerate. * import/alloca.in.h (if): Update. * import/assure.h (affirm): Update. * import/at-func.c: Update. * import/attribute.h: New file. * import/btowc.c: New file. * import/canonicalize-lgpl.c: Update. * import/count-one-bits.h (COUNT_ONE_BITS_GENERIC): Update. (COUNT_ONE_BITS): Update. (intrinsic): Update. (__popcnt64): Update. (popcount_supported): Update. * import/ctype.in.h: New file. * import/dirent-private.h (WIN32_FIND_DATA): Update. * import/dirent.in.h (_GL_ATTRIBUTE_PURE): Update. * import/dirname.h: Update. * import/dosname.h: Remove. * import/error.h (_GL_ATTRIBUTE_FORMAT): Update. * import/extra/update-copyright: Update. * import/fchdir.c: Update. * import/fcntl.in.h (GNULIB_defined_rpl_fcntl): Update. (GNULIB_defined_fcntl): Update. * import/filename.h (HAS_DEVICE): Update. (IS_ABSOLUTE_PATH): Update. (IS_PATH_WITH_DIR): Update. (FILE_SYSTEM_PREFIX_LEN): Update. (_IS_DRIVE_LETTER): Update. (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE): Update. (IS_ABSOLUTE_FILE_NAME): Update. (IS_RELATIVE_FILE_NAME): Update. (IS_FILE_NAME_WITH_DIR): Update. * import/filenamecat-lgpl.c (mfile_name_concat): Update. * import/fnmatch.c (WIDE_CHAR_SUPPORT): Update. (btowc): Update. (iswctype): Update. (mempcpy): Update. (strnlen): Update. (towlower): Update. (wcscat): Update. (wcslen): Update. (wctype): Update. (wmemchr): Update. (wmempcpy): Update. (SIZE_MAX): Update. (isblank): Update. (__libc_use_alloca): Update. (alloca): Update. (alloca_account): Update. (STREQ): Update. (CHAR_CLASS_MAX_LENGTH): Update. (IS_CHAR_CLASS): Update. (ISWCTYPE): Update. (if): Update. (HANDLE_MULTIBYTE): Update. (internal_function): Update. (FOLD): Update. (CHAR): Update. (UCHAR): Update. (INT): Update. (FCT): Update. (EXT): Update. (END): Update. (L_): Update. (BTOWC): Update. (STRLEN): Update. (STRCAT): Update. (MEMPCPY): Update. (MEMCHR): Update. (WIDE_CHAR_VERSION): Update. (STRUCT): Update. (FINDIDX): Update. (findidx): Update. (ALLOCA_LIMIT): Update. (SHLIB_COMPAT): Update. * import/fnmatch_loop.c (struct STRUCT): Update. (FCT): Update. (EXT): Update. (END): Update. (str): Update. (NEW_PATTERN): Update. * import/getcwd.c: Update. * import/getlogin_r.c (GetUserName): Update. * import/getprogname.c (getprogname): Update. * import/getrandom.c: New file. * import/gettimeofday.c: Remove. * import/glob.in.h (_Restrict_): Update. * import/inttypes.in.h (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_FUNCDECL_SYS): Update. (_GL_CXXALIAS_SYS): Update. * import/isblank.c: New file. * import/isnanl-nolibm.h (__has_builtin): Update. * import/libc-config.h (versioned_symbol): Update. (compat_symbol): Update. * import/limits.in.h (_GL_ALREADY_INCLUDING_LIMITS_H): Update. * import/m4/btowc.m4: New file. * import/m4/ctype.m4: New file. * import/m4/exponentl.m4: Update. * import/m4/fnmatch.m4: Update. * import/m4/getrandom.m4: New file. * import/m4/glob.m4: Update. * import/m4/gnulib-cache.m4: Update. * import/m4/gnulib-common.m4: Update. * import/m4/gnulib-comp.m4: Update. * import/m4/inttypes.m4: Update. * import/m4/isblank.m4: New file. * import/m4/isnanl.m4: Update. * import/m4/largefile.m4: Update. * import/m4/mbtowc.m4: New file. * import/m4/memmem.m4: Update. * import/m4/minmax.m4: New file. * import/m4/signal_h.m4: Update. * import/m4/stdio_h.m4: Update. * import/m4/stdlib_h.m4: Update. * import/m4/string_h.m4: Update. * import/m4/strnlen.m4: New file. * import/m4/sys_random_h.m4: New file. * import/m4/sys_socket_h.m4: Update. * import/m4/sys_stat_h.m4: Update. * import/m4/time_h.m4: Update. * import/m4/unistd_h.m4: Update. * import/m4/wchar_h.m4: Update. * import/m4/wint_t.m4: Update. * import/m4/wmemchr.m4: New file. * import/m4/wmempcpy.m4: New file. * import/math.in.h (__has_builtin): Update. * import/mbrtowc.c (FALLTHROUGH): Update. * import/mbtowc-impl.h: New file. * import/mbtowc.c: New file. * import/minmax.h: New file. * import/open.c (open): Update. * import/openat-proc.c (openat_proc_name): Update. * import/openat.c (rpl_openat): Update. (openat_needs_fchdir): Update. * import/openat.h (FCHOWNAT_INLINE): Update. (CHOWNAT_INLINE): Update. (FCHMODAT_INLINE): Update. (CHMODAT_INLINE): Update. * import/opendir.c (WIN32_FIND_DATA): Update. (GetFullPathName): Update. (FindFirstFile): Update. * import/readdir.c (FindNextFile): Update. * import/rename.c (MoveFileEx): Update. * import/rewinddir.c (FindFirstFile): Update. * import/rmdir.c: Update. * import/signal.in.h (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_FUNCDECL_SYS): Update. (_GL_CXXALIAS_SYS): Update. * import/stat-w32.c (_WIN32_WINNT): Update. (LoadLibrary): Update. (GetFinalPathNameByHandle): Update. (GetProcAddress): Update. (DWORD): Update. (GetFileInformationByHandleExFunc): Update. (GetFinalPathNameByHandleFunc): Update. * import/stat.c (WIN32_FIND_DATA): Update. (CreateFile): Update. (FindFirstFile): Update. * import/stdio.in.h (_GL_ATTRIBUTE_FORMAT): Update. (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_FUNCDECL_SYS): Update. (_GL_CXXALIAS_SYS): Update. (_GL_FUNCDECL_RPL_1): Update. (_GL_CXXALIAS_RPL_1): Update. (_GL_CXXALIAS_SYS_CAST): Update. * import/stdlib.in.h (_GL_ATTRIBUTE_PURE): Update. (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_FUNCDECL_SYS): Update. (_GL_CXXALIAS_SYS): Update. * import/string.in.h (_GL_ATTRIBUTE_PURE): Update. (_GL_WARN_ON_USE): Update. (_GL_WARN_ON_USE_CXX): Update. (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_CXXALIAS_SYS): Update. (mbstok_r): Update. * import/strnlen.c: New file. * import/sys_random.in.h: New file. * import/sys_socket.in.h (GNULIB_defined_socklen_t): Update. (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_CXXALIAS_SYS_CAST): Update. * import/sys_stat.in.h (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_FUNCDECL_SYS): Update. (_GL_CXXALIAS_SYS): Update. (lchmod): Update. (_GL_CXXALIAS_RPL_1): Update. (stat): Update. * import/tempname.c (__set_errno): Update. (__secure_getenv): Update. (__try_tempname): Update. (__getpid): Update. (__gettimeofday): Update. (RANDOM_BITS): Update. (uint64_t): Update. (RANDOM_VALUE_MAX): Update. (BASE_62_DIGITS): Update. (BASE_62_POWER): Update. (try_tempname_len): Update. (try_file): Update. (try_dir): Update. (try_nocreate): Update. (gen_tempname_len): Update. (__gen_tempname): Update. (try_tempname): Update. * import/tempname.h (gen_tempname_len): Update. (try_tempname_len): Update. * import/time.in.h (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_CXXALIAS_SYS): Update. * import/unistd.in.h (if): Update. (_GL_FUNCDECL_SYS): Update. (_GL_CXXALIAS_SYS): Update. (_GL_CXXALIASWARN): Update. (_GL_WARN_ON_USE): Update. (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. * import/verify.h: Update. * import/warn-on-use.h (_GL_WARN_ON_USE_CXX): Update. * import/wchar.in.h (_GL_ATTRIBUTE_PURE): Update. (_GL_FUNCDECL_RPL): Update. (_GL_CXXALIAS_RPL): Update. (_GL_FUNCDECL_SYS): Update. (_GL_CXXALIAS_SYS): Update. (_GL_CXXALIASWARN): Update. (_GL_WARN_ON_USE): Update. (_GL_CXXALIAS_SYS_CAST2): Update. (_GL_CXXALIASWARN1): Update. * import/windows-rwlock.c (CreateEvent): Update. * import/wmemchr-impl.h: New file. * import/wmemchr.c: New file. * import/wmempcpy.c: New file. * update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add gettimeofday. (GNULIB_COMMIT_SHA1): Update gnulib revision.
356 lines
11 KiB
C
356 lines
11 KiB
C
/* Copyright (C) 1991-2020 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library 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.
|
|
|
|
The GNU C Library 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 the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef _LIBC
|
|
# include <libc-config.h>
|
|
#endif
|
|
|
|
/* Enable GNU extensions in fnmatch.h. */
|
|
#ifndef _GNU_SOURCE
|
|
# define _GNU_SOURCE 1
|
|
#endif
|
|
|
|
#include <fnmatch.h>
|
|
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#if defined _LIBC || HAVE_ALLOCA
|
|
# include <alloca.h>
|
|
#endif
|
|
#include <wchar.h>
|
|
#include <wctype.h>
|
|
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
|
|
/* 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/coll-lookup.h"
|
|
# include <shlib-compat.h>
|
|
|
|
# define CONCAT(a,b) __CONCAT(a,b)
|
|
# define btowc __btowc
|
|
# define iswctype __iswctype
|
|
# define mbsrtowcs __mbsrtowcs
|
|
# define mempcpy __mempcpy
|
|
# define strnlen __strnlen
|
|
# define towlower __towlower
|
|
# define wcscat __wcscat
|
|
# define wcslen __wcslen
|
|
# define wctype __wctype
|
|
# define wmemchr __wmemchr
|
|
# define wmempcpy __wmempcpy
|
|
# define fnmatch __fnmatch
|
|
extern int fnmatch (const char *pattern, const char *string, int flags);
|
|
#endif
|
|
|
|
#ifdef _LIBC
|
|
# if __GNUC__ < 7
|
|
# define FALLTHROUGH ((void) 0)
|
|
# else
|
|
# define FALLTHROUGH __attribute__ ((__fallthrough__))
|
|
# endif
|
|
#else
|
|
# include "attribute.h"
|
|
#endif
|
|
|
|
#include <intprops.h>
|
|
#include <flexmember.h>
|
|
|
|
/* 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))
|
|
|
|
#ifndef _LIBC
|
|
# if HAVE_ALLOCA
|
|
/* The OS usually guarantees only one guard page at the bottom of the stack,
|
|
and a page size can be as small as 4096 bytes. So we cannot safely
|
|
allocate anything larger than 4096 bytes. Also care for the possibility
|
|
of a few compiler-allocated temporary stack slots. */
|
|
# define __libc_use_alloca(n) ((n) < 4032)
|
|
# else
|
|
/* Just use malloc. */
|
|
# define __libc_use_alloca(n) false
|
|
# undef alloca
|
|
# define alloca(n) malloc (n)
|
|
# endif
|
|
# define alloca_account(size, avar) ((avar) += (size), alloca (size))
|
|
#endif
|
|
|
|
/* Provide support for user-defined character classes, based on the functions
|
|
from ISO C 90 amendment 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
|
|
|
|
#define IS_CHAR_CLASS(string) wctype (string)
|
|
|
|
/* Avoid depending on library functions or files
|
|
whose names are inconsistent. */
|
|
|
|
/* Global variable. */
|
|
static int posixly_correct;
|
|
|
|
/* Note that this evaluates C many times. */
|
|
#define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
|
|
#define CHAR char
|
|
#define UCHAR unsigned char
|
|
#define INT int
|
|
#define FCT internal_fnmatch
|
|
#define EXT ext_match
|
|
#define END end_pattern
|
|
#define STRUCT fnmatch_struct
|
|
#define L_(CS) CS
|
|
#define BTOWC(C) btowc (C)
|
|
#define STRLEN(S) strlen (S)
|
|
#define STRCAT(D, S) strcat (D, S)
|
|
#define MEMPCPY(D, S, N) mempcpy (D, S, N)
|
|
#define MEMCHR(S, C, N) memchr (S, C, N)
|
|
#define WIDE_CHAR_VERSION 0
|
|
#ifdef _LIBC
|
|
# include <locale/weight.h>
|
|
# define FINDIDX findidx
|
|
#endif
|
|
#include "fnmatch_loop.c"
|
|
|
|
|
|
#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)
|
|
#define STRLEN(S) wcslen (S)
|
|
#define STRCAT(D, S) wcscat (D, S)
|
|
#define MEMPCPY(D, S, N) wmempcpy (D, S, N)
|
|
#define MEMCHR(S, C, N) wmemchr (S, C, N)
|
|
#define WIDE_CHAR_VERSION 1
|
|
#ifdef _LIBC
|
|
/* Change the name the header defines so it doesn't conflict with
|
|
the <locale/weight.h> version included above. */
|
|
# define findidx findidxwc
|
|
# include <locale/weightwc.h>
|
|
# undef findidx
|
|
# define FINDIDX findidxwc
|
|
#endif
|
|
|
|
#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)
|
|
{
|
|
char s[CHAR_CLASS_MAX_LENGTH + 1];
|
|
char *cp = s;
|
|
|
|
do
|
|
{
|
|
/* 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 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
|
|
|
|
/* Avoid overrunning the buffer. */
|
|
if (cp == s + CHAR_CLASS_MAX_LENGTH)
|
|
return (wctype_t) 0;
|
|
|
|
*cp++ = (char) *wcs++;
|
|
}
|
|
while (*wcs != L'\0');
|
|
|
|
*cp = '\0';
|
|
|
|
return wctype (s);
|
|
}
|
|
#define IS_CHAR_CLASS(string) is_char_class (string)
|
|
|
|
#include "fnmatch_loop.c"
|
|
|
|
|
|
int
|
|
fnmatch (const char *pattern, const char *string, int flags)
|
|
{
|
|
if (__glibc_unlikely (MB_CUR_MAX != 1))
|
|
{
|
|
mbstate_t ps;
|
|
size_t n;
|
|
const char *p;
|
|
wchar_t *wpattern_malloc = NULL;
|
|
wchar_t *wpattern;
|
|
wchar_t *wstring_malloc = NULL;
|
|
wchar_t *wstring;
|
|
size_t alloca_used = 0;
|
|
|
|
/* Convert the strings into wide characters. */
|
|
memset (&ps, '\0', sizeof (ps));
|
|
p = pattern;
|
|
n = strnlen (pattern, 1024);
|
|
if (__glibc_likely (n < 1024))
|
|
{
|
|
wpattern = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
|
|
alloca_used);
|
|
n = mbsrtowcs (wpattern, &p, n + 1, &ps);
|
|
if (__glibc_unlikely (n == (size_t) -1))
|
|
/* Something wrong.
|
|
XXX Do we have to set 'errno' to something which mbsrtows hasn't
|
|
already done? */
|
|
return -1;
|
|
if (p)
|
|
{
|
|
memset (&ps, '\0', sizeof (ps));
|
|
goto prepare_wpattern;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
prepare_wpattern:
|
|
n = mbsrtowcs (NULL, &pattern, 0, &ps);
|
|
if (__glibc_unlikely (n == (size_t) -1))
|
|
/* Something wrong.
|
|
XXX Do we have to set 'errno' to something which mbsrtows hasn't
|
|
already done? */
|
|
return -1;
|
|
if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t)))
|
|
{
|
|
__set_errno (ENOMEM);
|
|
return -2;
|
|
}
|
|
wpattern_malloc = wpattern
|
|
= (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
|
|
assert (mbsinit (&ps));
|
|
if (wpattern == NULL)
|
|
return -2;
|
|
(void) mbsrtowcs (wpattern, &pattern, n + 1, &ps);
|
|
}
|
|
|
|
assert (mbsinit (&ps));
|
|
n = strnlen (string, 1024);
|
|
p = string;
|
|
if (__glibc_likely (n < 1024))
|
|
{
|
|
wstring = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
|
|
alloca_used);
|
|
n = mbsrtowcs (wstring, &p, n + 1, &ps);
|
|
if (__glibc_unlikely (n == (size_t) -1))
|
|
{
|
|
/* Something wrong.
|
|
XXX Do we have to set 'errno' to something which
|
|
mbsrtows hasn't already done? */
|
|
free_return:
|
|
free (wpattern_malloc);
|
|
return -1;
|
|
}
|
|
if (p)
|
|
{
|
|
memset (&ps, '\0', sizeof (ps));
|
|
goto prepare_wstring;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
prepare_wstring:
|
|
n = mbsrtowcs (NULL, &string, 0, &ps);
|
|
if (__glibc_unlikely (n == (size_t) -1))
|
|
/* Something wrong.
|
|
XXX Do we have to set 'errno' to something which mbsrtows hasn't
|
|
already done? */
|
|
goto free_return;
|
|
if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t)))
|
|
{
|
|
free (wpattern_malloc);
|
|
__set_errno (ENOMEM);
|
|
return -2;
|
|
}
|
|
|
|
wstring_malloc = wstring
|
|
= (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
|
|
if (wstring == NULL)
|
|
{
|
|
free (wpattern_malloc);
|
|
return -2;
|
|
}
|
|
assert (mbsinit (&ps));
|
|
(void) mbsrtowcs (wstring, &string, n + 1, &ps);
|
|
}
|
|
|
|
int res = internal_fnwmatch (wpattern, wstring, wstring + n,
|
|
flags & FNM_PERIOD, flags, NULL,
|
|
alloca_used);
|
|
|
|
free (wstring_malloc);
|
|
free (wpattern_malloc);
|
|
|
|
return res;
|
|
}
|
|
|
|
return internal_fnmatch (pattern, string, string + strlen (string),
|
|
flags & FNM_PERIOD, flags, NULL, 0);
|
|
}
|
|
|
|
#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)
|