[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]