zstd-ruby 1.3.5.0 → 1.3.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -2
  3. data/README.md +2 -1
  4. data/ext/zstdruby/libzstd/BUCK +1 -0
  5. data/ext/zstdruby/libzstd/Makefile +25 -13
  6. data/ext/zstdruby/libzstd/README.md +11 -10
  7. data/ext/zstdruby/libzstd/common/bitstream.h +8 -11
  8. data/ext/zstdruby/libzstd/common/compiler.h +30 -8
  9. data/ext/zstdruby/libzstd/common/cpu.h +1 -1
  10. data/ext/zstdruby/libzstd/common/mem.h +20 -2
  11. data/ext/zstdruby/libzstd/common/xxhash.c +1 -0
  12. data/ext/zstdruby/libzstd/common/zstd_internal.h +3 -2
  13. data/ext/zstdruby/libzstd/compress/fse_compress.c +55 -48
  14. data/ext/zstdruby/libzstd/compress/hist.h +1 -1
  15. data/ext/zstdruby/libzstd/compress/huf_compress.c +1 -1
  16. data/ext/zstdruby/libzstd/compress/zstd_compress.c +290 -147
  17. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +5 -2
  18. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +63 -51
  19. data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +3 -4
  20. data/ext/zstdruby/libzstd/compress/zstd_fast.c +44 -33
  21. data/ext/zstdruby/libzstd/compress/zstd_fast.h +3 -4
  22. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +125 -116
  23. data/ext/zstdruby/libzstd/compress/zstd_lazy.h +13 -15
  24. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +9 -11
  25. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +0 -1
  26. data/ext/zstdruby/libzstd/compress/zstd_opt.c +42 -36
  27. data/ext/zstdruby/libzstd/compress/zstd_opt.h +8 -9
  28. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +96 -51
  29. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +16 -6
  30. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +3 -3
  31. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +169 -101
  32. data/ext/zstdruby/libzstd/dictBuilder/cover.c +111 -87
  33. data/ext/zstdruby/libzstd/dictBuilder/cover.h +83 -0
  34. data/ext/zstdruby/libzstd/dictBuilder/divsufsort.c +3 -3
  35. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +728 -0
  36. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +34 -31
  37. data/ext/zstdruby/libzstd/dictBuilder/zdict.h +60 -5
  38. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +9 -3
  39. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +6 -0
  40. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +6 -0
  41. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +1 -5
  42. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +12 -9
  43. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +10 -10
  44. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +20 -18
  45. data/ext/zstdruby/libzstd/zstd.h +109 -50
  46. data/lib/zstd-ruby/version.rb +1 -1
  47. metadata +4 -2
@@ -140,6 +140,7 @@ struct ZSTD_matchState_t {
140
140
  U32* chainTable;
141
141
  optState_t opt; /* optimal parser state */
142
142
  const ZSTD_matchState_t *dictMatchState;
143
+ ZSTD_compressionParameters cParams;
143
144
  };
144
145
 
145
146
  typedef struct {
@@ -264,7 +265,7 @@ typedef enum { ZSTD_noDict = 0, ZSTD_extDict = 1, ZSTD_dictMatchState = 2 } ZSTD
264
265
 
265
266
  typedef size_t (*ZSTD_blockCompressor) (
266
267
  ZSTD_matchState_t* bs, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
267
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
268
+ void const* src, size_t srcSize);
268
269
  ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMode_e dictMode);
269
270
 
270
271
 
@@ -314,8 +315,10 @@ MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const v
314
315
  pos, (U32)litLength, (U32)mlBase+MINMATCH, (U32)offsetCode);
315
316
  }
316
317
  #endif
318
+ assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq);
317
319
  /* copy Literals */
318
- assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + 128 KB);
320
+ assert(seqStorePtr->maxNbLit <= 128 KB);
321
+ assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + seqStorePtr->maxNbLit);
319
322
  ZSTD_wildcopy(seqStorePtr->lit, literals, litLength);
320
323
  seqStorePtr->lit += litLength;
