lib/zip/ioextras.rb in rubyzip-0.9.9 vs lib/zip/ioextras.rb in rubyzip-1.0.0.beta1
- old
+ new
@@ -1,164 +1,186 @@
-module IOExtras #:nodoc:
+module Zip
+ module IOExtras #:nodoc:
- CHUNK_SIZE = 131072
+ CHUNK_SIZE = 131072
- RANGE_ALL = 0..-1
+ RANGE_ALL = 0..-1
- def self.copy_stream(ostream, istream)
- s = ''
- ostream.write(istream.read(CHUNK_SIZE, s)) until istream.eof?
- end
+ def self.copy_stream(ostream, istream)
+ s = ''
+ ostream.write(istream.read(CHUNK_SIZE, s)) until istream.eof?
+ end
- def self.copy_stream_n(ostream, istream, nbytes)
- s = ''
- toread = nbytes
- while (toread > 0 && ! istream.eof?)
- tr = toread > CHUNK_SIZE ? CHUNK_SIZE : toread
- ostream.write(istream.read(tr, s))
- toread -= tr
- end
- end
+ def self.copy_stream_n(ostream, istream, nbytes)
+ s = ''
+ toread = nbytes
+ while (toread > 0 && !istream.eof?)
+ tr = toread > CHUNK_SIZE ? CHUNK_SIZE : toread
+ ostream.write(istream.read(tr, s))
+ toread -= tr
+ end
+ end
- # Implements kind_of? in order to pretend to be an IO object
- module FakeIO
- def kind_of?(object)
- object == IO || super
+ # Implements kind_of? in order to pretend to be an IO object
+ module FakeIO
+ def kind_of?(object)
+ object == IO || super
+ end
end
- end
- # Implements many of the convenience methods of IO
- # such as gets, getc, readline and readlines
- # depends on: input_finished?, produce_input and read
- module AbstractInputStream
- include Enumerable
- include FakeIO
+ # Implements many of the convenience methods of IO
+ # such as gets, getc, readline and readlines
+ # depends on: input_finished?, produce_input and read
+ module AbstractInputStream
+ include Enumerable
+ include FakeIO
- def initialize
- super
- @lineno = 0
- @outputBuffer = ""
- end
+ def initialize
+ super
+ @lineno = 0
+ @pos = 0
+ @output_buffer = ""
+ end
- attr_accessor :lineno
+ attr_accessor :lineno
+ attr_reader :pos
- def read(numberOfBytes = nil, buf = nil)
- tbuf = nil
+ def read(numberOfBytes = nil, buf = nil)
+ tbuf = nil
- if @outputBuffer.bytesize > 0
- if numberOfBytes <= @outputBuffer.bytesize
- tbuf = @outputBuffer.slice!(0, numberOfBytes)
+ if @output_buffer.bytesize > 0
+ if numberOfBytes <= @output_buffer.bytesize
+ tbuf = @output_buffer.slice!(0, numberOfBytes)
+ else
+ numberOfBytes -= @output_buffer.bytesize if (numberOfBytes)
+ rbuf = sysread(numberOfBytes, buf)
+ tbuf = @output_buffer
+ tbuf << rbuf if (rbuf)
+ @output_buffer = ""
+ end
else
- numberOfBytes -= @outputBuffer.bytesize if (numberOfBytes)
- rbuf = sysread(numberOfBytes, buf)
- tbuf = @outputBuffer
- tbuf << rbuf if (rbuf)
- @outputBuffer = ""
+ tbuf = sysread(numberOfBytes, buf)
end
- else
- tbuf = sysread(numberOfBytes, buf)
- end
- return nil unless (tbuf)
+ @pos += tbuf.length
- if buf
- buf.replace(tbuf)
- else
- buf = tbuf
+ return nil unless (tbuf)
+
+ if buf
+ buf.replace(tbuf)
+ else
+ buf = tbuf
+ end
+
+ buf
end
- buf
- end
+ def readlines(aSepString = $/)
+ retVal = []
+ each_line(aSepString) { |line| retVal << line }
+ retVal
+ end
- def readlines(aSepString = $/)
- retVal = []
- each_line(aSepString) { |line| retVal << line }
- retVal
- end
+ def gets(aSepString = $/, numberOfBytes = nil)
+ @lineno = @lineno.next
- def gets(aSepString = $/)
- @lineno = @lineno.next
- return read if aSepString.nil?
- aSepString = "#{$/}#{$/}" if aSepString.empty?
+ if numberOfBytes.respond_to?(:to_int)
+ numberOfBytes = numberOfBytes.to_int
+ aSepString = aSepString.to_str if aSepString
+ elsif aSepString.respond_to?(:to_int)
+ numberOfBytes = aSepString.to_int
+ aSepString = $/
+ else
+ numberOfBytes = nil
+ aSepString = aSepString.to_str if aSepString
+ end
- bufferIndex = 0
- while ((matchIndex = @outputBuffer.index(aSepString, bufferIndex)) == nil)
- bufferIndex = @outputBuffer.bytesize
- if input_finished?
- return @outputBuffer.empty? ? nil : flush
+ return read(numberOfBytes) if aSepString.nil?
+ aSepString = "#{$/}#{$/}" if aSepString.empty?
+
+ bufferIndex = 0
+ overLimit = (numberOfBytes && @output_buffer.bytesize >= numberOfBytes)
+ while ((matchIndex = @output_buffer.index(aSepString, bufferIndex)) == nil && !overLimit)
+ bufferIndex = [bufferIndex, @output_buffer.bytesize - aSepString.bytesize].max
+ if input_finished?
+ return @output_buffer.empty? ? nil : flush
+ end
+ @output_buffer << produce_input
+ overLimit = (numberOfBytes && @output_buffer.bytesize >= numberOfBytes)
end
- @outputBuffer << produce_input
+ sepIndex = [matchIndex + aSepString.bytesize, numberOfBytes || @output_buffer.bytesize].min
+ @pos += sepIndex
+ return @output_buffer.slice!(0...sepIndex)
end
- sepIndex = matchIndex + aSepString.bytesize
- return @outputBuffer.slice!(0...sepIndex)
- end
- def flush
- retVal = @outputBuffer
- @outputBuffer=""
- return retVal
- end
+ def flush
+ retVal = @output_buffer
+ @output_buffer=""
+ return retVal
+ end
- def readline(aSepString = $/)
- retVal = gets(aSepString)
- raise EOFError if retVal == nil
- retVal
- end
+ def readline(aSepString = $/)
+ retVal = gets(aSepString)
+ raise EOFError if retVal == nil
+ retVal
+ end
- def each_line(aSepString = $/)
- while true
- yield readline(aSepString)
+ def each_line(aSepString = $/)
+ while true
+ yield readline(aSepString)
+ end
+ rescue EOFError
end
- rescue EOFError
+
+ alias_method :each, :each_line
end
- alias_method :each, :each_line
- end
+ # Implements many of the output convenience methods of IO.
+ # relies on <<
+ module AbstractOutputStream
+ include FakeIO
- # Implements many of the output convenience methods of IO.
- # relies on <<
- module AbstractOutputStream
- include FakeIO
+ def write(data)
+ self << data
+ data.to_s.bytesize
+ end
- def write(data)
- self << data
- data.to_s.bytesize
- end
+ def print(*params)
+ self << params.join($,) << $\.to_s
+ end
- def print(*params)
- self << params.join($,) << $\.to_s
- end
+ def printf(aFormatString, *params)
+ self << sprintf(aFormatString, *params)
+ end
- def printf(aFormatString, *params)
- self << sprintf(aFormatString, *params)
- end
-
- def putc(anObject)
- self << case anObject
- when Fixnum then anObject.chr
- when String then anObject
- else raise TypeError, "putc: Only Fixnum and String supported"
+ def putc(anObject)
+ self << case anObject
+ when Fixnum then
+ anObject.chr
+ when String then
+ anObject
+ else
+ raise TypeError, "putc: Only Fixnum and String supported"
+ end
+ anObject
end
- anObject
- end
- def puts(*params)
- params << "\n" if params.empty?
- params.flatten.each do |element|
- val = element.to_s
- self << val
- self << "\n" unless val[-1,1] == "\n"
+ def puts(*params)
+ params << "\n" if params.empty?
+ params.flatten.each do |element|
+ val = element.to_s
+ self << val
+ self << "\n" unless val[-1, 1] == "\n"
+ end
end
+
end
- end
-
-end # IOExtras namespace module
-
-
+ end # IOExtras namespace module
+end
# Copyright (C) 2002-2004 Thomas Sondergaard
# rubyzip is free software; you can redistribute it and/or
# modify it under the terms of the ruby license.