kouyaです。

パッチありがとうございます。
頂いたパッチを適用するとcloneがうごくようになりました。
しかし、cloneしたオブジェクトからfinishで文字列が取り出せないようです。
空文字がかえってきます。
期待される返り値は、たぶん、圧縮後の文字列だとおもうのですが。

# サンプルスクリプト
require 'zlib'

dez = Zlib::Deflate.new
dez << "hoge" * 10
cz = dez.clone
p cz.finish #=> ""
cz.close

実行環境
ruby 1.8.7 (2008-06-07 patchlevel 5000) [i686-darwin9.3.0]

よろしくお願いします。

2008/06/07 22:18 Akinori MUSHA <knu / idaemons.org>:
> At Sat, 7 Jun 2008 21:01:00 +0900,
> Kouya wrote:
>> いまZlib::Deflateのリファレンスマニュアルを編集しているのですが、
>> cloneを呼び出すとエラーがでます。
>>
>> cloneを呼び出す前になにかする必要があるのでしょうか。
>> よろしくお願いします。
>>
>> #サンプルスクリプト
>> require 'zlib'
>>
>> dez = Zlib::Deflate.new
>> dez << "hoge" * 10
>> cz = dez.clone
>>
>> #実行結果
>> ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.2.0]
>> z2.rb:7:in `initialize_copy': wrong number of arguments (1 for 0)
>> (ArgumentError)
>>       from z2.rb:7:in `clone'
>>       from z2.rb:7
>> zlib(finalizer): the stream was freed prematurely.
>
> これで直るでしょうか。
>
> Index: ext/zlib/zlib.c
> ===================================================================
> --- ext/zlib/zlib.c     (revision 16873)
> +++ ext/zlib/zlib.c     (working copy)
> @@ -1116,10 +1116,12 @@ rb_deflate_initialize(int argc, VALUE *a
>  static VALUE
>  rb_deflate_init_copy(VALUE self, VALUE orig)
>  {
> -    struct zstream *z1 = get_zstream(self);
> -    struct zstream *z2 = get_zstream(orig);
> +    struct zstream *z1, *z2;
>     int err;
>
> +    Data_Get_Struct(self, struct zstream, z1);
> +    z2 = get_zstream(orig);
> +
>     err = deflateCopy(&z1->stream, &z2->stream);
>     if (err != Z_OK) {
>        raise_zlib_error(err, 0);
> @@ -3267,7 +3269,7 @@ void Init_zlib()
>     rb_define_singleton_method(cDeflate, "deflate", rb_deflate_s_deflate, -1);
>     rb_define_alloc_func(cDeflate, rb_deflate_s_allocate);
>     rb_define_method(cDeflate, "initialize", rb_deflate_initialize, -1);
> -    rb_define_method(cDeflate, "initialize_copy", rb_deflate_init_copy, 0);
> +    rb_define_method(cDeflate, "initialize_copy", rb_deflate_init_copy, 1);
>     rb_define_method(cDeflate, "deflate", rb_deflate_deflate, -1);
>     rb_define_method(cDeflate, "<<", rb_deflate_addstr, 1);
>     rb_define_method(cDeflate, "flush", rb_deflate_flush, -1);
>
>

-- 
kouya