wctype.c.patch   [plain text]


--- wctype.c.orig	2004-11-25 11:38:21.000000000 -0800
+++ wctype.c	2005-02-27 02:15:11.000000000 -0800
@@ -27,6 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/lib/libc/locale/wctype.c,v 1.3 2004/03/27 08:59:21 tjr Exp $");
 
+#include "xlocale_private.h"
+
 #include <ctype.h>
 #include <string.h>
 #include <wctype.h>
@@ -36,34 +38,57 @@
 iswctype(wint_t wc, wctype_t charclass)
 {
 
-	return (__istype(wc, charclass));
+	return (__istype_l(wc, charclass, __current_locale()));
+}
+
+#undef iswctype_l
+int
+iswctype_l(wint_t wc, wctype_t charclass, locale_t loc)
+{
+	NORMALIZE_LOCALE(loc);
+	return (__istype_l(wc, charclass, loc));
 }
 
+static struct {
+	const char	*name;
+	wctype_t	 mask;
+} props[] = {
+	{ "alnum",	_CTYPE_A|_CTYPE_D },
+	{ "alpha",	_CTYPE_A },
+	{ "blank",	_CTYPE_B },
+	{ "cntrl",	_CTYPE_C },
+	{ "digit",	_CTYPE_D },
+	{ "graph",	_CTYPE_G },
+	{ "lower",	_CTYPE_L },
+	{ "print",	_CTYPE_R },
+	{ "punct",	_CTYPE_P },
+	{ "space",	_CTYPE_S },
+	{ "upper",	_CTYPE_U },
+	{ "xdigit",	_CTYPE_X },
+	{ "ideogram",	_CTYPE_I },	/* BSD extension */
+	{ "special",	_CTYPE_T },	/* BSD extension */
+	{ "phonogram",	_CTYPE_Q },	/* BSD extension */
+	{ "rune",	0xFFFFFF00L },	/* BSD extension */
+	{ NULL,		0UL },		/* Default */
+};
+
+/* these don't currently depend on the locale, but they could */
+
 wctype_t
 wctype(const char *property)
 {
-	struct {
-		const char	*name;
-		wctype_t	 mask;
-	} props[] = {
-		{ "alnum",	_CTYPE_A|_CTYPE_D },
-		{ "alpha",	_CTYPE_A },
-		{ "blank",	_CTYPE_B },
-		{ "cntrl",	_CTYPE_C },
-		{ "digit",	_CTYPE_D },
-		{ "graph",	_CTYPE_G },
-		{ "lower",	_CTYPE_L },
-		{ "print",	_CTYPE_R },
-		{ "punct",	_CTYPE_P },
-		{ "space",	_CTYPE_S },
-		{ "upper",	_CTYPE_U },
-		{ "xdigit",	_CTYPE_X },
-		{ "ideogram",	_CTYPE_I },	/* BSD extension */
-		{ "special",	_CTYPE_T },	/* BSD extension */
-		{ "phonogram",	_CTYPE_Q },	/* BSD extension */
-		{ "rune",	0xFFFFFF00L },	/* BSD extension */
-		{ NULL,		0UL },		/* Default */
-	};
+	int i;
+
+	i = 0;
+	while (props[i].name != NULL && strcmp(props[i].name, property) != 0)
+		i++;
+
+	return (props[i].mask);
+}
+
+wctype_t
+wctype_l(const char *property, locale_t loc)
+{
 	int i;
 
 	i = 0;