* io.c (rb_io_puts): fix for wide char encoding strings.
[ruby-dev:42212] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29256 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3f4a73f0e1
commit
61ee785c61
@ -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
|
||||
|
18
io.c
18
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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user