diff --git a/lib/zip/ioextras.rb b/lib/zip/ioextras.rb index e58e7f9..c458bb5 100755 --- a/lib/zip/ioextras.rb +++ b/lib/zip/ioextras.rb @@ -33,26 +33,28 @@ module IOExtras #:nodoc: attr_accessor :lineno def read(numberOfBytes = nil, buf = nil) - buf = "" unless (buf) + tbuf = nil - if numberOfBytes + if @outputBuffer.length > 0 if numberOfBytes <= @outputBuffer.length - buf[RANGE_ALL] = @outputBuffer.slice!(0, numberOfBytes) + tbuf = @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(numberOfBytes, buf) - end + numberOfBytes -= @outputBuffer.length if (numberOfBytes) + rbuf = sysread(numberOfBytes, buf) + tbuf = @outputBuffer + tbuf << rbuf if (rbuf) + @outputBuffer = "" 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 + tbuf = sysread(numberOfBytes, buf) + end + + return nil unless (tbuf) + + if buf + buf.replace(tbuf) + else + buf = tbuf end buf diff --git a/lib/zip/zip.rb b/lib/zip/zip.rb index 7340129..b268a2f 100755 --- a/lib/zip/zip.rb +++ b/lib/zip/zip.rb @@ -177,7 +177,7 @@ module Zip readEverything = (numberOfBytes == nil) while (readEverything || @outputBuffer.length < numberOfBytes) break if internal_input_finished? - @outputBuffer << internal_produce_input + @outputBuffer << internal_produce_input(buf) end return value_when_finished if @outputBuffer.length==0 && input_finished? endIndex= numberOfBytes==nil ? @outputBuffer.length : numberOfBytes @@ -199,8 +199,8 @@ module Zip private - def internal_produce_input - @zlibInflater.inflate(@inputStream.read(Decompressor::CHUNK_SIZE)) + def internal_produce_input(buf = nil) + @zlibInflater.inflate(@inputStream.read(Decompressor::CHUNK_SIZE, buf)) end def internal_input_finished?