zstd-ruby 1.5.0.0 → 1.5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +2 -2
  3. data/README.md +1 -1
  4. data/ext/zstdruby/extconf.rb +1 -0
  5. data/ext/zstdruby/libzstd/Makefile +50 -175
  6. data/ext/zstdruby/libzstd/README.md +7 -1
  7. data/ext/zstdruby/libzstd/common/bitstream.h +24 -9
  8. data/ext/zstdruby/libzstd/common/compiler.h +89 -43
  9. data/ext/zstdruby/libzstd/common/entropy_common.c +11 -5
  10. data/ext/zstdruby/libzstd/common/error_private.h +79 -0
  11. data/ext/zstdruby/libzstd/common/fse.h +2 -1
  12. data/ext/zstdruby/libzstd/common/fse_decompress.c +1 -1
  13. data/ext/zstdruby/libzstd/common/huf.h +24 -22
  14. data/ext/zstdruby/libzstd/common/mem.h +18 -0
  15. data/ext/zstdruby/libzstd/common/portability_macros.h +131 -0
  16. data/ext/zstdruby/libzstd/common/xxhash.c +5 -805
  17. data/ext/zstdruby/libzstd/common/xxhash.h +5568 -167
  18. data/ext/zstdruby/libzstd/common/zstd_internal.h +92 -88
  19. data/ext/zstdruby/libzstd/common/zstd_trace.h +12 -3
  20. data/ext/zstdruby/libzstd/compress/clevels.h +134 -0
  21. data/ext/zstdruby/libzstd/compress/fse_compress.c +63 -27
  22. data/ext/zstdruby/libzstd/compress/huf_compress.c +537 -104
  23. data/ext/zstdruby/libzstd/compress/zstd_compress.c +194 -278
  24. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +102 -44
  25. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +4 -3
  26. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +3 -1
  27. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +5 -4
  28. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +3 -2
  29. data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +3 -3
  30. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +289 -114
  31. data/ext/zstdruby/libzstd/compress/zstd_fast.c +302 -123
  32. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +418 -502
  33. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +4 -4
  34. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +1 -1
  35. data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +4 -1
  36. data/ext/zstdruby/libzstd/compress/zstd_opt.c +186 -108
  37. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +59 -29
  38. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +727 -189
  39. data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +571 -0
  40. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +85 -22
  41. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +744 -220
  42. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +8 -2
  43. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +34 -3
  44. data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +23 -3
  45. data/ext/zstdruby/libzstd/dictBuilder/cover.c +9 -2
  46. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +11 -4
  47. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +99 -28
  48. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +2 -6
  49. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +3 -7
  50. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +3 -7
  51. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +3 -7
  52. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +3 -7
  53. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +3 -7
  54. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +3 -7
  55. data/ext/zstdruby/libzstd/libzstd.mk +185 -0
  56. data/ext/zstdruby/libzstd/libzstd.pc.in +1 -0
  57. data/ext/zstdruby/libzstd/modulemap/module.modulemap +4 -0
  58. data/ext/zstdruby/libzstd/zdict.h +4 -4
  59. data/ext/zstdruby/libzstd/zstd.h +179 -136
  60. data/ext/zstdruby/zstdruby.c +2 -2
  61. data/lib/zstd-ruby/version.rb +1 -1
  62. metadata +8 -3
