圧縮ライブラリ「zlib」はメモリ上での圧縮、解凍を行う関数を提供します。また、解凍されたデータの完全なチェックをするものも含まれています。このバージョンのライブラリではひとつの圧縮方法しかサポートしていませんが、後々ストリームを使ったこれまでと同じインターフェイスのままで、他のアルゴリズムが追加されるでしょう。
たとえば入力ファイルがメモリにマッピングされている場合など、バッファの大きさが十分であれば一回のステップで圧縮処理を完了することができます。そうでない場合は、圧縮を行う関数を何回も繰り返し呼び出すことで圧縮を行います。このとき、アプリケーションは呼び出しを行う前に次の入力や出力の領域を用意しなければなりません。
このライブラリはまた、.gz形式のファイルに対する読み書きも標準入出力と同じようなインターフェイスでサポートします。
zlibはシグナルハンドラをまったく組み込みません。解凍モジュールはデータの圧縮密度を調べるので、壊れた入力データが与えられたとしてもライブラリがクラッシュすることはありません。
zlibを使うアプリケーションは次のことを行わなければなりません。
16ビットシステムにおいては、zallocとzfreeはぴったり正確に65536バイトを確保しなければなりません。ただし、MAXSEG_64K(zconf.hを参照)が定義されている場合はこれ以上確保する必要はありません。
(警告。MS-DOSにおいては、zallocで返されるぴったり65536バイトのオブジェクトへのポインタは、必ず、オフセットアドレスをゼロに正規化しておかなければなりません。ライブラリが提供するデフォルトのアロケータはこの規則を守っています(zutil.cを参照)。)
圧縮率が犠牲になりますが、必要なメモリ量を減らし、64KBのオブジェクトを確保しなくてもすむようにするには、「-DMAX_WBITS=14」をコンパイル時の引数に加えてライブラリをコンパイルしてください(zconf.hを参照)。
total_inとtotal_outの値は合計値を出したり、Windowsで言うプログレスバーを表示するときなどに使えます。圧縮が終了するとtotal_inの値は解凍されたデータのサイズになります。この値は圧縮されたデータを解凍するときに使用するので、保存されます。
(とくに、一回のステップですべてのデータを解凍するときに必要になります。)
The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface.
Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call.
The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio.
The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input.
The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application.
The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value.
zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe.
On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step).