Merged patch from oss-ruby at technorama.net

This commit is contained in:
thomas 2005-09-03 07:57:50 +00:00
parent b2060aa257
commit 7cf8aabc8f
3 changed files with 40 additions and 11 deletions

View File

@ -2,6 +2,8 @@ module IOExtras #:nodoc:
CHUNK_SIZE = 32768
RANGE_ALL = 0..-1
def self.copy_stream(ostream, istream)
s = ''
ostream.write(istream.read(CHUNK_SIZE, s)) until istream.eof?
@ -30,6 +32,32 @@ module IOExtras #:nodoc:
attr_accessor :lineno
def read(numberOfBytes = nil, buf = nil)
buf = "" unless (buf)
if numberOfBytes
if numberOfBytes <= @outputBuffer.length
buf[RANGE_ALL] = @outputBuffer.slice!(0, numberOfBytes)
else
if @outputBuffer.length > 0
buf[RANGE_ALL] = @outputBuffer + sysread(numberOfBytes - @outputBuffer.length, buf)
@outputBuffer.slice!(RANGE_ALL)
else
buf[RANGE_ALL] = sysread(nil, buf)
end
end
else
if @outputBuffer.length > 0
buf[RANGE_ALL] = @outputBuffer + sysread(nil, buf)
@outputBuffer.slice!(RANGE_ALL)
else
buf[RANGE_ALL] = sysread(nil, buf)
end
end
buf
end
def readlines(aSepString = $/)
retVal = []
each_line(aSepString) { |line| retVal << line }

View File

@ -120,8 +120,8 @@ module Zip
end
# Modeled after IO.read
def read(numberOfBytes = nil)
@decompressor.read(numberOfBytes)
def sysread(numberOfBytes = nil, buf = nil)
@decompressor.sysread(numberOfBytes, buf)
end
protected
@ -170,7 +170,8 @@ module Zip
@hasReturnedEmptyString = ! EMPTY_FILE_RETURNS_EMPTY_STRING_FIRST
end
def read(numberOfBytes = nil)
# BUG: do something with buf
def sysread(numberOfBytes = nil, buf = nil)
readEverything = (numberOfBytes == nil)
while (readEverything || @outputBuffer.length < numberOfBytes)
break if internal_input_finished?
@ -221,7 +222,7 @@ module Zip
end
# TODO: Specialize to handle different behaviour in ruby > 1.7.0 ?
def read(numberOfBytes = nil)
def sysread(numberOfBytes = nil, buf = nil)
if input_finished?
hasReturnedEmptyStringVal=@hasReturnedEmptyString
@hasReturnedEmptyString=true
@ -233,11 +234,11 @@ module Zip
numberOfBytes = @charsToRead-@readSoFar
end
@readSoFar += numberOfBytes
@inputStream.read(numberOfBytes)
@inputStream.read(numberOfBytes, buf)
end
def produce_input
read(Decompressor::CHUNK_SIZE)
sysread(Decompressor::CHUNK_SIZE)
end
def input_finished?
@ -247,7 +248,7 @@ module Zip
class NullDecompressor #:nodoc:all
include Singleton
def read(numberOfBytes = nil)
def sysread(numberOfBytes = nil, buf = nil)
nil
end

View File

@ -276,12 +276,12 @@ module DecompressorTests
end
def test_readEverything
assert_equal(@refText, @decompressor.read)
assert_equal(@refText, @decompressor.sysread)
end
def test_readInChunks
chunkSize = 5
while (decompressedChunk = @decompressor.read(chunkSize))
while (decompressedChunk = @decompressor.sysread(chunkSize))
assert_equal(@refText.slice!(0, chunkSize), decompressedChunk)
end
assert_equal(0, @refText.size)
@ -293,7 +293,7 @@ module DecompressorTests
assert(@refLines.length > 40)
assert_equal(@refText[0...100], @decompressor.read(100))
assert_equal(@refText[0...100], @decompressor.sysread(100))
assert(! @decompressor.input_finished?)
buf = @decompressor.produce_input
@ -568,7 +568,7 @@ class DeflaterTest < Test::Unit::TestCase
File.open(fileName, "rb") {
|file|
inflater = Inflater.new(file)
txt = inflater.read
txt = inflater.sysread
}
end