zstdlib 0.14.0-x86-mingw32 → 0.15.0-x86-mingw32
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/CHANGES.md +5 -0
- data/ext/zstdlib_c/extconf.rb +1 -1
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/bits.h +92 -87
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/bitstream.h +26 -29
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/compiler.h +36 -22
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/cpu.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/debug.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/error_private.c +1 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/error_private.h +0 -10
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/fse.h +2 -17
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/fse_decompress.c +2 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/huf.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/mem.h +7 -11
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/pool.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/portability_macros.h +22 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/threading.h +0 -8
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/xxhash.h +93 -19
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_deps.h +12 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_internal.h +1 -69
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_trace.h +5 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/hist.c +10 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/hist.h +7 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress.c +1057 -367
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_internal.h +227 -125
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_literals.c +1 -1
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_sequences.c +7 -7
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_sequences.h +7 -6
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_superblock.c +17 -17
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_cwksp.h +41 -24
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_double_fast.c +58 -50
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_double_fast.h +4 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_fast.c +91 -74
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_fast.h +4 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_lazy.c +64 -64
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_lazy.h +30 -39
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_ldm.c +48 -33
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_ldm.h +6 -14
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_opt.c +55 -51
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_opt.h +8 -16
- data/ext/zstdlib_c/zstd-1.5.7/lib/compress/zstd_preSplit.c +238 -0
- data/ext/zstdlib_c/zstd-1.5.7/lib/compress/zstd_preSplit.h +33 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstdmt_compress.c +134 -93
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstdmt_compress.h +4 -15
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/huf_decompress_amd64.S +10 -3
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress.c +14 -11
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress_block.c +6 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress_internal.h +5 -5
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/zdict.h +15 -8
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/zstd.h +241 -132
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/zstd_errors.h +1 -8
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzwrite.c +2 -1
- data/lib/2.4/zstdlib_c.so +0 -0
- data/lib/2.5/zstdlib_c.so +0 -0
- data/lib/2.6/zstdlib_c.so +0 -0
- data/lib/2.7/zstdlib_c.so +0 -0
- data/lib/3.0/zstdlib_c.so +0 -0
- data/lib/3.1/zstdlib_c.so +0 -0
- data/lib/3.2/zstdlib_c.so +0 -0
- data/lib/3.3/zstdlib_c.so +0 -0
- data/lib/3.4/zstdlib_c.so +0 -0
- metadata +75 -73
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/allocations.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/debug.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/entropy_common.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/pool.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/threading.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/xxhash.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_common.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/clevels.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/fse_compress.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/huf_compress.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_literals.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_superblock.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_ldm_geartab.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/huf_decompress.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_ddict.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_ddict.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress_block.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzclose.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzcompatibility.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzguts.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzlib.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzread.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/zstd_zlibwrapper.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/zstd_zlibwrapper.h +5 -5
| @@ -24,10 +24,7 @@ | |
| 24 24 | 
             
            #  include "zstdmt_compress.h"
         | 
| 25 25 | 
             
            #endif
         | 
| 26 26 | 
             
            #include "../common/bits.h" /* ZSTD_highbit32, ZSTD_NbCommonBytes */
         | 
| 27 | 
            -
             | 
| 28 | 
            -
            #if defined (__cplusplus)
         | 
| 29 | 
            -
            extern "C" {
         | 
| 30 | 
            -
            #endif
         | 
| 27 | 
            +
            #include "zstd_preSplit.h" /* ZSTD_SLIPBLOCK_WORKSPACESIZE */
         | 
| 31 28 |  | 
| 32 29 | 
             
            /*-*************************************
         | 
| 33 30 | 
             
            *  Constants
         | 
| @@ -82,6 +79,70 @@ typedef struct { | |
| 82 79 | 
             
                ZSTD_fseCTables_t fse;
         | 
| 83 80 | 
             
            } ZSTD_entropyCTables_t;
         | 
| 84 81 |  | 
| 82 | 
            +
            /***********************************************
         | 
| 83 | 
            +
            *  Sequences *
         | 
| 84 | 
            +
            ***********************************************/
         | 
| 85 | 
            +
            typedef struct SeqDef_s {
         | 
| 86 | 
            +
                U32 offBase;   /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */
         | 
| 87 | 
            +
                U16 litLength;
         | 
| 88 | 
            +
                U16 mlBase;    /* mlBase == matchLength - MINMATCH */
         | 
| 89 | 
            +
            } SeqDef;
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            /* Controls whether seqStore has a single "long" litLength or matchLength. See SeqStore_t. */
         | 
| 92 | 
            +
            typedef enum {
         | 
| 93 | 
            +
                ZSTD_llt_none = 0,             /* no longLengthType */
         | 
| 94 | 
            +
                ZSTD_llt_literalLength = 1,    /* represents a long literal */
         | 
| 95 | 
            +
                ZSTD_llt_matchLength = 2       /* represents a long match */
         | 
| 96 | 
            +
            } ZSTD_longLengthType_e;
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            typedef struct {
         | 
| 99 | 
            +
                SeqDef* sequencesStart;
         | 
| 100 | 
            +
                SeqDef* sequences;      /* ptr to end of sequences */
         | 
| 101 | 
            +
                BYTE*  litStart;
         | 
| 102 | 
            +
                BYTE*  lit;             /* ptr to end of literals */
         | 
| 103 | 
            +
                BYTE*  llCode;
         | 
| 104 | 
            +
                BYTE*  mlCode;
         | 
| 105 | 
            +
                BYTE*  ofCode;
         | 
| 106 | 
            +
                size_t maxNbSeq;
         | 
| 107 | 
            +
                size_t maxNbLit;
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                /* longLengthPos and longLengthType to allow us to represent either a single litLength or matchLength
         | 
| 110 | 
            +
                 * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
         | 
| 111 | 
            +
                 * the existing value of the litLength or matchLength by 0x10000.
         | 
| 112 | 
            +
                 */
         | 
| 113 | 
            +
                ZSTD_longLengthType_e longLengthType;
         | 
| 114 | 
            +
                U32                   longLengthPos;  /* Index of the sequence to apply long length modification to */
         | 
| 115 | 
            +
            } SeqStore_t;
         | 
| 116 | 
            +
             | 
| 117 | 
            +
            typedef struct {
         | 
| 118 | 
            +
                U32 litLength;
         | 
| 119 | 
            +
                U32 matchLength;
         | 
| 120 | 
            +
            } ZSTD_SequenceLength;
         | 
| 121 | 
            +
             | 
| 122 | 
            +
            /**
         | 
| 123 | 
            +
             * Returns the ZSTD_SequenceLength for the given sequences. It handles the decoding of long sequences
         | 
| 124 | 
            +
             * indicated by longLengthPos and longLengthType, and adds MINMATCH back to matchLength.
         | 
| 125 | 
            +
             */
         | 
| 126 | 
            +
            MEM_STATIC ZSTD_SequenceLength ZSTD_getSequenceLength(SeqStore_t const* seqStore, SeqDef const* seq)
         | 
| 127 | 
            +
            {
         | 
| 128 | 
            +
                ZSTD_SequenceLength seqLen;
         | 
| 129 | 
            +
                seqLen.litLength = seq->litLength;
         | 
| 130 | 
            +
                seqLen.matchLength = seq->mlBase + MINMATCH;
         | 
| 131 | 
            +
                if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
         | 
| 132 | 
            +
                    if (seqStore->longLengthType == ZSTD_llt_literalLength) {
         | 
| 133 | 
            +
                        seqLen.litLength += 0x10000;
         | 
| 134 | 
            +
                    }
         | 
| 135 | 
            +
                    if (seqStore->longLengthType == ZSTD_llt_matchLength) {
         | 
| 136 | 
            +
                        seqLen.matchLength += 0x10000;
         | 
| 137 | 
            +
                    }
         | 
| 138 | 
            +
                }
         | 
| 139 | 
            +
                return seqLen;
         | 
| 140 | 
            +
            }
         | 
