zstd-ruby 1.3.7.0 → 1.3.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/zstdruby/libzstd/BUCK +15 -2
  4. data/ext/zstdruby/libzstd/Makefile +37 -2
  5. data/ext/zstdruby/libzstd/README.md +67 -41
  6. data/ext/zstdruby/libzstd/common/bitstream.h +2 -2
  7. data/ext/zstdruby/libzstd/common/compiler.h +19 -12
  8. data/ext/zstdruby/libzstd/common/cpu.h +1 -1
  9. data/ext/zstdruby/libzstd/common/debug.h +22 -11
  10. data/ext/zstdruby/libzstd/common/error_private.c +6 -0
  11. data/ext/zstdruby/libzstd/common/fse.h +2 -2
  12. data/ext/zstdruby/libzstd/common/huf.h +25 -1
  13. data/ext/zstdruby/libzstd/common/pool.c +1 -1
  14. data/ext/zstdruby/libzstd/common/zstd_common.c +3 -1
  15. data/ext/zstdruby/libzstd/common/zstd_errors.h +1 -0
  16. data/ext/zstdruby/libzstd/common/zstd_internal.h +11 -2
  17. data/ext/zstdruby/libzstd/compress/fse_compress.c +3 -3
  18. data/ext/zstdruby/libzstd/compress/hist.c +19 -11
  19. data/ext/zstdruby/libzstd/compress/hist.h +11 -8
  20. data/ext/zstdruby/libzstd/compress/huf_compress.c +33 -31
  21. data/ext/zstdruby/libzstd/compress/zstd_compress.c +621 -371
  22. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +90 -28
  23. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +4 -4
  24. data/ext/zstdruby/libzstd/compress/zstd_fast.c +15 -15
  25. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +25 -18
  26. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +18 -67
  27. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +2 -6
  28. data/ext/zstdruby/libzstd/compress/zstd_opt.c +133 -48
  29. data/ext/zstdruby/libzstd/compress/zstd_opt.h +8 -0
  30. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +229 -73
  31. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +18 -10
  32. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +178 -42
  33. data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +240 -0
  34. data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +44 -0
  35. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +244 -1680
  36. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +1307 -0
  37. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +59 -0
  38. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +168 -0
  39. data/ext/zstdruby/libzstd/dictBuilder/cover.c +13 -11
  40. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +15 -15
  41. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +28 -28
  42. data/ext/zstdruby/libzstd/dll/libzstd.def +0 -1
  43. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +0 -10
  44. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +15 -15
  45. data/ext/zstdruby/libzstd/zstd.h +1208 -968
  46. data/lib/zstd-ruby/version.rb +1 -1
  47. metadata +7 -2
@@ -11,6 +11,7 @@
11
11
  /*-*************************************
12
12
  * Dependencies
13
13
  ***************************************/
14
+ #include <limits.h> /* INT_MAX */
14
15
  #include <string.h> /* memset */
15
16
  #include "cpu.h"
16
17
  #include "mem.h"
@@ -61,7 +62,7 @@ static void ZSTD_initCCtx(ZSTD_CCtx* cctx, ZSTD_customMem memManager)
61
62
  memset(cctx, 0, sizeof(*cctx));
62
63
  cctx->customMem = memManager;
63
64
  cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
64
- { size_t const err = ZSTD_CCtx_resetParameters(cctx);
65
+ { size_t const err = ZSTD_CCtx_reset(cctx, ZSTD_reset_parameters);
65
66
  assert(!ZSTD_isError(err));
66
67
  (void)err;
67
68
  }
@@ -128,7 +129,7 @@ static size_t ZSTD_sizeof_mtctx(const ZSTD_CCtx* cctx)
128
129
  #ifdef ZSTD_MULTITHREAD
129
130
  return ZSTDMT_sizeof_CCtx(cctx->mtctx);
130
131
  #else
131
- (void) cctx;
132
+ (void)cctx;
132
133
  return 0;
133
134
  #endif
134
135
  }
@@ -226,9 +227,160 @@ static ZSTD_CCtx_params ZSTD_assignParamsToCCtxParams(
226
227
  return ret;
227
228
  }
228
229
 
229
- #define CLAMPCHECK(val,min,max) { \
230
- if (((val)<(min)) | ((val)>(max))) { \
231
- return ERROR(parameter_outOfBound); \
230
+ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param)
231
+ {
232
+ ZSTD_bounds bounds = { 0, 0, 0 };
233
+
234
+ switch(param)
235
+ {
236
+ case ZSTD_c_compressionLevel:
237
+ bounds.lowerBound = ZSTD_minCLevel();
238
+ bounds.upperBound = ZSTD_maxCLevel();
239
+ return bounds;
240
+
241
+ case ZSTD_c_windowLog:
242
+ bounds.lowerBound = ZSTD_WINDOWLOG_MIN;
243
+ bounds.upperBound = ZSTD_WINDOWLOG_MAX;
244
+ return bounds;
245
+
246
+ case ZSTD_c_hashLog:
247
+ bounds.lowerBound = ZSTD_HASHLOG_MIN;
248
+ bounds.upperBound = ZSTD_HASHLOG_MAX;
249
+ return bounds;
250
+
251
+ case ZSTD_c_chainLog:
252
+ bounds.lowerBound = ZSTD_CHAINLOG_MIN;
253
+ bounds.upperBound = ZSTD_CHAINLOG_MAX;
254
+ return bounds;
255
+
256
+ case ZSTD_c_searchLog:
257
+ bounds.lowerBound = ZSTD_SEARCHLOG_MIN;
258
+ bounds.upperBound = ZSTD_SEARCHLOG_MAX;
259
+ return bounds;
260
+
261
+ case ZSTD_c_minMatch:
262
+ bounds.lowerBound = ZSTD_MINMATCH_MIN;
263
+ bounds.upperBound = ZSTD_MINMATCH_MAX;
264
+ return bounds;
265
+
266
+ case ZSTD_c_targetLength:
267
+ bounds.lowerBound = ZSTD_TARGETLENGTH_MIN;
268
+ bounds.upperBound = ZSTD_TARGETLENGTH_MAX;
269
+ return bounds;
270
+
271
+ case ZSTD_c_strategy:
272
+ bounds.lowerBound = ZSTD_STRATEGY_MIN;
273
+ bounds.upperBound = ZSTD_STRATEGY_MAX;
274
+ return bounds;
275
+
276
+ case ZSTD_c_contentSizeFlag:
277
+ bounds.lowerBound = 0;
278
+ bounds.upperBound = 1;
279
+ return bounds;
280
+
281
+ case ZSTD_c_checksumFlag:
282
+ bounds.lowerBound = 0;
283
+ bounds.upperBound = 1;
284
+ return bounds;
285
+
286
+ case ZSTD_c_dictIDFlag:
287
+ bounds.lowerBound = 0;
288
+ bounds.upperBound = 1;
289
+ return bounds;
290
+
291
+ case ZSTD_c_nbWorkers:
292
+ bounds.lowerBound = 0;
293
+ #ifdef ZSTD_MULTITHREAD
294
+ bounds.upperBound = ZSTDMT_NBWORKERS_MAX;
295
+ #else
296
+ bounds.upperBound = 0;
297
+ #endif
298
+ return bounds;
299
+
300
+ case ZSTD_c_jobSize:
301
+ bounds.lowerBound = 0;
302
+ #ifdef ZSTD_MULTITHREAD
303
+ bounds.upperBound = ZSTDMT_JOBSIZE_MAX;
304
+ #else
305
+ bounds.upperBound = 0;
306
+ #endif
307
+ return bounds;
308
+
309
+ case ZSTD_c_overlapLog:
310
+ bounds.lowerBound = ZSTD_OVERLAPLOG_MIN;
311
+ bounds.upperBound = ZSTD_OVERLAPLOG_MAX;
312
+ return bounds;
313
+
314
+ case ZSTD_c_enableLongDistanceMatching:
315
+ bounds.lowerBound = 0;
316
+ bounds.upperBound = 1;
317
+ return bounds;
318
+
319
+ case ZSTD_c_ldmHashLog:
320
+ bounds.lowerBound = ZSTD_LDM_HASHLOG_MIN;
321
+ bounds.upperBound = ZSTD_LDM_HASHLOG_MAX;
322
+ return bounds;
323
+
324
+ case ZSTD_c_ldmMinMatch:
325
+ bounds.lowerBound = ZSTD_LDM_MINMATCH_MIN;
326
+ bounds.upperBound = ZSTD_LDM_MINMATCH_MAX;
327
+ return bounds;
328
+
329
+ case ZSTD_c_ldmBucketSizeLog:
330
+ bounds.lowerBound = ZSTD_LDM_BUCKETSIZELOG_MIN;
331
+ bounds.upperBound = ZSTD_LDM_BUCKETSIZELOG_MAX;
332
+ return bounds;
333
+
334
+ case ZSTD_c_ldmHashRateLog:
335
+ bounds.lowerBound = ZSTD_LDM_HASHRATELOG_MIN;
336
+ bounds.upperBound = ZSTD_LDM_HASHRATELOG_MAX;
337
+ return bounds;
338
+
339
+ /* experimental parameters */
340
+ case ZSTD_c_rsyncable:
341
+ bounds.lowerBound = 0;
342
+ bounds.upperBound = 1;
343
+ return bounds;
344
+
345
+ case ZSTD_c_forceMaxWindow :
346
+ bounds.lowerBound = 0;
347
+ bounds.upperBound = 1;
348
+ return bounds;
349
+
350
+ case ZSTD_c_format:
351
+ ZSTD_STATIC_ASSERT(ZSTD_f_zstd1 < ZSTD_f_zstd1_magicless);
352
+ bounds.lowerBound = ZSTD_f_zstd1;
353
+ bounds.upperBound = ZSTD_f_zstd1_magicless; /* note : how to ensure at compile time that this is the highest value enum ? */
354
+ return bounds;
355
+
356
+ case ZSTD_c_forceAttachDict:
357
+ ZSTD_STATIC_ASSERT(ZSTD_dictDefaultAttach < ZSTD_dictForceCopy);
358
+ bounds.lowerBound = ZSTD_dictDefaultAttach;
359
+ bounds.upperBound = ZSTD_dictForceCopy; /* note : how to ensure at compile time that this is the highest value enum ? */
360
+ return bounds;
361
+
362
+ default:
363
+ { ZSTD_bounds const boundError = { ERROR(parameter_unsupported), 0, 0 };
364
+ return boundError;
365
+ }
366
+ }
367
+ }
368
+
369
+ /* ZSTD_cParam_withinBounds:
370
+ * @return 1 if value is within cParam bounds,
371
+ * 0 otherwise */
372
+ static int ZSTD_cParam_withinBounds(ZSTD_cParameter cParam, int value)
373
+ {
374
+ ZSTD_bounds const bounds = ZSTD_cParam_getBounds(cParam);
375
+ if (ZSTD_isError(bounds.error)) return 0;
376
+ if (value < bounds.lowerBound) return 0;
377
+ if (value > bounds.upperBound) return 0;
378
+ return 1;
379
+ }
380
+
381
+ #define BOUNDCHECK(cParam, val) { \
382
+ if (!ZSTD_cParam_withinBounds(cParam,val)) { \
383
+ return ERROR(parameter_outOfBound); \
232
384
  } }
233
385
 
234
386
 
@@ -236,38 +388,39 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param)
236
388
  {
237
389
  switch(param)
238
390
  {
239
- case ZSTD_p_compressionLevel:
240
- case ZSTD_p_hashLog:
241
- case ZSTD_p_chainLog:
242
- case ZSTD_p_searchLog:
243
- case ZSTD_p_minMatch:
244
- case ZSTD_p_targetLength:
245
- case ZSTD_p_compressionStrategy:
391
+ case ZSTD_c_compressionLevel:
392
+ case ZSTD_c_hashLog:
393
+ case ZSTD_c_chainLog:
394
+ case ZSTD_c_searchLog:
395
+ case ZSTD_c_minMatch:
396
+ case ZSTD_c_targetLength:
397
+ case ZSTD_c_strategy:
246
398
  return 1;
247
399
 
248
- case ZSTD_p_format:
249
- case ZSTD_p_windowLog:
250
- case ZSTD_p_contentSizeFlag:
251
- case ZSTD_p_checksumFlag:
252
- case ZSTD_p_dictIDFlag:
253
- case ZSTD_p_forceMaxWindow :
254
- case ZSTD_p_nbWorkers:
255
- case ZSTD_p_jobSize:
256
- case ZSTD_p_overlapSizeLog:
257
- case ZSTD_p_enableLongDistanceMatching:
258
- case ZSTD_p_ldmHashLog:
259
- case ZSTD_p_ldmMinMatch:
260
- case ZSTD_p_ldmBucketSizeLog:
261
- case ZSTD_p_ldmHashEveryLog:
262
- case ZSTD_p_forceAttachDict:
400
+ case ZSTD_c_format:
401
+ case ZSTD_c_windowLog:
402
+ case ZSTD_c_contentSizeFlag:
403
+ case ZSTD_c_checksumFlag:
404
+ case ZSTD_c_dictIDFlag:
405
+ case ZSTD_c_forceMaxWindow :
406
+ case ZSTD_c_nbWorkers:
407
+ case ZSTD_c_jobSize:
408
+ case ZSTD_c_overlapLog:
409
+ case ZSTD_c_rsyncable:
410
+ case ZSTD_c_enableLongDistanceMatching:
411
+ case ZSTD_c_ldmHashLog:
412
+ case ZSTD_c_ldmMinMatch:
413
+ case ZSTD_c_ldmBucketSizeLog:
414
+ case ZSTD_c_ldmHashRateLog:
415
+ case ZSTD_c_forceAttachDict:
263
416
  default:
264
417
  return 0;
265
418
  }
266
419
  }
267
420
 
