zstd-ruby 1.4.5.0 → 1.4.9.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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +35 -0
  3. data/README.md +2 -2
  4. data/ext/zstdruby/libzstd/Makefile +237 -138
  5. data/ext/zstdruby/libzstd/README.md +28 -0
  6. data/ext/zstdruby/libzstd/common/bitstream.h +25 -16
  7. data/ext/zstdruby/libzstd/common/compiler.h +118 -4
  8. data/ext/zstdruby/libzstd/common/cpu.h +1 -3
  9. data/ext/zstdruby/libzstd/common/debug.c +1 -1
  10. data/ext/zstdruby/libzstd/common/debug.h +12 -19
  11. data/ext/zstdruby/libzstd/common/entropy_common.c +189 -43
  12. data/ext/zstdruby/libzstd/common/error_private.c +2 -1
  13. data/ext/zstdruby/libzstd/common/error_private.h +2 -2
  14. data/ext/zstdruby/libzstd/common/fse.h +40 -12
  15. data/ext/zstdruby/libzstd/common/fse_decompress.c +124 -17
  16. data/ext/zstdruby/libzstd/common/huf.h +27 -6
  17. data/ext/zstdruby/libzstd/common/mem.h +67 -94
  18. data/ext/zstdruby/libzstd/common/pool.c +23 -17
  19. data/ext/zstdruby/libzstd/common/pool.h +2 -2
  20. data/ext/zstdruby/libzstd/common/threading.c +6 -5
  21. data/ext/zstdruby/libzstd/common/xxhash.c +19 -57
  22. data/ext/zstdruby/libzstd/common/xxhash.h +2 -2
  23. data/ext/zstdruby/libzstd/common/zstd_common.c +10 -10
  24. data/ext/zstdruby/libzstd/common/zstd_deps.h +111 -0
  25. data/ext/zstdruby/libzstd/common/zstd_errors.h +2 -1
  26. data/ext/zstdruby/libzstd/common/zstd_internal.h +90 -59
  27. data/ext/zstdruby/libzstd/common/zstd_trace.c +42 -0
  28. data/ext/zstdruby/libzstd/common/zstd_trace.h +152 -0
  29. data/ext/zstdruby/libzstd/compress/fse_compress.c +31 -24
  30. data/ext/zstdruby/libzstd/compress/hist.c +27 -29
  31. data/ext/zstdruby/libzstd/compress/hist.h +2 -2
  32. data/ext/zstdruby/libzstd/compress/huf_compress.c +217 -101
  33. data/ext/zstdruby/libzstd/compress/zstd_compress.c +1495 -478
  34. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +143 -44
  35. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +7 -7
  36. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +1 -1
  37. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +18 -4
  38. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +1 -1
  39. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +25 -21
  40. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +1 -1
  41. data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +62 -26
  42. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +23 -23
  43. data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +1 -1
  44. data/ext/zstdruby/libzstd/compress/zstd_fast.c +21 -21
  45. data/ext/zstdruby/libzstd/compress/zstd_fast.h +1 -1
  46. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +352 -78
  47. data/ext/zstdruby/libzstd/compress/zstd_lazy.h +21 -1
  48. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +276 -209
  49. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +8 -2
  50. data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +103 -0
  51. data/ext/zstdruby/libzstd/compress/zstd_opt.c +191 -46
  52. data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
  53. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +79 -410
  54. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +27 -109
  55. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +303 -201
  56. data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +9 -9
  57. data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +2 -2
  58. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +370 -87
  59. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +153 -45
  60. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +6 -3
  61. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +28 -11
  62. data/ext/zstdruby/libzstd/deprecated/zbuff.h +1 -1
  63. data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +1 -1
  64. data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +1 -1
  65. data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +1 -1
  66. data/ext/zstdruby/libzstd/dictBuilder/cover.c +40 -31
  67. data/ext/zstdruby/libzstd/dictBuilder/cover.h +2 -2
  68. data/ext/zstdruby/libzstd/dictBuilder/divsufsort.c +1 -1
  69. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +26 -25
  70. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +22 -24
  71. data/ext/zstdruby/libzstd/dictBuilder/zdict.h +5 -4
  72. data/ext/zstdruby/libzstd/dll/example/Makefile +1 -1
  73. data/ext/zstdruby/libzstd/dll/example/README.md +16 -22
  74. data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +1 -1
  75. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +6 -2
  76. data/ext/zstdruby/libzstd/legacy/zstd_v01.h +1 -1
  77. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +6 -2
  78. data/ext/zstdruby/libzstd/legacy/zstd_v02.h +1 -1
  79. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +6 -2
  80. data/ext/zstdruby/libzstd/legacy/zstd_v03.h +1 -1
  81. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +7 -3
  82. data/ext/zstdruby/libzstd/legacy/zstd_v04.h +1 -1
  83. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +10 -6
  84. data/ext/zstdruby/libzstd/legacy/zstd_v05.h +1 -1
  85. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +10 -6
  86. data/ext/zstdruby/libzstd/legacy/zstd_v06.h +1 -1
  87. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +10 -6
  88. data/ext/zstdruby/libzstd/legacy/zstd_v07.h +1 -1
  89. data/ext/zstdruby/libzstd/libzstd.pc.in +3 -3
  90. data/ext/zstdruby/libzstd/zstd.h +414 -54
  91. data/lib/zstd-ruby/version.rb +1 -1
  92. metadata +7 -3
  93. data/.travis.yml +0 -14
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -19,6 +19,7 @@
19
19
  * Dependencies
