Class: Zstdlib::GzipReader

Inherits:
GzipFile show all
Includes:
Enumerable
Defined in:
ext/zstdlib/ruby/zlib-2.6/zstdlib.c,
ext/zstdlib/ruby/zlib-2.6/zstdlib.c,
ext/zstdlib/ruby/zlib-2.5/zstdlib.c,
ext/zstdlib/ruby/zlib-2.5/zstdlib.c,
ext/zstdlib/ruby/zlib-2.4/zstdlib.c,
ext/zstdlib/ruby/zlib-2.4/zstdlib.c,
ext/zstdlib/ruby/zlib-2.3/zstdlib.c,
ext/zstdlib/ruby/zlib-2.3/zstdlib.c,
ext/zstdlib/ruby/zlib-2.2/zstdlib.c,
ext/zstdlib/ruby/zlib-2.2/zstdlib.c

Overview

Zstdlib::GzipReader is the class for reading a gzipped file. GzipReader should be used an IO, or -IO-like, object.

Zstdlib::GzipReader.open('hoge.gz') {|gz| print gz.read }

File.open('hoge.gz') do |f| gz = Zstdlib::GzipReader.new(f) print gz.read gz.close end

== Method Catalogue

The following methods in Zstdlib::GzipReader are just like their counterparts in IO, but they raise Zstdlib::Error or Zstdlib::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 Zstdlib::GzipFile::NoFooter, Zstdlib::GzipFile::CRCError, or Zstdlib::GzipFile::LengthError exception.

  • When an reading request is received beyond the end of file (the end of compressed data). That is, when Zstdlib::GzipReader#read, Zstdlib::GzipReader#gets, or some other methods for reading returns nil.
  • When Zstdlib::GzipFile#close method is called after the object reaches the end of file.
  • When Zstdlib::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

Instance Method Summary collapse

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: Zstdlib::GzipReader.new(io, options = {})

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 Zstdlib::GzipFile::Error exception.



3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3772

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: Zstdlib::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 Zstdlib::GzipReader.new and ZLib::GzipFile.wrap.



3749
3750
3751
3752
3753
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3749

static VALUE
rb_gzreader_s_open(int argc, VALUE *argv, VALUE klass)
{
    return gzfile_s_open(argc, argv, klass, "rb");
}

Instance Method Details

#bytesObject

This is a deprecated alias for each_byte.



3986
3987
3988
3989
3990
3991
3992
3993
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3986

static VALUE
rb_gzreader_bytes(VALUE obj)
{
    rb_warn("Zstdlib::GzipReader#bytes is deprecated; use #each_byte instead");
    if (!rb_block_given_p())
	return rb_enumeratorize(obj, ID2SYM(rb_intern("each_byte")), 0, 0);
    return rb_gzreader_each_byte(obj);
}

#each(*args) ⇒ Object

See Zstdlib::GzipReader documentation for a description.



4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4254

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_byteObject

See Zstdlib::GzipReader documentation for a description.



3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3968

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_charObject

See Zstdlib::GzipReader documentation for a description.



3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3950

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 Zstdlib::GzipReader documentation for a description.



4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4254

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;
}

#eofObject

Returns +true+ or +false+ whether the stream has reached the end.



3389
3390
3391
3392
3393
3394
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3389

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.

Returns:

  • (Boolean)


3389
3390
3391
3392
3393
3394
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3389

static VALUE
rb_gzfile_eof_p(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
}

#external_encodingObject

See Zstdlib::GzipReader documentation for a description.



4302
4303
4304
4305
4306
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4302

static VALUE
rb_gzreader_external_encoding(VALUE self)
{
    return rb_enc_from_encoding(get_gzfile(self)->enc);
}

#getbyteObject

See Zstdlib::GzipReader documentation for a description.



3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3916

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;
}

#getcObject

See Zstdlib::GzipReader documentation for a description.



3887
3888
3889
3890
3891
3892
3893
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3887

static VALUE
rb_gzreader_getc(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);

    return gzfile_getc(gz);
}

#gets(*args) ⇒ Object

See Zstdlib::GzipReader documentation for a description.



4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4222

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;
}

#linenoObject

The line number of the last row read from this file.



3229
3230
3231
3232
3233
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3229

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.



3240
3241
3242
3243
3244
3245
3246
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3240

static VALUE
rb_gzfile_set_lineno(VALUE obj, VALUE lineno)
{
    struct gzfile *gz = get_gzfile(obj);
    gz->lineno = NUM2INT(lineno);
    return lineno;
}

#lines(*args) ⇒ Object

This is a deprecated alias for each_line.



4272
4273
4274
4275
4276
4277
4278
4279
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4272

static VALUE
rb_gzreader_lines(int argc, VALUE *argv, VALUE obj)
{
    rb_warn("Zstdlib::GzipReader#lines is deprecated; use #each_line instead");
    if (!rb_block_given_p())
	return rb_enumeratorize(obj, ID2SYM(rb_intern("each_line")), argc, argv);
    return rb_gzreader_each(argc, argv, obj);
}

#posObject

Total number of output bytes output so far.



3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3447

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 Zstdlib::GzipReader documentation for a description.



3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3833

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);
}

#readbyteObject

See Zstdlib::GzipReader documentation for a description.



3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3934

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;
}

#readcharObject

See Zstdlib::GzipReader documentation for a description.



3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3900

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 Zstdlib::GzipReader documentation for a description.



4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4238

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 Zstdlib::GzipReader documentation for a description.



4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4286

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 maxlen bytes from the gziped stream but it blocks only if gzipreader has no data immediately available. If the optional outbuf argument is present, it must reference a String, which will receive the data. It raises EOFError on end of file.



3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3864

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);
}

#rewindObject

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.



3806
3807
3808
3809
3810
3811
3812
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3806

static VALUE
rb_gzreader_rewind(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    gzfile_reader_rewind(gz);
    return INT2FIX(0);
}

#tellObject

Total number of output bytes output so far.



3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3447

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 Zstdlib::GzipReader documentation for a description.



4022
4023
4024
4025
4026
4027
4028
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4022

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 Zstdlib::GzipReader documentation for a description.



4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 4000

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;
}

#unusedObject

Returns the rest of the data which had read for parsing gzip format, or +nil+ if the whole gzip file is not parsed yet.



3820
3821
3822
3823
3824
3825
3826
# File 'ext/zstdlib/ruby/zlib-2.6/zstdlib.c', line 3820

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);
}