321
324
 
@@ -13,9 +13,9 @@
13
13
 
14
14
 
15
15
  void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms,
16
- ZSTD_compressionParameters const* cParams,
17
16
  void const* end, ZSTD_dictTableLoadMethod_e dtlm)
18
17
  {
18
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
19
19
  U32* const hashLarge = ms->hashTable;
20
20
  U32 const hBitsL = cParams->hashLog;
21
21
  U32 const mls = cParams->searchLength;
@@ -51,9 +51,10 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms,
51
51
  FORCE_INLINE_TEMPLATE
52
52
  size_t ZSTD_compressBlock_doubleFast_generic(
53
53
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
54
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize,
54
+ void const* src, size_t srcSize,
55
55
  U32 const mls /* template */, ZSTD_dictMode_e const dictMode)
56
56
  {
57
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
57
58
  U32* const hashLong = ms->hashTable;
58
59
  const U32 hBitsL = cParams->hashLog;
59
60
  U32* const hashSmall = ms->chainTable;
@@ -70,6 +71,9 @@ size_t ZSTD_compressBlock_doubleFast_generic(
70
71
  U32 offsetSaved = 0;
71
72
 
72
73
  const ZSTD_matchState_t* const dms = ms->dictMatchState;
74
+ const ZSTD_compressionParameters* const dictCParams =
75
+ dictMode == ZSTD_dictMatchState ?
76
+ &dms->cParams : NULL;
73
77
  const U32* const dictHashLong = dictMode == ZSTD_dictMatchState ?
74
78
  dms->hashTable : NULL;
75
79
  const U32* const dictHashSmall = dictMode == ZSTD_dictMatchState ?
@@ -85,6 +89,10 @@ size_t ZSTD_compressBlock_doubleFast_generic(
85
89
  const U32 dictIndexDelta = dictMode == ZSTD_dictMatchState ?
86
90
  prefixLowestIndex - (U32)(dictEnd - dictBase) :
87
91
  0;
92
+ const U32 dictHBitsL = dictMode == ZSTD_dictMatchState ?
93
+ dictCParams->hashLog : hBitsL;
94
+ const U32 dictHBitsS = dictMode == ZSTD_dictMatchState ?
95
+ dictCParams->chainLog : hBitsS;
88
96
  const U32 dictAndPrefixLength = (U32)(ip - prefixLowest + dictEnd - dictStart);
89
97
 
90
98
  assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState);
@@ -109,6 +117,8 @@ size_t ZSTD_compressBlock_doubleFast_generic(
109
117
  U32 offset;
110
118
  size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8);
111
119
  size_t const h = ZSTD_hashPtr(ip, hBitsS, mls);
120
+ size_t const dictHL = ZSTD_hashPtr(ip, dictHBitsL, 8);
121
+ size_t const dictHS = ZSTD_hashPtr(ip, dictHBitsS, mls);
112
122
  U32 const current = (U32)(ip-base);
113
123
  U32 const matchIndexL = hashLong[h2];
114
124
  U32 matchIndexS = hashSmall[h];
@@ -141,17 +151,17 @@ size_t ZSTD_compressBlock_doubleFast_generic(
141
151
  goto _match_stored;
142
152
  }
143
153
 
144
- /* check prefix long match */
145
- if ( (matchIndexL > prefixLowestIndex) && (MEM_read64(matchLong) == MEM_read64(ip)) ) {
146
- mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8;
147
- offset = (U32)(ip-matchLong);
148
- while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
149
- goto _match_found;
150
- }
151
-
152
- /* check dictMatchState long match */
153
- if (dictMode == ZSTD_dictMatchState) {
154
- U32 const dictMatchIndexL = dictHashLong[h2];
154
+ if (matchIndexL > prefixLowestIndex) {
155
+ /* check prefix long match */
156
+ if (MEM_read64(matchLong) == MEM_read64(ip)) {
157
+ mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8;
158
+ offset = (U32)(ip-matchLong);
159
+ while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
160
+ goto _match_found;
161
+ }
162
+ } else if (dictMode == ZSTD_dictMatchState) {
163
+ /* check dictMatchState long match */
164
+ U32 const dictMatchIndexL = dictHashLong[dictHL];
155
165
  const BYTE* dictMatchL = dictBase + dictMatchIndexL;
156
166
  assert(dictMatchL < dictEnd);
157
167
 
@@ -163,14 +173,14 @@ size_t ZSTD_compressBlock_doubleFast_generic(
163
173
  }
164
174
  }
165
175
 
166
- /* check prefix short match */
167
- if ( (matchIndexS > prefixLowestIndex) && (MEM_read32(match) == MEM_read32(ip)) ) {
168
- goto _search_next_long;
169
- }
170
-
171
- /* check dictMatchState short match */
172
- if (dictMode == ZSTD_dictMatchState) {
173
- U32 const dictMatchIndexS = dictHashSmall[h];
176
+ if (matchIndexS > prefixLowestIndex) {
177
+ /* check prefix short match */
178
+ if (MEM_read32(match) == MEM_read32(ip)) {
179
+ goto _search_next_long;
180
+ }
181
+ } else if (dictMode == ZSTD_dictMatchState) {
182
+ /* check dictMatchState short match */
183
+ U32 const dictMatchIndexS = dictHashSmall[dictHS];
174
184
  match = dictBase + dictMatchIndexS;
175
185
  matchIndexS = dictMatchIndexS + dictIndexDelta;
176
186
 
@@ -186,22 +196,23 @@ _search_next_long:
186
196
 
187
197
  {
188
198
  size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8);
199
+ size_t const dictHLNext = ZSTD_hashPtr(ip+1, dictHBitsL, 8);
189
200
  U32 const matchIndexL3 = hashLong[hl3];
190
201
  const BYTE* matchL3 = base + matchIndexL3;
191
202
  hashLong[hl3] = current + 1;
192
203
 
193
204
  /* check prefix long +1 match */
194
- if ( (matchIndexL3 > prefixLowestIndex) && (MEM_read64(matchL3) == MEM_read64(ip+1)) ) {
195
- mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8;
196
- ip++;
197
- offset = (U32)(ip-matchL3);
198
- while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */
199
- goto _match_found;
200
- }
201
-
202
- /* check dict long +1 match */
203
- if (dictMode == ZSTD_dictMatchState) {
204
- U32 const dictMatchIndexL3 = dictHashLong[hl3];
205
+ if (matchIndexL3 > prefixLowestIndex) {
206
+ if (MEM_read64(matchL3) == MEM_read64(ip+1)) {
207
+ mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8;
208
+ ip++;
209
+ offset = (U32)(ip-matchL3);
210
+ while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */
211
+ goto _match_found;
212
+ }
213
+ } else if (dictMode == ZSTD_dictMatchState) {
214
+ /* check dict long +1 match */
215
+ U32 const dictMatchIndexL3 = dictHashLong[dictHLNext];
205
216
  const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3;
206
217
  assert(dictMatchL3 < dictEnd);
207
218
  if (dictMatchL3 > dictStart && MEM_read64(dictMatchL3) == MEM_read64(ip+1)) {
@@ -296,49 +307,50 @@ _match_stored:
296
307
 
297
308
  size_t ZSTD_compressBlock_doubleFast(
298
309
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
299
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
310
+ void const* src, size_t srcSize)
300
311
  {
301
- const U32 mls = cParams->searchLength;
312
+ const U32 mls = ms->cParams.searchLength;
302
313
  switch(mls)
303
314
  {
304
315
  default: /* includes case 3 */
305
316
  case 4 :
306
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 4, ZSTD_noDict);
317
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_noDict);
307
318
  case 5 :
308
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 5, ZSTD_noDict);
319
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_noDict);
309
320
  case 6 :
310
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 6, ZSTD_noDict);
321
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_noDict);
311
322
  case 7 :
312
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 7, ZSTD_noDict);
323
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_noDict);
313
324
  }
314
325
  }
315
326
 
316
327
 
317
328
  size_t ZSTD_compressBlock_doubleFast_dictMatchState(
318
329
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
319
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
330
+ void const* src, size_t srcSize)
320
331
  {
321
- const U32 mls = cParams->searchLength;
332
+ const U32 mls = ms->cParams.searchLength;
322
333
  switch(mls)
323
334
  {
324
335
  default: /* includes case 3 */
325
336
  case 4 :
326
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 4, ZSTD_dictMatchState);
337
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_dictMatchState);
327
338
  case 5 :
328
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 5, ZSTD_dictMatchState);
339
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_dictMatchState);
329
340
  case 6 :
