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>
