class Zipography::IOReverseChunks

Attributes

fsize[R]
io[R]

Public Class Methods

new(io, bufsiz: 4096, debug: false) click to toggle source
# File lib.rb, line 24
def initialize io, bufsiz: 4096, debug: false
  @io = io
  @fsize = io.stat.size
  @bufsiz = bufsiz > @fsize ? (@fsize/2.0).ceil : bufsiz

  @seek = -@bufsiz
  @io.seek @seek, IO::SEEK_END

  @debug = debug
  $stderr.puts "#{@io.path}: seek=#{@seek}, bufsiz=#{@bufsiz}" if @debug
end

Public Instance Methods

each() { |chunk| ... } click to toggle source
# File lib.rb, line 37
def each
  idx = 0
  while (chunk = @io.read(@bufsiz))
    return if chunk.size == 0

    yield chunk
    idx += 1

    return if @seek == 0

    @seek = -@bufsiz*(idx+1)
    begin
      @io.seek @seek, IO::SEEK_END
    rescue Errno::EINVAL
      @bufsiz = -(@bufsiz*(idx+1) - @fsize - @bufsiz)
      @seek = 0
      @io.seek @seek
    end

    $stderr.puts "#{@io.path}: seek=#{@seek}, bufsiz=#{@bufsiz}" if @debug
  end
end