20
20
  ***************************************/
21
21
  #include "../common/zstd_internal.h"
22
+ #include "../common/zstd_trace.h" /* ZSTD_TraceCtx */
22
23
  #include "zstd_cwksp.h"
23
24
  #ifdef ZSTD_MULTITHREAD
24
25
  # include "zstdmt_compress.h"
@@ -28,7 +29,6 @@
28
29
  extern "C" {
29
30
  #endif
30
31
 
31
-
32
32
  /*-*************************************
33
33
  * Constants
34
34
  ***************************************/
@@ -64,7 +64,7 @@ typedef struct {
64
64
  } ZSTD_localDict;
65
65
 
66
66
  typedef struct {
67
- U32 CTable[HUF_CTABLE_SIZE_U32(255)];
67
+ HUF_CElt CTable[HUF_CTABLE_SIZE_U32(255)];
68
68
  HUF_repeat repeatMode;
69
69
  } ZSTD_hufCTables_t;
70
70
 
@@ -83,10 +83,27 @@ typedef struct {
83
83
  } ZSTD_entropyCTables_t;
84
84
 
85
85
  typedef struct {
86
- U32 off;
87
- U32 len;
86
+ U32 off; /* Offset code (offset + ZSTD_REP_MOVE) for the match */
87
+ U32 len; /* Raw length of match */
88
88
  } ZSTD_match_t;
89
89
 
90
+ typedef struct {
91
+ U32 offset; /* Offset of sequence */
92
+ U32 litLength; /* Length of literals prior to match */
93
+ U32 matchLength; /* Raw length of match */
94
+ } rawSeq;
95
+
96
+ typedef struct {
97
+ rawSeq* seq; /* The start of the sequences */
98
+ size_t pos; /* The index in seq where reading stopped. pos <= size. */
99
+ size_t posInSequence; /* The position within the sequence at seq[pos] where reading
100
+ stopped. posInSequence <= seq[pos].litLength + seq[pos].matchLength */
101
+ size_t size; /* The number of sequences. <= capacity. */
102
+ size_t capacity; /* The capacity starting from `seq` pointer */
103
+ } rawSeqStore_t;
104
+
105
+ UNUSED_ATTR static const rawSeqStore_t kNullRawSeqStore = {NULL, 0, 0, 0, 0};
106
+
90
107
  typedef struct {
91
108
  int price;
92
109
  U32 off;
@@ -147,9 +164,13 @@ struct ZSTD_matchState_t {
147
164
  U32* hashTable;
148
165
  U32* hashTable3;
149
166
  U32* chainTable;
167
+ int dedicatedDictSearch; /* Indicates whether this matchState is using the
168
+ * dedicated dictionary search structure.
169
+ */
150
170
  optState_t opt; /* optimal parser state */
151
171
  const ZSTD_matchState_t* dictMatchState;
152
172
  ZSTD_compressionParameters cParams;
173
+ const rawSeqStore_t* ldmSeqStore;
153
174
  };
154
175
 
155
176
  typedef struct {
@@ -163,13 +184,22 @@ typedef struct {
163
184
  U32 checksum;
164
185
  } ldmEntry_t;
165
186
 
187
+ typedef struct {
188
+ BYTE const* split;
189
+ U32 hash;
190
+ U32 checksum;
191
+ ldmEntry_t* bucket;
192
+ } ldmMatchCandidate_t;
193
+
194
+ #define LDM_BATCH_SIZE 64
195
+
166
196
  typedef struct {
167
197
  ZSTD_window_t window; /* State for the window round buffer management */
168
198
  ldmEntry_t* hashTable;
169
199
  U32 loadedDictEnd;
170
200
  BYTE* bucketOffsets; /* Next position in bucket to insert entry */
171
- U64 hashPower; /* Used to compute the rolling hash.
172
- * Depends on ldmParams.minMatchLength */
201
+ size_t splitIndices[LDM_BATCH_SIZE];
202
+ ldmMatchCandidate_t matchCandidates[LDM_BATCH_SIZE];
173
203
  } ldmState_t;
174
204
 
175
205
  typedef struct {
@@ -181,19 +211,6 @@ typedef struct {
181
211
  U32 windowLog; /* Window log for the LDM */
182
212
  } ldmParams_t;
183
213
 
184
- typedef struct {
185
- U32 offset;
186
- U32 litLength;
187
- U32 matchLength;
188
- } rawSeq;
189
-
190
- typedef struct {
191
- rawSeq* seq; /* The start of the sequences */
192
- size_t pos; /* The position where reading stopped. <= size. */
193
- size_t size; /* The number of sequences. <= capacity. */
194
- size_t capacity; /* The capacity starting from `seq` pointer */
195
- } rawSeqStore_t;
196
-
197
214
  typedef struct {
198
215
  int collectSequences;
199
216
  ZSTD_Sequence* seqStart;
@@ -228,10 +245,34 @@ struct ZSTD_CCtx_params_s {
228
245
  /* Long distance matching parameters */
229
246
  ldmParams_t ldmParams;
230
247
 
248
+ /* Dedicated dict search algorithm trigger */
249
+ int enableDedicatedDictSearch;
250
+
251
+ /* Input/output buffer modes */
252
+ ZSTD_bufferMode_e inBufferMode;
253
+ ZSTD_bufferMode_e outBufferMode;
254
+
255
+ /* Sequence compression API */
256
+ ZSTD_sequenceFormat_e blockDelimiters;
257
+ int validateSequences;
258
+
231
259
  /* Internal use, for createCCtxParams() and freeCCtxParams() only */
232
260
  ZSTD_customMem customMem;
233
261
  }; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */
234
262
 
263
+ #define COMPRESS_SEQUENCES_WORKSPACE_SIZE (sizeof(unsigned) * (MaxSeq + 2))
264
+ #define ENTROPY_WORKSPACE_SIZE (HUF_WORKSPACE_SIZE + COMPRESS_SEQUENCES_WORKSPACE_SIZE)
265
+
266
+ /**
267
+ * Indicates whether this compression proceeds directly from user-provided
268
+ * source buffer to user-provided destination buffer (ZSTDb_not_buffered), or
269
+ * whether the context needs to buffer the input/output (ZSTDb_buffered).
270
+ */
271
+ typedef enum {
272
+ ZSTDb_not_buffered,
273
+ ZSTDb_buffered
274
+ } ZSTD_buffered_policy_e;
275
+
235
276
  struct ZSTD_CCtx_s {
236
277
  ZSTD_compressionStage_e stage;
237
278
  int cParamsChanged; /* == 1 if cParams(except wlog) or compression level are changed in requestedParams. Triggers transmission of new params to ZSTDMT (if available) then reset to 0. */
@@ -239,6 +280,7 @@ struct ZSTD_CCtx_s {
239
280
  ZSTD_CCtx_params requestedParams;
240
281
  ZSTD_CCtx_params appliedParams;
241
282
  U32 dictID;
283
+ size_t dictContentSize;
242
284
 
243
285
  ZSTD_cwksp workspace; /* manages buffer for dynamic allocations */
244
286
  size_t blockSize;
@@ -247,6 +289,7 @@ struct ZSTD_CCtx_s {
247
289
  unsigned long long producedCSize;
248
290
  XXH64_state_t xxhState;
249
291
  ZSTD_customMem customMem;
292
+ ZSTD_threadPool* pool;
250
293
  size_t staticSize;
251
294
  SeqCollector seqCollector;
252
295
  int isFirstBlock;
@@ -258,7 +301,10 @@ struct ZSTD_CCtx_s {
258
301
  size_t maxNbLdmSequences;
259
302
  rawSeqStore_t externSeqStore; /* Mutable reference to external sequences */
260
303
  ZSTD_blockState_t blockState;
261
- U32* entropyWorkspace; /* entropy workspace of HUF_WORKSPACE_SIZE bytes */
304
+ U32* entropyWorkspace; /* entropy workspace of ENTROPY_WORKSPACE_SIZE bytes */
305
+
306
+ /* Wether we are streaming or not */
307
+ ZSTD_buffered_policy_e bufferedPolicy;
262
308
 
263
309
  /* streaming */
264
310
  char* inBuff;
@@ -273,6 +319,10 @@ struct ZSTD_CCtx_s {
273
319
  ZSTD_cStreamStage streamStage;
274
320
  U32 frameEnded;
275
321
 
322
+ /* Stable in/out buffer verification */
323
+ ZSTD_inBuffer expectedInBuffer;
324
+ size_t expectedOutBufferSize;
325
+
276
326
  /* Dictionary */
277
327
  ZSTD_localDict localDict;
278
328
  const ZSTD_CDict* cdict;
@@ -282,12 +332,41 @@ struct ZSTD_CCtx_s {
282
332
  #ifdef ZSTD_MULTITHREAD
283
333
  ZSTDMT_CCtx* mtctx;
284
334
  #endif
335
+
336
+ /* Tracing */
337
+ #if ZSTD_TRACE
338
+ ZSTD_TraceCtx traceCtx;
339
+ #endif
285
340
  };
286
341
 
287
342
  typedef enum { ZSTD_dtlm_fast, ZSTD_dtlm_full } ZSTD_dictTableLoadMethod_e;
288
343
 
289
- typedef enum { ZSTD_noDict = 0, ZSTD_extDict = 1, ZSTD_dictMatchState = 2 } ZSTD_dictMode_e;
290
-
344
+ typedef enum {
345
+ ZSTD_noDict = 0,
346
+ ZSTD_extDict = 1,
347
+ ZSTD_dictMatchState = 2,
348
+ ZSTD_dedicatedDictSearch = 3
349
+ } ZSTD_dictMode_e;
350
+
351
+ typedef enum {
352
+ ZSTD_cpm_noAttachDict = 0, /* Compression with ZSTD_noDict or ZSTD_extDict.
353
+ * In this mode we use both the srcSize and the dictSize
354
+ * when selecting and adjusting parameters.
355
+ */
356
+ ZSTD_cpm_attachDict = 1, /* Compression with ZSTD_dictMatchState or ZSTD_dedicatedDictSearch.
357
+ * In this mode we only take the srcSize into account when selecting
358
+ * and adjusting parameters.
359
+ */
360
+ ZSTD_cpm_createCDict = 2, /* Creating a CDict.
361
+ * In this mode we take both the source size and the dictionary size
362
+ * into account when selecting and adjusting the parameters.
363
+ */
364
+ ZSTD_cpm_unknown = 3, /* ZSTD_getCParams, ZSTD_getParams, ZSTD_adjustParams.
365
+ * We don't know what these parameters are for. We default to the legacy
366
+ * behavior of taking both the source size and the dict size into account
367
+ * when selecting and adjusting parameters.
368
+ */
369
+ } ZSTD_cParamMode_e;
291
370
 
292
371
  typedef size_t (*ZSTD_blockCompressor) (
293
372
  ZSTD_matchState_t* bs, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
@@ -345,7 +424,7 @@ MEM_STATIC repcodes_t ZSTD_updateRep(U32 const rep[3], U32 const offset, U32 con
345
424
  newReps.rep[1] = rep[0];
346
425
  newReps.rep[0] = currentOffset;
347
426
  } else { /* repCode == 0 */
348
- memcpy(&newReps, rep, sizeof(newReps));
427
+ ZSTD_memcpy(&newReps, rep, sizeof(newReps));
349
428
  }
350
429
  }
351
430
  return newReps;
@@ -372,7 +451,7 @@ MEM_STATIC size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const voi
372
451
  RETURN_ERROR_IF(srcSize + ZSTD_blockHeaderSize > dstCapacity,
373
452
  dstSize_tooSmall, "dst buf too small for uncompressed block");
374
453
  MEM_writeLE24(dst, cBlockHeader24);
375
- memcpy((BYTE*)dst + ZSTD_blockHeaderSize, src, srcSize);
454
+ ZSTD_memcpy((BYTE*)dst + ZSTD_blockHeaderSize, src, srcSize);
376
455
  return ZSTD_blockHeaderSize + srcSize;
377
456
  }
378
457
 
@@ -498,8 +577,12 @@ static unsigned ZSTD_NbCommonBytes (size_t val)
498
577
  if (MEM_isLittleEndian()) {
499
578
  if (MEM_64bits()) {
500
579
  # if defined(_MSC_VER) && defined(_WIN64)
501
- unsigned long r = 0;
502
- return _BitScanForward64( &r, (U64)val ) ? (unsigned)(r >> 3) : 0;
580
+ # if STATIC_BMI2
581
+ return _tzcnt_u64(val) >> 3;
582
+ # else
583
+ unsigned long r = 0;
584
+ return _BitScanForward64( &r, (U64)val ) ? (unsigned)(r >> 3) : 0;
585
+ # endif
503
586
  # elif defined(__GNUC__) && (__GNUC__ >= 4)
504
587
  return (__builtin_ctzll((U64)val) >> 3);
505
588
  # else
@@ -530,8 +613,12 @@ static unsigned ZSTD_NbCommonBytes (size_t val)
530
613
  } else { /* Big Endian CPU */
531
614
  if (MEM_64bits()) {
532
615
  # if defined(_MSC_VER) && defined(_WIN64)
533
- unsigned long r = 0;
534
- return _BitScanReverse64( &r, val ) ? (unsigned)(r >> 3) : 0;
616
+ # if STATIC_BMI2
617
+ return _lzcnt_u64(val) >> 3;
618
+ # else
619
+ unsigned long r = 0;
620
+ return _BitScanReverse64(&r, (U64)val) ? (unsigned)(r >> 3) : 0;
621
+ # endif
535
622
  # elif defined(__GNUC__) && (__GNUC__ >= 4)
536
623
  return (__builtin_clzll(val) >> 3);
537
624
  # else
@@ -626,7 +713,8 @@ static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL;
626
713
  static size_t ZSTD_hash8(U64 u, U32 h) { return (size_t)(((u) * prime8bytes) >> (64-h)) ; }
627
714
  static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h); }
628
715
 
629
- MEM_STATIC size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
716
+ MEM_STATIC FORCE_INLINE_ATTR
717
+ size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
630
718
  {
631
719
  switch(mls)
632
720
  {
@@ -742,7 +830,7 @@ MEM_STATIC ZSTD_dictMode_e ZSTD_matchState_dictMode(const ZSTD_matchState_t *ms)
742
830
  return ZSTD_window_hasExtDict(ms->window) ?
743
831
  ZSTD_extDict :
744
832
  ms->dictMatchState != NULL ?
745
- ZSTD_dictMatchState :
833
+ (ms->dictMatchState->dedicatedDictSearch ? ZSTD_dedicatedDictSearch : ZSTD_dictMatchState) :
746
834
  ZSTD_noDict;
747
835
  }
748
836
 
@@ -754,8 +842,8 @@ MEM_STATIC ZSTD_dictMode_e ZSTD_matchState_dictMode(const ZSTD_matchState_t *ms)
754
842
  MEM_STATIC U32 ZSTD_window_needOverflowCorrection(ZSTD_window_t const window,
755
843
  void const* srcEnd)
756
844
  {
757
- U32 const current = (U32)((BYTE const*)srcEnd - window.base);
758
- return current > ZSTD_CURRENT_MAX;
845
+ U32 const curr = (U32)((BYTE const*)srcEnd - window.base);
846
+ return curr > ZSTD_CURRENT_MAX;
759
847
  }
760
848
 
761
849
  /**
@@ -791,14 +879,14 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog,
791
879
  * windowLog <= 31 ==> 3<<29 + 1<<windowLog < 7<<29 < 1<<32.
792
880
  */
793
881
  U32 const cycleMask = (1U << cycleLog) - 1;
794
- U32 const current = (U32)((BYTE const*)src - window->base);
795
- U32 const currentCycle0 = current & cycleMask;
882
+ U32 const curr = (U32)((BYTE const*)src - window->base);
883
+ U32 const currentCycle0 = curr & cycleMask;
796
884
  /* Exclude zero so that newCurrent - maxDist >= 1. */
797
885
  U32 const currentCycle1 = currentCycle0 == 0 ? (1U << cycleLog) : currentCycle0;
798
886
  U32 const newCurrent = currentCycle1 + maxDist;
799
- U32 const correction = current - newCurrent;
887
+ U32 const correction = curr - newCurrent;
800
888
  assert((maxDist & cycleMask) == 0);
801
- assert(current > newCurrent);
889
+ assert(curr > newCurrent);
802
890
  /* Loose bound, should be around 1<<29 (see above) */
803
891
  assert(correction > 1<<28);
804
892
 
@@ -919,7 +1007,7 @@ ZSTD_checkDictValidity(const ZSTD_window_t* window,
919
1007
  }
920
1008
 
921
1009
  MEM_STATIC void ZSTD_window_init(ZSTD_window_t* window) {
922
- memset(window, 0, sizeof(*window));
1010
+ ZSTD_memset(window, 0, sizeof(*window));
923
1011
  window->base = (BYTE const*)"";
924
1012
  window->dictBase = (BYTE const*)"";
925
1013
  window->dictLimit = 1; /* start from 1, so that 1st position is valid */
@@ -973,12 +1061,16 @@ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window,
973
1061
  /**
974
1062
  * Returns the lowest allowed match index. It may either be in the ext-dict or the prefix.
975
1063
  */
976
- MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_matchState_t* ms, U32 current, unsigned windowLog)
1064
+ MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_matchState_t* ms, U32 curr, unsigned windowLog)
977
1065
  {
978
1066
  U32 const maxDistance = 1U << windowLog;
979
1067
  U32 const lowestValid = ms->window.lowLimit;
980
- U32 const withinWindow = (current - lowestValid > maxDistance) ? current - maxDistance : lowestValid;
1068
+ U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid;
981
1069
  U32 const isDictionary = (ms->loadedDictEnd != 0);
1070
+ /* When using a dictionary the entire dictionary is valid if a single byte of the dictionary
1071
+ * is within the window. We invalidate the dictionary (and set loadedDictEnd to 0) when it isn't
1072
+ * valid for the entire block. So this check is sufficient to find the lowest valid match index.
1073
+ */
982
1074
  U32 const matchLowest = isDictionary ? lowestValid : withinWindow;
983
1075
  return matchLowest;
984
1076
  }
@@ -986,12 +1078,15 @@ MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_matchState_t* ms, U32 current
986
1078
  /**
987
1079
  * Returns the lowest allowed match index in the prefix.
988
1080
  */
989
- MEM_STATIC U32 ZSTD_getLowestPrefixIndex(const ZSTD_matchState_t* ms, U32 current, unsigned windowLog)
1081
+ MEM_STATIC U32 ZSTD_getLowestPrefixIndex(const ZSTD_matchState_t* ms, U32 curr, unsigned windowLog)
990
1082
  {
991
1083
  U32 const maxDistance = 1U << windowLog;
992
1084
  U32 const lowestValid = ms->window.dictLimit;
993
- U32 const withinWindow = (current - lowestValid > maxDistance) ? current - maxDistance : lowestValid;
1085
+ U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid;
994
1086
  U32 const isDictionary = (ms->loadedDictEnd != 0);
1087
+ /* When computing the lowest prefix index we need to take the dictionary into account to handle
1088
+ * the edge case where the dictionary and the source are contiguous in memory.
1089
+ */
995
1090
  U32 const matchLowest = isDictionary ? lowestValid : withinWindow;
996
1091
  return matchLowest;
997
1092
  }
@@ -1045,7 +1140,6 @@ MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max)
1045
1140
  * assumptions : magic number supposed already checked
1046
1141
  * and dictSize >= 8 */
1047
1142
  size_t ZSTD_loadCEntropy(ZSTD_compressedBlockState_t* bs, void* workspace,
1048
- short* offcodeNCount, unsigned* offcodeMaxValue,
1049
1143
  const void* const dict, size_t dictSize);
1050
1144
 
1051
1145
  void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs);
@@ -1061,7 +1155,7 @@ void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs);
1061
1155
  * Note: srcSizeHint == 0 means 0!
1062
1156
  */
1063
1157
  ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams(
1064
- const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize);
1158
+ const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode);
1065
1159
 
1066
1160
  /*! ZSTD_initCStream_internal() :
1067
1161
  * Private use only. Init streaming operation.
@@ -1122,4 +1216,9 @@ size_t ZSTD_referenceExternalSequences(ZSTD_CCtx* cctx, rawSeq* seq, size_t nbSe
1122
1216
  * condition for correct operation : hashLog > 1 */
1123
1217
  U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat);
1124
1218
 
1219
+ /** ZSTD_CCtx_trace() :
1220
+ * Trace the end of a compression call.
1221
+ */
1222
+ void ZSTD_CCtx_trace(ZSTD_CCtx* cctx, size_t extraCSize);
1223
+
1125
1224
  #endif /* ZSTD_COMPRESS_H */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -15,7 +15,7 @@
15
15
 
16
16
  size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
17
17
  {
18
- BYTE* const ostart = (BYTE* const)dst;
18
+ BYTE* const ostart = (BYTE*)dst;
19
19
  U32 const flSize = 1 + (srcSize>31) + (srcSize>4095);
20
20
 
21
21
  RETURN_ERROR_IF(srcSize + flSize > dstCapacity, dstSize_tooSmall, "");
@@ -35,14 +35,14 @@ size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src,
35
35
  assert(0);
36
36
  }
37
37
 
38
- memcpy(ostart + flSize, src, srcSize);
38
+ ZSTD_memcpy(ostart + flSize, src, srcSize);
39
39
  DEBUGLOG(5, "Raw literals: %u -> %u", (U32)srcSize, (U32)(srcSize + flSize));
40
40
  return srcSize + flSize;
41
41
  }
42
42
 
43
43
  size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
44
44
  {
45
- BYTE* const ostart = (BYTE* const)dst;
45
+ BYTE* const ostart = (BYTE*)dst;
46
46
  U32 const flSize = 1 + (srcSize>31) + (srcSize>4095);
47
47
 
48
48
  (void)dstCapacity; /* dstCapacity already guaranteed to be >=4, hence large enough */
@@ -86,7 +86,7 @@ size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf,
86
86
  disableLiteralCompression, (U32)srcSize);
87
87
 
88
88
  /* Prepare nextEntropy assuming reusing the existing table */
89
- memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
89
+ ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
90
90
 
91
91
  if (disableLiteralCompression)
92
92
  return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
@@ -118,11 +118,11 @@ size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf,
118
118
  }
119
119
 
120
120
  if ((cLitSize==0) | (cLitSize >= srcSize - minGain) | ERR_isError(cLitSize)) {
121
- memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
121
+ ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
122
122
  return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
123
123
  }
124
124
  if (cLitSize==1) {
125
- memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
125
+ ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
126
126
  return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize);
127
127
  }
128
128
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the