]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed: tree not updated after finding very long rep matches
authorinikep <inikep@gmail.com>
Wed, 10 Aug 2016 13:00:30 +0000 (15:00 +0200)
committerinikep <inikep@gmail.com>
Wed, 10 Aug 2016 13:00:30 +0000 (15:00 +0200)
lib/compress/zstd_compress.c

index 0f79fc85faefef5c85b044463e26979fbe0e5c5b..e218b63743defab0504ce603f42b0f35fc83464c 100644 (file)
@@ -2205,8 +2205,13 @@ static ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int
 static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
 {
     ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->params.cParams.strategy, zc->lowLimit < zc->dictLimit);
+    const BYTE* const base = zc->base;
+    const BYTE* const istart = (const BYTE*)src;
+    const U32 current = (U32)(istart-base);
     if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) return 0;   /* don't even attempt compression below a certain srcSize */
     ZSTD_resetSeqStore(&(zc->seqStore));
+    if (current > zc->nextToUpdate + 384)
+        zc->nextToUpdate = current - MIN(192, (U32)(current - zc->nextToUpdate - 384));   /* update tree not updated after finding very long rep matches */
     blockCompressor(zc, src, srcSize);
     return ZSTD_compressSequences(zc, dst, dstCapacity, srcSize);
 }