diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-16 02:55:08 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-16 02:55:08 +0000 |
commit | af75cc01bc7ed39eafbc958936c51e0221313051 (patch) | |
tree | f4f3ff3eaafa2516af2c2947bd37f333d84e79e1 /string.c | |
parent | 125c0a0d93f8562c1115290d10e110e20053eebb (diff) | |
download | ruby-af75cc01bc7ed39eafbc958936c51e0221313051.tar.gz |
* encoding.c (rb_enc_strlen): moved to string.c.
* string.c (rb_enc_strlen): use search_nonascii.
(str_strlen): don't use search_nonascii.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15498 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 42 |
1 files changed, 33 insertions, 9 deletions
@@ -588,24 +588,48 @@ rb_str_init(int argc, VALUE *argv, VALUE str) 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"); } |