268
- size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value)
421
+ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value)
269
422
  {
270
- DEBUGLOG(4, "ZSTD_CCtx_setParameter (%u, %u)", (U32)param, value);
423
+ DEBUGLOG(4, "ZSTD_CCtx_setParameter (%i, %i)", (int)param, value);
271
424
  if (cctx->streamStage != zcss_init) {
272
425
  if (ZSTD_isUpdateAuthorized(param)) {
273
426
  cctx->cParamsChanged = 1;
@@ -277,51 +430,52 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v
277
430
 
278
431
  switch(param)
279
432
  {
280
- case ZSTD_p_format :
433
+ case ZSTD_c_format :
281
434
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
282
435
 
283
- case ZSTD_p_compressionLevel:
436
+ case ZSTD_c_compressionLevel:
284
437
  if (cctx->cdict) return ERROR(stage_wrong);
285
438
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
286
439
 
287
- case ZSTD_p_windowLog:
288
- case ZSTD_p_hashLog:
289
- case ZSTD_p_chainLog:
290
- case ZSTD_p_searchLog:
291
- case ZSTD_p_minMatch:
292
- case ZSTD_p_targetLength:
293
- case ZSTD_p_compressionStrategy:
440
+ case ZSTD_c_windowLog:
441
+ case ZSTD_c_hashLog:
442
+ case ZSTD_c_chainLog:
443
+ case ZSTD_c_searchLog:
444
+ case ZSTD_c_minMatch:
445
+ case ZSTD_c_targetLength:
446
+ case ZSTD_c_strategy:
294
447
  if (cctx->cdict) return ERROR(stage_wrong);
295
448
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
296
449
 
297
- case ZSTD_p_contentSizeFlag:
298
- case ZSTD_p_checksumFlag:
299
- case ZSTD_p_dictIDFlag:
450
+ case ZSTD_c_contentSizeFlag:
451
+ case ZSTD_c_checksumFlag:
452
+ case ZSTD_c_dictIDFlag:
300
453
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
301
454
 
302
- case ZSTD_p_forceMaxWindow : /* Force back-references to remain < windowSize,
455
+ case ZSTD_c_forceMaxWindow : /* Force back-references to remain < windowSize,
303
456
  * even when referencing into Dictionary content.
304
457
  * default : 0 when using a CDict, 1 when using a Prefix */
305
458
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
306
459
 
307
- case ZSTD_p_forceAttachDict:
460
+ case ZSTD_c_forceAttachDict:
308
461
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
309
462
 
310
- case ZSTD_p_nbWorkers:
311
- if ((value>0) && cctx->staticSize) {
463
+ case ZSTD_c_nbWorkers:
464
+ if ((value!=0) && cctx->staticSize) {
312
465
  return ERROR(parameter_unsupported); /* MT not compatible with static alloc */
313
466
  }
314
467
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
315
468
 
316
- case ZSTD_p_jobSize:
317
- case ZSTD_p_overlapSizeLog:
469
+ case ZSTD_c_jobSize:
470
+ case ZSTD_c_overlapLog:
471
+ case ZSTD_c_rsyncable:
318
472
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
319
473
 
320
- case ZSTD_p_enableLongDistanceMatching:
321
- case ZSTD_p_ldmHashLog:
322
- case ZSTD_p_ldmMinMatch:
323
- case ZSTD_p_ldmBucketSizeLog:
324
- case ZSTD_p_ldmHashEveryLog:
474
+ case ZSTD_c_enableLongDistanceMatching:
475
+ case ZSTD_c_ldmHashLog:
476
+ case ZSTD_c_ldmMinMatch:
477
+ case ZSTD_c_ldmBucketSizeLog:
478
+ case ZSTD_c_ldmHashRateLog:
325
479
  if (cctx->cdict) return ERROR(stage_wrong);
326
480
  return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
327
481
 
@@ -329,21 +483,21 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v
329
483
  }
330
484
  }
331
485
 
332
- size_t ZSTD_CCtxParam_setParameter(
333
- ZSTD_CCtx_params* CCtxParams, ZSTD_cParameter param, unsigned value)
486
+ size_t ZSTD_CCtxParam_setParameter(ZSTD_CCtx_params* CCtxParams,
487
+ ZSTD_cParameter param, int value)
334
488
  {
335
- DEBUGLOG(4, "ZSTD_CCtxParam_setParameter (%u, %u)", (U32)param, value);
489
+ DEBUGLOG(4, "ZSTD_CCtxParam_setParameter (%i, %i)", (int)param, value);
336
490
  switch(param)
337
491
  {
338
- case ZSTD_p_format :
339
- if (value > (unsigned)ZSTD_f_zstd1_magicless)
340
- return ERROR(parameter_unsupported);
492
+ case ZSTD_c_format :
493
+ BOUNDCHECK(ZSTD_c_format, value);
341
494
  CCtxParams->format = (ZSTD_format_e)value;
342
495
  return (size_t)CCtxParams->format;
343
496
 
344
- case ZSTD_p_compressionLevel : {
345
- int cLevel = (int)value; /* cast expected to restore negative sign */
497
+ case ZSTD_c_compressionLevel : {
498
+ int cLevel = value;
346
499
  if (cLevel > ZSTD_maxCLevel()) cLevel = ZSTD_maxCLevel();
500
+ if (cLevel < ZSTD_minCLevel()) cLevel = ZSTD_minCLevel();
347
501
  if (cLevel) { /* 0 : does not change current level */
348
502
  CCtxParams->compressionLevel = cLevel;
349
503
  }
@@ -351,213 +505,229 @@ size_t ZSTD_CCtxParam_setParameter(
351
505
  return 0; /* return type (size_t) cannot represent negative values */
352
506
  }
353
507
 
354
- case ZSTD_p_windowLog :
355
- if (value>0) /* 0 => use default */
356
- CLAMPCHECK(value, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
508
+ case ZSTD_c_windowLog :
509
+ if (value!=0) /* 0 => use default */
510
+ BOUNDCHECK(ZSTD_c_windowLog, value);
357
511
  CCtxParams->cParams.windowLog = value;
358
512
  return CCtxParams->cParams.windowLog;
359
513
 
360
- case ZSTD_p_hashLog :
361
- if (value>0) /* 0 => use default */
362
- CLAMPCHECK(value, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
514
+ case ZSTD_c_hashLog :
515
+ if (value!=0) /* 0 => use default */
516
+ BOUNDCHECK(ZSTD_c_hashLog, value);
363
517
  CCtxParams->cParams.hashLog = value;
364
518
  return CCtxParams->cParams.hashLog;
365
519
 
366
- case ZSTD_p_chainLog :
367
- if (value>0) /* 0 => use default */
368
- CLAMPCHECK(value, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
520
+ case ZSTD_c_chainLog :
521
+ if (value!=0) /* 0 => use default */
522
+ BOUNDCHECK(ZSTD_c_chainLog, value);
369
523
  CCtxParams->cParams.chainLog = value;
370
524
  return CCtxParams->cParams.chainLog;
371
525
 
372
- case ZSTD_p_searchLog :
373
- if (value>0) /* 0 => use default */
374
- CLAMPCHECK(value, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
526
+ case ZSTD_c_searchLog :
527
+ if (value!=0) /* 0 => use default */
528
+ BOUNDCHECK(ZSTD_c_searchLog, value);
375
529
  CCtxParams->cParams.searchLog = value;
376
530
  return value;
377
531
 
378
- case ZSTD_p_minMatch :
379
- if (value>0) /* 0 => use default */
380
- CLAMPCHECK(value, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
381
- CCtxParams->cParams.searchLength = value;
382
- return CCtxParams->cParams.searchLength;
532
+ case ZSTD_c_minMatch :
533
+ if (value!=0) /* 0 => use default */
534
+ BOUNDCHECK(ZSTD_c_minMatch, value);
535
+ CCtxParams->cParams.minMatch = value;
536
+ return CCtxParams->cParams.minMatch;
383
537
 
384
- case ZSTD_p_targetLength :
385
- /* all values are valid. 0 => use default */
538
+ case ZSTD_c_targetLength :
539
+ BOUNDCHECK(ZSTD_c_targetLength, value);
386
540
  CCtxParams->cParams.targetLength = value;
387
541
  return CCtxParams->cParams.targetLength;
388
542
 
389
- case ZSTD_p_compressionStrategy :
390
- if (value>0) /* 0 => use default */
391
- CLAMPCHECK(value, (unsigned)ZSTD_fast, (unsigned)ZSTD_btultra);
543
+ case ZSTD_c_strategy :
544
+ if (value!=0) /* 0 => use default */
545
+ BOUNDCHECK(ZSTD_c_strategy, value);
392
546
  CCtxParams->cParams.strategy = (ZSTD_strategy)value;
393
547
  return (size_t)CCtxParams->cParams.strategy;
394
548
 
395
- case ZSTD_p_contentSizeFlag :
549
+ case ZSTD_c_contentSizeFlag :
396
550
  /* Content size written in frame header _when known_ (default:1) */
397
- DEBUGLOG(4, "set content size flag = %u", (value>0));
398
- CCtxParams->fParams.contentSizeFlag = value > 0;
551
+ DEBUGLOG(4, "set content size flag = %u", (value!=0));
552
+ CCtxParams->fParams.contentSizeFlag = value != 0;
399
553
  return CCtxParams->fParams.contentSizeFlag;
400
554
 
401
- case ZSTD_p_checksumFlag :
555
+ case ZSTD_c_checksumFlag :
402
556
  /* A 32-bits content checksum will be calculated and written at end of frame (default:0) */
403
- CCtxParams->fParams.checksumFlag = value > 0;
557
+ CCtxParams->fParams.checksumFlag = value != 0;
404
558
  return CCtxParams->fParams.checksumFlag;
405
559
 
406
- case ZSTD_p_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */
407
- DEBUGLOG(4, "set dictIDFlag = %u", (value>0));
560
+ case ZSTD_c_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */
561
+ DEBUGLOG(4, "set dictIDFlag = %u", (value!=0));
408
562
  CCtxParams->fParams.noDictIDFlag = !value;
409
563
  return !CCtxParams->fParams.noDictIDFlag;
410
564
 
411
- case ZSTD_p_forceMaxWindow :
412
- CCtxParams->forceWindow = (value > 0);
565
+ case ZSTD_c_forceMaxWindow :
566
+ CCtxParams->forceWindow = (value != 0);
413
567
  return CCtxParams->forceWindow;
414
568
 
415
- case ZSTD_p_forceAttachDict :
416
- CCtxParams->attachDictPref = value ?
417
- (value > 0 ? ZSTD_dictForceAttach : ZSTD_dictForceCopy) :
418
- ZSTD_dictDefaultAttach;
569
+ case ZSTD_c_forceAttachDict : {
570
+ const ZSTD_dictAttachPref_e pref = (ZSTD_dictAttachPref_e)value;
571
+ BOUNDCHECK(ZSTD_c_forceAttachDict, pref);
572
+ CCtxParams->attachDictPref = pref;
419
573
  return CCtxParams->attachDictPref;
574
+ }
420
575
 
421
- case ZSTD_p_nbWorkers :
576
+ case ZSTD_c_nbWorkers :
422
577
  #ifndef ZSTD_MULTITHREAD
423
- if (value>0) return ERROR(parameter_unsupported);
578
+ if (value!=0) return ERROR(parameter_unsupported);
424
579
  return 0;
425
580
  #else
426
581
  return ZSTDMT_CCtxParam_setNbWorkers(CCtxParams, value);
427
582
  #endif
428
583
 
429
- case ZSTD_p_jobSize :
584
+ case ZSTD_c_jobSize :
430
585
  #ifndef ZSTD_MULTITHREAD
431
586
  return ERROR(parameter_unsupported);
432
587
  #else
433
588
  return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_jobSize, value);
434
589
  #endif
435
590
 
436
- case ZSTD_p_overlapSizeLog :
591
+ case ZSTD_c_overlapLog :
437
592
  #ifndef ZSTD_MULTITHREAD
438
593
  return ERROR(parameter_unsupported);
439
594
  #else
440
- return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_overlapSectionLog, value);
595
+ return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_overlapLog, value);
441
596
  #endif
442
597
 
443
- case ZSTD_p_enableLongDistanceMatching :
444
- CCtxParams->ldmParams.enableLdm = (value>0);
598
+ case ZSTD_c_rsyncable :
599
+ #ifndef ZSTD_MULTITHREAD
600
+ return ERROR(parameter_unsupported);
601
+ #else
602
+ return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_rsyncable, value);
603
+ #endif
604
+
605
+ case ZSTD_c_enableLongDistanceMatching :
606
+ CCtxParams->ldmParams.enableLdm = (value!=0);
445
607
  return CCtxParams->ldmParams.enableLdm;
446
608
 
447
- case ZSTD_p_ldmHashLog :
448
- if (value>0) /* 0 ==> auto */
449
- CLAMPCHECK(value, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
609
+ case ZSTD_c_ldmHashLog :
610
+ if (value!=0) /* 0 ==> auto */
611
+ BOUNDCHECK(ZSTD_c_ldmHashLog, value);
450
612
  CCtxParams->ldmParams.hashLog = value;
451
613
  return CCtxParams->ldmParams.hashLog;
452
614
 
453
- case ZSTD_p_ldmMinMatch :
454
- if (value>0) /* 0 ==> default */
455
- CLAMPCHECK(value, ZSTD_LDM_MINMATCH_MIN, ZSTD_LDM_MINMATCH_MAX);
615
+ case ZSTD_c_ldmMinMatch :
616
+ if (value!=0) /* 0 ==> default */
617
+ BOUNDCHECK(ZSTD_c_ldmMinMatch, value);
456
618
  CCtxParams->ldmParams.minMatchLength = value;
457
619
  return CCtxParams->ldmParams.minMatchLength;
458
620
 
459
- case ZSTD_p_ldmBucketSizeLog :
460
- if (value > ZSTD_LDM_BUCKETSIZELOG_MAX)
461
- return ERROR(parameter_outOfBound);
621
+ case ZSTD_c_ldmBucketSizeLog :
622
+ if (value!=0) /* 0 ==> default */
623
+ BOUNDCHECK(ZSTD_c_ldmBucketSizeLog, value);
462
624
  CCtxParams->ldmParams.bucketSizeLog = value;
463
625
  return CCtxParams->ldmParams.bucketSizeLog;
464
626
 
465
- case ZSTD_p_ldmHashEveryLog :
627
+ case ZSTD_c_ldmHashRateLog :
466
628
  if (value > ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN)
467
629
  return ERROR(parameter_outOfBound);
468
- CCtxParams->ldmParams.hashEveryLog = value;
469
- return CCtxParams->ldmParams.hashEveryLog;
630
+ CCtxParams->ldmParams.hashRateLog = value;
631
+ return CCtxParams->ldmParams.hashRateLog;
470
632
 
471
633
  default: return ERROR(parameter_unsupported);
472
634
  }
473
635
  }
474
636
 
475
- size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned* value)
637
+ size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value)
476
638
  {
477
639
  return ZSTD_CCtxParam_getParameter(&cctx->requestedParams, param, value);
478
640
  }
479
641
 
480
642
  size_t ZSTD_CCtxParam_getParameter(
481
- ZSTD_CCtx_params* CCtxParams, ZSTD_cParameter param, unsigned* value)
643
+ ZSTD_CCtx_params* CCtxParams, ZSTD_cParameter param, int* value)
482
644
  {
483
645
  switch(param)
484
646
  {
485
- case ZSTD_p_format :
647
+ case ZSTD_c_format :
486
648
  *value = CCtxParams->format;
487
649
  break;
488
- case ZSTD_p_compressionLevel :
650
+ case ZSTD_c_compressionLevel :
489
651
  *value = CCtxParams->compressionLevel;
490
652
  break;
491
- case ZSTD_p_windowLog :
653
+ case ZSTD_c_windowLog :
492
654
  *value = CCtxParams->cParams.windowLog;
493
655
  break;
494
- case ZSTD_p_hashLog :
656
+ case ZSTD_c_hashLog :
495
657
  *value = CCtxParams->cParams.hashLog;
496
658
  break;
497
- case ZSTD_p_chainLog :
659
+ case ZSTD_c_chainLog :
498
660
  *value = CCtxParams->cParams.chainLog;
499
661
  break;
500
- case ZSTD_p_searchLog :
662
+ case ZSTD_c_searchLog :
501
663
  *value = CCtxParams->cParams.searchLog;
502
664
  break;
503
- case ZSTD_p_minMatch :
504
- *value = CCtxParams->cParams.searchLength;
665
+ case ZSTD_c_minMatch :
666
+ *value = CCtxParams->cParams.minMatch;
505
667
  break;
506
- case ZSTD_p_targetLength :
668
+ case ZSTD_c_targetLength :
507
669
  *value = CCtxParams->cParams.targetLength;
508
670
  break;
509
- case ZSTD_p_compressionStrategy :
671
+ case ZSTD_c_strategy :
510
672
  *value = (unsigned)CCtxParams->cParams.strategy;
511
673
  break;
512
- case ZSTD_p_contentSizeFlag :
674
+ case ZSTD_c_contentSizeFlag :
513
675
  *value = CCtxParams->fParams.contentSizeFlag;
514
676
  break;
515
- case ZSTD_p_checksumFlag :
677
+ case ZSTD_c_checksumFlag :
516
678
  *value = CCtxParams->fParams.checksumFlag;
517
679
  break;
518
- case ZSTD_p_dictIDFlag :
680
+ case ZSTD_c_dictIDFlag :
519
681
  *value = !CCtxParams->fParams.noDictIDFlag;
520
682
  break;
521
- case ZSTD_p_forceMaxWindow :
683
+ case ZSTD_c_forceMaxWindow :
522
684
  *value = CCtxParams->forceWindow;
523
685
  break;
524
- case ZSTD_p_forceAttachDict :
686
+ case ZSTD_c_forceAttachDict :
525
687
  *value = CCtxParams->attachDictPref;
526
688
  break;
527
- case ZSTD_p_nbWorkers :
689
+ case ZSTD_c_nbWorkers :
528
690
  #ifndef ZSTD_MULTITHREAD
529
691
  assert(CCtxParams->nbWorkers == 0);
530
692
  #endif
531
693
  *value = CCtxParams->nbWorkers;
532
694
  break;
533
- case ZSTD_p_jobSize :
695
+ case ZSTD_c_jobSize :
696
+ #ifndef ZSTD_MULTITHREAD
697
+ return ERROR(parameter_unsupported);
698
+ #else
699
+ assert(CCtxParams->jobSize <= INT_MAX);
700
+ *value = (int)CCtxParams->jobSize;
701
+ break;
702
+ #endif
703
+ case ZSTD_c_overlapLog :
534
704
  #ifndef ZSTD_MULTITHREAD
535
705
  return ERROR(parameter_unsupported);
536
706
  #else
537
- *value = CCtxParams->jobSize;
707
+ *value = CCtxParams->overlapLog;
538
708
  break;
539
709
  #endif
540
- case ZSTD_p_overlapSizeLog :
710
+ case ZSTD_c_rsyncable :
541
711
  #ifndef ZSTD_MULTITHREAD
542
712
  return ERROR(parameter_unsupported);
543
713
  #else
544
- *value = CCtxParams->overlapSizeLog;
714
+ *value = CCtxParams->rsyncable;
545
715
  break;
546
716
  #endif
547
- case ZSTD_p_enableLongDistanceMatching :
717
+ case ZSTD_c_enableLongDistanceMatching :
548
718
  *value = CCtxParams->ldmParams.enableLdm;
549
719
  break;
550
- case ZSTD_p_ldmHashLog :
720
+ case ZSTD_c_ldmHashLog :
551
721
  *value = CCtxParams->ldmParams.hashLog;
552
722
  break;
553
- case ZSTD_p_ldmMinMatch :
723
+ case ZSTD_c_ldmMinMatch :
554
724
  *value = CCtxParams->ldmParams.minMatchLength;
555
725
  break;
556
- case ZSTD_p_ldmBucketSizeLog :
726
+ case ZSTD_c_ldmBucketSizeLog :
557
727
  *value = CCtxParams->ldmParams.bucketSizeLog;
558
728
  break;
559
- case ZSTD_p_ldmHashEveryLog :
560
- *value = CCtxParams->ldmParams.hashEveryLog;
729
+ case ZSTD_c_ldmHashRateLog :
730
+ *value = CCtxParams->ldmParams.hashRateLog;
561
731
  break;
562
732
  default: return ERROR(parameter_unsupported);
563
733
  }
@@ -655,34 +825,35 @@ size_t ZSTD_CCtx_refPrefix_advanced(
655
825
 
656
826
  /*! ZSTD_CCtx_reset() :
657
827
  * Also dumps dictionary */
658
- void ZSTD_CCtx_reset(ZSTD_CCtx* cctx)
828
+ size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset)
659
829
  {
660
- cctx->streamStage = zcss_init;
661
- cctx->pledgedSrcSizePlusOne = 0;
830
+ if ( (reset == ZSTD_reset_session_only)
831
+ || (reset == ZSTD_reset_session_and_parameters) ) {
832
+ cctx->streamStage = zcss_init;
833
+ cctx->pledgedSrcSizePlusOne = 0;
834
+ }
835
+ if ( (reset == ZSTD_reset_parameters)
836
+ || (reset == ZSTD_reset_session_and_parameters) ) {
837
+ if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
838
+ cctx->cdict = NULL;
839
+ return ZSTD_CCtxParams_reset(&cctx->requestedParams);
840
+ }
841
+ return 0;
662
842
  }
663
843
 
664
- size_t ZSTD_CCtx_resetParameters(ZSTD_CCtx* cctx)
665
- {
666
- if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
667
- cctx->cdict = NULL;
668
- return ZSTD_CCtxParams_reset(&cctx->requestedParams);
669
- }
670
844
 
671
845
  /** ZSTD_checkCParams() :
672
846
  control CParam values remain within authorized range.
673
847
  @return : 0, or an error code if one value is beyond authorized range */
674
848
  size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
675
849
  {
676
- CLAMPCHECK(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
677
- CLAMPCHECK(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
678
- CLAMPCHECK(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
679
- CLAMPCHECK(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
680
- CLAMPCHECK(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
681
- ZSTD_STATIC_ASSERT(ZSTD_TARGETLENGTH_MIN == 0);
682
- if (cParams.targetLength > ZSTD_TARGETLENGTH_MAX)
683
- return ERROR(parameter_outOfBound);
684
- if ((U32)(cParams.strategy) > (U32)ZSTD_btultra)
685
- return ERROR(parameter_unsupported);
850
+ BOUNDCHECK(ZSTD_c_windowLog, cParams.windowLog);
851
+ BOUNDCHECK(ZSTD_c_chainLog, cParams.chainLog);
852
+ BOUNDCHECK(ZSTD_c_hashLog, cParams.hashLog);
853
+ BOUNDCHECK(ZSTD_c_searchLog, cParams.searchLog);
854
+ BOUNDCHECK(ZSTD_c_minMatch, cParams.minMatch);
855
+ BOUNDCHECK(ZSTD_c_targetLength,cParams.targetLength);
856
+ BOUNDCHECK(ZSTD_c_strategy, cParams.strategy);
686
857
  return 0;
687
858
  }
688
859
 
@@ -692,19 +863,19 @@ size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
692
863
  static ZSTD_compressionParameters
693
864
  ZSTD_clampCParams(ZSTD_compressionParameters cParams)
694
865
  {
695
- # define CLAMP(val,min,max) { \
696
- if (val<min) val=min; \
697
- else if (val>max) val=max; \
698
- }
699
- CLAMP(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
700
- CLAMP(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
701
- CLAMP(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
702
- CLAMP(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
703
- CLAMP(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
704
- ZSTD_STATIC_ASSERT(ZSTD_TARGETLENGTH_MIN == 0);
705
- if (cParams.targetLength > ZSTD_TARGETLENGTH_MAX)
706
- cParams.targetLength = ZSTD_TARGETLENGTH_MAX;
707
- CLAMP(cParams.strategy, ZSTD_fast, ZSTD_btultra);
866
+ # define CLAMP_TYPE(cParam, val, type) { \
867
+ ZSTD_bounds const bounds = ZSTD_cParam_getBounds(cParam); \
868
+ if ((int)val<bounds.lowerBound) val=(type)bounds.lowerBound; \
869
+ else if ((int)val>bounds.upperBound) val=(type)bounds.upperBound; \
870
+ }
871
+ # define CLAMP(cParam, val) CLAMP_TYPE(cParam, val, int)
872
+ CLAMP(ZSTD_c_windowLog, cParams.windowLog);
873
+ CLAMP(ZSTD_c_chainLog, cParams.chainLog);
874
+ CLAMP(ZSTD_c_hashLog, cParams.hashLog);
875
+ CLAMP(ZSTD_c_searchLog, cParams.searchLog);
876
+ CLAMP(ZSTD_c_minMatch, cParams.minMatch);
877
+ CLAMP(ZSTD_c_targetLength,cParams.targetLength);
878
+ CLAMP_TYPE(ZSTD_c_strategy,cParams.strategy, ZSTD_strategy);
708
879
  return cParams;
709
880
  }
710
881
 
@@ -774,7 +945,7 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams(
774
945
  if (CCtxParams->cParams.hashLog) cParams.hashLog = CCtxParams->cParams.hashLog;
775
946
  if (CCtxParams->cParams.chainLog) cParams.chainLog = CCtxParams->cParams.chainLog;
776
947
  if (CCtxParams->cParams.searchLog) cParams.searchLog = CCtxParams->cParams.searchLog;
777
- if (CCtxParams->cParams.searchLength) cParams.searchLength = CCtxParams->cParams.searchLength;
948
+ if (CCtxParams->cParams.minMatch) cParams.minMatch = CCtxParams->cParams.minMatch;
778
949
  if (CCtxParams->cParams.targetLength) cParams.targetLength = CCtxParams->cParams.targetLength;
779
950
  if (CCtxParams->cParams.strategy) cParams.strategy = CCtxParams->cParams.strategy;
780
951
  assert(!ZSTD_checkCParams(cParams));
@@ -787,13 +958,12 @@ ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams,
787
958
  {
788
959
  size_t const chainSize = (cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cParams->chainLog);
789
960
  size_t const hSize = ((size_t)1) << cParams->hashLog;
790
- U32 const hashLog3 = (forCCtx && cParams->searchLength==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
961
+ U32 const hashLog3 = (forCCtx && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
791
962
  size_t const h3Size = ((size_t)1) << hashLog3;
792
963
  size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
793
964
  size_t const optPotentialSpace = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits)) * sizeof(U32)
794
965
  + (ZSTD_OPT_NUM+1) * (sizeof(ZSTD_match_t)+sizeof(ZSTD_optimal_t));
795
- size_t const optSpace = (forCCtx && ((cParams->strategy == ZSTD_btopt) ||
796
- (cParams->strategy == ZSTD_btultra)))
966
+ size_t const optSpace = (forCCtx && (cParams->strategy >= ZSTD_btopt))
797
967
  ? optPotentialSpace
798
968
  : 0;
799
969
  DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u",
@@ -808,7 +978,7 @@ size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params)
808
978
  { ZSTD_compressionParameters const cParams =
809
979
  ZSTD_getCParamsFromCCtxParams(params, 0, 0);
810
980
  size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << cParams.windowLog);
811
- U32 const divider = (cParams.searchLength==3) ? 3 : 4;
981
+ U32 const divider = (cParams.minMatch==3) ? 3 : 4;
812
982
  size_t const maxNbSeq = blockSize / divider;
813
983
  size_t const tokenSpace = WILDCOPY_OVERLENGTH + blockSize + 11*maxNbSeq;
814
984
  size_t const entropySpace = HUF_WORKSPACE_SIZE;
@@ -843,7 +1013,7 @@ size_t ZSTD_estimateCCtxSize(int compressionLevel)
843
1013
  {
844
1014
  int level;
845
1015
  size_t memBudget = 0;
846
- for (level=1; level<=compressionLevel; level++) {
1016
+ for (level=MIN(compressionLevel, 1); level<=compressionLevel; level++) {
847
1017
  size_t const newMB = ZSTD_estimateCCtxSize_internal(level);
848
1018
  if (newMB > memBudget) memBudget = newMB;
849
1019
  }
@@ -879,7 +1049,7 @@ size_t ZSTD_estimateCStreamSize(int compressionLevel)
879
1049
  {
880
1050
  int level;
881
1051
  size_t memBudget = 0;
882
- for (level=1; level<=compressionLevel; level++) {
1052
+ for (level=MIN(compressionLevel, 1); level<=compressionLevel; level++) {
883
1053
  size_t const newMB = ZSTD_estimateCStreamSize_internal(level);
884
1054
  if (newMB > memBudget) memBudget = newMB;
885
1055
  }
@@ -933,7 +1103,7 @@ static U32 ZSTD_equivalentCParams(ZSTD_compressionParameters cParams1,
933
1103
  return (cParams1.hashLog == cParams2.hashLog)
934
1104
  & (cParams1.chainLog == cParams2.chainLog)
935
1105
  & (cParams1.strategy == cParams2.strategy) /* opt parser space */
936
- & ((cParams1.searchLength==3) == (cParams2.searchLength==3)); /* hashlog3 space */
1106
+ & ((cParams1.minMatch==3) == (cParams2.minMatch==3)); /* hashlog3 space */
937
1107
  }
938
1108
 
939
1109
  static void ZSTD_assertEqualCParams(ZSTD_compressionParameters cParams1,
@@ -945,7 +1115,7 @@ static void ZSTD_assertEqualCParams(ZSTD_compressionParameters cParams1,
945
1115
  assert(cParams1.chainLog == cParams2.chainLog);
946
1116
  assert(cParams1.hashLog == cParams2.hashLog);
947
1117
  assert(cParams1.searchLog == cParams2.searchLog);
948
- assert(cParams1.searchLength == cParams2.searchLength);
1118
+ assert(cParams1.minMatch == cParams2.minMatch);
949
1119
  assert(cParams1.targetLength == cParams2.targetLength);
950
1120
  assert(cParams1.strategy == cParams2.strategy);
951
1121
  }
@@ -960,7 +1130,7 @@ static U32 ZSTD_equivalentLdmParams(ldmParams_t ldmParams1,
960
1130
  ldmParams1.hashLog == ldmParams2.hashLog &&
961
1131
  ldmParams1.bucketSizeLog == ldmParams2.bucketSizeLog &&
962
1132
  ldmParams1.minMatchLength == ldmParams2.minMatchLength &&
963
- ldmParams1.hashEveryLog == ldmParams2.hashEveryLog);
1133
+ ldmParams1.hashRateLog == ldmParams2.hashRateLog);
964
1134
  }
965
1135
 
966
1136
  typedef enum { ZSTDb_not_buffered, ZSTDb_buffered } ZSTD_buffered_policy_e;
@@ -976,7 +1146,7 @@ static U32 ZSTD_sufficientBuff(size_t bufferSize1, size_t maxNbSeq1,
976
1146
  {
977
1147
  size_t const windowSize2 = MAX(1, (size_t)MIN(((U64)1 << cParams2.windowLog), pledgedSrcSize));
978
1148
  size_t const blockSize2 = MIN(ZSTD_BLOCKSIZE_MAX, windowSize2);
979
- size_t const maxNbSeq2 = blockSize2 / ((cParams2.searchLength == 3) ? 3 : 4);
1149
+ size_t const maxNbSeq2 = blockSize2 / ((cParams2.minMatch == 3) ? 3 : 4);
980
1150
  size_t const maxNbLit2 = blockSize2;
981
1151
  size_t const neededBufferSize2 = (buffPol2==ZSTDb_buffered) ? windowSize2 + blockSize2 : 0;
982
1152
  DEBUGLOG(4, "ZSTD_sufficientBuff: is neededBufferSize2=%u <= bufferSize1=%u",
@@ -1034,8 +1204,8 @@ static void ZSTD_invalidateMatchState(ZSTD_matchState_t* ms)
1034
1204
  {
1035
1205
  ZSTD_window_clear(&ms->window);
1036
1206
 
1037
- ms->nextToUpdate = ms->window.dictLimit + 1;
1038
- ms->nextToUpdate3 = ms->window.dictLimit + 1;
1207
+ ms->nextToUpdate = ms->window.dictLimit;
1208
+ ms->nextToUpdate3 = ms->window.dictLimit;
1039
1209
  ms->loadedDictEnd = 0;
1040
1210
  ms->opt.litLengthSum = 0; /* force reset of btopt stats */
1041
1211
  ms->dictMatchState = NULL;
@@ -1080,7 +1250,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms,
1080
1250
  {
1081
1251
  size_t const chainSize = (cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cParams->chainLog);
1082
1252
  size_t const hSize = ((size_t)1) << cParams->hashLog;
1083
- U32 const hashLog3 = (forCCtx && cParams->searchLength==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
1253
+ U32 const hashLog3 = (forCCtx && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
1084
1254
  size_t const h3Size = ((size_t)1) << hashLog3;
1085
1255
  size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
1086
1256
 
@@ -1094,9 +1264,9 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms,
1094
1264
  ZSTD_invalidateMatchState(ms);
1095
1265
 
1096
1266
  /* opt parser space */
1097
- if (forCCtx && ((cParams->strategy == ZSTD_btopt) | (cParams->strategy == ZSTD_btultra))) {
1267
+ if (forCCtx && (cParams->strategy >= ZSTD_btopt)) {
1098
1268
  DEBUGLOG(4, "reserving optimal parser space");
1099
- ms->opt.litFreq = (U32*)ptr;
1269
+ ms->opt.litFreq = (unsigned*)ptr;
1100
1270
  ms->opt.litLengthFreq = ms->opt.litFreq + (1<<Litbits);
1101
1271
  ms->opt.matchLengthFreq = ms->opt.litLengthFreq + (MaxLL+1);
1102
1272
  ms->opt.offCodeFreq = ms->opt.matchLengthFreq + (MaxML+1);
@@ -1158,13 +1328,13 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
1158
1328
  /* Adjust long distance matching parameters */
1159
1329
  ZSTD_ldm_adjustParameters(&params.ldmParams, &params.cParams);
1160
1330
  assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog);
1161
- assert(params.ldmParams.hashEveryLog < 32);
1162
- zc->ldmState.hashPower = ZSTD_ldm_getHashPower(params.ldmParams.minMatchLength);
1331
+ assert(params.ldmParams.hashRateLog < 32);
1332
+ zc->ldmState.hashPower = ZSTD_rollingHash_primePower(params.ldmParams.minMatchLength);
1163
1333
  }
1164
1334
 
1165
1335
  { size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params.cParams.windowLog), pledgedSrcSize));
1166
1336
  size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize);
1167
- U32 const divider = (params.cParams.searchLength==3) ? 3 : 4;
1337
+ U32 const divider = (params.cParams.minMatch==3) ? 3 : 4;
1168
1338
  size_t const maxNbSeq = blockSize / divider;
1169
1339
  size_t const tokenSpace = WILDCOPY_OVERLENGTH + blockSize + 11*maxNbSeq;
1170
1340
  size_t const buffOutSize = (zbuff==ZSTDb_buffered) ? ZSTD_compressBound(blockSize)+1 : 0;
@@ -1227,7 +1397,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
1227
1397
  if (pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN)
1228
1398
  zc->appliedParams.fParams.contentSizeFlag = 0;
1229
1399
  DEBUGLOG(4, "pledged content size : %u ; flag : %u",
1230
- (U32)pledgedSrcSize, zc->appliedParams.fParams.contentSizeFlag);
1400
+ (unsigned)pledgedSrcSize, zc->appliedParams.fParams.contentSizeFlag);
1231
1401
  zc->blockSize = blockSize;
1232
1402
 
1233
1403
  XXH64_reset(&zc->xxhState, 0);
@@ -1306,16 +1476,17 @@ void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx) {
1306
1476
  * dictionary tables into the working context is faster than using them
1307
1477
  * in-place.
1308
1478
  */
1309
- static const size_t attachDictSizeCutoffs[(unsigned)ZSTD_btultra+1] = {
1310
- 8 KB, /* unused */
1311
- 8 KB, /* ZSTD_fast */
1479
+ static const size_t attachDictSizeCutoffs[ZSTD_STRATEGY_MAX+1] = {
1480
+ 8 KB, /* unused */
1481
+ 8 KB, /* ZSTD_fast */
1312
1482
  16 KB, /* ZSTD_dfast */
1313
1483
  32 KB, /* ZSTD_greedy */
1314
1484
  32 KB, /* ZSTD_lazy */
1315
1485
  32 KB, /* ZSTD_lazy2 */
1316
1486
  32 KB, /* ZSTD_btlazy2 */
1317
1487
  32 KB, /* ZSTD_btopt */
1318
- 8 KB /* ZSTD_btultra */
1488
+ 8 KB, /* ZSTD_btultra */
1489
+ 8 KB /* ZSTD_btultra2 */
1319
1490
  };
1320
1491
 
1321
1492
  static int ZSTD_shouldAttachDict(const ZSTD_CDict* cdict,
@@ -1447,7 +1618,8 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
1447
1618
  ZSTD_buffered_policy_e zbuff)
1448
1619
  {
1449
1620
 
1450
- DEBUGLOG(4, "ZSTD_resetCCtx_usingCDict (pledgedSrcSize=%u)", (U32)pledgedSrcSize);
1621
+ DEBUGLOG(4, "ZSTD_resetCCtx_usingCDict (pledgedSrcSize=%u)",
1622
+ (unsigned)pledgedSrcSize);
1451
1623
 
1452
1624
  if (ZSTD_shouldAttachDict(cdict, params, pledgedSrcSize)) {
1453
1625
  return ZSTD_resetCCtx_byAttachingCDict(
@@ -1670,7 +1842,9 @@ static size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, cons
1670
1842
  * note : use same formula for both situations */
1671
1843
  static size_t ZSTD_minGain(size_t srcSize, ZSTD_strategy strat)
1672
1844
  {
1673
- U32 const minlog = (strat==ZSTD_btultra) ? 7 : 6;
1845
+ U32 const minlog = (strat>=ZSTD_btultra) ? (U32)(strat) - 1 : 6;
1846
+ ZSTD_STATIC_ASSERT(ZSTD_btultra == 8);
1847
+ assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, strat));
1674
1848
  return (srcSize >> minlog) + 2;
1675
1849
  }
1676
1850
 
@@ -1679,7 +1853,8 @@ static size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf,
1679
1853
  ZSTD_strategy strategy, int disableLiteralCompression,
1680
1854
  void* dst, size_t dstCapacity,
1681
1855
  const void* src, size_t srcSize,
1682
- U32* workspace, const int bmi2)
1856
+ void* workspace, size_t wkspSize,
1857
+ const int bmi2)
1683
1858
  {
1684
1859
  size_t const minGain = ZSTD_minGain(srcSize, strategy);
1685
1860
  size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB);
@@ -1708,9 +1883,9 @@ static size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf,
1708
1883
  int const preferRepeat = strategy < ZSTD_lazy ? srcSize <= 1024 : 0;
1709
1884
  if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1;
1710
1885
  cLitSize = singleStream ? HUF_compress1X_repeat(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11,
1711
- workspace, HUF_WORKSPACE_SIZE, (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2)
1886
+ workspace, wkspSize, (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2)
1712
1887
  : HUF_compress4X_repeat(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11,
1713
- workspace, HUF_WORKSPACE_SIZE, (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2);
1888
+ workspace, wkspSize, (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2);
1714
1889
  if (repeat != HUF_repeat_none) {
1715
1890
  /* reused the existing table */
1716
1891
  hType = set_repeat;
@@ -1977,7 +2152,7 @@ ZSTD_selectEncodingType(
1977
2152
  assert(!ZSTD_isError(NCountCost));
1978
2153
  assert(compressedCost < ERROR(maxCode));
1979
2154
  DEBUGLOG(5, "Estimated bit costs: basic=%u\trepeat=%u\tcompressed=%u",
1980
- (U32)basicCost, (U32)repeatCost, (U32)compressedCost);
2155
+ (unsigned)basicCost, (unsigned)repeatCost, (unsigned)compressedCost);
1981
2156
  if (basicCost <= repeatCost && basicCost <= compressedCost) {
1982
2157
  DEBUGLOG(5, "Selected set_basic");
1983
2158
  assert(isDefaultAllowed);
@@ -1999,7 +2174,7 @@ ZSTD_selectEncodingType(
1999
2174
  MEM_STATIC size_t
2000
2175
  ZSTD_buildCTable(void* dst, size_t dstCapacity,
2001
2176
  FSE_CTable* nextCTable, U32 FSELog, symbolEncodingType_e type,
2002
- U32* count, U32 max,
2177
+ unsigned* count, U32 max,
2003
2178
  const BYTE* codeTable, size_t nbSeq,
2004
2179
  const S16* defaultNorm, U32 defaultNormLog, U32 defaultMax,
2005
2180
  const FSE_CTable* prevCTable, size_t prevCTableSize,
@@ -2007,11 +2182,13 @@ ZSTD_buildCTable(void* dst, size_t dstCapacity,
2007
2182
  {
2008
2183
  BYTE* op = (BYTE*)dst;
2009
2184
  const BYTE* const oend = op + dstCapacity;
2185
+ DEBUGLOG(6, "ZSTD_buildCTable (dstCapacity=%u)", (unsigned)dstCapacity);
2010
2186
 
2011
2187
  switch (type) {
2012
2188
  case set_rle:
2013
- *op = codeTable[0];
2014
2189
  CHECK_F(FSE_buildCTable_rle(nextCTable, (BYTE)max));
2190
+ if (dstCapacity==0) return ERROR(dstSize_tooSmall);
2191
+ *op = codeTable[0];
2015
2192
  return 1;
2016
2193
  case set_repeat:
2017
2194
  memcpy(nextCTable, prevCTable, prevCTableSize);
@@ -2053,6 +2230,9 @@ ZSTD_encodeSequences_body(
2053
2230
  FSE_CState_t stateLitLength;
2054
2231
 
2055
2232
  CHECK_E(BIT_initCStream(&blockStream, dst, dstCapacity), dstSize_tooSmall); /* not enough space remaining */
2233
+ DEBUGLOG(6, "available space for bitstream : %i (dstCapacity=%u)",
2234
+ (int)(blockStream.endPtr - blockStream.startPtr),
2235
+ (unsigned)dstCapacity);
2056
2236
 
2057
2237
  /* first symbols */
2058
2238
  FSE_initCState2(&stateMatchLength, CTable_MatchLength, mlCodeTable[nbSeq-1]);
@@ -2085,9 +2265,9 @@ ZSTD_encodeSequences_body(
2085
2265
  U32 const ofBits = ofCode;
2086
2266
  U32 const mlBits = ML_bits[mlCode];
2087
2267
  DEBUGLOG(6, "encoding: litlen:%2u - matchlen:%2u - offCode:%7u",
2088
- sequences[n].litLength,
2089
- sequences[n].matchLength + MINMATCH,
2090
- sequences[n].offset);
2268
+ (unsigned)sequences[n].litLength,
2269
+ (unsigned)sequences[n].matchLength + MINMATCH,
2270
+ (unsigned)sequences[n].offset);
2091
2271
  /* 32b*/ /* 64b*/
2092
2272
  /* (7)*/ /* (7)*/
2093
2273
  FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */
@@ -2112,6 +2292,7 @@ ZSTD_encodeSequences_body(
2112
2292
  BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */
2113
2293
  }
2114
2294
  BIT_flushBits(&blockStream); /* (7)*/
2295
+ DEBUGLOG(7, "remaining space : %i", (int)(blockStream.endPtr - blockStream.ptr));
2115
2296
  } }
2116
2297
 
2117
2298
  DEBUGLOG(6, "ZSTD_encodeSequences: flushing ML state with %u bits", stateMatchLength.stateLog);
@@ -2169,6 +2350,7 @@ static size_t ZSTD_encodeSequences(
2169
2350
  FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
2170
2351
  seqDef const* sequences, size_t nbSeq, int longOffsets, int bmi2)
2171
2352
  {
2353
+ DEBUGLOG(5, "ZSTD_encodeSequences: dstCapacity = %u", (unsigned)dstCapacity);
2172
2354
  #if DYNAMIC_BMI2
2173
2355
  if (bmi2) {
2174
2356
  return ZSTD_encodeSequences_bmi2(dst, dstCapacity,
@@ -2186,16 +2368,20 @@ static size_t ZSTD_encodeSequences(
2186
2368
  sequences, nbSeq, longOffsets);
2187
2369
  }
2188
2370
 
2189
- MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
2190
- ZSTD_entropyCTables_t const* prevEntropy,
2191
- ZSTD_entropyCTables_t* nextEntropy,
2192
- ZSTD_CCtx_params const* cctxParams,
2193
- void* dst, size_t dstCapacity, U32* workspace,
2194
- const int bmi2)
2371
+ /* ZSTD_compressSequences_internal():
2372
+ * actually compresses both literals and sequences */
2373
+ MEM_STATIC size_t
2374
+ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
2375
+ const ZSTD_entropyCTables_t* prevEntropy,
2376
+ ZSTD_entropyCTables_t* nextEntropy,
2377
+ const ZSTD_CCtx_params* cctxParams,
2378
+ void* dst, size_t dstCapacity,
2379
+ void* workspace, size_t wkspSize,
2380
+ const int bmi2)
2195
2381
  {
2196
2382
  const int longOffsets = cctxParams->cParams.windowLog > STREAM_ACCUMULATOR_MIN;
2197
2383
  ZSTD_strategy const strategy = cctxParams->cParams.strategy;
2198
- U32 count[MaxSeq+1];
2384
+ unsigned count[MaxSeq+1];
2199
2385
  FSE_CTable* CTable_LitLength = nextEntropy->fse.litlengthCTable;
2200
2386
  FSE_CTable* CTable_OffsetBits = nextEntropy->fse.offcodeCTable;
2201
2387
  FSE_CTable* CTable_MatchLength = nextEntropy->fse.matchlengthCTable;
@@ -2212,6 +2398,7 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
2212
2398
  BYTE* lastNCount = NULL;
2213
2399
 
2214
2400
  ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<<MAX(MLFSELog,LLFSELog)));
2401
+ DEBUGLOG(5, "ZSTD_compressSequences_internal");
2215
2402
 
2216
2403
  /* Compress literals */
2217
2404
  { const BYTE* const literals = seqStorePtr->litStart;
@@ -2222,7 +2409,8 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
2222
2409
  cctxParams->cParams.strategy, disableLiteralCompression,
2223
2410
  op, dstCapacity,
2224
2411
  literals, litSize,
2225
- workspace, bmi2);
2412
+ workspace, wkspSize,
2413
+ bmi2);
2226
2414
  if (ZSTD_isError(cSize))
2227
2415
  return cSize;
2228
2416
  assert(cSize <= dstCapacity);
@@ -2249,51 +2437,63 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
2249
2437
  /* convert length/distances into codes */
2250
2438
  ZSTD_seqToCodes(seqStorePtr);
2251
2439
  /* build CTable for Literal Lengths */
2252
- { U32 max = MaxLL;
2253
- size_t const mostFrequent = HIST_countFast_wksp(count, &max, llCodeTable, nbSeq, workspace); /* can't fail */
2440
+ { unsigned max = MaxLL;
2441
+ size_t const mostFrequent = HIST_countFast_wksp(count, &max, llCodeTable, nbSeq, workspace, wkspSize); /* can't fail */
2254
2442
  DEBUGLOG(5, "Building LL table");
2255
2443
  nextEntropy->fse.litlength_repeatMode = prevEntropy->fse.litlength_repeatMode;
2256
- LLtype = ZSTD_selectEncodingType(&nextEntropy->fse.litlength_repeatMode, count, max, mostFrequent, nbSeq, LLFSELog, prevEntropy->fse.litlengthCTable, LL_defaultNorm, LL_defaultNormLog, ZSTD_defaultAllowed, strategy);
2444
+ LLtype = ZSTD_selectEncodingType(&nextEntropy->fse.litlength_repeatMode,
2445
+ count, max, mostFrequent, nbSeq,
2446
+ LLFSELog, prevEntropy->fse.litlengthCTable,
2447
+ LL_defaultNorm, LL_defaultNormLog,
2448
+ ZSTD_defaultAllowed, strategy);
2257
2449
  assert(set_basic < set_compressed && set_rle < set_compressed);
2258
2450
  assert(!(LLtype < set_compressed && nextEntropy->fse.litlength_repeatMode != FSE_repeat_none)); /* We don't copy tables */
2259
2451
  { size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_LitLength, LLFSELog, (symbolEncodingType_e)LLtype,
2260
2452
  count, max, llCodeTable, nbSeq, LL_defaultNorm, LL_defaultNormLog, MaxLL,
2261
2453
  prevEntropy->fse.litlengthCTable, sizeof(prevEntropy->fse.litlengthCTable),
2262
- workspace, HUF_WORKSPACE_SIZE);
2454
+ workspace, wkspSize);
2263
2455
  if (ZSTD_isError(countSize)) return countSize;
2264
2456
  if (LLtype == set_compressed)
2265
2457
  lastNCount = op;
2266
2458
  op += countSize;
2267
2459
  } }
2268
2460
  /* build CTable for Offsets */
2269
- { U32 max = MaxOff;
2270
- size_t const mostFrequent = HIST_countFast_wksp(count, &max, ofCodeTable, nbSeq, workspace); /* can't fail */
2461
+ { unsigned max = MaxOff;
2462
+ size_t const mostFrequent = HIST_countFast_wksp(count, &max, ofCodeTable, nbSeq, workspace, wkspSize); /* can't fail */
2271
2463
  /* We can only use the basic table if max <= DefaultMaxOff, otherwise the offsets are too large */
2272
2464
  ZSTD_defaultPolicy_e const defaultPolicy = (max <= DefaultMaxOff) ? ZSTD_defaultAllowed : ZSTD_defaultDisallowed;
2273
2465
  DEBUGLOG(5, "Building OF table");
2274
2466
  nextEntropy->fse.offcode_repeatMode = prevEntropy->fse.offcode_repeatMode;
2275
- Offtype = ZSTD_selectEncodingType(&nextEntropy->fse.offcode_repeatMode, count, max, mostFrequent, nbSeq, OffFSELog, prevEntropy->fse.offcodeCTable, OF_defaultNorm, OF_defaultNormLog, defaultPolicy, strategy);
2467
+ Offtype = ZSTD_selectEncodingType(&nextEntropy->fse.offcode_repeatMode,
2468
+ count, max, mostFrequent, nbSeq,
2469
+ OffFSELog, prevEntropy->fse.offcodeCTable,
2470
+ OF_defaultNorm, OF_defaultNormLog,
2471
+ defaultPolicy, strategy);
2276
2472
  assert(!(Offtype < set_compressed && nextEntropy->fse.offcode_repeatMode != FSE_repeat_none)); /* We don't copy tables */
2277
2473
  { size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_OffsetBits, OffFSELog, (symbolEncodingType_e)Offtype,
2278
2474
  count, max, ofCodeTable, nbSeq, OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff,
2279
2475
  prevEntropy->fse.offcodeCTable, sizeof(prevEntropy->fse.offcodeCTable),
2280
- workspace, HUF_WORKSPACE_SIZE);
2476
+ workspace, wkspSize);
2281
2477
  if (ZSTD_isError(countSize)) return countSize;
2282
2478
  if (Offtype == set_compressed)
2283
2479
  lastNCount = op;
2284
2480
  op += countSize;
2285
2481
  } }
2286
2482
  /* build CTable for MatchLengths */
2287
- { U32 max = MaxML;
2288
- size_t const mostFrequent = HIST_countFast_wksp(count, &max, mlCodeTable, nbSeq, workspace); /* can't fail */
2289
- DEBUGLOG(5, "Building ML table");
2483
+ { unsigned max = MaxML;
2484
+ size_t const mostFrequent = HIST_countFast_wksp(count, &max, mlCodeTable, nbSeq, workspace, wkspSize); /* can't fail */
2485
+ DEBUGLOG(5, "Building ML table (remaining space : %i)", (int)(oend-op));
2290
2486
  nextEntropy->fse.matchlength_repeatMode = prevEntropy->fse.matchlength_repeatMode;
2291
- MLtype = ZSTD_selectEncodingType(&nextEntropy->fse.matchlength_repeatMode, count, max, mostFrequent, nbSeq, MLFSELog, prevEntropy->fse.matchlengthCTable, ML_defaultNorm, ML_defaultNormLog, ZSTD_defaultAllowed, strategy);
2487
+ MLtype = ZSTD_selectEncodingType(&nextEntropy->fse.matchlength_repeatMode,
2488
+ count, max, mostFrequent, nbSeq,
2489
+ MLFSELog, prevEntropy->fse.matchlengthCTable,
2490
+ ML_defaultNorm, ML_defaultNormLog,
2491
+ ZSTD_defaultAllowed, strategy);
2292
2492
  assert(!(MLtype < set_compressed && nextEntropy->fse.matchlength_repeatMode != FSE_repeat_none)); /* We don't copy tables */
2293
2493
  { size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_MatchLength, MLFSELog, (symbolEncodingType_e)MLtype,
2294
2494
  count, max, mlCodeTable, nbSeq, ML_defaultNorm, ML_defaultNormLog, MaxML,
2295
2495
  prevEntropy->fse.matchlengthCTable, sizeof(prevEntropy->fse.matchlengthCTable),
2296
- workspace, HUF_WORKSPACE_SIZE);
2496
+ workspace, wkspSize);
2297
2497
  if (ZSTD_isError(countSize)) return countSize;
2298
2498
  if (MLtype == set_compressed)
2299
2499
  lastNCount = op;
@@ -2328,19 +2528,24 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
2328
2528
  }
2329
2529
  }
2330
2530
 
2531
+ DEBUGLOG(5, "compressed block size : %u", (unsigned)(op - ostart));
2331
2532
  return op - ostart;
2332
2533
  }
2333
2534
 
2334
- MEM_STATIC size_t ZSTD_compressSequences(seqStore_t* seqStorePtr,
2335
- const ZSTD_entropyCTables_t* prevEntropy,
2336
- ZSTD_entropyCTables_t* nextEntropy,
2337
- const ZSTD_CCtx_params* cctxParams,
2338
- void* dst, size_t dstCapacity,
2339
- size_t srcSize, U32* workspace, int bmi2)
2535
+ MEM_STATIC size_t
2536
+ ZSTD_compressSequences(seqStore_t* seqStorePtr,
2537
+ const ZSTD_entropyCTables_t* prevEntropy,
2538
+ ZSTD_entropyCTables_t* nextEntropy,
2539
+ const ZSTD_CCtx_params* cctxParams,
2540
+ void* dst, size_t dstCapacity,
2541
+ size_t srcSize,
2542
+ void* workspace, size_t wkspSize,
2543
+ int bmi2)
2340
2544
  {
2341
2545
  size_t const cSize = ZSTD_compressSequences_internal(
2342
- seqStorePtr, prevEntropy, nextEntropy, cctxParams, dst, dstCapacity,
2343
- workspace, bmi2);
2546
+ seqStorePtr, prevEntropy, nextEntropy, cctxParams,
2547
+ dst, dstCapacity,
2548
+ workspace, wkspSize, bmi2);
2344
2549
  if (cSize == 0) return 0;
2345
2550
  /* When srcSize <= dstCapacity, there is enough space to write a raw uncompressed block.
2346
2551
  * Since we ran out of space, block must be not compressible, so fall back to raw uncompressed block.
@@ -2362,7 +2567,7 @@ MEM_STATIC size_t ZSTD_compressSequences(seqStore_t* seqStorePtr,
2362
2567
  * assumption : strat is a valid strategy */
2363
2568
  ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMode_e dictMode)
2364
2569
  {
2365
- static const ZSTD_blockCompressor blockCompressor[3][(unsigned)ZSTD_btultra+1] = {
2570
+ static const ZSTD_blockCompressor blockCompressor[3][ZSTD_STRATEGY_MAX+1] = {
2366
2571
  { ZSTD_compressBlock_fast /* default for 0 */,
2367
2572
  ZSTD_compressBlock_fast,
2368
2573
  ZSTD_compressBlock_doubleFast,
@@ -2371,7 +2576,8 @@ ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMo
2371
2576
  ZSTD_compressBlock_lazy2,
2372
2577
  ZSTD_compressBlock_btlazy2,
2373
2578
  ZSTD_compressBlock_btopt,
2374
- ZSTD_compressBlock_btultra },
2579
+ ZSTD_compressBlock_btultra,
2580
+ ZSTD_compressBlock_btultra2 },
2375
2581
  { ZSTD_compressBlock_fast_extDict /* default for 0 */,
2376
2582
  ZSTD_compressBlock_fast_extDict,
2377
2583
  ZSTD_compressBlock_doubleFast_extDict,
@@ -2380,6 +2586,7 @@ ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMo
2380
2586
  ZSTD_compressBlock_lazy2_extDict,
2381
2587
  ZSTD_compressBlock_btlazy2_extDict,
2382
2588
  ZSTD_compressBlock_btopt_extDict,
2589
+ ZSTD_compressBlock_btultra_extDict,
2383
2590
  ZSTD_compressBlock_btultra_extDict },
2384
2591
  { ZSTD_compressBlock_fast_dictMatchState /* default for 0 */,
2385
2592
  ZSTD_compressBlock_fast_dictMatchState,
@@ -2389,14 +2596,14 @@ ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMo
2389
2596
  ZSTD_compressBlock_lazy2_dictMatchState,
2390
2597
  ZSTD_compressBlock_btlazy2_dictMatchState,
2391
2598
  ZSTD_compressBlock_btopt_dictMatchState,
2599
+ ZSTD_compressBlock_btultra_dictMatchState,
2392
2600
  ZSTD_compressBlock_btultra_dictMatchState }
2393
2601
  };
2394
2602
  ZSTD_blockCompressor selectedCompressor;
2395
2603
  ZSTD_STATIC_ASSERT((unsigned)ZSTD_fast == 1);
2396
2604
 
2397
- assert((U32)strat >= (U32)ZSTD_fast);
2398
- assert((U32)strat <= (U32)ZSTD_btultra);
2399
- selectedCompressor = blockCompressor[(int)dictMode][(U32)strat];
2605
+ assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, strat));
2606
+ selectedCompressor = blockCompressor[(int)dictMode][(int)strat];
2400
2607
  assert(selectedCompressor != NULL);
2401
2608
  return selectedCompressor;
2402
2609
  }
@@ -2421,15 +2628,15 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
2421
2628
  {
2422
2629
  ZSTD_matchState_t* const ms = &zc->blockState.matchState;
2423
2630
  size_t cSize;
2424
- DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%zu, dictLimit=%u, nextToUpdate=%u)",
2425
- dstCapacity, ms->window.dictLimit, ms->nextToUpdate);
2631
+ DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)",
2632
+ (unsigned)dstCapacity, (unsigned)ms->window.dictLimit, (unsigned)ms->nextToUpdate);
2426
2633
  assert(srcSize <= ZSTD_BLOCKSIZE_MAX);
2427
2634
 
2428
2635
  /* Assert that we have correctly flushed the ctx params into the ms's copy */
2429
2636
  ZSTD_assertEqualCParams(zc->appliedParams.cParams, ms->cParams);
2430
2637
 
2431
2638
  if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) {
2432
- ZSTD_ldm_skipSequences(&zc->externSeqStore, srcSize, zc->appliedParams.cParams.searchLength);
2639
+ ZSTD_ldm_skipSequences(&zc->externSeqStore, srcSize, zc->appliedParams.cParams.minMatch);
2433
2640
  cSize = 0;
2434
2641
  goto out; /* don't even attempt compression below a certain srcSize */
2435
2642
  }
@@ -2437,8 +2644,8 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
2437
2644
  ms->opt.symbolCosts = &zc->blockState.prevCBlock->entropy; /* required for optimal parser to read stats from dictionary */
2438
2645
 
2439
2646
  /* a gap between an attached dict and the current window is not safe,
2440
- * they must remain adjacent, and when that stops being the case, the dict
2441
- * must be unset */
2647
+ * they must remain adjacent,
2648
+ * and when that stops being the case, the dict must be unset */
2442
2649
  assert(ms->dictMatchState == NULL || ms->loadedDictEnd == ms->window.dictLimit);
2443
2650
 
2444
2651
  /* limited update after a very long match */
@@ -2495,7 +2702,9 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
2495
2702
  &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy,
2496
2703
  &zc->appliedParams,
2497
2704
  dst, dstCapacity,
2498
- srcSize, zc->entropyWorkspace, zc->bmi2);
2705
+ srcSize,
2706
+ zc->entropyWorkspace, HUF_WORKSPACE_SIZE /* statically allocated in resetCCtx */,
2707
+ zc->bmi2);
2499
2708
 
2500
2709
  out:
2501
2710
  if (!ZSTD_isError(cSize) && cSize != 0) {
@@ -2535,7 +2744,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
2535
2744
  U32 const maxDist = (U32)1 << cctx->appliedParams.cParams.windowLog;
2536
2745
  assert(cctx->appliedParams.cParams.windowLog <= 31);
2537
2746
 
2538
- DEBUGLOG(5, "ZSTD_compress_frameChunk (blockSize=%u)", (U32)blockSize);
2747
+ DEBUGLOG(5, "ZSTD_compress_frameChunk (blockSize=%u)", (unsigned)blockSize);
2539
2748
  if (cctx->appliedParams.fParams.checksumFlag && srcSize)
2540
2749
  XXH64_update(&cctx->xxhState, src, srcSize);
2541
2750
 
@@ -2583,7 +2792,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
2583
2792
  assert(dstCapacity >= cSize);
2584
2793
  dstCapacity -= cSize;
2585
2794
  DEBUGLOG(5, "ZSTD_compress_frameChunk: adding a block of size %u",
2586
- (U32)cSize);
2795
+ (unsigned)cSize);
2587
2796
  } }
2588
2797
 
2589
2798
  if (lastFrameChunk && (op>ostart)) cctx->stage = ZSTDcs_ending;
@@ -2606,9 +2815,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
2606
2815
  size_t pos=0;
2607
2816
 
2608
2817
  assert(!(params.fParams.contentSizeFlag && pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN));
2609
- if (dstCapacity < ZSTD_frameHeaderSize_max) return ERROR(dstSize_tooSmall);
2818
+ if (dstCapacity < ZSTD_FRAMEHEADERSIZE_MAX) return ERROR(dstSize_tooSmall);
2610
2819
  DEBUGLOG(4, "ZSTD_writeFrameHeader : dictIDFlag : %u ; dictID : %u ; dictIDSizeCode : %u",
2611
- !params.fParams.noDictIDFlag, dictID, dictIDSizeCode);
2820
+ !params.fParams.noDictIDFlag, (unsigned)dictID, (unsigned)dictIDSizeCode);
2612
2821
 
2613
2822
  if (params.format == ZSTD_f_zstd1) {
2614
2823
  MEM_writeLE32(dst, ZSTD_MAGICNUMBER);
@@ -2672,7 +2881,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
2672
2881
  size_t fhSize = 0;
2673
2882
 
2674
2883
  DEBUGLOG(5, "ZSTD_compressContinue_internal, stage: %u, srcSize: %u",
2675
- cctx->stage, (U32)srcSize);
2884
+ cctx->stage, (unsigned)srcSize);
2676
2885
  if (cctx->stage==ZSTDcs_created) return ERROR(stage_wrong); /* missing init (ZSTD_compressBegin) */
2677
2886
 
2678
2887
  if (frame && (cctx->stage==ZSTDcs_init)) {
@@ -2709,7 +2918,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
2709
2918
  }
2710
2919
  }
2711
2920
 
2712
- DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (U32)cctx->blockSize);
2921
+ DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (unsigned)cctx->blockSize);
2713
2922
  { size_t const cSize = frame ?
2714
2923
  ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) :
2715
2924
  ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize);
@@ -2721,7 +2930,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
2721
2930
  ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN == (unsigned long long)-1);
2722
2931
  if (cctx->consumedSrcSize+1 > cctx->pledgedSrcSizePlusOne) {
2723
2932
  DEBUGLOG(4, "error : pledgedSrcSize = %u, while realSrcSize >= %u",
2724
- (U32)cctx->pledgedSrcSizePlusOne-1, (U32)cctx->consumedSrcSize);
2933
+ (unsigned)cctx->pledgedSrcSizePlusOne-1, (unsigned)cctx->consumedSrcSize);
2725
2934
  return ERROR(srcSize_wrong);
2726
2935
  }
2727
2936
  }
@@ -2733,7 +2942,7 @@ size_t ZSTD_compressContinue (ZSTD_CCtx* cctx,
2733
2942
  void* dst, size_t dstCapacity,
2734
2943
  const void* src, size_t srcSize)
2735
2944
  {
2736
- DEBUGLOG(5, "ZSTD_compressContinue (srcSize=%u)", (U32)srcSize);
2945
+ DEBUGLOG(5, "ZSTD_compressContinue (srcSize=%u)", (unsigned)srcSize);
2737
2946
  return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 1 /* frame mode */, 0 /* last chunk */);
2738
2947
  }
2739
2948
 
@@ -2791,6 +3000,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
2791
3000
  case ZSTD_btlazy2: /* we want the dictionary table fully sorted */
2792
3001
  case ZSTD_btopt:
2793
3002
  case ZSTD_btultra:
3003
+ case ZSTD_btultra2:
2794
3004
  if (srcSize >= HASH_READ_SIZE)
2795
3005
  ZSTD_updateTree(ms, iend-HASH_READ_SIZE, iend);
2796
3006
  break;
@@ -2861,7 +3071,9 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs,
2861
3071
  if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
2862
3072
  /* Defer checking offcodeMaxValue because we need to know the size of the dictionary content */
2863
3073
  /* fill all offset symbols to avoid garbage at end of table */
2864
- CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.offcodeCTable, offcodeNCount, MaxOff, offcodeLog, workspace, HUF_WORKSPACE_SIZE),
3074
+ CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.offcodeCTable,
3075
+ offcodeNCount, MaxOff, offcodeLog,
3076
+ workspace, HUF_WORKSPACE_SIZE),
2865
3077
  dictionary_corrupted);
