vswscanf.c.patch   [plain text]


--- vswscanf.c.orig	2009-11-30 16:15:30.000000000 -0800
+++ vswscanf.c	2009-12-03 15:21:47.000000000 -0800
@@ -39,6 +39,8 @@ __FBSDID("FreeBSD: src/lib/libc/stdio/vs
 #endif
 __FBSDID("$FreeBSD: src/lib/libc/stdio/vswscanf.c,v 1.6 2009/01/15 18:53:52 rdivacky Exp $");
 
+#include "xlocale_private.h"
+
 #include <limits.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -57,7 +59,7 @@ eofread(void *cookie, char *buf, int len
 }
 
 int
-vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
+vswscanf_l(const wchar_t * __restrict str, locale_t loc, const wchar_t * __restrict fmt,
     va_list ap)
 {
 	static const mbstate_t initial;
@@ -67,16 +69,20 @@ vswscanf(const wchar_t * __restrict str,
 	size_t mlen;
 	int r;
 	const wchar_t *strp;
+	struct __sFILEX ext;
+	f._extra = &ext;
+	INITEXTRA(&f);
 
+	NORMALIZE_LOCALE(loc);
 	/*
 	 * XXX Convert the wide character string to multibyte, which
 	 * __vfwscanf() will convert back to wide characters.
 	 */
-	if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX + 1)) == NULL)
+	if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX_L(loc) + 1)) == NULL)
 		return (EOF);
 	mbs = initial;
 	strp = str;
-	if ((mlen = wcsrtombs(mbstr, &strp, SIZE_T_MAX, &mbs)) == (size_t)-1) {
+	if ((mlen = wcsrtombs_l(mbstr, &strp, SIZE_T_MAX, &mbs, loc)) == (size_t)-1) {
 		free(mbstr);
 		return (EOF);
 	}
@@ -89,8 +95,16 @@ vswscanf(const wchar_t * __restrict str,
 	f._lb._base = NULL;
 	f._orientation = 0;
 	memset(&f._mbstate, 0, sizeof(mbstate_t));
-	r = __vfwscanf(&f, fmt, ap);
+	r = __vfwscanf(&f, loc, fmt, ap);
 	free(mbstr);
 
 	return (r);
 }
+
+int
+vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
+    va_list ap)
+{
+	return vswscanf_l(str, __current_locale(), fmt, ap);
+}
+