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 register 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)
133 if ((flags & FNM_PERIOD) && *n ==
'.' &&
134 (n ==
string || ((flags & FNM_FILE_NAME) && n[-1] ==
'/')))
137 not = (*p ==
'!' || *p ==
'^');
144 register char cstart = c, cend = c;
146 if (!(flags & FNM_NOESCAPE) && c ==
'\\')
150 cstart = cend = *p++;
153 cstart = cend = FOLD (cstart);
162 if ((flags & FNM_FILE_NAME) && c ==
'/')
166 if (c ==
'-' && *p !=
']')
169 if (!(flags & FNM_NOESCAPE) && cend ==
'\\')
178 if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
197 if (!(flags & FNM_NOESCAPE) && c ==
'\\')
221 if ((flags & FNM_LEADING_DIR) && *n ==
'/')