extzstd 0.0.3.CONCEPT-x86-mingw32 → 0.1-x86-mingw32
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.
- checksums.yaml +4 -4
- data/HISTORY.ja +5 -0
- data/LICENSE +6 -6
- data/README.md +35 -22
- data/contrib/zstd/LICENSE +13 -9
- data/contrib/zstd/README.md +37 -44
- data/contrib/zstd/common/entropy_common.c +33 -39
- data/contrib/zstd/common/error_private.c +43 -0
- data/contrib/zstd/common/error_private.h +11 -60
- data/contrib/zstd/common/fse.h +11 -5
- data/contrib/zstd/common/fse_decompress.c +14 -16
- data/contrib/zstd/common/huf.h +1 -1
- data/contrib/zstd/common/mem.h +36 -43
- data/contrib/zstd/common/xxhash.c +31 -18
- data/contrib/zstd/common/xxhash.h +71 -35
- data/contrib/zstd/common/zbuff.h +29 -35
- data/contrib/zstd/common/zstd_common.c +24 -32
- data/contrib/zstd/common/zstd_errors.h +60 -0
- data/contrib/zstd/common/zstd_internal.h +109 -80
- data/contrib/zstd/compress/fse_compress.c +9 -6
- data/contrib/zstd/compress/huf_compress.c +30 -74
- data/contrib/zstd/compress/zbuff_compress.c +43 -51
- data/contrib/zstd/compress/zstd_compress.c +953 -763
- data/contrib/zstd/compress/zstd_opt.h +115 -261
- data/contrib/zstd/decompress/huf_decompress.c +29 -40
- data/contrib/zstd/decompress/zbuff_decompress.c +36 -78
- data/contrib/zstd/decompress/zstd_decompress.c +976 -496
- data/contrib/zstd/dictBuilder/divsufsort.h +5 -5
- data/contrib/zstd/dictBuilder/zdict.c +194 -229
- data/contrib/zstd/dictBuilder/zdict.h +66 -68
- data/contrib/zstd/legacy/zstd_legacy.h +168 -49
- data/contrib/zstd/legacy/zstd_v01.c +95 -178
- data/contrib/zstd/legacy/zstd_v01.h +12 -32
- data/contrib/zstd/legacy/zstd_v02.c +48 -274
- data/contrib/zstd/legacy/zstd_v02.h +12 -32
- data/contrib/zstd/legacy/zstd_v03.c +48 -274
- data/contrib/zstd/legacy/zstd_v03.h +12 -32
- data/contrib/zstd/legacy/zstd_v04.c +63 -320
- data/contrib/zstd/legacy/zstd_v04.h +13 -33
- data/contrib/zstd/legacy/zstd_v05.c +80 -345
- data/contrib/zstd/legacy/zstd_v05.h +9 -31
- data/contrib/zstd/legacy/zstd_v06.c +48 -458
- data/contrib/zstd/legacy/zstd_v06.h +41 -67
- data/contrib/zstd/legacy/zstd_v07.c +4544 -0
- data/contrib/zstd/legacy/zstd_v07.h +173 -0
- data/contrib/zstd/zstd.h +640 -0
- data/ext/extconf.rb +7 -3
- data/ext/extzstd.c +263 -106
- data/ext/extzstd.h +8 -6
- data/ext/extzstd_nogvls.h +0 -117
- data/ext/extzstd_stream.c +347 -0
- data/ext/zstd_common.c +8 -0
- data/ext/zstd_compress.c +6 -0
- data/ext/zstd_decompress.c +5 -0
- data/ext/zstd_dictbuilder.c +5 -0
- data/ext/zstd_legacy_v07.c +1 -0
- data/gemstub.rb +18 -16
- data/lib/2.1/extzstd.so +0 -0
- data/lib/2.2/extzstd.so +0 -0
- data/lib/2.3/extzstd.so +0 -0
- data/lib/extzstd/version.rb +1 -1
- data/lib/extzstd.rb +77 -43
- data/test/test_basic.rb +11 -6
- metadata +23 -11
- data/contrib/zstd/common/error_public.h +0 -77
- data/contrib/zstd/common/zstd.h +0 -475
- data/ext/extzstd_buffered.c +0 -265
- data/ext/zstd_amalgam.c +0 -18
- data/lib/2.0/extzstd.so +0 -0
@@ -1,35 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
* Redistributions of source code must retain the above copyright
|
12
|
-
notice, this list of conditions and the following disclaimer.
|
13
|
-
* Redistributions in binary form must reproduce the above
|
14
|
-
copyright notice, this list of conditions and the following disclaimer
|
15
|
-
in the documentation and/or other materials provided with the
|
16
|
-
distribution.
|
17
|
-
|
18
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
-
|
30
|
-
You can contact the author at :
|
31
|
-
- Zstd source repository : https://www.zstd.net
|
32
|
-
*/
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2016-present, Przemyslaw Skibinski, Yann Collet, Facebook, Inc.
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
6
|
+
* LICENSE file in the root directory of this source tree. An additional grant
|
7
|
+
* of patent rights can be found in the PATENTS file in the same directory.
|
8
|
+
*/
|
9
|
+
|
33
10
|
|
34
11
|
/* Note : this file is intended to be included within zstd_compress.c */
|
35
12
|
|
@@ -39,6 +16,7 @@
|
|
39
16
|
|
40
17
|
|
41
18
|
#define ZSTD_FREQ_DIV 5
|
19
|
+
#define ZSTD_MAX_PRICE (1<<30)
|
42
20
|
|
43
21
|
/*-*************************************
|
44
22
|
* Price functions for optimal parser
|
@@ -134,15 +112,7 @@ FORCE_INLINE U32 ZSTD_getLiteralPrice(seqStore_t* ssPtr, U32 litLength, const BY
|
|
134
112
|
}
|
135
113
|
|
136
114
|
/* literal Length */
|
137
|
-
{
|
138
|
-
8, 9, 10, 11, 12, 13, 14, 15,
|
139
|
-
16, 16, 17, 17, 18, 18, 19, 19,
|
140
|
-
20, 20, 20, 20, 21, 21, 21, 21,
|
141
|
-
22, 22, 22, 22, 22, 22, 22, 22,
|
142
|
-
23, 23, 23, 23, 23, 23, 23, 23,
|
143
|
-
24, 24, 24, 24, 24, 24, 24, 24,
|
144
|
-
24, 24, 24, 24, 24, 24, 24, 24 };
|
145
|
-
const BYTE LL_deltaCode = 19;
|
115
|
+
{ const BYTE LL_deltaCode = 19;
|
146
116
|
const BYTE llCode = (litLength>63) ? (BYTE)ZSTD_highbit32(litLength) + LL_deltaCode : LL_Code[litLength];
|
147
117
|
price += LL_bits[llCode] + ssPtr->log2litLengthSum - ZSTD_highbit32(ssPtr->litLengthFreq[llCode]+1);
|
148
118
|
}
|
@@ -151,22 +121,16 @@ FORCE_INLINE U32 ZSTD_getLiteralPrice(seqStore_t* ssPtr, U32 litLength, const BY
|
|
151
121
|
}
|
152
122
|
|
153
123
|
|
154
|
-
FORCE_INLINE U32 ZSTD_getPrice(seqStore_t* seqStorePtr, U32 litLength, const BYTE* literals, U32 offset, U32 matchLength)
|
124
|
+
FORCE_INLINE U32 ZSTD_getPrice(seqStore_t* seqStorePtr, U32 litLength, const BYTE* literals, U32 offset, U32 matchLength, const int ultra)
|
155
125
|
{
|
156
126
|
/* offset */
|
157
127
|
BYTE const offCode = (BYTE)ZSTD_highbit32(offset+1);
|
158
128
|
U32 price = offCode + seqStorePtr->log2offCodeSum - ZSTD_highbit32(seqStorePtr->offCodeFreq[offCode]+1);
|
159
129
|
|
130
|
+
if (!ultra && offCode >= 20) price += (offCode-19)*2;
|
131
|
+
|
160
132
|
/* match Length */
|
161
|
-
{
|
162
|
-
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
163
|
-
32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37,
|
164
|
-
38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39,
|
165
|
-
40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
|
166
|
-
41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
|
167
|
-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
168
|
-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 };
|
169
|
-
const BYTE ML_deltaCode = 36;
|
133
|
+
{ const BYTE ML_deltaCode = 36;
|
170
134
|
const BYTE mlCode = (matchLength>127) ? (BYTE)ZSTD_highbit32(matchLength) + ML_deltaCode : ML_Code[matchLength];
|
171
135
|
price += ML_bits[mlCode] + seqStorePtr->log2matchLengthSum - ZSTD_highbit32(seqStorePtr->matchLengthFreq[mlCode]+1);
|
172
136
|
}
|
@@ -185,15 +149,7 @@ MEM_STATIC void ZSTD_updatePrice(seqStore_t* seqStorePtr, U32 litLength, const B
|
|
185
149
|
seqStorePtr->litFreq[literals[u]]++;
|
186
150
|
|
187
151
|
/* literal Length */
|
188
|
-
{
|
189
|
-
8, 9, 10, 11, 12, 13, 14, 15,
|
190
|
-
16, 16, 17, 17, 18, 18, 19, 19,
|
191
|
-
20, 20, 20, 20, 21, 21, 21, 21,
|
192
|
-
22, 22, 22, 22, 22, 22, 22, 22,
|
193
|
-
23, 23, 23, 23, 23, 23, 23, 23,
|
194
|
-
24, 24, 24, 24, 24, 24, 24, 24,
|
195
|
-
24, 24, 24, 24, 24, 24, 24, 24 };
|
196
|
-
const BYTE LL_deltaCode = 19;
|
152
|
+
{ const BYTE LL_deltaCode = 19;
|
197
153
|
const BYTE llCode = (litLength>63) ? (BYTE)ZSTD_highbit32(litLength) + LL_deltaCode : LL_Code[litLength];
|
198
154
|
seqStorePtr->litLengthFreq[llCode]++;
|
199
155
|
seqStorePtr->litLengthSum++;
|
@@ -206,15 +162,7 @@ MEM_STATIC void ZSTD_updatePrice(seqStore_t* seqStorePtr, U32 litLength, const B
|
|
206
162
|
}
|
207
163
|
|
208
164
|
/* match Length */
|
209
|
-
{
|
210
|
-
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
211
|
-
32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37,
|
212
|
-
38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39,
|
213
|
-
40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
|
214
|
-
41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
|
215
|
-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
216
|
-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 };
|
217
|
-
const BYTE ML_deltaCode = 36;
|
165
|
+
{ const BYTE ML_deltaCode = 36;
|
218
166
|
const BYTE mlCode = (matchLength>127) ? (BYTE)ZSTD_highbit32(matchLength) + ML_deltaCode : ML_Code[matchLength];
|
219
167
|
seqStorePtr->matchLengthFreq[mlCode]++;
|
220
168
|
seqStorePtr->matchLengthSum++;
|
@@ -226,12 +174,11 @@ MEM_STATIC void ZSTD_updatePrice(seqStore_t* seqStorePtr, U32 litLength, const B
|
|
226
174
|
|
227
175
|
#define SET_PRICE(pos, mlen_, offset_, litlen_, price_) \
|
228
176
|
{ \
|
229
|
-
while (last_pos < pos) { opt[last_pos+1].price =
|
177
|
+
while (last_pos < pos) { opt[last_pos+1].price = ZSTD_MAX_PRICE; last_pos++; } \
|
230
178
|
opt[pos].mlen = mlen_; \
|
231
179
|
opt[pos].off = offset_; \
|
232
180
|
opt[pos].litlen = litlen_; \
|
233
181
|
opt[pos].price = price_; \
|
234
|
-
ZSTD_LOG_PARSER("%d: SET price[%d/%d]=%d litlen=%d len=%d off=%d\n", (int)(inr-base), (int)pos, (int)last_pos, opt[pos].price, opt[pos].litlen, opt[pos].mlen, opt[pos].off); \
|
235
182
|
}
|
236
183
|
|
237
184
|
|
@@ -308,7 +255,7 @@ static U32 ZSTD_insertBtAndGetAllMatches (
|
|
308
255
|
/* save best solution */
|
309
256
|
if (currentMl > bestLength) {
|
310
257
|
bestLength = currentMl;
|
311
|
-
matches[mnum].off =
|
258
|
+
matches[mnum].off = ZSTD_REP_MOVE_OPT + current - matchIndex3;
|
312
259
|
matches[mnum].len = (U32)currentMl;
|
313
260
|
mnum++;
|
314
261
|
if (currentMl > ZSTD_OPT_NUM) goto update;
|
@@ -327,25 +274,11 @@ static U32 ZSTD_insertBtAndGetAllMatches (
|
|
327
274
|
if ((!extDict) || (matchIndex+matchLength >= dictLimit)) {
|
328
275
|
match = base + matchIndex;
|
329
276
|
if (match[matchLength] == ip[matchLength]) {
|
330
|
-
#if ZSTD_OPT_DEBUG >= 5
|
331
|
-
size_t ml;
|
332
|
-
if (matchIndex < dictLimit)
|
333
|
-
ml = ZSTD_count_2segments(ip, dictBase + matchIndex, iLimit, dictEnd, prefixStart);
|
334
|
-
else
|
335
|
-
ml = ZSTD_count(ip, match, ip+matchLength);
|
336
|
-
if (ml < matchLength)
|
337
|
-
printf("%d: ERROR_NOEXT: offset=%d matchLength=%d matchIndex=%d dictLimit=%d ml=%d\n", current, (int)(current - matchIndex), (int)matchLength, (int)matchIndex, (int)dictLimit, (int)ml), exit(0);
|
338
|
-
#endif
|
339
277
|
matchLength += ZSTD_count(ip+matchLength+1, match+matchLength+1, iLimit) +1;
|
340
278
|
}
|
341
279
|
} else {
|
342
280
|
match = dictBase + matchIndex;
|
343
|
-
#if ZSTD_OPT_DEBUG >= 5
|
344
|
-
if (memcmp(match, ip, matchLength) != 0)
|
345
|
-
printf("%d: ERROR_EXT: matchLength=%d ZSTD_count=%d\n", current, (int)matchLength, (int)ZSTD_count_2segments(ip+matchLength, match+matchLength, iLimit, dictEnd, prefixStart)), exit(0);
|
346
|
-
#endif
|
347
281
|
matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iLimit, dictEnd, prefixStart);
|
348
|
-
ZSTD_LOG_PARSER("%d: ZSTD_INSERTBTANDGETALLMATCHES=%d offset=%d dictBase=%p dictEnd=%p prefixStart=%p ip=%p match=%p\n", (int)current, (int)matchLength, (int)(current - matchIndex), dictBase, dictEnd, prefixStart, ip, match);
|
349
282
|
if (matchIndex+matchLength >= dictLimit)
|
350
283
|
match = base + matchIndex; /* to prepare for next usage of match[matchLength] */
|
351
284
|
}
|
@@ -353,7 +286,7 @@ static U32 ZSTD_insertBtAndGetAllMatches (
|
|
353
286
|
if (matchLength > bestLength) {
|
354
287
|
if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength;
|
355
288
|
bestLength = matchLength;
|
356
|
-
matches[mnum].off =
|
289
|
+
matches[mnum].off = ZSTD_REP_MOVE_OPT + current - matchIndex;
|
357
290
|
matches[mnum].len = (U32)matchLength;
|
358
291
|
mnum++;
|
359
292
|
if (matchLength > ZSTD_OPT_NUM) break;
|
@@ -445,7 +378,7 @@ static U32 ZSTD_BtGetAllMatches_selectMLS_extDict (
|
|
445
378
|
*********************************/
|
446
379
|
FORCE_INLINE
|
447
380
|
void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
448
|
-
const void* src, size_t srcSize)
|
381
|
+
const void* src, size_t srcSize, const int ultra)
|
449
382
|
{
|
450
383
|
seqStore_t* seqStorePtr = &(ctx->seqStore);
|
451
384
|
const BYTE* const istart = (const BYTE*)src;
|
@@ -464,15 +397,13 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
464
397
|
ZSTD_optimal_t* opt = seqStorePtr->priceTable;
|
465
398
|
ZSTD_match_t* matches = seqStorePtr->matchTable;
|
466
399
|
const BYTE* inr;
|
467
|
-
U32 offset, rep[
|
400
|
+
U32 offset, rep[ZSTD_REP_NUM];
|
468
401
|
|
469
402
|
/* init */
|
470
403
|
ctx->nextToUpdate3 = ctx->nextToUpdate;
|
471
404
|
ZSTD_rescaleFreqs(seqStorePtr);
|
472
405
|
ip += (ip==prefixStart);
|
473
|
-
{ U32 i; for (i=0; i<
|
474
|
-
|
475
|
-
ZSTD_LOG_BLOCK("%d: COMPBLOCK_OPT_GENERIC srcSz=%d maxSrch=%d mls=%d sufLen=%d\n", (int)(ip-base), (int)srcSize, maxSearches, mls, sufficient_len);
|
406
|
+
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) rep[i]=ctx->rep[i]; }
|
476
407
|
|
477
408
|
/* Match Loop */
|
478
409
|
while (ip < ilimit) {
|
@@ -483,19 +414,19 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
483
414
|
litlen = (U32)(ip - anchor);
|
484
415
|
|
485
416
|
/* check repCode */
|
486
|
-
{ U32 i;
|
487
|
-
for (i=
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
417
|
+
{ U32 i, last_i = ZSTD_REP_CHECK + (ip==anchor);
|
418
|
+
for (i=(ip == anchor); i<last_i; i++) {
|
419
|
+
const S32 repCur = ((i==ZSTD_REP_MOVE_OPT) && (ip==anchor)) ? (rep[0] - 1) : rep[i];
|
420
|
+
if ( (repCur > 0) && (repCur < (S32)(ip-prefixStart))
|
421
|
+
&& (MEM_readMINMATCH(ip, minMatch) == MEM_readMINMATCH(ip - repCur, minMatch))) {
|
422
|
+
mlen = (U32)ZSTD_count(ip+minMatch, ip+minMatch-repCur, iend) + minMatch;
|
492
423
|
if (mlen > sufficient_len || mlen >= ZSTD_OPT_NUM) {
|
493
424
|
best_mlen = mlen; best_off = i; cur = 0; last_pos = 1;
|
494
425
|
goto _storeSequence;
|
495
426
|
}
|
496
|
-
best_off =
|
427
|
+
best_off = i - (ip == anchor);
|
497
428
|
do {
|
498
|
-
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH);
|
429
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
|
499
430
|
if (mlen > last_pos || price < opt[mlen].price)
|
500
431
|
SET_PRICE(mlen, mlen, i, litlen, price); /* note : macro modifies last_pos */
|
501
432
|
mlen--;
|
@@ -504,7 +435,6 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
504
435
|
|
505
436
|
match_num = ZSTD_BtGetAllMatches_selectMLS(ctx, ip, iend, maxSearches, mls, matches, minMatch);
|
506
437
|
|
507
|
-
ZSTD_LOG_PARSER("%d: match_num=%d last_pos=%d\n", (int)(ip-base), match_num, last_pos);
|
508
438
|
if (!last_pos && !match_num) { ip++; continue; }
|
509
439
|
|
510
440
|
if (match_num && (matches[match_num-1].len > sufficient_len || matches[match_num-1].len >= ZSTD_OPT_NUM)) {
|
@@ -520,9 +450,8 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
520
450
|
for (u = 0; u < match_num; u++) {
|
521
451
|
mlen = (u>0) ? matches[u-1].len+1 : best_mlen;
|
522
452
|
best_mlen = matches[u].len;
|
523
|
-
ZSTD_LOG_PARSER("%d: start Found mlen=%d off=%d best_mlen=%d last_pos=%d\n", (int)(ip-base), matches[u].len, matches[u].off, (int)best_mlen, (int)last_pos);
|
524
453
|
while (mlen <= best_mlen) {
|
525
|
-
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off, mlen - MINMATCH);
|
454
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off-1, mlen - MINMATCH, ultra);
|
526
455
|
if (mlen > last_pos || price < opt[mlen].price)
|
527
456
|
SET_PRICE(mlen, mlen, matches[u].off, litlen, price); /* note : macro modifies last_pos */
|
528
457
|
mlen++;
|
@@ -531,7 +460,7 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
531
460
|
if (last_pos < minMatch) { ip++; continue; }
|
532
461
|
|
533
462
|
/* initialize opt[0] */
|
534
|
-
{ U32 i ; for (i=0; i<
|
463
|
+
{ U32 i ; for (i=0; i<ZSTD_REP_NUM; i++) opt[0].rep[i] = rep[i]; }
|
535
464
|
opt[0].mlen = 1;
|
536
465
|
opt[0].litlen = litlen;
|
537
466
|
|
@@ -550,7 +479,7 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
550
479
|
price = opt[cur - 1].price + ZSTD_getLiteralPrice(seqStorePtr, litlen, inr-1);
|
551
480
|
}
|
552
481
|
|
553
|
-
if (cur > last_pos || price <= opt[cur].price)
|
482
|
+
if (cur > last_pos || price <= opt[cur].price)
|
554
483
|
SET_PRICE(cur, 1, 0, litlen, price);
|
555
484
|
|
556
485
|
if (cur == last_pos) break;
|
@@ -559,50 +488,44 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
559
488
|
continue;
|
560
489
|
|
561
490
|
mlen = opt[cur].mlen;
|
562
|
-
if (opt[cur].off
|
491
|
+
if (opt[cur].off > ZSTD_REP_MOVE_OPT) {
|
563
492
|
opt[cur].rep[2] = opt[cur-mlen].rep[1];
|
564
493
|
opt[cur].rep[1] = opt[cur-mlen].rep[0];
|
565
|
-
opt[cur].rep[0] = opt[cur].off -
|
566
|
-
ZSTD_LOG_ENCODE("%d: COPYREP_OFF cur=%d mlen=%d rep[0]=%d rep[1]=%d\n", (int)(inr-base), cur, mlen, opt[cur].rep[0], opt[cur].rep[1]);
|
494
|
+
opt[cur].rep[0] = opt[cur].off - ZSTD_REP_MOVE_OPT;
|
567
495
|
} else {
|
568
496
|
opt[cur].rep[2] = (opt[cur].off > 1) ? opt[cur-mlen].rep[1] : opt[cur-mlen].rep[2];
|
569
497
|
opt[cur].rep[1] = (opt[cur].off > 0) ? opt[cur-mlen].rep[0] : opt[cur-mlen].rep[1];
|
570
|
-
opt[cur].rep[0] = opt[cur-mlen].rep[opt[cur].off];
|
571
|
-
ZSTD_LOG_ENCODE("%d: COPYREP_NOR cur=%d mlen=%d rep[0]=%d rep[1]=%d\n", (int)(inr-base), cur, mlen, opt[cur].rep[0], opt[cur].rep[1]);
|
498
|
+
opt[cur].rep[0] = ((opt[cur].off==ZSTD_REP_MOVE_OPT) && (mlen != 1)) ? (opt[cur-mlen].rep[0] - 1) : (opt[cur-mlen].rep[opt[cur].off]);
|
572
499
|
}
|
573
500
|
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
mlen = (U32)ZSTD_count(inr+minMatch, inr+minMatch - opt[cur].rep[i], iend) + minMatch;
|
582
|
-
ZSTD_LOG_PARSER("%d: Found REP %d/%d mlen=%d off=%d rep=%d opt[%d].off=%d\n", (int)(inr-base), i, ZSTD_REP_NUM, mlen, i, opt[cur].rep[i], cur, opt[cur].off);
|
501
|
+
best_mlen = minMatch;
|
502
|
+
{ U32 i, last_i = ZSTD_REP_CHECK + (mlen != 1);
|
503
|
+
for (i=(opt[cur].mlen != 1); i<last_i; i++) { /* check rep */
|
504
|
+
const S32 repCur = ((i==ZSTD_REP_MOVE_OPT) && (opt[cur].mlen != 1)) ? (opt[cur].rep[0] - 1) : opt[cur].rep[i];
|
505
|
+
if ( (repCur > 0) && (repCur < (S32)(inr-prefixStart))
|
506
|
+
&& (MEM_readMINMATCH(inr, minMatch) == MEM_readMINMATCH(inr - repCur, minMatch))) {
|
507
|
+
mlen = (U32)ZSTD_count(inr+minMatch, inr+minMatch - repCur, iend) + minMatch;
|
583
508
|
|
584
509
|
if (mlen > sufficient_len || cur + mlen >= ZSTD_OPT_NUM) {
|
585
|
-
ZSTD_LOG_PARSER("%d: REP sufficient_len=%d best_mlen=%d best_off=%d last_pos=%d\n", (int)(inr-base), sufficient_len, best_mlen, best_off, last_pos);
|
586
510
|
best_mlen = mlen; best_off = i; last_pos = cur + 1;
|
587
511
|
goto _storeSequence;
|
588
512
|
}
|
589
513
|
|
590
|
-
best_off =
|
591
|
-
if (
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
514
|
+
best_off = i - (opt[cur].mlen != 1);
|
515
|
+
if (mlen > best_mlen) best_mlen = mlen;
|
516
|
+
|
517
|
+
do {
|
518
|
+
if (opt[cur].mlen == 1) {
|
519
|
+
litlen = opt[cur].litlen;
|
520
|
+
if (cur > litlen) {
|
521
|
+
price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, inr-litlen, best_off, mlen - MINMATCH, ultra);
|
522
|
+
} else
|
523
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
|
524
|
+
} else {
|
525
|
+
litlen = 0;
|
526
|
+
price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, best_off, mlen - MINMATCH, ultra);
|
527
|
+
}
|
604
528
|
|
605
|
-
do {
|
606
529
|
if (cur + mlen > last_pos || price <= opt[cur + mlen].price)
|
607
530
|
SET_PRICE(cur + mlen, mlen, i, litlen, price);
|
608
531
|
mlen--;
|
@@ -610,7 +533,6 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
610
533
|
} } }
|
611
534
|
|
612
535
|
match_num = ZSTD_BtGetAllMatches_selectMLS(ctx, inr, iend, maxSearches, mls, matches, best_mlen);
|
613
|
-
ZSTD_LOG_PARSER("%d: ZSTD_GetAllMatches match_num=%d\n", (int)(inr-base), match_num);
|
614
536
|
|
615
537
|
if (match_num > 0 && (matches[match_num-1].len > sufficient_len || cur + matches[match_num-1].len >= ZSTD_OPT_NUM)) {
|
616
538
|
best_mlen = matches[match_num-1].len;
|
@@ -624,25 +546,23 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
624
546
|
mlen = (u>0) ? matches[u-1].len+1 : best_mlen;
|
625
547
|
best_mlen = matches[u].len;
|
626
548
|
|
627
|
-
// ZSTD_LOG_PARSER("%d: Found1 cur=%d mlen=%d off=%d best_mlen=%d last_pos=%d\n", (int)(inr-base), cur, matches[u].len, matches[u].off, best_mlen, last_pos);
|
628
549
|
while (mlen <= best_mlen) {
|
629
550
|
if (opt[cur].mlen == 1) {
|
630
551
|
litlen = opt[cur].litlen;
|
631
552
|
if (cur > litlen)
|
632
|
-
price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, ip+cur-litlen, matches[u].off, mlen - MINMATCH);
|
553
|
+
price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, ip+cur-litlen, matches[u].off-1, mlen - MINMATCH, ultra);
|
633
554
|
else
|
634
|
-
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off, mlen - MINMATCH);
|
555
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off-1, mlen - MINMATCH, ultra);
|
635
556
|
} else {
|
636
557
|
litlen = 0;
|
637
|
-
price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, matches[u].off, mlen - MINMATCH);
|
558
|
+
price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, matches[u].off-1, mlen - MINMATCH, ultra);
|
638
559
|
}
|
639
560
|
|
640
|
-
// ZSTD_LOG_PARSER("%d: Found2 mlen=%d best_mlen=%d off=%d price=%d litlen=%d\n", (int)(inr-base), mlen, best_mlen, matches[u].off, price, litlen);
|
641
561
|
if (cur + mlen > last_pos || (price < opt[cur + mlen].price))
|
642
562
|
SET_PRICE(cur + mlen, mlen, matches[u].off, litlen, price);
|
643
563
|
|
644
564
|
mlen++;
|
645
|
-
} } }
|
565
|
+
} } }
|
646
566
|
|
647
567
|
best_mlen = opt[last_pos].mlen;
|
648
568
|
best_off = opt[last_pos].off;
|
@@ -650,10 +570,6 @@ void ZSTD_compressBlock_opt_generic(ZSTD_CCtx* ctx,
|
|
650
570
|
|
651
571
|
/* store sequence */
|
652
572
|
_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
|
653
|
-
for (u = 1; u <= last_pos; u++)
|
654
|
-
ZSTD_LOG_PARSER("%d: price[%d/%d]=%d off=%d mlen=%d litlen=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base+u), u, last_pos, opt[u].price, opt[u].off, opt[u].mlen, opt[u].litlen, opt[u].rep[0], opt[u].rep[1]);
|
655
|
-
ZSTD_LOG_PARSER("%d: cur=%d/%d best_mlen=%d best_off=%d rep[0]=%d\n", (int)(ip-base+cur), (int)cur, (int)last_pos, (int)best_mlen, (int)best_off, opt[cur].rep[0]);
|
656
|
-
|
657
573
|
opt[0].mlen = 1;
|
658
574
|
|
659
575
|
while (1) {
|
@@ -668,49 +584,31 @@ _storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
|
|
668
584
|
}
|
669
585
|
|
670
586
|
for (u = 0; u <= last_pos;) {
|
671
|
-
ZSTD_LOG_PARSER("%d: price2[%d/%d]=%d off=%d mlen=%d litlen=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base+u), u, last_pos, opt[u].price, opt[u].off, opt[u].mlen, opt[u].litlen, opt[u].rep[0], opt[u].rep[1]);
|
672
587
|
u += opt[u].mlen;
|
673
588
|
}
|
674
589
|
|
675
590
|
for (cur=0; cur < last_pos; ) {
|
676
|
-
ZSTD_LOG_PARSER("%d: price3[%d/%d]=%d off=%d mlen=%d litlen=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base+cur), cur, last_pos, opt[cur].price, opt[cur].off, opt[cur].mlen, opt[cur].litlen, opt[cur].rep[0], opt[cur].rep[1]);
|
677
591
|
mlen = opt[cur].mlen;
|
678
592
|
if (mlen == 1) { ip++; cur++; continue; }
|
679
593
|
offset = opt[cur].off;
|
680
594
|
cur += mlen;
|
681
595
|
litLength = (U32)(ip - anchor);
|
682
|
-
// ZSTD_LOG_ENCODE("%d/%d: ENCODE literals=%d mlen=%d off=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)mlen, (int)(offset), (int)rep[0], (int)rep[1]);
|
683
596
|
|
684
|
-
if (offset
|
597
|
+
if (offset > ZSTD_REP_MOVE_OPT) {
|
685
598
|
rep[2] = rep[1];
|
686
599
|
rep[1] = rep[0];
|
687
|
-
rep[0] = offset -
|
600
|
+
rep[0] = offset - ZSTD_REP_MOVE_OPT;
|
601
|
+
offset--;
|
688
602
|
} else {
|
689
603
|
if (offset != 0) {
|
690
|
-
best_off = rep[offset];
|
604
|
+
best_off = ((offset==ZSTD_REP_MOVE_OPT) && (litLength==0)) ? (rep[0] - 1) : (rep[offset]);
|
691
605
|
if (offset != 1) rep[2] = rep[1];
|
692
606
|
rep[1] = rep[0];
|
693
607
|
rep[0] = best_off;
|
694
608
|
}
|
695
|
-
if (litLength
|
609
|
+
if (litLength==0) offset--;
|
696
610
|
}
|
697
611
|
|
698
|
-
ZSTD_LOG_ENCODE("%d/%d: ENCODE literals=%d mlen=%d off=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)mlen, (int)(offset), (int)rep[0], (int)rep[1]);
|
699
|
-
|
700
|
-
#if ZSTD_OPT_DEBUG >= 5
|
701
|
-
U32 ml2;
|
702
|
-
if (offset >= ZSTD_REP_NUM)
|
703
|
-
ml2 = (U32)ZSTD_count(ip, ip-(offset-ZSTD_REP_MOVE), iend);
|
704
|
-
else
|
705
|
-
ml2 = (U32)ZSTD_count(ip, ip-rep[0], iend);
|
706
|
-
if ((offset >= 8) && (ml2 < mlen || ml2 < minMatch)) {
|
707
|
-
printf("%d: ERROR_NoExt iend=%d mlen=%d offset=%d ml2=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset, (int)ml2); exit(0); }
|
708
|
-
if (ip < anchor) {
|
709
|
-
printf("%d: ERROR_NoExt ip < anchor iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset); exit(0); }
|
710
|
-
if (ip + mlen > iend) {
|
711
|
-
printf("%d: ERROR_NoExt ip + mlen >= iend iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset); exit(0); }
|
712
|
-
#endif
|
713
|
-
|
714
612
|
ZSTD_updatePrice(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH);
|
715
613
|
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH);
|
716
614
|
anchor = ip = ip + mlen;
|
@@ -721,7 +619,6 @@ _storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
|
|
721
619
|
|
722
620
|
/* Last Literals */
|
723
621
|
{ size_t const lastLLSize = iend - anchor;
|
724
|
-
ZSTD_LOG_ENCODE("%d: lastLLSize literals=%u\n", (int)(ip-base), (U32)lastLLSize);
|
725
622
|
memcpy(seqStorePtr->lit, anchor, lastLLSize);
|
726
623
|
seqStorePtr->lit += lastLLSize;
|
727
624
|
}
|
@@ -730,7 +627,7 @@ _storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
|
|
730
627
|
|
731
628
|
FORCE_INLINE
|
732
629
|
void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
733
|
-
const void* src, size_t srcSize)
|
630
|
+
const void* src, size_t srcSize, const int ultra)
|
734
631
|
{
|
735
632
|
seqStore_t* seqStorePtr = &(ctx->seqStore);
|
736
633
|
const BYTE* const istart = (const BYTE*)src;
|
@@ -755,15 +652,13 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
755
652
|
const BYTE* inr;
|
756
653
|
|
757
654
|
/* init */
|
758
|
-
U32 offset, rep[
|
759
|
-
{ U32 i; for (i=0; i<
|
655
|
+
U32 offset, rep[ZSTD_REP_NUM];
|
656
|
+
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) rep[i]=ctx->rep[i]; }
|
760
657
|
|
761
658
|
ctx->nextToUpdate3 = ctx->nextToUpdate;
|
762
659
|
ZSTD_rescaleFreqs(seqStorePtr);
|
763
660
|
ip += (ip==prefixStart);
|
764
661
|
|
765
|
-
ZSTD_LOG_BLOCK("%d: COMPBLOCK_OPT_EXTDICT srcSz=%d maxSrch=%d mls=%d sufLen=%d\n", (int)(ip-base), (int)srcSize, maxSearches, mls, sufficient_len);
|
766
|
-
|
767
662
|
/* Match Loop */
|
768
663
|
while (ip < ilimit) {
|
769
664
|
U32 cur, match_num, last_pos, litlen, price;
|
@@ -771,31 +666,31 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
771
666
|
U32 current = (U32)(ip-base);
|
772
667
|
memset(opt, 0, sizeof(ZSTD_optimal_t));
|
773
668
|
last_pos = 0;
|
774
|
-
inr = ip;
|
775
669
|
opt[0].litlen = (U32)(ip - anchor);
|
776
670
|
|
777
671
|
/* check repCode */
|
778
|
-
{ U32 i;
|
779
|
-
for (i=
|
780
|
-
const
|
672
|
+
{ U32 i, last_i = ZSTD_REP_CHECK + (ip==anchor);
|
673
|
+
for (i = (ip==anchor); i<last_i; i++) {
|
674
|
+
const S32 repCur = ((i==ZSTD_REP_MOVE_OPT) && (ip==anchor)) ? (rep[0] - 1) : rep[i];
|
675
|
+
const U32 repIndex = (U32)(current - repCur);
|
781
676
|
const BYTE* const repBase = repIndex < dictLimit ? dictBase : base;
|
782
677
|
const BYTE* const repMatch = repBase + repIndex;
|
783
|
-
if ( (
|
678
|
+
if ( (repCur > 0 && repCur <= (S32)current)
|
679
|
+
&& (((U32)((dictLimit-1) - repIndex) >= 3) & (repIndex>lowestIndex)) /* intentional overflow */
|
784
680
|
&& (MEM_readMINMATCH(ip, minMatch) == MEM_readMINMATCH(repMatch, minMatch)) ) {
|
785
681
|
/* repcode detected we should take it */
|
786
682
|
const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend;
|
787
683
|
mlen = (U32)ZSTD_count_2segments(ip+minMatch, repMatch+minMatch, iend, repEnd, prefixStart) + minMatch;
|
788
684
|
|
789
|
-
ZSTD_LOG_PARSER("%d: start try REP rep[%d]=%d mlen=%d\n", (int)(ip-base), i, (int)rep[i], (int)mlen);
|
790
685
|
if (mlen > sufficient_len || mlen >= ZSTD_OPT_NUM) {
|
791
686
|
best_mlen = mlen; best_off = i; cur = 0; last_pos = 1;
|
792
687
|
goto _storeSequence;
|
793
688
|
}
|
794
689
|
|
795
|
-
best_off =
|
690
|
+
best_off = i - (ip==anchor);
|
796
691
|
litlen = opt[0].litlen;
|
797
692
|
do {
|
798
|
-
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH);
|
693
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
|
799
694
|
if (mlen > last_pos || price < opt[mlen].price)
|
800
695
|
SET_PRICE(mlen, mlen, i, litlen, price); /* note : macro modifies last_pos */
|
801
696
|
mlen--;
|
@@ -804,10 +699,9 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
804
699
|
|
805
700
|
match_num = ZSTD_BtGetAllMatches_selectMLS_extDict(ctx, ip, iend, maxSearches, mls, matches, minMatch); /* first search (depth 0) */
|
806
701
|
|
807
|
-
ZSTD_LOG_PARSER("%d: match_num=%d last_pos=%d\n", (int)(ip-base), match_num, last_pos);
|
808
702
|
if (!last_pos && !match_num) { ip++; continue; }
|
809
703
|
|
810
|
-
{ U32 i; for (i=0; i<
|
704
|
+
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) opt[0].rep[i] = rep[i]; }
|
811
705
|
opt[0].mlen = 1;
|
812
706
|
|
813
707
|
if (match_num && (matches[match_num-1].len > sufficient_len || matches[match_num-1].len >= ZSTD_OPT_NUM)) {
|
@@ -820,21 +714,19 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
820
714
|
|
821
715
|
best_mlen = (last_pos) ? last_pos : minMatch;
|
822
716
|
|
823
|
-
|
717
|
+
/* set prices using matches at position = 0 */
|
824
718
|
for (u = 0; u < match_num; u++) {
|
825
719
|
mlen = (u>0) ? matches[u-1].len+1 : best_mlen;
|
826
720
|
best_mlen = matches[u].len;
|
827
|
-
ZSTD_LOG_PARSER("%d: start Found mlen=%d off=%d best_mlen=%d last_pos=%d\n", (int)(ip-base), matches[u].len, matches[u].off, (int)best_mlen, (int)last_pos);
|
828
721
|
litlen = opt[0].litlen;
|
829
722
|
while (mlen <= best_mlen) {
|
830
|
-
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off, mlen - MINMATCH);
|
723
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off-1, mlen - MINMATCH, ultra);
|
831
724
|
if (mlen > last_pos || price < opt[mlen].price)
|
832
725
|
SET_PRICE(mlen, mlen, matches[u].off, litlen, price);
|
833
726
|
mlen++;
|
834
727
|
} }
|
835
728
|
|
836
729
|
if (last_pos < minMatch) {
|
837
|
-
// ip += ((ip-anchor) >> g_searchStrength) + 1; /* jump faster over incompressible sections */
|
838
730
|
ip++; continue;
|
839
731
|
}
|
840
732
|
|
@@ -853,7 +745,7 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
853
745
|
price = opt[cur - 1].price + ZSTD_getLiteralPrice(seqStorePtr, litlen, inr-1);
|
854
746
|
}
|
855
747
|
|
856
|
-
if (cur > last_pos || price <= opt[cur].price)
|
748
|
+
if (cur > last_pos || price <= opt[cur].price)
|
857
749
|
SET_PRICE(cur, 1, 0, litlen, price);
|
858
750
|
|
859
751
|
if (cur == last_pos) break;
|
@@ -862,55 +754,50 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
862
754
|
continue;
|
863
755
|
|
864
756
|
mlen = opt[cur].mlen;
|
865
|
-
if (opt[cur].off
|
757
|
+
if (opt[cur].off > ZSTD_REP_MOVE_OPT) {
|
866
758
|
opt[cur].rep[2] = opt[cur-mlen].rep[1];
|
867
759
|
opt[cur].rep[1] = opt[cur-mlen].rep[0];
|
868
|
-
opt[cur].rep[0] = opt[cur].off -
|
869
|
-
ZSTD_LOG_ENCODE("%d: COPYREP_OFF cur=%d mlen=%d rep[0]=%d rep[1]=%d\n", (int)(inr-base), cur, mlen, opt[cur].rep[0], opt[cur].rep[1]);
|
760
|
+
opt[cur].rep[0] = opt[cur].off - ZSTD_REP_MOVE_OPT;
|
870
761
|
} else {
|
871
762
|
opt[cur].rep[2] = (opt[cur].off > 1) ? opt[cur-mlen].rep[1] : opt[cur-mlen].rep[2];
|
872
763
|
opt[cur].rep[1] = (opt[cur].off > 0) ? opt[cur-mlen].rep[0] : opt[cur-mlen].rep[1];
|
873
|
-
opt[cur].rep[0] = opt[cur-mlen].rep[opt[cur].off];
|
874
|
-
ZSTD_LOG_ENCODE("%d: COPYREP_NOR cur=%d mlen=%d rep[0]=%d rep[1]=%d\n", (int)(inr-base), cur, mlen, opt[cur].rep[0], opt[cur].rep[1]);
|
764
|
+
opt[cur].rep[0] = ((opt[cur].off==ZSTD_REP_MOVE_OPT) && (mlen != 1)) ? (opt[cur-mlen].rep[0] - 1) : (opt[cur-mlen].rep[opt[cur].off]);
|
875
765
|
}
|
876
766
|
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
const U32 repIndex = (U32)(current+cur - opt[cur].rep[i]);
|
767
|
+
best_mlen = minMatch;
|
768
|
+
{ U32 i, last_i = ZSTD_REP_CHECK + (mlen != 1);
|
769
|
+
for (i = (mlen != 1); i<last_i; i++) {
|
770
|
+
const S32 repCur = ((i==ZSTD_REP_MOVE_OPT) && (opt[cur].mlen != 1)) ? (opt[cur].rep[0] - 1) : opt[cur].rep[i];
|
771
|
+
const U32 repIndex = (U32)(current+cur - repCur);
|
883
772
|
const BYTE* const repBase = repIndex < dictLimit ? dictBase : base;
|
884
773
|
const BYTE* const repMatch = repBase + repIndex;
|
885
|
-
if ( (
|
774
|
+
if ( (repCur > 0 && repCur <= (S32)(current+cur))
|
775
|
+
&& (((U32)((dictLimit-1) - repIndex) >= 3) & (repIndex>lowestIndex)) /* intentional overflow */
|
886
776
|
&& (MEM_readMINMATCH(inr, minMatch) == MEM_readMINMATCH(repMatch, minMatch)) ) {
|
887
777
|
/* repcode detected */
|
888
778
|
const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend;
|
889
779
|
mlen = (U32)ZSTD_count_2segments(inr+minMatch, repMatch+minMatch, iend, repEnd, prefixStart) + minMatch;
|
890
|
-
ZSTD_LOG_PARSER("%d: Found REP %d/%d mlen=%d off=%d rep=%d opt[%d].off=%d\n", (int)(inr-base), i, ZSTD_REP_NUM, mlen, i, opt[cur].rep[i], cur, opt[cur].off);
|
891
780
|
|
892
781
|
if (mlen > sufficient_len || cur + mlen >= ZSTD_OPT_NUM) {
|
893
|
-
ZSTD_LOG_PARSER("%d: REP sufficient_len=%d best_mlen=%d best_off=%d last_pos=%d\n", (int)(inr-base), sufficient_len, best_mlen, best_off, last_pos);
|
894
782
|
best_mlen = mlen; best_off = i; last_pos = cur + 1;
|
895
783
|
goto _storeSequence;
|
896
784
|
}
|
897
785
|
|
898
|
-
best_off =
|
899
|
-
if (
|
900
|
-
litlen = opt[cur].litlen;
|
901
|
-
if (cur > litlen) {
|
902
|
-
price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, inr-litlen, best_off, mlen - MINMATCH);
|
903
|
-
} else
|
904
|
-
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH);
|
905
|
-
} else {
|
906
|
-
litlen = 0;
|
907
|
-
price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, best_off, mlen - MINMATCH);
|
908
|
-
}
|
909
|
-
|
910
|
-
best_mlen = mlen;
|
911
|
-
ZSTD_LOG_PARSER("%d: Found REP mlen=%d off=%d price=%d litlen=%d\n", (int)(inr-base), mlen, best_off, price, litlen);
|
786
|
+
best_off = i - (opt[cur].mlen != 1);
|
787
|
+
if (mlen > best_mlen) best_mlen = mlen;
|
912
788
|
|
913
789
|
do {
|
790
|
+
if (opt[cur].mlen == 1) {
|
791
|
+
litlen = opt[cur].litlen;
|
792
|
+
if (cur > litlen) {
|
793
|
+
price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, inr-litlen, best_off, mlen - MINMATCH, ultra);
|
794
|
+
} else
|
795
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, best_off, mlen - MINMATCH, ultra);
|
796
|
+
} else {
|
797
|
+
litlen = 0;
|
798
|
+
price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, best_off, mlen - MINMATCH, ultra);
|
799
|
+
}
|
800
|
+
|
914
801
|
if (cur + mlen > last_pos || price <= opt[cur + mlen].price)
|
915
802
|
SET_PRICE(cur + mlen, mlen, i, litlen, price);
|
916
803
|
mlen--;
|
@@ -918,7 +805,6 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
918
805
|
} } }
|
919
806
|
|
920
807
|
match_num = ZSTD_BtGetAllMatches_selectMLS_extDict(ctx, inr, iend, maxSearches, mls, matches, minMatch);
|
921
|
-
ZSTD_LOG_PARSER("%d: ZSTD_GetAllMatches match_num=%d\n", (int)(inr-base), match_num);
|
922
808
|
|
923
809
|
if (match_num > 0 && matches[match_num-1].len > sufficient_len) {
|
924
810
|
best_mlen = matches[match_num-1].len;
|
@@ -927,27 +813,23 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
927
813
|
goto _storeSequence;
|
928
814
|
}
|
929
815
|
|
930
|
-
best_mlen = (best_mlen > minMatch) ? best_mlen : minMatch;
|
931
|
-
|
932
816
|
/* set prices using matches at position = cur */
|
933
817
|
for (u = 0; u < match_num; u++) {
|
934
818
|
mlen = (u>0) ? matches[u-1].len+1 : best_mlen;
|
935
819
|
best_mlen = (cur + matches[u].len < ZSTD_OPT_NUM) ? matches[u].len : ZSTD_OPT_NUM - cur;
|
936
820
|
|
937
|
-
// ZSTD_LOG_PARSER("%d: Found1 cur=%d mlen=%d off=%d best_mlen=%d last_pos=%d\n", (int)(inr-base), cur, matches[u].len, matches[u].off, best_mlen, last_pos);
|
938
821
|
while (mlen <= best_mlen) {
|
939
822
|
if (opt[cur].mlen == 1) {
|
940
823
|
litlen = opt[cur].litlen;
|
941
824
|
if (cur > litlen)
|
942
|
-
price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, ip+cur-litlen, matches[u].off, mlen - MINMATCH);
|
825
|
+
price = opt[cur - litlen].price + ZSTD_getPrice(seqStorePtr, litlen, ip+cur-litlen, matches[u].off-1, mlen - MINMATCH, ultra);
|
943
826
|
else
|
944
|
-
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off, mlen - MINMATCH);
|
827
|
+
price = ZSTD_getPrice(seqStorePtr, litlen, anchor, matches[u].off-1, mlen - MINMATCH, ultra);
|
945
828
|
} else {
|
946
829
|
litlen = 0;
|
947
|
-
price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, matches[u].off, mlen - MINMATCH);
|
830
|
+
price = opt[cur].price + ZSTD_getPrice(seqStorePtr, 0, NULL, matches[u].off-1, mlen - MINMATCH, ultra);
|
948
831
|
}
|
949
832
|
|
950
|
-
// ZSTD_LOG_PARSER("%d: Found2 mlen=%d best_mlen=%d off=%d price=%d litlen=%d\n", (int)(inr-base), mlen, best_mlen, matches[u].off, price, litlen);
|
951
833
|
if (cur + mlen > last_pos || (price < opt[cur + mlen].price))
|
952
834
|
SET_PRICE(cur + mlen, mlen, matches[u].off, litlen, price);
|
953
835
|
|
@@ -960,10 +842,6 @@ void ZSTD_compressBlock_opt_extDict_generic(ZSTD_CCtx* ctx,
|
|
960
842
|
|
961
843
|
/* store sequence */
|
962
844
|
_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
|
963
|
-
for (u = 1; u <= last_pos; u++)
|
964
|
-
ZSTD_LOG_PARSER("%d: price[%u/%d]=%d off=%d mlen=%d litlen=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base+u), u, last_pos, opt[u].price, opt[u].off, opt[u].mlen, opt[u].litlen, opt[u].rep[0], opt[u].rep[1]);
|
965
|
-
ZSTD_LOG_PARSER("%d: cur=%d/%d best_mlen=%d best_off=%d rep[0]=%d\n", (int)(ip-base+cur), (int)cur, (int)last_pos, (int)best_mlen, (int)best_off, opt[cur].rep[0]);
|
966
|
-
|
967
845
|
opt[0].mlen = 1;
|
968
846
|
|
969
847
|
while (1) {
|
@@ -978,54 +856,31 @@ _storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
|
|
978
856
|
}
|
979
857
|
|
980
858
|
for (u = 0; u <= last_pos; ) {
|
981
|
-
ZSTD_LOG_PARSER("%d: price2[%d/%d]=%d off=%d mlen=%d litlen=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base+u), u, last_pos, opt[u].price, opt[u].off, opt[u].mlen, opt[u].litlen, opt[u].rep[0], opt[u].rep[1]);
|
982
859
|
u += opt[u].mlen;
|
983
860
|
}
|
984
861
|
|
985
862
|
for (cur=0; cur < last_pos; ) {
|
986
|
-
ZSTD_LOG_PARSER("%d: price3[%d/%d]=%d off=%d mlen=%d litlen=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base+cur), cur, last_pos, opt[cur].price, opt[cur].off, opt[cur].mlen, opt[cur].litlen, opt[cur].rep[0], opt[cur].rep[1]);
|
987
863
|
mlen = opt[cur].mlen;
|
988
864
|
if (mlen == 1) { ip++; cur++; continue; }
|
989
865
|
offset = opt[cur].off;
|
990
866
|
cur += mlen;
|
991
867
|
litLength = (U32)(ip - anchor);
|
992
|
-
// ZSTD_LOG_ENCODE("%d/%d: ENCODE1 literals=%d mlen=%d off=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)mlen, (int)(offset), (int)rep[0], (int)rep[1]);
|
993
868
|
|
994
|
-
if (offset
|
869
|
+
if (offset > ZSTD_REP_MOVE_OPT) {
|
995
870
|
rep[2] = rep[1];
|
996
871
|
rep[1] = rep[0];
|
997
|
-
rep[0] = offset -
|
872
|
+
rep[0] = offset - ZSTD_REP_MOVE_OPT;
|
873
|
+
offset--;
|
998
874
|
} else {
|
999
875
|
if (offset != 0) {
|
1000
|
-
best_off = rep[offset];
|
876
|
+
best_off = ((offset==ZSTD_REP_MOVE_OPT) && (litLength==0)) ? (rep[0] - 1) : (rep[offset]);
|
1001
877
|
if (offset != 1) rep[2] = rep[1];
|
1002
878
|
rep[1] = rep[0];
|
1003
879
|
rep[0] = best_off;
|
1004
|
-
}
|
1005
|
-
if (litLength == 0 && offset<=1) offset = 1-offset;
|
1006
|
-
}
|
1007
|
-
|
1008
|
-
ZSTD_LOG_ENCODE("%d/%d: ENCODE literals=%d mlen=%d off=%d rep[0]=%d rep[1]=%d\n", (int)(ip-base), (int)(iend-base), (int)(litLength), (int)mlen, (int)(offset), (int)rep[0], (int)rep[1]);
|
1009
|
-
|
1010
|
-
#if ZSTD_OPT_DEBUG >= 5
|
1011
|
-
U32 ml2;
|
1012
|
-
if (offset >= ZSTD_REP_NUM) {
|
1013
|
-
best_off = offset - ZSTD_REP_MOVE;
|
1014
|
-
if (best_off > (size_t)(ip - prefixStart)) {
|
1015
|
-
const BYTE* match = dictEnd - (best_off - (ip - prefixStart));
|
1016
|
-
ml2 = ZSTD_count_2segments(ip, match, iend, dictEnd, prefixStart);
|
1017
|
-
ZSTD_LOG_PARSER("%d: ZSTD_count_2segments=%d offset=%d dictBase=%p dictEnd=%p prefixStart=%p ip=%p match=%p\n", (int)current, (int)ml2, (int)best_off, dictBase, dictEnd, prefixStart, ip, match);
|
1018
880
|
}
|
1019
|
-
|
881
|
+
|
882
|
+
if (litLength==0) offset--;
|
1020
883
|
}
|
1021
|
-
else ml2 = (U32)ZSTD_count(ip, ip-rep[0], iend);
|
1022
|
-
if ((offset >= 8) && (ml2 < mlen || ml2 < minMatch)) {
|
1023
|
-
printf("%d: ERROR_Ext iend=%d mlen=%d offset=%d ml2=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset, (int)ml2); exit(0); }
|
1024
|
-
if (ip < anchor) {
|
1025
|
-
printf("%d: ERROR_Ext ip < anchor iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset); exit(0); }
|
1026
|
-
if (ip + mlen > iend) {
|
1027
|
-
printf("%d: ERROR_Ext ip + mlen >= iend iend=%d mlen=%d offset=%d\n", (int)(ip - base), (int)(iend - ip), (int)mlen, (int)offset); exit(0); }
|
1028
|
-
#endif
|
1029
884
|
|
1030
885
|
ZSTD_updatePrice(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH);
|
1031
886
|
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen-MINMATCH);
|
@@ -1033,11 +888,10 @@ _storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
|
|
1033
888
|
} } /* for (cur=0; cur < last_pos; ) */
|
1034
889
|
|
1035
890
|
/* Save reps for next block */
|
1036
|
-
|
891
|
+
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) ctx->savedRep[i] = rep[i]; }
|
1037
892
|
|
1038
893
|
/* Last Literals */
|
1039
894
|
{ size_t lastLLSize = iend - anchor;
|
1040
|
-
ZSTD_LOG_ENCODE("%d: lastLLSize literals=%u\n", (int)(ip-base), (U32)(lastLLSize));
|
1041
895
|
memcpy(seqStorePtr->lit, anchor, lastLLSize);
|
1042
896
|
seqStorePtr->lit += lastLLSize;
|
1043
897
|
}
|