2866
3078
  dictPtr += offcodeHeaderSize;
2867
3079
  }
@@ -2873,7 +3085,9 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs,
2873
3085
  if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
2874
3086
  /* Every match length code must have non-zero probability */
2875
3087
  CHECK_F( ZSTD_checkDictNCount(matchlengthNCount, matchlengthMaxValue, MaxML));
2876
- CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.matchlengthCTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog, workspace, HUF_WORKSPACE_SIZE),
3088
+ CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.matchlengthCTable,
3089
+ matchlengthNCount, matchlengthMaxValue, matchlengthLog,
3090
+ workspace, HUF_WORKSPACE_SIZE),
2877
3091
  dictionary_corrupted);
2878
3092
  dictPtr += matchlengthHeaderSize;
2879
3093
  }
@@ -2885,7 +3099,9 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs,
2885
3099
  if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
2886
3100
  /* Every literal length code must have non-zero probability */
2887
3101
  CHECK_F( ZSTD_checkDictNCount(litlengthNCount, litlengthMaxValue, MaxLL));
2888
- CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.litlengthCTable, litlengthNCount, litlengthMaxValue, litlengthLog, workspace, HUF_WORKSPACE_SIZE),
3102
+ CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.litlengthCTable,
3103
+ litlengthNCount, litlengthMaxValue, litlengthLog,
3104
+ workspace, HUF_WORKSPACE_SIZE),
2889
3105
  dictionary_corrupted);
