1.10.0 マニュアル
目次
- はじめに
- コンパイラー固有の事項
- エラー管理
- フレーム圧縮の型
- 基本圧縮関数
- 高度な圧縮関数
- リソース管理
- 圧縮
- 展開関数
- ストリーミング展開関数
- 辞書圧縮API
- 辞書圧縮の一括処理
- 高度な圧縮操作
- メモリ確保のカスタマイズ
はじめに
lz4frame.hはLZ4フレーム仕様を実装します。doc/lz4_Frame_format.mdを参照してください。LZ4フレームは`lz4` CLIと互換で、どのシステムとも相互運用できるよう設計しています。
コンパイラー固有の事項
エラー管理
unsigned LZ4F_isError(LZ4F_errorCode_t code); /**< tells when a function result is an error code */
const char* LZ4F_getErrorName(LZ4F_errorCode_t code); /**< return error code string; for debugging */
フレーム圧縮の型
typedef enum {
LZ4F_default=0,
LZ4F_max64KB=4,
LZ4F_max256KB=5,
LZ4F_max1MB=6,
LZ4F_max4MB=7
LZ4F_OBSOLETE_ENUM(max64KB)
LZ4F_OBSOLETE_ENUM(max256KB)
LZ4F_OBSOLETE_ENUM(max1MB)
LZ4F_OBSOLETE_ENUM(max4MB)
} LZ4F_blockSizeID_t;
typedef enum {
LZ4F_blockLinked=0,
LZ4F_blockIndependent
LZ4F_OBSOLETE_ENUM(blockLinked)
LZ4F_OBSOLETE_ENUM(blockIndependent)
} LZ4F_blockMode_t;
typedef enum {
LZ4F_noContentChecksum=0,
LZ4F_contentChecksumEnabled
LZ4F_OBSOLETE_ENUM(noContentChecksum)
LZ4F_OBSOLETE_ENUM(contentChecksumEnabled)
} LZ4F_contentChecksum_t;
typedef enum {
LZ4F_noBlockChecksum=0,
LZ4F_blockChecksumEnabled
} LZ4F_blockChecksum_t;
typedef enum {
LZ4F_frame=0,
LZ4F_skippableFrame
LZ4F_OBSOLETE_ENUM(skippableFrame)
} LZ4F_frameType_t;
typedef struct {
LZ4F_blockSizeID_t blockSizeID; /* max64KB, max256KB, max1MB, max4MB; 0 == default (LZ4F_max64KB) */
LZ4F_blockMode_t blockMode; /* LZ4F_blockLinked, LZ4F_blockIndependent; 0 == default (LZ4F_blockLinked) */
LZ4F_contentChecksum_t contentChecksumFlag; /* 1: add a 32-bit checksum of frame's decompressed data; 0 == default (disabled) */
LZ4F_frameType_t frameType; /* read-only field : LZ4F_frame or LZ4F_skippableFrame */
unsigned long long contentSize; /* Size of uncompressed content ; 0 == unknown */
unsigned dictID; /* Dictionary ID, sent by compressor to help decoder select correct dictionary; 0 == no dictID provided */
LZ4F_blockChecksum_t blockChecksumFlag; /* 1: each block followed by a checksum of block's compressed data; 0 == default (disabled) */
} LZ4F_frameInfo_t;
フレームのパラメーターを設定・読み取りできます。
構造体は、まずmemset()またはLZ4F_INIT_FRAMEINFOを使って0に初期化し、すべてのパラメーターを既定値にしなければなりません。
その後、一部のパラメーターだけを変更できます。
typedef struct {
LZ4F_frameInfo_t frameInfo;
int compressionLevel; /* 0: default (fast mode); values > LZ4HC_CLEVEL_MAX count as LZ4HC_CLEVEL_MAX; values < 0 trigger "fast acceleration" */
unsigned autoFlush; /* 1: always flush; reduces usage of internal buffers */
unsigned favorDecSpeed; /* 1: parser favors decompression speed vs compression ratio. Only works for high compression modes (>= LZ4HC_CLEVEL_OPT_MIN) */ /* v1.8.2+ */
unsigned reserved[3]; /* must be zero for forward compatibility */
} LZ4F_preferences_t;
ストリーミングインターフェースへ、高度な圧縮指示を渡せます。
構造体は、まずmemset()またはLZ4F_INIT_PREFERENCESを使って0に初期化し、すべてのパラメーターを既定値にしなければなりません。
予約済みのフィールドは、すべてゼロにしなければなりません。
基本圧縮関数
size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity,
const void* srcBuffer, size_t srcSize,
const LZ4F_preferences_t* preferencesPtr);
srcBufferの内容を、LZ4で圧縮したフレームへ圧縮します。一括の操作で、入力の全内容を消費し、出力全体を生成します。
注意: 状態を持たない操作です(LZ4F_cctx状態は不要)。アロケーターの負荷を減らすため、LZ4F_compressFrame()は既定で、圧縮状態と一部のテーブル用領域をスタックに確保します。このスタック使用量がアプリケーションにとって大きすぎる場合は、コンパイル時のマクロLZ4F_HEAPMODEを1にして`lz4frame.c`をコンパイルすることを検討してください。状態の確保はすべてヒープを使います。また、その場合、LZ4F_compressFrame()を呼ぶごとに、内部で複数のalloc/free呼び出しを行います。
@dstCapacityは、**必ず** >= LZ4F_compressFrameBound(srcSize, preferencesPtr)でなければなりません。
@preferencesPtrは任意です。NULLを渡すと、すべての設定を既定値にします。
@return: dstBufferへ書いたバイト数。失敗した場合はエラーコードです(LZ4F_isError()で検査できます)。
size_t LZ4F_compressFrameBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr);srcSizeと設定を基に、LZ4F_compressFrame()による最大の圧縮サイズを返します。 `preferencesPtr`は任意です。NULLに置き換えると、既定の設定を想定します。 注意: この結果を使えるのはLZ4F_compressFrame()だけです。LZ4F_compressUpdate()にも関係し得ますが、flush()操作を一度も行わない場合に_限ります_。
int LZ4F_compressionLevel_max(void); /* v1.8.0+ */@return: 許される最大圧縮レベル(現在は12)。
高度な圧縮関数
typedef struct {
unsigned stableSrc; /* 1 == src content will remain present on future calls to LZ4F_compress(); skip copying src content within tmp buffer */
unsigned reserved[3];
} LZ4F_compressOptions_t;
リソース管理
LZ4F_errorCode_t LZ4F_createCompressionContext(LZ4F_cctx** cctxPtr, unsigned version); LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctx);まず、ストリーミング圧縮中の処理状態を追跡するcompressionContextオブジェクトを生成します。LZ4F_createCompressionContext()にバージョンとLZ4F_cctx*へのポインターを渡し、生成したポインターをその場所へ書き込みます。 渡す@versionは、**必ず**LZ4F_VERSIONでなければなりません。特にDLLを使う場合の、バージョン不一致の可能性を追跡するためです。関数は、完全に確保したLZ4F_cctxオブジェクトへのポインターを提供します。 @cctxPtrは、**必ず** != NULLでなければなりません。 @returnがゼロでなければ、コンテキストの生成に失敗しています。 生成した圧縮コンテキストは、連続するストリーミング操作に何度も使えます。すべてのストリーミング圧縮処理が終わったら、LZ4F_freeCompressionContext()で状態オブジェクトを解放できます。 注意1: LZ4F_freeCompressionContext()は常に成功します。戻り値は無視できます。 注意2: LZ4F_freeCompressionContext()にNULLポインターを渡しても正常に動作します(何もしません)。
圧縮
size_t LZ4F_compressBegin(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
const LZ4F_preferences_t* prefsPtr);
フレームヘッダーをdstBufferへ書き込みます。
dstCapacityは >= LZ4F_HEADER_SIZE_MAXバイトでなければなりません。
`prefsPtr`は任意です。NULLを渡すと、すべての設定を既定値にします。
@return: ヘッダーとしてdstBufferへ書いたバイト数、またはエラーコードです(LZ4F_isError()で検査できます)。
size_t LZ4F_compressBound(size_t srcSize, const LZ4F_preferences_t* prefsPtr);srcSizeと設定を基に、最悪の場合でもLZ4F_compressUpdate()の成功を保証するのに必要な最小dstCapacityを提供します。 srcSize==0なら、代わりにLZ4F_flush()とLZ4F_compressEnd()の上限を提供します。 結果が有効なのは、LZ4F_compressUpdate()一回の呼び出しだけです。LZ4F_compressUpdate()を複数回呼ぶ際、出力バッファーを空にして先頭から再利用せず、徐々に満たす場合は、各呼び出しの前にLZ4F_compressBound()で残り容量が十分か確認しなければなりません。 同じsrcSizeとprefsPtrに対するLZ4F_compressBound()の@returnは常に同じです。 prefsPtrは任意です。NULLを渡すと、最悪の場合をカバーする設定にします。 技術的な詳細: 自動フラッシュを有効にしていなければ、@returnは内部バッファーに既に最大(blockSize-1)バイト入っている可能性を含みます。 LZ4F_compressEnd()で生成し得るので、フレームのフッター(終端とチェックサム)も含みます。 フレームヘッダーはLZ4F_compressBegin()で既に生成しているため、@returnには含みません。
size_t LZ4F_compressUpdate(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
const void* srcBuffer, size_t srcSize,
const LZ4F_compressOptions_t* cOptPtr);
LZ4F_compressUpdate()は、必要なだけのデータを圧縮するため、繰り返し呼べます。
重要な規則: dstCapacityは、最悪の場合でも処理の成功を保証できるほど、**必ず**大きくなければなりません。この値はLZ4F_compressBound()が提供します。条件を守らないと、LZ4F_compress()は失敗します(結果はerrorCodeです)。エラー後の状態は未定義(UB)になり、再初期化または解放しなければなりません。
以前に非圧縮ブロックを書いた場合は、圧縮データの追加を続ける前に、バッファー内のデータをフラッシュします。
`cOptPtr`は任意です。NULLを渡すと、すべてのオプションを既定値にします。
@return: `dstBuffer`へ書いたバイト数。ゼロの場合もあり、入力データをバッファーに入れただけという意味です。失敗した場合はエラーコードです(LZ4F_isError()で検査できます)。
size_t LZ4F_flush(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
const LZ4F_compressOptions_t* cOptPtr);
ブロックが完全に満たされるのを待たず、データを直ちに生成・送信しなければならない場合は、LZ4_flush()を呼べます。cctx内に蓄えたデータを直ちに圧縮します。
`dstCapacity`は、処理の成功を保証できるほど大きくなければなりません。
`cOptPtr`は任意です。NULLを渡すと、すべてのオプションを既定値にします。
@return: dstBufferへ書いたバイト数。cctx内にデータがなければ、ゼロの場合もあります。失敗した場合はエラーコードです(LZ4F_isError()で検査できます)。
注意: dstCapacity >= LZ4F_compressBound(0, prefsPtr)なら、LZ4F_flush()の成功を保証します。
size_t LZ4F_compressEnd(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
const LZ4F_compressOptions_t* cOptPtr);
LZ4フレームを正しく終了するには、LZ4F_compressEnd()を呼びます。LZ4_flush()と同じように、`cctx`内に残ったデータをすべてフラッシュし、endMarkとチェックサムでフレームを正しく完結させます。
`cOptPtr`は任意です。NULLを渡すと、すべてのオプションを既定値にします。
@return: dstBufferへ書いたバイト数(必ず >= 4。endMark)、または失敗時のエラーコードです(LZ4F_isError()で検査できます)。
注意: dstCapacity >= LZ4F_compressBound(0, prefsPtr)なら、LZ4F_compressEnd()の成功を保証します。LZ4F_compressEnd()の呼び出しに成功すると、`cctx`は別の圧縮処理に再び使えます。
展開関数
typedef struct {
unsigned stableDst; /* pledges that last 64KB decompressed data is present right before @dstBuffer pointer.
* This optimization skips internal storage operations.
* Once set, this pledge must remain valid up to the end of current frame. */
unsigned skipChecksums; /* disable checksum calculation and verification, even when one is present in frame, to save CPU time.
* Setting this option to 1 once disables all checksums for the rest of the frame. */
unsigned reserved1; /* must be set to zero for forward compatibility */
unsigned reserved0; /* idem */
} LZ4F_decompressOptions_t;
LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr, unsigned version); LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx);展開処理全体を追跡するLZ4F_dctxオブジェクトを生成します。 渡す@versionは、**必ず**LZ4F_VERSIONでなければなりません。 @dctxPtrは、**必ず**有効でなければなりません。 関数は、確保・初期化済みのLZ4F_dctxオブジェクトへのポインターを@dctxPtrへ書き込みます。 @returnはerrorCodeで、LZ4F_isError()で検査できます。 dctxのメモリはLZ4F_freeDecompressionContext()で解放できます。LZ4F_freeDecompressionContext()の結果は、解放時のdecompressionContextの状態を示します。つまり、展開が完全かつ正しく終わっている場合は == 0となるはずです。
ストリーミング展開関数
size_t LZ4F_headerSize(const void* src, size_t srcSize);`src`から始まるフレームのヘッダーサイズを提供します。 `srcSize`は >= LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTHでなければなりません。この量があれば、ヘッダーの長さを読み取れます。 @return: フレームヘッダーのサイズ、またはエラーコードです。LZ4F_isError()で検査できます。 注意: フレームヘッダーのサイズは可変ですが、>= LZ4F_HEADER_SIZE_MINバイト、かつ <= LZ4F_HEADER_SIZE_MAXバイトであることを保証します。
size_t
LZ4F_getFrameInfo(LZ4F_dctx* dctx,
LZ4F_frameInfo_t* frameInfoPtr,
const void* srcBuffer, size_t* srcSizePtr);
フレームのパラメーター(最大blockSize、dictIDなど)を取り出します。使用は任意で、利用者はLZ4F_decompress()を直接呼ぶこともできます。
取り出した情報は、既存のLZ4F_frameInfo_t構造体へ書き込みます。メモリ確保や辞書の識別に役立ちます。
LZ4F_getFrameInfo()は次の状況で使えます。
1) 新しいフレームの先頭で、LZ4F_decompress()を一度も呼んでいない場合。`srcBuffer`からヘッダーを読み取り、そのヘッダーを消費して展開処理を開始します。
入力にはフレームヘッダー全体が入るだけのサイズが必要です。ヘッダーサイズはLZ4F_headerSize()で事前に調べられます。サイズは可変ですが、>= LZ4F_HEADER_SIZE_MINバイト、かつ <= LZ4F_HEADER_SIZE_MAXバイトであることを保証します。したがって、調べずにLZ4F_HEADER_SIZE_MAXバイト以上を渡しても常に動作します。ヘッダーサイズを超える入力データも渡せますが、LZ4F_getFrameInfo()が消費するのはヘッダーだけです。入力サイズが不足し、ヘッダーサイズより小さければ、関数は失敗してエラーコードを返します。
2) 展開開始後は、dctx内に保存した、既に読み取り済みのフレームパラメーターを、LZ4F_getFrameInfo()を呼んでいつでも取り出せます。ただし、展開を始めたばかりで、ヘッダーを読み取るのに十分な情報をまだ読んでいなければ、LZ4F_getFrameInfo()は失敗します。
srcBufferから消費したバイト数は、*srcSizePtrへ書き込みます(必ず元の値以下)。LZ4F_getFrameInfo()がバイトを消費するのは、展開がまだ始まっておらず、かつヘッダーの読み取りに成功した場合だけです。その後の展開は、(srcBuffer + *srcSizePtr)から再開しなければなりません。
@return: 次の呼び出しでLZ4F_decompress()が期待するsrcSizeバイト数の目安、またはエラーコードです。LZ4F_isError()で検査できます。
注意1: エラーの場合はdctxを変更しません。展開処理は安全に先頭から再開できます。
注意2: フレームのパラメーターは、確保済みのLZ4F_frameInfo_t構造体へ*コピーします*。
size_t
LZ4F_decompress(LZ4F_dctx* dctx,
void* dstBuffer, size_t* dstSizePtr,
const void* srcBuffer, size_t* srcSizePtr,
const LZ4F_decompressOptions_t* dOptPtr);
`srcBuffer`内の圧縮データを復元するため、繰り返し呼びます。
有効なdctx状態が必要です。srcBufferから最大*srcSizePtrバイトを読み、容量*dstSizePtrのdstBufferへデータを展開します。
srcBufferから消費したバイト数を*srcSizePtrへ、dstBufferへ展開したバイト数を*dstSizePtrへ書き込みます(どちらも必ず元の値以下)。
入力の全バイトを読むとは限らないので、*srcSizePtrの値を常に確認してください。未消費の入力データは、後続の呼び出しで再び渡さなければなりません。
`dstBuffer`は、連続する呼び出しの間で自由に変更できます。その内容は上書きします。
注意: `LZ4F_decompress()`より先に`LZ4F_getFrameInfo()`を呼んだ場合は、ヘッダー読み取りで消費したバイト数を反映するよう、srcBufferを更新しなければなりません。更新せずに`LZ4F_decompress()`を呼ぶと、展開の失敗、またはさらに悪いことに、成功しているように見える誤った展開を招きます。詳細は`LZ4F_getFrameInfo()`の説明を参照してください。
@return: 次の呼び出しでLZ4F_decompress()が期待する`srcSize`バイト数の目安です。概略として、現在の(または残りの)圧縮ブロックのサイズと、次のブロックのヘッダーの合計です。目安に従うと中間バッファーを省けるため、速度が少し向上します。ただし、あくまで目安で、任意のsrcSizeを渡せます。
フレームを完全に展開すると、@returnは0です(それ以上のデータは期待しません)。フレームの展開に必要な量より多くのバイトを渡した場合は、LZ4F_decompress()は現在のフレームの終端で正確に読み取りを止め、0を返します。
展開に失敗した場合はエラーコードを返し、LZ4F_isError()で検査できます。エラー後の`dctx`コンテキストは再開できません。LZ4F_resetDecompressionContext()で正常な状態に戻してください。
フレームの展開が完全に終わった後は、dctxを別のフレームの展開に再利用できます。
void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx); /* always successful */エラーの場合、コンテキストは「未定義」の状態になります。再利用する前に、リセットしなければなりません。 未完了の展開を途中で停止し、同じコンテキストのリソースを使って新たな展開を始めるためにも使えます。
辞書圧縮API
size_t
LZ4F_compressBegin_usingDict(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
const void* dictBuffer, size_t dictSize,
const LZ4F_preferences_t* prefsPtr);
辞書を使うストリーミング圧縮を初期化し、フレームヘッダーをdstBufferへ書き込みます。
@dstCapacityは >= LZ4F_HEADER_SIZE_MAXバイトでなければなりません。
@prefsPtrは任意で、NULLも渡せます。ただし、フレームヘッダーへdictIDを提供するには、この設定を渡す以外に方法がありません。
@dictBufferは、圧縮セッションより長く存続しなければなりません。
@return: ヘッダーとしてdstBufferへ書いたバイト数、またはエラーコードです(LZ4F_isError()で検査できます)。
注意: LZ4Frame仕様では、独立した各ブロックを辞書で圧縮できますが、この関数が対応するのは、最初のブロックだけが辞書を使う、より限られた状況です。一ブロックしか必要ない小さなデータには、それでも役立ちます。より大きな入力では、後述のLZ4F_compressFrame_usingCDict()の方に関心があるかもしれません。
size_t
LZ4F_decompress_usingDict(LZ4F_dctx* dctxPtr,
void* dstBuffer, size_t* dstSizePtr,
const void* srcBuffer, size_t* srcSizePtr,
const void* dict, size_t dictSize,
const LZ4F_decompressOptions_t* decompressOptionsPtr);
事前に定めた辞書を使う点を除き、LZ4F_decompress()と同じです。
辞書は前処理をせず、その場で使います。フレーム全体の展開中ずっと、アクセス可能でなければなりません。
辞書圧縮の一括処理
LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize); void LZ4F_freeCDict(LZ4F_CDict* CDict);同じ辞書で複数のメッセージやブロックを圧縮する場合、初期化は一度だけ行うことを推奨します。 LZ4_createCDict()は、処理済みの辞書を生成し、以後の圧縮処理を開始時の遅延なしに始められるようにします。 LZ4_CDictは、読み取り専用で使うため、一度生成して、複数のスレッドで並行して共有できます。 内容をCDict内へコピーするので、LZ4_CDict生成後は@dictBufferを解放できます。
size_t
LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const LZ4F_CDict* cdict,
const LZ4F_preferences_t* preferencesPtr);
処理済みの辞書を使い、srcBuffer全体を有効なLZ4フレームへ圧縮します。
@cctxは、LZ4F_createCompressionContext()で生成したコンテキストを指さなければなりません。
@cdict==NULLなら、辞書なしで圧縮します。
@dstBufferは、**必ず** >= LZ4F_compressFrameBound(srcSize, preferencesPtr)でなければなりません。条件を守らないと失敗します(@returnはerrorCode)。
LZ4F_preferences_t構造体は任意で、NULLを渡せますが、推奨しません。フレームヘッダーへ@dictIDを提供できる唯一の方法だからです。
@return: dstBufferへ書いたバイト数、または失敗時のエラーコードです(LZ4F_isError()で検査できます)。
注意: 複数の独立ブロックを生成する大きな入力では、この関数は各ブロックに辞書を使います。
size_t
LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
const LZ4F_CDict* cdict,
const LZ4F_preferences_t* prefsPtr);
辞書を使うストリーミング圧縮を初期化し、フレームヘッダーをdstBufferへ書き込みます。
@dstCapacityは >= LZ4F_HEADER_SIZE_MAXバイトでなければなりません。
@prefsPtrは任意で、NULLを渡せます。ただし、フレームヘッダーに@dictIDを挿入できる唯一の方法である点に注意してください。
@cdictは、圧縮セッションより長く存続しなければなりません。
@return: ヘッダーとしてdstBufferへ書いたバイト数、またはエラーコードです。LZ4F_isError()で検査できます。
typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM)
_LZ4F_dummy_error_enum_for_c89_never_used } LZ4F_errorCodes;
高度な圧縮操作
LZ4FLIB_STATIC_API size_t LZ4F_getBlockSize(LZ4F_blockSizeID_t blockSizeID);@return: @blockSizeIDに対応する最大ブロックサイズを、スカラー形式(size_t)で返します。@blockSizeIDが不正な場合はエラーコードで、LZ4F_isError()で検査できます。
LZ4FLIB_STATIC_API size_t
LZ4F_uncompressedUpdate(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
const void* srcBuffer, size_t srcSize,
const LZ4F_compressOptions_t* cOptPtr);
LZ4F_uncompressedUpdate()は、非圧縮ブロックとして保存するデータを追加するため、繰り返し呼べます。
重要な規則: 圧縮を行わないので、dstCapacityは入力バッファー全体を保存できるほど、**必ず**大きくなければなりません。条件を守らないとLZ4F_uncompressedUpdate()は失敗します(結果はerrorCode)。エラー後の状態は未定義(UB)になり、再初期化または解放しなければなりません。
以前に圧縮ブロックを書いた場合は、非圧縮データの追加を続ける前に、まずバッファー内のデータをフラッシュします。
この操作に対応するのは、LZ4F_blockIndependentを使う場合だけです。
`cOptPtr`は任意です。NULLを渡すと、すべてのオプションを既定値にします。
@return: `dstBuffer`へ書いたバイト数。ゼロの場合もあり、入力データをバッファーに入れただけという意味です。失敗した場合はエラーコードです(LZ4F_isError()で検査できます)。
メモリ確保のカスタマイズ
typedef void* (*LZ4F_AllocFunction) (void* opaqueState, size_t size);
typedef void* (*LZ4F_CallocFunction) (void* opaqueState, size_t size);
typedef void (*LZ4F_FreeFunction) (void* opaqueState, void* address);
typedef struct {
LZ4F_AllocFunction customAlloc;
LZ4F_CallocFunction customCalloc; /* optional; when not defined, uses customAlloc + memset */
LZ4F_FreeFunction customFree;
void* opaqueState;
} LZ4F_CustomMem;
static
#ifdef __GNUC__
__attribute__((__unused__))
#endif
LZ4F_CustomMem const LZ4F_defaultCMem = { NULL, NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */
これらのプロトタイプで、独自の確保・解放関数を渡せます。
状態生成時に、後述のLZ4F_create*_advanced()を使ってLZ4F_customMemを渡します。
確保・解放処理はすべて、通常の<stdlib.h>の関数に代わり、この独自の関数で行います。