class Zlib::GzipReader

Public Class Methods

new(io,level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY) click to toggle source
# File lib/pr/zlib.rb, line 1227
def initialize(io,level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY)
  gzfile_new(InflateFuncs, :gzfile_reader_end)
  @gz.level = level
  err = inflateInit2(@gz.z.stream, -MAX_WBITS)
  if (err != Z_OK)
    raise_zlib_error(err, @gz.stream.msg)
  end
  @gz.io = io
  @gz.z.ZSTREAM_READY()
  gzfile_read_header()
  self
end
open(filename,level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY,&blk) click to toggle source
# File lib/pr/zlib.rb, line 1223
def self.open(filename,level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY,&blk)
  GzipReader.gzfile_s_open(filename,"rb",level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY,&blk)
end

Public Instance Methods

each(rs=$/) { |str| ... } click to toggle source
# File lib/pr/zlib.rb, line 1296
def each(rs=$/)
  while (str = gzreader_gets(rs))
    yield(str)
  end
  self
end
Also aliased as: each_line
each_byte() { |c| ... } click to toggle source
# File lib/pr/zlib.rb, line 1274
def each_byte()
  while (c = getc)
    yield(c)
  end
  nil
end
each_line(rs=$/)
Alias for: each
eof() click to toggle source
# File lib/pr/zlib.rb, line 1208
def eof
  raise GzipFile::Error,"closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
  GZFILE_IS_FINISHED(@gz)
end
Also aliased as: eof?
eof?()
Alias for: eof
getc() click to toggle source
# File lib/pr/zlib.rb, line 1261
def getc()
  dst = gzfile_read(1)
  dst ? dst[0] : dst
end
gets(rs=$/) click to toggle source
# File lib/pr/zlib.rb, line 1286
def gets(rs=$/)
  dst = gzreader_gets(rs)
  $_ = dst if dst
  dst
end
lineno() click to toggle source
# File lib/pr/zlib.rb, line 1198
def lineno
  raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
  @gz.lineno
end
lineno=(lineno) click to toggle source
# File lib/pr/zlib.rb, line 1203
def lineno=(lineno)
  raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
  @gz.lineno = lineno
end
pos() click to toggle source
# File lib/pr/zlib.rb, line 1214
def pos
  if @gz.z.buf.nil?
    @gz.z.stream.total_out
  else
    @gz.z.stream.total_out - @gz.z.buf.offset
  end
end
Also aliased as: tell
read(len=nil) click to toggle source
# File lib/pr/zlib.rb, line 1249
def read(len=nil)
  if len.nil?
    return gzfile_read_all()
  end

  if len < 0
    raise ArgumentError, "negative length #{len} given"
  end

  return gzfile_read(len)
end
readchar() click to toggle source
# File lib/pr/zlib.rb, line 1266
def readchar()
  dst = getc()
  if dst.nil?
    raise EOFError, "end of file reached"
  end
  dst
end
readline(rs=$/) click to toggle source
# File lib/pr/zlib.rb, line 1292
def readline(rs=$/)
  gets(rs)
end
readlines(rs=$/) click to toggle source
# File lib/pr/zlib.rb, line 1304
def readlines(rs=$/)
  dst = []
  while str = gzreader_gets(rs)
    dst.push(str)
  end
  dst
end
rewind() click to toggle source
# File lib/pr/zlib.rb, line 1240
def rewind()
  gzfile_reader_rewind()
  return 0
end
tell()
Alias for: pos
ungetc(ch) click to toggle source
# File lib/pr/zlib.rb, line 1281
def ungetc(ch)
  gzfile_ungetc(ch)
  nil
end
unused() click to toggle source
# File lib/pr/zlib.rb, line 1245
def unused()
  gzfile_reader_get_unused()
end

Private Instance Methods

gzfile_read(len) click to toggle source
# File lib/pr/zlib.rb, line 1420
def gzfile_read(len)
  if len < 0
    raise ArgumentError, "negative length #{len} given"
  end

  if len.zero?
    return ""
  end

  while (!@gz.z.ZSTREAM_IS_FINISHED() && @gz.z.buf.offset < len)
    gzfile_read_more()
  end

  if (GZFILE_IS_FINISHED(@gz))
    if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
      gzfile_check_footer()
    end
    return nil
  end

  dst = @gz.z.zstream_shift_buffer(len)
  gzfile_calc_crc(dst)
  dst
end
gzfile_read_all() click to toggle source
# File lib/pr/zlib.rb, line 1445
def gzfile_read_all()
  while (!@gz.z.ZSTREAM_IS_FINISHED())
    gzfile_read_more()
  end
  if (GZFILE_IS_FINISHED(@gz))
    if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
      gzfile_check_footer()
    end
    return ''
  end

  dst = @gz.z.zstream_detach_buffer()
  gzfile_calc_crc(dst)
  dst
