zstd-ruby 1.4.0.0 → 1.4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/zstdruby/libzstd/Makefile +5 -0
- data/ext/zstdruby/libzstd/common/compiler.h +7 -0
- data/ext/zstdruby/libzstd/common/zstd_internal.h +58 -6
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +175 -117
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +74 -30
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +56 -36
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +35 -14
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +10 -5
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +45 -32
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +18 -7
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +1 -0
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +12 -9
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +20 -9
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +154 -43
- data/ext/zstdruby/libzstd/dictBuilder/cover.h +38 -3
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +46 -39
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +9 -9
- data/ext/zstdruby/libzstd/dictBuilder/zdict.h +5 -0
- data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +4 -0
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +95 -101
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +11 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +11 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +11 -8
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +88 -84
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +2 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +2 -4
- data/ext/zstdruby/libzstd/zstd.h +53 -21
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 615a50803fa84b7e9dfc4c52ec1cf6fe67269deeba96e6ce64703e0b7ca25876
|
4
|
+
data.tar.gz: 0c681f172ce1be8634fea10dd7f54aa9fbcca8cfaf27deab8713c16aa4e8b50c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38ac3457dd0054800082a5592784253fd1ef098d7e69343ee2011ba537be687dde37ba5c40e90bb64cc3d1189a5727a92c45cb2db50c32daca7baa742cbd028f
|
7
|
+
data.tar.gz: ced818685583e17de12cfb98d152f24b6a058526192a33be30fb57e577b21b2529690ab9a3e6be1f462861bd3903ee0ea6781a9d1178e5efb6b11ca1c7d4fb96
|
data/README.md
CHANGED
@@ -17,6 +17,7 @@ LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
|
|
17
17
|
LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
|
18
18
|
LIBVER := $(shell echo $(LIBVER_SCRIPT))
|
19
19
|
VERSION?= $(LIBVER)
|
20
|
+
CCVER := $(shell $(CC) --version)
|
20
21
|
|
21
22
|
CPPFLAGS+= -I. -I./common -DXXH_NAMESPACE=ZSTD_
|
22
23
|
ifeq ($(OS),Windows_NT) # MinGW assumed
|
@@ -45,6 +46,10 @@ ZDICT_FILES := $(sort $(wildcard dictBuilder/*.c))
|
|
45
46
|
ZDEPR_FILES := $(sort $(wildcard deprecated/*.c))
|
46
47
|
ZSTD_FILES := $(ZSTDCOMMON_FILES)
|
47
48
|
|
49
|
+
ifeq ($(findstring GCC,$(CCVER)),GCC)
|
50
|
+
decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
|
51
|
+
endif
|
52
|
+
|
48
53
|
ZSTD_LEGACY_SUPPORT ?= 5
|
49
54
|
ZSTD_LIB_COMPRESSION ?= 1
|
50
55
|
ZSTD_LIB_DECOMPRESSION ?= 1
|
@@ -127,6 +127,13 @@
|
|
127
127
|
} \
|
128
128
|
}
|
129
129
|
|
130
|
+
/* vectorization */
|
131
|
+
#if !defined(__clang__) && defined(__GNUC__)
|
132
|
+
# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
|
133
|
+
#else
|
134
|
+
# define DONT_VECTORIZE
|
135
|
+
#endif
|
136
|
+
|
130
137
|
/* disable warnings */
|
131
138
|
#ifdef _MSC_VER /* Visual Studio */
|
132
139
|
# include <intrin.h> /* For Visual 2005 */
|
@@ -34,7 +34,6 @@
|
|
34
34
|
#endif
|
35
35
|
#include "xxhash.h" /* XXH_reset, update, digest */
|
36
36
|
|
37
|
-
|
38
37
|
#if defined (__cplusplus)
|
39
38
|
extern "C" {
|
40
39
|
#endif
|
@@ -193,19 +192,72 @@ static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
|
|
193
192
|
* Shared functions to include for inlining
|
194
193
|
*********************************************/
|
195
194
|
static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
195
|
+
|
196
196
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
197
|
+
static void ZSTD_copy16(void* dst, const void* src) { memcpy(dst, src, 16); }
|
198
|
+
#define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; }
|
199
|
+
|
200
|
+
#define WILDCOPY_OVERLENGTH 8
|
201
|
+
#define VECLEN 16
|
202
|
+
|
203
|
+
typedef enum {
|
204
|
+
ZSTD_no_overlap,
|
205
|
+
ZSTD_overlap_src_before_dst,
|
206
|
+
/* ZSTD_overlap_dst_before_src, */
|
207
|
+
} ZSTD_overlap_e;
|
197
208
|
|
198
209
|
/*! ZSTD_wildcopy() :
|
199
210
|
* custom version of memcpy(), can overwrite up to WILDCOPY_OVERLENGTH bytes (if length==0) */
|
200
|
-
|
201
|
-
|
211
|
+
MEM_STATIC FORCE_INLINE_ATTR DONT_VECTORIZE
|
212
|
+
void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e ovtype)
|
202
213
|
{
|
214
|
+
ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src;
|
203
215
|
const BYTE* ip = (const BYTE*)src;
|
204
216
|
BYTE* op = (BYTE*)dst;
|
205
217
|
BYTE* const oend = op + length;
|
206
|
-
|
207
|
-
|
208
|
-
|
218
|
+
|
219
|
+
assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff < -8));
|
220
|
+
if (length < VECLEN || (ovtype == ZSTD_overlap_src_before_dst && diff < VECLEN)) {
|
221
|
+
do
|
222
|
+
COPY8(op, ip)
|
223
|
+
while (op < oend);
|
224
|
+
}
|
225
|
+
else {
|
226
|
+
if ((length & 8) == 0)
|
227
|
+
COPY8(op, ip);
|
228
|
+
do {
|
229
|
+
COPY16(op, ip);
|
230
|
+
}
|
231
|
+
while (op < oend);
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
/*! ZSTD_wildcopy_16min() :
|
236
|
+
* same semantics as ZSTD_wilcopy() except guaranteed to be able to copy 16 bytes at the start */
|
237
|
+
MEM_STATIC FORCE_INLINE_ATTR DONT_VECTORIZE
|
238
|
+
void ZSTD_wildcopy_16min(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e ovtype)
|
239
|
+
{
|
240
|
+
ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src;
|
241
|
+
const BYTE* ip = (const BYTE*)src;
|
242
|
+
BYTE* op = (BYTE*)dst;
|
243
|
+
BYTE* const oend = op + length;
|
244
|
+
|
245
|
+
assert(length >= 8);
|
246
|
+
assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff < -8));
|
247
|
+
|
248
|
+
if (ovtype == ZSTD_overlap_src_before_dst && diff < VECLEN) {
|
249
|
+
do
|
250
|
+
COPY8(op, ip)
|
251
|
+
while (op < oend);
|
252
|
+
}
|
253
|
+
else {
|
254
|
+
if ((length & 8) == 0)
|
255
|
+
COPY8(op, ip);
|
256
|
+
do {
|
257
|
+
COPY16(op, ip);
|
258
|
+
}
|
259
|
+
while (op < oend);
|
260
|
+
}
|
209
261
|
}
|
210
262
|
|
211
263
|
MEM_STATIC void ZSTD_wildcopy_e(void* dst, const void* src, void* dstEnd) /* should be faster for decoding, but strangely, not verified on all platform */
|
@@ -385,6 +385,11 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param)
|
|
385
385
|
bounds.upperBound = ZSTD_lcm_uncompressed;
|
386
386
|
return bounds;
|
387
387
|
|
388
|
+
case ZSTD_c_targetCBlockSize:
|
389
|
+
bounds.lowerBound = ZSTD_TARGETCBLOCKSIZE_MIN;
|
390
|
+
bounds.upperBound = ZSTD_TARGETCBLOCKSIZE_MAX;
|
391
|
+
return bounds;
|
392
|
+
|
388
393
|
default:
|
389
394
|
{ ZSTD_bounds const boundError = { ERROR(parameter_unsupported), 0, 0 };
|
390
395
|
return boundError;
|
@@ -452,6 +457,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param)
|
|
452
457
|
case ZSTD_c_ldmHashRateLog:
|
453
458
|
case ZSTD_c_forceAttachDict:
|
454
459
|
case ZSTD_c_literalCompressionMode:
|
460
|
+
case ZSTD_c_targetCBlockSize:
|
455
461
|
default:
|
456
462
|
return 0;
|
457
463
|
}
|
@@ -497,6 +503,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value)
|
|
497
503
|
case ZSTD_c_ldmHashLog:
|
498
504
|
case ZSTD_c_ldmMinMatch:
|
499
505
|
case ZSTD_c_ldmBucketSizeLog:
|
506
|
+
case ZSTD_c_targetCBlockSize:
|
500
507
|
break;
|
501
508
|
|
502
509
|
default: RETURN_ERROR(parameter_unsupported);
|
@@ -671,6 +678,12 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
|
|
671
678
|
CCtxParams->ldmParams.hashRateLog = value;
|
672
679
|
return CCtxParams->ldmParams.hashRateLog;
|
673
680
|
|
681
|
+
case ZSTD_c_targetCBlockSize :
|
682
|
+
if (value!=0) /* 0 ==> default */
|
683
|
+
BOUNDCHECK(ZSTD_c_targetCBlockSize, value);
|
684
|
+
CCtxParams->targetCBlockSize = value;
|
685
|
+
return CCtxParams->targetCBlockSize;
|
686
|
+
|
674
687
|
default: RETURN_ERROR(parameter_unsupported, "unknown parameter");
|
675
688
|
}
|
676
689
|
}
|
@@ -692,13 +705,13 @@ size_t ZSTD_CCtxParams_getParameter(
|
|
692
705
|
*value = CCtxParams->compressionLevel;
|
693
706
|
break;
|
694
707
|
case ZSTD_c_windowLog :
|
695
|
-
*value = CCtxParams->cParams.windowLog;
|
708
|
+
*value = (int)CCtxParams->cParams.windowLog;
|
696
709
|
break;
|
697
710
|
case ZSTD_c_hashLog :
|
698
|
-
*value = CCtxParams->cParams.hashLog;
|
711
|
+
*value = (int)CCtxParams->cParams.hashLog;
|
699
712
|
break;
|
700
713
|
case ZSTD_c_chainLog :
|
701
|
-
*value = CCtxParams->cParams.chainLog;
|
714
|
+
*value = (int)CCtxParams->cParams.chainLog;
|
702
715
|
break;
|
703
716
|
case ZSTD_c_searchLog :
|
704
717
|
*value = CCtxParams->cParams.searchLog;
|
@@ -773,6 +786,9 @@ size_t ZSTD_CCtxParams_getParameter(
|
|
773
786
|
case ZSTD_c_ldmHashRateLog :
|
774
787
|
*value = CCtxParams->ldmParams.hashRateLog;
|
775
788
|
break;
|
789
|
+
case ZSTD_c_targetCBlockSize :
|
790
|
+
*value = (int)CCtxParams->targetCBlockSize;
|
791
|
+
break;
|
776
792
|
default: RETURN_ERROR(parameter_unsupported, "unknown parameter");
|
777
793
|
}
|
778
794
|
return 0;
|
@@ -930,12 +946,12 @@ size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset)
|
|
930
946
|
@return : 0, or an error code if one value is beyond authorized range */
|
931
947
|
size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
|
932
948
|
{
|
933
|
-
BOUNDCHECK(ZSTD_c_windowLog, cParams.windowLog);
|
934
|
-
BOUNDCHECK(ZSTD_c_chainLog, cParams.chainLog);
|
935
|
-
BOUNDCHECK(ZSTD_c_hashLog, cParams.hashLog);
|
936
|
-
BOUNDCHECK(ZSTD_c_searchLog, cParams.searchLog);
|
937
|
-
BOUNDCHECK(ZSTD_c_minMatch, cParams.minMatch);
|
938
|
-
BOUNDCHECK(ZSTD_c_targetLength,cParams.targetLength);
|
949
|
+
BOUNDCHECK(ZSTD_c_windowLog, (int)cParams.windowLog);
|
950
|
+
BOUNDCHECK(ZSTD_c_chainLog, (int)cParams.chainLog);
|
951
|
+
BOUNDCHECK(ZSTD_c_hashLog, (int)cParams.hashLog);
|
952
|
+
BOUNDCHECK(ZSTD_c_searchLog, (int)cParams.searchLog);
|
953
|
+
BOUNDCHECK(ZSTD_c_minMatch, (int)cParams.minMatch);
|
954
|
+
BOUNDCHECK(ZSTD_c_targetLength,(int)cParams.targetLength);
|
939
955
|
BOUNDCHECK(ZSTD_c_strategy, cParams.strategy);
|
940
956
|
return 0;
|
941
957
|
}
|
@@ -951,7 +967,7 @@ ZSTD_clampCParams(ZSTD_compressionParameters cParams)
|
|
951
967
|
if ((int)val<bounds.lowerBound) val=(type)bounds.lowerBound; \
|
952
968
|
else if ((int)val>bounds.upperBound) val=(type)bounds.upperBound; \
|
953
969
|
}
|
954
|
-
# define CLAMP(cParam, val) CLAMP_TYPE(cParam, val,
|
970
|
+
# define CLAMP(cParam, val) CLAMP_TYPE(cParam, val, unsigned)
|
955
971
|
CLAMP(ZSTD_c_windowLog, cParams.windowLog);
|
956
972
|
CLAMP(ZSTD_c_chainLog, cParams.chainLog);
|
957
973
|
CLAMP(ZSTD_c_hashLog, cParams.hashLog);
|
@@ -1282,15 +1298,14 @@ static void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs)
|
|
1282
1298
|
}
|
1283
1299
|
|
1284
1300
|
/*! ZSTD_invalidateMatchState()
|
1285
|
-
*
|
1286
|
-
*
|
1301
|
+
* Invalidate all the matches in the match finder tables.
|
1302
|
+
* Requires nextSrc and base to be set (can be NULL).
|
1287
1303
|
*/
|
1288
1304
|
static void ZSTD_invalidateMatchState(ZSTD_matchState_t* ms)
|
1289
1305
|
{
|
1290
1306
|
ZSTD_window_clear(&ms->window);
|
1291
1307
|
|
1292
1308
|
ms->nextToUpdate = ms->window.dictLimit;
|
1293
|
-
ms->nextToUpdate3 = ms->window.dictLimit;
|
1294
1309
|
ms->loadedDictEnd = 0;
|
1295
1310
|
ms->opt.litLengthSum = 0; /* force reset of btopt stats */
|
1296
1311
|
ms->dictMatchState = NULL;
|
@@ -1327,15 +1342,17 @@ static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_CCtx_params params, U64 pl
|
|
1327
1342
|
|
1328
1343
|
typedef enum { ZSTDcrp_continue, ZSTDcrp_noMemset } ZSTD_compResetPolicy_e;
|
1329
1344
|
|
1345
|
+
typedef enum { ZSTD_resetTarget_CDict, ZSTD_resetTarget_CCtx } ZSTD_resetTarget_e;
|
1346
|
+
|
1330
1347
|
static void*
|
1331
1348
|
ZSTD_reset_matchState(ZSTD_matchState_t* ms,
|
1332
1349
|
void* ptr,
|
1333
1350
|
const ZSTD_compressionParameters* cParams,
|
1334
|
-
ZSTD_compResetPolicy_e const crp,
|
1351
|
+
ZSTD_compResetPolicy_e const crp, ZSTD_resetTarget_e const forWho)
|
1335
1352
|
{
|
1336
1353
|
size_t const chainSize = (cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cParams->chainLog);
|
1337
1354
|
size_t const hSize = ((size_t)1) << cParams->hashLog;
|
1338
|
-
U32 const hashLog3 = (
|
1355
|
+
U32 const hashLog3 = ((forWho == ZSTD_resetTarget_CCtx) && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
|
1339
1356
|
size_t const h3Size = ((size_t)1) << hashLog3;
|
1340
1357
|
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
1341
1358
|
|
@@ -1349,7 +1366,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms,
|
|
1349
1366
|
ZSTD_invalidateMatchState(ms);
|
1350
1367
|
|
1351
1368
|
/* opt parser space */
|
1352
|
-
if (
|
1369
|
+
if ((forWho == ZSTD_resetTarget_CCtx) && (cParams->strategy >= ZSTD_btopt)) {
|
1353
1370
|
DEBUGLOG(4, "reserving optimal parser space");
|
1354
1371
|
ms->opt.litFreq = (unsigned*)ptr;
|
1355
1372
|
ms->opt.litLengthFreq = ms->opt.litFreq + (1<<Litbits);
|
@@ -1377,6 +1394,19 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms,
|
|
1377
1394
|
return ptr;
|
1378
1395
|
}
|
1379
1396
|
|
1397
|
+
/* ZSTD_indexTooCloseToMax() :
|
1398
|
+
* minor optimization : prefer memset() rather than reduceIndex()
|
1399
|
+
* which is measurably slow in some circumstances (reported for Visual Studio).
|
1400
|
+
* Works when re-using a context for a lot of smallish inputs :
|
1401
|
+
* if all inputs are smaller than ZSTD_INDEXOVERFLOW_MARGIN,
|
1402
|
+
* memset() will be triggered before reduceIndex().
|
1403
|
+
*/
|
1404
|
+
#define ZSTD_INDEXOVERFLOW_MARGIN (16 MB)
|
1405
|
+
static int ZSTD_indexTooCloseToMax(ZSTD_window_t w)
|
1406
|
+
{
|
1407
|
+
return (size_t)(w.nextSrc - w.base) > (ZSTD_CURRENT_MAX - ZSTD_INDEXOVERFLOW_MARGIN);
|
1408
|
+
}
|
1409
|
+
|
1380
1410
|
#define ZSTD_WORKSPACETOOLARGE_FACTOR 3 /* define "workspace is too large" as this number of times larger than needed */
|
1381
1411
|
#define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128 /* when workspace is continuously too large
|
1382
1412
|
* during at least this number of times,
|
@@ -1388,7 +1418,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms,
|
|
1388
1418
|
note : `params` are assumed fully validated at this stage */
|
1389
1419
|
static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
1390
1420
|
ZSTD_CCtx_params params,
|
1391
|
-
U64 pledgedSrcSize,
|
1421
|
+
U64 const pledgedSrcSize,
|
1392
1422
|
ZSTD_compResetPolicy_e const crp,
|
1393
1423
|
ZSTD_buffered_policy_e const zbuff)
|
1394
1424
|
{
|
@@ -1400,13 +1430,21 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
1400
1430
|
if (ZSTD_equivalentParams(zc->appliedParams, params,
|
1401
1431
|
zc->inBuffSize,
|
1402
1432
|
zc->seqStore.maxNbSeq, zc->seqStore.maxNbLit,
|
1403
|
-
zbuff, pledgedSrcSize)) {
|
1404
|
-
DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> continue mode
|
1405
|
-
zc->appliedParams.cParams.windowLog, zc->blockSize);
|
1433
|
+
zbuff, pledgedSrcSize) ) {
|
1434
|
+
DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> consider continue mode");
|
1406
1435
|
zc->workSpaceOversizedDuration += (zc->workSpaceOversizedDuration > 0); /* if it was too large, it still is */
|
1407
|
-
if (zc->workSpaceOversizedDuration <= ZSTD_WORKSPACETOOLARGE_MAXDURATION)
|
1436
|
+
if (zc->workSpaceOversizedDuration <= ZSTD_WORKSPACETOOLARGE_MAXDURATION) {
|
1437
|
+
DEBUGLOG(4, "continue mode confirmed (wLog1=%u, blockSize1=%zu)",
|
1438
|
+
zc->appliedParams.cParams.windowLog, zc->blockSize);
|
1439
|
+
if (ZSTD_indexTooCloseToMax(zc->blockState.matchState.window)) {
|
1440
|
+
/* prefer a reset, faster than a rescale */
|
1441
|
+
ZSTD_reset_matchState(&zc->blockState.matchState,
|
1442
|
+
zc->entropyWorkspace + HUF_WORKSPACE_SIZE_U32,
|
1443
|
+
¶ms.cParams,
|
1444
|
+
crp, ZSTD_resetTarget_CCtx);
|
1445
|
+
}
|
1408
1446
|
return ZSTD_continueCCtx(zc, params, pledgedSrcSize);
|
1409
|
-
} }
|
1447
|
+
} } }
|
1410
1448
|
DEBUGLOG(4, "ZSTD_equivalentParams()==0 -> reset CCtx");
|
1411
1449
|
|
1412
1450
|
if (params.ldmParams.enableLdm) {
|
@@ -1449,7 +1487,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
1449
1487
|
DEBUGLOG(4, "windowSize: %zu - blockSize: %zu", windowSize, blockSize);
|
1450
1488
|
|
1451
1489
|
if (workSpaceTooSmall || workSpaceWasteful) {
|
1452
|
-
DEBUGLOG(4, "
|
1490
|
+
DEBUGLOG(4, "Resize workSpaceSize from %zuKB to %zuKB",
|
1453
1491
|
zc->workSpaceSize >> 10,
|
1454
1492
|
neededSpace >> 10);
|
1455
1493
|
|
@@ -1491,7 +1529,10 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
1491
1529
|
|
1492
1530
|
ZSTD_reset_compressedBlockState(zc->blockState.prevCBlock);
|
1493
1531
|
|
1494
|
-
ptr = zc->
|
1532
|
+
ptr = ZSTD_reset_matchState(&zc->blockState.matchState,
|
1533
|
+
zc->entropyWorkspace + HUF_WORKSPACE_SIZE_U32,
|
1534
|
+
¶ms.cParams,
|
1535
|
+
crp, ZSTD_resetTarget_CCtx);
|
1495
1536
|
|
1496
1537
|
/* ldm hash table */
|
1497
1538
|
/* initialize bucketOffsets table later for pointer alignment */
|
@@ -1509,8 +1550,6 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
1509
1550
|
}
|
1510
1551
|
assert(((size_t)ptr & 3) == 0); /* ensure ptr is properly aligned */
|
1511
1552
|
|
1512
|
-
ptr = ZSTD_reset_matchState(&zc->blockState.matchState, ptr, ¶ms.cParams, crp, /* forCCtx */ 1);
|
1513
|
-
|
1514
1553
|
/* sequences storage */
|
1515
1554
|
zc->seqStore.maxNbSeq = maxNbSeq;
|
1516
1555
|
zc->seqStore.sequencesStart = (seqDef*)ptr;
|
@@ -1587,15 +1626,14 @@ static int ZSTD_shouldAttachDict(const ZSTD_CDict* cdict,
|
|
1587
1626
|
* handled in _enforceMaxDist */
|
1588
1627
|
}
|
1589
1628
|
|
1590
|
-
static size_t
|
1591
|
-
|
1592
|
-
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
1629
|
+
static size_t
|
1630
|
+
ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx,
|
1631
|
+
const ZSTD_CDict* cdict,
|
1632
|
+
ZSTD_CCtx_params params,
|
1633
|
+
U64 pledgedSrcSize,
|
1634
|
+
ZSTD_buffered_policy_e zbuff)
|
1596
1635
|
{
|
1597
|
-
{
|
1598
|
-
const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams;
|
1636
|
+
{ const ZSTD_compressionParameters* const cdict_cParams = &cdict->matchState.cParams;
|
1599
1637
|
unsigned const windowLog = params.cParams.windowLog;
|
1600
1638
|
assert(windowLog != 0);
|
1601
1639
|
/* Resize working context table params for input only, since the dict
|
@@ -1607,8 +1645,7 @@ static size_t ZSTD_resetCCtx_byAttachingCDict(
|
|
1607
1645
|
assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
|
1608
1646
|
}
|
1609
1647
|
|
1610
|
-
{
|
1611
|
-
const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc
|
1648
|
+
{ const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc
|
1612
1649
|
- cdict->matchState.window.base);
|
1613
1650
|
const U32 cdictLen = cdictEnd - cdict->matchState.window.dictLimit;
|
1614
1651
|
if (cdictLen == 0) {
|
@@ -1625,9 +1662,9 @@ static size_t ZSTD_resetCCtx_byAttachingCDict(
|
|
1625
1662
|
cctx->blockState.matchState.window.base + cdictEnd;
|
1626
1663
|
ZSTD_window_clear(&cctx->blockState.matchState.window);
|
1627
1664
|
}
|
1665
|
+
/* loadedDictEnd is expressed within the referential of the active context */
|
1628
1666
|
cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit;
|
1629
|
-
|
1630
|
-
}
|
1667
|
+
} }
|
1631
1668
|
|
1632
1669
|
cctx->dictID = cdict->dictID;
|
1633
1670
|
|
@@ -1681,7 +1718,6 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx,
|
|
1681
1718
|
ZSTD_matchState_t* dstMatchState = &cctx->blockState.matchState;
|
1682
1719
|
dstMatchState->window = srcMatchState->window;
|
1683
1720
|
dstMatchState->nextToUpdate = srcMatchState->nextToUpdate;
|
1684
|
-
dstMatchState->nextToUpdate3= srcMatchState->nextToUpdate3;
|
1685
1721
|
dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd;
|
1686
1722
|
}
|
1687
1723
|
|
@@ -1761,7 +1797,6 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx,
|
|
1761
1797
|
ZSTD_matchState_t* dstMatchState = &dstCCtx->blockState.matchState;
|
1762
1798
|
dstMatchState->window = srcMatchState->window;
|
1763
1799
|
dstMatchState->nextToUpdate = srcMatchState->nextToUpdate;
|
1764
|
-
dstMatchState->nextToUpdate3= srcMatchState->nextToUpdate3;
|
1765
1800
|
dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd;
|
1766
1801
|
}
|
1767
1802
|
dstCCtx->dictID = srcCCtx->dictID;
|
@@ -1831,16 +1866,15 @@ static void ZSTD_reduceTable_btlazy2(U32* const table, U32 const size, U32 const
|
|
1831
1866
|
|
1832
1867
|
/*! ZSTD_reduceIndex() :
|
1833
1868
|
* rescale all indexes to avoid future overflow (indexes are U32) */
|
1834
|
-
static void ZSTD_reduceIndex (
|
1869
|
+
static void ZSTD_reduceIndex (ZSTD_matchState_t* ms, ZSTD_CCtx_params const* params, const U32 reducerValue)
|
1835
1870
|
{
|
1836
|
-
|
1837
|
-
{ U32 const hSize = (U32)1 << zc->appliedParams.cParams.hashLog;
|
1871
|
+
{ U32 const hSize = (U32)1 << params->cParams.hashLog;
|
1838
1872
|
ZSTD_reduceTable(ms->hashTable, hSize, reducerValue);
|
1839
1873
|
}
|
1840
1874
|
|
1841
|
-
if (
|
1842
|
-
U32 const chainSize = (U32)1 <<
|
1843
|
-
if (
|
1875
|
+
if (params->cParams.strategy != ZSTD_fast) {
|
1876
|
+
U32 const chainSize = (U32)1 << params->cParams.chainLog;
|
1877
|
+
if (params->cParams.strategy == ZSTD_btlazy2)
|
1844
1878
|
ZSTD_reduceTable_btlazy2(ms->chainTable, chainSize, reducerValue);
|
1845
1879
|
else
|
1846
1880
|
ZSTD_reduceTable(ms->chainTable, chainSize, reducerValue);
|
@@ -2524,6 +2558,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
2524
2558
|
op[0] = (BYTE)((nbSeq>>8) + 0x80), op[1] = (BYTE)nbSeq, op+=2;
|
2525
2559
|
else
|
2526
2560
|
op[0]=0xFF, MEM_writeLE16(op+1, (U16)(nbSeq - LONGNBSEQ)), op+=3;
|
2561
|
+
assert(op <= oend);
|
2527
2562
|
if (nbSeq==0) {
|
2528
2563
|
/* Copy the old tables over as if we repeated them */
|
2529
2564
|
memcpy(&nextEntropy->fse, &prevEntropy->fse, sizeof(prevEntropy->fse));
|
@@ -2532,6 +2567,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
2532
2567
|
|
2533
2568
|
/* seqHead : flags for FSE encoding type */
|
2534
2569
|
seqHead = op++;
|
2570
|
+
assert(op <= oend);
|
2535
2571
|
|
2536
2572
|
/* convert length/distances into codes */
|
2537
2573
|
ZSTD_seqToCodes(seqStorePtr);
|
@@ -2555,6 +2591,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
2555
2591
|
if (LLtype == set_compressed)
|
2556
2592
|
lastNCount = op;
|
2557
2593
|
op += countSize;
|
2594
|
+
assert(op <= oend);
|
2558
2595
|
} }
|
2559
2596
|
/* build CTable for Offsets */
|
2560
2597
|
{ unsigned max = MaxOff;
|
@@ -2577,6 +2614,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
2577
2614
|
if (Offtype == set_compressed)
|
2578
2615
|
lastNCount = op;
|
2579
2616
|
op += countSize;
|
2617
|
+
assert(op <= oend);
|
2580
2618
|
} }
|
2581
2619
|
/* build CTable for MatchLengths */
|
2582
2620
|
{ unsigned max = MaxML;
|
@@ -2597,6 +2635,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
2597
2635
|
if (MLtype == set_compressed)
|
2598
2636
|
lastNCount = op;
|
2599
2637
|
op += countSize;
|
2638
|
+
assert(op <= oend);
|
2600
2639
|
} }
|
2601
2640
|
|
2602
2641
|
*seqHead = (BYTE)((LLtype<<6) + (Offtype<<4) + (MLtype<<2));
|
@@ -2610,6 +2649,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|
2610
2649
|
longOffsets, bmi2);
|
2611
2650
|
FORWARD_IF_ERROR(bitstreamSize);
|
2612
2651
|
op += bitstreamSize;
|
2652
|
+
assert(op <= oend);
|
2613
2653
|
/* zstd versions <= 1.3.4 mistakenly report corruption when
|
2614
2654
|
* FSE_readNCount() receives a buffer < 4 bytes.
|
2615
2655
|
* Fixed by https://github.com/facebook/zstd/pull/1146.
|
@@ -2721,30 +2761,24 @@ void ZSTD_resetSeqStore(seqStore_t* ssPtr)
|
|
2721
2761
|
ssPtr->longLengthID = 0;
|
2722
2762
|
}
|
2723
2763
|
|
2724
|
-
|
2725
|
-
|
2726
|
-
|
2764
|
+
typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e;
|
2765
|
+
|
2766
|
+
static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize)
|
2727
2767
|
{
|
2728
2768
|
ZSTD_matchState_t* const ms = &zc->blockState.matchState;
|
2729
|
-
|
2730
|
-
DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)",
|
2731
|
-
(unsigned)dstCapacity, (unsigned)ms->window.dictLimit, (unsigned)ms->nextToUpdate);
|
2769
|
+
DEBUGLOG(5, "ZSTD_buildSeqStore (srcSize=%zu)", srcSize);
|
2732
2770
|
assert(srcSize <= ZSTD_BLOCKSIZE_MAX);
|
2733
|
-
|
2734
2771
|
/* Assert that we have correctly flushed the ctx params into the ms's copy */
|
2735
2772
|
ZSTD_assertEqualCParams(zc->appliedParams.cParams, ms->cParams);
|
2736
|
-
|
2737
2773
|
if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) {
|
2738
2774
|
ZSTD_ldm_skipSequences(&zc->externSeqStore, srcSize, zc->appliedParams.cParams.minMatch);
|
2739
|
-
|
2740
|
-
goto out; /* don't even attempt compression below a certain srcSize */
|
2775
|
+
return ZSTDbss_noCompress; /* don't even attempt compression below a certain srcSize */
|
2741
2776
|
}
|
2742
2777
|
ZSTD_resetSeqStore(&(zc->seqStore));
|
2743
2778
|
/* required for optimal parser to read stats from dictionary */
|
2744
2779
|
ms->opt.symbolCosts = &zc->blockState.prevCBlock->entropy;
|
2745
2780
|
/* tell the optimal parser how we expect to compress literals */
|
2746
2781
|
ms->opt.literalCompressionMode = zc->appliedParams.literalCompressionMode;
|
2747
|
-
|
2748
2782
|
/* a gap between an attached dict and the current window is not safe,
|
2749
2783
|
* they must remain adjacent,
|
2750
2784
|
* and when that stops being the case, the dict must be unset */
|
@@ -2798,6 +2832,21 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
|
2798
2832
|
{ const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize;
|
2799
2833
|
ZSTD_storeLastLiterals(&zc->seqStore, lastLiterals, lastLLSize);
|
2800
2834
|
} }
|
2835
|
+
return ZSTDbss_compress;
|
2836
|
+
}
|
2837
|
+
|
2838
|
+
static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
2839
|
+
void* dst, size_t dstCapacity,
|
2840
|
+
const void* src, size_t srcSize)
|
2841
|
+
{
|
2842
|
+
size_t cSize;
|
2843
|
+
DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)",
|
2844
|
+
(unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, (unsigned)zc->blockState.matchState.nextToUpdate);
|
2845
|
+
|
2846
|
+
{ const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize);
|
2847
|
+
FORWARD_IF_ERROR(bss);
|
2848
|
+
if (bss == ZSTDbss_noCompress) { cSize = 0; goto out; }
|
2849
|
+
}
|
2801
2850
|
|
2802
2851
|
/* encode sequences and literals */
|
2803
2852
|
cSize = ZSTD_compressSequences(&zc->seqStore,
|
@@ -2826,6 +2875,25 @@ out:
|
|
2826
2875
|
}
|
2827
2876
|
|
2828
2877
|
|
2878
|
+
static void ZSTD_overflowCorrectIfNeeded(ZSTD_matchState_t* ms, ZSTD_CCtx_params const* params, void const* ip, void const* iend)
|
2879
|
+
{
|
2880
|
+
if (ZSTD_window_needOverflowCorrection(ms->window, iend)) {
|
2881
|
+
U32 const maxDist = (U32)1 << params->cParams.windowLog;
|
2882
|
+
U32 const cycleLog = ZSTD_cycleLog(params->cParams.chainLog, params->cParams.strategy);
|
2883
|
+
U32 const correction = ZSTD_window_correctOverflow(&ms->window, cycleLog, maxDist, ip);
|
2884
|
+
ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30);
|
2885
|
+
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30);
|
2886
|
+
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31);
|
2887
|
+
ZSTD_reduceIndex(ms, params, correction);
|
2888
|
+
if (ms->nextToUpdate < correction) ms->nextToUpdate = 0;
|
2889
|
+
else ms->nextToUpdate -= correction;
|
2890
|
+
/* invalidate dictionaries on overflow correction */
|
2891
|
+
ms->loadedDictEnd = 0;
|
2892
|
+
ms->dictMatchState = NULL;
|
2893
|
+
}
|
2894
|
+
}
|
2895
|
+
|
2896
|
+
|
2829
2897
|
/*! ZSTD_compress_frameChunk() :
|
2830
2898
|
* Compress a chunk of data into one or multiple blocks.
|
2831
2899
|
* All blocks will be terminated, all input will be consumed.
|
@@ -2844,7 +2912,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
|
|
2844
2912
|
BYTE* const ostart = (BYTE*)dst;
|
2845
2913
|
BYTE* op = ostart;
|
2846
2914
|
U32 const maxDist = (U32)1 << cctx->appliedParams.cParams.windowLog;
|
2847
|
-
assert(cctx->appliedParams.cParams.windowLog <=
|
2915
|
+
assert(cctx->appliedParams.cParams.windowLog <= ZSTD_WINDOWLOG_MAX);
|
2848
2916
|
|
2849
2917
|
DEBUGLOG(5, "ZSTD_compress_frameChunk (blockSize=%u)", (unsigned)blockSize);
|
2850
2918
|
if (cctx->appliedParams.fParams.checksumFlag && srcSize)
|
@@ -2859,19 +2927,10 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
|
|
2859
2927
|
"not enough space to store compressed block");
|
2860
2928
|
if (remaining < blockSize) blockSize = remaining;
|
2861
2929
|
|
2862
|
-
|
2863
|
-
|
2864
|
-
|
2865
|
-
|
2866
|
-
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30);
|
2867
|
-
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31);
|
2868
|
-
ZSTD_reduceIndex(cctx, correction);
|
2869
|
-
if (ms->nextToUpdate < correction) ms->nextToUpdate = 0;
|
2870
|
-
else ms->nextToUpdate -= correction;
|
2871
|
-
ms->loadedDictEnd = 0;
|
2872
|
-
ms->dictMatchState = NULL;
|
2873
|
-
}
|
2874
|
-
ZSTD_window_enforceMaxDist(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState);
|
2930
|
+
ZSTD_overflowCorrectIfNeeded(ms, &cctx->appliedParams, ip, ip + blockSize);
|
2931
|
+
ZSTD_checkDictValidity(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState);
|
2932
|
+
|
2933
|
+
/* Ensure hash/chain table insertion resumes no sooner than lowlimit */
|
2875
2934
|
if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit;
|
2876
2935
|
|
2877
2936
|
{ size_t cSize = ZSTD_compressBlock_internal(cctx,
|
@@ -2899,7 +2958,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
|
|
2899
2958
|
} }
|
2900
2959
|
|
2901
2960
|
if (lastFrameChunk && (op>ostart)) cctx->stage = ZSTDcs_ending;
|
2902
|
-
return op-ostart;
|
2961
|
+
return (size_t)(op-ostart);
|
2903
2962
|
}
|
2904
2963
|
|
2905
2964
|
|
@@ -2991,6 +3050,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|
2991
3050
|
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->appliedParams,
|
2992
3051
|
cctx->pledgedSrcSizePlusOne-1, cctx->dictID);
|
2993
3052
|
FORWARD_IF_ERROR(fhSize);
|
3053
|
+
assert(fhSize <= dstCapacity);
|
2994
3054
|
dstCapacity -= fhSize;
|
2995
3055
|
dst = (char*)dst + fhSize;
|
2996
3056
|
cctx->stage = ZSTDcs_ongoing;
|
@@ -3007,18 +3067,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|
3007
3067
|
|
3008
3068
|
if (!frame) {
|
3009
3069
|
/* overflow check and correction for block mode */
|
3010
|
-
|
3011
|
-
U32 const cycleLog = ZSTD_cycleLog(cctx->appliedParams.cParams.chainLog, cctx->appliedParams.cParams.strategy);
|
3012
|
-
U32 const correction = ZSTD_window_correctOverflow(&ms->window, cycleLog, 1 << cctx->appliedParams.cParams.windowLog, src);
|
3013
|
-
ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30);
|
3014
|
-
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30);
|
3015
|
-
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31);
|
3016
|
-
ZSTD_reduceIndex(cctx, correction);
|
3017
|
-
if (ms->nextToUpdate < correction) ms->nextToUpdate = 0;
|
3018
|
-
else ms->nextToUpdate -= correction;
|
3019
|
-
ms->loadedDictEnd = 0;
|
3020
|
-
ms->dictMatchState = NULL;
|
3021
|
-
}
|
3070
|
+
ZSTD_overflowCorrectIfNeeded(ms, &cctx->appliedParams, src, (BYTE const*)src + srcSize);
|
3022
3071
|
}
|
3023
3072
|
|
3024
3073
|
DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (unsigned)cctx->blockSize);
|
@@ -3074,7 +3123,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
|
|
3074
3123
|
const void* src, size_t srcSize,
|
3075
3124
|
ZSTD_dictTableLoadMethod_e dtlm)
|
3076
3125
|
{
|
3077
|
-
const BYTE*
|
3126
|
+
const BYTE* ip = (const BYTE*) src;
|
3078
3127
|
const BYTE* const iend = ip + srcSize;
|
3079
3128
|
|
3080
3129
|
ZSTD_window_update(&ms->window, src, srcSize);
|
@@ -3085,32 +3134,42 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
|
|
3085
3134
|
|
3086
3135
|
if (srcSize <= HASH_READ_SIZE) return 0;
|
3087
3136
|
|
3088
|
-
|
3089
|
-
|
3090
|
-
|
3091
|
-
|
3092
|
-
break;
|
3093
|
-
case ZSTD_dfast:
|
3094
|
-
ZSTD_fillDoubleHashTable(ms, iend, dtlm);
|
3095
|
-
break;
|
3137
|
+
while (iend - ip > HASH_READ_SIZE) {
|
3138
|
+
size_t const remaining = iend - ip;
|
3139
|
+
size_t const chunk = MIN(remaining, ZSTD_CHUNKSIZE_MAX);
|
3140
|
+
const BYTE* const ichunk = ip + chunk;
|
3096
3141
|
|
3097
|
-
|
3098
|
-
case ZSTD_lazy:
|
3099
|
-
case ZSTD_lazy2:
|
3100
|
-
if (srcSize >= HASH_READ_SIZE)
|
3101
|
-
ZSTD_insertAndFindFirstIndex(ms, iend-HASH_READ_SIZE);
|
3102
|
-
break;
|
3142
|
+
ZSTD_overflowCorrectIfNeeded(ms, params, ip, ichunk);
|
3103
3143
|
|
3104
|
-
|
3105
|
-
|
3106
|
-
|
3107
|
-
|
3108
|
-
|
3109
|
-
|
3110
|
-
|
3144
|
+
switch(params->cParams.strategy)
|
3145
|
+
{
|
3146
|
+
case ZSTD_fast:
|
3147
|
+
ZSTD_fillHashTable(ms, ichunk, dtlm);
|
3148
|
+
break;
|
3149
|
+
case ZSTD_dfast:
|
3150
|
+
ZSTD_fillDoubleHashTable(ms, ichunk, dtlm);
|
3151
|
+
break;
|
3111
3152
|
|
3112
|
-
|
3113
|
-
|
3153
|
+
case ZSTD_greedy:
|
3154
|
+
case ZSTD_lazy:
|
3155
|
+
case ZSTD_lazy2:
|
3156
|
+
if (chunk >= HASH_READ_SIZE)
|
3157
|
+
ZSTD_insertAndFindFirstIndex(ms, ichunk-HASH_READ_SIZE);
|
3158
|
+
break;
|
3159
|
+
|
3160
|
+
case ZSTD_btlazy2: /* we want the dictionary table fully sorted */
|
3161
|
+
case ZSTD_btopt:
|
3162
|
+
case ZSTD_btultra:
|
3163
|
+
case ZSTD_btultra2:
|
3164
|
+
if (chunk >= HASH_READ_SIZE)
|
3165
|
+
ZSTD_updateTree(ms, ichunk-HASH_READ_SIZE, ichunk);
|
3166
|
+
break;
|
3167
|
+
|
3168
|
+
default:
|
3169
|
+
assert(0); /* not possible : not a valid strategy id */
|
3170
|
+
}
|
3171
|
+
|
3172
|
+
ip = ichunk;
|
3114
3173
|
}
|
3115
3174
|
|
3116
3175
|
ms->nextToUpdate = (U32)(iend - ms->window.base);
|
@@ -3297,12 +3356,11 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
|
|
3297
3356
|
|
3298
3357
|
FORWARD_IF_ERROR( ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
|
3299
3358
|
ZSTDcrp_continue, zbuff) );
|
3300
|
-
{
|
3301
|
-
size_t const dictID = ZSTD_compress_insertDictionary(
|
3359
|
+
{ size_t const dictID = ZSTD_compress_insertDictionary(
|
3302
3360
|
cctx->blockState.prevCBlock, &cctx->blockState.matchState,
|
3303
3361
|
¶ms, dict, dictSize, dictContentType, dtlm, cctx->entropyWorkspace);
|
3304
3362
|
FORWARD_IF_ERROR(dictID);
|
3305
|
-
assert(dictID <=
|
3363
|
+
assert(dictID <= UINT_MAX);
|
3306
3364
|
cctx->dictID = (U32)dictID;
|
3307
3365
|
}
|
3308
3366
|
return 0;
|
@@ -3555,10 +3613,10 @@ static size_t ZSTD_initCDict_internal(
|
|
3555
3613
|
|
3556
3614
|
/* Reset the state to no dictionary */
|
3557
3615
|
ZSTD_reset_compressedBlockState(&cdict->cBlockState);
|
3558
|
-
{ void* const end = ZSTD_reset_matchState(
|
3559
|
-
|
3560
|
-
|
3561
|
-
|
3616
|
+
{ void* const end = ZSTD_reset_matchState(&cdict->matchState,
|
3617
|
+
(U32*)cdict->workspace + HUF_WORKSPACE_SIZE_U32,
|
3618
|
+
&cParams,
|
3619
|
+
ZSTDcrp_continue, ZSTD_resetTarget_CDict);
|
3562
3620
|
assert(end == (char*)cdict->workspace + cdict->workspaceSize);
|
3563
3621
|
(void)end;
|
3564
3622
|
}
|
@@ -4068,7 +4126,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
|
|
4068
4126
|
case zcss_flush:
|
4069
4127
|
DEBUGLOG(5, "flush stage");
|
4070
4128
|
{ size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
|
4071
|
-
size_t const flushed = ZSTD_limitCopy(op, oend-op,
|
4129
|
+
size_t const flushed = ZSTD_limitCopy(op, (size_t)(oend-op),
|
4072
4130
|
zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
|
4073
4131
|
DEBUGLOG(5, "toFlush: %u into %u ==> flushed: %u",
|
4074
4132
|
(unsigned)toFlush, (unsigned)(oend-op), (unsigned)flushed);
|
@@ -4262,7 +4320,7 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
|
|
4262
4320
|
if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */
|
4263
4321
|
/* single thread mode : attempt to calculate remaining to flush more precisely */
|
4264
4322
|
{ size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE;
|
4265
|
-
size_t const checksumSize = zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4;
|
4323
|
+
size_t const checksumSize = (size_t)(zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4);
|
4266
4324
|
size_t const toFlush = remainingToFlush + lastBlockSize + checksumSize;
|
4267
4325
|
DEBUGLOG(4, "ZSTD_endStream : remaining to flush : %u", (unsigned)toFlush);
|
4268
4326
|
return toFlush;
|