Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 03 May 2013 20:40:57 +0400
From:      Andrey Chernov <ache@freebsd.org>
To:        Sergey Kandaurov <pluknet@FreeBSD.org>
Cc:        svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   Re: svn commit: r250215 - stable/9/lib/libc/locale
Message-ID:  <5183E899.4000503@freebsd.org>
In-Reply-To: <201305031552.r43FqiPN024580@svn.freebsd.org>
References:  <201305031552.r43FqiPN024580@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
I don't think this change is optimal (cause slowdown) since you add
unneeded strlen() in the loop for known-sized elements plus one strlen()
for tested property, and wctype_l() itself can be called very often, so
we definitely don't need slowdown here.
Since most of elements have equal sizes, your len1 == len2 condition
gains almost nothing for valid calls.

On 03.05.2013 19:52, Sergey Kandaurov wrote:
> Modified: stable/9/lib/libc/locale/wctype.c
> ==============================================================================
> --- stable/9/lib/libc/locale/wctype.c	Fri May  3 15:28:31 2013	(r250214)
> +++ stable/9/lib/libc/locale/wctype.c	Fri May  3 15:52:43 2013	(r250215)
> @@ -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)
> 

-- 
http://ache.vniz.net/
bitcoin:13fGiNutKNHcVSsgtGQ7bQ5kgUKgEQHn7N



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