From cfced9344a226e618a484fdc3ee1c99f02955e9d Mon Sep 17 00:00:00 2001 From: senhuang42 Date: Wed, 28 Oct 2020 11:28:12 -0400 Subject: [PATCH] Implement ZSTD_updateSequenceRange --- lib/compress/zstd_compress.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 4269d41e..ed655710 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 */