|
|
|
@@ -235,7 +235,7 @@ size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel) {
|
|
|
|
|
RETURN_ERROR_IF(!cctxParams, GENERIC);
|
|
|
|
|
RETURN_ERROR_IF(!cctxParams, GENERIC, "NULL pointer!");
|
|
|
|
|
memset(cctxParams, 0, sizeof(*cctxParams));
|
|
|
|
|
cctxParams->compressionLevel = compressionLevel;
|
|
|
|
|
cctxParams->fParams.contentSizeFlag = 1;
|
|
|
|
@@ -244,8 +244,8 @@ size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel)
|
|
|
|
|
|
|
|
|
|
size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params)
|
|
|
|
|
{
|
|
|
|
|
RETURN_ERROR_IF(!cctxParams, GENERIC);
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkCParams(params.cParams) );
|
|
|
|
|
RETURN_ERROR_IF(!cctxParams, GENERIC, "NULL pointer!");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkCParams(params.cParams) , "");
|
|
|
|
|
memset(cctxParams, 0, sizeof(*cctxParams));
|
|
|
|
|
assert(!ZSTD_checkCParams(params.cParams));
|
|
|
|
|
cctxParams->cParams = params.cParams;
|
|
|
|
@@ -441,7 +441,7 @@ static size_t ZSTD_cParam_clampBounds(ZSTD_cParameter cParam, int* value)
|
|
|
|
|
|
|
|
|
|
#define BOUNDCHECK(cParam, val) { \
|
|
|
|
|
RETURN_ERROR_IF(!ZSTD_cParam_withinBounds(cParam,val), \
|
|
|
|
|
parameter_outOfBound); \
|
|
|
|
|
parameter_outOfBound, "Param out of bounds"); \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -489,7 +489,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value)
|
|
|
|
|
if (ZSTD_isUpdateAuthorized(param)) {
|
|
|
|
|
cctx->cParamsChanged = 1;
|
|
|
|
|
} else {
|
|
|
|
|
RETURN_ERROR(stage_wrong);
|
|
|
|
|
RETURN_ERROR(stage_wrong, "can only set params in ctx init stage");
|
|
|
|
|
} }
|
|
|
|
|
|
|
|
|
|
switch(param)
|
|
|
|
@@ -526,7 +526,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value)
|
|
|
|
|
case ZSTD_c_srcSizeHint:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default: RETURN_ERROR(parameter_unsupported);
|
|
|
|
|
default: RETURN_ERROR(parameter_unsupported, "unknown parameter");
|
|
|
|
|
}
|
|
|
|
|
return ZSTD_CCtxParams_setParameter(&cctx->requestedParams, param, value);
|
|
|
|
|
}
|
|
|
|
@@ -543,7 +543,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
|
|
|
|
|
return (size_t)CCtxParams->format;
|
|
|
|
|
|
|
|
|
|
case ZSTD_c_compressionLevel : {
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value), "");
|
|
|
|
|
if (value) { /* 0 : does not change current level */
|
|
|
|
|
CCtxParams->compressionLevel = value;
|
|
|
|
|
}
|
|
|
|
@@ -631,7 +631,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
|
|
|
|
|
RETURN_ERROR_IF(value!=0, parameter_unsupported, "not compiled with multithreading");
|
|
|
|
|
return 0;
|
|
|
|
|
#else
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value), "");
|
|
|
|
|
CCtxParams->nbWorkers = value;
|
|
|
|
|
return CCtxParams->nbWorkers;
|
|
|
|
|
#endif
|
|
|
|
@@ -644,7 +644,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
|
|
|
|
|
/* Adjust to the minimum non-default value. */
|
|
|
|
|
if (value != 0 && value < ZSTDMT_JOBSIZE_MIN)
|
|
|
|
|
value = ZSTDMT_JOBSIZE_MIN;
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value), "");
|
|
|
|
|
assert(value >= 0);
|
|
|
|
|
CCtxParams->jobSize = value;
|
|
|
|
|
return CCtxParams->jobSize;
|
|
|
|
@@ -655,7 +655,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
|
|
|
|
|
RETURN_ERROR_IF(value!=0, parameter_unsupported, "not compiled with multithreading");
|
|
|
|
|
return 0;
|
|
|
|
|
#else
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(ZSTD_c_overlapLog, &value));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(ZSTD_c_overlapLog, &value), "");
|
|
|
|
|
CCtxParams->overlapLog = value;
|
|
|
|
|
return CCtxParams->overlapLog;
|
|
|
|
|
#endif
|
|
|
|
@@ -665,7 +665,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
|
|
|
|
|
RETURN_ERROR_IF(value!=0, parameter_unsupported, "not compiled with multithreading");
|
|
|
|
|
return 0;
|
|
|
|
|
#else
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(ZSTD_c_overlapLog, &value));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(ZSTD_c_overlapLog, &value), "");
|
|
|
|
|
CCtxParams->rsyncable = value;
|
|
|
|
|
return CCtxParams->rsyncable;
|
|
|
|
|
#endif
|
|
|
|
@@ -694,7 +694,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
|
|
|
|
|
|
|
|
|
|
case ZSTD_c_ldmHashRateLog :
|
|
|
|
|
RETURN_ERROR_IF(value > ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN,
|
|
|
|
|
parameter_outOfBound);
|
|
|
|
|
parameter_outOfBound, "Param out of bounds!");
|
|
|
|
|
CCtxParams->ldmParams.hashRateLog = value;
|
|
|
|
|
return CCtxParams->ldmParams.hashRateLog;
|
|
|
|
|
|
|
|
|
@@ -834,8 +834,11 @@ size_t ZSTD_CCtx_setParametersUsingCCtxParams(
|
|
|
|
|
ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_CCtx_setParametersUsingCCtxParams");
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->cdict, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong,
|
|
|
|
|
"The context is in the wrong stage!");
|
|
|
|
|
RETURN_ERROR_IF(cctx->cdict, stage_wrong,
|
|
|
|
|
"Can't override parameters with cdict attached (some must "
|
|
|
|
|
"be inherited from the cdict).");
|
|
|
|
|
|
|
|
|
|
cctx->requestedParams = *params;
|
|
|
|
|
return 0;
|
|
|
|
@@ -844,7 +847,8 @@ size_t ZSTD_CCtx_setParametersUsingCCtxParams(
|
|
|
|
|
ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_CCtx_setPledgedSrcSize to %u bytes", (U32)pledgedSrcSize);
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong,
|
|
|
|
|
"Can't set pledgedSrcSize when not in init stage.");
|
|
|
|
|
cctx->pledgedSrcSizePlusOne = pledgedSrcSize+1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@@ -882,7 +886,7 @@ static size_t ZSTD_initLocalDict(ZSTD_CCtx* cctx)
|
|
|
|
|
dl->dictContentType,
|
|
|
|
|
cParams,
|
|
|
|
|
cctx->customMem);
|
|
|
|
|
RETURN_ERROR_IF(!dl->cdict, memory_allocation);
|
|
|
|
|
RETURN_ERROR_IF(!dl->cdict, memory_allocation, "ZSTD_createCDict_advanced failed");
|
|
|
|
|
cctx->cdict = dl->cdict;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@@ -891,7 +895,8 @@ size_t ZSTD_CCtx_loadDictionary_advanced(
|
|
|
|
|
ZSTD_CCtx* cctx, const void* dict, size_t dictSize,
|
|
|
|
|
ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType)
|
|
|
|
|
{
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong,
|
|
|
|
|
"Can't load a dictionary when ctx is not in init stage.");
|
|
|
|
|
RETURN_ERROR_IF(cctx->staticSize, memory_allocation,
|
|
|
|
|
"no malloc for static CCtx");
|
|
|
|
|
DEBUGLOG(4, "ZSTD_CCtx_loadDictionary_advanced (size: %u)", (U32)dictSize);
|
|
|
|
@@ -902,7 +907,7 @@ size_t ZSTD_CCtx_loadDictionary_advanced(
|
|
|
|
|
cctx->localDict.dict = dict;
|
|
|
|
|
} else {
|
|
|
|
|
void* dictBuffer = ZSTD_malloc(dictSize, cctx->customMem);
|
|
|
|
|
RETURN_ERROR_IF(!dictBuffer, memory_allocation);
|
|
|
|
|
RETURN_ERROR_IF(!dictBuffer, memory_allocation, "NULL pointer!");
|
|
|
|
|
memcpy(dictBuffer, dict, dictSize);
|
|
|
|
|
cctx->localDict.dictBuffer = dictBuffer;
|
|
|
|
|
cctx->localDict.dict = dictBuffer;
|
|
|
|
@@ -928,7 +933,8 @@ ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, s
|
|
|
|
|
|
|
|
|
|
size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict)
|
|
|
|
|
{
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong,
|
|
|
|
|
"Can't ref a dict when ctx not in init stage.");
|
|
|
|
|
/* Free the existing local cdict (if any) to save memory. */
|
|
|
|
|
ZSTD_clearAllDicts(cctx);
|
|
|
|
|
cctx->cdict = cdict;
|
|
|
|
@@ -943,7 +949,8 @@ size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSiz
|
|
|
|
|
size_t ZSTD_CCtx_refPrefix_advanced(
|
|
|
|
|
ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType)
|
|
|
|
|
{
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong,
|
|
|
|
|
"Can't ref a prefix when ctx not in init stage.");
|
|
|
|
|
ZSTD_clearAllDicts(cctx);
|
|
|
|
|
if (prefix != NULL && prefixSize > 0) {
|
|
|
|
|
cctx->prefixDict.dict = prefix;
|
|
|
|
@@ -964,7 +971,8 @@ size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset)
|
|
|
|
|
}
|
|
|
|
|
if ( (reset == ZSTD_reset_parameters)
|
|
|
|
|
|| (reset == ZSTD_reset_session_and_parameters) ) {
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong,
|
|
|
|
|
"Can't reset parameters only when not in init stage.");
|
|
|
|
|
ZSTD_clearAllDicts(cctx);
|
|
|
|
|
return ZSTD_CCtxParams_reset(&cctx->requestedParams);
|
|
|
|
|
}
|
|
|
|
@@ -1474,7 +1482,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
|
|
|
needsIndexReset = ZSTDirp_reset;
|
|
|
|
|
|
|
|
|
|
ZSTD_cwksp_free(ws, zc->customMem);
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cwksp_create(ws, neededSpace, zc->customMem));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_cwksp_create(ws, neededSpace, zc->customMem), "");
|
|
|
|
|
|
|
|
|
|
DEBUGLOG(5, "reserving object space");
|
|
|
|
|
/* Statically sized space.
|
|
|
|
@@ -1545,7 +1553,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
|
|
|
¶ms.cParams,
|
|
|
|
|
crp,
|
|
|
|
|
needsIndexReset,
|
|
|
|
|
ZSTD_resetTarget_CCtx));
|
|
|
|
|
ZSTD_resetTarget_CCtx), "");
|
|
|
|
|
|
|
|
|
|
/* ldm hash table */
|
|
|
|
|
if (params.ldmParams.enableLdm) {
|
|
|
|
@@ -1623,7 +1631,7 @@ ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx,
|
|
|
|
|
params.cParams = ZSTD_adjustCParams_internal(*cdict_cParams, pledgedSrcSize, 0);
|
|
|
|
|
params.cParams.windowLog = windowLog;
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
|
|
|
|
|
ZSTDcrp_makeClean, zbuff));
|
|
|
|
|
ZSTDcrp_makeClean, zbuff), "");
|
|
|
|
|
assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1672,7 +1680,7 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx,
|
|
|
|
|
params.cParams = *cdict_cParams;
|
|
|
|
|
params.cParams.windowLog = windowLog;
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
|
|
|
|
|
ZSTDcrp_leaveDirty, zbuff));
|
|
|
|
|
ZSTDcrp_leaveDirty, zbuff), "");
|
|
|
|
|
assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
|
|
|
|
|
assert(cctx->appliedParams.cParams.hashLog == cdict_cParams->hashLog);
|
|
|
|
|
assert(cctx->appliedParams.cParams.chainLog == cdict_cParams->chainLog);
|
|
|
|
@@ -1753,7 +1761,8 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx,
|
|
|
|
|
ZSTD_buffered_policy_e zbuff)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(5, "ZSTD_copyCCtx_internal");
|
|
|
|
|
RETURN_ERROR_IF(srcCCtx->stage!=ZSTDcs_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(srcCCtx->stage!=ZSTDcs_init, stage_wrong,
|
|
|
|
|
"Can't copy a ctx that's not in init stage.");
|
|
|
|
|
|
|
|
|
|
memcpy(&dstCCtx->customMem, &srcCCtx->customMem, sizeof(ZSTD_customMem));
|
|
|
|
|
{ ZSTD_CCtx_params params = dstCCtx->requestedParams;
|
|
|
|
@@ -1981,14 +1990,14 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
|
|
|
literals, litSize,
|
|
|
|
|
entropyWorkspace, entropyWkspSize,
|
|
|
|
|
bmi2);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressLiterals failed");
|
|
|
|
|
assert(cSize <= dstCapacity);
|
|
|
|
|
op += cSize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Sequences Header */
|
|
|
|
|
RETURN_ERROR_IF((oend-op) < 3 /*max nbSeq Size*/ + 1 /*seqHead*/,
|
|
|
|
|
dstSize_tooSmall);
|
|
|
|
|
dstSize_tooSmall, "Can't fit seq hdr in output buf!");
|
|
|
|
|
if (nbSeq < 128) {
|
|
|
|
|
*op++ = (BYTE)nbSeq;
|
|
|
|
|
} else if (nbSeq < LONGNBSEQ) {
|
|
|
|
@@ -2033,7 +2042,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
|
|
|
prevEntropy->fse.litlengthCTable,
|
|
|
|
|
sizeof(prevEntropy->fse.litlengthCTable),
|
|
|
|
|
entropyWorkspace, entropyWkspSize);
|
|
|
|
|
FORWARD_IF_ERROR(countSize);
|
|
|
|
|
FORWARD_IF_ERROR(countSize, "ZSTD_buildCTable for LitLens failed");
|
|
|
|
|
if (LLtype == set_compressed)
|
|
|
|
|
lastNCount = op;
|
|
|
|
|
op += countSize;
|
|
|
|
@@ -2061,7 +2070,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
|
|
|
prevEntropy->fse.offcodeCTable,
|
|
|
|
|
sizeof(prevEntropy->fse.offcodeCTable),
|
|
|
|
|
entropyWorkspace, entropyWkspSize);
|
|
|
|
|
FORWARD_IF_ERROR(countSize);
|
|
|
|
|
FORWARD_IF_ERROR(countSize, "ZSTD_buildCTable for Offsets failed");
|
|
|
|
|
if (Offtype == set_compressed)
|
|
|
|
|
lastNCount = op;
|
|
|
|
|
op += countSize;
|
|
|
|
@@ -2087,7 +2096,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
|
|
|
prevEntropy->fse.matchlengthCTable,
|
|
|
|
|
sizeof(prevEntropy->fse.matchlengthCTable),
|
|
|
|
|
entropyWorkspace, entropyWkspSize);
|
|
|
|
|
FORWARD_IF_ERROR(countSize);
|
|
|
|
|
FORWARD_IF_ERROR(countSize, "ZSTD_buildCTable for MatchLengths failed");
|
|
|
|
|
if (MLtype == set_compressed)
|
|
|
|
|
lastNCount = op;
|
|
|
|
|
op += countSize;
|
|
|
|
@@ -2103,7 +2112,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
|
|
|
CTable_LitLength, llCodeTable,
|
|
|
|
|
sequences, nbSeq,
|
|
|
|
|
longOffsets, bmi2);
|
|
|
|
|
FORWARD_IF_ERROR(bitstreamSize);
|
|
|
|
|
FORWARD_IF_ERROR(bitstreamSize, "ZSTD_encodeSequences failed");
|
|
|
|
|
op += bitstreamSize;
|
|
|
|
|
assert(op <= oend);
|
|
|
|
|
/* zstd versions <= 1.3.4 mistakenly report corruption when
|
|
|
|
@@ -2147,7 +2156,7 @@ ZSTD_compressSequences(seqStore_t* seqStorePtr,
|
|
|
|
|
*/
|
|
|
|
|
if ((cSize == ERROR(dstSize_tooSmall)) & (srcSize <= dstCapacity))
|
|
|
|
|
return 0; /* block not compressed */
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressSequences_internal failed");
|
|
|
|
|
|
|
|
|
|
/* Check compressibility */
|
|
|
|
|
{ size_t const maxCSize = srcSize - ZSTD_minGain(srcSize, cctxParams->cParams.strategy);
|
|
|
|
@@ -2273,7 +2282,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize)
|
|
|
|
|
/* Updates ldmSeqStore.size */
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_ldm_generateSequences(&zc->ldmState, &ldmSeqStore,
|
|
|
|
|
&zc->appliedParams.ldmParams,
|
|
|
|
|
src, srcSize));
|
|
|
|
|
src, srcSize), "");
|
|
|
|
|
/* Updates ldmSeqStore.pos */
|
|
|
|
|
lastLLSize =
|
|
|
|
|
ZSTD_ldm_blockCompress(&ldmSeqStore,
|
|
|
|
@@ -2349,7 +2358,7 @@ size_t ZSTD_getSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs,
|
|
|
|
|
void* dst = ZSTD_malloc(dstCapacity, ZSTD_defaultCMem);
|
|
|
|
|
SeqCollector seqCollector;
|
|
|
|
|
|
|
|
|
|
RETURN_ERROR_IF(dst == NULL, memory_allocation);
|
|
|
|
|
RETURN_ERROR_IF(dst == NULL, memory_allocation, "NULL pointer!");
|
|
|
|
|
|
|
|
|
|
seqCollector.collectSequences = 1;
|
|
|
|
|
seqCollector.seqStart = outSeqs;
|
|
|
|
@@ -2408,7 +2417,7 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
|
|
|
|
(unsigned)zc->blockState.matchState.nextToUpdate);
|
|
|
|
|
|
|
|
|
|
{ const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize);
|
|
|
|
|
FORWARD_IF_ERROR(bss);
|
|
|
|
|
FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed");
|
|
|
|
|
if (bss == ZSTDbss_noCompress) { cSize = 0; goto out; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -2492,7 +2501,7 @@ static size_t ZSTD_compressBlock_targetCBlockSize_body(ZSTD_CCtx* zc,
|
|
|
|
|
size_t const cSize = ZSTD_compressSuperBlock(zc, dst, dstCapacity, src, srcSize, lastBlock);
|
|
|
|
|
if (cSize != ERROR(dstSize_tooSmall)) {
|
|
|
|
|
size_t const maxCSize = srcSize - ZSTD_minGain(srcSize, zc->appliedParams.cParams.strategy);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressSuperBlock failed");
|
|
|
|
|
if (cSize != 0 && cSize < maxCSize + ZSTD_blockHeaderSize) {
|
|
|
|
|
ZSTD_confirmRepcodesAndEntropyTables(zc);
|
|
|
|
|
return cSize;
|
|
|
|
@@ -2517,10 +2526,10 @@ static size_t ZSTD_compressBlock_targetCBlockSize(ZSTD_CCtx* zc,
|
|
|
|
|
const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize);
|
|
|
|
|
DEBUGLOG(5, "ZSTD_compressBlock_targetCBlockSize (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u, srcSize=%zu)",
|
|
|
|
|
(unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, (unsigned)zc->blockState.matchState.nextToUpdate, srcSize);
|
|
|
|
|
FORWARD_IF_ERROR(bss);
|
|
|
|
|
FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed");
|
|
|
|
|
|
|
|
|
|
cSize = ZSTD_compressBlock_targetCBlockSize_body(zc, dst, dstCapacity, src, srcSize, bss, lastBlock);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressBlock_targetCBlockSize_body failed");
|
|
|
|
|
|
|
|
|
|
if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid)
|
|
|
|
|
zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check;
|
|
|
|
@@ -2596,18 +2605,18 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
|
|
|
|
|
{ size_t cSize;
|
|
|
|
|
if (ZSTD_useTargetCBlockSize(&cctx->appliedParams)) {
|
|
|
|
|
cSize = ZSTD_compressBlock_targetCBlockSize(cctx, op, dstCapacity, ip, blockSize, lastBlock);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressBlock_targetCBlockSize failed");
|
|
|
|
|
assert(cSize > 0);
|
|
|
|
|
assert(cSize <= blockSize + ZSTD_blockHeaderSize);
|
|
|
|
|
} else {
|
|
|
|
|
cSize = ZSTD_compressBlock_internal(cctx,
|
|
|
|
|
op+ZSTD_blockHeaderSize, dstCapacity-ZSTD_blockHeaderSize,
|
|
|
|
|
ip, blockSize, 1 /* frame */);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressBlock_internal failed");
|
|
|
|
|
|
|
|
|
|
if (cSize == 0) { /* block is not compressible */
|
|
|
|
|
cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_noCompressBlock failed");
|
|
|
|
|
} else {
|
|
|
|
|
U32 const cBlockHeader = cSize == 1 ?
|
|
|
|
|
lastBlock + (((U32)bt_rle)<<1) + (U32)(blockSize << 3) :
|
|
|
|
@@ -2649,7 +2658,8 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
|
|
|
|
|
size_t pos=0;
|
|
|
|
|
|
|
|
|
|
assert(!(params->fParams.contentSizeFlag && pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN));
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity < ZSTD_FRAMEHEADERSIZE_MAX, dstSize_tooSmall);
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity < ZSTD_FRAMEHEADERSIZE_MAX, dstSize_tooSmall,
|
|
|
|
|
"dst buf is too small to fit worst-case frame header size.");
|
|
|
|
|
DEBUGLOG(4, "ZSTD_writeFrameHeader : dictIDFlag : %u ; dictID : %u ; dictIDSizeCode : %u",
|
|
|
|
|
!params->fParams.noDictIDFlag, (unsigned)dictID, (unsigned)dictIDSizeCode);
|
|
|
|
|
|
|
|
|
@@ -2685,7 +2695,8 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
|
|
|
|
|
*/
|
|
|
|
|
size_t ZSTD_writeLastEmptyBlock(void* dst, size_t dstCapacity)
|
|
|
|
|
{
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall);
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall,
|
|
|
|
|
"dst buf is too small to write frame trailer empty block.");
|
|
|
|
|
{ U32 const cBlockHeader24 = 1 /*lastBlock*/ + (((U32)bt_raw)<<1); /* 0 size */
|
|
|
|
|
MEM_writeLE24(dst, cBlockHeader24);
|
|
|
|
|
return ZSTD_blockHeaderSize;
|
|
|
|
@@ -2694,9 +2705,11 @@ size_t ZSTD_writeLastEmptyBlock(void* dst, size_t dstCapacity)
|
|
|
|
|
|
|
|
|
|
size_t ZSTD_referenceExternalSequences(ZSTD_CCtx* cctx, rawSeq* seq, size_t nbSeq)
|
|
|
|
|
{
|
|
|
|
|
RETURN_ERROR_IF(cctx->stage != ZSTDcs_init, stage_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cctx->stage != ZSTDcs_init, stage_wrong,
|
|
|
|
|
"wrong cctx stage");
|
|
|
|
|
RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm,
|
|
|
|
|
parameter_unsupported);
|
|
|
|
|
parameter_unsupported,
|
|
|
|
|
"incompatible with ldm");
|
|
|
|
|
cctx->externSeqStore.seq = seq;
|
|
|
|
|
cctx->externSeqStore.size = nbSeq;
|
|
|
|
|
cctx->externSeqStore.capacity = nbSeq;
|
|
|
|
@@ -2721,7 +2734,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|
|
|
|
if (frame && (cctx->stage==ZSTDcs_init)) {
|
|
|
|
|
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, &cctx->appliedParams,
|
|
|
|
|
cctx->pledgedSrcSizePlusOne-1, cctx->dictID);
|
|
|
|
|
FORWARD_IF_ERROR(fhSize);
|
|
|
|
|
FORWARD_IF_ERROR(fhSize, "ZSTD_writeFrameHeader failed");
|
|
|
|
|
assert(fhSize <= dstCapacity);
|
|
|
|
|
dstCapacity -= fhSize;
|
|
|
|
|
dst = (char*)dst + fhSize;
|
|
|
|
@@ -2748,7 +2761,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|
|
|
|
{ size_t const cSize = frame ?
|
|
|
|
|
ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) :
|
|
|
|
|
ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize, 0 /* frame */);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, frame ? "ZSTD_compress_frameChunk failed" : "ZSTD_compressBlock_internal failed");
|
|
|
|
|
cctx->consumedSrcSize += srcSize;
|
|
|
|
|
cctx->producedCSize += (cSize + fhSize);
|
|
|
|
|
assert(!(cctx->appliedParams.fParams.contentSizeFlag && cctx->pledgedSrcSizePlusOne == 0));
|
|
|
|
@@ -2785,7 +2798,7 @@ size_t ZSTD_compressBlock(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(5, "ZSTD_compressBlock: srcSize = %u", (unsigned)srcSize);
|
|
|
|
|
{ size_t const blockSizeMax = ZSTD_getBlockSize(cctx);
|
|
|
|
|
RETURN_ERROR_IF(srcSize > blockSizeMax, srcSize_wrong); }
|
|
|
|
|
RETURN_ERROR_IF(srcSize > blockSizeMax, srcSize_wrong, "input is larger than a block"); }
|
|
|
|
|
|
|
|
|
|
return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 0 /* frame mode */, 0 /* last chunk */);
|
|
|
|
|
}
|
|
|
|
@@ -2868,9 +2881,9 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
|
|
|
|
|
NOTE: This behavior is not standard and could be improved in the future. */
|
|
|
|
|
static size_t ZSTD_checkDictNCount(short* normalizedCounter, unsigned dictMaxSymbolValue, unsigned maxSymbolValue) {
|
|
|
|
|
U32 s;
|
|
|
|
|
RETURN_ERROR_IF(dictMaxSymbolValue < maxSymbolValue, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(dictMaxSymbolValue < maxSymbolValue, dictionary_corrupted, "dict fse tables don't have all symbols");
|
|
|
|
|
for (s = 0; s <= maxSymbolValue; ++s) {
|
|
|
|
|
RETURN_ERROR_IF(normalizedCounter[s] == 0, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(normalizedCounter[s] == 0, dictionary_corrupted, "dict fse tables don't have all symbols");
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@@ -2894,56 +2907,56 @@ size_t ZSTD_loadCEntropy(ZSTD_compressedBlockState_t* bs, void* workspace,
|
|
|
|
|
if (!hasZeroWeights)
|
|
|
|
|
bs->entropy.huf.repeatMode = HUF_repeat_valid;
|
|
|
|
|
|
|
|
|
|
RETURN_ERROR_IF(HUF_isError(hufHeaderSize), dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(maxSymbolValue < 255, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(HUF_isError(hufHeaderSize), dictionary_corrupted, "");
|
|
|
|
|
RETURN_ERROR_IF(maxSymbolValue < 255, dictionary_corrupted, "");
|
|
|
|
|
dictPtr += hufHeaderSize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{ unsigned offcodeLog;
|
|
|
|
|
size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, offcodeMaxValue, &offcodeLog, dictPtr, dictEnd-dictPtr);
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(offcodeHeaderSize), dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(offcodeLog > OffFSELog, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(offcodeHeaderSize), dictionary_corrupted, "");
|
|
|
|
|
RETURN_ERROR_IF(offcodeLog > OffFSELog, dictionary_corrupted, "");
|
|
|
|
|
/* Defer checking offcodeMaxValue because we need to know the size of the dictionary content */
|
|
|
|
|
/* fill all offset symbols to avoid garbage at end of table */
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(FSE_buildCTable_wksp(
|
|
|
|
|
bs->entropy.fse.offcodeCTable,
|
|
|
|
|
offcodeNCount, MaxOff, offcodeLog,
|
|
|
|
|
workspace, HUF_WORKSPACE_SIZE)),
|
|
|
|
|
dictionary_corrupted);
|
|
|
|
|
dictionary_corrupted, "");
|
|
|
|
|
dictPtr += offcodeHeaderSize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{ short matchlengthNCount[MaxML+1];
|
|
|
|
|
unsigned matchlengthMaxValue = MaxML, matchlengthLog;
|
|
|
|
|
size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd-dictPtr);
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(matchlengthHeaderSize), dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(matchlengthLog > MLFSELog, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(matchlengthHeaderSize), dictionary_corrupted, "");
|
|
|
|
|
RETURN_ERROR_IF(matchlengthLog > MLFSELog, dictionary_corrupted, "");
|
|
|
|
|
/* Every match length code must have non-zero probability */
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkDictNCount(matchlengthNCount, matchlengthMaxValue, MaxML));
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkDictNCount(matchlengthNCount, matchlengthMaxValue, MaxML), "");
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(FSE_buildCTable_wksp(
|
|
|
|
|
bs->entropy.fse.matchlengthCTable,
|
|
|
|
|
matchlengthNCount, matchlengthMaxValue, matchlengthLog,
|
|
|
|
|
workspace, HUF_WORKSPACE_SIZE)),
|
|
|
|
|
dictionary_corrupted);
|
|
|
|
|
dictionary_corrupted, "");
|
|
|
|
|
dictPtr += matchlengthHeaderSize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{ short litlengthNCount[MaxLL+1];
|
|
|
|
|
unsigned litlengthMaxValue = MaxLL, litlengthLog;
|
|
|
|
|
size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd-dictPtr);
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(litlengthHeaderSize), dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(litlengthLog > LLFSELog, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(litlengthHeaderSize), dictionary_corrupted, "");
|
|
|
|
|
RETURN_ERROR_IF(litlengthLog > LLFSELog, dictionary_corrupted, "");
|
|
|
|
|
/* Every literal length code must have non-zero probability */
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkDictNCount(litlengthNCount, litlengthMaxValue, MaxLL));
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkDictNCount(litlengthNCount, litlengthMaxValue, MaxLL), "");
|
|
|
|
|
RETURN_ERROR_IF(FSE_isError(FSE_buildCTable_wksp(
|
|
|
|
|
bs->entropy.fse.litlengthCTable,
|
|
|
|
|
litlengthNCount, litlengthMaxValue, litlengthLog,
|
|
|
|
|
workspace, HUF_WORKSPACE_SIZE)),
|
|
|
|
|
dictionary_corrupted);
|
|
|
|
|
dictionary_corrupted, "");
|
|
|
|
|
dictPtr += litlengthHeaderSize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RETURN_ERROR_IF(dictPtr+12 > dictEnd, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(dictPtr+12 > dictEnd, dictionary_corrupted, "");
|
|
|
|
|
bs->rep[0] = MEM_readLE32(dictPtr+0);
|
|
|
|
|
bs->rep[1] = MEM_readLE32(dictPtr+4);
|
|
|
|
|
bs->rep[2] = MEM_readLE32(dictPtr+8);
|
|
|
|
@@ -2982,7 +2995,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs,
|
|
|
|
|
|
|
|
|
|
dictID = params->fParams.noDictIDFlag ? 0 : MEM_readLE32(dictPtr + 4 /* skip magic number */ );
|
|
|
|
|
eSize = ZSTD_loadCEntropy(bs, workspace, offcodeNCount, &offcodeMaxValue, dict, dictSize);
|
|
|
|
|
FORWARD_IF_ERROR(eSize);
|
|
|
|
|
FORWARD_IF_ERROR(eSize, "ZSTD_loadCEntropy failed");
|
|
|
|
|
dictPtr += eSize;
|
|
|
|
|
|
|
|
|
|
{ size_t const dictContentSize = (size_t)(dictEnd - dictPtr);
|
|
|
|
@@ -2992,19 +3005,19 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs,
|
|
|
|
|
offcodeMax = ZSTD_highbit32(maxOffset); /* Calculate minimum offset code required to represent maxOffset */
|
|
|
|
|
}
|
|
|
|
|
/* All offset values <= dictContentSize + 128 KB must be representable */
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_checkDictNCount(offcodeNCount, offcodeMaxValue, MIN(offcodeMax, MaxOff)));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_checkDictNCount(offcodeNCount, offcodeMaxValue, MIN(offcodeMax, MaxOff)), "");
|
|
|
|
|
/* All repCodes must be <= dictContentSize and != 0*/
|
|
|
|
|
{ U32 u;
|
|
|
|
|
for (u=0; u<3; u++) {
|
|
|
|
|
RETURN_ERROR_IF(bs->rep[u] == 0, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(bs->rep[u] > dictContentSize, dictionary_corrupted);
|
|
|
|
|
RETURN_ERROR_IF(bs->rep[u] == 0, dictionary_corrupted, "");
|
|
|
|
|
RETURN_ERROR_IF(bs->rep[u] > dictContentSize, dictionary_corrupted, "");
|
|
|
|
|
} }
|
|
|
|
|
|
|
|
|
|
bs->entropy.fse.offcode_repeatMode = FSE_repeat_valid;
|
|
|
|
|
bs->entropy.fse.matchlength_repeatMode = FSE_repeat_valid;
|
|
|
|
|
bs->entropy.fse.litlength_repeatMode = FSE_repeat_valid;
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_loadDictionaryContent(
|
|
|
|
|
ms, NULL, ws, params, dictPtr, dictContentSize, dtlm));
|
|
|
|
|
ms, NULL, ws, params, dictPtr, dictContentSize, dtlm), "");
|
|
|
|
|
return dictID;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@@ -3024,7 +3037,7 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs,
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compress_insertDictionary (dictSize=%u)", (U32)dictSize);
|
|
|
|
|
if ((dict==NULL) || (dictSize<8)) {
|
|
|
|
|
RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong);
|
|
|
|
|
RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong, "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3040,7 +3053,7 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs,
|
|
|
|
|
return ZSTD_loadDictionaryContent(
|
|
|
|
|
ms, ls, ws, params, dict, dictSize, dtlm);
|
|
|
|
|
}
|
|
|
|
|
RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong);
|
|
|
|
|
RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong, "");
|
|
|
|
|
assert(0); /* impossible */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3077,7 +3090,7 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_resetCCtx_internal(cctx, *params, pledgedSrcSize,
|
|
|
|
|
ZSTDcrp_makeClean, zbuff) );
|
|
|
|
|
ZSTDcrp_makeClean, zbuff) , "");
|
|
|
|
|
{ size_t const dictID = cdict ?
|
|
|
|
|
ZSTD_compress_insertDictionary(
|
|
|
|
|
cctx->blockState.prevCBlock, &cctx->blockState.matchState,
|
|
|
|
@@ -3088,7 +3101,7 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
|
|
|
|
|
cctx->blockState.prevCBlock, &cctx->blockState.matchState,
|
|
|
|
|
&cctx->ldmState, &cctx->workspace, &cctx->appliedParams, dict, dictSize,
|
|
|
|
|
dictContentType, dtlm, cctx->entropyWorkspace);
|
|
|
|
|
FORWARD_IF_ERROR(dictID);
|
|
|
|
|
FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed");
|
|
|
|
|
assert(dictID <= UINT_MAX);
|
|
|
|
|
cctx->dictID = (U32)dictID;
|
|
|
|
|
}
|
|
|
|
@@ -3105,7 +3118,7 @@ size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx,
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compressBegin_advanced_internal: wlog=%u", params->cParams.windowLog);
|
|
|
|
|
/* compression parameters verification and optimization */
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkCParams(params->cParams) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkCParams(params->cParams) , "");
|
|
|
|
|
return ZSTD_compressBegin_internal(cctx,
|
|
|
|
|
dict, dictSize, dictContentType, dtlm,
|
|
|
|
|
cdict,
|
|
|
|
@@ -3158,7 +3171,7 @@ static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
|
|
|
|
|
/* special case : empty frame */
|
|
|
|
|
if (cctx->stage == ZSTDcs_init) {
|
|
|
|
|
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, &cctx->appliedParams, 0, 0);
|
|
|
|
|
FORWARD_IF_ERROR(fhSize);
|
|
|
|
|
FORWARD_IF_ERROR(fhSize, "ZSTD_writeFrameHeader failed");
|
|
|
|
|
dstCapacity -= fhSize;
|
|
|
|
|
op += fhSize;
|
|
|
|
|
cctx->stage = ZSTDcs_ongoing;
|
|
|
|
@@ -3167,7 +3180,7 @@ static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
|
|
|
|
|
if (cctx->stage != ZSTDcs_ending) {
|
|
|
|
|
/* write one last empty block, make it the "last" block */
|
|
|
|
|
U32 const cBlockHeader24 = 1 /* last block */ + (((U32)bt_raw)<<1) + 0;
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall);
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall, "no room for epilogue");
|
|
|
|
|
MEM_writeLE32(op, cBlockHeader24);
|
|
|
|
|
op += ZSTD_blockHeaderSize;
|
|
|
|
|
dstCapacity -= ZSTD_blockHeaderSize;
|
|
|
|
@@ -3175,7 +3188,7 @@ static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
|
|
|
|
|
|
|
|
|
|
if (cctx->appliedParams.fParams.checksumFlag) {
|
|
|
|
|
U32 const checksum = (U32) XXH64_digest(&cctx->xxhState);
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall);
|
|
|
|
|
RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall, "no room for checksum");
|
|
|
|
|
DEBUGLOG(4, "ZSTD_writeEpilogue: write checksum : %08X", (unsigned)checksum);
|
|
|
|
|
MEM_writeLE32(op, checksum);
|
|
|
|
|
op += 4;
|
|
|
|
@@ -3193,9 +3206,9 @@ size_t ZSTD_compressEnd (ZSTD_CCtx* cctx,
|
|
|
|
|
size_t const cSize = ZSTD_compressContinue_internal(cctx,
|
|
|
|
|
dst, dstCapacity, src, srcSize,
|
|
|
|
|
1 /* frame mode */, 1 /* last chunk */);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressContinue_internal failed");
|
|
|
|
|
endResult = ZSTD_writeEpilogue(cctx, (char*)dst + cSize, dstCapacity-cSize);
|
|
|
|
|
FORWARD_IF_ERROR(endResult);
|
|
|
|
|
FORWARD_IF_ERROR(endResult, "ZSTD_writeEpilogue failed");
|
|
|
|
|
assert(!(cctx->appliedParams.fParams.contentSizeFlag && cctx->pledgedSrcSizePlusOne == 0));
|
|
|
|
|
if (cctx->pledgedSrcSizePlusOne != 0) { /* control src size */
|
|
|
|
|
ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN == (unsigned long long)-1);
|
|
|
|
@@ -3234,7 +3247,7 @@ size_t ZSTD_compress_advanced (ZSTD_CCtx* cctx,
|
|
|
|
|
ZSTD_parameters params)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compress_advanced");
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams));
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams), "");
|
|
|
|
|
return ZSTD_compress_internal(cctx,
|
|
|
|
|
dst, dstCapacity,
|
|
|
|
|
src, srcSize,
|
|
|
|
@@ -3253,7 +3266,7 @@ size_t ZSTD_compress_advanced_internal(
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compress_advanced_internal (srcSize:%u)", (unsigned)srcSize);
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_compressBegin_internal(cctx,
|
|
|
|
|
dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, NULL,
|
|
|
|
|
params, srcSize, ZSTDb_not_buffered) );
|
|
|
|
|
params, srcSize, ZSTDb_not_buffered) , "");
|
|
|
|
|
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3337,7 +3350,7 @@ static size_t ZSTD_initCDict_internal(
|
|
|
|
|
cdict->dictContent = dictBuffer;
|
|
|
|
|
} else {
|
|
|
|
|
void *internalBuffer = ZSTD_cwksp_reserve_object(&cdict->workspace, ZSTD_cwksp_align(dictSize, sizeof(void*)));
|
|
|
|
|
RETURN_ERROR_IF(!internalBuffer, memory_allocation);
|
|
|
|
|
RETURN_ERROR_IF(!internalBuffer, memory_allocation, "NULL pointer!");
|
|
|
|
|
cdict->dictContent = internalBuffer;
|
|
|
|
|
memcpy(internalBuffer, dictBuffer, dictSize);
|
|
|
|
|
}
|
|
|
|
@@ -3354,7 +3367,7 @@ static size_t ZSTD_initCDict_internal(
|
|
|
|
|
&cParams,
|
|
|
|
|
ZSTDcrp_makeClean,
|
|
|
|
|
ZSTDirp_reset,
|
|
|
|
|
ZSTD_resetTarget_CDict));
|
|
|
|
|
ZSTD_resetTarget_CDict), "");
|
|
|
|
|
/* (Maybe) load the dictionary
|
|
|
|
|
* Skips loading the dictionary if it is < 8 bytes.
|
|
|
|
|
*/
|
|
|
|
@@ -3367,7 +3380,7 @@ static size_t ZSTD_initCDict_internal(
|
|
|
|
|
&cdict->cBlockState, &cdict->matchState, NULL, &cdict->workspace,
|
|
|
|
|
¶ms, cdict->dictContent, cdict->dictContentSize,
|
|
|
|
|
dictContentType, ZSTD_dtlm_full, cdict->entropyWorkspace);
|
|
|
|
|
FORWARD_IF_ERROR(dictID);
|
|
|
|
|
FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed");
|
|
|
|
|
assert(dictID <= (size_t)(U32)-1);
|
|
|
|
|
cdict->dictID = (U32)dictID;
|
|
|
|
|
}
|
|
|
|
@@ -3515,7 +3528,7 @@ size_t ZSTD_compressBegin_usingCDict_advanced(
|
|
|
|
|
ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compressBegin_usingCDict_advanced");
|
|
|
|
|
RETURN_ERROR_IF(cdict==NULL, dictionary_wrong);
|
|
|
|
|
RETURN_ERROR_IF(cdict==NULL, dictionary_wrong, "NULL pointer!");
|
|
|
|
|
{ ZSTD_CCtx_params params = cctx->requestedParams;
|
|
|
|
|
params.cParams = ( pledgedSrcSize < ZSTD_USE_CDICT_PARAMS_SRCSIZE_CUTOFF
|
|
|
|
|
|| pledgedSrcSize < cdict->dictContentSize * ZSTD_USE_CDICT_PARAMS_DICTSIZE_MULTIPLIER
|
|
|
|
@@ -3559,7 +3572,7 @@ size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
|
|
|
|
|
const void* src, size_t srcSize,
|
|
|
|
|
const ZSTD_CDict* cdict, ZSTD_frameParameters fParams)
|
|
|
|
|
{
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, srcSize)); /* will check if cdict != NULL */
|
|
|
|
|
FORWARD_IF_ERROR(ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, srcSize), ""); /* will check if cdict != NULL */
|
|
|
|
|
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3631,7 +3644,7 @@ static size_t ZSTD_resetCStream_internal(ZSTD_CStream* cctx,
|
|
|
|
|
dict, dictSize, dictContentType, ZSTD_dtlm_fast,
|
|
|
|
|
cdict,
|
|
|
|
|
¶ms, pledgedSrcSize,
|
|
|
|
|
ZSTDb_buffered) );
|
|
|
|
|
ZSTDb_buffered) , "");
|
|
|
|
|
|
|
|
|
|
cctx->inToCompress = 0;
|
|
|
|
|
cctx->inBuffPos = 0;
|
|
|
|
@@ -3653,8 +3666,8 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pss)
|
|
|
|
|
*/
|
|
|
|
|
U64 const pledgedSrcSize = (pss==0) ? ZSTD_CONTENTSIZE_UNKNOWN : pss;
|
|
|
|
|
DEBUGLOG(4, "ZSTD_resetCStream: pledgedSrcSize = %u", (unsigned)pledgedSrcSize);
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3668,16 +3681,16 @@ size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs,
|
|
|
|
|
unsigned long long pledgedSrcSize)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_initCStream_internal");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , "");
|
|
|
|
|
assert(!ZSTD_isError(ZSTD_checkCParams(params->cParams)));
|
|
|
|
|
zcs->requestedParams = *params;
|
|
|
|
|
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
|
|
|
|
|
if (dict) {
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) , "");
|
|
|
|
|
} else {
|
|
|
|
|
/* Dictionary is cleared if !cdict */
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) , "");
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@@ -3690,10 +3703,10 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
|
|
|
|
|
unsigned long long pledgedSrcSize)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_initCStream_usingCDict_advanced");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , "");
|
|
|
|
|
zcs->requestedParams.fParams = fParams;
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) , "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3701,8 +3714,8 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
|
|
|
|
|
size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_initCStream_usingCDict");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) , "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3721,20 +3734,20 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
|
|
|
|
|
*/
|
|
|
|
|
U64 const pledgedSrcSize = (pss==0 && params.fParams.contentSizeFlag==0) ? ZSTD_CONTENTSIZE_UNKNOWN : pss;
|
|
|
|
|
DEBUGLOG(4, "ZSTD_initCStream_advanced");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkCParams(params.cParams) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_checkCParams(params.cParams) , "");
|
|
|
|
|
zcs->requestedParams = ZSTD_assignParamsToCCtxParams(&zcs->requestedParams, ¶ms);
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) , "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_initCStream_usingDict");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) , "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3746,19 +3759,19 @@ size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigne
|
|
|
|
|
*/
|
|
|
|
|
U64 const pledgedSrcSize = (pss==0) ? ZSTD_CONTENTSIZE_UNKNOWN : pss;
|
|
|
|
|
DEBUGLOG(4, "ZSTD_initCStream_srcSize");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, NULL) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, NULL) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel)
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(4, "ZSTD_initCStream");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, NULL) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, NULL) , "");
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) , "");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3811,7 +3824,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
|
|
|
|
|
size_t const cSize = ZSTD_compressEnd(zcs,
|
|
|
|
|
op, oend-op, ip, iend-ip);
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compressEnd : cSize=%u", (unsigned)cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, "ZSTD_compressEnd failed");
|
|
|
|
|
ip = iend;
|
|
|
|
|
op += cSize;
|
|
|
|
|
zcs->frameEnded = 1;
|
|
|
|
@@ -3853,7 +3866,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
|
|
|
|
|
zcs->inBuff + zcs->inToCompress, iSize) :
|
|
|
|
|
ZSTD_compressContinue(zcs, cDst, oSize,
|
|
|
|
|
zcs->inBuff + zcs->inToCompress, iSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize);
|
|
|
|
|
FORWARD_IF_ERROR(cSize, lastBlock ? "ZSTD_compressEnd failed" : "ZSTD_compressContinue failed");
|
|
|
|
|
zcs->frameEnded = lastBlock;
|
|
|
|
|
/* prepare next block */
|
|
|
|
|
zcs->inBuffTarget = zcs->inBuffPos + zcs->blockSize;
|
|
|
|
@@ -3930,7 +3943,7 @@ static size_t ZSTD_nextInputSizeHint_MTorST(const ZSTD_CCtx* cctx)
|
|
|
|
|
|
|
|
|
|
size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
|
|
|
|
|
{
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue) , "");
|
|
|
|
|
return ZSTD_nextInputSizeHint_MTorST(zcs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -3942,15 +3955,15 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
|
|
|
|
|
{
|
|
|
|
|
DEBUGLOG(5, "ZSTD_compressStream2, endOp=%u ", (unsigned)endOp);
|
|
|
|
|
/* check conditions */
|
|
|
|
|
RETURN_ERROR_IF(output->pos > output->size, GENERIC);
|
|
|
|
|
RETURN_ERROR_IF(input->pos > input->size, GENERIC);
|
|
|
|
|
RETURN_ERROR_IF(output->pos > output->size, GENERIC, "invalid buffer");
|
|
|
|
|
RETURN_ERROR_IF(input->pos > input->size, GENERIC, "invalid buffer");
|
|
|
|
|
assert(cctx!=NULL);
|
|
|
|
|
|
|
|
|
|
/* transparent initialization stage */
|
|
|
|
|
if (cctx->streamStage == zcss_init) {
|
|
|
|
|
ZSTD_CCtx_params params = cctx->requestedParams;
|
|
|
|
|
ZSTD_prefixDict const prefixDict = cctx->prefixDict;
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_initLocalDict(cctx) ); /* Init the local dict if present. */
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_initLocalDict(cctx) , ""); /* Init the local dict if present. */
|
|
|
|
|
memset(&cctx->prefixDict, 0, sizeof(cctx->prefixDict)); /* single usage */
|
|
|
|
|
assert(prefixDict.dict==NULL || cctx->cdict==NULL); /* only one can be set */
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compressStream2 : transparent init stage");
|
|
|
|
@@ -3969,14 +3982,14 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
|
|
|
|
|
DEBUGLOG(4, "ZSTD_compressStream2: creating new mtctx for nbWorkers=%u",
|
|
|
|
|
params.nbWorkers);
|
|
|
|
|
cctx->mtctx = ZSTDMT_createCCtx_advanced((U32)params.nbWorkers, cctx->customMem);
|
|
|
|
|
RETURN_ERROR_IF(cctx->mtctx == NULL, memory_allocation);
|
|
|
|
|
RETURN_ERROR_IF(cctx->mtctx == NULL, memory_allocation, "NULL pointer!");
|
|
|
|
|
}
|
|
|
|
|
/* mt compression */
|
|
|
|
|
DEBUGLOG(4, "call ZSTDMT_initCStream_internal as nbWorkers=%u", params.nbWorkers);
|
|
|
|
|
FORWARD_IF_ERROR( ZSTDMT_initCStream_internal(
|
|
|
|
|
cctx->mtctx,
|
|
|
|
|
prefixDict.dict, prefixDict.dictSize, prefixDict.dictContentType,
|
|
|
|
|
cctx->cdict, params, cctx->pledgedSrcSizePlusOne-1) );
|
|
|
|
|
cctx->cdict, params, cctx->pledgedSrcSizePlusOne-1) , "");
|
|
|
|
|
cctx->streamStage = zcss_load;
|
|
|
|
|
cctx->appliedParams.nbWorkers = params.nbWorkers;
|
|
|
|
|
} else
|
|
|
|
@@ -3984,7 +3997,7 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
|
|
|
|
|
{ FORWARD_IF_ERROR( ZSTD_resetCStream_internal(cctx,
|
|
|
|
|
prefixDict.dict, prefixDict.dictSize, prefixDict.dictContentType,
|
|
|
|
|
cctx->cdict,
|
|
|
|
|
params, cctx->pledgedSrcSizePlusOne-1) );
|
|
|
|
|
params, cctx->pledgedSrcSizePlusOne-1) , "");
|
|
|
|
|
assert(cctx->streamStage == zcss_load);
|
|
|
|
|
assert(cctx->appliedParams.nbWorkers == 0);
|
|
|
|
|
} }
|
|
|
|
@@ -4006,7 +4019,7 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
|
|
|
|
|
|| (endOp == ZSTD_e_end && flushMin == 0) ) { /* compression completed */
|
|
|
|
|
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only);
|
|
|
|
|
}
|
|
|
|
|
FORWARD_IF_ERROR(flushMin);
|
|
|
|
|
FORWARD_IF_ERROR(flushMin, "ZSTDMT_compressStream_generic failed");
|
|
|
|
|
} while (forceMaxProgress && flushMin != 0 && output->pos < output->size);
|
|
|
|
|
DEBUGLOG(5, "completed ZSTD_compressStream2 delegating to ZSTDMT_compressStream_generic");
|
|
|
|
|
/* Either we don't require maximum forward progress, we've finished the
|
|
|
|
@@ -4016,7 +4029,7 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
|
|
|
|
|
return flushMin;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_compressStream_generic(cctx, output, input, endOp) );
|
|
|
|
|
FORWARD_IF_ERROR( ZSTD_compressStream_generic(cctx, output, input, endOp) , "");
|
|
|
|
|
DEBUGLOG(5, "completed ZSTD_compressStream2");
|
|
|
|
|
return cctx->outBuffContentSize - cctx->outBuffFlushedSize; /* remaining to flush */
|
|
|
|
|
}
|
|
|
|
@@ -4047,10 +4060,10 @@ size_t ZSTD_compress2(ZSTD_CCtx* cctx,
|
|
|
|
|
dst, dstCapacity, &oPos,
|
|
|
|
|
src, srcSize, &iPos,
|
|
|
|
|
ZSTD_e_end);
|
|
|
|
|
FORWARD_IF_ERROR(result);
|
|
|
|
|
FORWARD_IF_ERROR(result, "ZSTD_compressStream2_simpleArgs failed");
|
|
|
|
|
if (result != 0) { /* compression not completed, due to lack of output space */
|
|
|
|
|
assert(oPos == dstCapacity);
|
|
|
|
|
RETURN_ERROR(dstSize_tooSmall);
|
|
|
|
|
RETURN_ERROR(dstSize_tooSmall, "");
|
|
|
|
|
}
|
|
|
|
|
assert(iPos == srcSize); /* all input is expected consumed */
|
|
|
|
|
return oPos;
|
|
|
|
@@ -4072,7 +4085,7 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
|
|
|
|
|
{
|
|
|
|
|
ZSTD_inBuffer input = { NULL, 0, 0 };
|
|
|
|
|
size_t const remainingToFlush = ZSTD_compressStream2(zcs, output, &input, ZSTD_e_end);
|
|
|
|
|
FORWARD_IF_ERROR( remainingToFlush );
|
|
|
|
|
FORWARD_IF_ERROR( remainingToFlush , "ZSTD_compressStream2 failed");
|
|
|
|
|
if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */
|
|
|
|
|
/* single thread mode : attempt to calculate remaining to flush more precisely */
|
|
|
|
|
{ size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE;
|
|
|
|
|