うえの@ぶるーすかいです。

From: Tanaka Akira <akr / m17n.org>
> 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    <unnie / blue.sky.or.jp>  --=
---=----===-                    http://www.blue.sky.or.jp/  -==