regexec.c.patch   [plain text]


--- regexec.c.bsdnew	2009-11-11 11:29:04.000000000 -0800
+++ regexec.c	2009-11-11 12:21:46.000000000 -0800
@@ -39,6 +39,8 @@ static char sccsid[] = "@(#)regexec.c	8.
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/lib/libc/regex/regexec.c,v 1.8 2007/06/11 03:05:54 delphij Exp $");
 
+#include "xlocale_private.h"
+
 /*
  * the outer shell of regexec()
  *
@@ -62,12 +64,12 @@ __FBSDID("$FreeBSD: src/lib/libc/regex/r
 static int nope __unused = 0;	/* for use in asserts; shuts lint up */
 
 static __inline size_t
-xmbrtowc(wint_t *wi, const char *s, size_t n, mbstate_t *mbs, wint_t dummy)
+xmbrtowc(wint_t *wi, const char *s, size_t n, mbstate_t *mbs, wint_t dummy, locale_t loc)
 {
 	size_t nr;
 	wchar_t wc;
 
-	nr = mbrtowc(&wc, s, n, mbs);
+	nr = mbrtowc_l(&wc, s, n, mbs, loc);
 	if (wi != NULL)
 		*wi = wc;
 	if (nr == 0)
@@ -86,7 +88,8 @@ xmbrtowc_dummy(wint_t *wi,
 		const char *s,
 		size_t n __unused,
 		mbstate_t *mbs __unused,
-		wint_t dummy __unused)
+		wint_t dummy __unused,
+		locale_t loc __unused)
 {
 
 	if (wi != NULL)
@@ -176,6 +179,8 @@ xmbrtowc_dummy(wint_t *wi,
 /* function names */
 #define	LNAMES			/* flag */
 
+#undef __FBSDID
+#define __FBSDID(x)
 #include "engine.c"
 
 /* multibyte character & large states version */
@@ -224,7 +229,8 @@ regexec(const regex_t * __restrict preg,
 		return(REG_BADPAT);
 	eflags = GOODFLAGS(eflags);
 
-	if (MB_CUR_MAX > 1)
+	g->loc = __current_locale();
+	if (MB_CUR_MAX_L(g->loc) > 1)
 		return(mmatcher(g, (char *)string, nmatch, pmatch, eflags));
 	else if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
 		return(smatcher(g, (char *)string, nmatch, pmatch, eflags));