fnmatch.c.patch   [plain text]


--- 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)