|
@@ -1,219 +0,0 @@
|
|
|
-
|
|
|
-
|
|
|
-This library is free software; you can redistribute it and/or
|
|
|
-modify it under the terms of the GNU Library General Public License as
|
|
|
-published by the Free Software Foundation; either version 2 of the
|
|
|
-License, or (at your option) any later version.
|
|
|
-
|
|
|
-This 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
|
|
|
-Library General Public License for more details.
|
|
|
-
|
|
|
-You should have received a copy of the GNU Library General Public
|
|
|
-License along with this library; see the file COPYING.LIB. If
|
|
|
-not, see <http:
|
|
|
-
|
|
|
-#ifdef HAVE_CONFIG_H
|
|
|
-# include <config.h>
|
|
|
-#endif
|
|
|
-
|
|
|
-#include <errno.h>
|
|
|
-#include <fnmatch.h>
|
|
|
-#include <ctype.h>
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- actually compiling the library itself. 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__)
|
|
|
-
|
|
|
-
|
|
|
-# if defined (STDC_HEADERS) || !defined (isascii)
|
|
|
-# define ISASCII(c) 1
|
|
|
-# else
|
|
|
-# define ISASCII(c) isascii(c)
|
|
|
-# endif
|
|
|
-
|
|
|
-# define ISUPPER(c) (ISASCII (c) && isupper (c))
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- it matches, nonzero if not. */
|
|
|
-int fnmatch(const char *pattern, const char *string, int flags)
|
|
|
-{
|
|
|
- register const char *p = pattern, *n = string;
|
|
|
- register char c;
|
|
|
-
|
|
|
-
|
|
|
-# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
|
|
|
-
|
|
|
- while ((c = *p++) != '\0') {
|
|
|
- c = FOLD(c);
|
|
|
-
|
|
|
- switch (c) {
|
|
|
- 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;
|
|
|
- break;
|
|
|
-
|
|
|
- case '\\':
|
|
|
- if (!(flags & FNM_NOESCAPE)) {
|
|
|
- c = *p++;
|
|
|
- if (c == '\0')
|
|
|
-
|
|
|
- return FNM_NOMATCH;
|
|
|
- c = FOLD(c);
|
|
|
- }
|
|
|
- if (FOLD(*n) != c)
|
|
|
- return FNM_NOMATCH;
|
|
|
- break;
|
|
|
-
|
|
|
- case '*':
|
|
|
- if ((flags & FNM_PERIOD) && *n == '.' &&
|
|
|
- (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
|
|
|
- return FNM_NOMATCH;
|
|
|
-
|
|
|
- for (c = *p++; c == '?' || c == '*'; c = *p++) {
|
|
|
- if ((flags & FNM_FILE_NAME) && *n == '/')
|
|
|
-
|
|
|
- return FNM_NOMATCH;
|
|
|
- else if (c == '?') {
|
|
|
-
|
|
|
- if (*n == '\0')
|
|
|
-
|
|
|
- return FNM_NOMATCH;
|
|
|
- else
|
|
|
-
|
|
|
- this ? wildcard, so *??? won't match if there are
|
|
|
- less than three characters. */
|
|
|
- ++n;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (c == '\0')
|
|
|
- return 0;
|
|
|
-
|
|
|
- {
|
|
|
- char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
|
|
|
-
|
|
|
- c1 = FOLD(c1);
|
|
|
- for (--p; *n != '\0'; ++n)
|
|
|
- if ((c == '[' || FOLD(*n) == c1) &&
|
|
|
- fnmatch(p, n, flags & ~FNM_PERIOD) == 0)
|
|
|
- return 0;
|
|
|
- return FNM_NOMATCH;
|
|
|
- }
|
|
|
-
|
|
|
- case '[':
|
|
|
- {
|
|
|
-
|
|
|
- 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++;
|
|
|
- }
|
|
|
-
|
|
|
- cstart = cend = FOLD(cstart);
|
|
|
-
|
|
|
- if (c == '\0')
|
|
|
-
|
|
|
- return FNM_NOMATCH;
|
|
|
-
|
|
|
- c = *p++;
|
|
|
- c = FOLD(c);
|
|
|
-
|
|
|
- if ((flags & FNM_FILE_NAME) && c == '/')
|
|
|
-
|
|
|
- return FNM_NOMATCH;
|
|
|
-
|
|
|
- if (c == '-' && *p != ']') {
|
|
|
- cend = *p++;
|
|
|
- if (!(flags & FNM_NOESCAPE) && cend == '\\')
|
|
|
- cend = *p++;
|
|
|
- if (cend == '\0')
|
|
|
- return FNM_NOMATCH;
|
|
|
- cend = FOLD(cend);
|
|
|
-
|
|
|
- c = *p++;
|
|
|
- }
|
|
|
-
|
|
|
- if (FOLD(*n) >= cstart && FOLD(*n) <= cend)
|
|
|
- goto matched;
|
|
|
-
|
|
|
- if (c == ']')
|
|
|
- break;
|
|
|
- }
|
|
|
- if (!not)
|
|
|
- return FNM_NOMATCH;
|
|
|
- break;
|
|
|
-
|
|
|
- matched:;
|
|
|
-
|
|
|
- while (c != ']') {
|
|
|
- if (c == '\0')
|
|
|
-
|
|
|
- return FNM_NOMATCH;
|
|
|
-
|
|
|
- c = *p++;
|
|
|
- if (!(flags & FNM_NOESCAPE) && c == '\\') {
|
|
|
- if (*p == '\0')
|
|
|
- return FNM_NOMATCH;
|
|
|
-
|
|
|
- ++p;
|
|
|
- }
|
|
|
- }
|
|
|
- if (not)
|
|
|
- return FNM_NOMATCH;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- if (c != FOLD(*n))
|
|
|
- return FNM_NOMATCH;
|
|
|
- }
|
|
|
-
|
|
|
- ++n;
|
|
|
- }
|
|
|
-
|
|
|
- if (*n == '\0')
|
|
|
- return 0;
|
|
|
-
|
|
|
- if ((flags & FNM_LEADING_DIR) && *n == '/')
|
|
|
-
|
|
|
- return 0;
|
|
|
-
|
|
|
- return FNM_NOMATCH;
|
|
|
-
|
|
|
-# undef FOLD
|
|
|
-}
|
|
|
-libc_hidden_def(fnmatch)
|
|
|
-#endif
|