zstd-ruby 1.3.7.0 → 1.3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/zstdruby/libzstd/BUCK +15 -2
- data/ext/zstdruby/libzstd/Makefile +37 -2
- data/ext/zstdruby/libzstd/README.md +67 -41
- data/ext/zstdruby/libzstd/common/bitstream.h +2 -2
- data/ext/zstdruby/libzstd/common/compiler.h +19 -12
- data/ext/zstdruby/libzstd/common/cpu.h +1 -1
- data/ext/zstdruby/libzstd/common/debug.h +22 -11
- data/ext/zstdruby/libzstd/common/error_private.c +6 -0
- data/ext/zstdruby/libzstd/common/fse.h +2 -2
- data/ext/zstdruby/libzstd/common/huf.h +25 -1
- data/ext/zstdruby/libzstd/common/pool.c +1 -1
- data/ext/zstdruby/libzstd/common/zstd_common.c +3 -1
- data/ext/zstdruby/libzstd/common/zstd_errors.h +1 -0
- data/ext/zstdruby/libzstd/common/zstd_internal.h +11 -2
- data/ext/zstdruby/libzstd/compress/fse_compress.c +3 -3
- data/ext/zstdruby/libzstd/compress/hist.c +19 -11
- data/ext/zstdruby/libzstd/compress/hist.h +11 -8
- data/ext/zstdruby/libzstd/compress/huf_compress.c +33 -31
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +621 -371
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +90 -28
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +4 -4
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +15 -15
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +25 -18
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +18 -67
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +2 -6
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +133 -48
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +8 -0
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +229 -73
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +18 -10
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +178 -42
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +240 -0
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +44 -0
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +244 -1680
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +1307 -0
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +59 -0
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +168 -0
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +13 -11
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +15 -15
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +28 -28
- data/ext/zstdruby/libzstd/dll/libzstd.def +0 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +0 -10
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +15 -15
- data/ext/zstdruby/libzstd/zstd.h +1208 -968
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +7 -2
| @@ -48,12 +48,6 @@ extern "C" { | |
| 48 48 | 
             
            typedef enum { ZSTDcs_created=0, ZSTDcs_init, ZSTDcs_ongoing, ZSTDcs_ending } ZSTD_compressionStage_e;
         | 
| 49 49 | 
             
            typedef enum { zcss_init=0, zcss_load, zcss_flush } ZSTD_cStreamStage;
         | 
| 50 50 |  | 
| 51 | 
            -
            typedef enum {
         | 
| 52 | 
            -
                ZSTD_dictDefaultAttach = 0,
         | 
| 53 | 
            -
                ZSTD_dictForceAttach = 1,
         | 
| 54 | 
            -
                ZSTD_dictForceCopy = -1,
         | 
| 55 | 
            -
            } ZSTD_dictAttachPref_e;
         | 
| 56 | 
            -
             | 
| 57 51 | 
             
            typedef struct ZSTD_prefixDict_s {
         | 
| 58 52 | 
             
                const void* dict;
         | 
| 59 53 | 
             
                size_t dictSize;
         | 
| @@ -96,10 +90,10 @@ typedef enum { zop_dynamic=0, zop_predef } ZSTD_OptPrice_e; | |
| 96 90 |  | 
| 97 91 | 
             
            typedef struct {
         | 
| 98 92 | 
             
                /* All tables are allocated inside cctx->workspace by ZSTD_resetCCtx_internal() */
         | 
| 99 | 
            -
                 | 
| 100 | 
            -
                 | 
| 101 | 
            -
                 | 
| 102 | 
            -
                 | 
| 93 | 
            +
                unsigned* litFreq;           /* table of literals statistics, of size 256 */
         | 
| 94 | 
            +
                unsigned* litLengthFreq;     /* table of litLength statistics, of size (MaxLL+1) */
         | 
| 95 | 
            +
                unsigned* matchLengthFreq;   /* table of matchLength statistics, of size (MaxML+1) */
         | 
| 96 | 
            +
                unsigned* offCodeFreq;       /* table of offCode statistics, of size (MaxOff+1) */
         | 
| 103 97 | 
             
                ZSTD_match_t* matchTable;    /* list of found matches, of size ZSTD_OPT_NUM+1 */
         | 
| 104 98 | 
             
                ZSTD_optimal_t* priceTable;  /* All positions tracked by optimal parser, of size ZSTD_OPT_NUM+1 */
         | 
| 105 99 |  | 
| @@ -139,7 +133,7 @@ struct ZSTD_matchState_t { | |
| 139 133 | 
             
                U32* hashTable3;
         | 
| 140 134 | 
             
                U32* chainTable;
         | 
| 141 135 | 
             
                optState_t opt;         /* optimal parser state */
         | 
| 142 | 
            -
                const ZSTD_matchState_t *dictMatchState;
         | 
| 136 | 
            +
                const ZSTD_matchState_t * dictMatchState;
         | 
| 143 137 | 
             
                ZSTD_compressionParameters cParams;
         | 
| 144 138 | 
             
            };
         | 
| 145 139 |  | 
| @@ -167,7 +161,7 @@ typedef struct { | |
| 167 161 | 
             
                U32 hashLog;            /* Log size of hashTable */
         | 
| 168 162 | 
             
                U32 bucketSizeLog;      /* Log bucket size for collision resolution, at most 8 */
         | 
| 169 163 | 
             
                U32 minMatchLength;     /* Minimum match length */
         | 
| 170 | 
            -
                U32  | 
| 164 | 
            +
                U32 hashRateLog;       /* Log number of entries to skip */
         | 
| 171 165 | 
             
                U32 windowLog;          /* Window log for the LDM */
         | 
| 172 166 | 
             
            } ldmParams_t;
         | 
| 173 167 |  | 
| @@ -196,9 +190,10 @@ struct ZSTD_CCtx_params_s { | |
| 196 190 | 
             
                ZSTD_dictAttachPref_e attachDictPref;
         | 
| 197 191 |  | 
| 198 192 | 
             
                /* Multithreading: used to pass parameters to mtctx */
         | 
| 199 | 
            -
                 | 
| 200 | 
            -
                 | 
| 201 | 
            -
                 | 
| 193 | 
            +
                int nbWorkers;
         | 
| 194 | 
            +
                size_t jobSize;
         | 
| 195 | 
            +
                int overlapLog;
         | 
| 196 | 
            +
                int rsyncable;
         | 
| 202 197 |  | 
| 203 198 | 
             
                /* Long distance matching parameters */
         | 
| 204 199 | 
             
                ldmParams_t ldmParams;
         | 
| @@ -498,6 +493,64 @@ MEM_STATIC size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls) | |
| 498 493 | 
             
                }
         | 
| 499 494 | 
             
            }
         | 
| 500 495 |  | 
| 496 | 
            +
            /** ZSTD_ipow() :
         | 
| 497 | 
            +
             * Return base^exponent.
         | 
| 498 | 
            +
             */
         | 
| 499 | 
            +
            static U64 ZSTD_ipow(U64 base, U64 exponent)
         | 
| 500 | 
            +
            {
         | 
| 501 | 
            +
                U64 power = 1;
         | 
| 502 | 
            +
                while (exponent) {
         | 
| 503 | 
            +
                  if (exponent & 1) power *= base;
         | 
| 504 | 
            +
                  exponent >>= 1;
         | 
| 505 | 
            +
                  base *= base;
         | 
| 506 | 
            +
                }
         | 
| 507 | 
            +
                return power;
         | 
| 508 | 
            +
            }
         | 
| 509 | 
            +
             | 
| 510 | 
            +
            #define ZSTD_ROLL_HASH_CHAR_OFFSET 10
         | 
| 511 | 
            +
             | 
| 512 | 
            +
            /** ZSTD_rollingHash_append() :
         | 
| 513 | 
            +
             * Add the buffer to the hash value.
         | 
| 514 | 
            +
             */
         | 
| 515 | 
            +
            static U64 ZSTD_rollingHash_append(U64 hash, void const* buf, size_t size)
         | 
| 516 | 
            +
            {
         | 
| 517 | 
            +
                BYTE const* istart = (BYTE const*)buf;
         | 
| 518 | 
            +
                size_t pos;
         | 
| 519 | 
            +
                for (pos = 0; pos < size; ++pos) {
         | 
| 520 | 
            +
                    hash *= prime8bytes;
         | 
| 521 | 
            +
                    hash += istart[pos] + ZSTD_ROLL_HASH_CHAR_OFFSET;
         | 
| 522 | 
            +
                }
         | 
| 523 | 
            +
                return hash;
         | 
| 524 | 
            +
            }
         | 
| 525 | 
            +
             | 
| 526 | 
            +
            /** ZSTD_rollingHash_compute() :
         | 
| 527 | 
            +
             * Compute the rolling hash value of the buffer.
         | 
| 528 | 
            +
             */
         | 
| 529 | 
            +
            MEM_STATIC U64 ZSTD_rollingHash_compute(void const* buf, size_t size)
         | 
| 530 | 
            +
            {
         | 
| 531 | 
            +
                return ZSTD_rollingHash_append(0, buf, size);
         | 
| 532 | 
            +
            }
         | 
| 533 | 
            +
             | 
| 534 | 
            +
            /** ZSTD_rollingHash_primePower() :
         | 
| 535 | 
            +
             * Compute the primePower to be passed to ZSTD_rollingHash_rotate() for a hash
         | 
| 536 | 
            +
             * over a window of length bytes.
         | 
| 537 | 
            +
             */
         | 
| 538 | 
            +
            MEM_STATIC U64 ZSTD_rollingHash_primePower(U32 length)
         | 
| 539 | 
            +
            {
         | 
| 540 | 
            +
                return ZSTD_ipow(prime8bytes, length - 1);
         | 
| 541 | 
            +
            }
         | 
| 542 | 
            +
             | 
| 543 | 
            +
            /** ZSTD_rollingHash_rotate() :
         | 
| 544 | 
            +
             * Rotate the rolling hash by one byte.
         | 
| 545 | 
            +
             */
         | 
| 546 | 
            +
            MEM_STATIC U64 ZSTD_rollingHash_rotate(U64 hash, BYTE toRemove, BYTE toAdd, U64 primePower)
         | 
| 547 | 
            +
            {
         | 
| 548 | 
            +
                hash -= (toRemove + ZSTD_ROLL_HASH_CHAR_OFFSET) * primePower;
         | 
| 549 | 
            +
                hash *= prime8bytes;
         | 
| 550 | 
            +
                hash += toAdd + ZSTD_ROLL_HASH_CHAR_OFFSET;
         | 
| 551 | 
            +
                return hash;
         | 
| 552 | 
            +
            }
         | 
| 553 | 
            +
             | 
| 501 554 | 
             
            /*-*************************************
         | 
| 502 555 | 
             
            *  Round buffer management
         | 
| 503 556 | 
             
            ***************************************/
         | 
| @@ -626,20 +679,23 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog, | |
| 626 679 | 
             
             * dictMatchState mode, lowLimit and dictLimit are the same, and the dictionary
         | 
| 627 680 | 
             
             * is below them. forceWindow and dictMatchState are therefore incompatible.
         | 
| 628 681 | 
             
             */
         | 
| 629 | 
            -
            MEM_STATIC void | 
| 630 | 
            -
             | 
| 631 | 
            -
             | 
| 632 | 
            -
             | 
| 682 | 
            +
            MEM_STATIC void
         | 
| 683 | 
            +
            ZSTD_window_enforceMaxDist(ZSTD_window_t* window,
         | 
| 684 | 
            +
                                       void const* srcEnd,
         | 
| 685 | 
            +
                                       U32 maxDist,
         | 
| 686 | 
            +
                                       U32* loadedDictEndPtr,
         | 
| 687 | 
            +
                                 const ZSTD_matchState_t** dictMatchStatePtr)
         | 
| 633 688 | 
             
            {
         | 
| 634 | 
            -
                U32 const  | 
| 635 | 
            -
                U32 loadedDictEnd = loadedDictEndPtr != NULL ? *loadedDictEndPtr : 0;
         | 
| 636 | 
            -
                DEBUGLOG(5, "ZSTD_window_enforceMaxDist:  | 
| 637 | 
            -
             | 
| 638 | 
            -
             | 
| 689 | 
            +
                U32 const blockEndIdx = (U32)((BYTE const*)srcEnd - window->base);
         | 
| 690 | 
            +
                U32 loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0;
         | 
| 691 | 
            +
                DEBUGLOG(5, "ZSTD_window_enforceMaxDist: blockEndIdx=%u, maxDist=%u",
         | 
| 692 | 
            +
                            (unsigned)blockEndIdx, (unsigned)maxDist);
         | 
| 693 | 
            +
                if (blockEndIdx > maxDist + loadedDictEnd) {
         | 
| 694 | 
            +
                    U32 const newLowLimit = blockEndIdx - maxDist;
         | 
| 639 695 | 
             
                    if (window->lowLimit < newLowLimit) window->lowLimit = newLowLimit;
         | 
| 640 696 | 
             
                    if (window->dictLimit < window->lowLimit) {
         | 
| 641 697 | 
             
                        DEBUGLOG(5, "Update dictLimit to match lowLimit, from %u to %u",
         | 
| 642 | 
            -
                                    window->dictLimit, window->lowLimit);
         | 
| 698 | 
            +
                                    (unsigned)window->dictLimit, (unsigned)window->lowLimit);
         | 
| 643 699 | 
             
                        window->dictLimit = window->lowLimit;
         | 
| 644 700 | 
             
                    }
         | 
| 645 701 | 
             
                    if (loadedDictEndPtr)
         | 
| @@ -690,20 +746,23 @@ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window, | |
| 690 746 |  | 
| 691 747 |  | 
| 692 748 | 
             
            /* debug functions */
         | 
| 749 | 
            +
            #if (DEBUGLEVEL>=2)
         | 
| 693 750 |  | 
| 694 751 | 
             
            MEM_STATIC double ZSTD_fWeight(U32 rawStat)
         | 
| 695 752 | 
             
            {
         | 
| 696 753 | 
             
                U32 const fp_accuracy = 8;
         | 
| 697 754 | 
             
                U32 const fp_multiplier = (1 << fp_accuracy);
         | 
| 698 | 
            -
                U32 const  | 
| 699 | 
            -
                U32 const hb = ZSTD_highbit32( | 
| 755 | 
            +
                U32 const newStat = rawStat + 1;
         | 
| 756 | 
            +
                U32 const hb = ZSTD_highbit32(newStat);
         | 
| 700 757 | 
             
                U32 const BWeight = hb * fp_multiplier;
         | 
| 701 | 
            -
                U32 const FWeight = ( | 
| 758 | 
            +
                U32 const FWeight = (newStat << fp_accuracy) >> hb;
         | 
| 702 759 | 
             
                U32 const weight = BWeight + FWeight;
         | 
| 703 760 | 
             
                assert(hb + fp_accuracy < 31);
         | 
| 704 761 | 
             
                return (double)weight / fp_multiplier;
         | 
| 705 762 | 
             
            }
         | 
| 706 763 |  | 
| 764 | 
            +
            /* display a table content,
         | 
| 765 | 
            +
             * listing each element, its frequency, and its predicted bit cost */
         | 
| 707 766 | 
             
            MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max)
         | 
| 708 767 | 
             
            {
         | 
| 709 768 | 
             
                unsigned u, sum;
         | 
| @@ -715,6 +774,9 @@ MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max) | |
| 715 774 | 
             
                }
         | 
| 716 775 | 
             
            }
         | 
| 717 776 |  | 
| 777 | 
            +
            #endif
         | 
| 778 | 
            +
             | 
| 779 | 
            +
             | 
| 718 780 | 
             
            #if defined (__cplusplus)
         | 
| 719 781 | 
             
            }
         | 
| 720 782 | 
             
            #endif
         | 
| @@ -18,7 +18,7 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, | |
| 18 18 | 
             
                const ZSTD_compressionParameters* const cParams = &ms->cParams;
         | 
| 19 19 | 
             
                U32* const hashLarge = ms->hashTable;
         | 
| 20 20 | 
             
                U32  const hBitsL = cParams->hashLog;
         | 
| 21 | 
            -
                U32  const mls = cParams-> | 
| 21 | 
            +
                U32  const mls = cParams->minMatch;
         | 
| 22 22 | 
             
                U32* const hashSmall = ms->chainTable;
         | 
| 23 23 | 
             
                U32  const hBitsS = cParams->chainLog;
         | 
| 24 24 | 
             
                const BYTE* const base = ms->window.base;
         | 
| @@ -309,7 +309,7 @@ size_t ZSTD_compressBlock_doubleFast( | |
| 309 309 | 
             
                    ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 310 310 | 
             
                    void const* src, size_t srcSize)
         | 
| 311 311 | 
             
            {
         | 
| 312 | 
            -
                const U32 mls = ms->cParams. | 
| 312 | 
            +
                const U32 mls = ms->cParams.minMatch;
         | 
| 313 313 | 
             
                switch(mls)
         | 
| 314 314 | 
             
                {
         | 
| 315 315 | 
             
                default: /* includes case 3 */
         | 
| @@ -329,7 +329,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState( | |
| 329 329 | 
             
                    ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 330 330 | 
             
                    void const* src, size_t srcSize)
         | 
| 331 331 | 
             
            {
         | 
| 332 | 
            -
                const U32 mls = ms->cParams. | 
| 332 | 
            +
                const U32 mls = ms->cParams.minMatch;
         | 
| 333 333 | 
             
                switch(mls)
         | 
| 334 334 | 
             
                {
         | 
| 335 335 | 
             
                default: /* includes case 3 */
         | 
| @@ -483,7 +483,7 @@ size_t ZSTD_compressBlock_doubleFast_extDict( | |
| 483 483 | 
             
                    ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 484 484 | 
             
                    void const* src, size_t srcSize)
         | 
| 485 485 | 
             
            {
         | 
| 486 | 
            -
                U32 const mls = ms->cParams. | 
| 486 | 
            +
                U32 const mls = ms->cParams.minMatch;
         | 
| 487 487 | 
             
                switch(mls)
         | 
| 488 488 | 
             
                {
         | 
| 489 489 | 
             
                default: /* includes case 3 */
         | 
| @@ -18,7 +18,7 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms, | |
| 18 18 | 
             
                const ZSTD_compressionParameters* const cParams = &ms->cParams;
         | 
| 19 19 | 
             
                U32* const hashTable = ms->hashTable;
         | 
| 20 20 | 
             
                U32  const hBits = cParams->hashLog;
         | 
| 21 | 
            -
                U32  const mls = cParams-> | 
| 21 | 
            +
                U32  const mls = cParams->minMatch;
         | 
| 22 22 | 
             
                const BYTE* const base = ms->window.base;
         | 
| 23 23 | 
             
                const BYTE* ip = base + ms->nextToUpdate;
         | 
| 24 24 | 
             
                const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE;
         | 
| @@ -27,18 +27,18 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms, | |
| 27 27 | 
             
                /* Always insert every fastHashFillStep position into the hash table.
         | 
| 28 28 | 
             
                 * Insert the other positions if their hash entry is empty.
         | 
| 29 29 | 
             
                 */
         | 
| 30 | 
            -
                for (; ip + fastHashFillStep  | 
| 30 | 
            +
                for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) {
         | 
| 31 31 | 
             
                    U32 const current = (U32)(ip - base);
         | 
| 32 | 
            -
                     | 
| 33 | 
            -
                     | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
                         | 
| 38 | 
            -
             | 
| 39 | 
            -
                             | 
| 40 | 
            -
             | 
| 41 | 
            -
                }
         | 
| 32 | 
            +
                    size_t const hash0 = ZSTD_hashPtr(ip, hBits, mls);
         | 
| 33 | 
            +
                    hashTable[hash0] = current;
         | 
| 34 | 
            +
                    if (dtlm == ZSTD_dtlm_fast) continue;
         | 
| 35 | 
            +
                    /* Only load extra positions for ZSTD_dtlm_full */
         | 
| 36 | 
            +
                    {   U32 p;
         | 
| 37 | 
            +
                        for (p = 1; p < fastHashFillStep; ++p) {
         | 
| 38 | 
            +
                            size_t const hash = ZSTD_hashPtr(ip + p, hBits, mls);
         | 
| 39 | 
            +
                            if (hashTable[hash] == 0) {  /* not yet filled */
         | 
| 40 | 
            +
                                hashTable[hash] = current + p;
         | 
| 41 | 
            +
                }   }   }   }
         | 
| 42 42 | 
             
            }
         | 
| 43 43 |  | 
| 44 44 | 
             
            FORCE_INLINE_TEMPLATE
         | 
| @@ -235,7 +235,7 @@ size_t ZSTD_compressBlock_fast( | |
| 235 235 | 
             
                    void const* src, size_t srcSize)
         | 
| 236 236 | 
             
            {
         | 
| 237 237 | 
             
                ZSTD_compressionParameters const* cParams = &ms->cParams;
         | 
| 238 | 
            -
                U32 const mls = cParams-> | 
| 238 | 
            +
                U32 const mls = cParams->minMatch;
         | 
| 239 239 | 
             
                assert(ms->dictMatchState == NULL);
         | 
| 240 240 | 
             
                switch(mls)
         | 
| 241 241 | 
             
                {
         | 
| @@ -256,7 +256,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState( | |
| 256 256 | 
             
                    void const* src, size_t srcSize)
         | 
| 257 257 | 
             
            {
         | 
| 258 258 | 
             
                ZSTD_compressionParameters const* cParams = &ms->cParams;
         | 
| 259 | 
            -
                U32 const mls = cParams-> | 
| 259 | 
            +
                U32 const mls = cParams->minMatch;
         | 
| 260 260 | 
             
                assert(ms->dictMatchState != NULL);
         | 
| 261 261 | 
             
                switch(mls)
         | 
| 262 262 | 
             
                {
         | 
| @@ -375,7 +375,7 @@ size_t ZSTD_compressBlock_fast_extDict( | |
| 375 375 | 
             
                    void const* src, size_t srcSize)
         | 
| 376 376 | 
             
            {
         | 
| 377 377 | 
             
                ZSTD_compressionParameters const* cParams = &ms->cParams;
         | 
| 378 | 
            -
                U32 const mls = cParams-> | 
| 378 | 
            +
                U32 const mls = cParams->minMatch;
         | 
| 379 379 | 
             
                switch(mls)
         | 
| 380 380 | 
             
                {
         | 
| 381 381 | 
             
                default: /* includes case 3 */
         | 
| @@ -63,12 +63,13 @@ ZSTD_updateDUBT(ZSTD_matchState_t* ms, | |
| 63 63 | 
             
            static void
         | 
| 64 64 | 
             
            ZSTD_insertDUBT1(ZSTD_matchState_t* ms,
         | 
| 65 65 | 
             
                             U32 current, const BYTE* inputEnd,
         | 
| 66 | 
            -
                             U32 nbCompares, U32 btLow, | 
| 66 | 
            +
                             U32 nbCompares, U32 btLow,
         | 
| 67 | 
            +
                             const ZSTD_dictMode_e dictMode)
         | 
| 67 68 | 
             
            {
         | 
| 68 69 | 
             
                const ZSTD_compressionParameters* const cParams = &ms->cParams;
         | 
| 69 | 
            -
                U32* | 
| 70 | 
            -
                U32 | 
| 71 | 
            -
                U32 | 
| 70 | 
            +
                U32* const bt = ms->chainTable;
         | 
| 71 | 
            +
                U32  const btLog  = cParams->chainLog - 1;
         | 
| 72 | 
            +
                U32  const btMask = (1 << btLog) - 1;
         | 
| 72 73 | 
             
                size_t commonLengthSmaller=0, commonLengthLarger=0;
         | 
| 73 74 | 
             
                const BYTE* const base = ms->window.base;
         | 
| 74 75 | 
             
                const BYTE* const dictBase = ms->window.dictBase;
         | 
| @@ -80,7 +81,7 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, | |
| 80 81 | 
             
                const BYTE* match;
         | 
| 81 82 | 
             
                U32* smallerPtr = bt + 2*(current&btMask);
         | 
| 82 83 | 
             
                U32* largerPtr  = smallerPtr + 1;
         | 
| 83 | 
            -
                U32 matchIndex = *smallerPtr;
         | 
| 84 | 
            +
                U32 matchIndex = *smallerPtr;   /* this candidate is unsorted : next sorted candidate is reached through *smallerPtr, while *largerPtr contains previous unsorted candidate (which is already saved and can be overwritten) */
         | 
| 84 85 | 
             
                U32 dummy32;   /* to be nullified at the end */
         | 
| 85 86 | 
             
                U32 const windowLow = ms->window.lowLimit;
         | 
| 86 87 |  | 
| @@ -93,6 +94,9 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, | |
| 93 94 | 
             
                    U32* const nextPtr = bt + 2*(matchIndex & btMask);
         | 
| 94 95 | 
             
                    size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger);   /* guaranteed minimum nb of common bytes */
         | 
| 95 96 | 
             
                    assert(matchIndex < current);
         | 
| 97 | 
            +
                    /* note : all candidates are now supposed sorted,
         | 
| 98 | 
            +
                     * but it's still possible to have nextPtr[1] == ZSTD_DUBT_UNSORTED_MARK
         | 
| 99 | 
            +
                     * when a real index has the same value as ZSTD_DUBT_UNSORTED_MARK */
         | 
| 96 100 |  | 
| 97 101 | 
             
                    if ( (dictMode != ZSTD_extDict)
         | 
| 98 102 | 
             
                      || (matchIndex+matchLength >= dictLimit)  /* both in current segment*/
         | 
| @@ -108,7 +112,7 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, | |
| 108 112 | 
             
                        match = dictBase + matchIndex;
         | 
| 109 113 | 
             
                        matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart);
         | 
| 110 114 | 
             
                        if (matchIndex+matchLength >= dictLimit)
         | 
| 111 | 
            -
                            match = base + matchIndex;   /*  | 
| 115 | 
            +
                            match = base + matchIndex;   /* preparation for next read of match[matchLength] */
         | 
| 112 116 | 
             
                    }
         | 
| 113 117 |  | 
| 114 118 | 
             
                    DEBUGLOG(8, "ZSTD_insertDUBT1: comparing %u with %u : found %u common bytes ",
         | 
| @@ -258,7 +262,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, | |
| 258 262 | 
             
                     && (nbCandidates > 1) ) {
         | 
| 259 263 | 
             
                    DEBUGLOG(8, "ZSTD_DUBT_findBestMatch: candidate %u is unsorted",
         | 
| 260 264 | 
             
                                matchIndex);
         | 
| 261 | 
            -
                    *unsortedMark = previousCandidate;
         | 
| 265 | 
            +
                    *unsortedMark = previousCandidate;  /* the unsortedMark becomes a reversed chain, to move up back to original position */
         | 
| 262 266 | 
             
                    previousCandidate = matchIndex;
         | 
| 263 267 | 
             
                    matchIndex = *nextCandidate;
         | 
| 264 268 | 
             
                    nextCandidate = bt + 2*(matchIndex&btMask);
         | 
| @@ -266,11 +270,13 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, | |
| 266 270 | 
             
                    nbCandidates --;
         | 
| 267 271 | 
             
                }
         | 
| 268 272 |  | 
| 273 | 
            +
                /* nullify last candidate if it's still unsorted
         | 
| 274 | 
            +
                 * simplification, detrimental to compression ratio, beneficial for speed */
         | 
| 269 275 | 
             
                if ( (matchIndex > unsortLimit)
         | 
| 270 276 | 
             
                  && (*unsortedMark==ZSTD_DUBT_UNSORTED_MARK) ) {
         | 
| 271 277 | 
             
                    DEBUGLOG(7, "ZSTD_DUBT_findBestMatch: nullify last unsorted candidate %u",
         | 
| 272 278 | 
             
                                matchIndex);
         | 
| 273 | 
            -
                    *nextCandidate = *unsortedMark = 0; | 
| 279 | 
            +
                    *nextCandidate = *unsortedMark = 0;
         | 
| 274 280 | 
             
                }
         | 
| 275 281 |  | 
| 276 282 | 
             
                /* batch sort stacked candidates */
         | 
| @@ -285,14 +291,14 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, | |
| 285 291 | 
             
                }
         | 
| 286 292 |  | 
| 287 293 | 
             
                /* find longest match */
         | 
| 288 | 
            -
                {   size_t commonLengthSmaller=0, commonLengthLarger=0;
         | 
| 294 | 
            +
                {   size_t commonLengthSmaller = 0, commonLengthLarger = 0;
         | 
| 289 295 | 
             
                    const BYTE* const dictBase = ms->window.dictBase;
         | 
| 290 296 | 
             
                    const U32 dictLimit = ms->window.dictLimit;
         | 
| 291 297 | 
             
                    const BYTE* const dictEnd = dictBase + dictLimit;
         | 
| 292 298 | 
             
                    const BYTE* const prefixStart = base + dictLimit;
         | 
| 293 299 | 
             
                    U32* smallerPtr = bt + 2*(current&btMask);
         | 
| 294 300 | 
             
                    U32* largerPtr  = bt + 2*(current&btMask) + 1;
         | 
| 295 | 
            -
                    U32 matchEndIdx = current+8+1;
         | 
| 301 | 
            +
                    U32 matchEndIdx = current + 8 + 1;
         | 
| 296 302 | 
             
                    U32 dummy32;   /* to be nullified at the end */
         | 
| 297 303 | 
             
                    size_t bestLength = 0;
         | 
| 298 304 |  | 
| @@ -386,7 +392,7 @@ ZSTD_BtFindBestMatch_selectMLS (  ZSTD_matchState_t* ms, | |
| 386 392 | 
             
                                        const BYTE* ip, const BYTE* const iLimit,
         | 
| 387 393 | 
             
                                              size_t* offsetPtr)
         | 
| 388 394 | 
             
            {
         | 
| 389 | 
            -
                switch(ms->cParams. | 
| 395 | 
            +
                switch(ms->cParams.minMatch)
         | 
| 390 396 | 
             
                {
         | 
| 391 397 | 
             
                default : /* includes case 3 */
         | 
| 392 398 | 
             
                case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict);
         | 
| @@ -402,7 +408,7 @@ static size_t ZSTD_BtFindBestMatch_dictMatchState_selectMLS ( | |
| 402 408 | 
             
                                    const BYTE* ip, const BYTE* const iLimit,
         | 
| 403 409 | 
             
                                    size_t* offsetPtr)
         | 
| 404 410 | 
             
            {
         | 
| 405 | 
            -
                switch(ms->cParams. | 
| 411 | 
            +
                switch(ms->cParams.minMatch)
         | 
| 406 412 | 
             
                {
         | 
| 407 413 | 
             
                default : /* includes case 3 */
         | 
| 408 414 | 
             
                case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState);
         | 
| @@ -418,7 +424,7 @@ static size_t ZSTD_BtFindBestMatch_extDict_selectMLS ( | |
| 418 424 | 
             
                                    const BYTE* ip, const BYTE* const iLimit,
         | 
| 419 425 | 
             
                                    size_t* offsetPtr)
         | 
| 420 426 | 
             
            {
         | 
| 421 | 
            -
                switch(ms->cParams. | 
| 427 | 
            +
                switch(ms->cParams.minMatch)
         | 
| 422 428 | 
             
                {
         | 
| 423 429 | 
             
                default : /* includes case 3 */
         | 
| 424 430 | 
             
                case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict);
         | 
| @@ -433,7 +439,7 @@ static size_t ZSTD_BtFindBestMatch_extDict_selectMLS ( | |
| 433 439 | 
             
            /* *********************************
         | 
| 434 440 | 
             
            *  Hash Chain
         | 
| 435 441 | 
             
            ***********************************/
         | 
| 436 | 
            -
            #define NEXT_IN_CHAIN(d, mask)   chainTable[(d) & mask]
         | 
| 442 | 
            +
            #define NEXT_IN_CHAIN(d, mask)   chainTable[(d) & (mask)]
         | 
| 437 443 |  | 
| 438 444 | 
             
            /* Update chains up to ip (excluded)
         | 
| 439 445 | 
             
               Assumption : always within prefix (i.e. not within extDict) */
         | 
| @@ -463,7 +469,7 @@ static U32 ZSTD_insertAndFindFirstIndex_internal( | |
| 463 469 |  | 
| 464 470 | 
             
            U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip) {
         | 
| 465 471 | 
             
                const ZSTD_compressionParameters* const cParams = &ms->cParams;
         | 
| 466 | 
            -
                return ZSTD_insertAndFindFirstIndex_internal(ms, cParams, ip, ms->cParams. | 
| 472 | 
            +
                return ZSTD_insertAndFindFirstIndex_internal(ms, cParams, ip, ms->cParams.minMatch);
         | 
| 467 473 | 
             
            }
         | 
| 468 474 |  | 
| 469 475 |  | 
| @@ -497,6 +503,7 @@ size_t ZSTD_HcFindBestMatch_generic ( | |
| 497 503 | 
             
                    size_t currentMl=0;
         | 
| 498 504 | 
             
                    if ((dictMode != ZSTD_extDict) || matchIndex >= dictLimit) {
         | 
| 499 505 | 
             
                        const BYTE* const match = base + matchIndex;
         | 
| 506 | 
            +
                        assert(matchIndex >= dictLimit);   /* ensures this is true if dictMode != ZSTD_extDict */
         | 
| 500 507 | 
             
                        if (match[ml] == ip[ml])   /* potentially better */
         | 
| 501 508 | 
             
                            currentMl = ZSTD_count(ip, match, iLimit);
         | 
| 502 509 | 
             
                    } else {
         | 
| @@ -559,7 +566,7 @@ FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_selectMLS ( | |
| 559 566 | 
             
                                    const BYTE* ip, const BYTE* const iLimit,
         | 
| 560 567 | 
             
                                    size_t* offsetPtr)
         | 
| 561 568 | 
             
            {
         | 
| 562 | 
            -
                switch(ms->cParams. | 
| 569 | 
            +
                switch(ms->cParams.minMatch)
         | 
| 563 570 | 
             
                {
         | 
| 564 571 | 
             
                default : /* includes case 3 */
         | 
| 565 572 | 
             
                case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict);
         | 
| @@ -575,7 +582,7 @@ static size_t ZSTD_HcFindBestMatch_dictMatchState_selectMLS ( | |
| 575 582 | 
             
                                    const BYTE* ip, const BYTE* const iLimit,
         | 
| 576 583 | 
             
                                    size_t* offsetPtr)
         | 
| 577 584 | 
             
            {
         | 
| 578 | 
            -
                switch(ms->cParams. | 
| 585 | 
            +
                switch(ms->cParams.minMatch)
         | 
| 579 586 | 
             
                {
         | 
| 580 587 | 
             
                default : /* includes case 3 */
         | 
| 581 588 | 
             
                case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState);
         | 
| @@ -591,7 +598,7 @@ FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_extDict_selectMLS ( | |
| 591 598 | 
             
                                    const BYTE* ip, const BYTE* const iLimit,
         | 
| 592 599 | 
             
                                    size_t* offsetPtr)
         | 
| 593 600 | 
             
            {
         | 
| 594 | 
            -
                switch(ms->cParams. | 
| 601 | 
            +
                switch(ms->cParams.minMatch)
         | 
| 595 602 | 
             
                {
         | 
| 596 603 | 
             
                default : /* includes case 3 */
         | 
| 597 604 | 
             
                case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict);
         |