2890
3106
  dictPtr += litlengthHeaderSize;
2891
3107
  }
@@ -3023,7 +3239,7 @@ size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t di
3023
3239
  ZSTD_parameters const params = ZSTD_getParams(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize);
3024
3240
  ZSTD_CCtx_params const cctxParams =
3025
3241
  ZSTD_assignParamsToCCtxParams(cctx->requestedParams, params);
3026
- DEBUGLOG(4, "ZSTD_compressBegin_usingDict (dictSize=%u)", (U32)dictSize);
3242
+ DEBUGLOG(4, "ZSTD_compressBegin_usingDict (dictSize=%u)", (unsigned)dictSize);
3027
3243
  return ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, NULL,
3028
3244
  cctxParams, ZSTD_CONTENTSIZE_UNKNOWN, ZSTDb_not_buffered);
3029
3245
  }
@@ -3067,7 +3283,7 @@ static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
3067
3283
  if (cctx->appliedParams.fParams.checksumFlag) {
3068
3284
  U32 const checksum = (U32) XXH64_digest(&cctx->xxhState);
3069
3285
  if (dstCapacity<4) return ERROR(dstSize_tooSmall);
3070
- DEBUGLOG(4, "ZSTD_writeEpilogue: write checksum : %08X", checksum);
3286
+ DEBUGLOG(4, "ZSTD_writeEpilogue: write checksum : %08X", (unsigned)checksum);
3071
3287
  MEM_writeLE32(op, checksum);
3072
3288
  op += 4;
3073
3289
  }