@@ -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
- ZSTD_useRowMatchFinderMode_e useRowMatchFinder; /* Indicates whether the CDict was created with params that would use
76
- * row-based matchfinder. Unless the cdict is reloaded, we will use
77
- * the same greedy/lazy matchfinder at compression time.
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 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
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 ZSTD_useRowMatchFinderMode_e mode) {
218
- assert(mode != ZSTD_urm_auto);
219
- return ZSTD_rowMatchFinderSupported(strategy) && (mode == ZSTD_urm_enableRowMatchFinder);
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 enum given an initial mode and cParams */
223
- static ZSTD_useRowMatchFinderMode_e ZSTD_resolveRowMatchFinderMode(ZSTD_useRowMatchFinderMode_e mode,
224
- const ZSTD_compressionParameters* const cParams) {
225
- #if !defined(ZSTD_NO_INTRINSICS) && (defined(__SSE2__) || defined(__ARM_NEON))
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 != ZSTD_urm_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */
231
- mode = ZSTD_urm_disableRowMatchFinder;
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 = ZSTD_urm_enableRowMatchFinder;
245
+ if (cParams->windowLog > 14) mode = ZSTD_ps_enable;
235
246
  } else {
236
- if (cParams->windowLog > 17) mode = ZSTD_urm_enableRowMatchFinder;
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 ZSTD_useRowMatchFinderMode_e useRowMatchFinder,
261
+ const ZSTD_paramSwitch_e useRowMatchFinder,
244
262
  const U32 forDDSDict) {
245
- assert(useRowMatchFinder != ZSTD_urm_auto);
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 U32 ZSTD_CParams_shouldEnableLdm(const ZSTD_compressionParameters* const cParams) {
257
- return cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27;
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
- if (ZSTD_CParams_shouldEnableLdm(&cParams)) {
278
- DEBUGLOG(4, "ZSTD_makeCCtxParamsFromCParams(): Including LDM into cctx params");
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, &params->cParams);
351
- DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d", cctxParams->useRowMatchFinder);
356
+ cctxParams->useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams->useBlockSplitter, &params->cParams);
357
+ cctxParams->ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams->ldmParams.enableLdm, &params->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(ZSTD_lcm_auto < ZSTD_lcm_huffman && ZSTD_lcm_huffman < ZSTD_lcm_uncompressed);
522
- bounds.lowerBound = ZSTD_lcm_auto;
523
- bounds.upperBound = ZSTD_lcm_uncompressed;
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 ZSTD_c_splitBlocks:
553
- bounds.lowerBound = 0;
554
- bounds.upperBound = 1;
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)ZSTD_urm_auto;
559
- bounds.upperBound = (int)ZSTD_urm_enableRowMatchFinder;
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 ZSTD_c_splitBlocks:
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 ZSTD_c_splitBlocks:
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 ZSTD_literalCompressionMode_e lcm = (ZSTD_literalCompressionMode_e)value;
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!=0);
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
- RETURN_ERROR_IF(value > ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN,
861
- parameter_outOfBound, "Param out of bounds!");
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 ZSTD_c_splitBlocks:
898
- BOUNDCHECK(ZSTD_c_splitBlocks, value);
899
- CCtxParams->splitBlocks = value;
900
- return CCtxParams->splitBlocks;
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 = (ZSTD_useRowMatchFinderMode_e)value;
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 ZSTD_c_splitBlocks :
1036
- *value = (int)CCtxParams->splitBlocks;
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
- ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize)
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
- ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(
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
- ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize)
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 unkown source size.
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 ZSTD_useRowMatchFinderMode_e useRowMatchFinder,
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 != ZSTD_urm_auto);
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 ZSTD_useRowMatchFinderMode_e useRowMatchFinder,
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 = MAX(1, (size_t)MIN(((U64)1 << cParams->windowLog), pledgedSrcSize));
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
- ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder,
1500
- &cParams);
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 = ZSTD_urm_disableRowMatchFinder;
1525
+ initialParams.useRowMatchFinder = ZSTD_ps_disable;
1518
1526
  noRowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams);
1519
- initialParams.useRowMatchFinder = ZSTD_urm_enableRowMatchFinder;
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
- ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, &params->cParams);
1572
+ ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, &params->cParams);
1565
1573
 
1566
1574
  return ZSTD_estimateCCtxSize_usingCCtxParams_internal(
1567
1575
  &cParams, &params->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 = ZSTD_urm_disableRowMatchFinder;
1587
+ initialParams.useRowMatchFinder = ZSTD_ps_disable;
1580
1588
  noRowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams);
1581
- initialParams.useRowMatchFinder = ZSTD_urm_enableRowMatchFinder;
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 ZSTD_useRowMatchFinderMode_e useRowMatchFinder,
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 != ZSTD_urm_auto);
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 < 5 ? 4 : 5;
1778
- assert(cParams->hashLog > rowLog);
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 != ZSTD_urm_auto);
1840
- if (params->ldmParams.enableLdm) {
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, &params->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->blockState.nextCBlock == NULL, memory_allocation, "couldn't allocate entropyWorkspace");
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 != ZSTD_urm_auto);
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 != ZSTD_urm_auto);
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, &params, 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
- if (preserveMark) {
2319
- U32 const adder = (table[cellNb] == ZSTD_DUBT_UNSORTED_MARK) ? reducerValue : 0;
2320
- table[cellNb] += adder;
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
- if (table[cellNb] < reducerValue) table[cellNb] = 0;
2323
- else table[cellNb] -= reducerValue;
2344
+ table[cellNb] = newVal;
2324
2345
  cellNb++;
2325
2346
  } }
