aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-25 03:06:12 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-25 03:06:12 +0000
commitac9d09ba3c73417a6a53e9683d433419ca15504a (patch)
tree541379cc6028304fe26a7fb97cd2b81d1fe61992
parent9594c893f7c5940bbd4e08044eef6ff94ef27a97 (diff)
downloadruby-ac9d09ba3c73417a6a53e9683d433419ca15504a.tar.gz
* 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
-rw-r--r--ChangeLog5
-rw-r--r--io.c32
-rw-r--r--test/ruby/test_io.rb3
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 <nobu@ruby-lang.org>
+
+ * 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 <nobu@ruby-lang.org>
* 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;
- }
- else {
- rsptr = RSTRING_PTR(rs);
+ 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];
}
- 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