zstdlib 0.8.0-x64-mingw32 → 0.9.0-x64-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 +10 -0
- data/README.md +7 -1
- data/Rakefile +38 -8
- data/ext/{zstdlib → zstdlib_c}/extconf.rb +10 -5
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.2/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.3/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.4/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.5/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.6/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.7/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-3.0/zstdlib.c +2 -2
- data/ext/zstdlib_c/ruby/zlib-3.1/zstdlib.c +5076 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/adler32.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/compress.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/crc32.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/crc32.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/deflate.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/deflate.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzclose.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzguts.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzlib.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzread.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzwrite.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/infback.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffast.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffast.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffixed.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inflate.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inflate.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inftrees.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inftrees.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/trees.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/trees.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/uncompr.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zconf.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zlib.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zutil.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zutil.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib.mk +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlibwrapper/zlibwrapper.c +1 -5
- data/ext/{zstdlib → zstdlib_c}/zlibwrapper.mk +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/bitstream.h +24 -9
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/compiler.h +89 -43
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/cpu.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/debug.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/debug.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/entropy_common.c +11 -5
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/error_private.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/error_private.h +79 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/fse.h +2 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/fse_decompress.c +1 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/huf.h +24 -22
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/mem.h +18 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/pool.c +11 -6
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/pool.h +2 -2
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/portability_macros.h +137 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/threading.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/threading.h +0 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/xxhash.c +24 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/xxhash.h +5686 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_common.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_deps.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_internal.h +95 -92
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_trace.h +12 -3
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/clevels.h +134 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/fse_compress.c +63 -27
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/hist.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/hist.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/huf_compress.c +537 -104
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress.c +307 -373
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_internal.h +174 -83
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_literals.c +4 -3
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_literals.h +3 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_sequences.c +15 -14
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_sequences.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_superblock.c +4 -3
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_superblock.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_cwksp.h +41 -27
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_double_fast.c +295 -120
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_double_fast.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_fast.c +309 -130
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_fast.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_lazy.c +482 -562
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_lazy.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm.c +9 -7
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm.h +1 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm_geartab.h +4 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_opt.c +249 -148
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_opt.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstdmt_compress.c +76 -38
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstdmt_compress.h +4 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/huf_decompress.c +727 -189
- data/ext/zstdlib_c/zstd-1.5.2/lib/decompress/huf_decompress_amd64.S +585 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_ddict.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_ddict.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress.c +85 -22
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_block.c +744 -220
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_block.h +8 -2
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_internal.h +34 -3
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/zdict.h +4 -4
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/zstd.h +179 -136
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/zstd_errors.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzclose.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzcompatibility.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzguts.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzlib.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzread.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzwrite.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/zstd_zlibwrapper.c +7 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/zstd_zlibwrapper.h +0 -0
- data/ext/zstdlib_c/zstd.mk +15 -0
- 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/zstdlib.rb +2 -2
- metadata +124 -121
- data/ext/zstdlib/zstd-1.5.0/lib/common/xxhash.c +0 -824
- data/ext/zstdlib/zstd-1.5.0/lib/common/xxhash.h +0 -285
- data/ext/zstdlib/zstd.mk +0 -14
- data/lib/2.2/zstdlib.so +0 -0
- data/lib/2.3/zstdlib.so +0 -0
- data/lib/2.4/zstdlib.so +0 -0
- data/lib/2.5/zstdlib.so +0 -0
- data/lib/2.6/zstdlib.so +0 -0
- data/lib/2.7/zstdlib.so +0 -0
| @@ -12,7 +12,6 @@ | |
| 12 12 | 
             
            *  Dependencies
         | 
| 13 13 | 
             
            ***************************************/
         | 
| 14 14 | 
             
            #include "../common/zstd_deps.h"  /* INT_MAX, ZSTD_memset, ZSTD_memcpy */
         | 
| 15 | 
            -
            #include "../common/cpu.h"
         | 
| 16 15 | 
             
            #include "../common/mem.h"
         | 
| 17 16 | 
             
            #include "hist.h"           /* HIST_countFast_wksp */
         | 
| 18 17 | 
             
            #define FSE_STATIC_LINKING_ONLY   /* FSE_encodeSymbol */
         | 
| @@ -42,6 +41,18 @@ | |
| 42 41 | 
             
            #  define ZSTD_COMPRESS_HEAPMODE 0
         | 
| 43 42 | 
             
            #endif
         | 
| 44 43 |  | 
| 44 | 
            +
            /*!
         | 
| 45 | 
            +
             * ZSTD_HASHLOG3_MAX :
         | 
| 46 | 
            +
             * Maximum size of the hash table dedicated to find 3-bytes matches,
         | 
| 47 | 
            +
             * in log format, aka 17 => 1 << 17 == 128Ki positions.
         | 
| 48 | 
            +
             * This structure is only used in zstd_opt.
         | 
| 49 | 
            +
             * Since allocation is centralized for all strategies, it has to be known here.
         | 
| 50 | 
            +
             * The actual (selected) size of the hash table is then stored in ZSTD_matchState_t.hashLog3,
         | 
| 51 | 
            +
             * so that zstd_opt.c doesn't need to know about this constant.
         | 
| 52 | 
            +
             */
         | 
| 53 | 
            +
            #ifndef ZSTD_HASHLOG3_MAX
         | 
| 54 | 
            +
            #  define ZSTD_HASHLOG3_MAX 17
         | 
| 55 | 
            +
            #endif
         | 
| 45 56 |  | 
| 46 57 | 
             
            /*-*************************************
         | 
| 47 58 | 
             
            *  Helper functions
         | 
| @@ -72,10 +83,10 @@ struct ZSTD_CDict_s { | |
| 72 83 | 
             
                ZSTD_customMem customMem;
         | 
| 73 84 | 
             
                U32 dictID;
         | 
| 74 85 | 
             
                int compressionLevel; /* 0 indicates that advanced API was used to select CDict params */
         | 
| 75 | 
            -
                 | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 86 | 
            +
                ZSTD_paramSwitch_e useRowMatchFinder; /* Indicates whether the CDict was created with params that would use
         | 
| 87 | 
            +
                                                       * row-based matchfinder. Unless the cdict is reloaded, we will use
         | 
| 88 | 
            +
                                                       * the same greedy/lazy matchfinder at compression time.
         | 
| 89 | 
            +
                                                       */
         | 
| 79 90 | 
             
            };  /* typedef'd to ZSTD_CDict within "zstd.h" */
         | 
| 80 91 |  | 
| 81 92 | 
             
            ZSTD_CCtx* ZSTD_createCCtx(void)
         | 
| @@ -88,7 +99,7 @@ static void ZSTD_initCCtx(ZSTD_CCtx* cctx, ZSTD_customMem memManager) | |
| 88 99 | 
             
                assert(cctx != NULL);
         | 
| 89 100 | 
             
                ZSTD_memset(cctx, 0, sizeof(*cctx));
         | 
| 90 101 | 
             
                cctx->customMem = memManager;
         | 
| 91 | 
            -
                cctx->bmi2 =  | 
| 102 | 
            +
                cctx->bmi2 = ZSTD_cpuSupportsBmi2();
         | 
| 92 103 | 
             
                {   size_t const err = ZSTD_CCtx_reset(cctx, ZSTD_reset_parameters);
         | 
| 93 104 | 
             
                    assert(!ZSTD_isError(err));
         | 
| 94 105 | 
             
                    (void)err;
         | 
| @@ -214,35 +225,42 @@ static int ZSTD_rowMatchFinderSupported(const ZSTD_strategy strategy) { | |
| 214 225 | 
             
            /* Returns true if the strategy and useRowMatchFinder mode indicate that we will use the row based matchfinder
         | 
| 215 226 | 
             
             * for this compression.
         | 
| 216 227 | 
             
             */
         | 
| 217 | 
            -
            static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const  | 
| 218 | 
            -
                assert(mode !=  | 
| 219 | 
            -
                return ZSTD_rowMatchFinderSupported(strategy) && (mode ==  | 
| 228 | 
            +
            static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const ZSTD_paramSwitch_e mode) {
         | 
| 229 | 
            +
                assert(mode != ZSTD_ps_auto);
         | 
| 230 | 
            +
                return ZSTD_rowMatchFinderSupported(strategy) && (mode == ZSTD_ps_enable);
         | 
| 220 231 | 
             
            }
         | 
| 221 232 |  | 
| 222 | 
            -
            /* Returns row matchfinder usage  | 
| 223 | 
            -
            static  | 
| 224 | 
            -
             | 
| 225 | 
            -
            #if  | 
| 233 | 
            +
            /* Returns row matchfinder usage given an initial mode and cParams */
         | 
| 234 | 
            +
            static ZSTD_paramSwitch_e ZSTD_resolveRowMatchFinderMode(ZSTD_paramSwitch_e mode,
         | 
| 235 | 
            +
                                                                     const ZSTD_compressionParameters* const cParams) {
         | 
| 236 | 
            +
            #if defined(ZSTD_ARCH_X86_SSE2) || defined(ZSTD_ARCH_ARM_NEON)
         | 
| 226 237 | 
             
                int const kHasSIMD128 = 1;
         | 
| 227 238 | 
             
            #else
         | 
| 228 239 | 
             
                int const kHasSIMD128 = 0;
         | 
| 229 240 | 
             
            #endif
         | 
| 230 | 
            -
                if (mode !=  | 
| 231 | 
            -
                mode =  | 
| 241 | 
            +
                if (mode != ZSTD_ps_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */
         | 
| 242 | 
            +
                mode = ZSTD_ps_disable;
         | 
| 232 243 | 
             
                if (!ZSTD_rowMatchFinderSupported(cParams->strategy)) return mode;
         | 
| 233 244 | 
             
                if (kHasSIMD128) {
         | 
| 234 | 
            -
                    if (cParams->windowLog > 14) mode =  | 
| 245 | 
            +
                    if (cParams->windowLog > 14) mode = ZSTD_ps_enable;
         | 
| 235 246 | 
             
                } else {
         | 
| 236 | 
            -
                    if (cParams->windowLog > 17) mode =  | 
| 247 | 
            +
                    if (cParams->windowLog > 17) mode = ZSTD_ps_enable;
         | 
| 237 248 | 
             
                }
         | 
| 238 249 | 
             
                return mode;
         | 
| 239 250 | 
             
            }
         | 
| 240 251 |  | 
| 252 | 
            +
            /* Returns block splitter usage (generally speaking, when using slower/stronger compression modes) */
         | 
| 253 | 
            +
            static ZSTD_paramSwitch_e ZSTD_resolveBlockSplitterMode(ZSTD_paramSwitch_e mode,
         | 
| 254 | 
            +
                                                                    const ZSTD_compressionParameters* const cParams) {
         | 
| 255 | 
            +
                if (mode != ZSTD_ps_auto) return mode;
         | 
| 256 | 
            +
                return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 17) ? ZSTD_ps_enable : ZSTD_ps_disable;
         | 
| 257 | 
            +
            }
         | 
| 258 | 
            +
             | 
| 241 259 | 
             
            /* Returns 1 if the arguments indicate that we should allocate a chainTable, 0 otherwise */
         | 
| 242 260 | 
             
            static int ZSTD_allocateChainTable(const ZSTD_strategy strategy,
         | 
| 243 | 
            -
                                               const  | 
| 261 | 
            +
                                               const ZSTD_paramSwitch_e useRowMatchFinder,
         | 
| 244 262 | 
             
                                               const U32 forDDSDict) {
         | 
| 245 | 
            -
                assert(useRowMatchFinder !=  | 
| 263 | 
            +
                assert(useRowMatchFinder != ZSTD_ps_auto);
         | 
| 246 264 | 
             
                /* We always should allocate a chaintable if we are allocating a matchstate for a DDS dictionary matchstate.
         | 
| 247 265 | 
             
                 * We do not allocate a chaintable if we are using ZSTD_fast, or are using the row-based matchfinder.
         | 
| 248 266 | 
             
                 */
         | 
| @@ -253,16 +271,10 @@ static int ZSTD_allocateChainTable(const ZSTD_strategy strategy, | |
| 253 271 | 
             
             * enable long distance matching (wlog >= 27, strategy >= btopt).
         | 
| 254 272 | 
             
             * Returns 0 otherwise.
         | 
| 255 273 | 
             
             */
         | 
| 256 | 
            -
            static  | 
| 257 | 
            -
             | 
| 258 | 
            -
             | 
| 259 | 
            -
             | 
| 260 | 
            -
            /* Returns 1 if compression parameters are such that we should
         | 
| 261 | 
            -
             * enable blockSplitter (wlog >= 17, strategy >= btopt).
         | 
| 262 | 
            -
             * Returns 0 otherwise.
         | 
| 263 | 
            -
             */
         | 
| 264 | 
            -
            static U32 ZSTD_CParams_useBlockSplitter(const ZSTD_compressionParameters* const cParams) {
         | 
| 265 | 
            -
                return cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 17;
         | 
| 274 | 
            +
            static ZSTD_paramSwitch_e ZSTD_resolveEnableLdm(ZSTD_paramSwitch_e mode,
         | 
| 275 | 
            +
                                             const ZSTD_compressionParameters* const cParams) {
         | 
| 276 | 
            +
                if (mode != ZSTD_ps_auto) return mode;
         | 
| 277 | 
            +
                return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27) ? ZSTD_ps_enable : ZSTD_ps_disable;
         | 
| 266 278 | 
             
            }
         | 
| 267 279 |  | 
| 268 280 | 
             
            static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams(
         | 
| @@ -274,20 +286,13 @@ static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( | |
| 274 286 | 
             
                cctxParams.cParams = cParams;
         | 
| 275 287 |  | 
| 276 288 | 
             
                /* Adjust advanced params according to cParams */
         | 
| 277 | 
            -
                 | 
| 278 | 
            -
             | 
| 279 | 
            -
                    cctxParams.ldmParams.enableLdm = 1;
         | 
| 280 | 
            -
                    /* LDM is enabled by default for optimal parser and window size >= 128MB */
         | 
| 289 | 
            +
                cctxParams.ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams.ldmParams.enableLdm, &cParams);
         | 
| 290 | 
            +
                if (cctxParams.ldmParams.enableLdm == ZSTD_ps_enable) {
         | 
| 281 291 | 
             
                    ZSTD_ldm_adjustParameters(&cctxParams.ldmParams, &cParams);
         | 
| 282 292 | 
             
                    assert(cctxParams.ldmParams.hashLog >= cctxParams.ldmParams.bucketSizeLog);
         | 
| 283 293 | 
             
                    assert(cctxParams.ldmParams.hashRateLog < 32);
         | 
| 284 294 | 
             
                }
         | 
| 285 | 
            -
             | 
| 286 | 
            -
                if (ZSTD_CParams_useBlockSplitter(&cParams)) {
         | 
| 287 | 
            -
                    DEBUGLOG(4, "ZSTD_makeCCtxParamsFromCParams(): Including block splitting into cctx params");
         | 
| 288 | 
            -
                    cctxParams.splitBlocks = 1;
         | 
| 289 | 
            -
                }
         | 
| 290 | 
            -
             | 
| 295 | 
            +
                cctxParams.useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams.useBlockSplitter, &cParams);
         | 
| 291 296 | 
             
                cctxParams.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams.useRowMatchFinder, &cParams);
         | 
| 292 297 | 
             
                assert(!ZSTD_checkCParams(cParams));
         | 
| 293 298 | 
             
                return cctxParams;
         | 
| @@ -348,7 +353,10 @@ static void ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, ZSTD_par | |
| 348 353 | 
             
                 */
         | 
| 349 354 | 
             
                cctxParams->compressionLevel = compressionLevel;
         | 
| 350 355 | 
             
                cctxParams->useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams->useRowMatchFinder, ¶ms->cParams);
         | 
| 351 | 
            -
                 | 
| 356 | 
            +
                cctxParams->useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams->useBlockSplitter, ¶ms->cParams);
         | 
| 357 | 
            +
                cctxParams->ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams->ldmParams.enableLdm, ¶ms->cParams);
         | 
| 358 | 
            +
                DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d, useBlockSplitter=%d ldm=%d",
         | 
| 359 | 
            +
                            cctxParams->useRowMatchFinder, cctxParams->useBlockSplitter, cctxParams->ldmParams.enableLdm);
         | 
| 352 360 | 
             
            }
         | 
| 353 361 |  | 
| 354 362 | 
             
            size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params)
         | 
| @@ -518,9 +526,9 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) | |
| 518 526 | 
             
                    return bounds;
         | 
| 519 527 |  | 
| 520 528 | 
             
                case ZSTD_c_literalCompressionMode:
         | 