2326
2347
  }
@@ -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(splitBlocks=%d)", cctxParams->splitBlocks);
2406
- return (cctxParams->splitBlocks != 0);
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
- ZSTD_disableLiteralsCompression(cctxParams),
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, ZSTD_useRowMatchFinderMode_e useRowMatchFinder, ZSTD_dictMode_e dictMode)
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 != ZSTD_urm_auto);
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(!zc->appliedParams.ldmParams.enableLdm);
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;
@@ -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 disableLiteralsCompression,
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 (disableLiteralsCompression) {
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
- ZSTD_disableLiteralsCompression(cctxParams),
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 U32* additionalBits,
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, const ZSTD_CCtx* zc) {
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
- &entropyMetadata,
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, &entropyMetadata, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE,
3334
- (int)(entropyMetadata.hufMetadata.hType == set_compressed), 1);
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 */
@@ -3474,6 +3503,7 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const
3474
3503
  if (isPartition)
3475
3504
  ZSTD_seqStore_resolveOffCodes(dRep, cRep, seqStore, (U32)(seqStore->sequences - seqStore->sequencesStart));
3476
3505
 
3506
+ RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "Block header doesn't fit");
3477
3507
  cSeqsSize = ZSTD_entropyCompressSeqStore(seqStore,
3478
3508
  &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy,
3479
3509
  &zc->appliedParams,
@@ -3499,9 +3529,6 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const
3499
3529
  return 0;
3500
3530
  }
3501
3531
 
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
3532
  if (cSeqsSize == 0) {
3506
3533
  cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, srcSize, lastBlock);
3507
3534
  FORWARD_IF_ERROR(cSize, "Nocompress block failed");
@@ -3518,6 +3545,10 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const
3518
3545
  cSize = ZSTD_blockHeaderSize + cSeqsSize;
3519
3546
  DEBUGLOG(4, "Writing out compressed block, size: %zu", cSize);
3520
3547
  }
3548
+
3549
+ if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid)
3550
+ zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check;
3551
+
3521
3552
  return cSize;
3522
3553
  }
3523
3554
 
@@ -3528,7 +3559,6 @@ typedef struct {
3528
3559
  } seqStoreSplits;
3529
3560
 
3530
3561
  #define MIN_SEQUENCES_BLOCK_SPLITTING 300
3531
- #define MAX_NB_SPLITS 196
3532
3562
 
3533
3563
  /* Helper function to perform the recursive search for block splits.
3534
3564
  * Estimates the cost of seqStore prior to split, and estimates the cost of splitting the sequences in half.
@@ -3539,29 +3569,31 @@ typedef struct {
3539
3569
  * In theory, this means the absolute largest recursion depth is 10 == log2(maxNbSeqInBlock/MIN_SEQUENCES_BLOCK_SPLITTING).
3540
3570
  * In practice, recursion depth usually doesn't go beyond 4.
3541
3571
  *
3542
- * Furthermore, the number of splits is capped by MAX_NB_SPLITS. At MAX_NB_SPLITS == 196 with the current existing blockSize
3572
+ * 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
3573
  * maximum of 128 KB, this value is actually impossible to reach.
3544
3574
  */
3545
3575
  static void ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t endIdx,
3546
- const ZSTD_CCtx* zc, const seqStore_t* origSeqStore) {
3547
- seqStore_t fullSeqStoreChunk;
3548
- seqStore_t firstHalfSeqStore;
3549
- seqStore_t secondHalfSeqStore;
3576
+ ZSTD_CCtx* zc, const seqStore_t* origSeqStore) {
3577
+ seqStore_t* fullSeqStoreChunk = &zc->blockSplitCtx.fullSeqStoreChunk;
3578
+ seqStore_t* firstHalfSeqStore = &zc->blockSplitCtx.firstHalfSeqStore;
3579
+ seqStore_t* secondHalfSeqStore = &zc->blockSplitCtx.secondHalfSeqStore;
3550
3580
  size_t estimatedOriginalSize;
3551
3581
  size_t estimatedFirstHalfSize;
3552
3582
  size_t estimatedSecondHalfSize;
3553
3583
  size_t midIdx = (startIdx + endIdx)/2;
3554
3584
 
3555
- if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= MAX_NB_SPLITS) {
3585
+ if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= ZSTD_MAX_NB_BLOCK_SPLITS) {
3586
+ DEBUGLOG(6, "ZSTD_deriveBlockSplitsHelper: Too few sequences");
3556
3587
  return;
3557
3588
  }
