From: Ueno Katsuhiro Date: 2000-07-20T12:39:02+09:00 Subject: [ruby-list:23926] Re: flush deflate buffer with Ruby/zlib うえの@ぶるーすかいです。 From: Tanaka Akira > d = Deflate.new > p d.deflate("a" * 1000) > p d.deflate("", Deflate::SYNC_FLUSH) > > として、"a" * 1000 を展開可能な圧縮結果を得たいのですが、 > d.deflate("", Deflate::SYNC_FLUSH) が "" になってしまいます。 snip.. > # zstream_run_internal の先頭でいきなり z->stream.avail_in == 0 などと > # いうテストをしているのが問題なのかなぁ、という気もしますが。 多分 (って自分でやったんだが)、安全側に倒していたんだと思います。 空文字列を zlib に渡すとバッファの状態によっては Z_BUF_ERROR が返ってきますので。 ちょっと見直してみました。 --- zlib.c 2000/07/19 10:25:39 1.16 +++ zlib.c 2000/07/20 02:53:30 @@ -377,9 +377,6 @@ int err; unsigned long start; - if (flush != Z_FINISH && z->stream.avail_in == 0) - return; - do { if (z->stream.avail_out == 0) zstream_expand_buffer(z); @@ -390,6 +387,8 @@ z->buf_filled += z->stream.total_out - start; if (err == Z_STREAM_END) + break; + if (err == Z_BUF_ERROR && flush != Z_FINISH) break; if (err != Z_OK) raise_zlib_error(err, z->stream.msg); > flush_out かなぁ、とも思いましたが、やはり意図した結果は得られません。 > (同様に "" が返ってきます。) flush_out は zlib からの出力を受ける ZStream オブジェクト内の バッファをフラッシュします。zlib のバッファまではフラッシュしません。 # flush_out って名前はものすごく紛らわしいと思うんですけど # 全然いい名前が思いつかなくて… -=====--===- うえの かつひろ @ BLUE-SKYNET --= ---=----===- http://www.blue.sky.or.jp/ -==