| 521 | 
            -
                    ZSTD_STATIC_ASSERT( | 
| 522 | 
            -
                    bounds.lowerBound =  | 
| 523 | 
            -
                    bounds.upperBound =  | 
| 529 | 
            +
                    ZSTD_STATIC_ASSERT(ZSTD_ps_auto < ZSTD_ps_enable && ZSTD_ps_enable < ZSTD_ps_disable);
         | 
| 530 | 
            +
                    bounds.lowerBound = (int)ZSTD_ps_auto;
         | 
| 531 | 
            +
                    bounds.upperBound = (int)ZSTD_ps_disable;
         | 
| 524 532 | 
             
                    return bounds;
         | 
| 525 533 |  | 
| 526 534 | 
             
                case ZSTD_c_targetCBlockSize:
         | 
| @@ -549,14 +557,14 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) | |
| 549 557 | 
             
                    bounds.upperBound = 1;
         | 
| 550 558 | 
             
                    return bounds;
         | 
| 551 559 |  | 
| 552 | 
            -
                case  | 
| 553 | 
            -
                    bounds.lowerBound =  | 
| 554 | 
            -
                    bounds.upperBound =  | 
| 560 | 
            +
                case ZSTD_c_useBlockSplitter:
         | 
| 561 | 
            +
                    bounds.lowerBound = (int)ZSTD_ps_auto;
         | 
| 562 | 
            +
                    bounds.upperBound = (int)ZSTD_ps_disable;
         | 
| 555 563 | 
             
                    return bounds;
         | 
| 556 564 |  | 
| 557 565 | 
             
                case ZSTD_c_useRowMatchFinder:
         | 
| 558 | 
            -
                    bounds.lowerBound = (int) | 
| 559 | 
            -
                    bounds.upperBound = (int) | 
| 566 | 
            +
                    bounds.lowerBound = (int)ZSTD_ps_auto;
         | 
| 567 | 
            +
                    bounds.upperBound = (int)ZSTD_ps_disable;
         | 
| 560 568 | 
             
                    return bounds;
         | 
| 561 569 |  | 
| 562 570 | 
             
                case ZSTD_c_deterministicRefPrefix:
         | 
| @@ -625,7 +633,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) | |
| 625 633 | 
             
                case ZSTD_c_stableOutBuffer:
         | 
| 626 634 | 
             
                case ZSTD_c_blockDelimiters:
         | 
| 627 635 | 
             
                case ZSTD_c_validateSequences:
         | 
| 628 | 
            -
                case  | 
| 636 | 
            +
                case ZSTD_c_useBlockSplitter:
         | 
| 629 637 | 
             
                case ZSTD_c_useRowMatchFinder:
         | 
| 630 638 | 
             
                case ZSTD_c_deterministicRefPrefix:
         | 
| 631 639 | 
             
                default:
         | 
| @@ -680,7 +688,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) | |
| 680 688 | 
             
                case ZSTD_c_stableOutBuffer:
         | 
| 681 689 | 
             
                case ZSTD_c_blockDelimiters:
         | 
| 682 690 | 
             
                case ZSTD_c_validateSequences:
         | 
| 683 | 
            -
                case  | 
| 691 | 
            +
                case ZSTD_c_useBlockSplitter:
         | 
| 684 692 | 
             
                case ZSTD_c_useRowMatchFinder:
         | 
| 685 693 | 
             
                case ZSTD_c_deterministicRefPrefix:
         | 
| 686 694 | 
             
                    break;
         | 
| @@ -780,7 +788,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, | |
| 780 788 | 
             
                }
         | 
| 781 789 |  | 
| 782 790 | 
             
                case ZSTD_c_literalCompressionMode : {
         | 
| 783 | 
            -
                    const  | 
| 791 | 
            +
                    const ZSTD_paramSwitch_e lcm = (ZSTD_paramSwitch_e)value;
         | 
| 784 792 | 
             
                    BOUNDCHECK(ZSTD_c_literalCompressionMode, lcm);
         | 
| 785 793 | 
             
                    CCtxParams->literalCompressionMode = lcm;
         | 
| 786 794 | 
             
                    return CCtxParams->literalCompressionMode;
         | 
| @@ -835,7 +843,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, | |
| 835 843 | 
             
                    return CCtxParams->enableDedicatedDictSearch;
         | 
| 836 844 |  | 
| 837 845 | 
             
                case ZSTD_c_enableLongDistanceMatching :
         | 
| 838 | 
            -
                    CCtxParams->ldmParams.enableLdm = (value | 
| 846 | 
            +
                    CCtxParams->ldmParams.enableLdm = (ZSTD_paramSwitch_e)value;
         | 
| 839 847 | 
             
                    return CCtxParams->ldmParams.enableLdm;
         | 
| 840 848 |  | 
| 841 849 | 
             
                case ZSTD_c_ldmHashLog :
         | 
| @@ -857,8 +865,8 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, | |
| 857 865 | 
             
                    return CCtxParams->ldmParams.bucketSizeLog;
         | 
| 858 866 |  | 
| 859 867 | 
             
                case ZSTD_c_ldmHashRateLog :
         | 
| 860 | 
            -
                     | 
| 861 | 
            -
             | 
| 868 | 
            +
                    if (value!=0)   /* 0 ==> default */
         | 
| 869 | 
            +
                        BOUNDCHECK(ZSTD_c_ldmHashRateLog, value);
         | 
| 862 870 | 
             
                    CCtxParams->ldmParams.hashRateLog = value;
         | 
| 863 871 | 
             
                    return CCtxParams->ldmParams.hashRateLog;
         | 
| 864 872 |  | 
| @@ -894,14 +902,14 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, | |
| 894 902 | 
             
                    CCtxParams->validateSequences = value;
         | 
| 895 903 | 
             
                    return CCtxParams->validateSequences;
         | 
| 896 904 |  | 
| 897 | 
            -
                case  | 
| 898 | 
            -
                    BOUNDCHECK( | 
| 899 | 
            -
                    CCtxParams-> | 
| 900 | 
            -
                    return CCtxParams-> | 
| 905 | 
            +
                case ZSTD_c_useBlockSplitter:
         | 
| 906 | 
            +
                    BOUNDCHECK(ZSTD_c_useBlockSplitter, value);
         | 
| 907 | 
            +
                    CCtxParams->useBlockSplitter = (ZSTD_paramSwitch_e)value;
         | 
| 908 | 
            +
                    return CCtxParams->useBlockSplitter;
         | 
| 901 909 |  | 
| 902 910 | 
             
                case ZSTD_c_useRowMatchFinder:
         | 
| 903 911 | 
             
                    BOUNDCHECK(ZSTD_c_useRowMatchFinder, value);
         | 
| 904 | 
            -
                    CCtxParams->useRowMatchFinder = ( | 
| 912 | 
            +
                    CCtxParams->useRowMatchFinder = (ZSTD_paramSwitch_e)value;
         | 
| 905 913 | 
             
                    return CCtxParams->useRowMatchFinder;
         | 
| 906 914 |  | 
| 907 915 | 
             
                case ZSTD_c_deterministicRefPrefix:
         | 
| @@ -1032,8 +1040,8 @@ size_t ZSTD_CCtxParams_getParameter( | |
| 1032 1040 | 
             
                case ZSTD_c_validateSequences :
         | 
| 1033 1041 | 
             
                    *value = (int)CCtxParams->validateSequences;
         | 
| 1034 1042 | 
             
                    break;
         | 
| 1035 | 
            -
                case  | 
| 1036 | 
            -
                    *value = (int)CCtxParams-> | 
| 1043 | 
            +
                case ZSTD_c_useBlockSplitter :
         | 
| 1044 | 
            +
                    *value = (int)CCtxParams->useBlockSplitter;
         | 
| 1037 1045 | 
             
                    break;
         | 
| 1038 1046 | 
             
                case ZSTD_c_useRowMatchFinder :
         | 
| 1039 1047 | 
             
                    *value = (int)CCtxParams->useRowMatchFinder;
         | 
| @@ -1067,7 +1075,7 @@ size_t ZSTD_CCtx_setParametersUsingCCtxParams( | |
| 1067 1075 | 
             
                return 0;
         | 
| 1068 1076 | 
             
            }
         | 
| 1069 1077 |  | 
| 1070 | 
            -
             | 
| 1078 | 
            +
            size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize)
         | 
| 1071 1079 | 
             
            {
         | 
| 1072 1080 | 
             
                DEBUGLOG(4, "ZSTD_CCtx_setPledgedSrcSize to %u bytes", (U32)pledgedSrcSize);
         | 
| 1073 1081 | 
             
                RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong,
         | 
| @@ -1147,14 +1155,14 @@ size_t ZSTD_CCtx_loadDictionary_advanced( | |
| 1147 1155 | 
             
                return 0;
         | 
| 1148 1156 | 
             
            }
         | 
| 1149 1157 |  | 
| 1150 | 
            -
             | 
| 1158 | 
            +
            size_t ZSTD_CCtx_loadDictionary_byReference(
         | 
| 1151 1159 | 
             
                  ZSTD_CCtx* cctx, const void* dict, size_t dictSize)
         | 
| 1152 1160 | 
             
            {
         | 
| 1153 1161 | 
             
                return ZSTD_CCtx_loadDictionary_advanced(
         | 
| 1154 1162 | 
             
                        cctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto);
         | 
| 1155 1163 | 
             
            }
         | 
| 1156 1164 |  | 
| 1157 | 
            -
             | 
| 1165 | 
            +
            size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize)
         | 
| 1158 1166 | 
             
            {
         | 
| 1159 1167 | 
             
                return ZSTD_CCtx_loadDictionary_advanced(
         | 
| 1160 1168 | 
             
                        cctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto);
         | 
| @@ -1324,7 +1332,7 @@ ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, | |
| 1324 1332 | 
             
                    break;
         | 
| 1325 1333 | 
             
                case ZSTD_cpm_createCDict:
         | 
| 1326 1334 | 
             
                    /* Assume a small source size when creating a dictionary
         | 
| 1327 | 
            -
                     * with an  | 
| 1335 | 
            +
                     * with an unknown source size.
         | 
| 1328 1336 | 
             
                     */
         | 
| 1329 1337 | 
             
                    if (dictSize && srcSize == ZSTD_CONTENTSIZE_UNKNOWN)
         | 
| 1330 1338 | 
             
                        srcSize = minSrcSize;
         | 
| @@ -1398,7 +1406,7 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams( | |
| 1398 1406 | 
             
                  srcSizeHint = CCtxParams->srcSizeHint;
         | 
| 1399 1407 | 
             
                }
         | 
| 1400 1408 | 
             
                cParams = ZSTD_getCParams_internal(CCtxParams->compressionLevel, srcSizeHint, dictSize, mode);
         | 
| 1401 | 
            -
                if (CCtxParams->ldmParams.enableLdm) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG;
         | 
| 1409 | 
            +
                if (CCtxParams->ldmParams.enableLdm == ZSTD_ps_enable) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG;
         | 
| 1402 1410 | 
             
                ZSTD_overrideCParams(&cParams, &CCtxParams->cParams);
         | 
| 1403 1411 | 
             
                assert(!ZSTD_checkCParams(cParams));
         | 
| 1404 1412 | 
             
                /* srcSizeHint == 0 means 0 */
         | 
| @@ -1407,7 +1415,7 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams( | |
| 1407 1415 |  | 
| 1408 1416 | 
             
            static size_t
         | 
| 1409 1417 | 
             
            ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams,
         | 
| 1410 | 
            -
                                   const  | 
| 1418 | 
            +
                                   const ZSTD_paramSwitch_e useRowMatchFinder,
         | 
| 1411 1419 | 
             
                                   const U32 enableDedicatedDictSearch,
         | 
| 1412 1420 | 
             
                                   const U32 forCCtx)
         | 
| 1413 1421 | 
             
            {
         | 
| @@ -1440,7 +1448,7 @@ ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams, | |
| 1440 1448 |  | 
| 1441 1449 | 
             
                /* tables are guaranteed to be sized in multiples of 64 bytes (or 16 uint32_t) */
         | 
| 1442 1450 | 
             
                ZSTD_STATIC_ASSERT(ZSTD_HASHLOG_MIN >= 4 && ZSTD_WINDOWLOG_MIN >= 4 && ZSTD_CHAINLOG_MIN >= 4);
         | 
| 1443 | 
            -
                assert(useRowMatchFinder !=  | 
| 1451 | 
            +
                assert(useRowMatchFinder != ZSTD_ps_auto);
         | 
| 1444 1452 |  | 
| 1445 1453 | 
             
                DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u",
         | 
| 1446 1454 | 
             
                            (U32)chainSize, (U32)hSize, (U32)h3Size);
         | 
| @@ -1451,12 +1459,12 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( | |
| 1451 1459 | 
             
                    const ZSTD_compressionParameters* cParams,
         | 
| 1452 1460 | 
             
                    const ldmParams_t* ldmParams,
         | 
| 1453 1461 | 
             
                    const int isStatic,
         | 
| 1454 | 
            -
                    const  | 
| 1462 | 
            +
                    const ZSTD_paramSwitch_e useRowMatchFinder,
         | 
| 1455 1463 | 
             
                    const size_t buffInSize,
         | 
| 1456 1464 | 
             
                    const size_t buffOutSize,
         | 
| 1457 1465 | 
             
                    const U64 pledgedSrcSize)
         | 
| 1458 1466 | 
             
            {
         | 
| 1459 | 
            -
                size_t const windowSize =  | 
| 1467 | 
            +
                size_t const windowSize = (size_t) BOUNDED(1ULL, 1ULL << cParams->windowLog, pledgedSrcSize);
         | 
| 1460 1468 | 
             
                size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize);
         | 
| 1461 1469 | 
             
                U32    const divider = (cParams->minMatch==3) ? 3 : 4;
         | 
| 1462 1470 | 
             
                size_t const maxNbSeq = blockSize / divider;
         | 
| @@ -1469,7 +1477,7 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( | |
| 1469 1477 |  | 
| 1470 1478 | 
             
                size_t const ldmSpace = ZSTD_ldm_getTableSize(*ldmParams);
         | 
| 1471 1479 | 
             
                size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(*ldmParams, blockSize);
         | 
| 1472 | 
            -
                size_t const ldmSeqSpace = ldmParams->enableLdm ?
         | 
| 1480 | 
            +
                size_t const ldmSeqSpace = ldmParams->enableLdm == ZSTD_ps_enable ?
         | 
| 1473 1481 | 
             
                    ZSTD_cwksp_aligned_alloc_size(maxNbLdmSeq * sizeof(rawSeq)) : 0;
         | 
| 1474 1482 |  | 
| 1475 1483 |  | 
| @@ -1496,8 +1504,8 @@ size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params) | |
| 1496 1504 | 
             
            {
         | 
| 1497 1505 | 
             
                ZSTD_compressionParameters const cParams =
         | 
| 1498 1506 | 
             
                            ZSTD_getCParamsFromCCtxParams(params, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict);
         | 
| 1499 | 
            -
                 | 
| 1500 | 
            -
             | 
| 1507 | 
            +
                ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder,
         | 
| 1508 | 
            +
                                                                                           &cParams);
         | 
| 1501 1509 |  | 
| 1502 1510 | 
             
                RETURN_ERROR_IF(params->nbWorkers > 0, GENERIC, "Estimate CCtx size is supported for single-threaded compression only.");
         | 
| 1503 1511 | 
             
                /* estimateCCtxSize is for one-shot compression. So no buffers should
         | 
| @@ -1514,9 +1522,9 @@ size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams) | |
| 1514 1522 | 
             
                    /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */
         | 
| 1515 1523 | 
             
                    size_t noRowCCtxSize;
         | 
| 1516 1524 | 
             
                    size_t rowCCtxSize;
         | 
| 1517 | 
            -
                    initialParams.useRowMatchFinder =  | 
| 1525 | 
            +
                    initialParams.useRowMatchFinder = ZSTD_ps_disable;
         | 
| 1518 1526 | 
             
                    noRowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams);
         | 
| 1519 | 
            -
                    initialParams.useRowMatchFinder =  | 
| 1527 | 
            +
                    initialParams.useRowMatchFinder = ZSTD_ps_enable;
         | 
| 1520 1528 | 
             
                    rowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams);
         | 
| 1521 1529 | 
             
                    return MAX(noRowCCtxSize, rowCCtxSize);
         | 
| 1522 1530 | 
             
                } else {
         | 
| @@ -1561,7 +1569,7 @@ size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params) | |
| 1561 1569 | 
             
                    size_t const outBuffSize = (params->outBufferMode == ZSTD_bm_buffered)
         | 
| 1562 1570 | 
             
                            ? ZSTD_compressBound(blockSize) + 1
         | 
| 1563 1571 | 
             
                            : 0;
         | 
| 1564 | 
            -
                     | 
| 1572 | 
            +
                    ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, ¶ms->cParams);
         | 
| 1565 1573 |  | 
| 1566 1574 | 
             
                    return ZSTD_estimateCCtxSize_usingCCtxParams_internal(
         | 
| 1567 1575 | 
             
                        &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, inBuffSize, outBuffSize,
         | 
| @@ -1576,9 +1584,9 @@ size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams) | |
| 1576 1584 | 
             
                    /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */
         | 
| 1577 1585 | 
             
                    size_t noRowCCtxSize;
         | 
| 1578 1586 | 
             
                    size_t rowCCtxSize;
         | 
| 1579 | 
            -
                    initialParams.useRowMatchFinder =  | 
| 1587 | 
            +
                    initialParams.useRowMatchFinder = ZSTD_ps_disable;
         | 
| 1580 1588 | 
             
                    noRowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams);
         | 
| 1581 | 
            -
                    initialParams.useRowMatchFinder =  | 
| 1589 | 
            +
                    initialParams.useRowMatchFinder = ZSTD_ps_enable;
         | 
| 1582 1590 | 
             
                    rowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams);
         | 