3558
- ZSTD_deriveSeqStoreChunk(&fullSeqStoreChunk, origSeqStore, startIdx, endIdx);
3559
- ZSTD_deriveSeqStoreChunk(&firstHalfSeqStore, origSeqStore, startIdx, midIdx);
3560
- ZSTD_deriveSeqStoreChunk(&secondHalfSeqStore, origSeqStore, midIdx, endIdx);
3561
- estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&fullSeqStoreChunk, zc);
3562
- estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&firstHalfSeqStore, zc);
3563
- estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&secondHalfSeqStore, zc);
3564
- DEBUGLOG(5, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu",
3589
+ DEBUGLOG(4, "ZSTD_deriveBlockSplitsHelper: startIdx=%zu endIdx=%zu", startIdx, endIdx);
3590
+ ZSTD_deriveSeqStoreChunk(fullSeqStoreChunk, origSeqStore, startIdx, endIdx);
3591
+ ZSTD_deriveSeqStoreChunk(firstHalfSeqStore, origSeqStore, startIdx, midIdx);
3592
+ ZSTD_deriveSeqStoreChunk(secondHalfSeqStore, origSeqStore, midIdx, endIdx);
3593
+ estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(fullSeqStoreChunk, zc);
3594
+ estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(firstHalfSeqStore, zc);
3595
+ estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(secondHalfSeqStore, zc);
3596
+ DEBUGLOG(4, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu",
3565
3597
  estimatedOriginalSize, estimatedFirstHalfSize, estimatedSecondHalfSize);
3566
3598
  if (ZSTD_isError(estimatedOriginalSize) || ZSTD_isError(estimatedFirstHalfSize) || ZSTD_isError(estimatedSecondHalfSize)) {
3567
3599
  return;
@@ -3601,12 +3633,12 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s
3601
3633
  size_t cSize = 0;
3602
3634
  const BYTE* ip = (const BYTE*)src;
3603
3635
  BYTE* op = (BYTE*)dst;
3604
- U32 partitions[MAX_NB_SPLITS];
3605
3636
  size_t i = 0;
3606
3637
  size_t srcBytesTotal = 0;
3638
+ U32* partitions = zc->blockSplitCtx.partitions; /* size == ZSTD_MAX_NB_BLOCK_SPLITS */
3639
+ seqStore_t* nextSeqStore = &zc->blockSplitCtx.nextSeqStore;
3640
+ seqStore_t* currSeqStore = &zc->blockSplitCtx.currSeqStore;
3607
3641
  size_t numSplits = ZSTD_deriveBlockSplits(zc, partitions, nbSeq);
3608
- seqStore_t nextSeqStore;
3609
- seqStore_t currSeqStore;
3610
3642
 
3611
3643
  /* If a block is split and some partitions are emitted as RLE/uncompressed, then repcode history
3612
3644
  * may become invalid. In order to reconcile potentially invalid repcodes, we keep track of two
@@ -3626,6 +3658,7 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s
3626
3658
  repcodes_t cRep;
3627
3659
  ZSTD_memcpy(dRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t));
3628
3660
  ZSTD_memcpy(cRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t));
3661
+ ZSTD_memset(nextSeqStore, 0, sizeof(seqStore_t));
3629
3662
 
3630
3663
  DEBUGLOG(4, "ZSTD_compressBlock_splitBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)",
3631
3664
  (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit,
@@ -3643,36 +3676,36 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s
3643
3676
  return cSizeSingleBlock;
3644
3677
  }
3645
3678
 
3646
- ZSTD_deriveSeqStoreChunk(&currSeqStore, &zc->seqStore, 0, partitions[0]);
3679
+ ZSTD_deriveSeqStoreChunk(currSeqStore, &zc->seqStore, 0, partitions[0]);
3647
3680
  for (i = 0; i <= numSplits; ++i) {
3648
3681
  size_t srcBytes;
3649
3682
  size_t cSizeChunk;
3650
3683
  U32 const lastPartition = (i == numSplits);
3651
3684
  U32 lastBlockEntireSrc = 0;
3652
3685
 
3653
- srcBytes = ZSTD_countSeqStoreLiteralsBytes(&currSeqStore) + ZSTD_countSeqStoreMatchBytes(&currSeqStore);
3686
+ srcBytes = ZSTD_countSeqStoreLiteralsBytes(currSeqStore) + ZSTD_countSeqStoreMatchBytes(currSeqStore);
3654
3687
  srcBytesTotal += srcBytes;
3655
3688
  if (lastPartition) {
3656
3689
  /* This is the final partition, need to account for possible last literals */
3657
3690
  srcBytes += blockSize - srcBytesTotal;
3658
3691
  lastBlockEntireSrc = lastBlock;
3659
3692
  } else {
3660
- ZSTD_deriveSeqStoreChunk(&nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]);
3693
+ ZSTD_deriveSeqStoreChunk(nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]);
3661
3694
  }
