]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Add last literals handling like getSequences()
authorsenhuang42 <senhuang96@fb.com>
Wed, 28 Oct 2020 15:57:21 +0000 (11:57 -0400)
committersenhuang42 <senhuang96@fb.com>
Mon, 16 Nov 2020 15:49:16 +0000 (10:49 -0500)
lib/compress/zstd_compress.c

index 82a0aa49f11505aee94d1ad75901f137d10f3dc0..283ca2f14f4024f72ccc2ea0502bfb0e2bfc11d8 100644 (file)
@@ -4533,6 +4533,16 @@ static size_t ZSTD_copySequencesToSeqStore(ZSTD_CCtx* zc,
     ZSTD_resetSeqStore(&zc->seqStore);
 
     for (; idx < inSeqsSize; ++idx) {
+        if (inSeqs[idx].matchLength == inSeqs[idx].offset == 0) {
+            /* Handle last literals case */
+            size_t lastLLSize = inSeqs[idx].litLength;
+            if (lastLLSize > 0) {
+                DEBUGLOG(4, "Storing last literals: %u bytes", lastLLSize);
+                const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize;
+                ZSTD_storeLastLiterals(&zc->seqStore, lastLiterals, lastLLSize);
+            } 
+            break;
+        }
         U32 litLength = inSeqs[idx].litLength;
         U32 matchLength = inSeqs[idx].matchLength;
         U32 offCode = inSeqs[idx].offset + ZSTD_REP_MOVE;
@@ -4546,16 +4556,6 @@ static size_t ZSTD_copySequencesToSeqStore(ZSTD_CCtx* zc,
         ip += matchLength + litLength;
     }
 
-    /* Handle last literals */
-    size_t consumedSize = (U32)(ip - istart);
-    assert(consumedSize <= srcSize);
-    size_t lastLLSize = srcSize - consumedSize;
-    if (lastLLSize > 0) {
-        DEBUGLOG(4, "Storing last literals: %u bytes", lastLLSize);
-        const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize;
-        ZSTD_storeLastLiterals(&zc->seqStore, lastLiterals, lastLLSize);
-    } 
-
     DEBUGLOG(4, "ZSTD_copySequencesToSeqStore: done");
     return 0;
 }