aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-31 07:59:03 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-31 07:59:03 +0000
commit2d71485ec1898c5c0f43d1c7e0fdb1f1442c9dd8 (patch)
tree7a7036d0da3815cfe3c3eb186022a0a94b794798
parentca6a8b1e2c9e1832ab993edff48d2d3a9234a4b3 (diff)
downloadruby-2d71485ec1898c5c0f43d1c7e0fdb1f1442c9dd8.tar.gz
* transcode.c (econv_putback): associate encoding to the result.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18986 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--test/ruby/test_econv.rb4
-rw-r--r--transcode.c28
3 files changed, 34 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index b73bde59c5..37c2c407d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sun Aug 31 16:57:36 2008 Tanaka Akira <akr@fsij.org>
+
+ * transcode.c (econv_putback): associate encoding to the result.
+
Sun Aug 31 16:43:56 2008 Koichi Sasada <ko1@atdot.net>
* include/ruby/intern.h: rename RB_UBF_DFL to
diff --git a/test/ruby/test_econv.rb b/test/ruby/test_econv.rb
index 1dc267d966..fd7bed5652 100644
--- a/test/ruby/test_econv.rb
+++ b/test/ruby/test_econv.rb
@@ -498,8 +498,8 @@ class TestEncodingConverter < Test::Unit::TestCase
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
diff --git a/transcode.c b/transcode.c
index 429a0a4f7b..2afed2c770 100644
--- a/transcode.c
+++ b/transcode.c
@@ -2751,6 +2751,30 @@ econv_insert_output(VALUE self, VALUE string)
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 @@ econv_putback(int argc, VALUE *argv, VALUE self)
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;
}