contrib/python-zstandard/zstd/compress/zstd_opt.h
changeset 30895 c32454d69b85
parent 30822 b54a2984cdd4
child 37495 b1fb341d8a61
equal deleted inserted replaced
30894:5b60464efbde 30895:c32454d69b85
    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;