diff options
| -rw-r--r-- | mrblib/io.rb | 32 | ||||
| -rw-r--r-- | src/io.c | 4 | ||||
| -rw-r--r-- | test/io.rb | 10 |
3 files changed, 22 insertions, 24 deletions
diff --git a/mrblib/io.rb b/mrblib/io.rb index 4262504f2..3ea839379 100644 --- a/mrblib/io.rb +++ b/mrblib/io.rb @@ -123,8 +123,11 @@ class IO def write(string) str = string.is_a?(String) ? string : string.to_s return str.size unless str.size > 0 + if 0 < @buf.length + # reset real pos ignore buf + seek(pos, SEEK_SET) + end len = syswrite(str) - @pos += len len end @@ -146,7 +149,7 @@ class IO def pos raise IOError if closed? - @pos + sysseek(0, SEEK_CUR) - @buf.length end alias_method :tell, :pos @@ -160,7 +163,7 @@ class IO def seek(i, whence = SEEK_SET) raise IOError if closed? - @pos = sysseek(i, whence) + sysseek(i, whence) @buf = '' 0 end @@ -172,7 +175,6 @@ class IO def ungetc(substr) raise TypeError.new "expect String, got #{substr.class}" unless substr.is_a?(String) - @pos -= substr.size if @buf.empty? @buf = substr.dup else @@ -195,7 +197,6 @@ class IO end array = [] - start_pos = @pos while 1 begin _read_buf @@ -204,15 +205,12 @@ class IO break end - if length && (@pos - start_pos + @buf.size) >= length - len = length - (@pos - start_pos) - array.push @buf[0, len] - @pos += len - @buf = @buf[len, @buf.size - len] + if length && length <= @buf.size + array.push @buf[0, length] + @buf = @buf[length, @buf.size - length] break else array.push @buf - @pos += @buf.size @buf = '' end end @@ -245,7 +243,6 @@ class IO end array = [] - start_pos = @pos while 1 begin _read_buf @@ -254,21 +251,17 @@ class IO break end - if limit && (@pos - start_pos + @buf.size) >= limit - len = limit - (@pos - start_pos) - array.push @buf[0, len] - @pos += len - @buf = @buf[len, @buf.size - len] + if limit && limit <= @buf.size + array.push @buf[0, limit] + @buf = @buf[limit, @buf.size - limit] break elsif idx = @buf.index(rs) len = idx + rs.size array.push @buf[0, len] - @pos += len @buf = @buf[len, @buf.size - len] break else array.push @buf - @pos += @buf.size @buf = '' end end @@ -290,7 +283,6 @@ class IO _read_buf c = @buf[0] @buf = @buf[1, @buf.size] - @pos += 1 c end @@ -389,7 +389,6 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) } mrb_iv_set(mrb, io, mrb_intern_cstr(mrb, "@buf"), mrb_str_new_cstr(mrb, "")); - mrb_iv_set(mrb, io, mrb_intern_cstr(mrb, "@pos"), mrb_fixnum_value(0)); fptr = mrb_io_alloc(mrb); fptr->fd = fd; @@ -443,7 +442,6 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io) flags = mrb_io_modestr_to_flags(mrb, mrb_string_value_cstr(mrb, &mode)); mrb_iv_set(mrb, io, mrb_intern_cstr(mrb, "@buf"), mrb_str_new_cstr(mrb, "")); - mrb_iv_set(mrb, io, mrb_intern_cstr(mrb, "@pos"), mrb_fixnum_value(0)); fptr = (struct mrb_io *)DATA_PTR(io); if (fptr != NULL) { @@ -801,7 +799,6 @@ mrb_io_s_pipe(mrb_state *mrb, mrb_value klass) r = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type)); mrb_iv_set(mrb, r, mrb_intern_cstr(mrb, "@buf"), mrb_str_new_cstr(mrb, "")); - mrb_iv_set(mrb, r, mrb_intern_cstr(mrb, "@pos"), mrb_fixnum_value(0)); fptr_r = mrb_io_alloc(mrb); fptr_r->fd = pipes[0]; fptr_r->readable = 1; @@ -812,7 +809,6 @@ mrb_io_s_pipe(mrb_state *mrb, mrb_value klass) w = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type)); mrb_iv_set(mrb, w, mrb_intern_cstr(mrb, "@buf"), mrb_str_new_cstr(mrb, "")); - mrb_iv_set(mrb, w, mrb_intern_cstr(mrb, "@pos"), mrb_fixnum_value(0)); fptr_w = mrb_io_alloc(mrb); fptr_w->fd = pipes[1]; fptr_w->readable = 0; diff --git a/test/io.rb b/test/io.rb index b654ff213..f1dd7afe8 100644 --- a/test/io.rb +++ b/test/io.rb @@ -181,6 +181,16 @@ assert('IO#write', '15.2.20.5.20') do io = IO.open(IO.sysopen($mrbtest_io_wfname)) assert_equal 0, io.write("") io.close + + io = IO.open(IO.sysopen($mrbtest_io_wfname, "r+"), "r+") + assert_equal 7, io.write("abcdefg") + io.rewind + assert_equal "ab", io.read(2) + assert_equal 3, io.write("123") + io.rewind + assert_equal "ab123fg", io.read + io.close + true end |
