aboutsummaryrefslogtreecommitdiffstats
path: root/string.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-16 02:55:08 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-16 02:55:08 +0000
commitaf75cc01bc7ed39eafbc958936c51e0221313051 (patch)
treef4f3ff3eaafa2516af2c2947bd37f333d84e79e1 /string.c
parent125c0a0d93f8562c1115290d10e110e20053eebb (diff)
downloadruby-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.c42
1 files changed, 33 insertions, 9 deletions
diff --git a/string.c b/string.c
index 4ce365f1f5..0fcf3fcc9e 100644
--- a/string.c
+++ b/string.c
@@ -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");
}