330
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 6, ZSTD_dictMatchState);
341
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_dictMatchState);
331
342
  case 7 :
332
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 7, ZSTD_dictMatchState);
343
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_dictMatchState);
333
344
  }
334
345
  }
335
346
 
336
347
 
337
348
  static size_t ZSTD_compressBlock_doubleFast_extDict_generic(
338
349
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
339
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize,
350
+ void const* src, size_t srcSize,
340
351
  U32 const mls /* template */)
341
352
  {
353
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
342
354
  U32* const hashLong = ms->hashTable;
343
355
  U32 const hBitsL = cParams->hashLog;
344
356
  U32* const hashSmall = ms->chainTable;
@@ -469,19 +481,19 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic(
469
481
 
470
482
  size_t ZSTD_compressBlock_doubleFast_extDict(
471
483
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
472
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
484
+ void const* src, size_t srcSize)
473
485
  {
474
- U32 const mls = cParams->searchLength;
486
+ U32 const mls = ms->cParams.searchLength;
475
487
  switch(mls)
476
488
  {
477
489
  default: /* includes case 3 */
478
490
  case 4 :
479
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 4);
491
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 4);
480
492
  case 5 :
481
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 5);
493
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 5);
482
494
  case 6 :
483
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 6);
495
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 6);
484
496
  case 7 :
