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

ruby-changes:4002

From: ko1@a...
Date: Sat, 16 Feb 2008 03:48:47 +0900 (JST)
Subject: [ruby-changes:4002] akr - Ruby:r15492 (trunk): * encoding.c (rb_enc_nth): moved to string.c.

akr	2008-02-16 03:48:27 +0900 (Sat, 16 Feb 2008)

  New Revision: 15492

  Modified files:
    trunk/ChangeLog
    trunk/encoding.c
    trunk/string.c

  Log:
    * encoding.c (rb_enc_nth): moved to string.c.
    
    * string.c (rb_enc_nth): moved from string.c.  use search_nonascii
      for ASCII compatible string.
      (str_nth): wrong optimization removed to fix
      "a".force_encoding("EUC-JP").slice!(0,10) returns
      "a\x00\x00\x00\x00\x00\x00\x00\x00\x00"


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15492&r2=15491&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15492&r2=15491&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/encoding.c?r1=15492&r2=15491&diff_format=u

Index: encoding.c
===================================================================
--- encoding.c	(revision 15491)
+++ encoding.c	(revision 15492)
@@ -720,28 +720,6 @@
     return rb_enc_from_encoding(enc);
 }
 
-
-char*
-rb_enc_nth(const char *p, const char *e, int nth, rb_encoding *enc)
-{
-    int c;
-
-    if (rb_enc_mbmaxlen(enc) == 1) {
-	p += nth;
-    }
-    else if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) {
-	p += nth * rb_enc_mbmaxlen(enc);
-    }
-    else {
-	for (c=0; p<e && nth--; c++) {
-	    int n = rb_enc_mbclen(p, e, enc);
-
-	    p += n;
-	}
-    }
-    return (char*)p;
-}
-
 long
 rb_enc_strlen(const char *p, const char *e, rb_encoding *enc)
 {
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15491)
+++ ChangeLog	(revision 15492)
@@ -1,3 +1,13 @@
+Sat Feb 16 03:43:18 2008  Tanaka Akira  <akr@f...>
+
+	* encoding.c (rb_enc_nth): moved to string.c.
+
+	* string.c (rb_enc_nth): moved from string.c.  use search_nonascii
+	  for ASCII compatible string.
+	  (str_nth): wrong optimization removed to fix
+	  "a".force_encoding("EUC-JP").slice!(0,10) returns
+	  "a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+
 Sat Feb 16 00:21:49 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* range.c (rb_range_beg_len): check if responds to "begin" and "end"
Index: string.c
===================================================================
--- string.c	(revision 15491)
+++ string.c	(revision 15492)
@@ -891,20 +891,57 @@
     return rb_check_string_type(str);
 }
 
+char*
+rb_enc_nth(const char *p, const char *e, int nth, rb_encoding *enc)
+{
+    int c;
+
+    if (rb_enc_mbmaxlen(enc) == 1) {
+        p += nth;
+    }
+    else if (rb_enc_mbmaxlen(enc) == rb_enc_mbminlen(enc)) {
+        p += nth * rb_enc_mbmaxlen(enc);
+    }
+    else if (rb_enc_asciicompat(enc)) {
+        const char *p2, *e2;
+        int n;
+
+        while (p < e && 0 < nth) {
+            e2 = p + nth;
+            if (e < e2)
+                return (char *)e;
+            if (ISASCII(*p)) {
+                p2 = search_nonascii(p, e2);
+                if (!p2)
+                    return (char *)e2;
+                nth -= p2 - p;
+                p = p2;
+            }
+            n = rb_enc_mbclen(p, e, enc);
+            p += n;
+            nth--;
+        }
+        if (nth != 0)
+            return (char *)e;
+        return (char *)p;
+    }
+    else {
+        for (c=0; p<e && nth--; c++) {
+            int n = rb_enc_mbclen(p, e, enc);
+
+            p += n;
+        }
+    }
+    if (p > e) p = e;
+    return (char*)p;
+}
+
 static char*
 str_nth(const char *p, const char *e, int nth, rb_encoding *enc, int singlebyte)
 {
     if (singlebyte)
 	p += nth;
     else {
-	if (rb_enc_asciicompat(enc)) {
-	    const char *p2 = search_nonascii(p, e);
-
-	    if (!p2 || p + nth < p2)
-		return (char*)p + nth;
-	    nth -= p2 - p;
-	    p = p2;
-	}
 	p = rb_enc_nth(p, e, nth, enc);
     }
     if (!p) return 0;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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