ruby-changes:4008
From: ko1@a...
Date: Sat, 16 Feb 2008 11:55:22 +0900 (JST)
Subject: [ruby-changes:4008] akr - Ruby:r15498 (trunk): * encoding.c (rb_enc_strlen): moved to string.c.
akr 2008-02-16 11:55:08 +0900 (Sat, 16 Feb 2008) New Revision: 15498 Modified files: trunk/ChangeLog trunk/encoding.c trunk/string.c Log: * encoding.c (rb_enc_strlen): moved to string.c. * string.c (rb_enc_strlen): use search_nonascii. (str_strlen): don't use search_nonascii. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15498&r2=15497&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15498&r2=15497&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/encoding.c?r1=15498&r2=15497&diff_format=u Index: encoding.c =================================================================== --- encoding.c (revision 15497) +++ encoding.c (revision 15498) @@ -720,23 +720,6 @@ return rb_enc_from_encoding(enc); } -long -rb_enc_strlen(const char *p, const char *e, rb_encoding *enc) -{ - long c; - - if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) { - return (e - p) / rb_enc_mbminlen(enc); - } - - for (c=0; p<e; c++) { - int n = rb_enc_mbclen(p, e, enc); - - p += n; - } - return c; -} - int rb_enc_mbclen(const char *p, const char *e, rb_encoding *enc) { Index: ChangeLog =================================================================== --- ChangeLog (revision 15497) +++ ChangeLog (revision 15498) @@ -1,3 +1,10 @@ +Sat Feb 16 11:53:35 2008 Tanaka Akira <akr@f...> + + * encoding.c (rb_enc_strlen): moved to string.c. + + * string.c (rb_enc_strlen): use search_nonascii. + (str_strlen): don't use search_nonascii. + Sat Feb 16 11:45:31 2008 Tanaka Akira <akr@f...> * lib/require_relative.rb: check require_relative call in eval. Index: string.c =================================================================== --- string.c (revision 15497) +++ string.c (revision 15498) @@ -588,24 +588,48 @@ return str; } +long +rb_enc_strlen(const char *p, const char *e, rb_encoding *enc) +{ + long c; + const char *q; + + if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) { + return (e - p) / rb_enc_mbminlen(enc); + } + else if (rb_enc_asciicompat(enc)) { + c = 0; + while (p < e) { + if (ISASCII(*p)) { + q = search_nonascii(p, e); + if (!q) + return c + (e - p); + c += q - p; + p = q; + } + p += rb_enc_mbclen(p, e, enc); + c++; + } + return c; + } + + for (c=0; p<e; c++) { + p += rb_enc_mbclen(p, e, enc); + } + return c; +} + static long str_strlen(VALUE str, rb_encoding *enc) { - long len = 0; + long len; const char *p, *e; if (single_byte_optimizable(str)) return RSTRING_LEN(str); if (!enc) enc = STR_ENC_GET(str); p = RSTRING_PTR(str); e = RSTRING_END(str); - if (rb_enc_asciicompat(enc)) { - const char *p2 = search_nonascii(p, e); - - if (!p2) return RSTRING_LEN(str); - len = p2 - p; - p = p2; - } - len += rb_enc_strlen(p, e, enc); + len = rb_enc_strlen(p, e, enc); if (len < 0) { rb_raise(rb_eArgError, "invalid mbstring sequence"); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/