From ac9d09ba3c73417a6a53e9683d433419ca15504a Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 25 Feb 2009 03:06:12 +0000 Subject: [PATCH] * io.c (rb_io_getline_1): enables limit even if rs is given. [ruby-core:22434] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22610 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ io.c | 32 +++++++++++++++++--------------- test/ruby/test_io.rb | 3 ++- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0ccfe850cd..e23eb5fcc6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Feb 25 12:06:09 2009 + + * io.c (rb_io_getline_1): enables limit even if rs is given. + [ruby-core:22434] + Wed Feb 25 02:28:51 2009 Nobuyoshi Nakada * string.c (rb_str_chomp_bang): coderange may change. diff --git a/io.c b/io.c index 143a833083..e4884c6d9a 100644 --- a/io.c +++ b/io.c @@ -2246,7 +2246,7 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io) GetOpenFile(io, fptr); rb_io_check_readable(fptr); - if (NIL_P(rs)) { + if (NIL_P(rs) && limit < 0) { str = read_all(fptr, 0, Qnil); if (RSTRING_LEN(str) == 0) return Qnil; } @@ -2258,24 +2258,26 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io) return rb_io_getline_fast(fptr, enc); } else { - int c, newline; - const char *rsptr; - long rslen; + int c, newline = -1; + const char *rsptr = 0; + long rslen = 0; int rspara = 0; int extra_limit = 16; - rslen = RSTRING_LEN(rs); - if (rslen == 0) { - rsptr = "\n\n"; - rslen = 2; - rspara = 1; - swallow(fptr, '\n'); - rs = 0; + if (!NIL_P(rs)) { + rslen = RSTRING_LEN(rs); + if (rslen == 0) { + rsptr = "\n\n"; + rslen = 2; + rspara = 1; + swallow(fptr, '\n'); + rs = 0; + } + else { + rsptr = RSTRING_PTR(rs); + } + newline = (unsigned char)rsptr[rslen - 1]; } - else { - rsptr = RSTRING_PTR(rs); - } - newline = (unsigned char)rsptr[rslen - 1]; /* MS - Optimisation */ enc = io_read_encoding(fptr); diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 0f448dbf39..678a74a1d0 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -102,8 +102,9 @@ class TestIO < Test::Unit::TestCase def test_gets_limit_extra_arg with_pipe {|r, w| r, w = IO.pipe - w << "0123456789" + w << "0123456789\n0123456789" w.close + assert_equal("0123456789\n0", r.gets(nil, 12)) assert_raise(TypeError) { r.gets(3,nil) } } end