@@ -3093,7 +3309,7 @@ size_t ZSTD_compressEnd (ZSTD_CCtx* cctx,
3093
3309
  DEBUGLOG(4, "end of frame : controlling src size");
3094
3310
  if (cctx->pledgedSrcSizePlusOne != cctx->consumedSrcSize+1) {
3095
3311
  DEBUGLOG(4, "error : pledgedSrcSize = %u, while realSrcSize = %u",
3096
- (U32)cctx->pledgedSrcSizePlusOne-1, (U32)cctx->consumedSrcSize);
3312
+ (unsigned)cctx->pledgedSrcSizePlusOne-1, (unsigned)cctx->consumedSrcSize);
3097
3313
  return ERROR(srcSize_wrong);
3098
3314
  } }
3099
3315
  return cSize + endResult;
@@ -3139,7 +3355,7 @@ size_t ZSTD_compress_advanced_internal(
3139
3355
  const void* dict,size_t dictSize,
3140
3356
  ZSTD_CCtx_params params)
3141
3357
  {
3142
- DEBUGLOG(4, "ZSTD_compress_advanced_internal (srcSize:%u)", (U32)srcSize);
3358
+ DEBUGLOG(4, "ZSTD_compress_advanced_internal (srcSize:%u)", (unsigned)srcSize);
3143
3359
  CHECK_F( ZSTD_compressBegin_internal(cctx,
3144
3360
  dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, NULL,
3145
3361
  params, srcSize, ZSTDb_not_buffered) );
@@ -3163,7 +3379,7 @@ size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
3163
3379
  const void* src, size_t srcSize,
3164
3380
  int compressionLevel)
