Zlib::GzipReader is the class for reading a gzipped file. GzipReader should be used an IO, or -IO-lie, object.
Zlib::GzipReader.open('hoge.gz') {|gz| print gz.read } File.open('hoge.gz') do |f| gz = Zlib::GzipReader.new(f) print gz.read gz.close end # TODO: test these. Are they equivalent? Can GzipReader.new take a # block?
The following methods in Zlib::GzipReader are just like their counterparts in IO, but they raise Zlib::Error or Zlib::GzipFile::Error exception if an error was found in the gzip file.
Be careful of the footer of the gzip file. A gzip file has the checksum of
pre-compressed data in its footer. GzipReader
checks all uncompressed data against that checksum at the following cases,
and if it fails, raises Zlib::GzipFile::NoFooter
,
Zlib::GzipFile::CRCError
, or
Zlib::GzipFile::LengthError
exception.
When an reading request is received beyond the end of file (the end of compressed data). That is, when #read, #gets, or some other methods for reading returns nil.
When Zlib::GzipFile#close method is called after the object reaches the end of file.
When #unused method is called after the object reaches the end of file.
The rest of the methods are adequately described in their own documentation.
Creates a GzipReader object associated with
io
. The GzipReader object reads
gzipped data from io
, and parses/decompresses them. At least,
io
must have a read
method that behaves same as
the read
method in IO class.
If the gzip file header is incorrect, raises an Zlib::GzipFile::Error exception.
static VALUE rb_gzreader_initialize(obj, io) VALUE obj, io; { struct gzfile *gz; int err; Data_Get_Struct(obj, struct gzfile, gz); /* this is undocumented feature of zlib */ err = inflateInit2(&gz->z.stream, -MAX_WBITS); if (err != Z_OK) { raise_zlib_error(err, gz->z.stream.msg); } gz->io = io; ZSTREAM_READY(&gz->z); gzfile_read_header(gz); return obj; }
Opens a file specified by filename
as a gzipped file, and
returns a GzipReader object associated with
that file. Further details of this method are in ::new and ZLib::GzipReader.wrap.
static VALUE rb_gzreader_s_open(argc, argv, klass) int argc; VALUE *argv; VALUE klass; { return gzfile_s_open(argc, argv, klass, "rb"); }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_each(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { VALUE str; while (!NIL_P(str = gzreader_gets(argc, argv, obj))) { rb_yield(str); } return obj; }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_each_byte(obj) VALUE obj; { VALUE c; while (!NIL_P(c = rb_gzreader_getc(obj))) { rb_yield(c); } return Qnil; }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_each(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { VALUE str; while (!NIL_P(str = gzreader_gets(argc, argv, obj))) { rb_yield(str); } return obj; }
???
static VALUE rb_gzfile_eof_p(obj) VALUE obj; { struct gzfile *gz = get_gzfile(obj); return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse; }
???
static VALUE rb_gzfile_eof_p(obj) VALUE obj; { struct gzfile *gz = get_gzfile(obj); return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse; }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_getc(obj) VALUE obj; { struct gzfile *gz = get_gzfile(obj); VALUE dst; dst = gzfile_read(gz, 1); if (!NIL_P(dst)) { dst = INT2FIX((unsigned int)(RSTRING(dst)->ptr[0]) & 0xff); } return dst; }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_gets(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { VALUE dst; dst = gzreader_gets(argc, argv, obj); if (!NIL_P(dst)) { rb_lastline_set(dst); } return dst; }
???
static VALUE rb_gzfile_lineno(obj) VALUE obj; { return INT2NUM(get_gzfile(obj)->lineno); }
???
static VALUE rb_gzfile_set_lineno(obj, lineno) VALUE obj, lineno; { struct gzfile *gz = get_gzfile(obj); gz->lineno = NUM2INT(lineno); return lineno; }
???
static VALUE rb_gzfile_total_out(obj) VALUE obj; { struct gzfile *gz = get_gzfile(obj); return rb_uint2inum(gz->z.stream.total_out - gz->z.buf_filled); }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_read(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { struct gzfile *gz = get_gzfile(obj); VALUE vlen; int len; rb_scan_args(argc, argv, "01", &vlen); if (NIL_P(vlen)) { return gzfile_read_all(gz); } len = NUM2INT(vlen); if (len < 0) { rb_raise(rb_eArgError, "negative length %d given", len); } return gzfile_read(gz, len); }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_readchar(obj) VALUE obj; { VALUE dst; dst = rb_gzreader_getc(obj); if (NIL_P(dst)) { rb_raise(rb_eEOFError, "end of file reached"); } return dst; }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_readline(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { VALUE dst; dst = rb_gzreader_gets(argc, argv, obj); if (NIL_P(dst)) { rb_raise(rb_eEOFError, "end of file reached"); } return dst; }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_readlines(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { VALUE str, dst; dst = rb_ary_new(); while (!NIL_P(str = gzreader_gets(argc, argv, obj))) { rb_ary_push(dst, str); } return dst; }
Resets the position of the file pointer to the point created the GzipReader object. The associated IO object
needs to respond to the seek
method.
static VALUE rb_gzreader_rewind(obj) VALUE obj; { struct gzfile *gz = get_gzfile(obj); gzfile_reader_rewind(gz); return INT2FIX(0); }
???
static VALUE rb_gzfile_total_out(obj) VALUE obj; { struct gzfile *gz = get_gzfile(obj); return rb_uint2inum(gz->z.stream.total_out - gz->z.buf_filled); }
See Zlib::GzipReader documentation for a description.
static VALUE rb_gzreader_ungetc(obj, ch) VALUE obj, ch; { struct gzfile *gz = get_gzfile(obj); gzfile_ungetc(gz, NUM2CHR(ch)); return Qnil; }