1 --- fnmatch.c.orig 2004-11-25 11:38:00.000000000 -0800
2 +++ fnmatch.c 2005-02-25 00:23:44.000000000 -0800
5 __FBSDID("$FreeBSD: src/lib/libc/gen/fnmatch.c,v 1.16 2004/07/29 03:13:10 tjr Exp $");
7 +#include "xlocale_private.h"
10 * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6.
11 * Compares a filename or pathname to a pattern.
13 #define RANGE_NOMATCH 0
14 #define RANGE_ERROR (-1)
16 -static int rangematch(const char *, wchar_t, int, char **, mbstate_t *);
17 -static int fnmatch1(const char *, const char *, int, mbstate_t, mbstate_t);
18 +static int rangematch(const char *, wchar_t, int, char **, mbstate_t *, locale_t);
19 +static int fnmatch1(const char *, const char *, int, mbstate_t, mbstate_t, locale_t);
22 fnmatch(pattern, string, flags)
25 static const mbstate_t initial;
27 - return (fnmatch1(pattern, string, flags, initial, initial));
28 + return (fnmatch1(pattern, string, flags, initial, initial, __current_locale()));
32 -fnmatch1(pattern, string, flags, patmbs, strmbs)
33 +fnmatch1(pattern, string, flags, patmbs, strmbs, loc)
34 const char *pattern, *string;
36 mbstate_t patmbs, strmbs;
39 const char *stringstart;
44 for (stringstart = string;;) {
45 - pclen = mbrtowc(&pc, pattern, MB_LEN_MAX, &patmbs);
46 + pclen = mbrtowc_l(&pc, pattern, MB_LEN_MAX, &patmbs, loc);
47 if (pclen == (size_t)-1 || pclen == (size_t)-2)
50 - sclen = mbrtowc(&sc, string, MB_LEN_MAX, &strmbs);
51 + sclen = mbrtowc_l(&sc, string, MB_LEN_MAX, &strmbs, loc);
52 if (sclen == (size_t)-1 || sclen == (size_t)-2) {
53 sc = (unsigned char)*string;
56 /* General case, use recursion. */
58 if (!fnmatch1(pattern, string,
59 - flags & ~FNM_PERIOD, patmbs, strmbs))
60 + flags & ~FNM_PERIOD, patmbs, strmbs, loc))
62 - sclen = mbrtowc(&sc, string, MB_LEN_MAX,
64 + sclen = mbrtowc_l(&sc, string, MB_LEN_MAX,
66 if (sclen == (size_t)-1 ||
67 sclen == (size_t)-2) {
68 sc = (unsigned char)*string;
72 switch (rangematch(pattern, sc, flags, &newp,
81 if (!(flags & FNM_NOESCAPE)) {
82 - pclen = mbrtowc(&pc, pattern, MB_LEN_MAX,
84 + pclen = mbrtowc_l(&pc, pattern, MB_LEN_MAX,
86 if (pclen == (size_t)-1 || pclen == (size_t)-2)
92 else if ((flags & FNM_CASEFOLD) &&
93 - (towlower(pc) == towlower(sc)))
94 + (towlower_l(pc, loc) == towlower_l(sc, loc)))
102 -rangematch(pattern, test, flags, newp, patmbs)
103 +rangematch(pattern, test, flags, newp, patmbs, loc)
116 if (flags & FNM_CASEFOLD)
117 - test = towlower(test);
118 + test = towlower_l(test, loc);
121 * A right bracket shall lose its special meaning and represent
122 @@ -258,20 +262,20 @@
123 return (RANGE_NOMATCH);
124 } else if (*pattern == '\\' && !(flags & FNM_NOESCAPE))
126 - pclen = mbrtowc(&c, pattern, MB_LEN_MAX, patmbs);
127 + pclen = mbrtowc_l(&c, pattern, MB_LEN_MAX, patmbs, loc);
128 if (pclen == (size_t)-1 || pclen == (size_t)-2)
129 return (RANGE_NOMATCH);
132 if (flags & FNM_CASEFOLD)
134 + c = towlower_l(c, loc);
136 if (*pattern == '-' && *(pattern + 1) != EOS &&
137 *(pattern + 1) != ']') {
138 if (*++pattern == '\\' && !(flags & FNM_NOESCAPE))
141 - pclen = mbrtowc(&c2, pattern, MB_LEN_MAX, patmbs);
142 + pclen = mbrtowc_l(&c2, pattern, MB_LEN_MAX, patmbs, loc);
143 if (pclen == (size_t)-1 || pclen == (size_t)-2)
144 return (RANGE_NOMATCH);
146 @@ -279,12 +283,12 @@
147 return (RANGE_ERROR);
149 if (flags & FNM_CASEFOLD)
151 + c2 = towlower_l(c2, loc);
153 - if (__collate_load_error ?
154 + if (loc->__collate_load_error ?
155 c <= test && test <= c2 :
156 - __collate_range_cmp(c, test) <= 0
157 - && __collate_range_cmp(test, c2) <= 0
158 + __collate_range_cmp(c, test, loc) <= 0
159 + && __collate_range_cmp(test, c2, loc) <= 0
162 } else if (c == test)