in csharp/src/ZStdDecompress.cs [1555:1608]
static size_t ZSTD_decompressSequences_body(ZSTD_DCtx dctx,
void* dst, size_t maxDstSize,
void* seqStart, size_t seqSize, int nbSeq,
ZSTD_longOffset_e isLongOffset)
{
BYTE* ip = (BYTE*)seqStart;
BYTE* iend = ip + seqSize;
BYTE* ostart = (BYTE*)dst;
BYTE* oend = ostart + maxDstSize;
BYTE* op = ostart;
BYTE* litPtr = dctx.litPtr;
BYTE* litEnd = litPtr + dctx.litSize;
BYTE* baseField = (BYTE*)(dctx.baseField);
BYTE* vBase = (BYTE*)(dctx.vBase);
BYTE* dictEnd = (BYTE*)(dctx.dictEnd);
/* Regen sequences */
if (nbSeq != 0)
{
seqState_t seqState = new seqState_t();
dctx.fseEntropy = 1;
{ U32 i; for (i = 0; i < ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx.entropy.rep[i]; }
{ size_t errcod = InitDStream(seqState.DStream, ip, (size_t)(iend - ip)); if (IsError(errcod)) return ERROR(Error.corruption_detected); }
InitFseState(ref seqState.stateLL, seqState.DStream, dctx.LLTptr);
InitFseState(ref seqState.stateOffb, seqState.DStream, dctx.OFTptr);
InitFseState(ref seqState.stateML, seqState.DStream, dctx.MLTptr);
for (; (ReloadDStream(seqState.DStream) <= BIT_DStream_status.BIT_DStream_completed) && nbSeq != 0;)
{
nbSeq--;
{
seq_t sequence = DecodeSequence(seqState, isLongOffset);
size_t oneSeqSize = ExecSequence(op, oend, sequence, &litPtr, litEnd, baseField, vBase, dictEnd);
if (IsError(oneSeqSize)) return oneSeqSize;
op += oneSeqSize;
}
}
/* check if reached exact end */
if (nbSeq != 0) return ERROR(Error.corruption_detected);
/* save reps for next block */
{ U32 i; for (i = 0; i < ZSTD_REP_NUM; i++) dctx.entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
}
/* last literal segment */
{
size_t lastLLSize = (size_t)(litEnd - litPtr);
if (lastLLSize > (size_t)(oend - op)) return ERROR(Error.dstSize_tooSmall);
memcpy(op, litPtr, lastLLSize);
op += lastLLSize;
}
return (size_t)(op - ostart);
}