Class: Zlib::GzipWriter
- Defined in:
- ext/rubysl/zlib/zlib.c,
ext/rubysl/zlib/zlib.c
Overview
Zlib::GzipWriter is a class for writing gzipped files. GzipWriter should be used with an instance of IO, or IO-like, object.
Following two example generate the same result.
Zlib::GzipWriter.open('hoge.gz') do |gz|
gz.write 'jugemu jugemu gokou no surikire...'
end
File.open('hoge.gz', 'w') do |f|
gz = Zlib::GzipWriter.new(f)
gz.write 'jugemu jugemu gokou no surikire...'
gz.close
end
To make like gzip(1) does, run following:
orig = 'hoge.txt'
Zlib::GzipWriter.open('hoge.gz') do |gz|
gz.mtime = File.mtime(orig)
gz.orig_name = orig
gz.write IO.binread(orig)
end
NOTE: Due to the limitation of Ruby’s finalizer, you must explicitly close GzipWriter objects by Zlib::GzipWriter#close etc. Otherwise, GzipWriter will be not able to write the gzip footer and will generate a broken gzip file.
Class Method Summary collapse
-
.Zlib::GzipWriter.open(filename, level = nil, strategy = nil) {|gz| ... } ⇒ Object
Opens a file specified by
filename
for writing gzip compressed data, and returns a GzipWriter object associated with that file.
Instance Method Summary collapse
-
#<< ⇒ Object
Same as IO.
-
#comment=(str) ⇒ Object
Specify the comment (
str
) in the gzip header. -
#flush(flush = nil) ⇒ Object
Flushes all the internal buffers of the GzipWriter object.
-
#Zlib::GzipWriter.new(io, level, strategy) ⇒ Object
constructor
Creates a GzipWriter object associated with
io
. -
#mtime=(mtime) ⇒ Object
Specify the modification time (
mtime
) in the gzip header. -
#orig_name=(str) ⇒ Object
Specify the original name (
str
) in the gzip header. -
#pos ⇒ Object
Total number of input bytes read so far.
-
#print ⇒ Object
Same as IO.
-
#printf ⇒ Object
Same as IO.
-
#putc(ch) ⇒ Object
Same as IO.
-
#puts ⇒ Object
Same as IO.
-
#tell ⇒ Object
Total number of input bytes read so far.
-
#write(str) ⇒ Object
Same as IO.
Methods inherited from GzipFile
#close, #closed?, #comment, #crc, #finish, #level, #mtime, #orig_name, #os_code, #sync, #sync=, #to_io, wrap
Constructor Details
#Zlib::GzipWriter.new(io, level, strategy) ⇒ Object
Creates a GzipWriter object associated with io
. level
and strategy
should be the same as the arguments of Zlib::Deflate.new. The GzipWriter object writes gzipped data to io
. At least, io
must respond to the write
method that behaves same as write method in IO class.
3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 |
# File 'ext/rubysl/zlib/zlib.c', line 3216
static VALUE
rb_gzwriter_initialize(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz;
VALUE io, level, strategy, opt = Qnil;
int err;
if (argc > 1) {
opt = rb_check_convert_type(argv[argc-1], T_HASH, "Hash", "to_hash");
if (!NIL_P(opt)) argc--;
}
rb_scan_args(argc, argv, "12", &io, &level, &strategy);
Data_Get_Struct(obj, struct gzfile, gz);
/* this is undocumented feature of zlib */
gz->level = ARG_LEVEL(level);
err = deflateInit2(&gz->z.stream, gz->level, Z_DEFLATED,
-MAX_WBITS, DEF_MEM_LEVEL, ARG_STRATEGY(strategy));
if (err != Z_OK) {
raise_zlib_error(err, gz->z.stream.msg);
}
gz->io = io;
ZSTREAM_READY(&gz->z);
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
.Zlib::GzipWriter.open(filename, level = nil, strategy = nil) {|gz| ... } ⇒ Object
Opens a file specified by filename
for writing gzip compressed data, and returns a GzipWriter object associated with that file. Further details of this method are found in Zlib::GzipWriter.new and Zlib::GzipFile.wrap.
3202 3203 3204 3205 3206 |
# File 'ext/rubysl/zlib/zlib.c', line 3202
static VALUE
rb_gzwriter_s_open(int argc, VALUE *argv, VALUE klass)
{
return gzfile_s_open(argc, argv, klass, "wb");
}
|
Instance Method Details
#<< ⇒ Object
Same as IO.
#comment=(str) ⇒ Object
Specify the comment (str
) in the gzip header.
2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 |
# File 'ext/rubysl/zlib/zlib.c', line 2983
static VALUE
rb_gzfile_set_comment(VALUE obj, VALUE str)
{
struct gzfile *gz = get_gzfile(obj);
VALUE s;
char *p;
if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
rb_raise(cGzError, "header is already written");
}
s = rb_str_dup(rb_str_to_str(str));
p = memchr(RSTRING_PTR(s), '\0', RSTRING_LEN(s));
if (p) {
rb_str_resize(s, p - RSTRING_PTR(s));
}
gz->comment = s;
return str;
}
|
#flush(flush = nil) ⇒ Object
Flushes all the internal buffers of the GzipWriter object. The meaning of flush
is same as in Zlib::Deflate#deflate. Zlib::SYNC_FLUSH
is used if flush
is omitted. It is no use giving flush Zlib::NO_FLUSH
.
3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 |
# File 'ext/rubysl/zlib/zlib.c', line 3257
static VALUE
rb_gzwriter_flush(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
VALUE v_flush;
int flush;
rb_scan_args(argc, argv, "01", &v_flush);
flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
if (flush != Z_NO_FLUSH) { /* prevent Z_BUF_ERROR */
zstream_run(&gz->z, (Bytef*)"", 0, flush);
}
gzfile_write_raw(gz);
if (rb_respond_to(gz->io, id_flush)) {
rb_funcall(gz->io, id_flush, 0);
}
return obj;
}
|
#mtime=(mtime) ⇒ Object
Specify the modification time (mtime
) in the gzip header. Using a Fixnum or Integer
2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 |
# File 'ext/rubysl/zlib/zlib.c', line 2934
static VALUE
rb_gzfile_set_mtime(VALUE obj, VALUE mtime)
{
struct gzfile *gz = get_gzfile(obj);
VALUE val;
if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
rb_raise(cGzError, "header is already written");
}
if (FIXNUM_P(mtime)) {
gz->mtime = FIX2INT(mtime);
}
else {
val = rb_Integer(mtime);
gz->mtime = FIXNUM_P(val) ? FIX2UINT(val) : rb_big2ulong(val);
}
return mtime;
}
|
#orig_name=(str) ⇒ Object
Specify the original name (str
) in the gzip header.
2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 |
# File 'ext/rubysl/zlib/zlib.c', line 2959
static VALUE
rb_gzfile_set_orig_name(VALUE obj, VALUE str)
{
struct gzfile *gz = get_gzfile(obj);
VALUE s;
char *p;
if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
rb_raise(cGzError, "header is already written");
}
s = rb_str_dup(rb_str_to_str(str));
p = memchr(RSTRING_PTR(s), '\0', RSTRING_LEN(s));
if (p) {
rb_str_resize(s, p - RSTRING_PTR(s));
}
gz->orig_name = s;
return str;
}
|
#pos ⇒ Object
Total number of input bytes read so far.
3103 3104 3105 3106 3107 |
# File 'ext/rubysl/zlib/zlib.c', line 3103
static VALUE
rb_gzfile_total_in(VALUE obj)
{
return rb_uint2inum(get_gzfile(obj)->z.stream.total_in);
}
|
#print ⇒ Object
Same as IO.
#printf ⇒ Object
Same as IO.
#putc(ch) ⇒ Object
Same as IO.
3298 3299 3300 3301 3302 3303 3304 3305 3306 |
# File 'ext/rubysl/zlib/zlib.c', line 3298
static VALUE
rb_gzwriter_putc(VALUE obj, VALUE ch)
{
struct gzfile *gz = get_gzfile(obj);
char c = NUM2CHR(ch);
gzfile_write(gz, (Bytef*)&c, 1);
return ch;
}
|
#puts ⇒ Object
Same as IO.
#tell ⇒ Object
Total number of input bytes read so far.
3103 3104 3105 3106 3107 |
# File 'ext/rubysl/zlib/zlib.c', line 3103
static VALUE
rb_gzfile_total_in(VALUE obj)
{
return rb_uint2inum(get_gzfile(obj)->z.stream.total_in);
}
|
#write(str) ⇒ Object
Same as IO.
3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 |
# File 'ext/rubysl/zlib/zlib.c', line 3281
static VALUE
rb_gzwriter_write(VALUE obj, VALUE str)
{
struct gzfile *gz = get_gzfile(obj);
if (TYPE(str) != T_STRING)
str = rb_obj_as_string(str);
if (gz->enc2 && gz->enc2 != rb_ascii8bit_encoding()) {
str = rb_str_conv_enc(str, rb_enc_get(str), gz->enc2);
}
gzfile_write(gz, (Bytef*)RSTRING_PTR(str), RSTRING_LEN(str));
return INT2FIX(RSTRING_LEN(str));
}
|