]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Fixes in re Comments
authorW. Felix Handte <w@felixhandte.com>
Mon, 21 May 2018 22:27:08 +0000 (18:27 -0400)
committerW. Felix Handte <w@felixhandte.com>
Wed, 23 May 2018 21:53:03 +0000 (17:53 -0400)
lib/compress/zstd_compress.c
lib/compress/zstd_fast.c

index b1d52b9aa3f052bc6821261f72e0d475f987c2a2..e49046fcb7386f01d8e1bb44e94b7ce12c67baa7 100644 (file)
@@ -1207,11 +1207,12 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
     /* We have a choice between copying the dictionary context into the working
      * context, or referencing the dictionary context from the working context
      * in-place. We decide here which strategy to use. */
-    int attachDict = ( pledgedSrcSize <= 8 KB
-                    || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN )
-                  && cdict->cParams.strategy == ZSTD_fast
-                  && ZSTD_equivalentCParams(cctx->appliedParams.cParams,
-                                            cdict->cParams);
+    const int attachDict = ( pledgedSrcSize <= 8 KB
+                          || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN )
+                        && cdict->cParams.strategy == ZSTD_fast
+                        && ZSTD_equivalentCParams(cctx->appliedParams.cParams,
+                                                  cdict->cParams);
+
 
     {   unsigned const windowLog = params.cParams.windowLog;
         assert(windowLog != 0);
@@ -1227,7 +1228,9 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
     }
 
     if (attachDict) {
-        if (cdict->matchState.window.nextSrc - cdict->matchState.window.base == 0) {
+        const U32 cdictLen = (U32)( cdict->matchState.window.nextSrc
+                                  - cdict->matchState.window.base);
+        if (cdictLen == 0) {
             /* don't even attach dictionaries with no contents */
             DEBUGLOG(4, "skipping attaching empty dictionary");
         } else {
@@ -1236,15 +1239,12 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
 
             /* prep working match state so dict matches never have negative indices
              * when they are translated to the working context's index space. */
-            if (cctx->blockState.matchState.window.dictLimit <
-                (U32)(cdict->matchState.window.nextSrc - cdict->matchState.window.base)) {
+            if (cctx->blockState.matchState.window.dictLimit < cdictLen) {
                 cctx->blockState.matchState.window.nextSrc =
-                    cctx->blockState.matchState.window.base +
-                    ( cdict->matchState.window.nextSrc
-                    - cdict->matchState.window.base);
+                    cctx->blockState.matchState.window.base + cdictLen;
                 ZSTD_window_clear(&cctx->blockState.matchState.window);
             }
-            cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit;
+            cctx->blockState.matchState.loadedDictEnd = params.forceWindow ? 0 : cdictLen;
         }
     } else {
         DEBUGLOG(4, "copying dictionary into context");
index b21bc7683c14934234e9b09492bd47bf3f52eee9..3bac2bddd3af1703bb218c9386b58f5d1208d6d2 100644 (file)
@@ -74,6 +74,7 @@ size_t ZSTD_compressBlock_fast_generic(
     const U32 dictIndexDelta       = dictMode == ZSTD_dictMatchState ?
                                      prefixLowestIndex - (U32)(dictEnd - dictBase) :
                                      0;
+    const U32 dictAndPrefixLength  = (U32)(ip - prefixLowest + dictEnd - dictLowest);
 
     assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState);
 
@@ -83,13 +84,18 @@ size_t ZSTD_compressBlock_fast_generic(
         || prefixLowestIndex >= (U32)(dictEnd - dictBase));
 
     /* init */
-    ip += (ip - prefixLowest + dictEnd - dictLowest == 0);
-    {   U32 const maxRep = dictMode == ZSTD_dictMatchState ?
-                           (U32)(ip - prefixLowest + dictEnd - dictLowest) :
-                           (U32)(ip - prefixLowest);
+    ip += (dictAndPrefixLength == 0);
+    if (dictMode == ZSTD_noDict) {
+        U32 const maxRep = (U32)(ip - prefixLowest);
         if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0;
         if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0;
     }
+    if (dictMode == ZSTD_dictMatchState) {
+        /* dictMatchState repCode checks don't currently handle repCode == 0
+         * disabling. */
+        assert(offset_1 <= dictAndPrefixLength);
+        assert(offset_2 <= dictAndPrefixLength);
+    }
 
     /* Main Search Loop */
     while (ip < ilimit) {   /* < instead of <=, because repcode check at (ip+1) */
@@ -169,8 +175,7 @@ size_t ZSTD_compressBlock_fast_generic(
                 while (ip <= ilimit) {
                     U32 const current2 = (U32)(ip-base);
                     U32 const repIndex2 = current2 - offset_2;
-                    const BYTE* repMatch2 = dictMode == ZSTD_dictMatchState
-                        && repIndex2 < prefixLowestIndex ?
+                    const BYTE* repMatch2 = repIndex2 < prefixLowestIndex ?
                             dictBase - dictIndexDelta + repIndex2 :
                             base + repIndex2;
                     if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */)