Cygwin: fnmatch: handle named character classes

Handle [:<character-class>:] expressions in range brackets.

TODO: Collating symbols [.<collsym>'.] and Equivalence class
expressions [=<equiv-class>=] are recognized but skipped as if
they are not present at all.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2023-02-14 20:22:54 +01:00
parent 1fc35f30bd
commit 7faa646553
1 changed files with 23 additions and 0 deletions

View File

@ -274,6 +274,29 @@ rangematch(const char *pattern, wint_t test, int flags, char **newp,
return (RANGE_NOMATCH); return (RANGE_NOMATCH);
} else if (*pattern == '\\' && !(flags & FNM_NOESCAPE)) } else if (*pattern == '\\' && !(flags & FNM_NOESCAPE))
pattern++; pattern++;
if (*pattern == '[' && (pattern[1] == ':' || pattern[1] == '.'
|| pattern[1] == '=')) {
const char ctype = *++pattern;
const char *class_p = ++pattern;
while (*pattern
&& (*pattern != ctype || pattern[1] != ']'))
++pattern;
if (!*pattern)
return (RANGE_ERROR);
if (ctype == ':') {
size_t clen = pattern - class_p;
char class[clen + 1];
*stpncpy (class, class_p, clen) = '\0';
if (iswctype (test, wctype (class)))
ok = 1;
}
pattern += 2;
/* TODO: [. and [= are just ignored for now */
continue;
}
pclen = mbrtowi(&c, pattern, MB_LEN_MAX, patmbs); pclen = mbrtowi(&c, pattern, MB_LEN_MAX, patmbs);
if (pclen == (size_t)-1 || pclen == (size_t)-2) if (pclen == (size_t)-1 || pclen == (size_t)-2)
return (RANGE_NOMATCH); return (RANGE_NOMATCH);