zlib.h -- 汎用圧縮ライブラリ「zlib」のインターフェース バージョン1.3.2、2026年2月17日 Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler このソフトウェアは「現状のまま」提供され、明示・黙示を問わず一切の保証はありません。 このソフトウェアの使用に起因する損害について、著作者はいかなる場合も責任を負いません。 次の制限に従うことを条件として、商用用途を含むあらゆる目的での使用、 改変、および自由な再配布を、すべての人に許可します。 1. このソフトウェアの出自を偽ってはなりません。元のソフトウェアを自分が作成したと 主張してはなりません。製品で使用する場合、製品の文書に謝辞を記載していただければ 幸いですが、必須ではありません。 2. 改変したソース版は、改変版であることを明確に示さなければならず、 元のソフトウェアであるかのように表示してはなりません。 3. この通知をソース配布物から削除したり、変更したりしてはなりません。 Jean-loup Gailly Mark Adler [email protected] [email protected] zlibライブラリが使用するデータ形式は、RFC(Request for Comments)1950〜1952に 記載されています。https://datatracker.ietf.org/doc/html/rfc1950 (zlib形式)、rfc1951(deflate形式)、rfc1952(gzip形式)を参照してください。


#ifndef ZLIB_H
#define ZLIB_H

#ifdef ZLIB_BUILD
#  include <zconf.h>
#else
# include "zconf.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define ZLIB_VERSION "1.3.2"
#define ZLIB_VERNUM 0x1320
#define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 3
#define ZLIB_VER_REVISION 2
#define ZLIB_VER_SUBREVISION 0

「zlib」圧縮ライブラリは、メモリ上の圧縮・展開機能を提供し、展開後データの 完全性チェックも含みます。この版が対応する圧縮方式は1種類(deflation)だけですが、 今後ほかのアルゴリズムも追加され、同じストリームインターフェースを使用する予定です。 バッファーが十分に大きければ、圧縮は1回の処理で行えます。 圧縮関数を繰り返し呼び出す方法もあります。その場合、アプリケーションは各呼び出しの前に 入力を追加するか、出力を取り出して空き領域を確保するか、またはその両方を行わなければなりません。 メモリ上の関数が既定で使用する圧縮データ形式はzlib形式です。 RFC 1950に記載されたzlibラッパーが、RFC 1951に記載されたdeflateストリームを包みます。 また、このライブラリはgzip(.gz)形式のファイルの読み書きにも対応します。 「gz」で始まる関数を使い、stdioに似たインターフェースで操作できます。 gzip形式はzlib形式とは異なり、RFC 1952に記載されたgzipラッパーが deflateストリームを包みます。 必要に応じて、メモリ上でgzipおよびraw deflateストリームを読み書きすることもできます。 zlib形式は、メモリ上や通信路での利用に向け、小さく高速になるよう設計されています。 gzip形式はファイルシステム上の単一ファイルの圧縮用に設計されており、 ディレクトリ情報を保持するためzlibより大きなヘッダーを持ちます。 また、zlibとは異なる、より低速なチェック方式を使います。 このライブラリはシグナルハンドラーを設定しません。デコーダーは圧縮データの 整合性を検査するため、入力が破損していてもライブラリがクラッシュすることはないはずです。


typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size);
typedef void   (*free_func)(voidpf opaque, voidpf address);

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* 次の入力バイト */
    uInt     avail_in;  /* next_inにある利用可能なバイト数 */
    uLong    total_in;  /* これまでに読み込んだ入力バイトの総数 */

    Bytef    *next_out; /* 次の出力バイトの書き込み先 */
    uInt     avail_out; /* next_outの残り空き領域 */
    uLong    total_out; /* これまでに出力したバイトの総数 */

    z_const char *msg;  /* 直近のエラーメッセージ。エラーがなければNULL */
    struct internal_state FAR *state; /* アプリケーションからは参照できない */

    alloc_func zalloc;  /* 内部状態の確保に使用 */
    free_func  zfree;   /* 内部状態の解放に使用 */
    voidpf     opaque;  /* zallocとzfreeに渡す独自のデータオブジェクト */

    int     data_type;  /* データ型の最良の推定。deflateではバイナリーかテキスト、
                           inflateではデコード状態 */
    uLong   adler;      /* 非圧縮データのAdler-32またはCRC-32値 */
    uLong   reserved;   /* 将来の使用のために予約 */
} z_stream;