| 1583 1591 | 
             
                    return MAX(noRowCCtxSize, rowCCtxSize);
         | 
| 1584 1592 | 
             
                } else {
         | 
| @@ -1713,7 +1721,7 @@ static size_t | |
| 1713 1721 | 
             
            ZSTD_reset_matchState(ZSTD_matchState_t* ms,
         | 
| 1714 1722 | 
             
                                  ZSTD_cwksp* ws,
         | 
| 1715 1723 | 
             
                            const ZSTD_compressionParameters* cParams,
         | 
| 1716 | 
            -
                            const  | 
| 1724 | 
            +
                            const ZSTD_paramSwitch_e useRowMatchFinder,
         | 
| 1717 1725 | 
             
                            const ZSTD_compResetPolicy_e crp,
         | 
| 1718 1726 | 
             
                            const ZSTD_indexResetPolicy_e forceResetIndex,
         | 
| 1719 1727 | 
             
                            const ZSTD_resetTarget_e forWho)
         | 
| @@ -1728,7 +1736,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, | |
| 1728 1736 | 
             
                size_t const h3Size = hashLog3 ? ((size_t)1) << hashLog3 : 0;
         | 
| 1729 1737 |  | 
| 1730 1738 | 
             
                DEBUGLOG(4, "reset indices : %u", forceResetIndex == ZSTDirp_reset);
         | 
| 1731 | 
            -
                assert(useRowMatchFinder !=  | 
| 1739 | 
            +
                assert(useRowMatchFinder != ZSTD_ps_auto);
         | 
| 1732 1740 | 
             
                if (forceResetIndex == ZSTDirp_reset) {
         | 
| 1733 1741 | 
             
                    ZSTD_window_init(&ms->window);
         | 
| 1734 1742 | 
             
                    ZSTD_cwksp_mark_tables_dirty(ws);
         | 
| @@ -1774,8 +1782,8 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, | |
| 1774 1782 | 
             
                        if (ms->tagTable) ZSTD_memset(ms->tagTable, 0, tagTableSize);
         | 
| 1775 1783 | 
             
                    }
         | 
| 1776 1784 | 
             
                    {   /* Switch to 32-entry rows if searchLog is 5 (or more) */
         | 
| 1777 | 
            -
                        U32 const rowLog = cParams->searchLog  | 
| 1778 | 
            -
                        assert(cParams->hashLog  | 
| 1785 | 
            +
                        U32 const rowLog = BOUNDED(4, cParams->searchLog, 6);
         | 
| 1786 | 
            +
                        assert(cParams->hashLog >= rowLog);
         | 
| 1779 1787 | 
             
                        ms->rowHashLog = cParams->hashLog - rowLog;
         | 
| 1780 1788 | 
             
                    }
         | 
| 1781 1789 | 
             
                }
         | 
| @@ -1824,8 +1832,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | |
| 1824 1832 | 
             
                                                  ZSTD_buffered_policy_e const zbuff)
         | 
| 1825 1833 | 
             
            {
         | 
| 1826 1834 | 
             
                ZSTD_cwksp* const ws = &zc->workspace;
         | 
| 1827 | 
            -
                DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u, useRowMatchFinder=%d",
         | 
| 1828 | 
            -
                            (U32)pledgedSrcSize, params->cParams.windowLog, (int)params->useRowMatchFinder);
         | 
| 1835 | 
            +
                DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u, useRowMatchFinder=%d useBlockSplitter=%d",
         | 
| 1836 | 
            +
                            (U32)pledgedSrcSize, params->cParams.windowLog, (int)params->useRowMatchFinder, (int)params->useBlockSplitter);
         | 
| 1829 1837 | 
             
                assert(!ZSTD_isError(ZSTD_checkCParams(params->cParams)));
         | 
| 1830 1838 |  | 
| 1831 1839 | 
             
                zc->isFirstBlock = 1;
         | 
| @@ -1836,8 +1844,10 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | |
| 1836 1844 | 
             
                zc->appliedParams = *params;
         | 
| 1837 1845 | 
             
                params = &zc->appliedParams;
         | 