485
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 7);
497
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 7);
486
498
  }
487
499
  }
@@ -19,17 +19,16 @@ extern "C" {
19
19
  #include "zstd_compress_internal.h" /* ZSTD_CCtx, size_t */
20
20
 
21
21
  void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms,
22
- ZSTD_compressionParameters const* cParams,
23
22
  void const* end, ZSTD_dictTableLoadMethod_e dtlm);
24
23
  size_t ZSTD_compressBlock_doubleFast(
25
24
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
26
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
25
+ void const* src, size_t srcSize);
27
26
  size_t ZSTD_compressBlock_doubleFast_dictMatchState(
28
27
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
29
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
28
+ void const* src, size_t srcSize);
30
29
  size_t ZSTD_compressBlock_doubleFast_extDict(
31
30
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
32
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
31
+ void const* src, size_t srcSize);
33
32
 
34
33
 
35
34
  #if defined (__cplusplus)
@@ -13,9 +13,9 @@
13
13
 
14
14
 
15
15
  void ZSTD_fillHashTable(ZSTD_matchState_t* ms,
16
- ZSTD_compressionParameters const* cParams,
17
16
  void const* end, ZSTD_dictTableLoadMethod_e dtlm)
18
17
  {
18
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
19
19
  U32* const hashTable = ms->hashTable;
20
20
  U32 const hBits = cParams->hashLog;
21
21
  U32 const mls = cParams->searchLength;
@@ -45,10 +45,13 @@ FORCE_INLINE_TEMPLATE
45
45
  size_t ZSTD_compressBlock_fast_generic(
46
46
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
47
47
  void const* src, size_t srcSize,
48
- U32 const hlog, U32 stepSize, U32 const mls,
49
- ZSTD_dictMode_e const dictMode)
48
+ U32 const mls, ZSTD_dictMode_e const dictMode)
50
49
  {
50
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
51
51
  U32* const hashTable = ms->hashTable;
52
+ U32 const hlog = cParams->hashLog;
53
+ /* support stepSize of 0 */
54
+ U32 const stepSize = cParams->targetLength + !(cParams->targetLength);
52
55
  const BYTE* const base = ms->window.base;
53
56
  const BYTE* const istart = (const BYTE*)src;
54
57
  const BYTE* ip = istart;
@@ -61,6 +64,9 @@ size_t ZSTD_compressBlock_fast_generic(
61
64
  U32 offsetSaved = 0;
62
65
 
63
66
  const ZSTD_matchState_t* const dms = ms->dictMatchState;
67
+ const ZSTD_compressionParameters* const dictCParams =
68
+ dictMode == ZSTD_dictMatchState ?
69
+ &dms->cParams : NULL;
64
70
  const U32* const dictHashTable = dictMode == ZSTD_dictMatchState ?
65
71
  dms->hashTable : NULL;
66
72
  const U32 dictStartIndex = dictMode == ZSTD_dictMatchState ?
@@ -75,6 +81,8 @@ size_t ZSTD_compressBlock_fast_generic(
75
81
  prefixStartIndex - (U32)(dictEnd - dictBase) :
76
82
  0;
77
83
  const U32 dictAndPrefixLength = (U32)(ip - prefixStart + dictEnd - dictStart);
84
+ const U32 dictHLog = dictMode == ZSTD_dictMatchState ?
85
+ dictCParams->hashLog : hlog;
78
86
 
79
87
  assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState);
80
88
 
@@ -84,7 +92,6 @@ size_t ZSTD_compressBlock_fast_generic(
84
92
  || prefixStartIndex >= (U32)(dictEnd - dictBase));
85
93
 
86
94
  /* init */
87
- stepSize += !stepSize; /* support stepSize of 0 */
88
95
  ip += (dictAndPrefixLength == 0);
89
96
  if (dictMode == ZSTD_noDict) {
90
97
  U32 const maxRep = (U32)(ip - prefixStart);
@@ -124,10 +131,10 @@ size_t ZSTD_compressBlock_fast_generic(
124
131
  mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
125
132
  ip++;
126
133
  ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
127
- } else if ( (matchIndex <= prefixStartIndex)
128
- || (MEM_read32(match) != MEM_read32(ip)) ) {
134
+ } else if ( (matchIndex <= prefixStartIndex) ) {
129
135
  if (dictMode == ZSTD_dictMatchState) {
130
- U32 const dictMatchIndex = dictHashTable[h];
136
+ size_t const dictHash = ZSTD_hashPtr(ip, dictHLog, mls);
137
+ U32 const dictMatchIndex = dictHashTable[dictHash];
131
138
  const BYTE* dictMatch = dictBase + dictMatchIndex;
132
139
  if (dictMatchIndex <= dictStartIndex ||
133
140
  MEM_read32(dictMatch) != MEM_read32(ip)) {
@@ -151,6 +158,11 @@ size_t ZSTD_compressBlock_fast_generic(
151
158
  ip += ((ip-anchor) >> kSearchStrength) + stepSize;
152
159
  continue;
153
160
  }
161
+ } else if (MEM_read32(match) != MEM_read32(ip)) {
162
+ /* it's not a match, and we're not going to check the dictionary */
163
+ assert(stepSize >= 1);
164
+ ip += ((ip-anchor) >> kSearchStrength) + stepSize;
165
+ continue;
154
166
  } else {
155
167
  /* found a regular match */
156
168
  U32 const offset = (U32)(ip-match);
@@ -168,6 +180,7 @@ size_t ZSTD_compressBlock_fast_generic(
168
180
 
169
181
  if (ip <= ilimit) {
170
182
  /* Fill Table */
183
+ assert(base+current+2 > istart); /* check base overflow */
171
184
  hashTable[ZSTD_hashPtr(base+current+2, hlog, mls)] = current+2; /* here because current+2 could be > iend-8 */
172
185
  hashTable[ZSTD_hashPtr(ip-2, hlog, mls)] = (U32)(ip-2-base);
173
186
 
@@ -219,55 +232,56 @@ size_t ZSTD_compressBlock_fast_generic(
219
232
 
220
233
  size_t ZSTD_compressBlock_fast(
221
234
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
222
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
235
+ void const* src, size_t srcSize)
223
236
  {
224
- U32 const hlog = cParams->hashLog;
237
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
225
238
  U32 const mls = cParams->searchLength;
226
- U32 const stepSize = cParams->targetLength;
227
239
  assert(ms->dictMatchState == NULL);
228
240
  switch(mls)
229
241
  {
230
242
  default: /* includes case 3 */
231
243
  case 4 :
232
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 4, ZSTD_noDict);
244
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_noDict);
233
245
  case 5 :
234
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 5, ZSTD_noDict);
246
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_noDict);
235
247
  case 6 :
236
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 6, ZSTD_noDict);
248
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_noDict);
237
249
  case 7 :
238
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 7, ZSTD_noDict);
250
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_noDict);
239
251
  }
240
252
  }
241
253
 
242
254
  size_t ZSTD_compressBlock_fast_dictMatchState(
243
255
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
244
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
256
+ void const* src, size_t srcSize)
245
257
  {
246
- U32 const hlog = cParams->hashLog;
258
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
247
259
  U32 const mls = cParams->searchLength;
248
- U32 const stepSize = cParams->targetLength;
249
260
  assert(ms->dictMatchState != NULL);
250
261
  switch(mls)
251
262
  {
252
263
  default: /* includes case 3 */
253
264
  case 4 :
254
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 4, ZSTD_dictMatchState);
265
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_dictMatchState);
255
266
  case 5 :
256
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 5, ZSTD_dictMatchState);
267
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_dictMatchState);
257
268
  case 6 :
