Method: Zlib::Inflate#inflate
- Defined in:
- ext/zlib/zlib.c
#inflate(*args) ⇒ Object
call-seq:
inflate(deflate_string, buffer: nil) -> String
inflate(deflate_string, buffer: nil) { |chunk| ... } -> nil
Inputs deflate_string into the inflate stream and returns the output from the stream. Calling this method, both the input and the output buffer of the stream are flushed. If string is nil, this method finishes the stream, just like Zlib::ZStream#finish.
If a block is given consecutive inflated chunks from the deflate_string are yielded to the block and nil is returned.
If a :buffer keyword argument is given and not nil:
-
The :buffer keyword should be a String, and will used as the output buffer. Using this option can reuse the memory required during inflation.
-
When not passing a block, the return value will be the same object as the :buffer keyword argument.
-
When passing a block, the yielded chunks will be the same value as the :buffer keyword argument.
Raises a Zlib::NeedDict exception if a preset dictionary is needed to decompress. Set the dictionary by Zlib::Inflate#set_dictionary and then call this method again with an empty string to flush the stream:
inflater = Zlib::Inflate.new
begin
out = inflater.inflate compressed
rescue Zlib::NeedDict
# ensure the dictionary matches the stream's required dictionary
raise unless inflater.adler == Zlib.adler32(dictionary)
inflater.set_dictionary dictionary
inflater.inflate ''
end
# ...
inflater.close
See also Zlib::Inflate.new
2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 |
# File 'ext/zlib/zlib.c', line 2150 static VALUE rb_inflate_inflate(int argc, VALUE* argv, VALUE obj) { struct zstream *z = get_zstream(obj); VALUE dst, src, opts, buffer = Qnil; if (OPTHASH_GIVEN_P(opts)) { VALUE buf; rb_get_kwargs(opts, &id_buffer, 0, 1, &buf); if (buf != Qundef && buf != Qnil) { buffer = StringValue(buf); } } if (buffer != Qnil) { if (!(ZSTREAM_REUSE_BUFFER_P(z) && z->buf == buffer)) { long len = RSTRING_LEN(buffer); if (len >= ZSTREAM_AVAIL_OUT_STEP_MAX) { rb_str_modify(buffer); } else { len = ZSTREAM_AVAIL_OUT_STEP_MAX - len; (buffer, len); } rb_str_set_len(buffer, 0); z->flags |= ZSTREAM_REUSE_BUFFER; z->buf = buffer; } } else if (ZSTREAM_REUSE_BUFFER_P(z)) { z->flags &= ~ZSTREAM_REUSE_BUFFER; z->buf = Qnil; } rb_scan_args(argc, argv, "10", &src); if (ZSTREAM_IS_FINISHED(z)) { if (NIL_P(src)) { dst = zstream_detach_buffer(z); } else { StringValue(src); zstream_append_buffer2(z, src); if (ZSTREAM_REUSE_BUFFER_P(z)) { dst = rb_str_resize(buffer, 0); } else { dst = rb_str_new(0, 0); } } } else { do_inflate(z, src); dst = zstream_detach_buffer(z); if (ZSTREAM_IS_FINISHED(z)) { zstream_passthrough_input(z); } } return dst; } |