| 1838 1846 |  | 
| 1839 | 
            -
                assert(params->useRowMatchFinder !=  | 
| 1840 | 
            -
                 | 
| 1847 | 
            +
                assert(params->useRowMatchFinder != ZSTD_ps_auto);
         | 
| 1848 | 
            +
                assert(params->useBlockSplitter != ZSTD_ps_auto);
         | 
| 1849 | 
            +
                assert(params->ldmParams.enableLdm != ZSTD_ps_auto);
         | 
| 1850 | 
            +
                if (params->ldmParams.enableLdm == ZSTD_ps_enable) {
         | 
| 1841 1851 | 
             
                    /* Adjust long distance matching parameters */
         | 
| 1842 1852 | 
             
                    ZSTD_ldm_adjustParameters(&zc->appliedParams.ldmParams, ¶ms->cParams);
         | 
| 1843 1853 | 
             
                    assert(params->ldmParams.hashLog >= params->ldmParams.bucketSizeLog);
         | 
| @@ -1900,7 +1910,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | |
| 1900 1910 | 
             
                            zc->blockState.nextCBlock = (ZSTD_compressedBlockState_t*) ZSTD_cwksp_reserve_object(ws, sizeof(ZSTD_compressedBlockState_t));
         | 
| 1901 1911 | 
             
                            RETURN_ERROR_IF(zc->blockState.nextCBlock == NULL, memory_allocation, "couldn't allocate nextCBlock");
         | 
| 1902 1912 | 
             
                            zc->entropyWorkspace = (U32*) ZSTD_cwksp_reserve_object(ws, ENTROPY_WORKSPACE_SIZE);
         | 
| 1903 | 
            -
                            RETURN_ERROR_IF(zc-> | 
| 1913 | 
            +
                            RETURN_ERROR_IF(zc->entropyWorkspace == NULL, memory_allocation, "couldn't allocate entropyWorkspace");
         | 
| 1904 1914 | 
             
                    }   }
         | 
| 1905 1915 |  | 
| 1906 1916 | 
             
                    ZSTD_cwksp_clear(ws);
         | 
| @@ -1937,7 +1947,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | |
| 1937 1947 | 
             
                    zc->outBuff = (char*)ZSTD_cwksp_reserve_buffer(ws, buffOutSize);
         | 
| 1938 1948 |  | 
| 1939 1949 | 
             
                    /* ldm bucketOffsets table */
         | 
| 1940 | 
            -
                    if (params->ldmParams.enableLdm) {
         | 
| 1950 | 
            +
                    if (params->ldmParams.enableLdm == ZSTD_ps_enable) {
         | 
| 1941 1951 | 
             
                        /* TODO: avoid memset? */
         | 
| 1942 1952 | 
             
                        size_t const numBuckets =
         | 
| 1943 1953 | 
             
                              ((size_t)1) << (params->ldmParams.hashLog -
         | 
| @@ -1964,7 +1974,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | |
| 1964 1974 | 
             
                        ZSTD_resetTarget_CCtx), "");
         | 
| 1965 1975 |  | 
| 1966 1976 | 
             
                    /* ldm hash table */
         | 
| 1967 | 
            -
                    if (params->ldmParams.enableLdm) {
         | 
| 1977 | 
            +
                    if (params->ldmParams.enableLdm == ZSTD_ps_enable) {
         | 
| 1968 1978 | 
             
                        /* TODO: avoid memset? */
         | 
| 1969 1979 | 
             
                        size_t const ldmHSize = ((size_t)1) << params->ldmParams.hashLog;
         | 
| 1970 1980 | 
             
                        zc->ldmState.hashTable = (ldmEntry_t*)ZSTD_cwksp_reserve_aligned(ws, ldmHSize * sizeof(ldmEntry_t));
         | 
| @@ -1976,8 +1986,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | |
| 1976 1986 | 
             
                        zc->ldmState.loadedDictEnd = 0;
         | 
| 1977 1987 | 
             
                    }
         | 
| 1978 1988 |  | 
| 1979 | 
            -
                    assert(ZSTD_cwksp_estimated_space_within_bounds(ws, neededSpace, resizeWorkspace));
         | 
| 1980 1989 | 
             
                    DEBUGLOG(3, "wksp: finished allocating, %zd bytes remain available", ZSTD_cwksp_available_space(ws));
         | 
| 1990 | 
            +
                    assert(ZSTD_cwksp_estimated_space_within_bounds(ws, neededSpace, resizeWorkspace));
         | 
| 1981 1991 |  | 
| 1982 1992 | 
             
                    zc->initialized = 1;
         | 
| 1983 1993 |  | 
| @@ -2115,7 +2125,7 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, | |
| 2115 2125 | 
             
                }
         | 
| 2116 2126 |  | 
| 2117 2127 | 
             
                ZSTD_cwksp_mark_tables_dirty(&cctx->workspace);
         | 
| 2118 | 
            -
                assert(params.useRowMatchFinder !=  | 
| 2128 | 
            +
                assert(params.useRowMatchFinder != ZSTD_ps_auto);
         | 
| 2119 2129 |  | 
| 2120 2130 | 
             
                /* copy tables */
         | 
| 2121 2131 | 
             
                {   size_t const chainSize = ZSTD_allocateChainTable(cdict_cParams->strategy, cdict->useRowMatchFinder, 0 /* DDS guaranteed disabled */)
         | 
| @@ -2209,8 +2219,12 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, | |
| 2209 2219 | 
             
                {   ZSTD_CCtx_params params = dstCCtx->requestedParams;
         | 
| 2210 2220 | 
             
                    /* Copy only compression parameters related to tables. */
         | 
| 2211 2221 | 
             
                    params.cParams = srcCCtx->appliedParams.cParams;
         | 
| 2212 | 
            -
                    assert(srcCCtx->appliedParams.useRowMatchFinder !=  | 
| 2222 | 
            +
                    assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_ps_auto);
         | 
| 2223 | 
            +
                    assert(srcCCtx->appliedParams.useBlockSplitter != ZSTD_ps_auto);
         | 
| 2224 | 
            +
                    assert(srcCCtx->appliedParams.ldmParams.enableLdm != ZSTD_ps_auto);
         | 
| 2213 2225 | 
             
                    params.useRowMatchFinder = srcCCtx->appliedParams.useRowMatchFinder;
         | 
| 2226 | 
            +
                    params.useBlockSplitter = srcCCtx->appliedParams.useBlockSplitter;
         | 
| 2227 | 
            +
                    params.ldmParams = srcCCtx->appliedParams.ldmParams;
         | 
| 2214 2228 | 
             
                    params.fParams = fParams;
         | 
| 2215 2229 | 
             
                    ZSTD_resetCCtx_internal(dstCCtx, ¶ms, pledgedSrcSize,
         | 
| 2216 2230 | 
             
                                            /* loadedDictSize */ 0,
         | 
| @@ -2296,6 +2310,8 @@ ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerVa | |
| 2296 2310 | 
             
                int const nbRows = (int)size / ZSTD_ROWSIZE;
         | 
| 2297 2311 | 
             
                int cellNb = 0;
         | 
| 2298 2312 | 
             
                int rowNb;
         | 
| 2313 | 
            +
                /* Protect special index values < ZSTD_WINDOW_START_INDEX. */
         | 
| 2314 | 
            +
                U32 const reducerThreshold = reducerValue + ZSTD_WINDOW_START_INDEX;
         | 
| 2299 2315 | 
             
                assert((size & (ZSTD_ROWSIZE-1)) == 0);  /* multiple of ZSTD_ROWSIZE */
         | 
| 2300 2316 | 
             
                assert(size < (1U<<31));   /* can be casted to int */
         | 
| 2301 2317 |  | 
| @@ -2315,12 +2331,17 @@ ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerVa | |
| 2315 2331 | 
             
                for (rowNb=0 ; rowNb < nbRows ; rowNb++) {
         | 
| 2316 2332 | 
             
                    int column;
         | 
| 2317 2333 | 
             
                    for (column=0; column<ZSTD_ROWSIZE; column++) {
         | 
| 2318 | 
            -
                         | 
| 2319 | 
            -
             | 
| 2320 | 
            -
                             | 
| 2334 | 
            +
                        U32 newVal;
         | 
| 2335 | 
            +
                        if (preserveMark && table[cellNb] == ZSTD_DUBT_UNSORTED_MARK) {
         | 
| 2336 | 
            +
                            /* This write is pointless, but is required(?) for the compiler
         | 
| 2337 | 
            +
                             * to auto-vectorize the loop. */
         | 
| 2338 | 
            +
                            newVal = ZSTD_DUBT_UNSORTED_MARK;
         | 
| 2339 | 
            +
                        } else if (table[cellNb] < reducerThreshold) {
         | 
| 2340 | 
            +
                            newVal = 0;
         | 
| 2341 | 
            +
                        } else {
         | 
| 2342 | 
            +
                            newVal = table[cellNb] - reducerValue;
         | 
| 2321 2343 | 
             
                        }
         | 
| 2322 | 
            -
                         | 
| 2323 | 
            -
                        else table[cellNb] -= reducerValue;
         | 
| 2344 | 
            +
                        table[cellNb] = newVal;
         | 
| 2324 2345 | 
             
                        cellNb++;
         | 
| 2325 2346 | 
             
                }   }
         | 
| 2326 2347 | 
             
            }
         | 
| @@ -2375,9 +2396,9 @@ void ZSTD_seqToCodes(const seqStore_t* seqStorePtr) | |
| 2375 2396 | 
             
                assert(nbSeq <= seqStorePtr->maxNbSeq);
         | 
| 2376 2397 | 
             
                for (u=0; u<nbSeq; u++) {
         | 
| 2377 2398 | 
             
                    U32 const llv = sequences[u].litLength;
         | 
| 2378 | 
            -
                    U32 const mlv = sequences[u]. | 
| 2399 | 
            +
                    U32 const mlv = sequences[u].mlBase;
         | 
| 2379 2400 | 
             
                    llCodeTable[u] = (BYTE)ZSTD_LLcode(llv);
         | 
| 2380 | 
            -
                    ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u]. | 
| 2401 | 
            +
                    ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u].offBase);
         | 
| 2381 2402 | 
             
                    mlCodeTable[u] = (BYTE)ZSTD_MLcode(mlv);
         | 
| 2382 2403 | 
             
                }
         | 
| 2383 2404 | 
             
                if (seqStorePtr->longLengthType==ZSTD_llt_literalLength)
         | 
| @@ -2399,11 +2420,13 @@ static int ZSTD_useTargetCBlockSize(const ZSTD_CCtx_params* cctxParams) | |
| 2399 2420 | 
             
            /* ZSTD_blockSplitterEnabled():
         | 
| 2400 2421 | 
             
             * Returns if block splitting param is being used
         | 
| 2401 2422 | 
             
             * If used, compression will do best effort to split a block in order to improve compression ratio.
         | 
| 2423 | 
            +
             * At the time this function is called, the parameter must be finalized.
         | 
| 2402 2424 | 
             
             * Returns 1 if true, 0 otherwise. */
         | 
| 2403 2425 | 
             
            static int ZSTD_blockSplitterEnabled(ZSTD_CCtx_params* cctxParams)
         | 
| 2404 2426 | 
             
            {
         | 
| 2405 | 
            -
                DEBUGLOG(5, "ZSTD_blockSplitterEnabled( | 
| 2406 | 
            -
                 | 
| 2427 | 
            +
                DEBUGLOG(5, "ZSTD_blockSplitterEnabled (useBlockSplitter=%d)", cctxParams->useBlockSplitter);
         | 
| 2428 | 
            +
                assert(cctxParams->useBlockSplitter != ZSTD_ps_auto);
         | 
| 2429 | 
            +
                return (cctxParams->useBlockSplitter == ZSTD_ps_enable);
         | 
| 2407 2430 | 
             
            }
         | 
| 2408 2431 |  | 
| 2409 2432 | 
             
            /* Type returned by ZSTD_buildSequencesStatistics containing finalized symbol encoding types
         | 
| @@ -2546,6 +2569,7 @@ ZSTD_buildSequencesStatistics(seqStore_t* seqStorePtr, size_t nbSeq, | |
| 2546 2569 | 
             
             * compresses both literals and sequences
         | 
| 2547 2570 | 
             
             * Returns compressed size of block, or a zstd error.
         | 
| 2548 2571 | 
             
             */
         | 
| 2572 | 
            +
            #define SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO 20
         | 
| 2549 2573 | 
             
            MEM_STATIC size_t
         | 
| 2550 2574 | 
             
            ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr,
         | 
| 2551 2575 | 
             
                                      const ZSTD_entropyCTables_t* prevEntropy,
         | 
| @@ -2580,15 +2604,19 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, | |
| 2580 2604 |  | 
| 2581 2605 | 
             
                /* Compress literals */
         | 
| 2582 2606 | 
             
                {   const BYTE* const literals = seqStorePtr->litStart;
         | 
| 2607 | 
            +
                    size_t const numSequences = seqStorePtr->sequences - seqStorePtr->sequencesStart;
         | 
| 2608 | 
            +
                    size_t const numLiterals = seqStorePtr->lit - seqStorePtr->litStart;
         | 
| 2609 | 
            +
                    /* Base suspicion of uncompressibility on ratio of literals to sequences */
         | 
| 2610 | 
            +
                    unsigned const suspectUncompressible = (numSequences == 0) || (numLiterals / numSequences >= SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO);
         | 
| 2583 2611 | 
             
                    size_t const litSize = (size_t)(seqStorePtr->lit - literals);
         | 
| 2584 2612 | 
             
                    size_t const cSize = ZSTD_compressLiterals(
         | 
| 2585 2613 | 
             
                                                &prevEntropy->huf, &nextEntropy->huf,
         | 
| 2586 2614 | 
             
                                                cctxParams->cParams.strategy,
         | 
| 2587 | 
            -
                                                 | 
| 2615 | 
            +
                                                ZSTD_literalsCompressionIsDisabled(cctxParams),
         | 
| 2588 2616 | 
             
                                                op, dstCapacity,
         | 
| 2589 2617 | 
             
                                                literals, litSize,
         | 
| 2590 2618 | 
             
                                                entropyWorkspace, entropyWkspSize,
         | 
| 2591 | 
            -
                                                bmi2);
         | 
| 2619 | 
            +
                                                bmi2, suspectUncompressible);
         | 
| 2592 2620 | 
             
                    FORWARD_IF_ERROR(cSize, "ZSTD_compressLiterals failed");
         | 
| 2593 2621 | 
             
                    assert(cSize <= dstCapacity);
         | 
| 2594 2622 | 
             
                    op += cSize;
         | 
| @@ -2693,7 +2721,7 @@ ZSTD_entropyCompressSeqStore(seqStore_t* seqStorePtr, | |
| 2693 2721 | 
             
            /* ZSTD_selectBlockCompressor() :
         | 
| 2694 2722 | 
             
             * Not static, but internal use only (used by long distance matcher)
         | 
| 2695 2723 | 
             
             * assumption : strat is a valid strategy */
         | 
| 2696 | 
            -
            ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat,  | 
| 2724 | 
            +
            ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_paramSwitch_e useRowMatchFinder, ZSTD_dictMode_e dictMode)
         | 
| 2697 2725 | 
             
            {
         | 
| 2698 2726 | 
             
                static const ZSTD_blockCompressor blockCompressor[4][ZSTD_STRATEGY_MAX+1] = {
         | 
| 2699 2727 | 
             
                    { ZSTD_compressBlock_fast  /* default for 0 */,
         | 
| @@ -2758,7 +2786,7 @@ ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_useRow | |
| 2758 2786 | 
             
                        ZSTD_compressBlock_lazy2_dedicatedDictSearch_row }
         | 
| 2759 2787 | 
             
                    };
         | 
| 2760 2788 | 
             
                    DEBUGLOG(4, "Selecting a row-based matchfinder");
         | 
| 2761 | 
            -
                    assert(useRowMatchFinder !=  | 
| 2789 | 
            +
                    assert(useRowMatchFinder != ZSTD_ps_auto);
         | 
| 2762 2790 | 
             
                    selectedCompressor = rowBasedBlockCompressors[(int)dictMode][(int)strat - (int)ZSTD_greedy];
         | 
| 2763 2791 | 
             
                } else {
         | 
| 2764 2792 | 
             
                    selectedCompressor = blockCompressor[(int)dictMode][(int)strat];
         | 
| @@ -2825,7 +2853,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) | |
| 2825 2853 | 
             
                            zc->blockState.nextCBlock->rep[i] = zc->blockState.prevCBlock->rep[i];
         | 
| 2826 2854 | 
             
                    }
         | 
| 2827 2855 | 
             
                    if (zc->externSeqStore.pos < zc->externSeqStore.size) {
         | 
| 2828 | 
            -
                        assert( | 
| 2856 | 
            +
                        assert(zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_disable);
         | 
| 2829 2857 | 
             
                        /* Updates ldmSeqStore.pos */
         | 
| 2830 2858 | 
             
                        lastLLSize =
         | 
| 2831 2859 | 
             
                            ZSTD_ldm_blockCompress(&zc->externSeqStore,
         | 
| @@ -2834,7 +2862,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) | |
| 2834 2862 | 
             
                                                   zc->appliedParams.useRowMatchFinder,
         | 
| 2835 2863 | 
             
                                                   src, srcSize);
         | 
| 2836 2864 | 
             
                        assert(zc->externSeqStore.pos <= zc->externSeqStore.size);
         | 
| 2837 | 
            -
                    } else if (zc->appliedParams.ldmParams.enableLdm) {
         | 
| 2865 | 
            +
                    } else if (zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) {
         | 
| 2838 2866 | 
             
                        rawSeqStore_t ldmSeqStore = kNullRawSeqStore;
         | 
| 2839 2867 |  | 
| 2840 2868 | 
             
                        ldmSeqStore.seq = zc->ldmSequences;
         | 
| @@ -2882,9 +2910,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) | |
| 2882 2910 | 
             
                assert(zc->seqCollector.maxSequences >= seqStoreSeqSize + 1);
         | 
| 2883 2911 | 
             
                ZSTD_memcpy(updatedRepcodes.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t));
         | 
| 2884 2912 | 
             
                for (i = 0; i < seqStoreSeqSize; ++i) {
         | 
| 2885 | 
            -
                    U32 rawOffset = seqStoreSeqs[i]. | 
| 2913 | 
            +
                    U32 rawOffset = seqStoreSeqs[i].offBase - ZSTD_REP_NUM;
         | 
| 2886 2914 | 
             
                    outSeqs[i].litLength = seqStoreSeqs[i].litLength;
         | 
| 2887 | 
            -
                    outSeqs[i].matchLength = seqStoreSeqs[i]. | 
| 2915 | 
            +
                    outSeqs[i].matchLength = seqStoreSeqs[i].mlBase + MINMATCH;
         | 
| 2888 2916 | 
             
                    outSeqs[i].rep = 0;
         | 
| 2889 2917 |  | 
| 2890 2918 | 
             
                    if (i == seqStore->longLengthPos) {
         | 
| @@ -2895,9 +2923,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) | |
| 2895 2923 | 
             
                        }
         | 
| 2896 2924 | 
             
                    }
         | 
| 2897 2925 |  | 
| 2898 | 
            -
                    if (seqStoreSeqs[i]. | 
| 2926 | 
            +
                    if (seqStoreSeqs[i].offBase <= ZSTD_REP_NUM) {
         | 
| 2899 2927 | 
             
                        /* Derive the correct offset corresponding to a repcode */
         | 
| 2900 | 
            -
                        outSeqs[i].rep = seqStoreSeqs[i]. | 
| 2928 | 
            +
                        outSeqs[i].rep = seqStoreSeqs[i].offBase;
         | 
| 2901 2929 | 
             
                        if (outSeqs[i].litLength != 0) {
         | 
| 2902 2930 | 
             
                            rawOffset = updatedRepcodes.rep[outSeqs[i].rep - 1];
         | 
| 2903 2931 | 
             
                        } else {
         | 
| @@ -2911,9 +2939,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) | |
| 2911 2939 | 
             
                    outSeqs[i].offset = rawOffset;
         | 
| 2912 2940 | 
             
                    /* seqStoreSeqs[i].offset == offCode+1, and ZSTD_updateRep() expects offCode
         | 
| 2913 2941 | 
             
                       so we provide seqStoreSeqs[i].offset - 1 */
         | 
| 2914 | 
            -
                     | 
| 2915 | 
            -
             | 
| 2916 | 
            -
             | 
| 2942 | 
            +
                    ZSTD_updateRep(updatedRepcodes.rep,
         | 
| 2943 | 
            +
                                   seqStoreSeqs[i].offBase - 1,
         | 
| 2944 | 
            +
                                   seqStoreSeqs[i].litLength == 0);
         | 
| 2917 2945 | 
             
                    literalsRead += outSeqs[i].litLength;
         | 
| 2918 2946 | 
             
                }
         | 
| 2919 2947 | 
             
                /* Insert last literals (if any exist) in the block as a sequence with ml == off == 0.
         | 
| @@ -3027,7 +3055,7 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi | |
| 3027 3055 | 
             
                                                        const ZSTD_hufCTables_t* prevHuf,
         | 
| 3028 3056 | 
             
                                                              ZSTD_hufCTables_t* nextHuf,
         | 
| 3029 3057 | 
             
                                                              ZSTD_hufCTablesMetadata_t* hufMetadata,
         | 
| 3030 | 
            -
                                                              const int  | 
| 3058 | 
            +
                                                              const int literalsCompressionIsDisabled,
         | 
| 3031 3059 | 
             
                                                              void* workspace, size_t wkspSize)
         | 
| 3032 3060 | 
             
            {
         | 
| 3033 3061 | 
             
                BYTE* const wkspStart = (BYTE*)workspace;
         | 
| @@ -3045,7 +3073,7 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi | |
| 3045 3073 | 
             
                /* Prepare nextEntropy assuming reusing the existing table */
         | 
| 3046 3074 | 
             
                ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
         | 
| 3047 3075 |  | 
| 3048 | 
            -
                if ( | 
| 3076 | 
            +
                if (literalsCompressionIsDisabled) {
         | 
| 3049 3077 | 
             
                    DEBUGLOG(5, "set_basic - disabled");
         | 
| 3050 3078 | 
             
                    hufMetadata->hType = set_basic;
         | 
| 3051 3079 | 
             
                    return 0;
         | 
| @@ -3192,7 +3220,7 @@ size_t ZSTD_buildBlockEntropyStats(seqStore_t* seqStorePtr, | |
| 3192 3220 | 
             
                    ZSTD_buildBlockEntropyStats_literals(seqStorePtr->litStart, litSize,
         | 
| 3193 3221 | 
             
                                                        &prevEntropy->huf, &nextEntropy->huf,
         | 
| 3194 3222 | 
             
                                                        &entropyMetadata->hufMetadata,
         | 
| 3195 | 
            -
                                                         | 
| 3223 | 
            +
                                                        ZSTD_literalsCompressionIsDisabled(cctxParams),
         | 
| 3196 3224 | 
             
                                                        workspace, wkspSize);
         | 
| 3197 3225 | 
             
                FORWARD_IF_ERROR(entropyMetadata->hufMetadata.hufDesSize, "ZSTD_buildBlockEntropyStats_literals failed");
         | 
| 3198 3226 | 
             
                entropyMetadata->fseMetadata.fseTablesSize =
         | 
| @@ -3235,7 +3263,7 @@ static size_t ZSTD_estimateBlockSize_literal(const BYTE* literals, size_t litSiz | |
| 3235 3263 | 
             
            static size_t ZSTD_estimateBlockSize_symbolType(symbolEncodingType_e type,
         | 
| 3236 3264 | 
             
                                    const BYTE* codeTable, size_t nbSeq, unsigned maxCode,
         | 
| 3237 3265 | 
             
                                    const FSE_CTable* fseCTable,
         | 
| 3238 | 
            -
                                    const  | 
| 3266 | 
            +
                                    const U8* additionalBits,
         | 
| 3239 3267 | 
             
                                    short const* defaultNorm, U32 defaultNormLog, U32 defaultMax,
         | 
| 3240 3268 | 
             
                                    void* workspace, size_t wkspSize)
         | 
| 3241 3269 | 
             
            {
         | 
| @@ -3319,19 +3347,20 @@ static size_t ZSTD_estimateBlockSize(const BYTE* literals, size_t litSize, | |
| 3319 3347 | 
             
             *
         | 
| 3320 3348 | 
             
             * Returns the estimated compressed size of the seqStore, or a zstd error.
         | 
| 3321 3349 | 
             
             */
         | 
| 3322 | 
            -
            static size_t ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(seqStore_t* seqStore,  | 
| 3323 | 
            -
                ZSTD_entropyCTablesMetadata_t entropyMetadata;
         | 
| 3350 | 
            +
            static size_t ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(seqStore_t* seqStore, ZSTD_CCtx* zc) {
         | 
| 3351 | 
            +
                ZSTD_entropyCTablesMetadata_t* entropyMetadata = &zc->blockSplitCtx.entropyMetadata;
         | 
| 3352 | 
            +
                DEBUGLOG(6, "ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize()");
         | 
| 3324 3353 | 
             
                FORWARD_IF_ERROR(ZSTD_buildBlockEntropyStats(seqStore,
         | 
| 3325 3354 | 
             
                                &zc->blockState.prevCBlock->entropy,
         | 
| 3326 3355 | 
             
                                &zc->blockState.nextCBlock->entropy,
         | 
| 3327 3356 | 
             
                                &zc->appliedParams,
         | 
| 3328 | 
            -
                                 | 
| 3357 | 
            +
                                entropyMetadata,
         | 
| 3329 3358 | 
             
                                zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */), "");
         | 
| 3330 3359 | 
             
                return ZSTD_estimateBlockSize(seqStore->litStart, (size_t)(seqStore->lit - seqStore->litStart),
         | 
| 3331 3360 | 
             
                                seqStore->ofCode, seqStore->llCode, seqStore->mlCode,
         | 
| 3332 3361 | 
             
                                (size_t)(seqStore->sequences - seqStore->sequencesStart),
         | 
| 3333 | 
            -
                                &zc->blockState.nextCBlock->entropy,  | 
| 3334 | 
            -
                                (int)(entropyMetadata | 
| 3362 | 
            +
                                &zc->blockState.nextCBlock->entropy, entropyMetadata, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE,
         | 
| 3363 | 
            +
                                (int)(entropyMetadata->hufMetadata.hType == set_compressed), 1);
         | 
| 3335 3364 | 
             
            }
         | 
| 3336 3365 |  | 
| 3337 3366 | 
             
            /* Returns literals bytes represented in a seqStore */
         | 
| @@ -3356,7 +3385,7 @@ static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) { | |
| 3356 3385 | 
             
                size_t i;
         | 
| 3357 3386 | 
             
                for (i = 0; i < nbSeqs; ++i) {
         | 
| 3358 3387 | 
             
                    seqDef seq = seqStore->sequencesStart[i];
         | 
| 3359 | 
            -
                    matchBytes += seq. | 
| 3388 | 
            +
                    matchBytes += seq.mlBase + MINMATCH;
         | 
| 3360 3389 | 
             
                    if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_matchLength) {
         | 
| 3361 3390 | 
             
                        matchBytes += 0x10000;
         | 
| 3362 3391 | 
             
                    }
         | 
| @@ -3405,11 +3434,13 @@ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, | |
| 3405 3434 |  | 
| 3406 3435 | 
             
            /**
         | 
| 3407 3436 | 
             
             * Returns the raw offset represented by the combination of offCode, ll0, and repcode history.
         | 
| 3408 | 
            -
             * offCode must  | 
| 3437 | 
            +
             * offCode must represent a repcode in the numeric representation of ZSTD_storeSeq().
         | 
| 3409 3438 | 
             
             */
         | 
| 3410 | 
            -
            static U32 | 
| 3411 | 
            -
             | 
| 3412 | 
            -
             | 
| 3439 | 
            +
            static U32
         | 
| 3440 | 
            +
            ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offCode, const U32 ll0)
         | 
| 3441 | 
            +
            {
         | 
| 3442 | 
            +
                U32 const adjustedOffCode = STORED_REPCODE(offCode) - 1 + ll0;  /* [ 0 - 3 ] */
         | 
| 3443 | 
            +
                assert(STORED_IS_REPCODE(offCode));
         | 
| 3413 3444 | 
             
                if (adjustedOffCode == ZSTD_REP_NUM) {
         | 
| 3414 3445 | 
             
                    /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 */
         | 
| 3415 3446 | 
             
                    assert(rep[0] > 0);
         | 
| @@ -3420,11 +3451,16 @@ static U32 ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 | |
| 3420 3451 |  | 
| 3421 3452 | 
             
            /**
         | 
| 3422 3453 | 
             
             * ZSTD_seqStore_resolveOffCodes() reconciles any possible divergences in offset history that may arise
         | 
| 3423 | 
            -
             * due to emission of RLE/raw blocks that disturb the offset history, | 
| 3424 | 
            -
             * the seqStore that may be invalid.
         | 
| 3454 | 
            +
             * due to emission of RLE/raw blocks that disturb the offset history,
         | 
| 3455 | 
            +
             * and replaces any repcodes within the seqStore that may be invalid.
         | 
| 3456 | 
            +
             *
         | 
| 3457 | 
            +
             * dRepcodes are updated as would be on the decompression side.
         | 
| 3458 | 
            +
             * cRepcodes are updated exactly in accordance with the seqStore.
         | 
| 3425 3459 | 
             
             *
         | 
| 3426 | 
            -
             *  | 
| 3427 | 
            -
             *  | 
| 3460 | 
            +
             * Note : this function assumes seq->offBase respects the following numbering scheme :
         | 
| 3461 | 
            +
             *        0 : invalid
         | 
| 3462 | 
            +
             *        1-3 : repcode 1-3
         | 
| 3463 | 
            +
             *        4+ : real_offset+3
         | 
| 3428 3464 | 
             
             */
         | 
| 3429 3465 | 
             
            static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_t* const cRepcodes,
         | 
| 3430 3466 | 
             
                                                      seqStore_t* const seqStore, U32 const nbSeq) {
         | 
| @@ -3432,9 +3468,9 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ | |
| 3432 3468 | 
             
                for (; idx < nbSeq; ++idx) {
         | 
| 3433 3469 | 
             
                    seqDef* const seq = seqStore->sequencesStart + idx;
         | 
| 3434 3470 | 
             
                    U32 const ll0 = (seq->litLength == 0);
         | 
| 3435 | 
            -
                    U32 offCode = seq-> | 
| 3436 | 
            -
                    assert(seq-> | 
| 3437 | 
            -
                    if (offCode | 
| 3471 | 
            +
                    U32 const offCode = OFFBASE_TO_STORED(seq->offBase);
         | 
| 3472 | 
            +
                    assert(seq->offBase > 0);
         | 
| 3473 | 
            +
                    if (STORED_IS_REPCODE(offCode)) {
         | 
| 3438 3474 | 
             
                        U32 const dRawOffset = ZSTD_resolveRepcodeToRawOffset(dRepcodes->rep, offCode, ll0);
         | 
| 3439 3475 | 
             
                        U32 const cRawOffset = ZSTD_resolveRepcodeToRawOffset(cRepcodes->rep, offCode, ll0);
         | 
| 3440 3476 | 
             
                        /* Adjust simulated decompression repcode history if we come across a mismatch. Replace
         | 
| @@ -3442,14 +3478,14 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ | |
| 3442 3478 | 
             
                         * repcode history.
         | 
| 3443 3479 | 
             
                         */
         | 
| 3444 3480 | 
             
                        if (dRawOffset != cRawOffset) {
         | 
| 3445 | 
            -
                            seq-> | 
| 3481 | 
            +
                            seq->offBase = cRawOffset + ZSTD_REP_NUM;
         | 
| 3446 3482 | 
             
                        }
         | 
| 3447 3483 | 
             
                    }
         | 
| 3448 3484 | 
             
                    /* Compression repcode history is always updated with values directly from the unmodified seqStore.
         | 
| 3449 3485 | 
             
                     * Decompression repcode history may use modified seq->offset value taken from compression repcode history.
         | 
| 3450 3486 | 
             
                     */
         | 
| 3451 | 
            -
                     | 
| 3452 | 
            -
                     | 
| 3487 | 
            +
                    ZSTD_updateRep(dRepcodes->rep, OFFBASE_TO_STORED(seq->offBase), ll0);
         | 
| 3488 | 
            +
                    ZSTD_updateRep(cRepcodes->rep, offCode, ll0);
         | 
| 3453 3489 | 
             
                }
         | 
| 3454 3490 | 
             
            }
         | 
| 3455 3491 |  | 
| @@ -3458,11 +3494,13 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ | |
| 3458 3494 | 
             
             *
         | 
| 3459 3495 | 
             
             * Returns the total size of that block (including header) or a ZSTD error code.
         | 
| 3460 3496 | 
             
             */
         | 
| 3461 | 
            -
            static size_t | 
| 3462 | 
            -
             | 
| 3463 | 
            -
             | 
| 3464 | 
            -
             | 
| 3465 | 
            -
             | 
| 3497 | 
            +
            static size_t
         | 
| 3498 | 
            +
            ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const seqStore,
         | 
| 3499 | 
            +
                                              repcodes_t* const dRep, repcodes_t* const cRep,
         | 
| 3500 | 
            +
                                              void* dst, size_t dstCapacity,
         | 
| 3501 | 
            +
                                              const void* src, size_t srcSize,
         | 
| 3502 | 
            +
                                              U32 lastBlock, U32 isPartition)
         | 
| 3503 | 
            +
            {
         | 
| 3466 3504 | 
             
                const U32 rleMaxLength = 25;
         | 
| 3467 3505 | 
             
                BYTE* op = (BYTE*)dst;
         | 
| 3468 3506 | 
             
                const BYTE* ip = (const BYTE*)src;
         | 
| @@ -3471,9 +3509,11 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const | |
| 3471 3509 |  | 
| 3472 3510 | 
             
                /* In case of an RLE or raw block, the simulated decompression repcode history must be reset */
         | 
| 3473 3511 | 
             
                repcodes_t const dRepOriginal = *dRep;
         | 
| 3512 | 
            +
                DEBUGLOG(5, "ZSTD_compressSeqStore_singleBlock");
         | 
| 3474 3513 | 
             
                if (isPartition)
         | 
| 3475 3514 | 
             
                    ZSTD_seqStore_resolveOffCodes(dRep, cRep, seqStore, (U32)(seqStore->sequences - seqStore->sequencesStart));
         | 
| 3476 3515 |  | 
| 3516 | 
            +
                RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "Block header doesn't fit");
         | 
| 3477 3517 | 
             
                cSeqsSize = ZSTD_entropyCompressSeqStore(seqStore,
         | 
| 3478 3518 | 
             
                            &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy,
         | 
| 3479 3519 | 
             
                            &zc->appliedParams,
         | 
| @@ -3499,9 +3539,6 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const | |
| 3499 3539 | 
             
                    return 0;
         | 
| 3500 3540 | 
             
                }
         | 
| 3501 3541 |  | 
| 3502 | 
            -
                if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid)
         | 
| 3503 | 
            -
                    zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check;
         | 
| 3504 | 
            -
             | 
| 3505 3542 | 
             
                if (cSeqsSize == 0) {
         | 
| 3506 3543 | 
             
                    cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, srcSize, lastBlock);
         | 
| 3507 3544 | 
             
                    FORWARD_IF_ERROR(cSize, "Nocompress block failed");
         | 
| @@ -3518,6 +3555,10 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const | |
| 3518 3555 | 
             
                    cSize = ZSTD_blockHeaderSize + cSeqsSize;
         | 
| 3519 3556 | 
             
                    DEBUGLOG(4, "Writing out compressed block, size: %zu", cSize);
         | 
| 3520 3557 | 
             
                }
         | 
| 3558 | 
            +
             | 
| 3559 | 
            +
                if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid)
         | 
| 3560 | 
            +
                    zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check;
         | 
| 3561 | 
            +
             | 
| 3521 3562 | 
             
                return cSize;
         | 
| 3522 3563 | 
             
            }
         | 
| 3523 3564 |  | 
| @@ -3528,7 +3569,6 @@ typedef struct { | |
| 3528 3569 | 
             
            } seqStoreSplits;
         | 
| 3529 3570 |  | 
| 3530 3571 | 
             
            #define MIN_SEQUENCES_BLOCK_SPLITTING 300
         | 
| 3531 | 
            -
            #define MAX_NB_SPLITS 196
         | 
| 3532 3572 |  | 
| 3533 3573 | 
             
            /* Helper function to perform the recursive search for block splits.
         | 
| 3534 3574 | 
             
             * Estimates the cost of seqStore prior to split, and estimates the cost of splitting the sequences in half.
         | 
| @@ -3539,29 +3579,33 @@ typedef struct { | |
| 3539 3579 | 
             
             * In theory, this means the absolute largest recursion depth is 10 == log2(maxNbSeqInBlock/MIN_SEQUENCES_BLOCK_SPLITTING).
         | 
| 3540 3580 | 
             
             * In practice, recursion depth usually doesn't go beyond 4.
         | 
| 3541 3581 | 
             
             *
         | 
| 3542 | 
            -
             * Furthermore, the number of splits is capped by  | 
| 3582 | 
            +
             * Furthermore, the number of splits is capped by ZSTD_MAX_NB_BLOCK_SPLITS. At ZSTD_MAX_NB_BLOCK_SPLITS == 196 with the current existing blockSize
         | 
| 3543 3583 | 
             
             * maximum of 128 KB, this value is actually impossible to reach.
         | 
| 3544 3584 | 
             
             */
         | 
| 3545 | 
            -
            static void | 
| 3546 | 
            -
             | 
| 3547 | 
            -
             | 
| 3548 | 
            -
             | 
| 3549 | 
            -
                seqStore_t  | 
| 3585 | 
            +
            static void
         | 
| 3586 | 
            +
            ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t endIdx,
         | 
| 3587 | 
            +
                                         ZSTD_CCtx* zc, const seqStore_t* origSeqStore)
         | 
| 3588 | 
            +
            {
         | 
| 3589 | 
            +
                seqStore_t* fullSeqStoreChunk = &zc->blockSplitCtx.fullSeqStoreChunk;
         | 
| 3590 | 
            +
                seqStore_t* firstHalfSeqStore = &zc->blockSplitCtx.firstHalfSeqStore;
         | 
| 3591 | 
            +
                seqStore_t* secondHalfSeqStore = &zc->blockSplitCtx.secondHalfSeqStore;
         | 
| 3550 3592 | 
             
                size_t estimatedOriginalSize;
         | 
| 3551 3593 | 
             
                size_t estimatedFirstHalfSize;
         | 
| 3552 3594 | 
             
                size_t estimatedSecondHalfSize;
         | 
| 3553 3595 | 
             
                size_t midIdx = (startIdx + endIdx)/2;
         | 
| 3554 3596 |  | 
| 3555 | 
            -
                if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >=  | 
| 3597 | 
            +
                if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= ZSTD_MAX_NB_BLOCK_SPLITS) {
         | 
| 3598 | 
            +
                    DEBUGLOG(6, "ZSTD_deriveBlockSplitsHelper: Too few sequences");
         | 
| 3556 3599 | 
             
                    return;
         | 
| 3557 3600 | 
             
                }
         | 
| 3558 | 
            -
                 | 
| 3559 | 
            -
                ZSTD_deriveSeqStoreChunk( | 
| 3560 | 
            -
                ZSTD_deriveSeqStoreChunk( | 
| 3561 | 
            -
                 | 
| 3562 | 
            -
                 | 
| 3563 | 
            -
                 | 
| 3564 | 
            -
                 | 
| 3601 | 
            +
                DEBUGLOG(4, "ZSTD_deriveBlockSplitsHelper: startIdx=%zu endIdx=%zu", startIdx, endIdx);
         | 
| 3602 | 
            +
                ZSTD_deriveSeqStoreChunk(fullSeqStoreChunk, origSeqStore, startIdx, endIdx);
         | 
| 3603 | 
            +
                ZSTD_deriveSeqStoreChunk(firstHalfSeqStore, origSeqStore, startIdx, midIdx);
         | 
| 3604 | 
            +
                ZSTD_deriveSeqStoreChunk(secondHalfSeqStore, origSeqStore, midIdx, endIdx);
         | 
| 3605 | 
            +
                estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(fullSeqStoreChunk, zc);
         | 
| 3606 | 
            +
                estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(firstHalfSeqStore, zc);
         | 
| 3607 | 
            +
                estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(secondHalfSeqStore, zc);
         | 
| 3608 | 
            +
                DEBUGLOG(4, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu",
         | 
| 3565 3609 | 
             
                         estimatedOriginalSize, estimatedFirstHalfSize, estimatedSecondHalfSize);
         | 
| 3566 3610 | 
             
                if (ZSTD_isError(estimatedOriginalSize) || ZSTD_isError(estimatedFirstHalfSize) || ZSTD_isError(estimatedSecondHalfSize)) {
         | 
| 3567 3611 | 
             
                    return;
         | 
| @@ -3596,17 +3640,19 @@ static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) | |
| 3596 3640 | 
             
             *
         | 
| 3597 3641 | 
             
             * Returns combined size of all blocks (which includes headers), or a ZSTD error code.
         | 
| 3598 3642 | 
             
             */
         | 
| 3599 | 
            -
            static size_t | 
| 3600 | 
            -
             | 
| 3643 | 
            +
            static size_t
         | 
| 3644 | 
            +
            ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity,
         | 
| 3645 | 
            +
                                                   const void* src, size_t blockSize, U32 lastBlock, U32 nbSeq)
         | 
| 3646 | 
            +
            {
         | 
| 3601 3647 | 
             
                size_t cSize = 0;
         | 
| 3602 3648 | 
             
                const BYTE* ip = (const BYTE*)src;
         | 
| 3603 3649 | 
             
                BYTE* op = (BYTE*)dst;
         | 
| 3604 | 
            -
                U32 partitions[MAX_NB_SPLITS];
         | 
| 3605 3650 | 
             
                size_t i = 0;
         | 
| 3606 3651 | 
             
                size_t srcBytesTotal = 0;
         | 
| 3652 | 
            +
                U32* partitions = zc->blockSplitCtx.partitions; /* size == ZSTD_MAX_NB_BLOCK_SPLITS */
         | 
| 3653 | 
            +
                seqStore_t* nextSeqStore = &zc->blockSplitCtx.nextSeqStore;
         | 
| 3654 | 
            +
                seqStore_t* currSeqStore = &zc->blockSplitCtx.currSeqStore;
         | 
| 3607 3655 | 
             
                size_t numSplits = ZSTD_deriveBlockSplits(zc, partitions, nbSeq);
         | 
| 3608 | 
            -
                seqStore_t nextSeqStore;
         | 
| 3609 | 
            -
                seqStore_t currSeqStore;
         | 
| 3610 3656 |  | 
| 3611 3657 | 
             
                /* If a block is split and some partitions are emitted as RLE/uncompressed, then repcode history
         | 
| 3612 3658 | 
             
                 * may become invalid. In order to reconcile potentially invalid repcodes, we keep track of two
         | 
| @@ -3626,6 +3672,7 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s | |
| 3626 3672 | 
             
                repcodes_t cRep;
         | 
| 3627 3673 | 
             
                ZSTD_memcpy(dRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t));
         | 
| 3628 3674 | 
             
                ZSTD_memcpy(cRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t));
         | 
| 3675 | 
            +
                ZSTD_memset(nextSeqStore, 0, sizeof(seqStore_t));
         | 
| 3629 3676 |  | 
| 3630 3677 | 
             
                DEBUGLOG(4, "ZSTD_compressBlock_splitBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)",
         | 
| 3631 3678 | 
             
                            (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit,
         | 
| @@ -3643,36 +3690,36 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s | |
| 3643 3690 | 
             
                    return cSizeSingleBlock;
         | 
| 3644 3691 | 
             
                }
         | 
| 3645 3692 |  | 
| 3646 | 
            -
                ZSTD_deriveSeqStoreChunk( | 
| 3693 | 
            +
                ZSTD_deriveSeqStoreChunk(currSeqStore, &zc->seqStore, 0, partitions[0]);
         | 
| 3647 3694 | 
             
                for (i = 0; i <= numSplits; ++i) {
         | 
| 3648 3695 | 
             
                    size_t srcBytes;
         | 
| 3649 3696 | 
             
                    size_t cSizeChunk;
         | 
| 3650 3697 | 
             
                    U32 const lastPartition = (i == numSplits);
         | 
| 3651 3698 | 
             
                    U32 lastBlockEntireSrc = 0;
         | 
| 3652 3699 |  | 
| 3653 | 
            -
                    srcBytes = ZSTD_countSeqStoreLiteralsBytes( | 
| 3700 | 
            +
                    srcBytes = ZSTD_countSeqStoreLiteralsBytes(currSeqStore) + ZSTD_countSeqStoreMatchBytes(currSeqStore);
         | 
| 3654 3701 | 
             
                    srcBytesTotal += srcBytes;
         | 
| 3655 3702 | 
             
                    if (lastPartition) {
         | 
| 3656 3703 | 
             
                        /* This is the final partition, need to account for possible last literals */
         | 
| 3657 3704 | 
             
                        srcBytes += blockSize - srcBytesTotal;
         | 
| 3658 3705 | 
             
                        lastBlockEntireSrc = lastBlock;
         | 
| 3659 3706 | 
             
                    } else {
         | 
| 3660 | 
            -
                        ZSTD_deriveSeqStoreChunk( | 
| 3707 | 
            +
                        ZSTD_deriveSeqStoreChunk(nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]);
         | 
| 3661 3708 | 
             
                    }
         | 
| 3662 3709 |  | 
| 3663 | 
            -
                    cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc,  | 
| 3710 | 
            +
                    cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, currSeqStore,
         | 
| 3664 3711 | 
             
                                                                  &dRep, &cRep,
         | 
| 3665 3712 | 
             
                                                                   op, dstCapacity,
         | 
| 3666 3713 | 
             
                                                                   ip, srcBytes,
         | 
| 3667 3714 | 
             
                                                                   lastBlockEntireSrc, 1 /* isPartition */);
         | 
| 3668 | 
            -
                    DEBUGLOG(5, "Estimated size: %zu actual size: %zu", ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize( | 
| 3715 | 
            +
                    DEBUGLOG(5, "Estimated size: %zu actual size: %zu", ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(currSeqStore, zc), cSizeChunk);
         | 
| 3669 3716 | 
             
                    FORWARD_IF_ERROR(cSizeChunk, "Compressing chunk failed!");
         | 
| 3670 3717 |  | 
| 3671 3718 | 
             
                    ip += srcBytes;
         | 
| 3672 3719 | 
             
                    op += cSizeChunk;
         | 
| 3673 3720 | 
             
                    dstCapacity -= cSizeChunk;
         | 
| 3674 3721 | 
             
                    cSize += cSizeChunk;
         | 
| 3675 | 
            -
                    currSeqStore = nextSeqStore;
         | 
| 3722 | 
            +
                    *currSeqStore = *nextSeqStore;
         | 
| 3676 3723 | 
             
                    assert(cSizeChunk <= ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize);
         | 
| 3677 3724 | 
             
                }
         | 
| 3678 3725 | 
             
                /* cRep and dRep may have diverged during the compression. If so, we use the dRep repcodes
         | 
| @@ -3682,14 +3729,17 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s | |
| 3682 3729 | 
             
                return cSize;
         | 
| 3683 3730 | 
             
            }
         | 
| 3684 3731 |  | 
| 3685 | 
            -
            static size_t | 
| 3686 | 
            -
             | 
| 3687 | 
            -
             | 
| 3732 | 
            +
            static size_t
         | 
| 3733 | 
            +
            ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc,
         | 
| 3734 | 
            +
                                          void* dst, size_t dstCapacity,
         | 
| 3735 | 
            +
                                          const void* src, size_t srcSize, U32 lastBlock)
         | 
| 3736 | 
            +
            {
         | 
| 3688 3737 | 
             
                const BYTE* ip = (const BYTE*)src;
         | 
| 3689 3738 | 
             
                BYTE* op = (BYTE*)dst;
         | 
| 3690 3739 | 
             
                U32 nbSeq;
         | 
| 3691 3740 | 
             
                size_t cSize;
         | 
| 3692 3741 | 
             
                DEBUGLOG(4, "ZSTD_compressBlock_splitBlock");
         | 
| 3742 | 
            +
                assert(zc->appliedParams.useBlockSplitter == ZSTD_ps_enable);
         | 
| 3693 3743 |  | 
| 3694 3744 | 
             
                {   const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize);
         | 
| 3695 3745 | 
             
                    FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed");
         | 
| @@ -3704,15 +3754,15 @@ static size_t ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, | |
| 3704 3754 | 
             
                    nbSeq = (U32)(zc->seqStore.sequences - zc->seqStore.sequencesStart);
         | 
| 3705 3755 | 
             
                }
         | 
| 3706 3756 |  | 
| 3707 | 
            -
                assert(zc->appliedParams.splitBlocks == 1);
         | 
| 3708 3757 | 
             
                cSize = ZSTD_compressBlock_splitBlock_internal(zc, dst, dstCapacity, src, srcSize, lastBlock, nbSeq);
         | 
| 3709 3758 | 
             
                FORWARD_IF_ERROR(cSize, "Splitting blocks failed!");
         | 
| 3710 3759 | 
             
                return cSize;
         | 
| 3711 3760 | 
             
            }
         | 
| 3712 3761 |  | 
| 3713 | 
            -
            static size_t | 
| 3714 | 
            -
             | 
| 3715 | 
            -
             | 
| 3762 | 
            +
            static size_t
         | 
| 3763 | 
            +
            ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
         | 
| 3764 | 
            +
                                        void* dst, size_t dstCapacity,
         | 
| 3765 | 
            +
                                        const void* src, size_t srcSize, U32 frame)
         | 
| 3716 3766 | 
             
            {
         | 
| 3717 3767 | 
             
                /* This the upper bound for the length of an rle block.
         | 
| 3718 3768 | 
             
                 * This isn't the actual upper bound. Finding the real threshold
         | 
| @@ -3746,12 +3796,6 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, | |
| 3746 3796 | 
             
                        zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */,
         | 
| 3747 3797 | 
             
                        zc->bmi2);
         | 
| 3748 3798 |  | 
| 3749 | 
            -
                if (zc->seqCollector.collectSequences) {
         | 
| 3750 | 
            -
                    ZSTD_copyBlockSequences(zc);
         | 
| 3751 | 
            -
                    return 0;
         | 
| 3752 | 
            -
                }
         | 
| 3753 | 
            -
             | 
| 3754 | 
            -
             | 
| 3755 3799 | 
             
                if (frame &&
         | 
| 3756 3800 | 
             
                    /* We don't want to emit our first block as a RLE even if it qualifies because
         | 
| 3757 3801 | 
             
                     * doing so will cause the decoder (cli only) to throw a "should consume all input error."
         | 
| @@ -3915,6 +3959,7 @@ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, | |
| 3915 3959 | 
             
                    ZSTD_overflowCorrectIfNeeded(
         | 
| 3916 3960 | 
             
                        ms, &cctx->workspace, &cctx->appliedParams, ip, ip + blockSize);
         | 
| 3917 3961 | 
             
                    ZSTD_checkDictValidity(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState);
         | 
| 3962 | 
            +
                    ZSTD_window_enforceMaxDist(&ms->window, ip, maxDist, &ms->loadedDictEnd, &ms->dictMatchState);
         | 
| 3918 3963 |  | 
| 3919 3964 | 
             
                    /* Ensure hash/chain table insertion resumes no sooner than lowlimit */
         | 
| 3920 3965 | 
             
                    if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit;
         | 
| @@ -3991,7 +4036,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity, | |
| 3991 4036 | 
             
                if (!singleSegment) op[pos++] = windowLogByte;
         | 
| 3992 4037 | 
             
                switch(dictIDSizeCode)
         | 
| 3993 4038 | 
             
                {
         | 
| 3994 | 
            -
                    default: | 
| 4039 | 
            +
                    default:
         | 
| 4040 | 
            +
                        assert(0); /* impossible */
         | 
| 4041 | 
            +
                        ZSTD_FALLTHROUGH;
         | 
| 3995 4042 | 
             
                    case 0 : break;
         | 
| 3996 4043 | 
             
                    case 1 : op[pos] = (BYTE)(dictID); pos++; break;
         | 
| 3997 4044 | 
             
                    case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break;
         | 
| @@ -3999,7 +4046,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity, | |
| 3999 4046 | 
             
                }
         | 
| 4000 4047 | 
             
                switch(fcsCode)
         | 
| 4001 4048 | 
             
                {
         | 
| 4002 | 
            -
                    default: | 
| 4049 | 
            +
                    default:
         | 
| 4050 | 
            +
                        assert(0); /* impossible */
         | 
| 4051 | 
            +
                        ZSTD_FALLTHROUGH;
         | 
| 4003 4052 | 
             
                    case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break;
         | 
| 4004 4053 | 
             
                    case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break;
         | 
| 4005 4054 | 
             
                    case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break;
         | 
| @@ -4047,7 +4096,7 @@ size_t ZSTD_referenceExternalSequences(ZSTD_CCtx* cctx, rawSeq* seq, size_t nbSe | |
| 4047 4096 | 
             
            {
         | 
| 4048 4097 | 
             
                RETURN_ERROR_IF(cctx->stage != ZSTDcs_init, stage_wrong,
         | 
| 4049 4098 | 
             
                                "wrong cctx stage");
         | 
| 4050 | 
            -
                RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm,
         | 
| 4099 | 
            +
                RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable,
         | 
| 4051 4100 | 
             
                                parameter_unsupported,
         | 
| 4052 4101 | 
             
                                "incompatible with ldm");
         | 
| 4053 4102 | 
             
                cctx->externSeqStore.seq = seq;
         | 
| @@ -4088,7 +4137,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx, | |
| 4088 4137 | 
             
                    ms->forceNonContiguous = 0;
         | 
| 4089 4138 | 
             
                    ms->nextToUpdate = ms->window.dictLimit;
         | 
| 4090 4139 | 
             
                }
         | 
| 4091 | 
            -
                if (cctx->appliedParams.ldmParams.enableLdm) {
         | 
| 4140 | 
            +
                if (cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) {
         | 
| 4092 4141 | 
             
                    ZSTD_window_update(&cctx->ldmState.window, src, srcSize, /* forceNonContiguous */ 0);
         | 
| 4093 4142 | 
             
                }
         | 
| 4094 4143 |  | 
| @@ -4157,7 +4206,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, | |
| 4157 4206 | 
             
            {
         | 
| 4158 4207 | 
             
                const BYTE* ip = (const BYTE*) src;
         | 
| 4159 4208 | 
             
                const BYTE* const iend = ip + srcSize;
         | 
| 4160 | 
            -
                int const loadLdmDict = params->ldmParams.enableLdm && ls != NULL;
         | 
| 4209 | 
            +
                int const loadLdmDict = params->ldmParams.enableLdm == ZSTD_ps_enable && ls != NULL;
         | 
| 4161 4210 |  | 
| 4162 4211 | 
             
                /* Assert that we the ms params match the params we're being given */
         | 
| 4163 4212 | 
             
                ZSTD_assertEqualCParams(params->cParams, ms->cParams);
         | 
| @@ -4214,8 +4263,8 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, | |
| 4214 4263 | 
             
                        assert(ms->chainTable != NULL);
         | 
| 4215 4264 | 
             
                        ZSTD_dedicatedDictSearch_lazy_loadDictionary(ms, iend-HASH_READ_SIZE);
         | 
| 4216 4265 | 
             
                    } else {
         | 
| 4217 | 
            -
                        assert(params->useRowMatchFinder !=  | 
| 4218 | 
            -
                        if (params->useRowMatchFinder ==  | 
| 4266 | 
            +
                        assert(params->useRowMatchFinder != ZSTD_ps_auto);
         | 
| 4267 | 
            +
                        if (params->useRowMatchFinder == ZSTD_ps_enable) {
         | 
| 4219 4268 | 
             
                            size_t const tagTableSize = ((size_t)1 << params->cParams.hashLog) * sizeof(U16);
         | 
| 4220 4269 | 
             
                            ZSTD_memset(ms->tagTable, 0, tagTableSize);
         | 
| 4221 4270 | 
             
                            ZSTD_row_update(ms, iend-HASH_READ_SIZE);
         | 
| @@ -4715,7 +4764,7 @@ size_t ZSTD_estimateCDictSize_advanced( | |
| 4715 4764 | 
             
                     + ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE)
         | 
| 4716 4765 | 
             
                     /* enableDedicatedDictSearch == 1 ensures that CDict estimation will not be too small
         | 
| 4717 4766 | 
             
                      * in case we are using DDS with row-hash. */
         | 
| 4718 | 
            -
                     + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode( | 
| 4767 | 
            +
                     + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams),
         | 
| 4719 4768 | 
             
                                              /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0)
         | 
| 4720 4769 | 
             
                     + (dictLoadMethod == ZSTD_dlm_byRef ? 0
         | 
| 4721 4770 | 
             
                        : ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void *))));
         | 
| @@ -4792,7 +4841,7 @@ static size_t ZSTD_initCDict_internal( | |
| 4792 4841 | 
             
            static ZSTD_CDict* ZSTD_createCDict_advanced_internal(size_t dictSize,
         | 
| 4793 4842 | 
             
                                                  ZSTD_dictLoadMethod_e dictLoadMethod,
         | 
| 4794 4843 | 
             
                                                  ZSTD_compressionParameters cParams,
         | 
| 4795 | 
            -
                                                   | 
| 4844 | 
            +
                                                  ZSTD_paramSwitch_e useRowMatchFinder,
         | 
| 4796 4845 | 
             
                                                  U32 enableDedicatedDictSearch,
         | 
| 4797 4846 | 
             
                                                  ZSTD_customMem customMem)
         | 
| 4798 4847 | 
             
            {
         | 
| @@ -4842,7 +4891,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize, | |
| 4842 4891 | 
             
                    &cctxParams, customMem);
         | 
| 4843 4892 | 
             
            }
         | 
| 4844 4893 |  | 
| 4845 | 
            -
             | 
| 4894 | 
            +
            ZSTD_CDict* ZSTD_createCDict_advanced2(
         | 
| 4846 4895 | 
             
                    const void* dict, size_t dictSize,
         | 
| 4847 4896 | 
             
                    ZSTD_dictLoadMethod_e dictLoadMethod,
         | 
| 4848 4897 | 
             
                    ZSTD_dictContentType_e dictContentType,
         | 
| @@ -4947,7 +4996,7 @@ const ZSTD_CDict* ZSTD_initStaticCDict( | |
| 4947 4996 | 
             
                                             ZSTD_dictContentType_e dictContentType,
         | 
| 4948 4997 | 
             
                                             ZSTD_compressionParameters cParams)
         | 
| 4949 4998 | 
             
            {
         | 
| 4950 | 
            -
                 | 
| 4999 | 
            +
                ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams);
         | 
| 4951 5000 | 
             
                /* enableDedicatedDictSearch == 1 ensures matchstate is not too small in case this CDict will be used for DDS + row hash */
         | 
| 4952 5001 | 
             
                size_t const matchStateSize = ZSTD_sizeof_matchState(&cParams, useRowMatchFinder, /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0);
         | 
| 4953 5002 | 
             
                size_t const neededSize = ZSTD_cwksp_alloc_size(sizeof(ZSTD_CDict))
         | 
| @@ -5403,7 +5452,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, | |
| 5403 5452 | 
             
                            zcs->outBuffFlushedSize = 0;
         | 
| 5404 5453 | 
             
                            zcs->streamStage = zcss_flush; /* pass-through to flush stage */
         | 
| 5405 5454 | 
             
                        }
         | 
| 5406 | 
            -
            	     | 
| 5455 | 
            +
            	    ZSTD_FALLTHROUGH;
         | 
| 5407 5456 | 
             
                    case zcss_flush:
         | 
| 5408 5457 | 
             
                        DEBUGLOG(5, "flush stage");
         | 
| 5409 5458 | 
             
                        assert(zcs->appliedParams.outBufferMode == ZSTD_bm_buffered);
         | 
| @@ -5524,17 +5573,8 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, | |
| 5524 5573 | 
             
                            dictSize, mode);
         | 
| 5525 5574 | 
             
                }
         | 
| 5526 5575 |  | 
| 5527 | 
            -
                 | 
| 5528 | 
            -
             | 
| 5529 | 
            -
                    DEBUGLOG(4, "LDM enabled by default (window size >= 128MB, strategy >= btopt)");
         | 
| 5530 | 
            -
                    params.ldmParams.enableLdm = 1;
         | 
| 5531 | 
            -
                }
         | 
| 5532 | 
            -
             | 
| 5533 | 
            -
                if (ZSTD_CParams_useBlockSplitter(¶ms.cParams)) {
         | 
| 5534 | 
            -
                    DEBUGLOG(4, "Block splitter enabled by default (window size >= 128K, strategy >= btopt)");
         | 
| 5535 | 
            -
                    params.splitBlocks = 1;
         | 
| 5536 | 
            -
                }
         | 
| 5537 | 
            -
             | 
| 5576 | 
            +
                params.useBlockSplitter = ZSTD_resolveBlockSplitterMode(params.useBlockSplitter, ¶ms.cParams);
         | 
| 5577 | 
            +
                params.ldmParams.enableLdm = ZSTD_resolveEnableLdm(params.ldmParams.enableLdm, ¶ms.cParams);
         | 
| 5538 5578 | 
             
                params.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params.useRowMatchFinder, ¶ms.cParams);
         | 
| 5539 5579 |  | 
| 5540 5580 | 
             
            #ifdef ZSTD_MULTITHREAD
         | 
| @@ -5715,39 +5755,39 @@ typedef struct { | |
| 5715 5755 | 
             
                size_t posInSrc;        /* Number of bytes given by sequences provided so far */
         | 
| 5716 5756 | 
             
            } ZSTD_sequencePosition;
         | 
| 5717 5757 |  | 
| 5718 | 
            -
            /*  | 
| 5719 | 
            -
             | 
| 5720 | 
            -
             | 
| 5721 | 
            -
             | 
| 5722 | 
            -
             | 
| 5758 | 
            +
            /* ZSTD_validateSequence() :
         | 
| 5759 | 
            +
             * @offCode : is presumed to follow format required by ZSTD_storeSeq()
         | 
| 5760 | 
            +
             * @returns a ZSTD error code if sequence is not valid
         | 
| 5761 | 
            +
             */
         | 
| 5762 | 
            +
            static size_t
         | 
| 5763 | 
            +
            ZSTD_validateSequence(U32 offCode, U32 matchLength,
         | 
| 5764 | 
            +
                                  size_t posInSrc, U32 windowLog, size_t dictSize)
         | 
| 5765 | 
            +
            {
         | 
| 5766 | 
            +
                U32 const windowSize = 1 << windowLog;
         | 
| 5723 5767 | 
             
                /* posInSrc represents the amount of data the the decoder would decode up to this point.
         | 
| 5724 5768 | 
             
                 * As long as the amount of data decoded is less than or equal to window size, offsets may be
         | 
| 5725 5769 | 
             
                 * larger than the total length of output decoded in order to reference the dict, even larger than
         | 
| 5726 5770 | 
             
                 * window size. After output surpasses windowSize, we're limited to windowSize offsets again.
         | 
| 5727 5771 | 
             
                 */
         | 
| 5728 | 
            -
                offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize;
         | 
| 5729 | 
            -
                RETURN_ERROR_IF(offCode > offsetBound | 
| 5730 | 
            -
                RETURN_ERROR_IF(matchLength <  | 
| 5772 | 
            +
                size_t const offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize;
         | 
| 5773 | 
            +
                RETURN_ERROR_IF(offCode > STORE_OFFSET(offsetBound), corruption_detected, "Offset too large!");
         | 
| 5774 | 
            +
                RETURN_ERROR_IF(matchLength < MINMATCH, corruption_detected, "Matchlength too small");
         | 
| 5731 5775 | 
             
                return 0;
         | 
| 5732 5776 | 
             
            }
         | 
| 5733 5777 |  | 
| 5734 5778 | 
             
            /* Returns an offset code, given a sequence's raw offset, the ongoing repcode array, and whether litLength == 0 */
         | 
| 5735 | 
            -
            static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) | 
| 5736 | 
            -
             | 
| 5737 | 
            -
                U32  | 
| 5779 | 
            +
            static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0)
         | 
| 5780 | 
            +
            {
         | 
| 5781 | 
            +
                U32 offCode = STORE_OFFSET(rawOffset);
         | 
| 5738 5782 |  | 
| 5739 5783 | 
             
                if (!ll0 && rawOffset == rep[0]) {
         | 
| 5740 | 
            -
                     | 
| 5784 | 
            +
                    offCode = STORE_REPCODE_1;
         | 
| 5741 5785 | 
             
                } else if (rawOffset == rep[1]) {
         | 
| 5742 | 
            -
                     | 
| 5786 | 
            +
                    offCode = STORE_REPCODE(2 - ll0);
         | 
| 5743 5787 | 
             
                } else if (rawOffset == rep[2]) {
         | 
| 5744 | 
            -
                     | 
| 5788 | 
            +
                    offCode = STORE_REPCODE(3 - ll0);
         | 
| 5745 5789 | 
             
                } else if (ll0 && rawOffset == rep[0] - 1) {
         | 
| 5746 | 
            -
                     | 
| 5747 | 
            -
                }
         | 
| 5748 | 
            -
                if (repCode) {
         | 
| 5749 | 
            -
                    /* ZSTD_storeSeq expects a number in the range [0, 2] to represent a repcode */
         | 
| 5750 | 
            -
                    offCode = repCode - 1;
         | 
| 5790 | 
            +
                    offCode = STORE_REPCODE_3;
         | 
| 5751 5791 | 
             
                }
         | 
| 5752 5792 | 
             
                return offCode;
         | 
| 5753 5793 | 
             
            }
         | 
| @@ -5755,18 +5795,17 @@ static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 | |
| 5755 5795 | 
             
            /* Returns 0 on success, and a ZSTD_error otherwise. This function scans through an array of
         | 
| 5756 5796 | 
             
             * ZSTD_Sequence, storing the sequences it finds, until it reaches a block delimiter.
         | 
| 5757 5797 | 
             
             */
         | 
| 5758 | 
            -
            static size_t | 
| 5759 | 
            -
             | 
| 5760 | 
            -
             | 
| 5798 | 
            +
            static size_t
         | 
| 5799 | 
            +
            ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx,
         | 
| 5800 | 
            +
                                                          ZSTD_sequencePosition* seqPos,
         | 
| 5801 | 
            +
                                                    const ZSTD_Sequence* const inSeqs, size_t inSeqsSize,
         | 
| 5802 | 
            +
                                                    const void* src, size_t blockSize)
         | 
| 5803 | 
            +
            {
         | 
| 5761 5804 | 
             
                U32 idx = seqPos->idx;
         | 
| 5762 5805 | 
             
                BYTE const* ip = (BYTE const*)(src);
         | 
| 5763 5806 | 
             
                const BYTE* const iend = ip + blockSize;
         | 
| 5764 5807 | 
             
                repcodes_t updatedRepcodes;
         | 
| 5765 5808 | 
             
                U32 dictSize;
         | 
| 5766 | 
            -
                U32 litLength;
         | 
| 5767 | 
            -
                U32 matchLength;
         | 
| 5768 | 
            -
                U32 ll0;
         | 
| 5769 | 
            -
                U32 offCode;
         | 
| 5770 5809 |  | 
| 5771 5810 | 
             
                if (cctx->cdict) {
         | 
| 5772 5811 | 
             
                    dictSize = (U32)cctx->cdict->dictContentSize;
         | 
| @@ -5777,23 +5816,22 @@ static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZS | |
| 5777 5816 | 
             
                }
         | 
| 5778 5817 | 
             
                ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t));
         | 
| 5779 5818 | 
             
                for (; (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0) && idx < inSeqsSize; ++idx) {
         | 
| 5780 | 
            -
                    litLength = inSeqs[idx].litLength;
         | 
| 5781 | 
            -
                     | 
| 5782 | 
            -
                     | 
| 5783 | 
            -
                    offCode = ZSTD_finalizeOffCode(inSeqs[idx].offset, updatedRepcodes.rep, ll0);
         | 
| 5784 | 
            -
                     | 
| 5819 | 
            +
                    U32 const litLength = inSeqs[idx].litLength;
         | 
| 5820 | 
            +
                    U32 const ll0 = (litLength == 0);
         | 
| 5821 | 
            +
                    U32 const matchLength = inSeqs[idx].matchLength;
         | 
| 5822 | 
            +
                    U32 const offCode = ZSTD_finalizeOffCode(inSeqs[idx].offset, updatedRepcodes.rep, ll0);
         | 
| 5823 | 
            +
                    ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0);
         | 
| 5785 5824 |  | 
| 5786 5825 | 
             
                    DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength);
         | 
| 5787 5826 | 
             
                    if (cctx->appliedParams.validateSequences) {
         | 
| 5788 5827 | 
             
                        seqPos->posInSrc += litLength + matchLength;
         | 
| 5789 5828 | 
             
                        FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc,
         | 
| 5790 | 
            -
                                                            cctx->appliedParams.cParams.windowLog, dictSize,
         | 
| 5791 | 
            -
                                                            cctx->appliedParams.cParams.minMatch),
         | 
| 5829 | 
            +
                                                            cctx->appliedParams.cParams.windowLog, dictSize),
         | 
| 5792 5830 | 
             
                                                            "Sequence validation failed");
         | 