3165
3381
  {
3166
- DEBUGLOG(4, "ZSTD_compressCCtx (srcSize=%u)", (U32)srcSize);
3382
+ DEBUGLOG(4, "ZSTD_compressCCtx (srcSize=%u)", (unsigned)srcSize);
3167
3383
  assert(cctx != NULL);
3168
3384
  return ZSTD_compress_usingDict(cctx, dst, dstCapacity, src, srcSize, NULL, 0, compressionLevel);
3169
3385
  }
@@ -3189,7 +3405,7 @@ size_t ZSTD_estimateCDictSize_advanced(
3189
3405
  size_t dictSize, ZSTD_compressionParameters cParams,
3190
3406
  ZSTD_dictLoadMethod_e dictLoadMethod)
3191
3407
  {
3192
- DEBUGLOG(5, "sizeof(ZSTD_CDict) : %u", (U32)sizeof(ZSTD_CDict));
3408
+ DEBUGLOG(5, "sizeof(ZSTD_CDict) : %u", (unsigned)sizeof(ZSTD_CDict));
3193
3409
  return sizeof(ZSTD_CDict) + HUF_WORKSPACE_SIZE + ZSTD_sizeof_matchState(&cParams, /* forCCtx */ 0)
3194
3410
  + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
3195
3411
  }
@@ -3203,7 +3419,7 @@ size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel)
3203
3419
  size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict)
3204
3420
  {
3205
3421
  if (cdict==NULL) return 0; /* support sizeof on NULL */
3206
- DEBUGLOG(5, "sizeof(*cdict) : %u", (U32)sizeof(*cdict));
3422
+ DEBUGLOG(5, "sizeof(*cdict) : %u", (unsigned)sizeof(*cdict));
3207
3423
  return cdict->workspaceSize + (cdict->dictBuffer ? cdict->dictContentSize : 0) + sizeof(*cdict);
3208
3424
  }
3209
3425
 
@@ -3214,7 +3430,7 @@ static size_t ZSTD_initCDict_internal(
3214
3430
  ZSTD_dictContentType_e dictContentType,
3215
3431
  ZSTD_compressionParameters cParams)
3216
3432
  {
3217
- DEBUGLOG(3, "ZSTD_initCDict_internal (dictContentType:%u)", (U32)dictContentType);
3433
+ DEBUGLOG(3, "ZSTD_initCDict_internal (dictContentType:%u)", (unsigned)dictContentType);
3218
3434
  assert(!ZSTD_checkCParams(cParams));
3219
3435
  cdict->matchState.cParams = cParams;
3220
3436
  if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dictBuffer) || (!dictSize)) {
@@ -3264,7 +3480,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize,
3264
3480
  ZSTD_dictContentType_e dictContentType,
3265
3481
  ZSTD_compressionParameters cParams, ZSTD_customMem customMem)