end
gzfile_read_more() click to toggle source
# File lib/pr/zlib.rb, line 1495
def gzfile_read_more
  while (!@gz.z.ZSTREAM_IS_FINISHED())
    str = gzfile_read_raw()
    if str.nil?
      if (!@gz.z.ZSTREAM_IS_FINISHED())
        raise Error, "unexpected end of file"
      end
      break
    end
    if (str.length > 0)
      @gz.z.zstream_run(str, str.length,Z_SYNC_FLUSH)
    end
    break if (@gz.z.buf.offset > 0)
  end
  @gz.z.buf.offset
end
gzfile_read_raw() click to toggle source
# File lib/pr/zlib.rb, line 1461
def gzfile_read_raw()
  str = @gz.io.read(GZFILE_READ_SIZE)
  if str && str.class != String
    raise TypeError,"wrong argument type #{rs.class} (expected String)"
  end
  str
end
gzfile_read_raw_ensure(size) click to toggle source
# File lib/pr/zlib.rb, line 1469
def gzfile_read_raw_ensure(size)
  while @gz.z.input.nil? || @gz.z.input.length < size
    str = gzfile_read_raw()
    return false if str.nil?
    @gz.z.zstream_append_input(str,str.length)
  end
  true
end
gzfile_read_raw_until_zero(offset) click to toggle source
# File lib/pr/zlib.rb, line 1478
def gzfile_read_raw_until_zero(offset)
  ap = nil

  loop do
    ap = @gz.z.input[offset, @gz.z.input.length-offset].index(0.chr)
    break if ap
    str = gzfile_read_raw()

    raise Error, "unexpected end of file" if str.nil?

    offset = @gz.z.input.length
    @gz.z.zstream_append_input(str,str.length)
  end

  ap
end
gzfile_reader_end() click to toggle source
# File lib/pr/zlib.rb, line 1322
def gzfile_reader_end()
  return if @gz.z.ZSTREAM_IS_CLOSING()
  @gz.z.flags |= ZSTREAM_FLAG_CLOSING
  begin
    gzfile_reader_end_run()
  ensure
    @gz.z.zstream_end()
  end
end
gzfile_reader_end_run() click to toggle source
# File lib/pr/zlib.rb, line 1314
def gzfile_reader_end_run()
  if (GZFILE_IS_FINISHED(@gz) && (@gz.z.flags &
    GZFILE_FLAG_FOOTER_FINISHED).zero?)
    gzfile_check_footer()
  end
  nil
end
gzfile_reader_get_unused() click to toggle source
# File lib/pr/zlib.rb, line 1346
def gzfile_reader_get_unused()
  return nil if (!@gz.z.ZSTREAM_IS_READY())
  return nil if (!GZFILE_IS_FINISHED(@gz))
  if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
    gzfile_check_footer()
  end
  return nil if @gz.z.input.nil?
  @gz.z.input.dup
end
gzfile_reader_rewind() click to toggle source
# File lib/pr/zlib.rb, line 1337
def gzfile_reader_rewind
  n = @gz.z.stream.total_in
  if @gz.z.input
    n += @gz.z.input.length
  end
  @gz.io.seek(-n,1)
  gzfile_reset()
end
gzfile_ungetc(c) click to toggle source
# File lib/pr/zlib.rb, line 1332
def gzfile_ungetc(c)
  @gz.z.zstream_buffer_ungetc(c)
  @gz.ungetc+=1
end
gzreader_gets(rs=$/) click to toggle source
# File lib/pr/zlib.rb, line 1360
def gzreader_gets(rs=$/)
  if rs && rs.class != String
    raise TypeError,"wrong argument type #{rs.class} (expected String)"
  end
  if rs.nil?
    dst = gzfile_read_all()
    @gz.lineno += 1 if dst.length.nonzero?
    return dst
  end
  if rs.length.zero?
    rsptr = "\n\n"
    rslen = 2
    rspara = true
  else
    rsptr = rs
    rslen = rs.length
    rspara = false
  end
  if rspara
    gzreader_skip_linebreaks
  end
  while (@gz.z.buf.offset < rslen)
    if (@gz.z.ZSTREAM_IS_FINISHED())
      @gz.lineno+=1 if (@gz.z.buf.offset > 0)
      return gzfile_read(rslen)
    end
    gzfile_read_more()
  end

  ap = 0
  n = rslen
  loop do
    if (n > @gz.z.buf.offset)
      break if (@gz.z.ZSTREAM_IS_FINISHED())
      gzfile_read_more()
      ap = n - rslen
    end

    rscheck(rsptr, rslen, rs) if (!rspara)
    res = @gz.z.buf.buffer[ap,@gz.z.buf.offset - n + 1].index(rsptr[0])

    if res.nil?
      n = @gz.z.buf.offset + 1
    else
      n += (res - ap)
      ap = res
      break if (rslen == 1 || @gz.z.buf.buffer[ap,rslen]==rsptr)
      ap+=1
      n+=1
    end
  end

  @gz.lineno+=1
  dst = gzfile_read(n)
  if (rspara)
    gzreader_skip_linebreaks()
  end
  dst
end
rscheck(rsptr,rslen,rs) click to toggle source
# File lib/pr/zlib.rb, line 1356
def rscheck(rsptr,rslen,rs)
  raise RuntimeError, "rs modified" if rs != rsptr
end