diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-03-03 11:40:41 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-03-03 11:40:41 +0000 |
commit | ed5b6231dfa960dc1cec83b38109da95fc11cb5f (patch) | |
tree | 3eda0dec5addb4519076beb04a297f106e99d2d8 /io.c | |
parent | 5665cf676f2587af86be584126453cd7f5880758 (diff) |
merges r22610 from trunk into ruby_1_9_1.
--
* 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/branches/ruby_1_9_1@22740 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 32 |
1 files changed, 17 insertions, 15 deletions
@@ -2215,7 +2215,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; } @@ -2227,24 +2227,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); |