--- fnmatch.c.orig 2004-11-25 11:38:00.000000000 -0800 +++ fnmatch.c 2005-02-25 00:23:44.000000000 -0800 @@ -40,6 +40,8 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD: src/lib/libc/gen/fnmatch.c,v 1.16 2004/07/29 03:13:10 tjr Exp $"); +#include "xlocale_private.h" + /* * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. * Compares a filename or pathname to a pattern. @@ -70,8 +72,8 @@ #define RANGE_NOMATCH 0 #define RANGE_ERROR (-1) -static int rangematch(const char *, wchar_t, int, char **, mbstate_t *); -static int fnmatch1(const char *, const char *, int, mbstate_t, mbstate_t); +static int rangematch(const char *, wchar_t, int, char **, mbstate_t *, locale_t); +static int fnmatch1(const char *, const char *, int, mbstate_t, mbstate_t, locale_t); int fnmatch(pattern, string, flags) @@ -80,14 +82,15 @@ { static const mbstate_t initial; - return (fnmatch1(pattern, string, flags, initial, initial)); + return (fnmatch1(pattern, string, flags, initial, initial, __current_locale())); } static int -fnmatch1(pattern, string, flags, patmbs, strmbs) +fnmatch1(pattern, string, flags, patmbs, strmbs, loc) const char *pattern, *string; int flags; mbstate_t patmbs, strmbs; + locale_t loc; { const char *stringstart; char *newp; @@ -96,11 +99,11 @@ size_t pclen, sclen; for (stringstart = string;;) { - pclen = mbrtowc(&pc, pattern, MB_LEN_MAX, &patmbs); + pclen = mbrtowc_l(&pc, pattern, MB_LEN_MAX, &patmbs, loc); if (pclen == (size_t)-1 || pclen == (size_t)-2) return (FNM_NOMATCH); pattern += pclen; - sclen = mbrtowc(&sc, string, MB_LEN_MAX, &strmbs); + sclen = mbrtowc_l(&sc, string, MB_LEN_MAX, &strmbs, loc); if (sclen == (size_t)-1 || sclen == (size_t)-2) { sc = (unsigned char)*string; sclen = 1; @@ -150,10 +153,10 @@ /* General case, use recursion. */ while (sc != EOS) { if (!fnmatch1(pattern, string, - flags & ~FNM_PERIOD, patmbs, strmbs)) + flags & ~FNM_PERIOD, patmbs, strmbs, loc)) return (0); - sclen = mbrtowc(&sc, string, MB_LEN_MAX, - &strmbs); + sclen = mbrtowc_l(&sc, string, MB_LEN_MAX, + &strmbs, loc); if (sclen == (size_t)-1 || sclen == (size_t)-2) { sc = (unsigned char)*string; @@ -176,7 +179,7 @@ return (FNM_NOMATCH); switch (rangematch(pattern, sc, flags, &newp, - &patmbs)) { + &patmbs, loc)) { case RANGE_ERROR: goto norm; case RANGE_MATCH: @@ -189,8 +192,8 @@ break; case '\\': if (!(flags & FNM_NOESCAPE)) { - pclen = mbrtowc(&pc, pattern, MB_LEN_MAX, - &patmbs); + pclen = mbrtowc_l(&pc, pattern, MB_LEN_MAX, + &patmbs, loc); if (pclen == (size_t)-1 || pclen == (size_t)-2) return (FNM_NOMATCH); if (pclen == 0) @@ -203,7 +206,7 @@ if (pc == sc) ; else if ((flags & FNM_CASEFOLD) && - (towlower(pc) == towlower(sc))) + (towlower_l(pc, loc) == towlower_l(sc, loc))) ; else return (FNM_NOMATCH); @@ -215,12 +218,13 @@ } static int -rangematch(pattern, test, flags, newp, patmbs) +rangematch(pattern, test, flags, newp, patmbs, loc) const char *pattern; wchar_t test; int flags; char **newp; mbstate_t *patmbs; + locale_t loc; { int negate, ok; wchar_t c, c2; @@ -238,7 +242,7 @@ ++pattern; if (flags & FNM_CASEFOLD) - test = towlower(test); + test = towlower_l(test, loc); /* * A right bracket shall lose its special meaning and represent @@ -258,20 +262,20 @@ return (RANGE_NOMATCH); } else if (*pattern == '\\' && !(flags & FNM_NOESCAPE)) pattern++; - pclen = mbrtowc(&c, pattern, MB_LEN_MAX, patmbs); + pclen = mbrtowc_l(&c, pattern, MB_LEN_MAX, patmbs, loc); if (pclen == (size_t)-1 || pclen == (size_t)-2) return (RANGE_NOMATCH); pattern += pclen; if (flags & FNM_CASEFOLD) - c = towlower(c); + c = towlower_l(c, loc); if (*pattern == '-' && *(pattern + 1) != EOS && *(pattern + 1) != ']') { if (*++pattern == '\\' && !(flags & FNM_NOESCAPE)) if (*pattern != EOS) pattern++; - pclen = mbrtowc(&c2, pattern, MB_LEN_MAX, patmbs); + pclen = mbrtowc_l(&c2, pattern, MB_LEN_MAX, patmbs, loc); if (pclen == (size_t)-1 || pclen == (size_t)-2) return (RANGE_NOMATCH); pattern += pclen; @@ -279,12 +283,12 @@ return (RANGE_ERROR); if (flags & FNM_CASEFOLD) - c2 = towlower(c2); + c2 = towlower_l(c2, loc); - if (__collate_load_error ? + if (loc->__collate_load_error ? c <= test && test <= c2 : - __collate_range_cmp(c, test) <= 0 - && __collate_range_cmp(test, c2) <= 0 + __collate_range_cmp(c, test, loc) <= 0 + && __collate_range_cmp(test, c2, loc) <= 0 ) ok = 1; } else if (c == test)