diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 8ba4760ac..ebe19930a 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -1714,10 +1714,10 @@ io_find_index(struct mrb_io *fptr, const char *rs, mrb_int rslen) mrb_assert(rslen > 0); const char c = rs[0]; const mrb_int limit = buf->len - rslen; - for (mrb_int i=buf->start; imem[i] == c) { - if (memcmp(buf->mem+i, rs, rslen) == 0) - return i; + const char *p = buf->mem+buf->start; + for (mrb_int i=0; ilen >= limit) { + for (;;) { + if (rs_given) { /* with RS */ + int rslen = RSTRING_LEN(rs); + mrb_int idx = io_find_index(fptr, RSTRING_PTR(rs), rslen); + if (idx >= 0) { /* found */ + mrb_int n = idx+rslen; + if (limit_given && limit < n) { + n = limit; + } + io_buf_cat(mrb, outbuf, fptr, n); + return outbuf; + } + } + if (limit_given) { + if (limit <= buf->len) { io_buf_cat(mrb, outbuf, fptr, limit); return outbuf; } - io_buf_cat_all(mrb, outbuf, fptr); - io_buf_fill(mrb, fptr); - if (fptr->eof) { - if (RSTRING_LEN(outbuf) == 0) return mrb_nil_value(); - return outbuf; - } - } - } - - for (;;) { /* with RS */ - int rslen = RSTRING_LEN(rs); - mrb_int idx = io_find_index(fptr, RSTRING_PTR(rs), rslen); - if (idx >= 0) { /* found */ - mrb_int n = idx+rslen; - if (limit_given && limit < n) { - n = limit; - } - io_buf_cat(mrb, outbuf, fptr, n); - return outbuf; - } - if (limit_given && buf->len < limit) { - io_buf_cat(mrb, outbuf, fptr, limit); - return outbuf; + limit -= buf->len; } io_buf_cat_all(mrb, outbuf, fptr); io_buf_fill(mrb, fptr);