diff --git a/examples/Makefile b/examples/Makefile index 5e3f0e17f..6ba8655b4 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -56,4 +56,8 @@ test: all ./simple_compression tmp @echo starting simple_decompression ./simple_decompression tmp.zst + @echo dictionary compression + ./dictionary_compression tmp README.md + @echo dictionary decompression + ./dictionary_decompression tmp.zst README.md @echo tests completed diff --git a/examples/dictionary_compression.c b/examples/dictionary_compression.c index 8c4a81a77..ef6bee06d 100644 --- a/examples/dictionary_compression.c +++ b/examples/dictionary_compression.c @@ -165,4 +165,5 @@ int main(int argc, const char** argv) ZSTD_freeCDict(dictPtr); printf("All %u files compressed. \n", argc-2); + return 0; } diff --git a/examples/dictionary_decompression.c b/examples/dictionary_decompression.c index f0976569a..54a583fa8 100644 --- a/examples/dictionary_decompression.c +++ b/examples/dictionary_decompression.c @@ -135,4 +135,5 @@ int main(int argc, const char** argv) ZSTD_freeDDict(dictPtr); printf("All %u files correctly decoded (in memory) \n", argc-2); + return 0; } diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index e2ca2d797..e4bf8a20d 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2621,22 +2621,6 @@ size_t ZSTD_compressEnd (ZSTD_CCtx* cctx, } -/*! ZSTD_compress_usingPreparedCCtx() : -* Same as ZSTD_compress_usingDict, but using a reference context `preparedCCtx`, where dictionary has been loaded. -* It avoids reloading the dictionary each time. -* `preparedCCtx` must have been properly initialized using ZSTD_compressBegin_usingDict() or ZSTD_compressBegin_advanced(). -* Requires 2 contexts : 1 for reference (preparedCCtx) which will not be modified, and 1 to run the compression operation (cctx) */ -static size_t ZSTD_compress_usingPreparedCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize) -{ - size_t const errorCode = ZSTD_copyCCtx(cctx, preparedCCtx); - if (ZSTD_isError(errorCode)) return errorCode; - - return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize); -} - - static size_t ZSTD_compress_internal (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, @@ -2732,9 +2716,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, ZSTD_pa ZSTD_CDict* ZSTD_createCDict(const void* dict, size_t dictSize, int compressionLevel) { ZSTD_customMem const allocator = { NULL, NULL, NULL }; - ZSTD_parameters params; - memset(¶ms, 0, sizeof(params)); - params.cParams = ZSTD_getCParams(compressionLevel, 0, dictSize); + ZSTD_parameters params = ZSTD_getParams(compressionLevel, 0, dictSize); params.fParams.contentSizeFlag = 1; return ZSTD_createCDict_advanced(dict, dictSize, params, allocator); } @@ -2749,14 +2731,24 @@ size_t ZSTD_freeCDict(ZSTD_CDict* cdict) return 0; } +/*! ZSTD_compress_usingCDict() : +* Compression using a digested Dictionary. +* Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times. +* Note that compression level is decided during dictionary creation */ ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, const ZSTD_CDict* cdict) { - return ZSTD_compress_usingPreparedCCtx(cctx, cdict->refContext, - dst, dstCapacity, - src, srcSize); + size_t const errorCode = ZSTD_copyCCtx(cctx, cdict->refContext); + if (ZSTD_isError(errorCode)) return errorCode; + + if (cdict->refContext->params.fParams.contentSizeFlag==1) { + cctx->params.fParams.contentSizeFlag = 1; + cctx->frameContentSize = srcSize; + } + + return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize); }