36 { |
36 { |
37 unsigned u; |
37 unsigned u; |
38 |
38 |
39 ssPtr->cachedLiterals = NULL; |
39 ssPtr->cachedLiterals = NULL; |
40 ssPtr->cachedPrice = ssPtr->cachedLitLength = 0; |
40 ssPtr->cachedPrice = ssPtr->cachedLitLength = 0; |
41 ssPtr->staticPrices = 0; |
41 ssPtr->staticPrices = 0; |
42 |
42 |
43 if (ssPtr->litLengthSum == 0) { |
43 if (ssPtr->litLengthSum == 0) { |
44 if (srcSize <= 1024) ssPtr->staticPrices = 1; |
44 if (srcSize <= 1024) ssPtr->staticPrices = 1; |
45 |
45 |
46 for (u=0; u<=MaxLit; u++) |
46 for (u=0; u<=MaxLit; u++) |
54 ssPtr->offCodeSum = (MaxOff+1); |
54 ssPtr->offCodeSum = (MaxOff+1); |
55 ssPtr->matchSum = (ZSTD_LITFREQ_ADD<<Litbits); |
55 ssPtr->matchSum = (ZSTD_LITFREQ_ADD<<Litbits); |
56 |
56 |
57 for (u=0; u<=MaxLit; u++) { |
57 for (u=0; u<=MaxLit; u++) { |
58 ssPtr->litFreq[u] = 1 + (ssPtr->litFreq[u]>>ZSTD_FREQ_DIV); |
58 ssPtr->litFreq[u] = 1 + (ssPtr->litFreq[u]>>ZSTD_FREQ_DIV); |
59 ssPtr->litSum += ssPtr->litFreq[u]; |
59 ssPtr->litSum += ssPtr->litFreq[u]; |
60 } |
60 } |
61 for (u=0; u<=MaxLL; u++) |
61 for (u=0; u<=MaxLL; u++) |
62 ssPtr->litLengthFreq[u] = 1; |
62 ssPtr->litLengthFreq[u] = 1; |
63 for (u=0; u<=MaxML; u++) |
63 for (u=0; u<=MaxML; u++) |
64 ssPtr->matchLengthFreq[u] = 1; |
64 ssPtr->matchLengthFreq[u] = 1; |
632 ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH); |
632 ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH); |
633 anchor = ip = ip + mlen; |
633 anchor = ip = ip + mlen; |
634 } } /* for (cur=0; cur < last_pos; ) */ |
634 } } /* for (cur=0; cur < last_pos; ) */ |
635 |
635 |
636 /* Save reps for next block */ |
636 /* Save reps for next block */ |
637 { int i; for (i=0; i<ZSTD_REP_NUM; i++) ctx->savedRep[i] = rep[i]; } |
637 { int i; for (i=0; i<ZSTD_REP_NUM; i++) ctx->repToConfirm[i] = rep[i]; } |
638 |
638 |
639 /* Last Literals */ |
639 /* Last Literals */ |
640 { size_t const lastLLSize = iend - anchor; |
640 { size_t const lastLLSize = iend - anchor; |
641 memcpy(seqStorePtr->lit, anchor, lastLLSize); |
641 memcpy(seqStorePtr->lit, anchor, lastLLSize); |
642 seqStorePtr->lit += lastLLSize; |
642 seqStorePtr->lit += lastLLSize; |
823 } while (mlen >= minMatch); |
823 } while (mlen >= minMatch); |
824 } } } |
824 } } } |
825 |
825 |
826 match_num = ZSTD_BtGetAllMatches_selectMLS_extDict(ctx, inr, iend, maxSearches, mls, matches, minMatch); |
826 match_num = ZSTD_BtGetAllMatches_selectMLS_extDict(ctx, inr, iend, maxSearches, mls, matches, minMatch); |
827 |
827 |
828 if (match_num > 0 && matches[match_num-1].len > sufficient_len) { |
828 if (match_num > 0 && (matches[match_num-1].len > sufficient_len || cur + matches[match_num-1].len >= ZSTD_OPT_NUM)) { |
829 best_mlen = matches[match_num-1].len; |
829 best_mlen = matches[match_num-1].len; |
830 best_off = matches[match_num-1].off; |
830 best_off = matches[match_num-1].off; |
831 last_pos = cur + 1; |
831 last_pos = cur + 1; |
832 goto _storeSequence; |
832 goto _storeSequence; |
833 } |
833 } |
834 |
834 |
835 /* set prices using matches at position = cur */ |
835 /* set prices using matches at position = cur */ |
836 for (u = 0; u < match_num; u++) { |
836 for (u = 0; u < match_num; u++) { |
837 mlen = (u>0) ? matches[u-1].len+1 : best_mlen; |
837 mlen = (u>0) ? matches[u-1].len+1 : best_mlen; |
838 best_mlen = (cur + matches[u].len < ZSTD_OPT_NUM) ? matches[u].len : ZSTD_OPT_NUM - cur; |
838 best_mlen = matches[u].len; |
839 |
839 |
840 while (mlen <= best_mlen) { |
840 while (mlen <= best_mlen) { |
841 if (opt[cur].mlen == 1) { |
841 if (opt[cur].mlen == 1) { |
842 litlen = opt[cur].litlen; |
842 litlen = opt[cur].litlen; |
843 if (cur > litlen) |
843 if (cur > litlen) |
905 ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH); |
905 ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH); |
906 anchor = ip = ip + mlen; |
906 anchor = ip = ip + mlen; |
907 } } /* for (cur=0; cur < last_pos; ) */ |
907 } } /* for (cur=0; cur < last_pos; ) */ |
908 |
908 |
909 /* Save reps for next block */ |
909 /* Save reps for next block */ |
910 { int i; for (i=0; i<ZSTD_REP_NUM; i++) ctx->savedRep[i] = rep[i]; } |
910 { int i; for (i=0; i<ZSTD_REP_NUM; i++) ctx->repToConfirm[i] = rep[i]; } |
911 |
911 |
912 /* Last Literals */ |
912 /* Last Literals */ |
913 { size_t lastLLSize = iend - anchor; |
913 { size_t lastLLSize = iend - anchor; |
914 memcpy(seqStorePtr->lit, anchor, lastLLSize); |
914 memcpy(seqStorePtr->lit, anchor, lastLLSize); |
915 seqStorePtr->lit += lastLLSize; |
915 seqStorePtr->lit += lastLLSize; |