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

ruby-changes:3062

From: ko1@a...
Date: 24 Dec 2007 04:55:30 +0900
Subject: [ruby-changes:3062] matz - Ruby:r14554 (trunk): * io.c (appendline): should do multibyte aware RS search.

matz	2007-12-24 04:55:18 +0900 (Mon, 24 Dec 2007)

  New Revision: 14554

  Modified files:
    trunk/ChangeLog
    trunk/io.c
    trunk/test/ruby/test_io_m17n.rb

  Log:
    * io.c (appendline): should do multibyte aware RS search.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14554&r2=14553
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_io_m17n.rb?r1=14554&r2=14553
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=14554&r2=14553

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14553)
+++ ChangeLog	(revision 14554)
@@ -25,6 +25,8 @@
 
 	* io.c (io_enc_str): should preserve default_external encoding.
 
+	* io.c (appendline): should do multibyte aware RS search.
+
 Mon Dec 24 02:06:35 2007  Yukihiro Matsumoto  <matz@r...>
 
 	* io.c (rb_f_open): documentation update.
Index: io.c
===================================================================
--- io.c	(revision 14553)
+++ io.c	(revision 14554)
@@ -1647,22 +1647,32 @@
 }
 
 static int
-appendline(rb_io_t *fptr, int delim, VALUE *strp, long *lp)
+appendline(rb_io_t *fptr, int delim, VALUE *strp, long *lp, int mb)
 {
     VALUE str = *strp;
     int c = EOF;
     long limit = *lp;
+    rb_encoding *enc = io_read_encoding(fptr);
 
     do {
 	long pending = READ_DATA_PENDING_COUNT(fptr);
 	if (pending > 0) {
-	    const char *p = READ_DATA_PENDING_PTR(fptr);
-	    const char *e;
+	    const char *s = READ_DATA_PENDING_PTR(fptr);
+	    const char *p, *e;
 	    long last = 0, len = (c != EOF);
 
 	    if (limit > 0 && pending > limit) pending = limit;
+	    p = s;
+	  again:
 	    e = memchr(p, delim, pending);
-	    if (e) pending = e - p + 1;
+	    if (e) {
+		if (mb &&
+		    ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,(UChar*)s,(UChar*)e) != (UChar*)e) {
+		    p = e + 1;
+		    goto again;
+		}
+		pending = e - s + 1;
+	    }
 	    len += pending;
 	    if (!NIL_P(str)) {
 		last = RSTRING_LEN(str);
@@ -1742,7 +1752,7 @@
     int c, nolimit = 0;
 
     for (;;) {
-	c = appendline(fptr, delim, &str, &limit);
+	c = appendline(fptr, delim, &str, &limit, 0);
 	if (c == EOF || c == delim) break;
 	if (limit == 0) {
 	    nolimit = 1;
@@ -1842,7 +1852,7 @@
 	}
 	newline = rsptr[rslen - 1];
 
-	while ((c = appendline(fptr, newline, &str, &limit)) != EOF) {
+	while ((c = appendline(fptr, newline, &str, &limit, 1)) != EOF) {
 	    if (c == newline) {
 		if (RSTRING_LEN(str) < rslen) continue;
 		if (!rspara) rscheck(rsptr, rslen, rs);
Index: test/ruby/test_io_m17n.rb
===================================================================
--- test/ruby/test_io_m17n.rb	(revision 14553)
+++ test/ruby/test_io_m17n.rb	(revision 14554)
@@ -60,8 +60,8 @@
       s = open("tmp", "r:euc-jp:utf-8") {|f|
         f.gets("\xA2\xA2".force_encoding("euc-jp").encode("utf-8"))
       }
-      assert_equal(Encoding.find("euc-jp"), s.encoding)
-      assert_str_equal("before \xA1\xA2\xA2\xA3 after".force_encoding("iso-8859-1"), s, '[ruby-core:14319]')
+      assert_equal(Encoding.find("utf-8"), s.encoding)
+      assert_str_equal("before \xA1\xA2\xA2\xA3 after".force_encoding("euc-jp").encode("utf-8"), s, '[ruby-core:14319]')
     }
   end
 
@@ -196,8 +196,6 @@
       w.close
       s = r.read
       assert_equal(Encoding.default_external, s.encoding)
-      puts encdump(s)
-      puts encdump(utf8)
       assert_str_equal(utf8, s)
     }
 
@@ -226,7 +224,9 @@
       }
     }
 
-    ENCS.reject {|e| e == Encoding::ASCII_8BIT }.each {|enc|
+    ENCS.each {|enc|
+      next if enc == Encoding::ASCII_8BIT
+      next if enc == Encoding::UTF_8
       with_pipe("#{enc}:UTF-8") {|r, w|
         w << "\xc2\xa1"
         w.close

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

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