zstd-ruby 1.3.7.0 → 1.3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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() :