]> git.saurik.com Git - apple/libc.git/blob - gen/FreeBSD/fnmatch.c.patch
Libc-391.4.1.tar.gz
[apple/libc.git] / gen / FreeBSD / fnmatch.c.patch
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)