In: |
zlib/zlib.c
|
Parent: | Zlib::GzipFile |
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.
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.
/* * call-seq: Zlib::GzipReader.new(io) * * 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 Zlib::GzipReader.new and ZLib::GzipReader.wrap.
/* * call-seq: Zlib::GzipReader.open(filename) {|gz| ... } * * 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 Zlib::GzipReader.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.
/* * 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.
/* * 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.
/* * 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.
/* * 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.
/* * 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.
/* * 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.
/* * 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.
/* * 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.
/* * 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.
/* * 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.
/* * 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; }
Returns the rest of the data which had read for parsing gzip format, or nil if the whole gzip file is not parsed yet.
/* * Returns the rest of the data which had read for parsing gzip format, or * +nil+ if the whole gzip file is not parsed yet. */ static VALUE rb_gzreader_unused(obj) VALUE obj; { struct gzfile *gz; Data_Get_Struct(obj, struct gzfile, gz); return gzfile_reader_get_unused(gz); }