summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--io.c11
-rw-r--r--test/ruby/test_io_m17n.rb24
3 files changed, 34 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 81ffc84791..845d92b279 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Tue Oct 12 15:36:09 2010 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * io.c (rb_io_ungetc): use unsigned int for GB18030.
+
Tue Oct 12 15:14:21 2010 NARUSE, Yui <naruse@ruby-lang.org>
* io.c (rb_io_putc): support multibyte characters.
diff --git a/io.c b/io.c
index 7625796b2b..cb1997a486 100644
--- a/io.c
+++ b/io.c
@@ -3229,12 +3229,13 @@ rb_io_ungetc(VALUE io, VALUE c)
rb_io_check_char_readable(fptr);
if (NIL_P(c)) return Qnil;
if (FIXNUM_P(c)) {
- int cc = FIX2INT(c);
- rb_encoding *enc = io_read_encoding(fptr);
- char buf[16];
-
- c = rb_str_new(buf, rb_enc_mbcput(cc, buf, enc));
+ c = rb_enc_uint_chr(FIX2UINT(c), io_read_encoding(fptr));
}
+#if SIZEOF_LONG > SIZEOF_INT
+ else if (TYPE(c) == T_BIGNUM) {
+ c = rb_enc_uint_chr(NUM2UINT(c), io_read_encoding(fptr));
+ }
+#endif
else {
SafeStringValue(c);
}
diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb
index 5f35c227ea..10714b3e44 100644
--- a/test/ruby/test_io_m17n.rb
+++ b/test/ruby/test_io_m17n.rb
@@ -418,6 +418,30 @@ EOT
}
end
+ def test_ungetc_int
+ with_tmpdir {
+ generate_file('tmp', "A")
+ s = open("tmp", "r:GB18030") {|f|
+ f.ungetc(0x8431A439)
+ f.read
+ }
+ assert_equal(Encoding::GB18030, s.encoding)
+ assert_str_equal(0x8431A439.chr("GB18030")+"A", s)
+ }
+ end
+
+ def test_ungetc_str
+ with_tmpdir {
+ generate_file('tmp', "A")
+ s = open("tmp", "r:GB18030") {|f|
+ f.ungetc(0x8431A439.chr("GB18030"))
+ f.read
+ }
+ assert_equal(Encoding::GB18030, s.encoding)
+ assert_str_equal(0x8431A439.chr("GB18030")+"A", s)
+ }
+ end
+
def test_ungetc_stateful_conversion
with_tmpdir {
src = "before \e$B\x23\x30\x23\x31\e(B after".force_encoding("iso-2022-jp")