summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-10 04:05:59 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-10 04:05:59 +0000
commitaa1fdb90530fb9d440ab2eae182bf085f1ca2570 (patch)
tree70001203cb781f2364cb0a4b69b36d1c13bf887b
parentc13b3808b971e3f59c957324dba039b46f3a9853 (diff)
merges r28537 and r28555 from trunk into ruby_1_9_2.
-- * io.c (swallow, prepare_getline_args, rb_io_getline_1): fix for paragraph mode reading in non-ascii-compatible encoding. [ruby-dev:41803] -- * test/ruby/test_io_m17n.rb (test_textmode_paragraph_nonasciicompat): should match the modes of both end of pipe as text mode. * test/ruby/test_io_m17n.rb (test_binmode_paragraph_nonasciicompat): new test for binmode. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@28603 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--io.c15
-rw-r--r--test/ruby/test_io_m17n.rb27
3 files changed, 45 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index aeb0b102bc..08c3ac27bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Jul 4 17:13:14 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (swallow, prepare_getline_args, rb_io_getline_1): fix for
+ paragraph mode reading in non-ascii-compatible encoding.
+ [ruby-dev:41803]
+
Sat Jul 10 11:41:54 2010 Yuki Sonoda (Yugui) <yugui@yugui.jp>
* test/psych/test_date_time.rb (TestDateTime#test_round_trip_with_offset):
diff --git a/io.c b/io.c
index 077d1c036e..5b97e5a4c0 100644
--- a/io.c
+++ b/io.c
@@ -2289,8 +2289,9 @@ swallow(rb_io_t *fptr, int term)
while ((cnt = READ_CHAR_PENDING_COUNT(fptr)) > 0) {
const char *p = READ_CHAR_PENDING_PTR(fptr);
int i;
- if (needconv) {
+ if (!needconv) {
if (*p != term) return TRUE;
+ i = (int)cnt;
while (--i && *++p == term);
}
else {
@@ -2406,7 +2407,7 @@ prepare_getline_args(int argc, VALUE *argv, VALUE *rsp, long *limit, VALUE io)
enc_io = io_read_encoding(fptr);
if (enc_io != enc_rs &&
(rb_enc_str_coderange(rs) != ENC_CODERANGE_7BIT ||
- !rb_enc_asciicompat(enc_io))) {
+ (RSTRING_LEN(rs) > 0 && !rb_enc_asciicompat(enc_io)))) {
if (rs == rb_default_rs) {
rs = rb_enc_str_new(0, 0, enc_io);
rb_str_buf_cat_ascii(rs, "\n");
@@ -2450,6 +2451,8 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io)
int rspara = 0;
int extra_limit = 16;
+ enc = io_read_encoding(fptr);
+
if (!NIL_P(rs)) {
rslen = RSTRING_LEN(rs);
if (rslen == 0) {
@@ -2458,6 +2461,13 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io)
rspara = 1;
swallow(fptr, '\n');
rs = 0;
+ if (!rb_enc_asciicompat(enc)) {
+ rs = rb_usascii_str_new(rsptr, rslen);
+ rs = rb_str_encode(rs, rb_enc_from_encoding(enc), 0, Qnil);
+ OBJ_FREEZE(rs);
+ rsptr = RSTRING_PTR(rs);
+ rslen = RSTRING_LEN(rs);
+ }
}
else {
rsptr = RSTRING_PTR(rs);
@@ -2466,7 +2476,6 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io)
}
/* MS - Optimisation */
- enc = io_read_encoding(fptr);
while ((c = appendline(fptr, newline, &str, &limit)) != EOF) {
const char *s, *p, *pp, *e;
diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb
index f2a0f19d16..21b7941cbe 100644
--- a/test/ruby/test_io_m17n.rb
+++ b/test/ruby/test_io_m17n.rb
@@ -1806,5 +1806,32 @@ EOT
end
end
+ def test_textmode_paragraph_nonasciicompat
+ bug3534 = ['[ruby-dev:41803]', '[Bug #3534]']
+ r, w = IO.pipe
+ [Encoding::UTF_32BE, Encoding::UTF_32LE,
+ Encoding::UTF_16BE, Encoding::UTF_16LE,
+ Encoding::UTF_8].each do |e|
+ r.set_encoding(Encoding::US_ASCII, e)
+ w.print(bug3534[0], "\n\n\n\n", bug3534[1], "\n")
+ assert_equal((bug3534[0]+"\n\n").encode(e), r.gets(""), bug3534[0])
+ assert_equal((bug3534[1]+"\n").encode(e), r.gets(), bug3534[1])
+ end
+ end
+
+ def test_binmode_paragraph_nonasciicompat
+ bug3534 = ['[ruby-dev:41803]', '[Bug #3534]']
+ r, w = IO.pipe
+ r.binmode
+ w.binmode
+ [Encoding::UTF_32BE, Encoding::UTF_32LE,
+ Encoding::UTF_16BE, Encoding::UTF_16LE,
+ Encoding::UTF_8].each do |e|
+ r.set_encoding(Encoding::US_ASCII, e)
+ w.print(bug3534[0], "\n\n\n\n", bug3534[1], "\n")
+ assert_equal((bug3534[0]+"\n\n").encode(e), r.gets(""), bug3534[0])
+ assert_equal((bug3534[1]+"\n").encode(e), r.gets(), bug3534[1])
+ end
+ end
end