| 5793 5831 | 
             
                    }
         | 
| 5794 5832 | 
             
                    RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation,
         | 
| 5795 5833 | 
             
                                    "Not enough memory allocated. Try adjusting ZSTD_c_minMatch.");
         | 
| 5796 | 
            -
                    ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength | 
| 5834 | 
            +
                    ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength);
         | 
| 5797 5835 | 
             
                    ip += matchLength + litLength;
         | 
| 5798 5836 | 
             
                }
         | 
| 5799 5837 | 
             
                ZSTD_memcpy(cctx->blockState.nextCBlock->rep, updatedRepcodes.rep, sizeof(repcodes_t));
         | 
| @@ -5820,9 +5858,11 @@ static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZS | |
| 5820 5858 | 
             
             * avoid splitting a match, or to avoid splitting a match such that it would produce a match
         | 
| 5821 5859 | 
             
             * smaller than MINMATCH. In this case, we return the number of bytes that we didn't read from this block.
         | 
| 5822 5860 | 
             
             */
         | 
| 5823 | 
            -
            static size_t | 
| 5824 | 
            -
             | 
| 5825 | 
            -
             | 
| 5861 | 
            +
            static size_t
         | 
| 5862 | 
            +
            ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos,
         | 
| 5863 | 
            +
                                               const ZSTD_Sequence* const inSeqs, size_t inSeqsSize,
         | 
