1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* io.c (io_readpartial): Document the output buffer parameter is

overwritten with the read contents even when non-empty.
  Patch by yu nobuoka.  [ruby-trunk - Bug #6285]
* io.c (io_read_nonblock):  ditto.
* io.c (io_read):  ditto.
* io.c (rb_io_sysread):  ditto.
* io.c (argf_read):  ditto.
* io.c (argf_readpartial):  ditto.
* ext/stringio/stringio.c (strio_read):  ditto.
* test/ruby/test_argf.rb (class TestArgf):  Add test for existing
  behavior of read outbuf.
* test/ruby/test_io.rb (class TestIO):  ditto.
* test/stringio/test_stringio.rb (class TestStringIO):  ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35391 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
drbrain 2012-04-18 23:48:27 +00:00
parent aa883f84da
commit ab0eb272f9
6 changed files with 101 additions and 6 deletions

View file

@ -1,3 +1,19 @@
Thu Apr 19 08:47:54 2012 Eric Hodel <drbrain@segment7.net>
* io.c (io_readpartial): Document the output buffer parameter is
overwritten with the read contents even when non-empty.
Patch by yu nobuoka. [ruby-trunk - Bug #6285]
* io.c (io_read_nonblock): ditto.
* io.c (io_read): ditto.
* io.c (rb_io_sysread): ditto.
* io.c (argf_read): ditto.
* io.c (argf_readpartial): ditto.
* ext/stringio/stringio.c (strio_read): ditto.
* test/ruby/test_argf.rb (class TestArgf): Add test for existing
behavior of read outbuf.
* test/ruby/test_io.rb (class TestIO): ditto.
* test/stringio/test_stringio.rb (class TestStringIO): ditto.
Wed Apr 18 22:58:55 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (DOT, DOXYGEN): use AC_CHECK_PROGS instead of

View file

@ -1210,7 +1210,7 @@ strio_putc(VALUE self, VALUE ch)
/*
* call-seq:
* strio.read([length [, buffer]]) -> string, buffer, or nil
* strio.read([length [, outbuf]]) -> string, outbuf, or nil
*
* See IO#read.
*/

23
io.c
View file

@ -2281,6 +2281,8 @@ io_getpartial(int argc, VALUE *argv, VALUE io, int nonblock)
* It doesn't block if some data available.
* If the optional <i>outbuf</i> argument is present,
* it must reference a String, which will receive the data.
* The <i>outbuf</i> will contain only the received data after the method call
* even if it is not empty at the beginning.
* It raises <code>EOFError</code> on end of file.
*
* readpartial is designed for streams such as pipe, socket, tty, etc.
@ -2350,6 +2352,8 @@ io_readpartial(int argc, VALUE *argv, VALUE io)
*
* If the optional <i>outbuf</i> argument is present,
* it must reference a String, which will receive the data.
* The <i>outbuf</i> will contain only the received data after the method call
* even if it is not empty at the beginning.
*
* read_nonblock just calls the read(2) system call.
* It causes all errors the read(2) system call causes: Errno::EWOULDBLOCK, Errno::EINTR, etc.
@ -2483,7 +2487,7 @@ rb_io_write_nonblock(VALUE io, VALUE str)
/*
* call-seq:
* ios.read([length [, buffer]]) -> string, buffer, or nil
* ios.read([length [, outbuf]]) -> string, outbuf, or nil
*
* Reads <i>length</i> bytes from the I/O stream.
*
@ -2503,8 +2507,10 @@ rb_io_write_nonblock(VALUE io, VALUE str)
*
* If <i>length</i> is zero, it returns <code>""</code>.
*
* If the optional <i>buffer</i> argument is present, it must reference
* If the optional <i>outbuf</i> argument is present, it must reference
* a String, which will receive the data.
* The <i>outbuf</i> will contain only the received data after the method call
* even if it is not empty at the beginning.
*
* At end of file, it returns <code>nil</code> or <code>""</code>
* depend on <i>length</i>.
@ -4282,6 +4288,8 @@ rb_io_syswrite(VALUE io, VALUE str)
* that read from <em>ios</em> or you may get unpredictable results.
* If the optional <i>outbuf</i> argument is present, it must reference
* a String, which will receive the data.
* The <i>outbuf</i> will contain only the received data after the method call
* even if it is not empty at the beginning.
* Raises <code>SystemCallError</code> on error and
* <code>EOFError</code> at end of file.
*
@ -10333,7 +10341,7 @@ argf_eof(VALUE argf)
/*
* call-seq:
* ARGF.read([length [, buffer]]) -> string, buffer, or nil
* ARGF.read([length [, outbuf]]) -> string, outbuf, or nil
*
* Reads _length_ bytes from ARGF. The files named on the command line
* are concatenated and treated as a single file by this method, so when
@ -10350,8 +10358,10 @@ argf_eof(VALUE argf)
*
* If _length_ is zero, it returns _""_.
*
* If the optional _buffer_ argument is present, it must reference a String,
* If the optional _outbuf_ argument is present, it must reference a String,
* which will receive the data.
* The <i>outbuf</i> will contain only the received data after the method call
* even if it is not empty at the beginning.
*
* For example:
*
@ -10437,7 +10447,10 @@ static VALUE argf_getpartial(int argc, VALUE *argv, VALUE argf, int nonblock);
* Reads at most _maxlen_ bytes from the ARGF stream. It blocks only if
* +ARGF+ has no data immediately available. If the optional _outbuf_
* argument is present, it must reference a String, which will receive the
* data. It raises <code>EOFError</code> on end of file.
* data.
* The <i>outbuf</i> will contain only the received data after the method call
* even if it is not empty at the beginning.
* It raises <code>EOFError</code> on end of file.
*
* +readpartial+ is designed for streams such as pipes, sockets, and ttys. It
* blocks only when no data is immediately available. This means that it

View file

@ -446,6 +446,16 @@ class TestArgf < Test::Unit::TestCase
end
end
def test_read2_with_not_empty_buffer
ruby('-e', <<-SRC, @t1.path, @t2.path, @t3.path) do |f|
s = "0123456789"
ARGF.read(8, s)
p s
SRC
assert_equal("\"1\\n2\\n3\\n4\\n\"\n", f.read)
end
end
def test_read3
ruby('-e', <<-SRC, @t1.path, @t2.path, @t3.path) do |f|
nil while ARGF.gets
@ -463,6 +473,8 @@ class TestArgf < Test::Unit::TestCase
loop do
s << ARGF.readpartial(1)
t = ""; ARGF.readpartial(1, t); s << t
# not empty buffer
u = "abcdef"; ARGF.readpartial(1, u); s << u
end
rescue EOFError
puts s

View file

@ -991,6 +991,16 @@ class TestIO < Test::Unit::TestCase
}
end
def test_readpartial_with_not_empty_buffer
pipe(proc do |w|
w.write "foob"
w.close
end, proc do |r|
r.readpartial(5, s = "01234567")
assert_equal("foob", s)
end)
end
def test_readpartial_buffer_error
with_pipe do |r, w|
s = ""
@ -1026,6 +1036,16 @@ class TestIO < Test::Unit::TestCase
end
end
def test_read_with_not_empty_buffer
pipe(proc do |w|
w.write "foob"
w.close
end, proc do |r|
r.read(nil, s = "01234567")
assert_equal("foob", s)
end)
end
def test_read_buffer_error
with_pipe do |r, w|
s = ""
@ -1047,6 +1067,17 @@ class TestIO < Test::Unit::TestCase
end)
end
def test_read_nonblock_with_not_empty_buffer
skip "IO#read_nonblock is not supported on file/pipe." if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM
pipe(proc do |w|
w.write "foob"
w.close
end, proc do |r|
r.read_nonblock(5, s = "01234567")
assert_equal("foob", s)
end)
end
def test_read_nonblock_error
return if !have_nonblock?
skip "IO#read_nonblock is not supported on file/pipe." if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM
@ -1417,6 +1448,16 @@ class TestIO < Test::Unit::TestCase
end
end
def test_sysread_with_not_empty_buffer
pipe(proc do |w|
w.write "foob"
w.close
end, proc do |r|
r.sysread( 5, s = "01234567" )
assert_equal( "foob", s )
end)
end
def test_flag
t = make_tempfile

View file

@ -426,6 +426,11 @@ class TestStringIO < Test::Unit::TestCase
s = ""
f.read(nil, s)
assert_equal("\u3042\u3044", s, bug5207)
f.rewind
# not empty buffer
s = "0123456789"
f.read(nil, s)
assert_equal("\u3042\u3044", s)
end
def test_readpartial
@ -435,6 +440,10 @@ class TestStringIO < Test::Unit::TestCase
assert_equal("\u3042\u3044", f.readpartial)
f.rewind
assert_equal("\u3042\u3044".force_encoding(Encoding::ASCII_8BIT), f.readpartial(f.size))
f.rewind
# not empty buffer
s = '0123456789'
assert_equal("\u3042\u3044".force_encoding(Encoding::ASCII_8BIT), f.readpartial(f.size, s))
end
def test_read_nonblock
@ -444,6 +453,10 @@ class TestStringIO < Test::Unit::TestCase
assert_equal("\u3042\u3044", f.read_nonblock)
f.rewind
assert_equal("\u3042\u3044".force_encoding(Encoding::ASCII_8BIT), f.read_nonblock(f.size))
f.rewind
# not empty buffer
s = '0123456789'
assert_equal("\u3042\u3044".force_encoding(Encoding::ASCII_8BIT), f.read_nonblock(f.size, s))
end
def test_size