committed by
Nick Terrell
parent
329169189c
commit
b4467c1061
@@ -1172,10 +1172,15 @@ ZSTD_checkDictValidity(const ZSTD_window_t* window,
|
|||||||
(unsigned)blockEndIdx, (unsigned)maxDist, (unsigned)loadedDictEnd);
|
(unsigned)blockEndIdx, (unsigned)maxDist, (unsigned)loadedDictEnd);
|
||||||
assert(blockEndIdx >= loadedDictEnd);
|
assert(blockEndIdx >= loadedDictEnd);
|
||||||
|
|
||||||
if (blockEndIdx > loadedDictEnd + maxDist) {
|
if (blockEndIdx > loadedDictEnd + maxDist || loadedDictEnd != window->dictLimit) {
|
||||||
/* On reaching window size, dictionaries are invalidated.
|
/* On reaching window size, dictionaries are invalidated.
|
||||||
* For simplification, if window size is reached anywhere within next block,
|
* For simplification, if window size is reached anywhere within next block,
|
||||||
* the dictionary is invalidated for the full block.
|
* the dictionary is invalidated for the full block.
|
||||||
|
*
|
||||||
|
* We also have to invalidate the dictionary if ZSTD_window_update() has detected
|
||||||
|
* non-contiguous segments, which means that loadedDictEnd != window->dictLimit.
|
||||||
|
* loadedDictEnd may be 0, if forceWindow is true, but in that case we never use
|
||||||
|
* dictMatchState, so setting it to NULL is not a problem.
|
||||||
*/
|
*/
|
||||||
DEBUGLOG(6, "invalidating dictionary for current block (distance > windowSize)");
|
DEBUGLOG(6, "invalidating dictionary for current block (distance > windowSize)");
|
||||||
*loadedDictEndPtr = 0;
|
*loadedDictEndPtr = 0;
|
||||||
|
|||||||
@@ -2592,6 +2592,27 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
}
|
}
|
||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
|
DISPLAYLEVEL(3, "test%3d : bufferless api with cdict : ", testNb++);
|
||||||
|
{ ZSTD_CDict* const cdict = ZSTD_createCDict(dictBuffer, dictSize, 1);
|
||||||
|
ZSTD_DCtx* const dctx = ZSTD_createDCtx();
|
||||||
|
ZSTD_frameParameters const fParams = { 0, 1, 0 };
|
||||||
|
size_t cBlockSize;
|
||||||
|
cSize = 0;
|
||||||
|
CHECK_Z(ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, ZSTD_CONTENTSIZE_UNKNOWN));
|
||||||
|
cBlockSize = ZSTD_compressContinue(cctx, (char*)compressedBuffer + cSize, compressedBufferSize - cSize, CNBuffer, 1000);
|
||||||
|
CHECK_Z(cBlockSize);
|
||||||
|
cSize += cBlockSize;
|
||||||
|
cBlockSize = ZSTD_compressEnd(cctx, (char*)compressedBuffer + cSize, compressedBufferSize - cSize, (char const*)CNBuffer + 2000, 1000);
|
||||||
|
CHECK_Z(cBlockSize);
|
||||||
|
cSize += cBlockSize;
|
||||||
|
|
||||||
|
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize));
|
||||||
|
|
||||||
|
ZSTD_freeCDict(cdict);
|
||||||
|
ZSTD_freeDCtx(dctx);
|
||||||
|
}
|
||||||
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
DISPLAYLEVEL(3, "test%3i : Building cdict w/ ZSTD_dct_fullDict on a good dictionary : ", testNb++);
|
DISPLAYLEVEL(3, "test%3i : Building cdict w/ ZSTD_dct_fullDict on a good dictionary : ", testNb++);
|
||||||
{ ZSTD_compressionParameters const cParams = ZSTD_getCParams(1, CNBuffSize, dictSize);
|
{ ZSTD_compressionParameters const cParams = ZSTD_getCParams(1, CNBuffSize, dictSize);
|
||||||
ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_fullDict, cParams, ZSTD_defaultCMem);
|
ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_fullDict, cParams, ZSTD_defaultCMem);
|
||||||
|
|||||||
Reference in New Issue
Block a user