Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Dec 2011 00:00:48 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r228269 - head/lib/libc/locale
Message-ID:  <201112050000.pB500mrQ008548@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Mon Dec  5 00:00:47 2011
New Revision: 228269
URL: http://svn.freebsd.org/changeset/base/228269

Log:
  libc: Eliminate 13 relative relocations in wctype().

Modified:
  head/lib/libc/locale/wctype.c

Modified: head/lib/libc/locale/wctype.c
==============================================================================
--- head/lib/libc/locale/wctype.c	Sun Dec  4 21:43:13 2011	(r228268)
+++ head/lib/libc/locale/wctype.c	Mon Dec  5 00:00:47 2011	(r228269)
@@ -57,35 +57,54 @@ iswctype_l(wint_t wc, wctype_t charclass
 wctype_t
 wctype_l(const char *property, locale_t locale)
 {
-	static const 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 */
+	const char *propnames = 
+		"alnum\0"
+		"alpha\0"
+		"blank\0"
+		"cntrl\0"
+		"digit\0"
+		"graph\0"
+		"lower\0"
+		"print\0"
+		"punct\0"
+		"space\0"
+		"upper\0"
+		"xdigit\0"
+		"ideogram\0"	/* BSD extension */
+		"special\0"	/* BSD extension */
+		"phonogram\0"	/* BSD extension */
+		"rune\0";	/* BSD extension */
+	static const wctype_t propmasks[] = {
+		_CTYPE_A|_CTYPE_D,
+		_CTYPE_A,
+		_CTYPE_B,
+		_CTYPE_C,
+		_CTYPE_D,
+		_CTYPE_G,
+		_CTYPE_L,
+		_CTYPE_R,
+		_CTYPE_P,
+		_CTYPE_S,
+		_CTYPE_U,
+		_CTYPE_X,
+		_CTYPE_I,
+		_CTYPE_T,
+		_CTYPE_Q,
+		0xFFFFFF00L
 	};
-	int i;
+	size_t len1, len2;
+	const char *p;
+	const wctype_t *q;
 
-	i = 0;
-	while (props[i].name != NULL && strcmp(props[i].name, property) != 0)
-		i++;
+	len1 = strlen(property);
+	q = propmasks;
+	for (p = propnames; (len2 = strlen(p)) != 0; p += len2 + 1) {
+		if (len1 == len2 && memcmp(property, p, len1) == 0)
+			return (*q);
+		q++;
+	}
 
-	return (props[i].mask);
+	return (0UL);
 }
 
 wctype_t wctype(const char *property)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112050000.pB500mrQ008548>