258
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 6, ZSTD_dictMatchState);
269
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_dictMatchState);
259
270
  case 7 :
260
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 7, ZSTD_dictMatchState);
271
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_dictMatchState);
261
272
  }
262
273
  }
263
274
 
264
275
 
265
276
  static size_t ZSTD_compressBlock_fast_extDict_generic(
266
277
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
267
- void const* src, size_t srcSize,
268
- U32 const hlog, U32 stepSize, U32 const mls)
278
+ void const* src, size_t srcSize, U32 const mls)
269
279
  {
270
- U32* hashTable = ms->hashTable;
280
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
281
+ U32* const hashTable = ms->hashTable;
282
+ U32 const hlog = cParams->hashLog;
283
+ /* support stepSize of 0 */
284
+ U32 const stepSize = cParams->targetLength + !(cParams->targetLength);
271
285
  const BYTE* const base = ms->window.base;
272
286
  const BYTE* const dictBase = ms->window.dictBase;
273
287
  const BYTE* const istart = (const BYTE*)src;
@@ -282,8 +296,6 @@ static size_t ZSTD_compressBlock_fast_extDict_generic(
282
296
  const BYTE* const ilimit = iend - 8;
283
297
  U32 offset_1=rep[0], offset_2=rep[1];
284
298
 
285
- stepSize += !stepSize; /* support stepSize == 0 */
286
-
287
299
  /* Search Loop */
288
300
  while (ip < ilimit) { /* < instead of <=, because (ip+1) */
289
301
  const size_t h = ZSTD_hashPtr(ip, hlog, mls);
@@ -360,21 +372,20 @@ static size_t ZSTD_compressBlock_fast_extDict_generic(
360
372
 
361
373
  size_t ZSTD_compressBlock_fast_extDict(
362
374
  ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
363
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
375
+ void const* src, size_t srcSize)
364
376
  {
365
- U32 const hlog = cParams->hashLog;
377
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
366
378
  U32 const mls = cParams->searchLength;
367
- U32 const stepSize = cParams->targetLength;
368
379
  switch(mls)
369
380
  {
370
381
  default: /* includes case 3 */
371
382
  case 4 :
372
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 4);
383
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 4);
373
384
  case 5 :
374
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 5);
385
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 5);
375
386
  case 6 :
376
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 6);
387
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 6);
377
388
  case 7 :
378
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 7);
389
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 7);
379
390
  }
380
391
  }