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