Class: Zstdlib::GzipReader
- Includes:
- Enumerable
- Defined in:
- ext/zstdlib/ruby/zlib-3.0/zstdlib.c,
ext/zstdlib/ruby/zlib-3.0/zstdlib.c,
ext/zstdlib/ruby/zlib-2.7/zstdlib.c,
ext/zstdlib/ruby/zlib-2.7/zstdlib.c,
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
-
.open(*args) ⇒ Object
call-seq: Zstdlib::GzipReader.open(filename) {|gz| ... }.
-
.zcat(*args) ⇒ Object
call-seq: Zstdlib::GzipReader.zcat(io, options = {}, &block) => nil Zstdlib::GzipReader.zcat(io, options = {}) => string.
Instance Method Summary collapse
-
#bytes ⇒ Object
This is a deprecated alias for
each_byte. -
#each(*args) ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#each_byte ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#each_char ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#each_line(*args) ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#eof ⇒ Object
Returns +true+ or +false+ whether the stream has reached the end.
-
#eof? ⇒ Boolean
Returns +true+ or +false+ whether the stream has reached the end.
-
#external_encoding ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#getbyte ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#getc ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#gets(*args) ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#initialize(*args) ⇒ Object
constructor
call-seq: Zstdlib::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.
-
#lines(*args) ⇒ Object
This is a deprecated alias for
each_line. -
#pos ⇒ Object
Total number of output bytes output so far.
-
#read(*args) ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#readbyte ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#readchar ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#readline(*args) ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#readlines(*args) ⇒ Object
See Zstdlib::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 Zstdlib::GzipReader documentation for a description.
-
#ungetc(s) ⇒ Object
See Zstdlib::GzipReader documentation for a description.
-
#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.
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.
3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3880 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.
3803 3804 3805 3806 3807 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3803 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: Zstdlib::GzipReader.zcat(io, options = {}, &block) => nil Zstdlib::GzipReader.zcat(io, options = {}) => 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.
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 3854 3855 3856 3857 3858 3859 3860 3861 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3825 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
#bytes ⇒ Object
This is a deprecated alias for each_byte.
3971 3972 3973 3974 3975 3976 3977 3978 |
# File 'ext/zstdlib/ruby/zlib-2.7/zstdlib.c', line 3971 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.
4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4350 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 Zstdlib::GzipReader documentation for a description.
4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4076 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 Zstdlib::GzipReader documentation for a description.
4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4058 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.
4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4350 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.
3443 3444 3445 3446 3447 3448 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3443 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.
3443 3444 3445 3446 3447 3448 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3443 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 Zstdlib::GzipReader documentation for a description.
4384 4385 4386 4387 4388 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4384 static VALUE rb_gzreader_external_encoding(VALUE self) { return rb_enc_from_encoding(get_gzfile(self)->enc); } |
#getbyte ⇒ Object
See Zstdlib::GzipReader documentation for a description.
4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4024 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 Zstdlib::GzipReader documentation for a description.
3995 3996 3997 3998 3999 4000 4001 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3995 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.
4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4318 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.
3282 3283 3284 3285 3286 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3282 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.
3293 3294 3295 3296 3297 3298 3299 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3293 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.
4257 4258 4259 4260 4261 4262 4263 4264 |
# File 'ext/zstdlib/ruby/zlib-2.7/zstdlib.c', line 4257 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); } |
#pos ⇒ Object
Total number of output bytes output so far.
3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3501 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.
3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3941 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 Zstdlib::GzipReader documentation for a description.
4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4042 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 Zstdlib::GzipReader documentation for a description.
4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4008 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.
4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4334 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.
4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4368 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.
3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3972 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.
3914 3915 3916 3917 3918 3919 3920 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3914 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.
3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3501 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.
4116 4117 4118 4119 4120 4121 4122 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4116 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.
4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 4094 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.
3928 3929 3930 3931 3932 3933 3934 |
# File 'ext/zstdlib/ruby/zlib-3.0/zstdlib.c', line 3928 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); } |