27 # define _GNU_SOURCE 1
44 #if defined _LIBC || !defined __GNU_LIBRARY__
47 # if defined STDC_HEADERS || !defined isascii
50 # define ISASCII(c) isascii(c)
53 # define ISUPPER(c) (ISASCII (c) && isupper (c))
63 fnmatch (
const char *pattern,
const char *
string,
int flags)
65 register const char *p = pattern, *n = string;
69 # define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
71 while ((
c = *p++) !=
'\0')
80 else if ((flags & FNM_FILE_NAME) && *n ==
'/')
82 else if ((flags & FNM_PERIOD) && *n ==
'.' &&
83 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
88 if (!(flags & FNM_NOESCAPE))
101 if ((flags & FNM_PERIOD) && *n ==
'.' &&
102 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
105 for (
c = *p++;
c ==
'?' ||
c ==
'*';
c = *p++)
107 if ((flags & FNM_FILE_NAME) && *n ==
'/')
128 char c1 = (!(flags & FNM_NOESCAPE) &&
c ==
'\\') ? *p :
c;
130 for (--p; *n !=
'\0'; ++n)
131 if ((
c ==
'[' || FOLD (*n) == c1) &&
132 fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
145 if ((flags & FNM_PERIOD) && *n ==
'.' &&
146 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
149 not = (*p ==
'!' || *p ==
'^');
156 register char cstart =
c, cend =
c;
158 if (!(flags & FNM_NOESCAPE) &&
c ==
'\\')
162 cstart = cend = *p++;
165 cstart = cend = FOLD (cstart);
174 if ((flags & FNM_FILE_NAME) &&
c ==
'/')
178 if (
c ==
'-' && *p !=
']')
181 if (!(flags & FNM_NOESCAPE) && cend ==
'\\')
190 if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
209 if (!(flags & FNM_NOESCAPE) &&
c ==
'\\')
233 if ((flags & FNM_LEADING_DIR) && *n ==
'/')