3266
3482
  {
3267
- DEBUGLOG(3, "ZSTD_createCDict_advanced, mode %u", (U32)dictContentType);
3483
+ DEBUGLOG(3, "ZSTD_createCDict_advanced, mode %u", (unsigned)dictContentType);
3268
3484
  if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
3269
3485
 
3270
3486
  { ZSTD_CDict* const cdict = (ZSTD_CDict*)ZSTD_malloc(sizeof(ZSTD_CDict), customMem);
@@ -3345,7 +3561,7 @@ const ZSTD_CDict* ZSTD_initStaticCDict(
3345
3561
  void* ptr;
3346
3562
  if ((size_t)workspace & 7) return NULL; /* 8-aligned */
3347
3563
  DEBUGLOG(4, "(workspaceSize < neededSize) : (%u < %u) => %u",
3348
- (U32)workspaceSize, (U32)neededSize, (U32)(workspaceSize < neededSize));
3564
+ (unsigned)workspaceSize, (unsigned)neededSize, (unsigned)(workspaceSize < neededSize));
3349
3565
  if (workspaceSize < neededSize) return NULL;
3350
3566
 
3351
3567
  if (dictLoadMethod == ZSTD_dlm_byCopy) {
@@ -3505,7 +3721,7 @@ static size_t ZSTD_resetCStream_internal(ZSTD_CStream* cctx,
3505
3721
  size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize)
3506
3722
  {
3507
3723
  ZSTD_CCtx_params params = zcs->requestedParams;
3508
- DEBUGLOG(4, "ZSTD_resetCStream: pledgedSrcSize = %u", (U32)pledgedSrcSize);
3724
+ DEBUGLOG(4, "ZSTD_resetCStream: pledgedSrcSize = %u", (unsigned)pledgedSrcSize);
3509
3725
  if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN;
3510
3726
  params.fParams.contentSizeFlag = 1;
3511
3727
  return ZSTD_resetCStream_internal(zcs, NULL, 0, ZSTD_dct_auto, zcs->cdict, params, pledgedSrcSize);
@@ -3525,7 +3741,7 @@ size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs,
3525
3741
  assert(!((dict) && (cdict))); /* either dict or cdict, not both */
3526
3742
 
3527
3743
  if (dict && dictSize >= 8) {
3528
- DEBUGLOG(4, "loading dictionary of size %u", (U32)dictSize);
3744
+ DEBUGLOG(4, "loading dictionary of size %u", (unsigned)dictSize);
3529
3745
  if (zcs->staticSize) { /* static CCtx : never uses malloc */
3530
3746
  /* incompatible with internal cdict creation */
3531
3747
  return ERROR(memory_allocation);
@@ -3584,7 +3800,7 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
3584
3800
  ZSTD_parameters params, unsigned long long pledgedSrcSize)
3585
3801
  {
3586
3802
  DEBUGLOG(4, "ZSTD_initCStream_advanced: pledgedSrcSize=%u, flag=%u",
3587
- (U32)pledgedSrcSize, params.fParams.contentSizeFlag);
3803
+ (unsigned)pledgedSrcSize, params.fParams.contentSizeFlag);
3588
3804
  CHECK_F( ZSTD_checkCParams(params.cParams) );
3589
3805
  if ((pledgedSrcSize==0) && (params.fParams.contentSizeFlag==0)) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; /* for compatibility with older programs relying on this behavior. Users should now specify ZSTD_CONTENTSIZE_UNKNOWN. This line will be removed in the future. */
3590
3806
  zcs->requestedParams = ZSTD_assignParamsToCCtxParams(zcs->requestedParams, params);
@@ -3612,8 +3828,15 @@ size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel)
3612
3828
 
3613
3829
  /*====== Compression ======*/
3614
3830
 
3615
- MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity,
3616
- const void* src, size_t srcSize)
3831
+ static size_t ZSTD_nextInputSizeHint(const ZSTD_CCtx* cctx)
3832
+ {
3833
+ size_t hintInSize = cctx->inBuffTarget - cctx->inBuffPos;
3834
+ if (hintInSize==0) hintInSize = cctx->blockSize;
3835
+ return hintInSize;
3836
+ }
3837
+
3838
+ static size_t ZSTD_limitCopy(void* dst, size_t dstCapacity,
3839
+ const void* src, size_t srcSize)
3617
3840
  {
3618
3841
  size_t const length = MIN(dstCapacity, srcSize);
3619
3842
  if (length) memcpy(dst, src, length);
@@ -3621,7 +3844,7 @@ MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity,
3621
3844
  }
3622
3845
 
3623
3846
  /** ZSTD_compressStream_generic():
3624
- * internal function for all *compressStream*() variants and *compress_generic()
3847
+ * internal function for all *compressStream*() variants
3625
3848
  * non-static, because can be called from zstdmt_compress.c
3626
3849
  * @return : hint size for next input */
3627
3850
  size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
@@ -3638,7 +3861,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
3638
3861
  U32 someMoreWork = 1;
3639
3862
 
3640
3863
  /* check expectations */
3641
- DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%u", (U32)flushMode);
3864
+ DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%u", (unsigned)flushMode);
3642
3865
  assert(zcs->inBuff != NULL);
3643
3866
  assert(zcs->inBuffSize > 0);
3644
3867
  assert(zcs->outBuff != NULL);
@@ -3660,12 +3883,12 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
3660
3883
  /* shortcut to compression pass directly into output buffer */
3661
3884
  size_t const cSize = ZSTD_compressEnd(zcs,
3662
3885
  op, oend-op, ip, iend-ip);
3663
- DEBUGLOG(4, "ZSTD_compressEnd : %u", (U32)cSize);
3886
+ DEBUGLOG(4, "ZSTD_compressEnd : cSize=%u", (unsigned)cSize);
3664
3887
  if (ZSTD_isError(cSize)) return cSize;
3665
3888
  ip = iend;
3666
3889
  op += cSize;
3667
3890
  zcs->frameEnded = 1;
3668
- ZSTD_CCtx_reset(zcs);
3891
+ ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
3669
3892
  someMoreWork = 0; break;
3670
3893
  }
3671
3894
  /* complete loading into inBuffer */
@@ -3709,7 +3932,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
3709
3932
  if (zcs->inBuffTarget > zcs->inBuffSize)
3710
3933
  zcs->inBuffPos = 0, zcs->inBuffTarget = zcs->blockSize;
3711
3934
  DEBUGLOG(5, "inBuffTarget:%u / inBuffSize:%u",
3712
- (U32)zcs->inBuffTarget, (U32)zcs->inBuffSize);
3935
+ (unsigned)zcs->inBuffTarget, (unsigned)zcs->inBuffSize);
3713
3936
  if (!lastBlock)
3714
3937
  assert(zcs->inBuffTarget <= zcs->inBuffSize);
3715
3938
  zcs->inToCompress = zcs->inBuffPos;
@@ -3718,7 +3941,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
3718
3941
  if (zcs->frameEnded) {
3719
3942
  DEBUGLOG(5, "Frame completed directly in outBuffer");
3720
3943
  someMoreWork = 0;
3721
- ZSTD_CCtx_reset(zcs);
3944
+ ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
3722
3945
  }
3723
3946
  break;
3724
3947
  }
@@ -3733,7 +3956,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
3733
3956
  size_t const flushed = ZSTD_limitCopy(op, oend-op,
3734
3957
  zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
3735
3958
  DEBUGLOG(5, "toFlush: %u into %u ==> flushed: %u",
3736
- (U32)toFlush, (U32)(oend-op), (U32)flushed);
3959
+ (unsigned)toFlush, (unsigned)(oend-op), (unsigned)flushed);
3737
3960
  op += flushed;
3738
3961
  zcs->outBuffFlushedSize += flushed;
3739
3962
  if (toFlush!=flushed) {
@@ -3746,7 +3969,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
3746
3969
  if (zcs->frameEnded) {
3747
3970
  DEBUGLOG(5, "Frame completed on flush");
3748
3971
  someMoreWork = 0;
3749
- ZSTD_CCtx_reset(zcs);
3972
+ ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
3750
3973
  break;
3751
3974
  }
3752
3975
  zcs->streamStage = zcss_load;
@@ -3761,28 +3984,34 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
3761
3984
  input->pos = ip - istart;
3762
3985
  output->pos = op - ostart;
3763
3986
  if (zcs->frameEnded) return 0;
3764
- { size_t hintInSize = zcs->inBuffTarget - zcs->inBuffPos;
3765
- if (hintInSize==0) hintInSize = zcs->blockSize;
3766
- return hintInSize;
3987
+ return ZSTD_nextInputSizeHint(zcs);
3988
+ }
3989
+
3990
+ static size_t ZSTD_nextInputSizeHint_MTorST(const ZSTD_CCtx* cctx)
3991
+ {
3992
+ #ifdef ZSTD_MULTITHREAD
3993
+ if (cctx->appliedParams.nbWorkers >= 1) {
3994
+ assert(cctx->mtctx != NULL);
3995
+ return ZSTDMT_nextInputSizeHint(cctx->mtctx);
3767
3996
  }
3997
+ #endif
3998
+ return ZSTD_nextInputSizeHint(cctx);
3999
+
3768
4000
  }
3769
4001
 
3770
4002
  size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
3771
4003
  {
3772
- /* check conditions */
3773
- if (output->pos > output->size) return ERROR(GENERIC);
3774
- if (input->pos > input->size) return ERROR(GENERIC);
3775
-
3776
- return ZSTD_compressStream_generic(zcs, output, input, ZSTD_e_continue);
4004
+ CHECK_F( ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue) );
4005
+ return ZSTD_nextInputSizeHint_MTorST(zcs);
3777
4006
  }
3778
4007
 
3779
4008
 
3780
- size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
3781
- ZSTD_outBuffer* output,
3782
- ZSTD_inBuffer* input,
3783
- ZSTD_EndDirective endOp)
4009
+ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
4010
+ ZSTD_outBuffer* output,
4011
+ ZSTD_inBuffer* input,
4012
+ ZSTD_EndDirective endOp)
3784
4013
  {
3785
- DEBUGLOG(5, "ZSTD_compress_generic, endOp=%u ", (U32)endOp);
4014
+ DEBUGLOG(5, "ZSTD_compressStream2, endOp=%u ", (unsigned)endOp);
3786
4015
  /* check conditions */
3787
4016
  if (output->pos > output->size) return ERROR(GENERIC);
3788
4017
  if (input->pos > input->size) return ERROR(GENERIC);
@@ -3792,9 +4021,9 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
3792
4021
  if (cctx->streamStage == zcss_init) {
3793
4022
  ZSTD_CCtx_params params = cctx->requestedParams;
3794
4023
  ZSTD_prefixDict const prefixDict = cctx->prefixDict;
3795
- memset(&cctx->prefixDict, 0, sizeof(cctx->prefixDict)); /* single usage */
3796
- assert(prefixDict.dict==NULL || cctx->cdict==NULL); /* only one can be set */
3797
- DEBUGLOG(4, "ZSTD_compress_generic : transparent init stage");
4024
+ memset(&cctx->prefixDict, 0, sizeof(cctx->prefixDict)); /* single usage */
4025
+ assert(prefixDict.dict==NULL || cctx->cdict==NULL); /* only one can be set */
4026
+ DEBUGLOG(4, "ZSTD_compressStream2 : transparent init stage");
3798
4027
  if (endOp == ZSTD_e_end) cctx->pledgedSrcSizePlusOne = input->size + 1; /* auto-fix pledgedSrcSize */
3799
4028
  params.cParams = ZSTD_getCParamsFromCCtxParams(
3800
4029
  &cctx->requestedParams, cctx->pledgedSrcSizePlusOne-1, 0 /*dictSize*/);
@@ -3807,7 +4036,7 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
3807
4036
  if (params.nbWorkers > 0) {
3808
4037
  /* mt context creation */
3809
4038
  if (cctx->mtctx == NULL) {
3810
- DEBUGLOG(4, "ZSTD_compress_generic: creating new mtctx for nbWorkers=%u",
4039
+ DEBUGLOG(4, "ZSTD_compressStream2: creating new mtctx for nbWorkers=%u",
3811
4040
  params.nbWorkers);
3812
4041
  cctx->mtctx = ZSTDMT_createCCtx_advanced(params.nbWorkers, cctx->customMem);
3813
4042
  if (cctx->mtctx == NULL) return ERROR(memory_allocation);
@@ -3829,6 +4058,7 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
3829
4058
  assert(cctx->streamStage == zcss_load);
3830
4059
  assert(cctx->appliedParams.nbWorkers == 0);
3831
4060
  } }
4061
+ /* end of transparent initialization stage */
3832
4062
 
3833
4063
  /* compression stage */
3834
4064
  #ifdef ZSTD_MULTITHREAD
@@ -3840,18 +4070,18 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
3840
4070
  { size_t const flushMin = ZSTDMT_compressStream_generic(cctx->mtctx, output, input, endOp);
3841
4071
  if ( ZSTD_isError(flushMin)
3842
4072
  || (endOp == ZSTD_e_end && flushMin == 0) ) { /* compression completed */
3843
- ZSTD_CCtx_reset(cctx);
4073
+ ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only);
3844
4074
  }
3845
- DEBUGLOG(5, "completed ZSTD_compress_generic delegating to ZSTDMT_compressStream_generic");
4075
+ DEBUGLOG(5, "completed ZSTD_compressStream2 delegating to ZSTDMT_compressStream_generic");
3846
4076
  return flushMin;
3847
4077
  } }
3848
4078
  #endif
3849
4079
  CHECK_F( ZSTD_compressStream_generic(cctx, output, input, endOp) );
3850
- DEBUGLOG(5, "completed ZSTD_compress_generic");
4080
+ DEBUGLOG(5, "completed ZSTD_compressStream2");
3851
4081
  return cctx->outBuffContentSize - cctx->outBuffFlushedSize; /* remaining to flush */
3852
4082
  }
3853
4083
 
