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

ruby-changes:7467

From: akr <ko1@a...>
Date: Sun, 31 Aug 2008 17:02:30 +0900 (JST)
Subject: [ruby-changes:7467] Ruby:r18986 (trunk): * transcode.c (econv_putback): associate encoding to the result.

akr	2008-08-31 16:59:03 +0900 (Sun, 31 Aug 2008)

  New Revision: 18986

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18986

  Log:
    * transcode.c (econv_putback): associate encoding to the result.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_econv.rb
    trunk/transcode.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18985)
+++ ChangeLog	(revision 18986)
@@ -1,3 +1,7 @@
+Sun Aug 31 16:57:36 2008  Tanaka Akira  <akr@f...>
+
+	* transcode.c (econv_putback): associate encoding to the result.
+
 Sun Aug 31 16:43:56 2008  Koichi Sasada  <ko1@a...>
 
 	* include/ruby/intern.h: rename RB_UBF_DFL to
Index: test/ruby/test_econv.rb
===================================================================
--- test/ruby/test_econv.rb	(revision 18985)
+++ test/ruby/test_econv.rb	(revision 18986)
@@ -498,8 +498,8 @@
     ec = Encoding::Converter.new("utf-16le", "euc-jp")
     ret = ec.primitive_convert(src="\x00\xd8\x21\x00", dst="", nil, nil)
     assert_equal(:invalid_byte_sequence, ret)
-    assert_equal("\x00", ec.putback(1))
-    assert_equal("\x21", ec.putback(1))
+    assert_equal("\x00".force_encoding("utf-16le"), ec.putback(1))
+    assert_equal("\x21".force_encoding("utf-16le"), ec.putback(1))
     assert_equal("", ec.putback(1))
   end
 
Index: transcode.c
===================================================================
--- transcode.c	(revision 18985)
+++ transcode.c	(revision 18986)
@@ -2751,6 +2751,30 @@
     return Qnil;
 }
 
+/*
+ * call-seq
+ *   putback                    => string
+ *   putback(max_numbytes)      => string
+ *
+ * put back the bytes which will be converted.
+ *
+ * The bytes are caused by invalid_byte_sequence error.
+ * When invalid_byte_sequence error, some bytes are discarded and
+ * some bytes may be converted again.
+ * The latter bytes can be put back.
+ * It can be observed by
+ * Encoding::InvalidByteSequence#readagain_bytes and
+ * Encoding::Converter#primitive_errinfo.
+ *
+ *   ec = Encoding::Converter.new("utf-16le", "iso-8859-1")
+ *   src = "\x00\xd8\x61\x00"
+ *   dst = ""
+ *   p ec.primitive_convert(src, dst)   #=> :invalid_byte_sequence
+ *   p ec.primitive_errinfo     #=> [:invalid_byte_sequence, "UTF-16LE", "UTF-8", "\x00\xD8", "a\x00"]
+ *   p ec.putback               #=> "a\x00"
+ *   p ec.putback               #=> ""          # no more bytes to put back
+ *
+ */
 static VALUE
 econv_putback(int argc, VALUE *argv, VALUE self)
 {
@@ -2773,6 +2797,10 @@
     str = rb_str_new(NULL, n);
     rb_econv_putback(ec, (unsigned char *)RSTRING_PTR(str), n);
 
+    if (ec->source_encoding) {
+        rb_enc_associate(str, ec->source_encoding);
+    }
+
     return str;
 }
 

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

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