]>
Commit | Line | Data |
---|---|---|
3d9156a7 A |
1 | --- fnmatch.c.orig 2004-11-25 11:38:00.000000000 -0800 |
2 | +++ fnmatch.c 2005-02-25 00:23:44.000000000 -0800 | |
3 | @@ -40,6 +40,8 @@ | |
4 | #include <sys/cdefs.h> | |
5 | __FBSDID("$FreeBSD: src/lib/libc/gen/fnmatch.c,v 1.16 2004/07/29 03:13:10 tjr Exp $"); | |
6 | ||
7 | +#include "xlocale_private.h" | |
8 | + | |
9 | /* | |
10 | * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. | |
11 | * Compares a filename or pathname to a pattern. | |
12 | @@ -70,8 +72,8 @@ | |
13 | #define RANGE_NOMATCH 0 | |
14 | #define RANGE_ERROR (-1) | |
15 | ||
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); | |
20 | ||
21 | int | |
22 | fnmatch(pattern, string, flags) | |
23 | @@ -80,14 +82,15 @@ | |
24 | { | |
25 | static const mbstate_t initial; | |
26 | ||
27 | - return (fnmatch1(pattern, string, flags, initial, initial)); | |
28 | + return (fnmatch1(pattern, string, flags, initial, initial, __current_locale())); | |
29 | } | |
30 | ||
31 | static int | |
32 | -fnmatch1(pattern, string, flags, patmbs, strmbs) | |
33 | +fnmatch1(pattern, string, flags, patmbs, strmbs, loc) | |
34 | const char *pattern, *string; | |
35 | int flags; | |
36 | mbstate_t patmbs, strmbs; | |
37 | + locale_t loc; | |
38 | { | |
39 | const char *stringstart; | |
40 | char *newp; | |
41 | @@ -96,11 +99,11 @@ | |
42 | size_t pclen, sclen; | |
43 | ||
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) | |
48 | return (FNM_NOMATCH); | |
49 | pattern += pclen; | |
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; | |
54 | sclen = 1; | |
55 | @@ -150,10 +153,10 @@ | |
56 | /* General case, use recursion. */ | |
57 | while (sc != EOS) { | |
58 | if (!fnmatch1(pattern, string, | |
59 | - flags & ~FNM_PERIOD, patmbs, strmbs)) | |
60 | + flags & ~FNM_PERIOD, patmbs, strmbs, loc)) | |
61 | return (0); | |
62 | - sclen = mbrtowc(&sc, string, MB_LEN_MAX, | |
63 | - &strmbs); | |
64 | + sclen = mbrtowc_l(&sc, string, MB_LEN_MAX, | |
65 | + &strmbs, loc); | |
66 | if (sclen == (size_t)-1 || | |
67 | sclen == (size_t)-2) { | |
68 | sc = (unsigned char)*string; | |
69 | @@ -176,7 +179,7 @@ | |
70 | return (FNM_NOMATCH); | |
71 | ||
72 | switch (rangematch(pattern, sc, flags, &newp, | |
73 | - &patmbs)) { | |
74 | + &patmbs, loc)) { | |
75 | case RANGE_ERROR: | |
76 | goto norm; | |
77 | case RANGE_MATCH: | |
78 | @@ -189,8 +192,8 @@ | |
79 | break; | |
80 | case '\\': | |
81 | if (!(flags & FNM_NOESCAPE)) { | |
82 | - pclen = mbrtowc(&pc, pattern, MB_LEN_MAX, | |
83 | - &patmbs); | |
84 | + pclen = mbrtowc_l(&pc, pattern, MB_LEN_MAX, | |
85 | + &patmbs, loc); | |
86 | if (pclen == (size_t)-1 || pclen == (size_t)-2) | |
87 | return (FNM_NOMATCH); | |
88 | if (pclen == 0) | |
89 | @@ -203,7 +206,7 @@ | |
90 | if (pc == sc) | |
91 | ; | |
92 | else if ((flags & FNM_CASEFOLD) && | |
93 | - (towlower(pc) == towlower(sc))) | |
94 | + (towlower_l(pc, loc) == towlower_l(sc, loc))) | |
95 | ; | |
96 | else | |
97 | return (FNM_NOMATCH); | |
98 | @@ -215,12 +218,13 @@ | |
99 | } | |
100 | ||
101 | static int | |
102 | -rangematch(pattern, test, flags, newp, patmbs) | |
103 | +rangematch(pattern, test, flags, newp, patmbs, loc) | |
104 | const char *pattern; | |
105 | wchar_t test; | |
106 | int flags; | |
107 | char **newp; | |
108 | mbstate_t *patmbs; | |
109 | + locale_t loc; | |
110 | { | |
111 | int negate, ok; | |
112 | wchar_t c, c2; | |
113 | @@ -238,7 +242,7 @@ | |
114 | ++pattern; | |
115 | ||
116 | if (flags & FNM_CASEFOLD) | |
117 | - test = towlower(test); | |
118 | + test = towlower_l(test, loc); | |
119 | ||
120 | /* | |
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)) | |
125 | pattern++; | |
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); | |
130 | pattern += pclen; | |
131 | ||
132 | if (flags & FNM_CASEFOLD) | |
133 | - c = towlower(c); | |
134 | + c = towlower_l(c, loc); | |
135 | ||
136 | if (*pattern == '-' && *(pattern + 1) != EOS && | |
137 | *(pattern + 1) != ']') { | |
138 | if (*++pattern == '\\' && !(flags & FNM_NOESCAPE)) | |
139 | if (*pattern != EOS) | |
140 | pattern++; | |
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); | |
145 | pattern += pclen; | |
146 | @@ -279,12 +283,12 @@ | |
147 | return (RANGE_ERROR); | |
148 | ||
149 | if (flags & FNM_CASEFOLD) | |
150 | - c2 = towlower(c2); | |
151 | + c2 = towlower_l(c2, loc); | |
152 | ||
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 | |
160 | ) | |
161 | ok = 1; | |
162 | } else if (c == test) |