typedef z_stream FAR *z_streamp;

zlibルーチンとの間で受け渡すgzipヘッダー情報です。 各フィールドの意味の詳細はRFC 1952を参照してください。

typedef struct gz_header_s {
    int     text;       /* 圧縮データがテキストと考えられる場合は真 */
    uLong   time;       /* 更新時刻 */
    int     xflags;     /* 追加フラグ(gzipファイルの書き込み時には使用しない) */
    int     os;         /* オペレーティングシステム */
    Bytef   *extra;     /* 追加フィールドへのポインター。なければZ_NULL */
    uInt    extra_len;  /* 追加フィールドの長さ(extra != Z_NULLの場合に有効) */
    uInt    extra_max;  /* extraの領域サイズ(ヘッダーの読み込み時のみ) */
    Bytef   *name;      /* ゼロ終端のファイル名へのポインター、またはZ_NULL */
    uInt    name_max;   /* nameの領域サイズ(ヘッダーの読み込み時のみ) */
    Bytef   *comment;   /* ゼロ終端のコメントへのポインター、またはZ_NULL */
    uInt    comm_max;   /* commentの領域サイズ(ヘッダーの読み込み時のみ) */
    int     hcrc;       /* ヘッダーCRCが存在した、または存在する予定なら真 */
    int     done;       /* gzipヘッダーの読み込み完了時は真
                           (gzipファイルの書き込み時には使用しない) */
} gz_header;

typedef gz_header FAR *gz_headerp;

アプリケーションは、avail_inが0になったらnext_inとavail_inを更新しなければなりません。 avail_outが0になったら、next_outとavail_outを更新しなければなりません。 初期化関数を呼び出す前に、zalloc、zfree、opaqueを初期化しなければなりません。 ほかのすべてのフィールドは圧縮ライブラリが設定するため、アプリケーションが更新してはなりません。 アプリケーションが指定したopaqueの値は、zallocとzfreeを呼び出す際の第1引数に渡されます。 独自のメモリ管理に役立つことがあります。圧縮ライブラリはopaqueの値に意味を与えません。 対象オブジェクトに必要なメモリが足りない場合、zallocはZ_NULLを返さなければなりません。 マルチスレッドのアプリケーションでzlibを使う場合、zallocとzfreeはスレッドセーフで なければなりません。その条件を満たせば、zlibはスレッドセーフです。 初期化関数に入る時点でzallocとzfreeがZ_NULLなら、標準ライブラリ関数malloc()とfree()を 使う内部ルーチンが設定されます。 16ビットシステムでは、zallocとzfreeはちょうど65536バイトの領域を確保できなければ なりません。ただし、MAXSEG_64Kが定義されていれば、それを超える領域の確保は要求されません (zconf.hを参照)。警告:MSDOSでは、ちょうど65536バイトの オブジェクトに対してzallocが返すポインターのオフセットは、必ず0に正規化されていなければなりません。 ライブラリの既定の確保関数はこれを保証します(zutil.cを参照)。 メモリ要件を減らし、64Kのオブジェクトの確保を避けるには、圧縮率を犠牲にして -DMAX_WBITS=14を指定してライブラリをコンパイルします (zconf.hを参照)。 total_inとtotal_outは統計情報や進捗報告に利用できます。圧縮後のtotal_inは 非圧縮データの総サイズを保持しており、展開側で使うために保存できます。 特に、展開側がすべてを1回の処理で展開したい場合に役立ちます。