| 5864 | 
            +
                                               const void* src, size_t blockSize)
         | 
| 5865 | 
            +
            {
         | 
| 5826 5866 | 
             
                U32 idx = seqPos->idx;
         | 
| 5827 5867 | 
             
                U32 startPosInSequence = seqPos->posInSequence;
         | 
| 5828 5868 | 
             
                U32 endPosInSequence = seqPos->posInSequence + (U32)blockSize;
         | 
| @@ -5832,10 +5872,6 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq | |
| 5832 5872 | 
             
                repcodes_t updatedRepcodes;
         | 
| 5833 5873 | 
             
                U32 bytesAdjustment = 0;
         | 
| 5834 5874 | 
             
                U32 finalMatchSplit = 0;
         | 
| 5835 | 
            -
                U32 litLength;
         | 
| 5836 | 
            -
                U32 matchLength;
         | 
| 5837 | 
            -
                U32 rawOffset;
         | 
| 5838 | 
            -
                U32 offCode;
         | 
| 5839 5875 |  | 
| 5840 5876 | 
             
                if (cctx->cdict) {
         | 
| 5841 5877 | 
             
                    dictSize = cctx->cdict->dictContentSize;
         | 
| @@ -5849,9 +5885,10 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq | |
| 5849 5885 | 
             
                ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t));
         | 
