]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Implement ZSTD_updateSequenceRange
authorsenhuang42 <senhuang96@fb.com>
Wed, 28 Oct 2020 15:28:12 +0000 (11:28 -0400)
committersenhuang42 <senhuang96@fb.com>
Mon, 16 Nov 2020 15:49:16 +0000 (10:49 -0500)
lib/compress/zstd_compress.c

index 4269d41ebd28b7590d6a2a4737fbe969df0b581d..ed655710335e0a4edead231c05baa27b0df28acc 100644 (file)
@@ -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 */