ruby-changes:4009
From: ko1@a...
Date: Sat, 16 Feb 2008 13:06:22 +0900 (JST)
Subject: [ruby-changes:4009] naruse - Ruby:r15499 (trunk): * string.c (rb_enc_strlen): add search_nonascii like character
naruse 2008-02-16 13:05:58 +0900 (Sat, 16 Feb 2008) New Revision: 15499 Modified files: trunk/ChangeLog trunk/string.c Log: * string.c (rb_enc_strlen): add search_nonascii like character counter for UTF-8. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15499&r2=15498&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15499&r2=15498&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15498) +++ ChangeLog (revision 15499) @@ -1,3 +1,8 @@ +Sat Feb 16 13:01:33 2008 NARUSE, Yui <naruse@r...> + + * string.c (rb_enc_strlen): add search_nonascii like character + counter for UTF-8. + Sat Feb 16 11:53:35 2008 Tanaka Akira <akr@f...> * encoding.c (rb_enc_strlen): moved to string.c. Index: string.c =================================================================== --- string.c (revision 15498) +++ string.c (revision 15499) @@ -597,6 +597,35 @@ if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) { return (e - p) / rb_enc_mbminlen(enc); } +#ifdef NONASCII_MASK + else if (enc == rb_utf8_encoding()) { + if (sizeof(long) * 2 < e - p) { + const unsigned long *s, *t; + const VALUE lowbits = sizeof(unsigned long) - 1; + s = (const unsigned long*)(~lowbits & ((VALUE)p + lowbits)); + t = (const unsigned long*)(~lowbits & (VALUE)e); + for (c=0; p<(const char *)s; p++) { + if (((*p)&0xC0) != 0x80) c++; + } + while (s < t) { + unsigned long d = *s; + d = (~d ^ (d&(d<<1)))&NONASCII_MASK; + d = (d>>7) + (d>>15); + d = d + (d>>16); +#if NONASCII_MASK == 0x8080808080808080UL + d = d + (d>>32); +#endif + c += (long)(d&0xF); + s++; + } + p = (const char *)t; + } + for (; p<e; p++) { + if (((*p)&0xC0) != 0x80) c++; + } + return c; + } +#endif else if (rb_enc_asciicompat(enc)) { c = 0; while (p < e) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/