| 141 | 
            +
             | 
| 142 | 
            +
            const SeqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx);   /* compress & dictBuilder */
         | 
| 143 | 
            +
            int ZSTD_seqToCodes(const SeqStore_t* seqStorePtr);   /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
         | 
| 144 | 
            +
             | 
| 145 | 
            +
             | 
| 85 146 | 
             
            /***********************************************
         | 
| 86 147 | 
             
            *  Entropy buffer statistics structs and funcs *
         | 
| 87 148 | 
             
            ***********************************************/
         | 
| @@ -91,7 +152,7 @@ typedef struct { | |
| 91 152 | 
             
             *  hufDesSize refers to the size of huffman tree description in bytes.
         | 
| 92 153 | 
             
             *  This metadata is populated in ZSTD_buildBlockEntropyStats_literals() */
         | 
| 93 154 | 
             
            typedef struct {
         | 
| 94 | 
            -
                 | 
| 155 | 
            +
                SymbolEncodingType_e hType;
         | 
| 95 156 | 
             
                BYTE hufDesBuffer[ZSTD_MAX_HUF_HEADER_SIZE];
         | 
| 96 157 | 
             
                size_t hufDesSize;
         | 
| 97 158 | 
             
            } ZSTD_hufCTablesMetadata_t;
         | 
| @@ -102,9 +163,9 @@ typedef struct { | |
| 102 163 | 
             
             *  fseTablesSize refers to the size of fse tables in bytes.
         | 
| 103 164 | 
             
             *  This metadata is populated in ZSTD_buildBlockEntropyStats_sequences() */
         | 
| 104 165 | 
             
            typedef struct {
         | 
| 105 | 
            -
                 | 
| 106 | 
            -
                 | 
| 107 | 
            -
                 | 
| 166 | 
            +
                SymbolEncodingType_e llType;
         | 
| 167 | 
            +
                SymbolEncodingType_e ofType;
         | 
| 168 | 
            +
                SymbolEncodingType_e mlType;
         | 
| 108 169 | 
             
                BYTE fseTablesBuffer[ZSTD_MAX_FSE_HEADERS_SIZE];
         | 
| 109 170 | 
             
                size_t fseTablesSize;
         | 
| 110 171 | 
             
                size_t lastCountSize; /* This is to account for bug in 1.3.4. More detail in ZSTD_entropyCompressSeqStore_internal() */
         | 
| @@ -119,7 +180,7 @@ typedef struct { | |
| 119 180 | 
             
             *  Builds entropy for the block.
         | 
| 120 181 | 
             
             *  @return : 0 on success or error code */
         | 
| 121 182 | 
             
            size_t ZSTD_buildBlockEntropyStats(
         | 
| 122 | 
            -
                                const  | 
| 183 | 
            +
                                const SeqStore_t* seqStorePtr,
         | 
| 123 184 | 
             
                                const ZSTD_entropyCTables_t* prevEntropy,
         | 
| 124 185 | 
             
                                      ZSTD_entropyCTables_t* nextEntropy,
         | 
| 125 186 | 
             
                                const ZSTD_CCtx_params* cctxParams,
         | 
| @@ -148,15 +209,9 @@ typedef struct { | |
| 148 209 | 
             
                                       stopped. posInSequence <= seq[pos].litLength + seq[pos].matchLength */
         | 
| 149 210 | 
             
              size_t size;          /* The number of sequences. <= capacity. */
         | 
| 150 211 | 
             
              size_t capacity;      /* The capacity starting from `seq` pointer */
         | 
| 151 | 
            -
            }  | 
| 212 | 
            +
            } RawSeqStore_t;
         | 
| 152 213 |  | 
| 153 | 
            -
             | 
| 154 | 
            -
                U32 idx;            /* Index in array of ZSTD_Sequence */
         | 
| 155 | 
            -
                U32 posInSequence;  /* Position within sequence at idx */
         | 
| 156 | 
            -
                size_t posInSrc;    /* Number of bytes given by sequences provided so far */
         | 
| 157 | 
            -
            } ZSTD_sequencePosition;
         | 
| 158 | 
            -
             | 
| 159 | 
            -
            UNUSED_ATTR static const rawSeqStore_t kNullRawSeqStore = {NULL, 0, 0, 0, 0};
         | 
| 214 | 
            +
            UNUSED_ATTR static const RawSeqStore_t kNullRawSeqStore = {NULL, 0, 0, 0, 0};
         | 
| 160 215 |  | 
| 161 216 | 
             
            typedef struct {
         | 
| 162 217 | 
             
                int price;  /* price from beginning of segment to this position */
         | 
| @@ -188,7 +243,7 @@ typedef struct { | |
| 188 243 | 
             
                U32  offCodeSumBasePrice;    /* to compare to log2(offreq)  */
         | 
| 189 244 | 
             
                ZSTD_OptPrice_e priceType;   /* prices can be determined dynamically, or follow a pre-defined cost structure */
         | 
| 190 245 | 
             
                const ZSTD_entropyCTables_t* symbolCosts;  /* pre-calculated dictionary statistics */
         | 
| 191 | 
            -
                 | 
| 246 | 
            +
                ZSTD_ParamSwitch_e literalCompressionMode;
         | 
| 192 247 | 
             
            } optState_t;
         | 
| 193 248 |  | 
| 194 249 | 
             
            typedef struct {
         | 
| @@ -210,11 +265,11 @@ typedef struct { | |
| 210 265 |  | 
| 211 266 | 
             
            #define ZSTD_WINDOW_START_INDEX 2
         | 
| 212 267 |  | 
| 213 | 
            -
            typedef struct  | 
| 268 | 
            +
            typedef struct ZSTD_MatchState_t ZSTD_MatchState_t;
         | 
| 214 269 |  | 
| 215 270 | 
             
            #define ZSTD_ROW_HASH_CACHE_SIZE 8       /* Size of prefetching hash cache for row-based matchfinder */
         | 
| 216 271 |  | 
| 217 | 
            -
            struct  | 
| 272 | 
            +
            struct ZSTD_MatchState_t {
         | 
| 218 273 | 
             
                ZSTD_window_t window;   /* State for window round buffer management */
         | 
| 219 274 | 
             
                U32 loadedDictEnd;      /* index of end of dictionary, within context's referential.
         | 
| 220 275 | 
             
                                         * When loadedDictEnd != 0, a dictionary is in use, and still valid.
         | 
| @@ -236,15 +291,15 @@ struct ZSTD_matchState_t { | |
| 236 291 | 
             
                U32* hashTable3;
         | 
| 237 292 | 
             
                U32* chainTable;
         | 
| 238 293 |  | 
| 239 | 
            -
                 | 
| 294 | 
            +
                int forceNonContiguous; /* Non-zero if we should force non-contiguous load for the next window update. */
         | 
| 240 295 |  | 
| 241 296 | 
             
                int dedicatedDictSearch;  /* Indicates whether this matchState is using the
         | 
| 242 297 | 
             
                                           * dedicated dictionary search structure.
         | 
| 243 298 | 
             
                                           */
         | 
| 244 299 | 
             
                optState_t opt;         /* optimal parser state */
         | 
| 245 | 
            -
                const  | 
| 300 | 
            +
                const ZSTD_MatchState_t* dictMatchState;
         | 
| 246 301 | 
             
                ZSTD_compressionParameters cParams;
         | 
| 247 | 
            -
                const  | 
| 302 | 
            +
                const RawSeqStore_t* ldmSeqStore;
         | 
| 248 303 |  | 
| 249 304 | 
             
                /* Controls prefetching in some dictMatchState matchfinders.
         | 
| 250 305 | 
             
                 * This behavior is controlled from the cctx ms.
         | 
| @@ -262,7 +317,7 @@ struct ZSTD_matchState_t { | |
| 262 317 | 
             
            typedef struct {
         | 
| 263 318 | 
             
                ZSTD_compressedBlockState_t* prevCBlock;
         | 
| 264 319 | 
             
                ZSTD_compressedBlockState_t* nextCBlock;
         | 
| 265 | 
            -
                 | 
| 320 | 
            +
                ZSTD_MatchState_t matchState;
         | 
| 266 321 | 
             
            } ZSTD_blockState_t;
         | 
| 267 322 |  | 
| 268 323 | 
             
            typedef struct {
         | 
| @@ -289,7 +344,7 @@ typedef struct { | |
| 289 344 | 
             
            } ldmState_t;
         | 
| 290 345 |  | 
| 291 346 | 
             
            typedef struct {
         | 
| 292 | 
            -
                 | 
| 347 | 
            +
                ZSTD_ParamSwitch_e enableLdm; /* ZSTD_ps_enable to enable LDM. ZSTD_ps_auto by default */
         | 
| 293 348 | 
             
                U32 hashLog;            /* Log size of hashTable */
         | 
| 294 349 | 
             
                U32 bucketSizeLog;      /* Log bucket size for collision resolution, at most 8 */
         | 
| 295 350 | 
             
                U32 minMatchLength;     /* Minimum match length */
         | 
| @@ -320,7 +375,7 @@ struct ZSTD_CCtx_params_s { | |
| 320 375 | 
             
                                            * There is no guarantee that hint is close to actual source size */
         | 
| 321 376 |  | 
| 322 377 | 
             
                ZSTD_dictAttachPref_e attachDictPref;
         | 
| 323 | 
            -
                 | 
| 378 | 
            +
                ZSTD_ParamSwitch_e literalCompressionMode;
         | 
| 324 379 |  | 
| 325 380 | 
             
                /* Multithreading: used to pass parameters to mtctx */
         | 
| 326 381 | 
             
                int nbWorkers;
         | 
| @@ -339,14 +394,27 @@ struct ZSTD_CCtx_params_s { | |
| 339 394 | 
             
                ZSTD_bufferMode_e outBufferMode;
         | 
| 340 395 |  | 
| 341 396 | 
             
                /* Sequence compression API */
         | 
| 342 | 
            -
                 | 
| 397 | 
            +
                ZSTD_SequenceFormat_e blockDelimiters;
         | 
| 343 398 | 
             
                int validateSequences;
         | 
| 344 399 |  | 
| 345 | 
            -
                /* Block splitting | 
| 346 | 
            -
             | 
| 400 | 
            +
                /* Block splitting
         | 
| 401 | 
            +
                 * @postBlockSplitter executes split analysis after sequences are produced,
         | 
| 402 | 
            +
                 * it's more accurate but consumes more resources.
         | 
| 403 | 
            +
                 * @preBlockSplitter_level splits before knowing sequences,
         | 
| 404 | 
            +
                 * it's more approximative but also cheaper.
         | 
| 405 | 
            +
                 * Valid @preBlockSplitter_level values range from 0 to 6 (included).
         | 
| 406 | 
            +
                 * 0 means auto, 1 means do not split,
         | 
| 407 | 
            +
                 * then levels are sorted in increasing cpu budget, from 2 (fastest) to 6 (slowest).
         | 
| 408 | 
            +
                 * Highest @preBlockSplitter_level combines well with @postBlockSplitter.
         | 
| 409 | 
            +
                 */
         | 
| 410 | 
            +
                ZSTD_ParamSwitch_e postBlockSplitter;
         | 
| 411 | 
            +
                int preBlockSplitter_level;
         | 
| 412 | 
            +
             | 
| 413 | 
            +
                /* Adjust the max block size*/
         | 
| 414 | 
            +
                size_t maxBlockSize;
         | 
| 347 415 |  | 
| 348 416 | 
             
                /* Param for deciding whether to use row-based matchfinder */
         | 
| 349 | 
            -
                 | 
| 417 | 
            +
                ZSTD_ParamSwitch_e useRowMatchFinder;
         | 
| 350 418 |  | 
| 351 419 | 
             
                /* Always load a dictionary in ext-dict mode (not prefix mode)? */
         | 
| 352 420 | 
             
                int deterministicRefPrefix;
         | 
| @@ -355,7 +423,7 @@ struct ZSTD_CCtx_params_s { | |
| 355 423 | 
             
                ZSTD_customMem customMem;
         | 
| 356 424 |  | 
| 357 425 | 
             
                /* Controls prefetching in some dictMatchState matchfinders */
         | 
| 358 | 
            -
                 | 
| 426 | 
            +
                ZSTD_ParamSwitch_e prefetchCDictTables;
         | 
| 359 427 |  | 
| 360 428 | 
             
                /* Controls whether zstd will fall back to an internal matchfinder
         | 
| 361 429 | 
             
                 * if the external matchfinder returns an error code. */
         | 
| @@ -367,15 +435,13 @@ struct ZSTD_CCtx_params_s { | |
| 367 435 | 
             
                void* extSeqProdState;
         | 
| 368 436 | 
             
                ZSTD_sequenceProducer_F extSeqProdFunc;
         | 
| 369 437 |  | 
| 370 | 
            -
                /* Adjust the max block size*/
         | 
| 371 | 
            -
                size_t maxBlockSize;
         | 
| 372 | 
            -
             | 
| 373 438 | 
             
                /* Controls repcode search in external sequence parsing */
         | 
| 374 | 
            -
                 | 
| 439 | 
            +
                ZSTD_ParamSwitch_e searchForExternalRepcodes;
         | 
| 375 440 | 
             
            };  /* typedef'd to ZSTD_CCtx_params within "zstd.h" */
         | 
| 376 441 |  | 
| 377 442 | 
             
            #define COMPRESS_SEQUENCES_WORKSPACE_SIZE (sizeof(unsigned) * (MaxSeq + 2))
         | 
| 378 443 | 
             
            #define ENTROPY_WORKSPACE_SIZE (HUF_WORKSPACE_SIZE + COMPRESS_SEQUENCES_WORKSPACE_SIZE)
         | 
| 444 | 
            +
            #define TMP_WORKSPACE_SIZE (MAX(ENTROPY_WORKSPACE_SIZE, ZSTD_SLIPBLOCK_WORKSPACESIZE))
         | 
| 379 445 |  | 
| 380 446 | 
             
            /**
         | 
| 381 447 | 
             
             * Indicates whether this compression proceeds directly from user-provided
         | 
| @@ -393,11 +459,11 @@ typedef enum { | |
| 393 459 | 
             
             */
         | 
| 394 460 | 
             
            #define ZSTD_MAX_NB_BLOCK_SPLITS 196
         | 
| 395 461 | 
             
            typedef struct {
         | 
| 396 | 
            -
                 | 
| 397 | 
            -
                 | 
| 398 | 
            -
                 | 
| 399 | 
            -
                 | 
| 400 | 
            -
                 | 
| 462 | 
            +
                SeqStore_t fullSeqStoreChunk;
         | 
| 463 | 
            +
                SeqStore_t firstHalfSeqStore;
         | 
| 464 | 
            +
                SeqStore_t secondHalfSeqStore;
         | 
| 465 | 
            +
                SeqStore_t currSeqStore;
         | 
| 466 | 
            +
                SeqStore_t nextSeqStore;
         | 
| 401 467 |  | 
| 402 468 | 
             
                U32 partitions[ZSTD_MAX_NB_BLOCK_SPLITS];
         | 
| 403 469 | 
             
                ZSTD_entropyCTablesMetadata_t entropyMetadata;
         | 
| @@ -414,7 +480,7 @@ struct ZSTD_CCtx_s { | |
| 414 480 | 
             
                size_t dictContentSize;
         | 
| 415 481 |  | 
| 416 482 | 
             
                ZSTD_cwksp workspace; /* manages buffer for dynamic allocations */
         | 
| 417 | 
            -
                size_t  | 
| 483 | 
            +
                size_t blockSizeMax;
         | 
| 418 484 | 
             
                unsigned long long pledgedSrcSizePlusOne;  /* this way, 0 (default) == unknown */
         | 
| 419 485 | 
             
                unsigned long long consumedSrcSize;
         | 
| 420 486 | 
             
                unsigned long long producedCSize;
         | 
| @@ -426,13 +492,14 @@ struct ZSTD_CCtx_s { | |
| 426 492 | 
             
                int isFirstBlock;
         | 
| 427 493 | 
             
                int initialized;
         | 
| 428 494 |  | 
| 429 | 
            -
                 | 
| 495 | 
            +
                SeqStore_t seqStore;      /* sequences storage ptrs */
         | 
| 430 496 | 
             
                ldmState_t ldmState;      /* long distance matching state */
         | 
| 431 497 | 
             
                rawSeq* ldmSequences;     /* Storage for the ldm output sequences */
         | 
| 432 498 | 
             
                size_t maxNbLdmSequences;
         | 
| 433 | 
            -
                 | 
| 499 | 
            +
                RawSeqStore_t externSeqStore; /* Mutable reference to external sequences */
         | 
| 434 500 | 
             
                ZSTD_blockState_t blockState;
         | 
| 435 | 
            -
                 | 
| 501 | 
            +
                void* tmpWorkspace;  /* used as substitute of stack space - must be aligned for S64 type */
         | 
| 502 | 
            +
                size_t tmpWkspSize;
         | 
| 436 503 |  | 
| 437 504 | 
             
                /* Whether we are streaming or not */
         | 
| 438 505 | 
             
                ZSTD_buffered_policy_e bufferedPolicy;
         | 
| @@ -506,12 +573,12 @@ typedef enum { | |
| 506 573 | 
             
                                             * behavior of taking both the source size and the dict size into account
         | 
| 507 574 | 
             
                                             * when selecting and adjusting parameters.
         | 
| 508 575 | 
             
                                             */
         | 
| 509 | 
            -
            }  | 
| 576 | 
            +
            } ZSTD_CParamMode_e;
         | 
| 510 577 |  | 
| 511 | 
            -
            typedef size_t (* | 
| 512 | 
            -
                     | 
| 578 | 
            +
            typedef size_t (*ZSTD_BlockCompressor_f) (
         | 
| 579 | 
            +
                    ZSTD_MatchState_t* bs, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 513 580 | 
             
                    void const* src, size_t srcSize);
         | 
| 514 | 
            -
             | 
| 581 | 
            +
            ZSTD_BlockCompressor_f ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_ParamSwitch_e rowMatchfinderMode, ZSTD_dictMode_e dictMode);
         | 
| 515 582 |  | 
| 516 583 |  | 
| 517 584 | 
             
            MEM_STATIC U32 ZSTD_LLcode(U32 litLength)
         | 
| @@ -557,6 +624,25 @@ MEM_STATIC int ZSTD_cParam_withinBounds(ZSTD_cParameter cParam, int value) | |
| 557 624 | 
             
                return 1;
         | 
| 558 625 | 
             
            }
         | 
| 559 626 |  | 
| 627 | 
            +
            /* ZSTD_selectAddr:
         | 
| 628 | 
            +
             * @return index >= lowLimit ? candidate : backup,
         | 
| 629 | 
            +
             * tries to force branchless codegen. */
         | 
| 630 | 
            +
            MEM_STATIC const BYTE*
         | 
| 631 | 
            +
            ZSTD_selectAddr(U32 index, U32 lowLimit, const BYTE* candidate, const BYTE* backup)
         | 
| 632 | 
            +
            {
         | 
| 633 | 
            +
            #if defined(__GNUC__) && defined(__x86_64__)
         | 
| 634 | 
            +
                __asm__ (
         | 
| 635 | 
            +
                    "cmp %1, %2\n"
         | 
| 636 | 
            +
                    "cmova %3, %0\n"
         | 
| 637 | 
            +
                    : "+r"(candidate)
         | 
| 638 | 
            +
                    : "r"(index), "r"(lowLimit), "r"(backup)
         | 
| 639 | 
            +
                    );
         | 
| 640 | 
            +
                return candidate;
         | 
| 641 | 
            +
            #else
         | 
| 642 | 
            +
                return index >= lowLimit ? candidate : backup;
         | 
| 643 | 
            +
            #endif
         | 
| 644 | 
            +
            }
         | 
| 645 | 
            +
             | 
| 560 646 | 
             
            /* ZSTD_noCompressBlock() :
         | 
| 561 647 | 
             
             * Writes uncompressed block to dst buffer from given src.
         | 
| 562 648 | 
             
             * Returns the size of the block */
         | 
| @@ -639,14 +725,55 @@ ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE con | |
| 639 725 | 
             
            #define OFFBASE_TO_OFFSET(o)  (assert(OFFBASE_IS_OFFSET(o)), (o) - ZSTD_REP_NUM)
         | 
| 640 726 | 
             
            #define OFFBASE_TO_REPCODE(o) (assert(OFFBASE_IS_REPCODE(o)), (o))  /* returns ID 1,2,3 */
         | 
| 641 727 |  | 
| 728 | 
            +
            /*! ZSTD_storeSeqOnly() :
         | 
| 729 | 
            +
             *  Store a sequence (litlen, litPtr, offBase and matchLength) into SeqStore_t.
         | 
| 730 | 
            +
             *  Literals themselves are not copied, but @litPtr is updated.
         | 
| 731 | 
            +
             *  @offBase : Users should employ macros REPCODE_TO_OFFBASE() and OFFSET_TO_OFFBASE().
         | 
| 732 | 
            +
             *  @matchLength : must be >= MINMATCH
         | 
| 733 | 
            +
            */
         | 
| 734 | 
            +
            HINT_INLINE UNUSED_ATTR void
         | 
| 735 | 
            +
            ZSTD_storeSeqOnly(SeqStore_t* seqStorePtr,
         | 
| 736 | 
            +
                          size_t litLength,
         | 
| 737 | 
            +
                          U32 offBase,
         | 
| 738 | 
            +
                          size_t matchLength)
         | 
| 739 | 
            +
            {
         | 
| 740 | 
            +
                assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq);
         | 
| 741 | 
            +
             | 
| 742 | 
            +
                /* literal Length */
         | 
| 743 | 
            +
                assert(litLength <= ZSTD_BLOCKSIZE_MAX);
         | 
| 744 | 
            +
                if (UNLIKELY(litLength>0xFFFF)) {
         | 
| 745 | 
            +
                    assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */
         | 
| 746 | 
            +
                    seqStorePtr->longLengthType = ZSTD_llt_literalLength;
         | 
| 747 | 
            +
                    seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
         | 
| 748 | 
            +
                }
         | 
| 749 | 
            +
                seqStorePtr->sequences[0].litLength = (U16)litLength;
         | 
| 750 | 
            +
             | 
| 751 | 
            +
                /* match offset */
         | 
| 752 | 
            +
                seqStorePtr->sequences[0].offBase = offBase;
         | 
| 753 | 
            +
             | 
| 754 | 
            +
                /* match Length */
         | 
| 755 | 
            +
                assert(matchLength <= ZSTD_BLOCKSIZE_MAX);
         | 
| 756 | 
            +
                assert(matchLength >= MINMATCH);
         | 
| 757 | 
            +
                {   size_t const mlBase = matchLength - MINMATCH;
         | 
| 758 | 
            +
                    if (UNLIKELY(mlBase>0xFFFF)) {
         | 
| 759 | 
            +
                        assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */
         | 
| 760 | 
            +
                        seqStorePtr->longLengthType = ZSTD_llt_matchLength;
         | 
| 761 | 
            +
                        seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
         | 
| 762 | 
            +
                    }
         | 
| 763 | 
            +
                    seqStorePtr->sequences[0].mlBase = (U16)mlBase;
         | 
| 764 | 
            +
                }
         | 
| 765 | 
            +
             | 
| 766 | 
            +
                seqStorePtr->sequences++;
         | 
| 767 | 
            +
            }
         | 
| 768 | 
            +
             | 
| 642 769 | 
             
            /*! ZSTD_storeSeq() :
         | 
| 643 | 
            -
             *  Store a sequence (litlen, litPtr, offBase and matchLength) into  | 
| 770 | 
            +
             *  Store a sequence (litlen, litPtr, offBase and matchLength) into SeqStore_t.
         | 
| 644 771 | 
             
             *  @offBase : Users should employ macros REPCODE_TO_OFFBASE() and OFFSET_TO_OFFBASE().
         | 
| 645 772 | 
             
             *  @matchLength : must be >= MINMATCH
         | 
| 646 773 | 
             
             *  Allowed to over-read literals up to litLimit.
         | 
| 647 774 | 
             
            */
         | 
| 648 775 | 
             
            HINT_INLINE UNUSED_ATTR void
         | 
| 649 | 
            -
            ZSTD_storeSeq( | 
| 776 | 
            +
            ZSTD_storeSeq(SeqStore_t* seqStorePtr,
         | 
| 650 777 | 
             
                          size_t litLength, const BYTE* literals, const BYTE* litLimit,
         | 
| 651 778 | 
             
                          U32 offBase,
         | 
| 652 779 | 
             
                          size_t matchLength)
         | 
| @@ -680,29 +807,7 @@ ZSTD_storeSeq(seqStore_t* seqStorePtr, | |
| 680 807 | 
             
                }
         | 
| 681 808 | 
             
                seqStorePtr->lit += litLength;
         | 
| 682 809 |  | 
| 683 | 
            -
                 | 
| 684 | 
            -
                if (litLength>0xFFFF) {
         | 
| 685 | 
            -
                    assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */
         | 
| 686 | 
            -
                    seqStorePtr->longLengthType = ZSTD_llt_literalLength;
         | 
| 687 | 
            -
                    seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
         | 
| 688 | 
            -
                }
         | 
| 689 | 
            -
                seqStorePtr->sequences[0].litLength = (U16)litLength;
         | 
| 690 | 
            -
             | 
| 691 | 
            -
                /* match offset */
         | 
| 692 | 
            -
                seqStorePtr->sequences[0].offBase = offBase;
         | 
| 693 | 
            -
             | 
| 694 | 
            -
                /* match Length */
         | 
| 695 | 
            -
                assert(matchLength >= MINMATCH);
         | 
| 696 | 
            -
                {   size_t const mlBase = matchLength - MINMATCH;
         | 
| 697 | 
            -
                    if (mlBase>0xFFFF) {
         | 
| 698 | 
            -
                        assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */
         | 
| 699 | 
            -
                        seqStorePtr->longLengthType = ZSTD_llt_matchLength;
         | 
| 700 | 
            -
                        seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
         | 
| 701 | 
            -
                    }
         | 
| 702 | 
            -
                    seqStorePtr->sequences[0].mlBase = (U16)mlBase;
         | 
| 703 | 
            -
                }
         | 
| 704 | 
            -
             | 
| 705 | 
            -
                seqStorePtr->sequences++;
         | 
| 810 | 
            +
                ZSTD_storeSeqOnly(seqStorePtr, litLength, offBase, matchLength);
         | 
| 706 811 | 
             
            }
         | 
| 707 812 |  | 
| 708 813 | 
             
            /* ZSTD_updateRep() :
         | 
| @@ -731,12 +836,12 @@ ZSTD_updateRep(U32 rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) | |
| 731 836 |  | 
| 732 837 | 
             
            typedef struct repcodes_s {
         | 
| 733 838 | 
             
                U32 rep[3];
         | 
| 734 | 
            -
            }  | 
| 839 | 
            +
            } Repcodes_t;
         | 
| 735 840 |  | 
| 736 | 
            -
            MEM_STATIC  | 
| 841 | 
            +
            MEM_STATIC Repcodes_t
         | 
| 737 842 | 
             
            ZSTD_newRep(U32 const rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0)
         | 
| 738 843 | 
             
            {
         | 
| 739 | 
            -
                 | 
| 844 | 
            +
                Repcodes_t newReps;
         | 
| 740 845 | 
             
                ZSTD_memcpy(&newReps, rep, sizeof(newReps));
         | 
| 741 846 | 
             
                ZSTD_updateRep(newReps.rep, offBase, ll0);
         | 
| 742 847 | 
             
                return newReps;
         | 
| @@ -779,8 +884,8 @@ ZSTD_count_2segments(const BYTE* ip, const BYTE* match, | |
| 779 884 | 
             
                size_t const matchLength = ZSTD_count(ip, match, vEnd);
         | 
| 780 885 | 
             
                if (match + matchLength != mEnd) return matchLength;
         | 
| 781 886 | 
             
                DEBUGLOG(7, "ZSTD_count_2segments: found a 2-parts match (current length==%zu)", matchLength);
         | 
| 782 | 
            -
                DEBUGLOG(7, "distance from match beginning to end dictionary = % | 
| 783 | 
            -
                DEBUGLOG(7, "distance from current pos to end buffer = % | 
| 887 | 
            +
                DEBUGLOG(7, "distance from match beginning to end dictionary = %i", (int)(mEnd - match));
         | 
| 888 | 
            +
                DEBUGLOG(7, "distance from current pos to end buffer = %i", (int)(iEnd - ip));
         | 
| 784 889 | 
             
                DEBUGLOG(7, "next byte : ip==%02X, istart==%02X", ip[matchLength], *iStart);
         | 
| 785 890 | 
             
                DEBUGLOG(7, "final match length = %zu", matchLength + ZSTD_count(ip+matchLength, iStart, iEnd));
         | 
| 786 891 | 
             
                return matchLength + ZSTD_count(ip+matchLength, iStart, iEnd);
         | 
| @@ -918,11 +1023,12 @@ MEM_STATIC U64 ZSTD_rollingHash_rotate(U64 hash, BYTE toRemove, BYTE toAdd, U64 | |
| 918 1023 | 
             
            /*-*************************************
         | 
| 919 1024 | 
             
            *  Round buffer management
         | 
| 920 1025 | 
             
            ***************************************/
         | 
| 921 | 
            -
             | 
| 922 | 
            -
             | 
| 923 | 
            -
             | 
| 924 | 
            -
             | 
| 925 | 
            -
             | 
| 1026 | 
            +
            /* Max @current value allowed:
         | 
| 1027 | 
            +
             * In 32-bit mode: we want to avoid crossing the 2 GB limit,
         | 
| 1028 | 
            +
             *                 reducing risks of side effects in case of signed operations on indexes.
         | 
| 1029 | 
            +
             * In 64-bit mode: we want to ensure that adding the maximum job size (512 MB)
         | 
| 1030 | 
            +
             *                 doesn't overflow U32 index capacity (4 GB) */
         | 
| 1031 | 
            +
            #define ZSTD_CURRENT_MAX (MEM_64bits() ? 3500U MB : 2000U MB)
         | 
| 926 1032 | 
             
            /* Maximum chunk size before overflow correction needs to be called again */
         | 
| 927 1033 | 
             
            #define ZSTD_CHUNKSIZE_MAX                                                     \
         | 
| 928 1034 | 
             
                ( ((U32)-1)                  /* Maximum ending current index */            \
         | 
| @@ -962,7 +1068,7 @@ MEM_STATIC U32 ZSTD_window_hasExtDict(ZSTD_window_t const window) | |
| 962 1068 | 
             
             * Inspects the provided matchState and figures out what dictMode should be
         | 
| 963 1069 | 
             
             * passed to the compressor.
         | 
| 964 1070 | 
             
             */
         | 
| 965 | 
            -
            MEM_STATIC ZSTD_dictMode_e ZSTD_matchState_dictMode(const  | 
| 1071 | 
            +
            MEM_STATIC ZSTD_dictMode_e ZSTD_matchState_dictMode(const ZSTD_MatchState_t *ms)
         | 
| 966 1072 | 
             
            {
         | 
| 967 1073 | 
             
                return ZSTD_window_hasExtDict(ms->window) ?
         | 
| 968 1074 | 
             
                    ZSTD_extDict :
         | 
| @@ -1151,7 +1257,7 @@ ZSTD_window_enforceMaxDist(ZSTD_window_t* window, | |
| 1151 1257 | 
             
                                 const void* blockEnd,
         | 
| 1152 1258 | 
             
                                       U32   maxDist,
         | 
| 1153 1259 | 
             
                                       U32*  loadedDictEndPtr,
         | 
| 1154 | 
            -
                                 const  | 
| 1260 | 
            +
                                 const ZSTD_MatchState_t** dictMatchStatePtr)
         | 
| 1155 1261 | 
             
            {
         | 
| 1156 1262 | 
             
                U32 const blockEndIdx = (U32)((BYTE const*)blockEnd - window->base);
         | 
| 1157 1263 | 
             
                U32 const loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0;
         | 
| @@ -1196,7 +1302,7 @@ ZSTD_checkDictValidity(const ZSTD_window_t* window, | |
| 1196 1302 | 
             
                                   const void* blockEnd,
         | 
| 1197 1303 | 
             
                                         U32   maxDist,
         | 
| 1198 1304 | 
             
                                         U32*  loadedDictEndPtr,
         | 
| 1199 | 
            -
                                   const  | 
| 1305 | 
            +
                                   const ZSTD_MatchState_t** dictMatchStatePtr)
         | 
| 1200 1306 | 
             
            {
         | 
| 1201 1307 | 
             
                assert(loadedDictEndPtr != NULL);
         | 
| 1202 1308 | 
             
                assert(dictMatchStatePtr != NULL);
         | 
| @@ -1246,8 +1352,8 @@ MEM_STATIC void ZSTD_window_init(ZSTD_window_t* window) { | |
| 1246 1352 | 
             
            MEM_STATIC
         | 
| 1247 1353 | 
             
            ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
         | 
| 1248 1354 | 
             
            U32 ZSTD_window_update(ZSTD_window_t* window,
         | 
| 1249 | 
            -
             | 
| 1250 | 
            -
             | 
| 1355 | 
            +
                             const void* src, size_t srcSize,
         | 
| 1356 | 
            +
                                   int forceNonContiguous)
         | 
| 1251 1357 | 
             
            {
         | 
| 1252 1358 | 
             
                BYTE const* const ip = (BYTE const*)src;
         | 
| 1253 1359 | 
             
                U32 contiguous = 1;
         | 
| @@ -1274,8 +1380,9 @@ U32 ZSTD_window_update(ZSTD_window_t* window, | |
| 1274 1380 | 
             
                /* if input and dictionary overlap : reduce dictionary (area presumed modified by input) */
         | 
| 1275 1381 | 
             
                if ( (ip+srcSize > window->dictBase + window->lowLimit)
         | 
| 1276 1382 | 
             
                   & (ip < window->dictBase + window->dictLimit)) {
         | 
| 1277 | 
            -
                     | 
| 1278 | 
            -
                    U32 const lowLimitMax = (highInputIdx > ( | 
| 1383 | 
            +
                    size_t const highInputIdx = (size_t)((ip + srcSize) - window->dictBase);
         | 
| 1384 | 
            +
                    U32 const lowLimitMax = (highInputIdx > (size_t)window->dictLimit) ? window->dictLimit : (U32)highInputIdx;
         | 
| 1385 | 
            +
                    assert(highInputIdx < UINT_MAX);
         | 
| 1279 1386 | 
             
                    window->lowLimit = lowLimitMax;
         | 
| 1280 1387 | 
             
                    DEBUGLOG(5, "Overlapping extDict and input : new lowLimit = %u", window->lowLimit);
         | 
| 1281 1388 | 
             
                }
         | 
| @@ -1285,7 +1392,7 @@ U32 ZSTD_window_update(ZSTD_window_t* window, | |
| 1285 1392 | 
             
            /**
         | 
| 1286 1393 | 
             
             * Returns the lowest allowed match index. It may either be in the ext-dict or the prefix.
         | 
| 1287 1394 | 
             
             */
         | 
| 1288 | 
            -
            MEM_STATIC U32 ZSTD_getLowestMatchIndex(const  | 
| 1395 | 
            +
            MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_MatchState_t* ms, U32 curr, unsigned windowLog)
         | 
| 1289 1396 | 
             
            {
         | 
| 1290 1397 | 
             
                U32 const maxDistance = 1U << windowLog;
         | 
| 1291 1398 | 
             
                U32 const lowestValid = ms->window.lowLimit;
         | 
| @@ -1302,7 +1409,7 @@ MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_matchState_t* ms, U32 curr, u | |
| 1302 1409 | 
             
            /**
         | 
| 1303 1410 | 
             
             * Returns the lowest allowed match index in the prefix.
         | 
| 1304 1411 | 
             
             */
         | 
| 1305 | 
            -
            MEM_STATIC U32 ZSTD_getLowestPrefixIndex(const  | 
| 1412 | 
            +
            MEM_STATIC U32 ZSTD_getLowestPrefixIndex(const ZSTD_MatchState_t* ms, U32 curr, unsigned windowLog)
         | 
| 1306 1413 | 
             
            {
         | 
| 1307 1414 | 
             
                U32    const maxDistance = 1U << windowLog;
         | 
| 1308 1415 | 
             
                U32    const lowestValid = ms->window.dictLimit;
         | 
| @@ -1315,6 +1422,13 @@ MEM_STATIC U32 ZSTD_getLowestPrefixIndex(const ZSTD_matchState_t* ms, U32 curr, | |
| 1315 1422 | 
             
                return matchLowest;
         | 
| 1316 1423 | 
             
            }
         | 
| 1317 1424 |  | 
| 1425 | 
            +
            /* index_safety_check:
         | 
| 1426 | 
            +
             * intentional underflow : ensure repIndex isn't overlapping dict + prefix
         | 
| 1427 | 
            +
             * @return 1 if values are not overlapping,
         | 
| 1428 | 
            +
             * 0 otherwise */
         | 
| 1429 | 
            +
            MEM_STATIC int ZSTD_index_overlap_check(const U32 prefixLowestIndex, const U32 repIndex) {
         | 
| 1430 | 
            +
                return ((U32)((prefixLowestIndex-1)  - repIndex) >= 3);
         | 
| 1431 | 
            +
            }
         | 
| 1318 1432 |  | 
| 1319 1433 |  | 
| 1320 1434 | 
             
            /* debug functions */
         | 
| @@ -1385,10 +1499,6 @@ MEM_STATIC int ZSTD_comparePackedTags(size_t packedTag1, size_t packedTag2) { | |
| 1385 1499 | 
             
                return tag1 == tag2;
         | 
| 1386 1500 | 
             
            }
         | 
| 1387 1501 |  | 
| 1388 | 
            -
            #if defined (__cplusplus)
         | 
| 1389 | 
            -
            }
         | 
| 1390 | 
            -
            #endif
         | 
| 1391 | 
            -
             | 
| 1392 1502 | 
             
            /* ===============================================================
         | 
| 1393 1503 | 
             
             * Shared internal declarations
         | 
| 1394 1504 | 
             
             * These prototypes may be called from sources not in lib/compress
         | 
| @@ -1404,6 +1514,25 @@ size_t ZSTD_loadCEntropy(ZSTD_compressedBlockState_t* bs, void* workspace, | |
| 1404 1514 |  | 
| 1405 1515 | 
             
            void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs);
         | 
| 1406 1516 |  | 
| 1517 | 
            +
            typedef struct {
         | 
| 1518 | 
            +
                U32 idx;            /* Index in array of ZSTD_Sequence */
         | 
| 1519 | 
            +
                U32 posInSequence;  /* Position within sequence at idx */
         | 
| 1520 | 
            +
                size_t posInSrc;    /* Number of bytes given by sequences provided so far */
         | 
| 1521 | 
            +
            } ZSTD_SequencePosition;
         | 
| 1522 | 
            +
             | 
| 1523 | 
            +
            /* for benchmark */
         | 
| 1524 | 
            +
            size_t ZSTD_convertBlockSequences(ZSTD_CCtx* cctx,
         | 
| 1525 | 
            +
                                    const ZSTD_Sequence* const inSeqs, size_t nbSequences,
         | 
| 1526 | 
            +
                                    int const repcodeResolution);
         | 
| 1527 | 
            +
             | 
| 1528 | 
            +
            typedef struct {
         | 
| 1529 | 
            +
                size_t nbSequences;
         | 
| 1530 | 
            +
                size_t blockSize;
         | 
| 1531 | 
            +
                size_t litSize;
         | 
| 1532 | 
            +
            } BlockSummary;
         | 
| 1533 | 
            +
             | 
| 1534 | 
            +
            BlockSummary ZSTD_get1BlockSummary(const ZSTD_Sequence* seqs, size_t nbSeqs);
         | 
| 1535 | 
            +
             | 
| 1407 1536 | 
             
            /* ==============================================================
         | 
| 1408 1537 | 
             
             * Private declarations
         | 
| 1409 1538 | 
             
             * These prototypes shall only be called from within lib/compress
         | 
| @@ -1415,7 +1544,7 @@ void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs); | |
| 1415 1544 | 
             
             * Note: srcSizeHint == 0 means 0!
         | 
| 1416 1545 | 
             
             */
         | 
| 1417 1546 | 
             
            ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams(
         | 
| 1418 | 
            -
                    const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize,  | 
| 1547 | 
            +
                    const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize, ZSTD_CParamMode_e mode);
         | 
| 1419 1548 |  | 
| 1420 1549 | 
             
            /*! ZSTD_initCStream_internal() :
         | 
| 1421 1550 | 
             
             *  Private use only. Init streaming operation.
         | 
| @@ -1427,7 +1556,7 @@ size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs, | |
| 1427 1556 | 
             
                                 const ZSTD_CDict* cdict,
         | 
| 1428 1557 | 
             
                                 const ZSTD_CCtx_params* params, unsigned long long pledgedSrcSize);
         | 
| 1429 1558 |  | 
| 1430 | 
            -
            void ZSTD_resetSeqStore( | 
| 1559 | 
            +
            void ZSTD_resetSeqStore(SeqStore_t* ssPtr);
         | 
| 1431 1560 |  | 
| 1432 1561 | 
             
            /*! ZSTD_getCParamsFromCDict() :
         | 
| 1433 1562 | 
             
             *  as the name implies */
         | 
| @@ -1480,33 +1609,6 @@ U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat); | |
| 1480 1609 | 
             
             */
         | 
| 1481 1610 | 
             
            void ZSTD_CCtx_trace(ZSTD_CCtx* cctx, size_t extraCSize);
         | 
| 1482 1611 |  | 
| 1483 | 
            -
            /* Returns 0 on success, and a ZSTD_error otherwise. This function scans through an array of
         | 
| 1484 | 
            -
             * ZSTD_Sequence, storing the sequences it finds, until it reaches a block delimiter.
         | 
| 1485 | 
            -
             * Note that the block delimiter must include the last literals of the block.
         | 
| 1486 | 
            -
             */
         | 
| 1487 | 
            -
            size_t
         | 
| 1488 | 
            -
            ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx,
         | 
| 1489 | 
            -
                                                          ZSTD_sequencePosition* seqPos,
         | 
| 1490 | 
            -
                                                    const ZSTD_Sequence* const inSeqs, size_t inSeqsSize,
         | 
| 1491 | 
            -
                                                    const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch);
         | 
| 1492 | 
            -
             | 
| 1493 | 
            -
            /* Returns the number of bytes to move the current read position back by.
         | 
| 1494 | 
            -
             * Only non-zero if we ended up splitting a sequence.
         | 
| 1495 | 
            -
             * Otherwise, it may return a ZSTD error if something went wrong.
         | 
| 1496 | 
            -
             *
         | 
| 1497 | 
            -
             * This function will attempt to scan through blockSize bytes
         | 
| 1498 | 
            -
             * represented by the sequences in @inSeqs,
         | 
| 1499 | 
            -
             * storing any (partial) sequences.
         | 
| 1500 | 
            -
             *
         | 
| 1501 | 
            -
             * Occasionally, we may want to change the actual number of bytes we consumed from inSeqs to
         | 
| 1502 | 
            -
             * avoid splitting a match, or to avoid splitting a match such that it would produce a match
         | 
| 1503 | 
            -
             * smaller than MINMATCH. In this case, we return the number of bytes that we didn't read from this block.
         | 
| 1504 | 
            -
             */
         | 
| 1505 | 
            -
            size_t
         | 
| 1506 | 
            -
            ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos,
         | 
| 1507 | 
            -
                                               const ZSTD_Sequence* const inSeqs, size_t inSeqsSize,
         | 
| 1508 | 
            -
                                               const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch);
         | 
| 1509 | 
            -
             | 
| 1510 1612 | 
             
            /* Returns 1 if an external sequence producer is registered, otherwise returns 0. */
         | 
| 1511 1613 | 
             
            MEM_STATIC int ZSTD_hasExtSeqProd(const ZSTD_CCtx_params* params) {
         | 
| 1512 1614 | 
             
                return params->extSeqProdFunc != NULL;
         | 
| @@ -140,7 +140,7 @@ size_t ZSTD_compressLiterals ( | |
| 140 140 | 
             
                size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB);
         | 
| 141 141 | 
             
                BYTE*  const ostart = (BYTE*)dst;
         | 
| 142 142 | 
             
                U32 singleStream = srcSize < 256;
         | 
| 143 | 
            -
                 | 
| 143 | 
            +
                SymbolEncodingType_e hType = set_compressed;
         | 
| 144 144 | 
             
                size_t cLitSize;
         | 
| 145 145 |  | 
| 146 146 | 
             
                DEBUGLOG(5,"ZSTD_compressLiterals (disableLiteralCompression=%i, srcSize=%u, dstCapacity=%zu)",
         |