aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--io.c18
-rw-r--r--test/ruby/test_io_m17n.rb18
3 files changed, 40 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 1f7f41fb26..5f17e97421 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Sep 15 09:12:03 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_puts): fix for wide char encoding strings.
+ [ruby-dev:42212]
+
Wed Sep 15 07:27:52 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* string.c (rb_str_times): mentioned about Hash argument. a patch
diff --git a/io.c b/io.c
index 7a4be8a447..2a5a6452f7 100644
--- a/io.c
+++ b/io.c
@@ -6074,6 +6074,22 @@ rb_f_putc(VALUE recv, VALUE ch)
return rb_funcall2(rb_stdout, rb_intern("putc"), 1, &ch);
}
+
+static int
+str_end_with_asciichar(VALUE str, int c)
+{
+ long len = RSTRING_LEN(str);
+ const char *ptr = RSTRING_PTR(str);
+ rb_encoding *enc = rb_enc_from_index(ENCODING_GET(str));
+ int n;
+
+ if (len == 0) return 0;
+ if ((n = rb_enc_mbminlen(enc)) == 1) {
+ return ptr[len - 1] == c;
+ }
+ return rb_enc_ascget(ptr + ((len - 1) / n) * n, ptr + len, &n, enc) == c;
+}
+
static VALUE
io_puts_ary(VALUE ary, VALUE out, int recur)
{
@@ -6137,7 +6153,7 @@ rb_io_puts(int argc, VALUE *argv, VALUE out)
string:
rb_io_write(out, line);
if (RSTRING_LEN(line) == 0 ||
- RSTRING_PTR(line)[RSTRING_LEN(line)-1] != '\n') {
+ !str_end_with_asciichar(line, '\n')) {
rb_io_write(out, rb_default_rs);
}
}
diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb
index 21b7941cbe..3d3b64c6cc 100644
--- a/test/ruby/test_io_m17n.rb
+++ b/test/ruby/test_io_m17n.rb
@@ -1833,5 +1833,23 @@ EOT
assert_equal((bug3534[1]+"\n").encode(e), r.gets(), bug3534[1])
end
end
+
+ def test_puts_widechar
+ bug = '[ruby-dev:42212]'
+ r, w = IO.pipe(Encoding::ASCII_8BIT)
+ r.binmode
+ w.binmode
+ w.puts(0x010a.chr(Encoding::UTF_32BE))
+ w.puts(0x010a.chr(Encoding::UTF_16BE))
+ w.puts(0x0a010000.chr(Encoding::UTF_32LE))
+ w.puts(0x0a01.chr(Encoding::UTF_16LE))
+ w.close
+ assert_equal("\x00\x00\x01\x0a\n", r.read(5), bug)
+ assert_equal("\x01\x0a\n", r.read(3), bug)
+ assert_equal("\x00\x00\x01\x0a\n", r.read(5), bug)
+ assert_equal("\x01\x0a\n", r.read(3), bug)
+ assert_equal("", r.read, bug)
+ r.close
+ end
end