14 # define _GNU_SOURCE 1
31 #if defined _LIBC || !defined __GNU_LIBRARY__
34 # if defined STDC_HEADERS || !defined isascii
37 # define ISASCII(c) isascii(c)
40 # define ISUPPER(c) (ISASCII (c) && isupper (c))
50 fnmatch (
const char *pattern,
const char *
string,
int flags)
52 register const char *p = pattern, *n =
string;
56 # define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
58 while ((
c = *p++) !=
'\0')
67 else if ((flags & FNM_FILE_NAME) && *n ==
'/')
69 else if ((flags & FNM_PERIOD) && *n ==
'.' &&
70 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
75 if (!(flags & FNM_NOESCAPE))
88 if ((flags & FNM_PERIOD) && *n ==
'.' &&
89 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
92 for (
c = *p++;
c ==
'?' ||
c ==
'*';
c = *p++)
94 if ((flags & FNM_FILE_NAME) && *n ==
'/')
115 char c1 = (!(flags & FNM_NOESCAPE) &&
c ==
'\\') ? *p :
c;
117 for (--p; *n !=
'\0'; ++n)
118 if ((
c ==
'[' || FOLD (*n) == c1) &&
119 fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
132 if ((flags & FNM_PERIOD) && *n ==
'.' &&
133 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
136 not = (*p ==
'!' || *p ==
'^');
143 register char cstart =
c, cend =
c;
145 if (!(flags & FNM_NOESCAPE) &&
c ==
'\\')
149 cstart = cend = *p++;
152 cstart = cend = FOLD (cstart);
161 if ((flags & FNM_FILE_NAME) &&
c ==
'/')
165 if (
c ==
'-' && *p !=
']')
168 if (!(flags & FNM_NOESCAPE) && cend ==
'\\')
177 if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
196 if (!(flags & FNM_NOESCAPE) &&
c ==
'\\')
220 if ((flags & FNM_LEADING_DIR) && *n ==
'/')