ruby-changes:22503
From: drbrain <ko1@a...>
Date: Sat, 11 Feb 2012 09:30:04 +0900 (JST)
Subject: [ruby-changes:22503] drbrain:r34552 (trunk): * ext/zlib/zlib.c (do_inflate): Inflate more data if buffered data
drbrain 2012-02-11 09:29:52 +0900 (Sat, 11 Feb 2012) New Revision: 34552 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34552 Log: * ext/zlib/zlib.c (do_inflate): Inflate more data if buffered data exists. Allows Zlib::Inflate#set_dictionary to work. [ruby-trunk - Bug #5929] Modified files: trunk/ChangeLog trunk/ext/zlib/zlib.c trunk/test/zlib/test_zlib.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34551) +++ ChangeLog (revision 34552) @@ -1,3 +1,9 @@ +Sat Feb 11 08:23:02 2012 Eric Hodel <drbrain@s...> + + * ext/zlib/zlib.c (do_inflate): Inflate more data if buffered data + exists. Allows Zlib::Inflate#set_dictionary to work. + [ruby-trunk - Bug #5929] + Sat Feb 11 06:00:48 2012 NARUSE, Yui <naruse@r...> * dir.c (fnmatch): The * needs to be escaped to avoid formatting in Index: ext/zlib/zlib.c =================================================================== --- ext/zlib/zlib.c (revision 34551) +++ ext/zlib/zlib.c (revision 34552) @@ -1732,7 +1732,7 @@ return; } StringValue(src); - if (RSTRING_LEN(src) > 0) { /* prevent Z_BUF_ERROR */ + if (RSTRING_LEN(src) > 0 || z->stream.avail_in > 0) { /* prevent Z_BUF_ERROR */ zstream_run(z, (Bytef*)RSTRING_PTR(src), RSTRING_LEN(src), Z_SYNC_FLUSH); } } @@ -1749,8 +1749,24 @@ * * 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. (<i>???</i>) + * 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 */ static VALUE Index: test/zlib/test_zlib.rb =================================================================== --- test/zlib/test_zlib.rb (revision 34551) +++ test/zlib/test_zlib.rb (revision 34552) @@ -195,6 +195,29 @@ z << "foo" # ??? end + def test_inflate_dictionary + dictionary = "foo" + + deflate = Zlib::Deflate.new + deflate.set_dictionary dictionary + compressed = deflate.deflate "foofoofoo", Zlib::FINISH + deflate.close + + out = nil + inflate = Zlib::Inflate.new + + begin + out = inflate.inflate compressed + + flunk "Zlib::NeedDict was not raised" + rescue Zlib::NeedDict + inflate.set_dictionary dictionary + out = inflate.inflate "" + end + + assert_equal "foofoofoo", out + end + def test_sync z = Zlib::Deflate.new s = z.deflate("foo" * 1000, Zlib::FULL_FLUSH) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/