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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -2
- data/README.md +2 -1
- data/ext/zstdruby/libzstd/BUCK +1 -0
- data/ext/zstdruby/libzstd/Makefile +25 -13
- data/ext/zstdruby/libzstd/README.md +11 -10
- data/ext/zstdruby/libzstd/common/bitstream.h +8 -11
- data/ext/zstdruby/libzstd/common/compiler.h +30 -8
- data/ext/zstdruby/libzstd/common/cpu.h +1 -1
- data/ext/zstdruby/libzstd/common/mem.h +20 -2
- data/ext/zstdruby/libzstd/common/xxhash.c +1 -0
- data/ext/zstdruby/libzstd/common/zstd_internal.h +3 -2
- data/ext/zstdruby/libzstd/compress/fse_compress.c +55 -48
- data/ext/zstdruby/libzstd/compress/hist.h +1 -1
- data/ext/zstdruby/libzstd/compress/huf_compress.c +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +290 -147
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +5 -2
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +63 -51
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +3 -4
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +44 -33
- data/ext/zstdruby/libzstd/compress/zstd_fast.h +3 -4
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +125 -116
- data/ext/zstdruby/libzstd/compress/zstd_lazy.h +13 -15
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +9 -11
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +0 -1
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +42 -36
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +8 -9
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +96 -51
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +16 -6
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +3 -3
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +169 -101
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +111 -87
- data/ext/zstdruby/libzstd/dictBuilder/cover.h +83 -0
- data/ext/zstdruby/libzstd/dictBuilder/divsufsort.c +3 -3
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +728 -0
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +34 -31
- data/ext/zstdruby/libzstd/dictBuilder/zdict.h +60 -5
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +9 -3
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +6 -0
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +6 -0
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +1 -5
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +12 -9
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +10 -10
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +20 -18
- data/ext/zstdruby/libzstd/zstd.h +109 -50
- data/lib/zstd-ruby/version.rb +1 -1
- 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
|
-
|
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->
|
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
|
-
|
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
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
U32 const dictMatchIndexL = dictHashLong[
|
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
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
U32 const dictMatchIndexS = dictHashSmall[
|
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 (
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
U32 const dictMatchIndexL3 = dictHashLong[
|
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
|
-
|
310
|
+
void const* src, size_t srcSize)
|
300
311
|
{
|
301
|
-
const U32 mls = cParams
|
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,
|
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,
|
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,
|
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,
|
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
|
-
|
330
|
+
void const* src, size_t srcSize)
|
320
331
|
{
|
321
|
-
const U32 mls = cParams
|
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,
|
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,
|
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,
|
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,
|
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
|
-
|
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
|
-
|
484
|
+
void const* src, size_t srcSize)
|
473
485
|
{
|
474
|
-
U32 const mls = cParams
|
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,
|
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,
|
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,
|
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,
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
235
|
+
void const* src, size_t srcSize)
|
223
236
|
{
|
224
|
-
|
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,
|
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,
|
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,
|
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,
|
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
|
-
|
256
|
+
void const* src, size_t srcSize)
|
245
257
|
{
|
246
|
-
|
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,
|
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,
|
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,
|
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,
|
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
|
-
|
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
|
-
|
375
|
+
void const* src, size_t srcSize)
|
364
376
|
{
|
365
|
-
|
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,
|
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,
|
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,
|
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,
|
389
|
+
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 7);
|
379
390
|
}
|
380
391
|
}
|