From: senhuang42 Date: Wed, 28 Oct 2020 15:28:12 +0000 (-0400) Subject: Implement ZSTD_updateSequenceRange X-Git-Tag: v1.4.7~30^2~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cfced9344a226e618a484fdc3ee1c99f02955e9d;p=thirdparty%2Fzstd.git Implement ZSTD_updateSequenceRange --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 4269d41eb..ed6557103 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -4498,8 +4498,27 @@ typedef struct { static void ZSTD_updateSequenceRange(ZSTD_sequenceRange* sequenceRange, size_t nbBytes, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize) { - U32 newStartIdx = sequenceRange->endIdx; - U32 newStartPos = sequenceRange->endPos; + U32 idx = sequenceRange->endIdx; + U32 endPosInSequence = sequenceRange->endPosInSequence + nbBytes; + + while (endPosInSequence && idx < inSeqsSize) { + ZSTD_Sequence currSeq = inSeqs[idx]; + if (endPosInSequence >= currSeq.litLength + currSeq.matchLength) { + endPosInSequence -= currSeq.litLength + currSeq.matchLength; + idx++; + } else { + break; + } + } + + if (idx == inSeqsSize) { + endPosInSequence = 0; + } + + sequenceRange->startIdx = sequenceRange->endIdx; + sequenceRange->startPosInSequence = sequenceRange->endPosInSequence; /* Does this need +1? */ + sequenceRange->endIdx = idx; + sequenceRange->endPosInSequence = endPosInSequence; } /* Returns 0 on success, otherwise ZSTD error code */