3662
3695
 
3663
- cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, &currSeqStore,
3696
+ cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, currSeqStore,
3664
3697
  &dRep, &cRep,
3665
3698
  op, dstCapacity,
3666
3699
  ip, srcBytes,
3667
3700
  lastBlockEntireSrc, 1 /* isPartition */);
3668
- DEBUGLOG(5, "Estimated size: %zu actual size: %zu", ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&currSeqStore, zc), cSizeChunk);
3701
+ DEBUGLOG(5, "Estimated size: %zu actual size: %zu", ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(currSeqStore, zc), cSizeChunk);
3669
3702
  FORWARD_IF_ERROR(cSizeChunk, "Compressing chunk failed!");
3670
3703
 
3671
3704
  ip += srcBytes;
3672
3705
  op += cSizeChunk;
3673
3706
  dstCapacity -= cSizeChunk;
3674
3707
  cSize += cSizeChunk;
3675
- currSeqStore = nextSeqStore;
3708
+ *currSeqStore = *nextSeqStore;
3676
3709
  assert(cSizeChunk <= ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize);
3677
3710
  }
3678
3711
  /* cRep and dRep may have diverged during the compression. If so, we use the dRep repcodes
@@ -3690,6 +3723,7 @@ static size_t ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc,
3690
3723
  U32 nbSeq;
3691
3724
  size_t cSize;
3692
3725
  DEBUGLOG(4, "ZSTD_compressBlock_splitBlock");
3726
+ assert(zc->appliedParams.useBlockSplitter == ZSTD_ps_enable);
3693
3727
 
3694
3728
  { const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize);
3695
3729
  FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed");
@@ -3704,7 +3738,6 @@ static size_t ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc,
3704
3738
  nbSeq = (U32)(zc->seqStore.sequences - zc->seqStore.sequencesStart);
3705
3739
  }
3706
3740
 
3707
- assert(zc->appliedParams.splitBlocks == 1);
3708
3741
  cSize = ZSTD_compressBlock_splitBlock_internal(zc, dst, dstCapacity, src, srcSize, lastBlock, nbSeq);
3709
3742
  FORWARD_IF_ERROR(cSize, "Splitting blocks failed!");
3710
3743
  return cSize;
@@ -3746,12 +3779,6 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
3746
3779
  zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */,
3747
3780
  zc->bmi2);
3748
3781
 