3854
- size_t ZSTD_compress_generic_simpleArgs (
4084
+ size_t ZSTD_compressStream2_simpleArgs (
3855
4085
  ZSTD_CCtx* cctx,
3856
4086
  void* dst, size_t dstCapacity, size_t* dstPos,
3857
4087
  const void* src, size_t srcSize, size_t* srcPos,
@@ -3859,13 +4089,33 @@ size_t ZSTD_compress_generic_simpleArgs (
3859
4089
  {
3860
4090
  ZSTD_outBuffer output = { dst, dstCapacity, *dstPos };
3861
4091
  ZSTD_inBuffer input = { src, srcSize, *srcPos };
3862
- /* ZSTD_compress_generic() will check validity of dstPos and srcPos */
3863
- size_t const cErr = ZSTD_compress_generic(cctx, &output, &input, endOp);
4092
+ /* ZSTD_compressStream2() will check validity of dstPos and srcPos */
4093
+ size_t const cErr = ZSTD_compressStream2(cctx, &output, &input, endOp);
3864
4094
  *dstPos = output.pos;
3865
4095
  *srcPos = input.pos;
3866
4096
  return cErr;
3867
4097
  }
3868
4098
 
4099
+ size_t ZSTD_compress2(ZSTD_CCtx* cctx,
4100
+ void* dst, size_t dstCapacity,
4101
+ const void* src, size_t srcSize)
4102
+ {
4103
+ ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only);
4104
+ { size_t oPos = 0;
4105
+ size_t iPos = 0;
4106
+ size_t const result = ZSTD_compressStream2_simpleArgs(cctx,
4107
+ dst, dstCapacity, &oPos,
4108
+ src, srcSize, &iPos,
4109
+ ZSTD_e_end);
4110
+ if (ZSTD_isError(result)) return result;
4111
+ if (result != 0) { /* compression not completed, due to lack of output space */
4112
+ assert(oPos == dstCapacity);
4113
+ return ERROR(dstSize_tooSmall);
4114
+ }
4115
+ assert(iPos == srcSize); /* all input is expected consumed */
4116
+ return oPos;
4117
+ }
4118
+ }
3869
4119
 
3870
4120
  /*====== Finalize ======*/
3871
4121
 
@@ -3874,21 +4124,21 @@ size_t ZSTD_compress_generic_simpleArgs (
3874
4124
  size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
3875
4125
  {
3876
4126
  ZSTD_inBuffer input = { NULL, 0, 0 };
3877
- if (output->pos > output->size) return ERROR(GENERIC);
3878
- CHECK_F( ZSTD_compressStream_generic(zcs, output, &input, ZSTD_e_flush) );
3879
- return zcs->outBuffContentSize - zcs->outBuffFlushedSize; /* remaining to flush */
4127
+ return ZSTD_compressStream2(zcs, output, &input, ZSTD_e_flush);
3880
4128
  }
3881
4129
 
3882
4130
 
3883
4131
  size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
3884
4132
  {
3885
4133
  ZSTD_inBuffer input = { NULL, 0, 0 };
3886
- if (output->pos > output->size) return ERROR(GENERIC);
3887
- CHECK_F( ZSTD_compressStream_generic(zcs, output, &input, ZSTD_e_end) );
4134
+ size_t const remainingToFlush = ZSTD_compressStream2(zcs, output, &input, ZSTD_e_end);
4135
+ CHECK_F( remainingToFlush );
4136
+ if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */
4137
+ /* single thread mode : attempt to calculate remaining to flush more precisely */
3888
4138
  { size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE;
3889
4139
  size_t const checksumSize = zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4;
3890
- size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize + lastBlockSize + checksumSize;
3891
- DEBUGLOG(4, "ZSTD_endStream : remaining to flush : %u", (U32)toFlush);
4140
+ size_t const toFlush = remainingToFlush + lastBlockSize + checksumSize;
4141
+ DEBUGLOG(4, "ZSTD_endStream : remaining to flush : %u", (unsigned)toFlush);
3892
4142
  return toFlush;
3893
4143
  }
3894
4144
  }
@@ -3905,27 +4155,27 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
3905
4155
  /* W, C, H, S, L, TL, strat */
3906
4156
  { 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */
3907
4157
  { 19, 13, 14, 1, 7, 0, ZSTD_fast }, /* level 1 */
3908
- { 19, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */
3909
- { 20, 16, 17, 1, 5, 1, ZSTD_dfast }, /* level 3 */
3910
- { 20, 18, 18, 1, 5, 1, ZSTD_dfast }, /* level 4 */
3911
- { 20, 18, 18, 2, 5, 2, ZSTD_greedy }, /* level 5 */
3912
- { 21, 18, 19, 2, 5, 4, ZSTD_lazy }, /* level 6 */
3913
- { 21, 18, 19, 3, 5, 8, ZSTD_lazy2 }, /* level 7 */
4158
+ { 20, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */
4159
+ { 21, 16, 17, 1, 5, 1, ZSTD_dfast }, /* level 3 */
4160
+ { 21, 18, 18, 1, 5, 1, ZSTD_dfast }, /* level 4 */
4161
+ { 21, 18, 19, 2, 5, 2, ZSTD_greedy }, /* level 5 */
4162
+ { 21, 19, 19, 3, 5, 4, ZSTD_greedy }, /* level 6 */
4163
+ { 21, 19, 19, 3, 5, 8, ZSTD_lazy }, /* level 7 */
3914
4164
  { 21, 19, 19, 3, 5, 16, ZSTD_lazy2 }, /* level 8 */
3915
4165
  { 21, 19, 20, 4, 5, 16, ZSTD_lazy2 }, /* level 9 */
3916
- { 21, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
3917
- { 21, 21, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
3918
- { 22, 20, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */
3919
- { 22, 21, 22, 4, 5, 32, ZSTD_btlazy2 }, /* level 13 */
3920
- { 22, 21, 22, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */
3921
- { 22, 22, 22, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */
3922
- { 22, 21, 22, 4, 5, 48, ZSTD_btopt }, /* level 16 */
3923
- { 23, 22, 22, 4, 4, 64, ZSTD_btopt }, /* level 17 */
3924
- { 23, 23, 22, 6, 3,256, ZSTD_btopt }, /* level 18 */
3925
- { 23, 24, 22, 7, 3,256, ZSTD_btultra }, /* level 19 */
3926
- { 25, 25, 23, 7, 3,256, ZSTD_btultra }, /* level 20 */
3927
- { 26, 26, 24, 7, 3,512, ZSTD_btultra }, /* level 21 */
3928
- { 27, 27, 25, 9, 3,999, ZSTD_btultra }, /* level 22 */
4166
+ { 22, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
4167
+ { 22, 21, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
4168
+ { 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */
4169
+ { 22, 21, 22, 5, 5, 32, ZSTD_btlazy2 }, /* level 13 */
4170
+ { 22, 22, 23, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */
4171
+ { 22, 23, 23, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */
4172
+ { 22, 22, 22, 5, 5, 48, ZSTD_btopt }, /* level 16 */
4173
+ { 23, 23, 22, 5, 4, 64, ZSTD_btopt }, /* level 17 */
4174
+ { 23, 23, 22, 6, 3, 64, ZSTD_btultra }, /* level 18 */
4175
+ { 23, 24, 22, 7, 3,256, ZSTD_btultra2}, /* level 19 */
4176
+ { 25, 25, 23, 7, 3,256, ZSTD_btultra2}, /* level 20 */
4177
+ { 26, 26, 24, 7, 3,512, ZSTD_btultra2}, /* level 21 */
4178
+ { 27, 27, 25, 9, 3,999, ZSTD_btultra2}, /* level 22 */
3929
4179
  },
3930
4180
  { /* for srcSize <= 256 KB */
3931
4181
  /* W, C, H, S, L, T, strat */
@@ -3940,18 +4190,18 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
3940
4190
  { 18, 18, 19, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */
3941
4191
  { 18, 18, 19, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */
3942
4192
  { 18, 18, 19, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */
3943
- { 18, 18, 19, 5, 4, 16, ZSTD_btlazy2 }, /* level 11.*/
3944
- { 18, 19, 19, 6, 4, 16, ZSTD_btlazy2 }, /* level 12.*/
3945
- { 18, 19, 19, 8, 4, 16, ZSTD_btlazy2 }, /* level 13 */
3946
- { 18, 18, 19, 4, 4, 24, ZSTD_btopt }, /* level 14.*/
3947
- { 18, 18, 19, 4, 3, 24, ZSTD_btopt }, /* level 15.*/
3948
- { 18, 19, 19, 6, 3, 64, ZSTD_btopt }, /* level 16.*/
3949
- { 18, 19, 19, 8, 3,128, ZSTD_btopt }, /* level 17.*/
3950
- { 18, 19, 19, 10, 3,256, ZSTD_btopt }, /* level 18.*/
3951
- { 18, 19, 19, 10, 3,256, ZSTD_btultra }, /* level 19.*/
3952
- { 18, 19, 19, 11, 3,512, ZSTD_btultra }, /* level 20.*/
3953
- { 18, 19, 19, 12, 3,512, ZSTD_btultra }, /* level 21.*/
3954
- { 18, 19, 19, 13, 3,999, ZSTD_btultra }, /* level 22.*/
4193
+ { 18, 18, 19, 5, 4, 12, ZSTD_btlazy2 }, /* level 11.*/
4194
+ { 18, 19, 19, 7, 4, 12, ZSTD_btlazy2 }, /* level 12.*/
4195
+ { 18, 18, 19, 4, 4, 16, ZSTD_btopt }, /* level 13 */
4196
+ { 18, 18, 19, 4, 3, 32, ZSTD_btopt }, /* level 14.*/
4197
+ { 18, 18, 19, 6, 3,128, ZSTD_btopt }, /* level 15.*/
4198
+ { 18, 19, 19, 6, 3,128, ZSTD_btultra }, /* level 16.*/
4199
+ { 18, 19, 19, 8, 3,256, ZSTD_btultra }, /* level 17.*/
4200
+ { 18, 19, 19, 6, 3,128, ZSTD_btultra2}, /* level 18.*/
4201
+ { 18, 19, 19, 8, 3,256, ZSTD_btultra2}, /* level 19.*/
4202
+ { 18, 19, 19, 10, 3,512, ZSTD_btultra2}, /* level 20.*/
4203
+ { 18, 19, 19, 12, 3,512, ZSTD_btultra2}, /* level 21.*/
4204
+ { 18, 19, 19, 13, 3,999, ZSTD_btultra2}, /* level 22.*/
3955
4205
  },
3956
4206
  { /* for srcSize <= 128 KB */
3957
4207
  /* W, C, H, S, L, T, strat */
@@ -3966,26 +4216,26 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
3966
4216
  { 17, 17, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */
3967
4217
  { 17, 17, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */
3968
4218
  { 17, 17, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */
3969
- { 17, 17, 17, 7, 4, 8, ZSTD_lazy2 }, /* level 11 */
3970
- { 17, 18, 17, 6, 4, 16, ZSTD_btlazy2 }, /* level 12 */
3971
- { 17, 18, 17, 8, 4, 16, ZSTD_btlazy2 }, /* level 13.*/
3972
- { 17, 18, 17, 4, 4, 32, ZSTD_btopt }, /* level 14.*/
3973
- { 17, 18, 17, 6, 3, 64, ZSTD_btopt }, /* level 15.*/
3974
- { 17, 18, 17, 7, 3,128, ZSTD_btopt }, /* level 16.*/
3975
- { 17, 18, 17, 7, 3,256, ZSTD_btopt }, /* level 17.*/
3976
- { 17, 18, 17, 8, 3,256, ZSTD_btopt }, /* level 18.*/
3977
- { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 19.*/
3978
- { 17, 18, 17, 9, 3,256, ZSTD_btultra }, /* level 20.*/
3979
- { 17, 18, 17, 10, 3,256, ZSTD_btultra }, /* level 21.*/
3980
- { 17, 18, 17, 11, 3,512, ZSTD_btultra }, /* level 22.*/
4219
+ { 17, 17, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 11 */
4220
+ { 17, 18, 17, 7, 4, 12, ZSTD_btlazy2 }, /* level 12 */
4221
+ { 17, 18, 17, 3, 4, 12, ZSTD_btopt }, /* level 13.*/
4222
+ { 17, 18, 17, 4, 3, 32, ZSTD_btopt }, /* level 14.*/
4223
+ { 17, 18, 17, 6, 3,256, ZSTD_btopt }, /* level 15.*/
4224
+ { 17, 18, 17, 6, 3,128, ZSTD_btultra }, /* level 16.*/
4225
+ { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 17.*/
4226
+ { 17, 18, 17, 10, 3,512, ZSTD_btultra }, /* level 18.*/
4227
+ { 17, 18, 17, 5, 3,256, ZSTD_btultra2}, /* level 19.*/
4228
+ { 17, 18, 17, 7, 3,512, ZSTD_btultra2}, /* level 20.*/
4229
+ { 17, 18, 17, 9, 3,512, ZSTD_btultra2}, /* level 21.*/
4230
+ { 17, 18, 17, 11, 3,999, ZSTD_btultra2}, /* level 22.*/
3981
4231
  },
3982
4232
  { /* for srcSize <= 16 KB */
3983
4233
  /* W, C, H, S, L, T, strat */
3984
4234
  { 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */
3985
4235
  { 14, 14, 15, 1, 5, 0, ZSTD_fast }, /* level 1 */
3986
4236
  { 14, 14, 15, 1, 4, 0, ZSTD_fast }, /* level 2 */
3987
- { 14, 14, 14, 2, 4, 1, ZSTD_dfast }, /* level 3.*/
3988
- { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4.*/
4237
+ { 14, 14, 15, 2, 4, 1, ZSTD_dfast }, /* level 3 */
4238
+ { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4 */
3989
4239
  { 14, 14, 14, 3, 4, 4, ZSTD_lazy }, /* level 5.*/
3990
4240
  { 14, 14, 14, 4, 4, 8, ZSTD_lazy2 }, /* level 6 */
3991
4241
  { 14, 14, 14, 6, 4, 8, ZSTD_lazy2 }, /* level 7 */
@@ -3993,17 +4243,17 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
3993
4243
  { 14, 15, 14, 5, 4, 8, ZSTD_btlazy2 }, /* level 9.*/
3994
4244
  { 14, 15, 14, 9, 4, 8, ZSTD_btlazy2 }, /* level 10.*/
3995
4245
  { 14, 15, 14, 3, 4, 12, ZSTD_btopt }, /* level 11.*/
3996
- { 14, 15, 14, 6, 3, 16, ZSTD_btopt }, /* level 12.*/
3997
- { 14, 15, 14, 6, 3, 24, ZSTD_btopt }, /* level 13.*/
3998
- { 14, 15, 15, 6, 3, 48, ZSTD_btopt }, /* level 14.*/
3999
- { 14, 15, 15, 6, 3, 64, ZSTD_btopt }, /* level 15.*/
4000
- { 14, 15, 15, 6, 3, 96, ZSTD_btopt }, /* level 16.*/
4001
- { 14, 15, 15, 6, 3,128, ZSTD_btopt }, /* level 17.*/
4002
- { 14, 15, 15, 8, 3,256, ZSTD_btopt }, /* level 18.*/
4003
- { 14, 15, 15, 6, 3,256, ZSTD_btultra }, /* level 19.*/
4004
- { 14, 15, 15, 8, 3,256, ZSTD_btultra }, /* level 20.*/
4005
- { 14, 15, 15, 9, 3,256, ZSTD_btultra }, /* level 21.*/
4006
- { 14, 15, 15, 10, 3,512, ZSTD_btultra }, /* level 22.*/
4246
+ { 14, 15, 14, 4, 3, 24, ZSTD_btopt }, /* level 12.*/
4247
+ { 14, 15, 14, 5, 3, 32, ZSTD_btultra }, /* level 13.*/
4248
+ { 14, 15, 15, 6, 3, 64, ZSTD_btultra }, /* level 14.*/
4249
+ { 14, 15, 15, 7, 3,256, ZSTD_btultra }, /* level 15.*/
4250
+ { 14, 15, 15, 5, 3, 48, ZSTD_btultra2}, /* level 16.*/
4251
+ { 14, 15, 15, 6, 3,128, ZSTD_btultra2}, /* level 17.*/
4252
+ { 14, 15, 15, 7, 3,256, ZSTD_btultra2}, /* level 18.*/
4253
+ { 14, 15, 15, 8, 3,256, ZSTD_btultra2}, /* level 19.*/
4254
+ { 14, 15, 15, 8, 3,512, ZSTD_btultra2}, /* level 20.*/
4255
+ { 14, 15, 15, 9, 3,512, ZSTD_btultra2}, /* level 21.*/
4256
+ { 14, 15, 15, 10, 3,999, ZSTD_btultra2}, /* level 22.*/
4007
4257
  },
4008
4258
  };
4009
4259
 
@@ -4022,8 +4272,8 @@ ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long l
4022
4272
  if (compressionLevel > ZSTD_MAX_CLEVEL) row = ZSTD_MAX_CLEVEL;
4023
4273
  { ZSTD_compressionParameters cp = ZSTD_defaultCParameters[tableID][row];
4024
4274
  if (compressionLevel < 0) cp.targetLength = (unsigned)(-compressionLevel); /* acceleration factor */
4025
- return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize); }
4026
-
4275
+ return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize);
4276
+ }
4027
4277
  }
4028
4278
 
4029
4279
  /*! ZSTD_getParams() :