32#if defined _LIBC || !defined __GNU_LIBRARY__
35# if defined STDC_HEADERS || !defined isascii
38# define ISASCII(c) isascii(c)
41# define ISUPPER(c) (ISASCII (c) && isupper (c))
51fnmatch (
const char *pattern,
const char *
string,
int flags)
53 const char *p = pattern, *n = string;
57# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
59 while ((c = *p++) !=
'\0')
68 else if ((flags & FNM_FILE_NAME) && *n ==
'/')
70 else if ((flags & FNM_PERIOD) && *n ==
'.' &&
71 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
76 if (!(flags & FNM_NOESCAPE))
89 if ((flags & FNM_PERIOD) && *n ==
'.' &&
90 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
93 for (c = *p++; c ==
'?' || c ==
'*'; c = *p++)
95 if ((flags & FNM_FILE_NAME) && *n ==
'/')
116 char c1 = (!(flags & FNM_NOESCAPE) && c ==
'\\') ? *p : c;
118 for (--p; *n !=
'\0'; ++n)
119 if ((c ==
'[' || FOLD (*n) == c1) &&
120 fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
132 if ((flags & FNM_PERIOD) && *n ==
'.' &&
133 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
136 bool is_not = (*p ==
'!' || *p ==
'^');
143 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 ==
'/')