=begin # # zlib.rd.src # # Copyright (C) UENO Katsuhiro 2000-2002 # # $Id: zlib.rd.src,v 1.14 2002/03/13 19:13:14 katsu Exp $ # = Ruby/zlib version 0.5.0 Ruby/zlib は zlib を Ruby から使うための拡張ライブラリです。 gzip ファイルの読み書きもサポートします。 Ruby/zlib は Ruby と同じ条件で変更/配布することができます。 Ruby/zlib の最新版は (()) から 入手できます。 Ruby/zlib に対するご意見、バグレポート等は ruby-list ML, ruby-dev ML, ruby-ext ML, ruby-talk ML, 又は (()) までお願いします。 * (()) * (()) * (()) * (()) * (()) * (()) * (()) * (()) * (()) * ((<0.4.0 からの変更点>)) == Zlib zlib ライブラリに含まれている雑多な機能を提供するモジュール。 各モジュール関数の詳細は zlib.h を参照して下さい。 === モジュール関数: --- Zlib.version zlib ライブラリのバージョンを表す文字列を返します。 --- Zlib.adlar32([string[, adlar]]) ((|string|)) の Adler-32 チェックサムを計算し、((|adler|)) を 更新した値を返します。((|string|)) が省略された場合は Adler-32 チェックサムの初期値を返します。((|adler|)) が 省略された場合は ((|adler|)) に初期値が与えらたものとして 計算します。 --- Zlib.crc32([string[, crc]]) ((|string|)) の CRC チェックサムを計算し、((|crc|)) を 更新した値を返します。((|string|)) が省略された場合は CRC チェックサムの初期値を返します。((|crc|)) が 省略された場合は ((|crc|)) に初期値が与えらたものとして 計算します。 --- Zlib.crc_table CRC チェックサムの計算に用いるテーブルを配列で返します。 === 定数: --- Zlib::VERSION zlib.h のバージョンを表す文字列。 --- Zlib::BINARY --- Zlib::ASCII --- Zlib::UNKNOWN (()) の返す、データタイプを表す整数。 --- Zlib::NO_COMPRESSION --- Zlib::BEST_SPEED --- Zlib::BEST_COMPRESSION --- Zlib::DEFAULT_COMPRESSION (()) や (()) 等に渡す、 圧縮レベルを表す整数。 --- Zlib::FILTERED --- Zlib::HUFFMAN_ONLY --- Zlib::DEFAULT_STRATEGY (()) や (()) に渡す、 圧縮方法を表す整数。 --- Zlib::DEF_MEM_LEVEL --- Zlib::MAX_MEM_LEVEL (()) 等に渡す、memory level を表す整数。 --- Zlib::MAX_WBITS (()) や (()) での ((|windowBits|)) のデフォルト値。 --- Zlib::NO_FLUSH --- Zlib::SYNC_FLUSH --- Zlib::FULL_FLUSH --- Zlib::FINISH (()) 等に渡す、ストリームの出力を 制御するための整数。 --- Zlib::OS_CODE --- Zlib::OS_MSDOS --- Zlib::OS_AMIGA --- Zlib::OS_VMS --- Zlib::OS_UNIX --- Zlib::OS_ATARI --- Zlib::OS_OS --- Zlib::OS_MACOS --- Zlib::OS_TOPS --- Zlib::OS_WIN (()) メソッドの返す値。 == Zlib::Error Ruby/zlib の発行する全ての例外のスーパークラス。 以下の例外が Zlib::Error のサブクラスとして定義されています。 それぞれ zlib ライブラリ関数の返すエラーと対応しています。 * Zlib::StreamEnd * Zlib::NeedDict * Zlib::DataError * Zlib::StreamError * Zlib::MemError * Zlib::BufError * Zlib::VersionError === スーパークラス: * StandardError == Zlib::ZStream 圧縮データを扱うストリームを表す抽象クラス。 具体的な圧縮/展開の操作は、それぞれサブクラスの (()), (()) で定義されています。 Zlib::ZStream オブジェクトは、ストリーム (struct zstream) の 入力側 (next_in) と出力側 (next_out) にそれぞれ可変長の バッファを持ちます。以下、入力側のバッファを「入力バッファ」、 出力側のバッファを「出力バッファ」と呼びます。 Zlib::ZStream オブジェクトに入力されたデータは、一旦入力バッファの 末尾にストアされた後、ストリームからの出力がなくなるまで (処理後 avail_out > 0 となるまで) 入力バッファの先頭から順に処理されます。 処理の間、出力バッファは全出力を保持するために必要に応じて自動的に 確保・拡張されます。 いくつかのメソッドは、出力バッファ内のデータを取り出し、 String オブジェクトとして返します。 以上を図示すると次のようになります: +================ an instance of Zlib::ZStream ================+ || || || +--------+ +-------+ +--------+ || || +--| output |<---------|zstream|<---------| input |<--+ || || | | buffer | next_out+-------+next_in | buffer | | || || | +--------+ +--------+ | || || | | || +===|======================================================|===+ | | v | "output data" "input data" 入力バッファの内容を処理している最中にエラーが発生した場合、 (()) のサブクラスの例外が発生します。その時、 入力/出力バッファは共に、エラーが発生した時点の状態をそのまま 保持します。 === スーパークラス: * Object === クラスメソッド: --- Zlib::ZStream.new (()) 及び (()) を 参照。 === メソッド: --- Zlib::ZStream#avail_in 入力バッファに溜っているデータのバイト数を返します。 通常は 0 です。 --- Zlib::ZStream#avail_out 出力バッファの空き用量をバイト数で返します。 空きは必要な時に動的に確保されるため、通常は 0 です。 --- Zlib::ZStream#avail_out = size 出力側のバッファに ((|size|)) バイトの空きを確保します。 すでに ((|size|)) バイト以上の空きがある場合、バッファは 縮められます。空きは必要な時に動的に確保されるため、通常 このメソッドを使う必要はありません。 --- Zlib::ZStream#flush_next_in 入力バッファに残っているデータを強制的に取り出します。 --- Zlib::ZStream#flush_next_out 出力バッファに残っているデータを強制的に取り出します。 --- Zlib::ZStream#total_in ストリームに入力されたデータの総バイト数を返します。 --- Zlib::ZStream#total_out ストリームの出力したデータの総バイト数を返します。 --- Zlib::ZStream#data_type ストリームに入力されたデータの形式を推測します。 返り値は (()), (()), (()) のいずれかです。 --- Zlib::ZStream#adler alder-32 チェックサムを返します。 --- Zlib::ZStream#reset ストリームの状態をリセットします。 入力/出力バッファ内に残っていたデータは破棄されます。 --- Zlib::ZStream#finish ストリームへの入力を終了し、出力バッファをフラッシュします。 より具体的な振る舞いは (()), (()) を参照して下さい。 --- Zlib::ZStream#finished? --- Zlib::ZStream#stream_end? ストリームへの入力が終了している時に真を返します。 --- Zlib::ZStream#close --- Zlib::ZStream#end ストリームを閉じます。 以後、このストリームにアクセスすることはできなくなります。 --- Zlib::ZStream#closed? --- Zlib::ZStream#ended? ストリームが閉じられている時に真を返します。 == Zlib::Deflate 入力データを圧縮するストリームのクラス。 === スーパークラス: * (()) === クラスメソッド: --- Zlib::Deflate.deflate(string[, level]) ((|string|)) を圧縮します。((|level|)) の有効な値は (()), (()), (()), (()) 及び 0 から 9 の整数です。 ちなみに、このメソッドは以下のコードとほぼ同じです: def deflate(string, level) z = Zlib::Deflate.new(level) dst = z.deflate(string, Zlib::FINISH) z.close dst end --- Zlib::Deflate.new([level[, windowBits[, memlevel[, strategy]]]]) 圧縮ストリームを作成します。各引数の詳細は zlib.h を 参照して下さい。nil の場合はデフォルトの値を使用します。 === メソッド: --- Zlib::Deflate#clone 圧縮ストリームを複製します。 --- Zlib::Deflate#deflate(string[, flush]) ((|string|)) を圧縮ストリームに入力します。処理後、 ストリームからの出力を返します。このメソッドを呼ぶと 出力バッファ及び入力バッファは空になります。 ((|string|)) が nil の場合はストリームへの入力を 終了します。((()) と同じ)。 ((|flush|)) には (()), (()), (()), (()) のいずれかを指定します。 詳しくは zlib.h を参照して下さい。 --- Zlib::Deflate#<< string (()) と同じように ((|string|)) を 圧縮ストリームに入力しますが、Zlib::Deflate オブジェクト そのものを返します。圧縮ストリームからの出力は、 出力バッファに保存されます。 --- Zlib::Deflate#flush([flush]) (({deflate('', ((|flush|)))})) と同じです。((|flush|)) が 省略された時は (()) が使用されます。 このメソッドはスクリプトの可読性のために提供されています。 --- Zlib::Deflate#finish 圧縮ストリームを終了します。(({deflate('', Zlib::FINISH)})) と 同じです。 --- Zlib::Deflate#params(level, strategy) 圧縮ストリームの設定を変更します。詳しくは zlib.h を 参照して下さい。設定の変更に伴うストリームからの出力は 出力バッファに保存されます。 --- Zlib::Deflate#set_dictionary(string) 圧縮に用いる辞書を指定します。((|string|)) を返します。 このメソッドは (()), (()) を呼び出した直後にのみ有効です。詳細は zlib.h を参照して下さい。 == Zlib::Inflate 入力データを展開するストリームのクラス。(()) と違い、 このクラスのインスタンスを複製 (clone, dup) することはできません。 === スーパークラス: * (()) === クラスメソッド: --- Zlib::Inflate.inflate(string) ((|string|)) を展開します。展開に辞書が必要な場合には (()) 例外が発生します。 ちなみに、このメソッドは以下のコードとほぼ同じです: def inflate(string) zstream = Zlib::Inflate.new buf = zstream.inflate(string) zstream.finish zstream.close buf end --- Zlib::Inflate.new([windowBits]) 展開ストリームを作成します。引数の詳細は zlib.h を参照して下さい。 nil の場合はデフォルトの値を使用します。 === メソッド: --- Zlib::Inflate#inflate(string) ((|string|)) を展開ストリームに入力します。処理後、 ストリームからの出力を返します。このメソッドを呼ぶと 出力バッファ及び入力バッファは空になります。 ((|string|)) が nil の場合はストリームへの入力を 終了します。((()) と同じ)。 展開に辞書が必要な場合には (()) 例外が発生します。 (()) メソッドで辞書をセットした 後で、空文字列と共にこのメソッドを再度呼び出して下さい。 --- Zlib::Inflate#<< string (()) と同じように ((|string|)) を 展開ストリームに入力しますが、Zlib::Inflate オブジェクト そのものを返します。展開ストリームからの出力は、 出力バッファに保存されます。 --- Zlib::Inflate#finish 展開ストリームを終了します。 ストリーム内に残っていたデータ (つまり圧縮データの後についていた ゴミデータ) を返します。 (()) が真でない時に finish を呼ぶと 例外が発生します。 展開ストリームは圧縮データ内に終了コードを発見した時点で 自ら終了するため、明示的に finish を呼ぶ必要は必ずしも ありませんが、このメソッドは圧縮データが正しく終了しているかを 確認するのに便利です。 --- Zlib::Inflate#set_dictionary(string) 展開に用いる辞書を指定します。((|string|)) を返します。 このメソッドは (()) 例外が発生した直後のみ 有効です。詳細は zlib.h を参照して下さい。 --- Zlib::Inflate#sync(string) ((|string|)) を入力バッファの末尾に追加し、次の full flush point まで読み飛ばします。入力バッファ内に full flush point が存在しない場合は、入力バッファを空にし false を返します。 入力バッファ内に full flush point が見つかった場合は true を返し、残りのデータは入力バッファ内に保持されます。 --- Zlib::Inflate#sync_point? What is this? == Zlib::GzipFile gzip 形式の圧縮ファイルを扱う抽象クラス。 具体的な読み込み/書き込み操作は、それぞれサブクラスの (()), (()) で定義されています。 IO クラスのインスタンス (又は IO クラスのインスタンスと同じメソッドを 持つオブジェクト) と関連付けて使用します。 === スーパークラス: * Object === クラスメソッド: --- Zlib::GzipFile.new(io) (()) 及び (()) を 参照。 === メソッド: --- Zlib::GzipFile#closed? --- Zlib::GzipFile#to_io IO クラスの同名メソッドと同じ。 --- Zlib::GzipFile#close([dont_close_io]) GzipFile オブジェクトをクローズします。((|dont_close_io|)) が 省略されている時や ((|dont_close_io|)) が真でない時、 関連付けられている IO オブジェクトの close メソッドを呼び出します。 関連付けられている IO オブジェクトを返します。 --- Zlib::GzipFile#crc 圧縮されていないデータの CRC 値を返します。 --- Zlib::GzipFile#level 圧縮レベルを返します。 --- Zlib::GzipFile#mtime gzip ファイルのヘッダーに記録されている最終更新時間を返します。 --- Zlib::GzipFile#os_code gzip ファイルのヘッダーに記録されている OS コード番号を返します。 --- Zlib::GzipFile#orig_name gzip ファイルのヘッダーに記録されている元ファイル名を返します。 ファイル名が記録されていない場合は nil を返します。 --- Zlib::GzipFile#comment gzip ファイルのヘッダーに記録されているコメントを返します。 コメントが存在しない場合は nil を返します。 --- Zlib::GzipFile#sync --- Zlib::GzipFile#sync= flag IO クラスと同じ。((|flag|)) が真の時、関連付けられている IO オブジェクトが flush メソッドを持っていなければなりません。 また、true にすると圧縮率が著しく低下します。 == Zlib::GzipFile::Error gzip ファイルを処理している間にエラーが生じた時に発生する全ての例外の スーパークラス。 : Zlib::GzipFile::NoFooter gzip ファイルにフッターが無い時に発生します。 : Zlib::GzipFile::CRCError フッターに記録されている CRC 値と実際に展開したデータの CRC 値が異なる時に発生します。 : Zlib::GzipFile::LengthError フッターに記録されているデータ長と実際に展開したデータの 長さが異なる時に発生します。 === スーパークラス: * (()) == Zlib::GzipReader gzip 形式の圧縮ファイルを読み込むラッパークラス。 IO クラスのインスタンス (又は IO クラスのインスタンスと同じメソッドを 持つオブジェクト) と関連付けて使用します。 Zlib::GzipReader.open('hoge.gz') {|gz| print gz.read } f = File.open('hoge.gz') gz = Zlib::GzipReader.new(f) print gz.read gz.close === スーパークラス: * (()) === インクルードしているモジュール: * Enumerable === クラスメソッド: --- Zlib::GzipReader.new(io) --- Zlib::GzipReader.new(io) {|gz| ... } ((|io|)) と関連付けられた GzipReader オブジェクトを作成します。 GzipReader オブジェクトは ((|io|)) からデータを逐次リードして 解析/展開を行います。((|io|)) には少なくとも、IO#read と 同じ動作をする read メソッドが定義されている必要があります。 ヘッダーの解析に失敗した場合 (()) 例外が 発生します。 ブロックを指定して呼び出した場合は、File.open と同じように GzipReader オブジェクトを与えられてブロックが実行されます。 ブロックの実行が終了すると、GzipReader オブジェクトは自動的に クローズされます。関連付けられている IO オブジェクトまで クローズしたくない時は、ブロック中で引数つきの (()) メソッドを明示的に呼び出して下さい。 --- Zlib::GzipReader.open(filename) --- Zlib::GzipReader.open(filename) {|gz| ... } ((|filename|)) で指定されるファイルを gzip ファイルとして オープンします。GzipReader オブジェクトを返します。 その他詳細は (()) と同じです。 === メソッド: --- Zlib::GzipReader#eof --- Zlib::GzipReader#eof? 圧縮データの終端に達した場合真を返します。 フッターが読み込まれていなくても真を返すことに注意して下さい。 --- Zlib::GzipReader#pos --- Zlib::GzipReader#tell 現在までに展開したデータの長さの合計を返します。 ファイルポインタの位置ではないことに注意して下さい。 --- Zlib::GzipReader#each([rs]) --- Zlib::GzipReader#each_line([rs]) --- Zlib::GzipReader#each_byte([rs]) --- Zlib::GzipReader#gets([rs]) --- Zlib::GzipReader#getc --- Zlib::GzipReader#lineno --- Zlib::GzipReader#lineno= --- Zlib::GzipReader#read([length]) --- Zlib::GzipReader#readchar --- Zlib::GzipReader#readline([rs]) --- Zlib::GzipReader#readlines([rs]) --- Zlib::GzipReader#ungetc(char) IO クラスの同名メソッドと同じですが、gzip ファイル中に エラーがあった場合 (()) 例外や (()) 例外が発生します。 gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は (()), (()), (()) 例外を発生させます。 * EOF (圧縮データの最後) を越えて読み込み要求を受けた時。 すなわち (()), (()) メソッド等が nil を返す時。 * EOF まで読み込んだ後、(()) メソッドが 呼び出された時。 * EOF まで読み込んだ後、(()) メソッドが 呼び出された時。 --- Zlib::GzipReader#rewind ファイルポインタを (()) を呼び出した直後の 時点に戻します。関連付けられている IO オブジェクトに seek メソッドが定義されている必要があります。 --- Zlib::GzipReader#unused gzip フォーマットの解析のために読み込んだ余剰のデータを返します。 gzip ファイルが最後まで解析されていない場合は nil を返します。 == Zlib::GzipWriter gzip 形式の圧縮ファイルを書き出すラッパークラス。 IO クラスのインスタンス (又は IO クラスのインスタンスと同じメソッドを 持つオブジェクト) と関連付けて使用します。 Zlib::GzipWriter.open('hoge.gz') {|gz| gz.write 'jugemu jugemu gokou no surikire...' } f = File.open('hoge.gz', 'w') gz = Zlib::GzipWriter.new(f) gz.write 'jugemu jugemu gokou no surikire...' gz.close なお、Ruby の finalizer の制約のため、GzipWriter オブジェクトは必ず (()) 等を用いてクローズしてください。 そうしなければフッターを書き出すことができず、壊れた gzip ファイルを 生成してしまう可能性があります。 === スーパークラス: * (()) === クラスメソッド: --- Zlib::GzipWriter.new(io[, level[, strategy]]) --- Zlib::GzipWriter.new(io[, level[, strategy]]) {|gz| ... } ((|io|)) と関連付けられた GzipWriter オブジェクトを作成します。 ((|level|)), ((|strategy|)) は (()) と同じです。 GzipWriter オブジェクトは ((|io|)) に gzip 形式のデータを 逐次ライトします。((|io|)) には少なくとも、IO#write と 同じ動作をする write メソッドが定義されている必要があります。 ブロックを指定して呼び出した場合は、File.open と同じように GzipWriter オブジェクトを与えられてブロックが実行されます。 ブロックの実行が終了すると、GzipWriter オブジェクトは自動的に クローズされます。関連付けられている IO オブジェクトまで クローズしたくない時は、ブロック中で引数つきの (()) メソッドを明示的に呼び出して下さい。 --- Zlib::GzipWriter.open(filename[, level[, strategy]]) --- Zlib::GzipWriter.open(filename[, level[, strategy]]) {|gz| ... } ((|filename|)) で指定されるファイルを gzip 圧縮データの 書き出し用にオープンします。GzipWriter オブジェクトを返します。 その他詳細は (()) と同じです。 === メソッド: --- Zlib::GzipWriter#close([dont_close_io]) フッターを書き出し、GzipWriter オブジェクトをクローズします。 ((*注意: Ruby の finalizer の制約のため、GzipWriter オブジェクトは 必ずクローズしてください。そうしなければフッターを書き出すことが できず、壊れた gzip ファイルを生成してしまう可能性があります。*)) --- Zlib::GzipWriter#pos --- Zlib::GzipWriter#tell 現在までに圧縮したデータの長さの合計を返します。 ファイルポインタの位置ではないことに注意して下さい。 --- Zlib::GzipWriter#<< str --- Zlib::GzipWriter#putc(ch) --- Zlib::GzipWriter#puts(obj...) --- Zlib::GzipWriter#print(arg...) --- Zlib::GzipWriter#printf(format, arg...) --- Zlib::GzipWriter#write(str) IO クラスの同名メソッドと同じ。 --- Zlib::GzipWriter#flush([flush]) まだ書き出されていないデータをフラッシュします。 ((|flush|)) は (()) と同じです。 省略時は (()) が使用されます。 ((|flush|)) に (()) を指定することは無意味です。 --- Zlib::GzipWriter#mtime= time gzip ファイルのヘッダーに記録する最終更新時間を指定します。 (()) 等の書き込み系メソッドを 呼んだ後で指定しようとすると (()) 例外が 発生します。 --- Zlib::GzipWriter#orig_name= filename gzip ファイルのヘッダーに記録する元ファイル名を指定します。 (()) 等の書き込み系メソッドを 呼んだ後で指定しようとすると (()) 例外が 発生します。 --- Zlib::GzipWriter#comment= string gzip ファイルのヘッダーに記録するコメントを指定します。 (()) 等の書き込み系メソッドを 呼んだ後で指定しようとすると (()) 例外が 発生します。 == 0.4.0 からの変更点 全体的に書き換えてます。これで全部…だといいなぁ(汗:: * クラス名、メソッド名の変更。全てのクラスと定数は (()) 以下に 移しました。0.4.0 との互換性のために以前のものも残してあります。 * クラス * Deflate -> (()) * Inflate -> (()) * Zlib::Gzip -> (()) * GzipReader -> (()) * GzipWriter -> (()) * Zlib::Gzip::Error -> (()) * Zlib::GzipReader::NoFooter -> (()) * Zlib::GzipReader::CRCError -> (()) * Zlib::GzipReader::LengthError -> (()) * 定数 * Zlib::ZStream::BINARY -> (()) * Zlib::ZStream::ASCII -> (()) * Zlib::ZStream::UNKNOWN -> (()) * Zlib::Deflate::NO_COMPRESSION -> (()) * Zlib::Deflate::BEST_SPEED -> (()) * Zlib::Deflate::BEST_COMPRESSION -> (()) * Zlib::Deflate::DEFAULT_COMPRESSION -> (()) * Zlib::Deflate::FILTERED -> (()) * Zlib::Deflate::HUFFMAN_ONLY -> (()) * Zlib::Deflate::DEFAULT_STRATEGY -> (()) * Zlib::Deflate::MAX_WBITS -> (()) * Zlib::Deflate::DEF_MEM_LEVEL -> (()) * Zlib::Deflate::MAX_MEM_LEVEL -> (()) * Zlib::Deflate::NO_FLUSH -> (()) * Zlib::Deflate::SYNC_FLUSH -> (()) * Zlib::Deflate::FULL_FLUSH -> (()) * Zlib::Inflate::MAX_WBITS -> (()) * Zlib::GzipReader::OS_* -> (()) * メソッド * Zlib::ZStream#flush_out -> (()) * (()) の追加。 * 入力側 (next_in) にもバッファを設ける。 * NeedDict エラーは特別に処理するようにした。 * (()) はクローズ後は nil を返す。 * (()) の義務化。finalizer での segv を 回避。 ((<[ruby-dev:11915]|URL:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/11915>)) * new と initialize を分けた。 * deflateInit2, inflateInit2 に渡す引数の sanity check を しないようにした。 * (()) の挙動は Ruby-1.7 に合わせることにした。 * 全関数を static に。 =end