| 5850 5886 | 
             
                while (endPosInSequence && idx < inSeqsSize && !finalMatchSplit) {
         | 
| 5851 5887 | 
             
                    const ZSTD_Sequence currSeq = inSeqs[idx];
         | 
| 5852 | 
            -
                    litLength = currSeq.litLength;
         | 
| 5853 | 
            -
                    matchLength = currSeq.matchLength;
         | 
| 5854 | 
            -
                    rawOffset = currSeq.offset;
         | 
| 5888 | 
            +
                    U32 litLength = currSeq.litLength;
         | 
| 5889 | 
            +
                    U32 matchLength = currSeq.matchLength;
         | 
| 5890 | 
            +
                    U32 const rawOffset = currSeq.offset;
         | 
| 5891 | 
            +
                    U32 offCode;
         | 
| 5855 5892 |  | 
| 5856 5893 | 
             
                    /* Modify the sequence depending on where endPosInSequence lies */
         | 
| 5857 5894 | 
             
                    if (endPosInSequence >= currSeq.litLength + currSeq.matchLength) {
         | 
| @@ -5904,22 +5941,21 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq | |
| 5904 5941 | 
             
                        }
         | 
| 5905 5942 | 
             
                    }
         | 
| 5906 5943 | 
             
                    /* Check if this offset can be represented with a repcode */
         | 
| 5907 | 
            -
                    {   U32 ll0 = (litLength == 0);
         | 
| 5944 | 
            +
                    {   U32 const ll0 = (litLength == 0);
         | 
| 5908 5945 | 
             
                        offCode = ZSTD_finalizeOffCode(rawOffset, updatedRepcodes.rep, ll0);
         | 
| 5909 | 
            -
                         | 
| 5946 | 
            +
                        ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0);
         | 
| 5910 5947 | 
             
                    }
         | 
| 5911 5948 |  | 
| 5912 5949 | 
             
                    if (cctx->appliedParams.validateSequences) {
         | 
| 5913 5950 | 
             
                        seqPos->posInSrc += litLength + matchLength;
         | 
| 5914 5951 | 
             
                        FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc,
         | 
| 5915 | 
            -
                                                               cctx->appliedParams.cParams.windowLog, dictSize,
         | 
| 5916 | 
            -
                                                               cctx->appliedParams.cParams.minMatch),
         | 
| 5952 | 
            +
                                                               cctx->appliedParams.cParams.windowLog, dictSize),
         | 
| 5917 5953 | 
             
                                                               "Sequence validation failed");
         | 
| 5918 5954 | 
             
                    }
         | 
| 5919 5955 | 
             
                    DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength);
         | 
| 5920 5956 | 
             
                    RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation,
         | 
| 5921 5957 | 
             
                                    "Not enough memory allocated. Try adjusting ZSTD_c_minMatch.");
         | 
| 5922 | 
            -
                    ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength | 
| 5958 | 
            +
                    ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength);
         | 
| 5923 5959 | 
             
                    ip += matchLength + litLength;
         | 
| 5924 5960 | 
             
                }
         | 
| 5925 5961 | 
             
                DEBUGLOG(5, "Ending seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength);
         | 
| @@ -5944,7 +5980,8 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq | |
| 5944 5980 | 
             
            typedef size_t (*ZSTD_sequenceCopier) (ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos,
         | 
| 5945 5981 | 
             
                                                   const ZSTD_Sequence* const inSeqs, size_t inSeqsSize,
         | 
| 5946 5982 | 
             
                                                   const void* src, size_t blockSize);
         | 
| 5947 | 
            -
            static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) | 
| 5983 | 
            +
            static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode)
         | 
