diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index 83f85c770..9ed4cc9e2 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -2180,3 +2180,41 @@ size_t ZSTD_compress(void* dst, size_t maxDstSize, const void* src, size_t srcSi free(ctxBody.workSpace); /* can't free ctxBody, since it's on stack; free heap content */ return result; } + +size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, + void* dst, size_t maxDstSize, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel) +{ + BYTE* const ostart = (BYTE*)dst; + BYTE* op = ostart; + size_t oSize; + + /* Header */ + oSize = ZSTD_compressBegin_advanced(ctx, dst, maxDstSize, ZSTD_getParams(compressionLevel, srcSize+dictSize)); + if (ZSTD_isError(oSize)) return oSize; + op += oSize; + maxDstSize -= oSize; + + if (dict) + { + oSize = ZSTD_compress_insertDictionary(ctx, dict, dictSize); + if (ZSTD_isError(oSize)) return oSize; + } + + /* body (compression) */ + oSize = ZSTD_compressContinue(ctx, op, maxDstSize, src, srcSize); + if (ZSTD_isError(oSize)) return oSize; + op += oSize; + maxDstSize -= oSize; + + /* Close frame */ + oSize = ZSTD_compressEnd(ctx, op, maxDstSize); + if (ZSTD_isError(oSize)) return oSize; + op += oSize; + + return (op - ostart); +} + + diff --git a/lib/zstd_static.h b/lib/zstd_static.h index 1b43e69e3..9638af11e 100644 --- a/lib/zstd_static.h +++ b/lib/zstd_static.h @@ -98,9 +98,17 @@ ZSTDLIB_API size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx, const void* src, size_t srcSize, ZSTD_parameters params); +/** ZSTD_compress_usingDict +* Same as ZSTD_compressCCtx(), using a Dictionary content as prefix */ +ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, + void* dst, size_t maxDstSize, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + int compressionLevel); + /* ************************************** -* Streaming functions (bufferless mode) +* Streaming functions (direct mode) ****************************************/ ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, void* dst, size_t maxDstSize, int compressionLevel); ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* ctx, void* dst, size_t maxDstSize, ZSTD_parameters params); diff --git a/programs/bench.c b/programs/bench.c index da12d888b..8849935c6 100644 --- a/programs/bench.c +++ b/programs/bench.c @@ -211,8 +211,6 @@ typedef struct size_t resSize; } blockParam_t; -typedef size_t (*compressor_t) (void* dst, size_t maxDstSize, const void* src, size_t srcSize, int compressionLevel); - #define MIN(a,b) ((a)<(b) ? (a) : (b)) static int BMK_benchMem(const void* srcBuffer, size_t srcSize, @@ -225,7 +223,6 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, const size_t maxCompressedSize = ZSTD_compressBound(srcSize) + (maxNbBlocks * 1024); /* add some room for safety */ void* const compressedBuffer = malloc(maxCompressedSize); void* const resultBuffer = malloc(srcSize); - const compressor_t compressor = ZSTD_compress; U64 crcOrig = XXH64(srcBuffer, srcSize, 0); U32 nbBlocks = 0; @@ -292,7 +289,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, while (BMK_GetMilliSpan(milliTime) < TIMELOOP) { for (blockNb=0; blockNb