3749
- if (zc->seqCollector.collectSequences) {
3750
- ZSTD_copyBlockSequences(zc);
3751
- return 0;
3752
- }
3753
-
3754
-
3755
3782
  if (frame &&
3756
3783
  /* We don't want to emit our first block as a RLE even if it qualifies because
3757
3784
  * doing so will cause the decoder (cli only) to throw a "should consume all input error."
@@ -3915,6 +3942,7 @@ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx,
3915
3942
  ZSTD_overflowCorrectIfNeeded(
3916
3943
  ms, &cctx->workspace, &cctx->appliedParams, ip, ip + blockSize);
3917
3944
  ZSTD_checkDictValidity(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState);
3945
+ ZSTD_window_enforceMaxDist(&ms->window, ip, maxDist, &ms->loadedDictEnd, &ms->dictMatchState);
3918
3946
 
3919
3947
  /* Ensure hash/chain table insertion resumes no sooner than lowlimit */
3920
3948
  if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit;
@@ -3991,7 +4019,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
3991
4019
  if (!singleSegment) op[pos++] = windowLogByte;
3992
4020
  switch(dictIDSizeCode)
3993
4021
  {
3994
- default: assert(0); /* impossible */
4022
+ default:
4023
+ assert(0); /* impossible */
4024
+ ZSTD_FALLTHROUGH;
3995
4025
  case 0 : break;
3996
4026
  case 1 : op[pos] = (BYTE)(dictID); pos++; break;
3997
4027
  case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break;
@@ -3999,7 +4029,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
3999
4029
  }
4000
4030
  switch(fcsCode)
4001
4031
  {
4002
- default: assert(0); /* impossible */
4032
+ default:
4033
+ assert(0); /* impossible */
4034
+ ZSTD_FALLTHROUGH;
4003
4035
  case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break;
4004
4036
  case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break;
4005
4037
  case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break;
@@ -4047,7 +4079,7 @@ size_t ZSTD_referenceExternalSequences(ZSTD_CCtx* cctx, rawSeq* seq, size_t nbSe
4047
4079
  {
4048
4080
  RETURN_ERROR_IF(cctx->stage != ZSTDcs_init, stage_wrong,
4049
4081
  "wrong cctx stage");
4050
- RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm,
4082
+ RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable,
4051
4083
  parameter_unsupported,
4052
4084
  "incompatible with ldm");
4053
4085
  cctx->externSeqStore.seq = seq;
@@ -4088,7 +4120,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
4088
4120
  ms->forceNonContiguous = 0;
4089
4121
  ms->nextToUpdate = ms->window.dictLimit;
4090
4122
  }
4091
- if (cctx->appliedParams.ldmParams.enableLdm) {
4123
+ if (cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) {
4092
4124
  ZSTD_window_update(&cctx->ldmState.window, src, srcSize, /* forceNonContiguous */ 0);
4093
4125
  }
4094
4126
 
@@ -4157,7 +4189,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
4157
4189
  {
4158
4190
  const BYTE* ip = (const BYTE*) src;
4159
4191
  const BYTE* const iend = ip + srcSize;
4160
- int const loadLdmDict = params->ldmParams.enableLdm && ls != NULL;
4192
+ int const loadLdmDict = params->ldmParams.enableLdm == ZSTD_ps_enable && ls != NULL;
4161
4193
 
4162
4194
  /* Assert that we the ms params match the params we're being given */
4163
4195
  ZSTD_assertEqualCParams(params->cParams, ms->cParams);
@@ -4214,8 +4246,8 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
4214
4246
  assert(ms->chainTable != NULL);
4215
4247
  ZSTD_dedicatedDictSearch_lazy_loadDictionary(ms, iend-HASH_READ_SIZE);
4216
4248
  } else {
4217
- assert(params->useRowMatchFinder != ZSTD_urm_auto);
4218
- if (params->useRowMatchFinder == ZSTD_urm_enableRowMatchFinder) {
4249
+ assert(params->useRowMatchFinder != ZSTD_ps_auto);
4250
+ if (params->useRowMatchFinder == ZSTD_ps_enable) {
4219
4251
  size_t const tagTableSize = ((size_t)1 << params->cParams.hashLog) * sizeof(U16);
4220
4252
  ZSTD_memset(ms->tagTable, 0, tagTableSize);
4221
4253
  ZSTD_row_update(ms, iend-HASH_READ_SIZE);
@@ -4715,7 +4747,7 @@ size_t ZSTD_estimateCDictSize_advanced(
4715
4747
  + ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE)
4716
4748
  /* enableDedicatedDictSearch == 1 ensures that CDict estimation will not be too small
4717
4749
  * in case we are using DDS with row-hash. */
4718
- + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_urm_auto, &cParams),
4750
+ + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams),
4719
4751
  /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0)
4720
4752
  + (dictLoadMethod == ZSTD_dlm_byRef ? 0
4721
4753
  : ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void *))));
