summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-11-24 09:37:02 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-11-24 09:37:02 +0000
commit14dfd98ee47d0f0106d3c9f0a5793688381f941a (patch)
treeb247b82dd24f2f2060cedb492f6a0afd3a793018 /io.c
parentc2a3a47f40c5884a2f867ae90b1d2fb8172e3925 (diff)
merges r29256 from trunk into ruby_1_9_2.
-- * io.c (rb_io_puts): fix for wide char encoding strings. [ruby-dev:42212] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@29909 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/io.c b/io.c
index ed23a618ad..6791edb217 100644
--- a/io.c
+++ b/io.c
@@ -6061,6 +6061,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)
{
@@ -6124,7 +6140,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);
}
}