/* 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);
}
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 {
/* 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");
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);
|| 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) */
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 */)