@@ -4792,7 +4824,7 @@ static size_t ZSTD_initCDict_internal(
4792
4824
  static ZSTD_CDict* ZSTD_createCDict_advanced_internal(size_t dictSize,
4793
4825
  ZSTD_dictLoadMethod_e dictLoadMethod,
4794
4826
  ZSTD_compressionParameters cParams,
4795
- ZSTD_useRowMatchFinderMode_e useRowMatchFinder,
4827
+ ZSTD_paramSwitch_e useRowMatchFinder,
4796
4828
  U32 enableDedicatedDictSearch,
4797
4829
  ZSTD_customMem customMem)
4798
4830
  {
@@ -4842,7 +4874,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize,
4842
4874
  &cctxParams, customMem);
4843
4875
  }
4844
4876
 
4845
- ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced2(
4877
+ ZSTD_CDict* ZSTD_createCDict_advanced2(
4846
4878
  const void* dict, size_t dictSize,
4847
4879
  ZSTD_dictLoadMethod_e dictLoadMethod,
4848
4880
  ZSTD_dictContentType_e dictContentType,
@@ -4947,7 +4979,7 @@ const ZSTD_CDict* ZSTD_initStaticCDict(
4947
4979
  ZSTD_dictContentType_e dictContentType,
4948
4980
  ZSTD_compressionParameters cParams)
4949
4981
  {
4950
- ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_urm_auto, &cParams);
4982
+ ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams);
4951
4983
  /* enableDedicatedDictSearch == 1 ensures matchstate is not too small in case this CDict will be used for DDS + row hash */
4952
4984
  size_t const matchStateSize = ZSTD_sizeof_matchState(&cParams, useRowMatchFinder, /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0);
4953
4985
  size_t const neededSize = ZSTD_cwksp_alloc_size(sizeof(ZSTD_CDict))
@@ -5403,7 +5435,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
5403
5435
  zcs->outBuffFlushedSize = 0;
5404
5436
  zcs->streamStage = zcss_flush; /* pass-through to flush stage */
5405
5437
  }
5406
- /* fall-through */
5438
+ ZSTD_FALLTHROUGH;
5407
5439
  case zcss_flush:
5408
5440
  DEBUGLOG(5, "flush stage");
5409
5441
  assert(zcs->appliedParams.outBufferMode == ZSTD_bm_buffered);
@@ -5524,17 +5556,8 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx,
5524
5556
  dictSize, mode);
5525
5557
  }
5526
5558
 
5527
- if (ZSTD_CParams_shouldEnableLdm(&params.cParams)) {
5528
- /* Enable LDM by default for optimal parser and window size >= 128MB */
5529
- DEBUGLOG(4, "LDM enabled by default (window size >= 128MB, strategy >= btopt)");
5530
- params.ldmParams.enableLdm = 1;
5531
- }
5532
-
5533
- if (ZSTD_CParams_useBlockSplitter(&params.cParams)) {
5534
- DEBUGLOG(4, "Block splitter enabled by default (window size >= 128K, strategy >= btopt)");
5535
- params.splitBlocks = 1;
5536
- }
5537
-
5559
+ params.useBlockSplitter = ZSTD_resolveBlockSplitterMode(params.useBlockSplitter, &params.cParams);
5560
+ params.ldmParams.enableLdm = ZSTD_resolveEnableLdm(params.ldmParams.enableLdm, &params.cParams);
5538
5561
  params.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params.useRowMatchFinder, &params.cParams);
5539
5562
 
5540
5563
  #ifdef ZSTD_MULTITHREAD
@@ -6140,119 +6163,12 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
6140
6163
 
6141
6164
 
6142
6165
  /*-===== Pre-defined compression levels =====-*/
6166
+ #include "clevels.h"
6143
6167
 
6144
- #define ZSTD_MAX_CLEVEL 22
6145
6168
  int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
6146
6169
  int ZSTD_minCLevel(void) { return (int)-ZSTD_TARGETLENGTH_MAX; }
6147
6170
  int ZSTD_defaultCLevel(void) { return ZSTD_CLEVEL_DEFAULT; }
6148
6171
 
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
6172
  static ZSTD_compressionParameters ZSTD_dedicatedDictSearch_getCParams(int const compressionLevel, size_t const dictSize)
6257
6173
  {
6258
6174
  ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, 0, dictSize, ZSTD_cpm_createCDict);