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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to