Class: Zlib::GzipReader
- Includes:
- Enumerable
- Defined in:
- ext/zlib/zlib.c,
ext/zlib/zlib.c
Overview
Zlib::GzipReader is the class for reading a gzipped file. GzipReader should be used as an IO, or -IO-like, 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
Method Catalogue
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.
-
#each
-
#each_line
-
#each_byte
-
#gets
-
#getc
-
#lineno
-
#lineno=
-
#read
-
#readchar
-
#readline
-
#readlines
-
#ungetc
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 Zlib::GzipReader#read, Zlib::GzipReader#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 Zlib::GzipReader#unused method is called after the object reaches the end of file.
The rest of the methods are adequately described in their own documentation.
Class Method Summary collapse
-
.open(*args) ⇒ Object
call-seq: Zlib::GzipReader.open(filename) {|gz| … }.
-
.zcat(*args) ⇒ Object
call-seq: Zlib::GzipReader.zcat(io, options = {}, &block) => nil Zlib::GzipReader.zcat(io, options = {}) => string.
Instance Method Summary collapse
-
#each(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#each_byte ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#each_char ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#each_line(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#eof ⇒ Object
Returns
trueorfalsewhether the stream has reached the end. -
#eof? ⇒ Boolean
Returns
trueorfalsewhether the stream has reached the end. -
#external_encoding ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#getbyte ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#getc ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#gets(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#initialize(*args) ⇒ Object
constructor
call-seq: Zlib::GzipReader.new(io, options = {}).
-
#lineno ⇒ Object
The line number of the last row read from this file.
-
#lineno=(lineno) ⇒ Object
Specify line number of the last row read from this file.
-
#pos ⇒ Object
Total number of output bytes output so far.
-
#read(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#readbyte ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#readchar ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#readline(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#readlines(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#readpartial(*args) ⇒ Object
call-seq: gzipreader.readpartial(maxlen [, outbuf]) => string, outbuf.
-
#rewind ⇒ Object
Resets the position of the file pointer to the point created the GzipReader object.
-
#tell ⇒ Object
Total number of output bytes output so far.
-
#ungetbyte(ch) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#ungetc(s) ⇒ Object
See Zlib::GzipReader documentation for a description.
-
#unused ⇒ Object
Returns the rest of the data which had read for parsing gzip format, or
nilif the whole gzip file is not parsed yet.
Methods inherited from GzipFile
#close, #closed?, #comment, #crc, #finish, #level, #mtime, #orig_name, #os_code, #sync, #sync=, #to_io, wrap
Constructor Details
#initialize(*args) ⇒ Object
call-seq:
Zlib::GzipReader.new(io, = {})
Creates a GzipReader object associated with io. The GzipReader object reads gzipped data from io, and parses/decompresses it. The io must have a read method that behaves same as the IO#read.
The options hash may be used to set the encoding of the data. :external_encoding, :internal_encoding and :encoding may be set as in IO::new.
If the gzip file header is incorrect, raises an Zlib::GzipFile::Error exception.
3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 |
# File 'ext/zlib/zlib.c', line 3872
static VALUE
rb_gzreader_initialize(int argc, VALUE *argv, VALUE obj)
{
VALUE io, opt = Qnil;
struct gzfile *gz;
int err;
TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz);
rb_scan_args(argc, argv, "1:", &io, &opt);
/* 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, Qnil);
rb_gzfile_ecopts(gz, opt);
if (rb_respond_to(io, id_path)) {
gz->path = rb_funcall(gz->io, id_path, 0);
rb_define_singleton_method(obj, "path", rb_gzfile_path, 0);
}
return obj;
}
|
Class Method Details
.open(*args) ⇒ Object
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::GzipFile.wrap.
3795 3796 3797 3798 3799 |
# File 'ext/zlib/zlib.c', line 3795
static VALUE
rb_gzreader_s_open(int argc, VALUE *argv, VALUE klass)
{
return gzfile_s_open(argc, argv, klass, "rb");
}
|
.zcat(*args) ⇒ Object
call-seq:
Zlib::GzipReader.zcat(io, = {}, &block) => nil
Zlib::GzipReader.zcat(io, = {}) => string
Decompresses all gzip data in the io, handling multiple gzip streams until the end of the io. There should not be any non-gzip data after the gzip streams.
If a block is given, it is yielded strings of uncompressed data, and the method returns nil. If a block is not given, the method returns the concatenation of all uncompressed data in all gzip streams.
3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 |
# File 'ext/zlib/zlib.c', line 3817
static VALUE
rb_gzreader_s_zcat(int argc, VALUE *argv, VALUE klass)
{
VALUE io, unused, obj, buf=0, tmpbuf;
long pos;
rb_check_arity(argc, 1, 2);
io = argv[0];
do {
obj = rb_funcallv(klass, rb_intern("new"), argc, argv);
if (rb_block_given_p()) {
rb_gzreader_each(0, 0, obj);
}
else {
if (!buf) {
buf = rb_str_new(0, 0);
}
tmpbuf = gzfile_read_all(get_gzfile(obj));
rb_str_cat(buf, RSTRING_PTR(tmpbuf), RSTRING_LEN(tmpbuf));
}
rb_gzreader_read(0, 0, obj);
pos = NUM2LONG(rb_funcall(io, rb_intern("pos"), 0));
unused = rb_gzreader_unused(obj);
rb_gzfile_finish(obj);
if (!NIL_P(unused)) {
pos -= NUM2LONG(rb_funcall(unused, rb_intern("length"), 0));
rb_funcall(io, rb_intern("pos="), 1, LONG2NUM(pos));
}
} while (pos < NUM2LONG(rb_funcall(io, rb_intern("size"), 0)));
if (rb_block_given_p()) {
return Qnil;
}
return buf;
}
|
Instance Method Details
#each(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 |
# File 'ext/zlib/zlib.c', line 4342
static VALUE
rb_gzreader_each(int argc, VALUE *argv, VALUE obj)
{
VALUE str;
RETURN_ENUMERATOR(obj, 0, 0);
while (!NIL_P(str = gzreader_gets(argc, argv, obj))) {
rb_yield(str);
}
return obj;
}
|
#each_byte ⇒ Object
See Zlib::GzipReader documentation for a description.
4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 |
# File 'ext/zlib/zlib.c', line 4068
static VALUE
rb_gzreader_each_byte(VALUE obj)
{
VALUE c;
RETURN_ENUMERATOR(obj, 0, 0);
while (!NIL_P(c = rb_gzreader_getbyte(obj))) {
rb_yield(c);
}
return Qnil;
}
|
#each_char ⇒ Object
See Zlib::GzipReader documentation for a description.
4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 |
# File 'ext/zlib/zlib.c', line 4050
static VALUE
rb_gzreader_each_char(VALUE obj)
{
VALUE c;
RETURN_ENUMERATOR(obj, 0, 0);
while (!NIL_P(c = rb_gzreader_getc(obj))) {
rb_yield(c);
}
return Qnil;
}
|
#each_line(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 |
# File 'ext/zlib/zlib.c', line 4342
static VALUE
rb_gzreader_each(int argc, VALUE *argv, VALUE obj)
{
VALUE str;
RETURN_ENUMERATOR(obj, 0, 0);
while (!NIL_P(str = gzreader_gets(argc, argv, obj))) {
rb_yield(str);
}
return obj;
}
|
#eof ⇒ Object
Returns true or false whether the stream has reached the end.
3435 3436 3437 3438 3439 3440 |
# File 'ext/zlib/zlib.c', line 3435
static VALUE
rb_gzfile_eof_p(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
}
|
#eof? ⇒ Boolean
Returns true or false whether the stream has reached the end.
3435 3436 3437 3438 3439 3440 |
# File 'ext/zlib/zlib.c', line 3435
static VALUE
rb_gzfile_eof_p(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
}
|
#external_encoding ⇒ Object
See Zlib::GzipReader documentation for a description.
4376 4377 4378 4379 4380 |
# File 'ext/zlib/zlib.c', line 4376
static VALUE
rb_gzreader_external_encoding(VALUE self)
{
return rb_enc_from_encoding(get_gzfile(self)->enc);
}
|
#getbyte ⇒ Object
See Zlib::GzipReader documentation for a description.
4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 |
# File 'ext/zlib/zlib.c', line 4016
static VALUE
rb_gzreader_getbyte(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
VALUE dst;
dst = gzfile_read(gz, 1);
if (!NIL_P(dst)) {
dst = INT2FIX((unsigned int)(RSTRING_PTR(dst)[0]) & 0xff);
}
return dst;
}
|
#getc ⇒ Object
See Zlib::GzipReader documentation for a description.
3987 3988 3989 3990 3991 3992 3993 |
# File 'ext/zlib/zlib.c', line 3987
static VALUE
rb_gzreader_getc(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
return gzfile_getc(gz);
}
|
#gets(*args) ⇒ Object
See Zlib::GzipReader documentation for a description. However, note that this method can return nil even if #eof? returns false, unlike the behavior of File#gets.
4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 |
# File 'ext/zlib/zlib.c', line 4310
static VALUE
rb_gzreader_gets(int argc, VALUE *argv, VALUE obj)
{
VALUE dst;
dst = gzreader_gets(argc, argv, obj);
if (!NIL_P(dst)) {
rb_lastline_set(dst);
}
return dst;
}
|
#lineno ⇒ Object
The line number of the last row read from this file.
3274 3275 3276 3277 3278 |
# File 'ext/zlib/zlib.c', line 3274
static VALUE
rb_gzfile_lineno(VALUE obj)
{
return INT2NUM(get_gzfile(obj)->lineno);
}
|
#lineno=(lineno) ⇒ Object
Specify line number of the last row read from this file.
3285 3286 3287 3288 3289 3290 3291 |
# File 'ext/zlib/zlib.c', line 3285
static VALUE
rb_gzfile_set_lineno(VALUE obj, VALUE lineno)
{
struct gzfile *gz = get_gzfile(obj);
gz->lineno = NUM2INT(lineno);
return lineno;
}
|
#pos ⇒ Object
Total number of output bytes output so far.
3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 |
# File 'ext/zlib/zlib.c', line 3493
static VALUE
rb_gzfile_total_out(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
uLong total_out = gz->z.stream.total_out;
long buf_filled = ZSTREAM_BUF_FILLED(&gz->z);
if (total_out >= (uLong)buf_filled) {
return rb_uint2inum(total_out - buf_filled);
} else {
return LONG2FIX(-(buf_filled - (long)total_out));
}
}
|
#read(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 |
# File 'ext/zlib/zlib.c', line 3933
static VALUE
rb_gzreader_read(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
VALUE vlen;
long 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 %ld given", len);
}
return gzfile_read(gz, len);
}
|
#readbyte ⇒ Object
See Zlib::GzipReader documentation for a description.
4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 |
# File 'ext/zlib/zlib.c', line 4034
static VALUE
rb_gzreader_readbyte(VALUE obj)
{
VALUE dst;
dst = rb_gzreader_getbyte(obj);
if (NIL_P(dst)) {
rb_raise(rb_eEOFError, "end of file reached");
}
return dst;
}
|
#readchar ⇒ Object
See Zlib::GzipReader documentation for a description.
4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 |
# File 'ext/zlib/zlib.c', line 4000
static VALUE
rb_gzreader_readchar(VALUE obj)
{
VALUE dst;
dst = rb_gzreader_getc(obj);
if (NIL_P(dst)) {
rb_raise(rb_eEOFError, "end of file reached");
}
return dst;
}
|
#readline(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 |
# File 'ext/zlib/zlib.c', line 4326
static VALUE
rb_gzreader_readline(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;
}
|
#readlines(*args) ⇒ Object
See Zlib::GzipReader documentation for a description.
4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 |
# File 'ext/zlib/zlib.c', line 4360
static VALUE
rb_gzreader_readlines(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;
}
|
#readpartial(*args) ⇒ Object
call-seq:
gzipreader.readpartial(maxlen [, outbuf]) => string, outbuf
Reads at most <i>maxlen</i> bytes from the gziped stream but
it blocks only if <em>gzipreader</em> has no data immediately available.
If the optional <i>outbuf</i> argument is present,
it must reference a String, which will receive the data.
It raises <code>EOFError</code> on end of file.
3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 |
# File 'ext/zlib/zlib.c', line 3964
static VALUE
rb_gzreader_readpartial(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
VALUE vlen, outbuf;
long len;
rb_scan_args(argc, argv, "11", &vlen, &outbuf);
len = NUM2INT(vlen);
if (len < 0) {
rb_raise(rb_eArgError, "negative length %ld given", len);
}
if (!NIL_P(outbuf))
Check_Type(outbuf, T_STRING);
return gzfile_readpartial(gz, len, outbuf);
}
|
#rewind ⇒ Object
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.
3906 3907 3908 3909 3910 3911 3912 |
# File 'ext/zlib/zlib.c', line 3906
static VALUE
rb_gzreader_rewind(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
gzfile_reader_rewind(gz);
return INT2FIX(0);
}
|
#tell ⇒ Object
Total number of output bytes output so far.
3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 |
# File 'ext/zlib/zlib.c', line 3493
static VALUE
rb_gzfile_total_out(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
uLong total_out = gz->z.stream.total_out;
long buf_filled = ZSTREAM_BUF_FILLED(&gz->z);
if (total_out >= (uLong)buf_filled) {
return rb_uint2inum(total_out - buf_filled);
} else {
return LONG2FIX(-(buf_filled - (long)total_out));
}
}
|
#ungetbyte(ch) ⇒ Object
See Zlib::GzipReader documentation for a description.
4108 4109 4110 4111 4112 4113 4114 |
# File 'ext/zlib/zlib.c', line 4108
static VALUE
rb_gzreader_ungetbyte(VALUE obj, VALUE ch)
{
struct gzfile *gz = get_gzfile(obj);
gzfile_ungetbyte(gz, NUM2CHR(ch));
return Qnil;
}
|
#ungetc(s) ⇒ Object
See Zlib::GzipReader documentation for a description.
4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 |
# File 'ext/zlib/zlib.c', line 4086
static VALUE
rb_gzreader_ungetc(VALUE obj, VALUE s)
{
struct gzfile *gz;
if (FIXNUM_P(s))
return rb_gzreader_ungetbyte(obj, s);
gz = get_gzfile(obj);
StringValue(s);
if (gz->enc2 && gz->enc2 != rb_ascii8bit_encoding()) {
s = rb_str_conv_enc(s, rb_enc_get(s), gz->enc2);
}
gzfile_ungets(gz, (const Bytef*)RSTRING_PTR(s), RSTRING_LEN(s));
RB_GC_GUARD(s);
return Qnil;
}
|
#unused ⇒ Object
Returns the rest of the data which had read for parsing gzip format, or nil if the whole gzip file is not parsed yet.
3920 3921 3922 3923 3924 3925 3926 |
# File 'ext/zlib/zlib.c', line 3920
static VALUE
rb_gzreader_unused(VALUE obj)
{
struct gzfile *gz;
TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz);
return gzfile_reader_get_unused(gz);
}
|