| 5984 | 
            +
            {
         | 
| 5948 5985 | 
             
                ZSTD_sequenceCopier sequenceCopier = NULL;
         | 
| 5949 5986 | 
             
                assert(ZSTD_cParam_withinBounds(ZSTD_c_blockDelimiters, mode));
         | 
| 5950 5987 | 
             
                if (mode == ZSTD_sf_explicitBlockDelimiters) {
         | 
| @@ -5958,12 +5995,15 @@ static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) | |
| 5958 5995 |  | 
| 5959 5996 | 
             
            /* Compress, block-by-block, all of the sequences given.
         | 
| 5960 5997 | 
             
             *
         | 
| 5961 | 
            -
             * Returns the cumulative size of all compressed blocks (including their headers), | 
| 5998 | 
            +
             * Returns the cumulative size of all compressed blocks (including their headers),
         | 
| 5999 | 
            +
             * otherwise a ZSTD error.
         | 
| 5962 6000 | 
             
             */
         | 
| 5963 | 
            -
            static size_t | 
| 5964 | 
            -
             | 
| 5965 | 
            -
             | 
| 5966 | 
            -
             | 
| 6001 | 
            +
            static size_t
         | 
| 6002 | 
            +
            ZSTD_compressSequences_internal(ZSTD_CCtx* cctx,
         | 
| 6003 | 
            +
                                            void* dst, size_t dstCapacity,
         | 
| 6004 | 
            +
                                      const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
         | 
| 6005 | 
            +
                                      const void* src, size_t srcSize)
         | 
| 6006 | 
            +
            {
         | 
| 5967 6007 | 
             
                size_t cSize = 0;
         | 
| 5968 6008 | 
             
                U32 lastBlock;
         | 
| 5969 6009 | 
             
                size_t blockSize;
         | 
| @@ -5973,7 +6013,7 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, | |
| 5973 6013 |  | 
| 5974 6014 | 
             
                BYTE const* ip = (BYTE const*)src;
         | 
| 5975 6015 | 
             
                BYTE* op = (BYTE*)dst;
         | 
| 5976 | 
            -
                ZSTD_sequenceCopier sequenceCopier = ZSTD_selectSequenceCopier(cctx->appliedParams.blockDelimiters);
         | 
| 6016 | 
            +
                ZSTD_sequenceCopier const sequenceCopier = ZSTD_selectSequenceCopier(cctx->appliedParams.blockDelimiters);
         | 
| 5977 6017 |  | 
| 5978 6018 | 
             
                DEBUGLOG(4, "ZSTD_compressSequences_internal srcSize: %zu, inSeqsSize: %zu", srcSize, inSeqsSize);
         | 
| 5979 6019 | 
             
                /* Special case: empty frame */
         | 
| @@ -6073,7 +6113,8 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, | |
| 6073 6113 |  | 
| 6074 6114 | 
             
            size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapacity,
         | 
| 6075 6115 | 
             
                                          const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
         | 
| 6076 | 
            -
                                          const void* src, size_t srcSize) | 
| 6116 | 
            +
                                          const void* src, size_t srcSize)
         | 
| 6117 | 
            +
            {
         | 
| 6077 6118 | 
             
                BYTE* op = (BYTE*)dst;
         | 
| 6078 6119 | 
             
                size_t cSize = 0;
         | 
| 6079 6120 | 
             
                size_t compressedBlocksSize = 0;
         | 
| @@ -6140,119 +6181,12 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) | |
| 6140 6181 |  | 
| 6141 6182 |  | 
| 6142 6183 | 
             
            /*-=====  Pre-defined compression levels  =====-*/
         | 
| 6184 | 
            +
            #include "clevels.h"
         | 
| 6143 6185 |  | 
| 6144 | 
            -
            #define ZSTD_MAX_CLEVEL     22
         | 
| 6145 6186 | 
             
            int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
         | 
| 6146 6187 | 
             
            int ZSTD_minCLevel(void) { return (int)-ZSTD_TARGETLENGTH_MAX; }
         | 
| 6147 6188 | 
             
            int ZSTD_defaultCLevel(void) { return ZSTD_CLEVEL_DEFAULT; }
         | 
| 6148 6189 |  | 
| 6149 | 
            -
            static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = {
         | 
| 6150 | 
            -
            {   /* "default" - for any srcSize > 256 KB */
         | 
| 6151 | 
            -
                /* W,  C,  H,  S,  L, TL, strat */
         | 
| 6152 | 
            -
                { 19, 12, 13,  1,  6,  1, ZSTD_fast    },  /* base for negative levels */
         | 
| 6153 | 
            -
                { 19, 13, 14,  1,  7,  0, ZSTD_fast    },  /* level  1 */
         | 
| 6154 | 
            -
                { 20, 15, 16,  1,  6,  0, ZSTD_fast    },  /* level  2 */
         | 
| 6155 | 
            -
                { 21, 16, 17,  1,  5,  0, ZSTD_dfast   },  /* level  3 */
         | 
| 6156 | 
            -
                { 21, 18, 18,  1,  5,  0, ZSTD_dfast   },  /* level  4 */
         | 
| 6157 | 
            -
                { 21, 18, 19,  2,  5,  2, ZSTD_greedy  },  /* level  5 */
         | 
| 6158 | 
            -
                { 21, 19, 19,  3,  5,  4, ZSTD_greedy  },  /* level  6 */
         | 
| 6159 | 
            -
                { 21, 19, 19,  3,  5,  8, ZSTD_lazy    },  /* level  7 */
         | 
| 6160 | 
            -
                { 21, 19, 19,  3,  5, 16, ZSTD_lazy2   },  /* level  8 */
         | 
| 6161 | 
            -
                { 21, 19, 20,  4,  5, 16, ZSTD_lazy2   },  /* level  9 */
         | 
| 6162 | 
            -
                { 22, 20, 21,  4,  5, 16, ZSTD_lazy2   },  /* level 10 */
         | 
| 6163 | 
            -
                { 22, 21, 22,  4,  5, 16, ZSTD_lazy2   },  /* level 11 */
         | 
| 6164 | 
            -
                { 22, 21, 22,  5,  5, 16, ZSTD_lazy2   },  /* level 12 */
         | 
| 6165 | 
            -
                { 22, 21, 22,  5,  5, 32, ZSTD_btlazy2 },  /* level 13 */
         | 
| 6166 | 
            -
                { 22, 22, 23,  5,  5, 32, ZSTD_btlazy2 },  /* level 14 */
         | 
| 6167 | 
            -
                { 22, 23, 23,  6,  5, 32, ZSTD_btlazy2 },  /* level 15 */
         | 
| 6168 | 
            -
                { 22, 22, 22,  5,  5, 48, ZSTD_btopt   },  /* level 16 */
         | 
| 6169 | 
            -
                { 23, 23, 22,  5,  4, 64, ZSTD_btopt   },  /* level 17 */
         | 
| 6170 | 
            -
                { 23, 23, 22,  6,  3, 64, ZSTD_btultra },  /* level 18 */
         | 
| 6171 | 
            -
                { 23, 24, 22,  7,  3,256, ZSTD_btultra2},  /* level 19 */
         | 
| 6172 | 
            -
                { 25, 25, 23,  7,  3,256, ZSTD_btultra2},  /* level 20 */
         | 
| 6173 | 
            -
                { 26, 26, 24,  7,  3,512, ZSTD_btultra2},  /* level 21 */
         | 
| 6174 | 
            -
                { 27, 27, 25,  9,  3,999, ZSTD_btultra2},  /* level 22 */
         | 
| 6175 | 
            -
            },
         | 
| 6176 | 
            -
            {   /* for srcSize <= 256 KB */
         | 
| 6177 | 
            -
                /* W,  C,  H,  S,  L,  T, strat */
         | 
| 6178 | 
            -
                { 18, 12, 13,  1,  5,  1, ZSTD_fast    },  /* base for negative levels */
         | 
| 6179 | 
            -
                { 18, 13, 14,  1,  6,  0, ZSTD_fast    },  /* level  1 */
         | 
| 6180 | 
            -
                { 18, 14, 14,  1,  5,  0, ZSTD_dfast   },  /* level  2 */
         | 
| 6181 | 
            -
                { 18, 16, 16,  1,  4,  0, ZSTD_dfast   },  /* level  3 */
         | 
| 6182 | 
            -
                { 18, 16, 17,  2,  5,  2, ZSTD_greedy  },  /* level  4.*/
         | 
| 6183 | 
            -
                { 18, 18, 18,  3,  5,  2, ZSTD_greedy  },  /* level  5.*/
         | 
| 6184 | 
            -
                { 18, 18, 19,  3,  5,  4, ZSTD_lazy    },  /* level  6.*/
         | 
| 6185 | 
            -
                { 18, 18, 19,  4,  4,  4, ZSTD_lazy    },  /* level  7 */
         | 
| 6186 | 
            -
                { 18, 18, 19,  4,  4,  8, ZSTD_lazy2   },  /* level  8 */
         | 
| 6187 | 
            -
                { 18, 18, 19,  5,  4,  8, ZSTD_lazy2   },  /* level  9 */
         | 
| 6188 | 
            -
                { 18, 18, 19,  6,  4,  8, ZSTD_lazy2   },  /* level 10 */
         | 
| 6189 | 
            -
                { 18, 18, 19,  5,  4, 12, ZSTD_btlazy2 },  /* level 11.*/
         | 
| 6190 | 
            -
                { 18, 19, 19,  7,  4, 12, ZSTD_btlazy2 },  /* level 12.*/
         | 
| 6191 | 
            -
                { 18, 18, 19,  4,  4, 16, ZSTD_btopt   },  /* level 13 */
         | 
| 6192 | 
            -
                { 18, 18, 19,  4,  3, 32, ZSTD_btopt   },  /* level 14.*/
         | 
| 6193 | 
            -
                { 18, 18, 19,  6,  3,128, ZSTD_btopt   },  /* level 15.*/
         | 
| 6194 | 
            -
                { 18, 19, 19,  6,  3,128, ZSTD_btultra },  /* level 16.*/
         | 
| 6195 | 
            -
                { 18, 19, 19,  8,  3,256, ZSTD_btultra },  /* level 17.*/
         | 
| 6196 | 
            -
                { 18, 19, 19,  6,  3,128, ZSTD_btultra2},  /* level 18.*/
         | 
| 6197 | 
            -
                { 18, 19, 19,  8,  3,256, ZSTD_btultra2},  /* level 19.*/
         | 
| 6198 | 
            -
                { 18, 19, 19, 10,  3,512, ZSTD_btultra2},  /* level 20.*/
         | 
| 6199 | 
            -
                { 18, 19, 19, 12,  3,512, ZSTD_btultra2},  /* level 21.*/
         | 
| 6200 | 
            -
                { 18, 19, 19, 13,  3,999, ZSTD_btultra2},  /* level 22.*/
         | 
| 6201 | 
            -
            },
         | 
| 6202 | 
            -
            {   /* for srcSize <= 128 KB */
         | 
| 6203 | 
            -
                /* W,  C,  H,  S,  L,  T, strat */
         | 
| 6204 | 
            -
                { 17, 12, 12,  1,  5,  1, ZSTD_fast    },  /* base for negative levels */
         | 
| 6205 | 
            -
                { 17, 12, 13,  1,  6,  0, ZSTD_fast    },  /* level  1 */
         | 
| 6206 | 
            -
                { 17, 13, 15,  1,  5,  0, ZSTD_fast    },  /* level  2 */
         | 
| 6207 | 
            -
                { 17, 15, 16,  2,  5,  0, ZSTD_dfast   },  /* level  3 */
         | 
| 6208 | 
            -
                { 17, 17, 17,  2,  4,  0, ZSTD_dfast   },  /* level  4 */
         | 
| 6209 | 
            -
                { 17, 16, 17,  3,  4,  2, ZSTD_greedy  },  /* level  5 */
         | 
| 6210 | 
            -
                { 17, 17, 17,  3,  4,  4, ZSTD_lazy    },  /* level  6 */
         | 
| 6211 | 
            -
                { 17, 17, 17,  3,  4,  8, ZSTD_lazy2   },  /* level  7 */
         | 
| 6212 | 
            -
                { 17, 17, 17,  4,  4,  8, ZSTD_lazy2   },  /* level  8 */
         | 
| 6213 | 
            -
                { 17, 17, 17,  5,  4,  8, ZSTD_lazy2   },  /* level  9 */
         | 
| 6214 | 
            -
                { 17, 17, 17,  6,  4,  8, ZSTD_lazy2   },  /* level 10 */
         | 
| 6215 | 
            -
                { 17, 17, 17,  5,  4,  8, ZSTD_btlazy2 },  /* level 11 */
         | 
| 6216 | 
            -
                { 17, 18, 17,  7,  4, 12, ZSTD_btlazy2 },  /* level 12 */
         | 
| 6217 | 
            -
                { 17, 18, 17,  3,  4, 12, ZSTD_btopt   },  /* level 13.*/
         | 
| 6218 | 
            -
                { 17, 18, 17,  4,  3, 32, ZSTD_btopt   },  /* level 14.*/
         | 
| 6219 | 
            -
                { 17, 18, 17,  6,  3,256, ZSTD_btopt   },  /* level 15.*/
         | 
| 6220 | 
            -
                { 17, 18, 17,  6,  3,128, ZSTD_btultra },  /* level 16.*/
         | 
| 6221 | 
            -
                { 17, 18, 17,  8,  3,256, ZSTD_btultra },  /* level 17.*/
         | 
| 6222 | 
            -
                { 17, 18, 17, 10,  3,512, ZSTD_btultra },  /* level 18.*/
         | 
| 6223 | 
            -
                { 17, 18, 17,  5,  3,256, ZSTD_btultra2},  /* level 19.*/
         | 
| 6224 | 
            -
                { 17, 18, 17,  7,  3,512, ZSTD_btultra2},  /* level 20.*/
         | 
| 6225 | 
            -
                { 17, 18, 17,  9,  3,512, ZSTD_btultra2},  /* level 21.*/
         | 
| 6226 | 
            -
                { 17, 18, 17, 11,  3,999, ZSTD_btultra2},  /* level 22.*/
         | 
| 6227 | 
            -
            },
         | 
| 6228 | 
            -
            {   /* for srcSize <= 16 KB */
         | 
| 6229 | 
            -
                /* W,  C,  H,  S,  L,  T, strat */
         | 
| 6230 | 
            -
                { 14, 12, 13,  1,  5,  1, ZSTD_fast    },  /* base for negative levels */
         | 
| 6231 | 
            -
                { 14, 14, 15,  1,  5,  0, ZSTD_fast    },  /* level  1 */
         | 
| 6232 | 
            -
                { 14, 14, 15,  1,  4,  0, ZSTD_fast    },  /* level  2 */
         | 
| 6233 | 
            -
                { 14, 14, 15,  2,  4,  0, ZSTD_dfast   },  /* level  3 */
         | 
| 6234 | 
            -
                { 14, 14, 14,  4,  4,  2, ZSTD_greedy  },  /* level  4 */
         | 
| 6235 | 
            -
                { 14, 14, 14,  3,  4,  4, ZSTD_lazy    },  /* level  5.*/
         | 
| 6236 | 
            -
                { 14, 14, 14,  4,  4,  8, ZSTD_lazy2   },  /* level  6 */
         | 
| 6237 | 
            -
                { 14, 14, 14,  6,  4,  8, ZSTD_lazy2   },  /* level  7 */
         | 
| 6238 | 
            -
                { 14, 14, 14,  8,  4,  8, ZSTD_lazy2   },  /* level  8.*/
         | 
| 6239 | 
            -
                { 14, 15, 14,  5,  4,  8, ZSTD_btlazy2 },  /* level  9.*/
         | 
| 6240 | 
            -
                { 14, 15, 14,  9,  4,  8, ZSTD_btlazy2 },  /* level 10.*/
         | 
| 6241 | 
            -
                { 14, 15, 14,  3,  4, 12, ZSTD_btopt   },  /* level 11.*/
         | 
| 6242 | 
            -
                { 14, 15, 14,  4,  3, 24, ZSTD_btopt   },  /* level 12.*/
         | 
| 6243 | 
            -
                { 14, 15, 14,  5,  3, 32, ZSTD_btultra },  /* level 13.*/
         | 
| 6244 | 
            -
                { 14, 15, 15,  6,  3, 64, ZSTD_btultra },  /* level 14.*/
         | 
| 6245 | 
            -
                { 14, 15, 15,  7,  3,256, ZSTD_btultra },  /* level 15.*/
         | 
| 6246 | 
            -
                { 14, 15, 15,  5,  3, 48, ZSTD_btultra2},  /* level 16.*/
         | 
| 6247 | 
            -
                { 14, 15, 15,  6,  3,128, ZSTD_btultra2},  /* level 17.*/
         | 
| 6248 | 
            -
                { 14, 15, 15,  7,  3,256, ZSTD_btultra2},  /* level 18.*/
         | 
| 6249 | 
            -
                { 14, 15, 15,  8,  3,256, ZSTD_btultra2},  /* level 19.*/
         | 
| 6250 | 
            -
                { 14, 15, 15,  8,  3,512, ZSTD_btultra2},  /* level 20.*/
         | 
| 6251 | 
            -
                { 14, 15, 15,  9,  3,512, ZSTD_btultra2},  /* level 21.*/
         | 
| 6252 | 
            -
                { 14, 15, 15, 10,  3,999, ZSTD_btultra2},  /* level 22.*/
         | 
| 6253 | 
            -
            },
         | 
| 6254 | 
            -
            };
         | 
| 6255 | 
            -
             | 
| 6256 6190 | 
             
            static ZSTD_compressionParameters ZSTD_dedicatedDictSearch_getCParams(int const compressionLevel, size_t const dictSize)
         | 
| 6257 6191 | 
             
            {
         | 
| 6258 6192 | 
             
                ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, 0, dictSize, ZSTD_cpm_createCDict);
         |