zstd-ruby 1.2.0.0 → 1.3.0.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 +7 -5
- data/ext/zstdruby/libzstd/common/bitstream.h +23 -9
- data/ext/zstdruby/libzstd/common/error_private.c +4 -1
- data/ext/zstdruby/libzstd/common/huf.h +20 -0
- data/ext/zstdruby/libzstd/common/mem.h +0 -14
- data/ext/zstdruby/libzstd/common/pool.c +12 -0
- data/ext/zstdruby/libzstd/common/pool.h +5 -0
- data/ext/zstdruby/libzstd/common/threading.c +0 -1
- data/ext/zstdruby/libzstd/common/zstd_common.c +25 -18
- data/ext/zstdruby/libzstd/common/zstd_errors.h +15 -7
- data/ext/zstdruby/libzstd/common/zstd_internal.h +59 -9
- data/ext/zstdruby/libzstd/compress/huf_compress.c +7 -3
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +1082 -487
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +30 -15
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +362 -158
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +49 -13
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +150 -26
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +380 -258
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +23 -37
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +30 -40
- data/ext/zstdruby/libzstd/dictBuilder/zdict.h +104 -95
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +11 -10
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +14 -19
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +13 -12
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +13 -14
- data/ext/zstdruby/libzstd/zstd.h +507 -166
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +2 -2
@@ -266,7 +266,8 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits)
|
|
266
266
|
if (highTotal <= lowTotal) break;
|
267
267
|
} }
|
268
268
|
/* only triggered when no more rank 1 symbol left => find closest one (note : there is necessarily at least one !) */
|
269
|
-
|
269
|
+
/* HUF_MAX_TABLELOG test just to please gcc 5+; but it should not be necessary */
|
270
|
+
while ((nBitsToDecrease<=HUF_TABLELOG_MAX) && (rankLast[nBitsToDecrease] == noSymbol))
|
270
271
|
nBitsToDecrease ++;
|
271
272
|
totalCost -= 1 << (nBitsToDecrease-1);
|
272
273
|
if (rankLast[nBitsToDecrease-1] == noSymbol)
|
@@ -463,12 +464,15 @@ size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, si
|
|
463
464
|
{
|
464
465
|
case 3 : HUF_encodeSymbol(&bitC, ip[n+ 2], CTable);
|
465
466
|
HUF_FLUSHBITS_2(&bitC);
|
467
|
+
/* fall-through */
|
466
468
|
case 2 : HUF_encodeSymbol(&bitC, ip[n+ 1], CTable);
|
467
469
|
HUF_FLUSHBITS_1(&bitC);
|
470
|
+
/* fall-through */
|
468
471
|
case 1 : HUF_encodeSymbol(&bitC, ip[n+ 0], CTable);
|
469
472
|
HUF_FLUSHBITS(&bitC);
|
470
|
-
|
471
|
-
|
473
|
+
/* fall-through */
|
474
|
+
case 0 : /* fall-through */
|
475
|
+
default: break;
|
472
476
|
}
|
473
477
|
|
474
478
|
for (; n>0; n-=4) { /* note : n&3==0 at this stage */
|
@@ -8,6 +8,14 @@
|
|
8
8
|
*/
|
9
9
|
|
10
10
|
|
11
|
+
/*-*************************************
|
12
|
+
* Tuning parameters
|
13
|
+
***************************************/
|
14
|
+
#ifndef ZSTD_CLEVEL_DEFAULT
|
15
|
+
# define ZSTD_CLEVEL_DEFAULT 3
|
16
|
+
#endif
|
17
|
+
|
18
|
+
|
11
19
|
/*-*************************************
|
12
20
|
* Dependencies
|
13
21
|
***************************************/
|
@@ -18,26 +26,7 @@
|
|
18
26
|
#define HUF_STATIC_LINKING_ONLY
|
19
27
|
#include "huf.h"
|
20
28
|
#include "zstd_internal.h" /* includes zstd.h */
|
21
|
-
|
22
|
-
|
23
|
-
/*-*************************************
|
24
|
-
* Debug
|
25
|
-
***************************************/
|
26
|
-
#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=1)
|
27
|
-
# include <assert.h>
|
28
|
-
#else
|
29
|
-
# define assert(condition) ((void)0)
|
30
|
-
#endif
|
31
|
-
|
32
|
-
#define ZSTD_STATIC_ASSERT(c) { enum { ZSTD_static_assert = 1/(int)(!!(c)) }; }
|
33
|
-
|
34
|
-
#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=2)
|
35
|
-
# include <stdio.h>
|
36
|
-
static unsigned g_debugLevel = ZSTD_DEBUG;
|
37
|
-
# define DEBUGLOG(l, ...) if (l<=g_debugLevel) { fprintf(stderr, __FILE__ ": "); fprintf(stderr, __VA_ARGS__); fprintf(stderr, " \n"); }
|
38
|
-
#else
|
39
|
-
# define DEBUGLOG(l, ...) {} /* disabled */
|
40
|
-
#endif
|
29
|
+
#include "zstdmt_compress.h"
|
41
30
|
|
42
31
|
|
43
32
|
/*-*************************************
|
@@ -79,6 +68,15 @@ static void ZSTD_resetSeqStore(seqStore_t* ssPtr)
|
|
79
68
|
/*-*************************************
|
80
69
|
* Context memory management
|
81
70
|
***************************************/
|
71
|
+
typedef enum { zcss_init=0, zcss_load, zcss_flush } ZSTD_cStreamStage;
|
72
|
+
|
73
|
+
struct ZSTD_CDict_s {
|
74
|
+
void* dictBuffer;
|
75
|
+
const void* dictContent;
|
76
|
+
size_t dictContentSize;
|
77
|
+
ZSTD_CCtx* refContext;
|
78
|
+
}; /* typedef'd to ZSTD_CDict within "zstd.h" */
|
79
|
+
|
82
80
|
struct ZSTD_CCtx_s {
|
83
81
|
const BYTE* nextSrc; /* next block here to continue on current prefix */
|
84
82
|
const BYTE* base; /* All regular indexes relative to this position */
|
@@ -90,19 +88,21 @@ struct ZSTD_CCtx_s {
|
|
90
88
|
U32 hashLog3; /* dispatch table : larger == faster, more memory */
|
91
89
|
U32 loadedDictEnd; /* index of end of dictionary */
|
92
90
|
U32 forceWindow; /* force back-references to respect limit of 1<<wLog, even for dictionary */
|
93
|
-
U32 forceRawDict; /* Force loading dictionary in "content-only" mode (no header analysis) */
|
94
91
|
ZSTD_compressionStage_e stage;
|
95
92
|
U32 rep[ZSTD_REP_NUM];
|
96
93
|
U32 repToConfirm[ZSTD_REP_NUM];
|
97
94
|
U32 dictID;
|
98
|
-
|
95
|
+
int compressionLevel;
|
96
|
+
ZSTD_parameters requestedParams;
|
97
|
+
ZSTD_parameters appliedParams;
|
99
98
|
void* workSpace;
|
100
99
|
size_t workSpaceSize;
|
101
100
|
size_t blockSize;
|
102
|
-
U64
|
101
|
+
U64 pledgedSrcSizePlusOne; /* this way, 0 (default) == unknown */
|
103
102
|
U64 consumedSrcSize;
|
104
103
|
XXH64_state_t xxhState;
|
105
104
|
ZSTD_customMem customMem;
|
105
|
+
size_t staticSize;
|
106
106
|
|
107
107
|
seqStore_t seqStore; /* sequences storage ptrs */
|
108
108
|
U32* hashTable;
|
@@ -115,31 +115,92 @@ struct ZSTD_CCtx_s {
|
|
115
115
|
FSE_CTable* matchlengthCTable;
|
116
116
|
FSE_CTable* litlengthCTable;
|
117
117
|
unsigned* entropyScratchSpace;
|
118
|
+
|
119
|
+
/* streaming */
|
120
|
+
char* inBuff;
|
121
|
+
size_t inBuffSize;
|
122
|
+
size_t inToCompress;
|
123
|
+
size_t inBuffPos;
|
124
|
+
size_t inBuffTarget;
|
125
|
+
char* outBuff;
|
126
|
+
size_t outBuffSize;
|
127
|
+
size_t outBuffContentSize;
|
128
|
+
size_t outBuffFlushedSize;
|
129
|
+
ZSTD_cStreamStage streamStage;
|
130
|
+
U32 frameEnded;
|
131
|
+
|
132
|
+
/* Dictionary */
|
133
|
+
ZSTD_dictMode_e dictMode; /* select restricting dictionary to "rawContent" or "fullDict" only */
|
134
|
+
U32 dictContentByRef;
|
135
|
+
ZSTD_CDict* cdictLocal;
|
136
|
+
const ZSTD_CDict* cdict;
|
137
|
+
const void* prefix;
|
138
|
+
size_t prefixSize;
|
139
|
+
|
140
|
+
/* Multi-threading */
|
141
|
+
U32 nbThreads;
|
142
|
+
ZSTDMT_CCtx* mtctx;
|
118
143
|
};
|
119
144
|
|
145
|
+
|
120
146
|
ZSTD_CCtx* ZSTD_createCCtx(void)
|
121
147
|
{
|
122
|
-
return ZSTD_createCCtx_advanced(
|
148
|
+
return ZSTD_createCCtx_advanced(ZSTD_defaultCMem);
|
123
149
|
}
|
124
150
|
|
125
151
|
ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem)
|
126
152
|
{
|
127
153
|
ZSTD_CCtx* cctx;
|
128
154
|
|
129
|
-
if (!customMem.customAlloc
|
130
|
-
if (!customMem.customAlloc || !customMem.customFree) return NULL;
|
155
|
+
if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
|
131
156
|
|
132
|
-
cctx = (ZSTD_CCtx*)
|
157
|
+
cctx = (ZSTD_CCtx*) ZSTD_calloc(sizeof(ZSTD_CCtx), customMem);
|
133
158
|
if (!cctx) return NULL;
|
134
|
-
memset(cctx, 0, sizeof(ZSTD_CCtx));
|
135
159
|
cctx->customMem = customMem;
|
160
|
+
cctx->compressionLevel = ZSTD_CLEVEL_DEFAULT;
|
161
|
+
ZSTD_STATIC_ASSERT(zcss_init==0);
|
162
|
+
ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN==(0ULL - 1));
|
163
|
+
return cctx;
|
164
|
+
}
|
165
|
+
|
166
|
+
ZSTD_CCtx* ZSTD_initStaticCCtx(void *workspace, size_t workspaceSize)
|
167
|
+
{
|
168
|
+
ZSTD_CCtx* cctx = (ZSTD_CCtx*) workspace;
|
169
|
+
if (workspaceSize <= sizeof(ZSTD_CCtx)) return NULL; /* minimum size */
|
170
|
+
if ((size_t)workspace & 7) return NULL; /* must be 8-aligned */
|
171
|
+
memset(workspace, 0, workspaceSize); /* may be a bit generous, could memset be smaller ? */
|
172
|
+
cctx->staticSize = workspaceSize;
|
173
|
+
cctx->workSpace = (void*)(cctx+1);
|
174
|
+
cctx->workSpaceSize = workspaceSize - sizeof(ZSTD_CCtx);
|
175
|
+
|
176
|
+
/* entropy space (never moves) */
|
177
|
+
/* note : this code should be shared with resetCCtx, rather than copy/pasted */
|
178
|
+
{ void* ptr = cctx->workSpace;
|
179
|
+
cctx->hufCTable = (HUF_CElt*)ptr;
|
180
|
+
ptr = (char*)cctx->hufCTable + hufCTable_size;
|
181
|
+
cctx->offcodeCTable = (FSE_CTable*) ptr;
|
182
|
+
ptr = (char*)ptr + offcodeCTable_size;
|
183
|
+
cctx->matchlengthCTable = (FSE_CTable*) ptr;
|
184
|
+
ptr = (char*)ptr + matchlengthCTable_size;
|
185
|
+
cctx->litlengthCTable = (FSE_CTable*) ptr;
|
186
|
+
ptr = (char*)ptr + litlengthCTable_size;
|
187
|
+
assert(((size_t)ptr & 3) == 0); /* ensure correct alignment */
|
188
|
+
cctx->entropyScratchSpace = (unsigned*) ptr;
|
189
|
+
}
|
190
|
+
|
136
191
|
return cctx;
|
137
192
|
}
|
138
193
|
|
139
194
|
size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
|
140
195
|
{
|
141
196
|
if (cctx==NULL) return 0; /* support free on NULL */
|
197
|
+
if (cctx->staticSize) return ERROR(memory_allocation); /* not compatible with static CCtx */
|
142
198
|
ZSTD_free(cctx->workSpace, cctx->customMem);
|
199
|
+
cctx->workSpace = NULL;
|
200
|
+
ZSTD_freeCDict(cctx->cdictLocal);
|
201
|
+
cctx->cdictLocal = NULL;
|
202
|
+
ZSTDMT_freeCCtx(cctx->mtctx);
|
203
|
+
cctx->mtctx = NULL;
|
143
204
|
ZSTD_free(cctx, cctx->customMem);
|
144
205
|
return 0; /* reserved as a potential error code in the future */
|
145
206
|
}
|
@@ -147,46 +208,294 @@ size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
|
|
147
208
|
size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx)
|
148
209
|
{
|
149
210
|
if (cctx==NULL) return 0; /* support sizeof on NULL */
|
150
|
-
|
211
|
+
DEBUGLOG(5, "sizeof(*cctx) : %u", (U32)sizeof(*cctx));
|
212
|
+
DEBUGLOG(5, "workSpaceSize : %u", (U32)cctx->workSpaceSize);
|
213
|
+
DEBUGLOG(5, "streaming buffers : %u", (U32)(cctx->outBuffSize + cctx->inBuffSize));
|
214
|
+
DEBUGLOG(5, "inner MTCTX : %u", (U32)ZSTDMT_sizeof_CCtx(cctx->mtctx));
|
215
|
+
return sizeof(*cctx) + cctx->workSpaceSize
|
216
|
+
+ ZSTD_sizeof_CDict(cctx->cdictLocal)
|
217
|
+
+ cctx->outBuffSize + cctx->inBuffSize
|
218
|
+
+ ZSTDMT_sizeof_CCtx(cctx->mtctx);
|
151
219
|
}
|
152
220
|
|
221
|
+
size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs)
|
222
|
+
{
|
223
|
+
return ZSTD_sizeof_CCtx(zcs); /* same object */
|
224
|
+
}
|
225
|
+
|
226
|
+
/* private API call, for dictBuilder only */
|
227
|
+
const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx) { return &(ctx->seqStore); }
|
228
|
+
|
229
|
+
static ZSTD_parameters ZSTD_getParamsFromCCtx(const ZSTD_CCtx* cctx) { return cctx->appliedParams; }
|
230
|
+
|
231
|
+
/* older variant; will be deprecated */
|
153
232
|
size_t ZSTD_setCCtxParameter(ZSTD_CCtx* cctx, ZSTD_CCtxParameter param, unsigned value)
|
154
233
|
{
|
155
234
|
switch(param)
|
156
235
|
{
|
157
236
|
case ZSTD_p_forceWindow : cctx->forceWindow = value>0; cctx->loadedDictEnd = 0; return 0;
|
158
|
-
|
237
|
+
ZSTD_STATIC_ASSERT(ZSTD_dm_auto==0);
|
238
|
+
ZSTD_STATIC_ASSERT(ZSTD_dm_rawContent==1);
|
239
|
+
case ZSTD_p_forceRawDict : cctx->dictMode = (ZSTD_dictMode_e)(value>0); return 0;
|
159
240
|
default: return ERROR(parameter_unknown);
|
160
241
|
}
|
161
242
|
}
|
162
243
|
|
163
|
-
|
244
|
+
|
245
|
+
#define ZSTD_CLEVEL_CUSTOM 999
|
246
|
+
static void ZSTD_cLevelToCParams(ZSTD_CCtx* cctx)
|
164
247
|
{
|
165
|
-
|
248
|
+
if (cctx->compressionLevel==ZSTD_CLEVEL_CUSTOM) return;
|
249
|
+
cctx->requestedParams.cParams = ZSTD_getCParams(cctx->compressionLevel,
|
250
|
+
cctx->pledgedSrcSizePlusOne-1, 0);
|
251
|
+
cctx->compressionLevel = ZSTD_CLEVEL_CUSTOM;
|
166
252
|
}
|
167
253
|
|
168
|
-
|
254
|
+
#define CLAMPCHECK(val,min,max) { \
|
255
|
+
if (((val)<(min)) | ((val)>(max))) { \
|
256
|
+
return ERROR(compressionParameter_outOfBound); \
|
257
|
+
} }
|
258
|
+
|
259
|
+
size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value)
|
169
260
|
{
|
170
|
-
|
261
|
+
if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
|
262
|
+
|
263
|
+
switch(param)
|
264
|
+
{
|
265
|
+
case ZSTD_p_compressionLevel :
|
266
|
+
if ((int)value > ZSTD_maxCLevel()) value = ZSTD_maxCLevel(); /* cap max compression level */
|
267
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
268
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
269
|
+
cctx->compressionLevel = value;
|
270
|
+
return 0;
|
271
|
+
|
272
|
+
case ZSTD_p_windowLog :
|
273
|
+
DEBUGLOG(5, "setting ZSTD_p_windowLog = %u (cdict:%u)",
|
274
|
+
value, (cctx->cdict!=NULL));
|
275
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
276
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
277
|
+
CLAMPCHECK(value, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
|
278
|
+
ZSTD_cLevelToCParams(cctx);
|
279
|
+
cctx->requestedParams.cParams.windowLog = value;
|
280
|
+
return 0;
|
281
|
+
|
282
|
+
case ZSTD_p_hashLog :
|
283
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
284
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
285
|
+
CLAMPCHECK(value, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
|
286
|
+
ZSTD_cLevelToCParams(cctx);
|
287
|
+
cctx->requestedParams.cParams.hashLog = value;
|
288
|
+
return 0;
|
289
|
+
|
290
|
+
case ZSTD_p_chainLog :
|
291
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
292
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
293
|
+
CLAMPCHECK(value, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
|
294
|
+
ZSTD_cLevelToCParams(cctx);
|
295
|
+
cctx->requestedParams.cParams.chainLog = value;
|
296
|
+
return 0;
|
297
|
+
|
298
|
+
case ZSTD_p_searchLog :
|
299
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
300
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
301
|
+
CLAMPCHECK(value, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
|
302
|
+
ZSTD_cLevelToCParams(cctx);
|
303
|
+
cctx->requestedParams.cParams.searchLog = value;
|
304
|
+
return 0;
|
305
|
+
|
306
|
+
case ZSTD_p_minMatch :
|
307
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
308
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
309
|
+
CLAMPCHECK(value, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
|
310
|
+
ZSTD_cLevelToCParams(cctx);
|
311
|
+
cctx->requestedParams.cParams.searchLength = value;
|
312
|
+
return 0;
|
313
|
+
|
314
|
+
case ZSTD_p_targetLength :
|
315
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
316
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
317
|
+
CLAMPCHECK(value, ZSTD_TARGETLENGTH_MIN, ZSTD_TARGETLENGTH_MAX);
|
318
|
+
ZSTD_cLevelToCParams(cctx);
|
319
|
+
cctx->requestedParams.cParams.targetLength = value;
|
320
|
+
return 0;
|
321
|
+
|
322
|
+
case ZSTD_p_compressionStrategy :
|
323
|
+
if (value == 0) return 0; /* special value : 0 means "don't change anything" */
|
324
|
+
if (cctx->cdict) return ERROR(stage_wrong);
|
325
|
+
CLAMPCHECK(value, (unsigned)ZSTD_fast, (unsigned)ZSTD_btultra);
|
326
|
+
ZSTD_cLevelToCParams(cctx);
|
327
|
+
cctx->requestedParams.cParams.strategy = (ZSTD_strategy)value;
|
328
|
+
return 0;
|
329
|
+
|
330
|
+
case ZSTD_p_contentSizeFlag :
|
331
|
+
DEBUGLOG(5, "set content size flag = %u", (value>0));
|
332
|
+
/* Content size written in frame header _when known_ (default:1) */
|
333
|
+
cctx->requestedParams.fParams.contentSizeFlag = value>0;
|
334
|
+
return 0;
|
335
|
+
|
336
|
+
case ZSTD_p_checksumFlag :
|
337
|
+
/* A 32-bits content checksum will be calculated and written at end of frame (default:0) */
|
338
|
+
cctx->requestedParams.fParams.checksumFlag = value>0;
|
339
|
+
return 0;
|
340
|
+
|
341
|
+
case ZSTD_p_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */
|
342
|
+
DEBUGLOG(5, "set dictIDFlag = %u", (value>0));
|
343
|
+
cctx->requestedParams.fParams.noDictIDFlag = (value==0);
|
344
|
+
return 0;
|
345
|
+
|
346
|
+
/* Dictionary parameters */
|
347
|
+
case ZSTD_p_dictMode :
|
348
|
+
if (cctx->cdict) return ERROR(stage_wrong); /* must be set before loading */
|
349
|
+
/* restrict dictionary mode, to "rawContent" or "fullDict" only */
|
350
|
+
ZSTD_STATIC_ASSERT((U32)ZSTD_dm_fullDict > (U32)ZSTD_dm_rawContent);
|
351
|
+
if (value > (unsigned)ZSTD_dm_fullDict)
|
352
|
+
return ERROR(compressionParameter_outOfBound);
|
353
|
+
cctx->dictMode = (ZSTD_dictMode_e)value;
|
354
|
+
return 0;
|
355
|
+
|
356
|
+
case ZSTD_p_refDictContent :
|
357
|
+
if (cctx->cdict) return ERROR(stage_wrong); /* must be set before loading */
|
358
|
+
/* dictionary content will be referenced, instead of copied */
|
359
|
+
cctx->dictContentByRef = value>0;
|
360
|
+
return 0;
|
361
|
+
|
362
|
+
case ZSTD_p_forceMaxWindow : /* Force back-references to remain < windowSize,
|
363
|
+
* even when referencing into Dictionary content
|
364
|
+
* default : 0 when using a CDict, 1 when using a Prefix */
|
365
|
+
cctx->forceWindow = value>0;
|
366
|
+
cctx->loadedDictEnd = 0;
|
367
|
+
return 0;
|
368
|
+
|
369
|
+
case ZSTD_p_nbThreads:
|
370
|
+
if (value==0) return 0;
|
371
|
+
DEBUGLOG(5, " setting nbThreads : %u", value);
|
372
|
+
#ifndef ZSTD_MULTITHREAD
|
373
|
+
if (value > 1) return ERROR(compressionParameter_unsupported);
|
374
|
+
#endif
|
375
|
+
if ((value>1) && (cctx->nbThreads != value)) {
|
376
|
+
if (cctx->staticSize) /* MT not compatible with static alloc */
|
377
|
+
return ERROR(compressionParameter_unsupported);
|
378
|
+
ZSTDMT_freeCCtx(cctx->mtctx);
|
379
|
+
cctx->nbThreads = 1;
|
380
|
+
cctx->mtctx = ZSTDMT_createCCtx(value);
|
381
|
+
if (cctx->mtctx == NULL) return ERROR(memory_allocation);
|
382
|
+
}
|
383
|
+
cctx->nbThreads = value;
|
384
|
+
return 0;
|
385
|
+
|
386
|
+
case ZSTD_p_jobSize:
|
387
|
+
if (cctx->nbThreads <= 1) return ERROR(compressionParameter_unsupported);
|
388
|
+
assert(cctx->mtctx != NULL);
|
389
|
+
return ZSTDMT_setMTCtxParameter(cctx->mtctx, ZSTDMT_p_sectionSize, value);
|
390
|
+
|
391
|
+
case ZSTD_p_overlapSizeLog:
|
392
|
+
DEBUGLOG(5, " setting overlap with nbThreads == %u", cctx->nbThreads);
|
393
|
+
if (cctx->nbThreads <= 1) return ERROR(compressionParameter_unsupported);
|
394
|
+
assert(cctx->mtctx != NULL);
|
395
|
+
return ZSTDMT_setMTCtxParameter(cctx->mtctx, ZSTDMT_p_overlapSectionLog, value);
|
396
|
+
|
397
|
+
default: return ERROR(parameter_unknown);
|
398
|
+
}
|
399
|
+
}
|
400
|
+
|
401
|
+
ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize)
|
402
|
+
{
|
403
|
+
DEBUGLOG(5, " setting pledgedSrcSize to %u", (U32)pledgedSrcSize);
|
404
|
+
if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
|
405
|
+
cctx->pledgedSrcSizePlusOne = pledgedSrcSize+1;
|
406
|
+
return 0;
|
407
|
+
}
|
408
|
+
|
409
|
+
ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize)
|
410
|
+
{
|
411
|
+
if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
|
412
|
+
if (cctx->staticSize) return ERROR(memory_allocation); /* no malloc for static CCtx */
|
413
|
+
DEBUGLOG(5, "load dictionary of size %u", (U32)dictSize);
|
414
|
+
ZSTD_freeCDict(cctx->cdictLocal); /* in case one already exists */
|
415
|
+
if (dict==NULL || dictSize==0) { /* no dictionary mode */
|
416
|
+
cctx->cdictLocal = NULL;
|
417
|
+
cctx->cdict = NULL;
|
418
|
+
} else {
|
419
|
+
ZSTD_compressionParameters const cParams =
|
420
|
+
cctx->compressionLevel == ZSTD_CLEVEL_CUSTOM ?
|
421
|
+
cctx->requestedParams.cParams :
|
422
|
+
ZSTD_getCParams(cctx->compressionLevel, 0, dictSize);
|
423
|
+
cctx->cdictLocal = ZSTD_createCDict_advanced(
|
424
|
+
dict, dictSize,
|
425
|
+
cctx->dictContentByRef, cctx->dictMode,
|
426
|
+
cParams, cctx->customMem);
|
427
|
+
cctx->cdict = cctx->cdictLocal;
|
428
|
+
if (cctx->cdictLocal == NULL)
|
429
|
+
return ERROR(memory_allocation);
|
430
|
+
}
|
431
|
+
return 0;
|
432
|
+
}
|
433
|
+
|
434
|
+
size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict)
|
435
|
+
{
|
436
|
+
if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
|
437
|
+
cctx->cdict = cdict;
|
438
|
+
cctx->prefix = NULL; /* exclusive */
|
439
|
+
cctx->prefixSize = 0;
|
440
|
+
return 0;
|
441
|
+
}
|
442
|
+
|
443
|
+
size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize)
|
444
|
+
{
|
445
|
+
if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
|
446
|
+
cctx->cdict = NULL; /* prefix discards any prior cdict */
|
447
|
+
cctx->prefix = prefix;
|
448
|
+
cctx->prefixSize = prefixSize;
|
449
|
+
return 0;
|
450
|
+
}
|
451
|
+
|
452
|
+
static void ZSTD_startNewCompression(ZSTD_CCtx* cctx)
|
453
|
+
{
|
454
|
+
cctx->streamStage = zcss_init;
|
455
|
+
cctx->pledgedSrcSizePlusOne = 0;
|
171
456
|
}
|
172
457
|
|
458
|
+
/*! ZSTD_CCtx_reset() :
|
459
|
+
* Also dumps dictionary */
|
460
|
+
void ZSTD_CCtx_reset(ZSTD_CCtx* cctx)
|
461
|
+
{
|
462
|
+
ZSTD_startNewCompression(cctx);
|
463
|
+
cctx->cdict = NULL;
|
464
|
+
}
|
173
465
|
|
174
|
-
/**
|
175
|
-
|
466
|
+
/** ZSTD_checkCParams() :
|
467
|
+
control CParam values remain within authorized range.
|
176
468
|
@return : 0, or an error code if one value is beyond authorized range */
|
177
469
|
size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
|
178
470
|
{
|
179
|
-
# define CLAMPCHECK(val,min,max) { if ((val<min) | (val>max)) return ERROR(compressionParameter_unsupported); }
|
180
471
|
CLAMPCHECK(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
|
181
472
|
CLAMPCHECK(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
|
182
473
|
CLAMPCHECK(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
|
183
474
|
CLAMPCHECK(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
|
184
475
|
CLAMPCHECK(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
|
185
476
|
CLAMPCHECK(cParams.targetLength, ZSTD_TARGETLENGTH_MIN, ZSTD_TARGETLENGTH_MAX);
|
186
|
-
if ((U32)(cParams.strategy) > (U32)
|
477
|
+
if ((U32)(cParams.strategy) > (U32)ZSTD_btultra) return ERROR(compressionParameter_unsupported);
|
187
478
|
return 0;
|
188
479
|
}
|
189
480
|
|
481
|
+
/** ZSTD_clampCParams() :
|
482
|
+
* make CParam values within valid range.
|
483
|
+
* @return : valid CParams */
|
484
|
+
static ZSTD_compressionParameters ZSTD_clampCParams(ZSTD_compressionParameters cParams)
|
485
|
+
{
|
486
|
+
# define CLAMP(val,min,max) { \
|
487
|
+
if (val<min) val=min; \
|
488
|
+
else if (val>max) val=max; \
|
489
|
+
}
|
490
|
+
CLAMP(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
|
491
|
+
CLAMP(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
|
492
|
+
CLAMP(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
|
493
|
+
CLAMP(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
|
494
|
+
CLAMP(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
|
495
|
+
CLAMP(cParams.targetLength, ZSTD_TARGETLENGTH_MIN, ZSTD_TARGETLENGTH_MAX);
|
496
|
+
if ((U32)(cParams.strategy) > (U32)ZSTD_btultra) cParams.strategy = ZSTD_btultra;
|
497
|
+
return cParams;
|
498
|
+
}
|
190
499
|
|
191
500
|
/** ZSTD_cycleLog() :
|
192
501
|
* condition for correct operation : hashLog > 1 */
|
@@ -196,14 +505,15 @@ static U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat)
|
|
196
505
|
return hashLog - btScale;
|
197
506
|
}
|
198
507
|
|
199
|
-
/**
|
508
|
+
/** ZSTD_adjustCParams_internal() :
|
200
509
|
optimize `cPar` for a given input (`srcSize` and `dictSize`).
|
201
510
|
mostly downsizing to reduce memory consumption and initialization.
|
202
511
|
Both `srcSize` and `dictSize` are optional (use 0 if unknown),
|
203
512
|
but if both are 0, no optimization can be done.
|
204
513
|
Note : cPar is considered validated at this stage. Use ZSTD_checkParams() to ensure that. */
|
205
|
-
ZSTD_compressionParameters
|
514
|
+
ZSTD_compressionParameters ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
|
206
515
|
{
|
516
|
+
assert(ZSTD_checkCParams(cPar)==0);
|
207
517
|
if (srcSize+dictSize == 0) return cPar; /* no size information available : no adjustment */
|
208
518
|
|
209
519
|
/* resize params, to use less memory when necessary */
|
@@ -223,10 +533,16 @@ ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, u
|
|
223
533
|
return cPar;
|
224
534
|
}
|
225
535
|
|
536
|
+
ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
|
537
|
+
{
|
538
|
+
cPar = ZSTD_clampCParams(cPar);
|
539
|
+
return ZSTD_adjustCParams_internal(cPar, srcSize, dictSize);
|
540
|
+
}
|
226
541
|
|
227
|
-
|
542
|
+
|
543
|
+
size_t ZSTD_estimateCCtxSize_advanced(ZSTD_compressionParameters cParams)
|
228
544
|
{
|
229
|
-
size_t const blockSize = MIN(
|
545
|
+
size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << cParams.windowLog);
|
230
546
|
U32 const divider = (cParams.searchLength==3) ? 3 : 4;
|
231
547
|
size_t const maxNbSeq = blockSize / divider;
|
232
548
|
size_t const tokenSpace = blockSize + 11*maxNbSeq;
|
@@ -240,31 +556,64 @@ size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams)
|
|
240
556
|
+ entropyScratchSpace_size;
|
241
557
|
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
242
558
|
|
243
|
-
size_t const
|
559
|
+
size_t const optBudget = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits))*sizeof(U32)
|
244
560
|
+ (ZSTD_OPT_NUM+1)*(sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
|
245
|
-
size_t const
|
246
|
-
|
561
|
+
size_t const optSpace = ((cParams.strategy == ZSTD_btopt) || (cParams.strategy == ZSTD_btultra)) ? optBudget : 0;
|
562
|
+
size_t const neededSpace = entropySpace + tableSpace + tokenSpace + optSpace;
|
247
563
|
|
564
|
+
DEBUGLOG(5, "sizeof(ZSTD_CCtx) : %u", (U32)sizeof(ZSTD_CCtx));
|
565
|
+
DEBUGLOG(5, "estimate workSpace : %u", (U32)neededSpace);
|
248
566
|
return sizeof(ZSTD_CCtx) + neededSpace;
|
249
567
|
}
|
250
568
|
|
569
|
+
size_t ZSTD_estimateCCtxSize(int compressionLevel)
|
570
|
+
{
|
571
|
+
ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel, 0, 0);
|
572
|
+
return ZSTD_estimateCCtxSize_advanced(cParams);
|
573
|
+
}
|
251
574
|
|
252
|
-
|
575
|
+
size_t ZSTD_estimateCStreamSize_advanced(ZSTD_compressionParameters cParams)
|
253
576
|
{
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
577
|
+
size_t const CCtxSize = ZSTD_estimateCCtxSize_advanced(cParams);
|
578
|
+
size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << cParams.windowLog);
|
579
|
+
size_t const inBuffSize = ((size_t)1 << cParams.windowLog) + blockSize;
|
580
|
+
size_t const outBuffSize = ZSTD_compressBound(blockSize) + 1;
|
581
|
+
size_t const streamingSize = inBuffSize + outBuffSize;
|
582
|
+
|
583
|
+
return CCtxSize + streamingSize;
|
584
|
+
}
|
585
|
+
|
586
|
+
size_t ZSTD_estimateCStreamSize(int compressionLevel) {
|
587
|
+
ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel, 0, 0);
|
588
|
+
return ZSTD_estimateCStreamSize_advanced(cParams);
|
589
|
+
}
|
590
|
+
|
591
|
+
|
592
|
+
static U32 ZSTD_equivalentParams(ZSTD_compressionParameters cParams1,
|
593
|
+
ZSTD_compressionParameters cParams2)
|
594
|
+
{
|
595
|
+
U32 bslog1 = MIN(cParams1.windowLog, ZSTD_BLOCKSIZELOG_MAX);
|
596
|
+
U32 bslog2 = MIN(cParams2.windowLog, ZSTD_BLOCKSIZELOG_MAX);
|
597
|
+
return (bslog1 == bslog2) /* same block size */
|
598
|
+
& (cParams1.hashLog == cParams2.hashLog)
|
599
|
+
& (cParams1.chainLog == cParams2.chainLog)
|
600
|
+
& (cParams1.strategy == cParams2.strategy) /* opt parser space */
|
601
|
+
& ((cParams1.searchLength==3) == (cParams2.searchLength==3)); /* hashlog3 space */
|
258
602
|
}
|
259
603
|
|
260
604
|
/*! ZSTD_continueCCtx() :
|
261
|
-
|
262
|
-
static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_parameters params, U64
|
605
|
+
* reuse CCtx without reset (note : requires no dictionary) */
|
606
|
+
static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_parameters params, U64 pledgedSrcSize)
|
263
607
|
{
|
264
608
|
U32 const end = (U32)(cctx->nextSrc - cctx->base);
|
265
|
-
|
266
|
-
cctx->
|
609
|
+
DEBUGLOG(5, "continue mode");
|
610
|
+
cctx->appliedParams = params;
|
611
|
+
cctx->pledgedSrcSizePlusOne = pledgedSrcSize+1;
|
267
612
|
cctx->consumedSrcSize = 0;
|
613
|
+
if (pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN)
|
614
|
+
cctx->appliedParams.fParams.contentSizeFlag = 0;
|
615
|
+
DEBUGLOG(5, "pledged content size : %u ; flag : %u",
|
616
|
+
(U32)pledgedSrcSize, cctx->appliedParams.fParams.contentSizeFlag);
|
268
617
|
cctx->lowLimit = end;
|
269
618
|
cctx->dictLimit = end;
|
270
619
|
cctx->nextToUpdate = end+1;
|
@@ -277,30 +626,39 @@ static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_parameters params, U64 fra
|
|
277
626
|
return 0;
|
278
627
|
}
|
279
628
|
|
280
|
-
typedef enum { ZSTDcrp_continue, ZSTDcrp_noMemset
|
629
|
+
typedef enum { ZSTDcrp_continue, ZSTDcrp_noMemset } ZSTD_compResetPolicy_e;
|
630
|
+
typedef enum { ZSTDb_not_buffered, ZSTDb_buffered } ZSTD_buffered_policy_e;
|
281
631
|
|
282
632
|
/*! ZSTD_resetCCtx_internal() :
|
283
|
-
note : `params`
|
284
|
-
static size_t ZSTD_resetCCtx_internal
|
285
|
-
|
286
|
-
|
633
|
+
note : `params` are assumed fully validated at this stage */
|
634
|
+
static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
635
|
+
ZSTD_parameters params, U64 pledgedSrcSize,
|
636
|
+
ZSTD_compResetPolicy_e const crp,
|
637
|
+
ZSTD_buffered_policy_e const zbuff)
|
287
638
|
{
|
288
|
-
|
289
|
-
|
639
|
+
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
|
640
|
+
|
641
|
+
if (crp == ZSTDcrp_continue) {
|
642
|
+
if (ZSTD_equivalentParams(params.cParams, zc->appliedParams.cParams)) {
|
643
|
+
DEBUGLOG(5, "ZSTD_equivalentParams()==1");
|
290
644
|
zc->fseCTables_ready = 0;
|
291
645
|
zc->hufCTable_repeatMode = HUF_repeat_none;
|
292
|
-
return ZSTD_continueCCtx(zc, params,
|
293
|
-
|
646
|
+
return ZSTD_continueCCtx(zc, params, pledgedSrcSize);
|
647
|
+
} }
|
294
648
|
|
295
|
-
{ size_t const blockSize = MIN(
|
649
|
+
{ size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << params.cParams.windowLog);
|
296
650
|
U32 const divider = (params.cParams.searchLength==3) ? 3 : 4;
|
297
651
|
size_t const maxNbSeq = blockSize / divider;
|
298
652
|
size_t const tokenSpace = blockSize + 11*maxNbSeq;
|
299
|
-
size_t const chainSize = (params.cParams.strategy == ZSTD_fast) ?
|
653
|
+
size_t const chainSize = (params.cParams.strategy == ZSTD_fast) ?
|
654
|
+
0 : (1 << params.cParams.chainLog);
|
300
655
|
size_t const hSize = ((size_t)1) << params.cParams.hashLog;
|
301
|
-
U32 const hashLog3 = (params.cParams.searchLength>3) ?
|
656
|
+
U32 const hashLog3 = (params.cParams.searchLength>3) ?
|
657
|
+
0 : MIN(ZSTD_HASHLOG3_MAX, params.cParams.windowLog);
|
302
658
|
size_t const h3Size = ((size_t)1) << hashLog3;
|
303
659
|
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
660
|
+
size_t const buffOutSize = (zbuff==ZSTDb_buffered) ? ZSTD_compressBound(blockSize)+1 : 0;
|
661
|
+
size_t const buffInSize = (zbuff==ZSTDb_buffered) ? ((size_t)1 << params.cParams.windowLog) + blockSize : 0;
|
304
662
|
void* ptr;
|
305
663
|
|
306
664
|
/* Check if workSpace is large enough, alloc a new one if needed */
|
@@ -309,9 +667,20 @@ static size_t ZSTD_resetCCtx_internal (ZSTD_CCtx* zc,
|
|
309
667
|
+ entropyScratchSpace_size;
|
310
668
|
size_t const optPotentialSpace = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits)) * sizeof(U32)
|
311
669
|
+ (ZSTD_OPT_NUM+1) * (sizeof(ZSTD_match_t)+sizeof(ZSTD_optimal_t));
|
312
|
-
size_t const optSpace = ((params.cParams.strategy == ZSTD_btopt)
|
313
|
-
|
314
|
-
|
670
|
+
size_t const optSpace = ( (params.cParams.strategy == ZSTD_btopt)
|
671
|
+
|| (params.cParams.strategy == ZSTD_btultra)) ?
|
672
|
+
optPotentialSpace : 0;
|
673
|
+
size_t const bufferSpace = buffInSize + buffOutSize;
|
674
|
+
size_t const neededSpace = entropySpace + optSpace + tableSpace
|
675
|
+
+ tokenSpace + bufferSpace;
|
676
|
+
|
677
|
+
if (zc->workSpaceSize < neededSpace) { /* too small : resize /*/
|
678
|
+
DEBUGLOG(5, "Need to update workSpaceSize from %uK to %uK \n",
|
679
|
+
(unsigned)zc->workSpaceSize>>10,
|
680
|
+
(unsigned)neededSpace>>10);
|
681
|
+
/* static cctx : no resize, error out */
|
682
|
+
if (zc->staticSize) return ERROR(memory_allocation);
|
683
|
+
|
315
684
|
zc->workSpaceSize = 0;
|
316
685
|
ZSTD_free(zc->workSpace, zc->customMem);
|
317
686
|
zc->workSpace = ZSTD_malloc(neededSpace, zc->customMem);
|
@@ -333,10 +702,14 @@ static size_t ZSTD_resetCCtx_internal (ZSTD_CCtx* zc,
|
|
333
702
|
} }
|
334
703
|
|
335
704
|
/* init params */
|
336
|
-
zc->
|
337
|
-
zc->
|
338
|
-
zc->frameContentSize = frameContentSize;
|
705
|
+
zc->appliedParams = params;
|
706
|
+
zc->pledgedSrcSizePlusOne = pledgedSrcSize+1;
|
339
707
|
zc->consumedSrcSize = 0;
|
708
|
+
if (pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN)
|
709
|
+
zc->appliedParams.fParams.contentSizeFlag = 0;
|
710
|
+
DEBUGLOG(5, "pledged content size : %u ; flag : %u",
|
711
|
+
(U32)pledgedSrcSize, zc->appliedParams.fParams.contentSizeFlag);
|
712
|
+
zc->blockSize = blockSize;
|
340
713
|
|
341
714
|
XXH64_reset(&zc->xxhState, 0);
|
342
715
|
zc->stage = ZSTDcs_init;
|
@@ -363,7 +736,8 @@ static size_t ZSTD_resetCCtx_internal (ZSTD_CCtx* zc,
|
|
363
736
|
ptr = (char*)zc->entropyScratchSpace + entropyScratchSpace_size;
|
364
737
|
|
365
738
|
/* opt parser space */
|
366
|
-
if ((params.cParams.strategy == ZSTD_btopt) || (params.cParams.strategy ==
|
739
|
+
if ((params.cParams.strategy == ZSTD_btopt) || (params.cParams.strategy == ZSTD_btultra)) {
|
740
|
+
DEBUGLOG(5, "reserving optimal parser space");
|
367
741
|
assert(((size_t)ptr & 3) == 0); /* ensure ptr is properly aligned */
|
368
742
|
zc->seqStore.litFreq = (U32*)ptr;
|
369
743
|
zc->seqStore.litLengthFreq = zc->seqStore.litFreq + (1<<Litbits);
|
@@ -391,6 +765,13 @@ static size_t ZSTD_resetCCtx_internal (ZSTD_CCtx* zc,
|
|
391
765
|
zc->seqStore.mlCode = zc->seqStore.llCode + maxNbSeq;
|
392
766
|
zc->seqStore.ofCode = zc->seqStore.mlCode + maxNbSeq;
|
393
767
|
zc->seqStore.litStart = zc->seqStore.ofCode + maxNbSeq;
|
768
|
+
ptr = zc->seqStore.litStart + blockSize;
|
769
|
+
|
770
|
+
/* buffers */
|
771
|
+
zc->inBuffSize = buffInSize;
|
772
|
+
zc->inBuff = (char*)ptr;
|
773
|
+
zc->outBuffSize = buffOutSize;
|
774
|
+
zc->outBuff = zc->inBuff + buffInSize;
|
394
775
|
|
395
776
|
return 0;
|
396
777
|
}
|
@@ -411,21 +792,25 @@ void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx) {
|
|
411
792
|
* Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()).
|
412
793
|
* pledgedSrcSize=0 means "empty" if fParams.contentSizeFlag=1
|
413
794
|
* @return : 0, or an error code */
|
414
|
-
size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx,
|
415
|
-
|
795
|
+
static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx,
|
796
|
+
const ZSTD_CCtx* srcCCtx,
|
797
|
+
ZSTD_frameParameters fParams,
|
798
|
+
unsigned long long pledgedSrcSize,
|
799
|
+
ZSTD_buffered_policy_e zbuff)
|
416
800
|
{
|
801
|
+
DEBUGLOG(5, "ZSTD_copyCCtx_internal");
|
417
802
|
if (srcCCtx->stage!=ZSTDcs_init) return ERROR(stage_wrong);
|
418
803
|
|
419
804
|
memcpy(&dstCCtx->customMem, &srcCCtx->customMem, sizeof(ZSTD_customMem));
|
420
|
-
{ ZSTD_parameters params = srcCCtx->
|
805
|
+
{ ZSTD_parameters params = srcCCtx->appliedParams;
|
421
806
|
params.fParams = fParams;
|
422
|
-
|
423
|
-
|
807
|
+
ZSTD_resetCCtx_internal(dstCCtx, params, pledgedSrcSize,
|
808
|
+
ZSTDcrp_noMemset, zbuff);
|
424
809
|
}
|
425
810
|
|
426
811
|
/* copy tables */
|
427
|
-
{ size_t const chainSize = (srcCCtx->
|
428
|
-
size_t const hSize = (size_t)1 << srcCCtx->
|
812
|
+
{ size_t const chainSize = (srcCCtx->appliedParams.cParams.strategy == ZSTD_fast) ? 0 : (1 << srcCCtx->appliedParams.cParams.chainLog);
|
813
|
+
size_t const hSize = (size_t)1 << srcCCtx->appliedParams.cParams.hashLog;
|
429
814
|
size_t const h3Size = (size_t)1 << srcCCtx->hashLog3;
|
430
815
|
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
431
816
|
assert((U32*)dstCCtx->chainTable == (U32*)dstCCtx->hashTable + hSize); /* chainTable must follow hashTable */
|
@@ -467,9 +852,11 @@ size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx,
|
|
467
852
|
size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx, unsigned long long pledgedSrcSize)
|
468
853
|
{
|
469
854
|
ZSTD_frameParameters fParams = { 1 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ };
|
855
|
+
ZSTD_buffered_policy_e const zbuff = (ZSTD_buffered_policy_e)(srcCCtx->inBuffSize>0);
|
856
|
+
ZSTD_STATIC_ASSERT((U32)ZSTDb_buffered==1);
|
470
857
|
fParams.contentSizeFlag = pledgedSrcSize>0;
|
471
858
|
|
472
|
-
return ZSTD_copyCCtx_internal(dstCCtx, srcCCtx, fParams, pledgedSrcSize);
|
859
|
+
return ZSTD_copyCCtx_internal(dstCCtx, srcCCtx, fParams, pledgedSrcSize, zbuff);
|
473
860
|
}
|
474
861
|
|
475
862
|
|
@@ -488,10 +875,10 @@ static void ZSTD_reduceTable (U32* const table, U32 const size, U32 const reduce
|
|
488
875
|
* rescale all indexes to avoid future overflow (indexes are U32) */
|
489
876
|
static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
|
490
877
|
{
|
491
|
-
{ U32 const hSize = 1 << zc->
|
878
|
+
{ U32 const hSize = 1 << zc->appliedParams.cParams.hashLog;
|
492
879
|
ZSTD_reduceTable(zc->hashTable, hSize, reducerValue); }
|
493
880
|
|
494
|
-
{ U32 const chainSize = (zc->
|
881
|
+
{ U32 const chainSize = (zc->appliedParams.cParams.strategy == ZSTD_fast) ? 0 : (1 << zc->appliedParams.cParams.chainLog);
|
495
882
|
ZSTD_reduceTable(zc->chainTable, chainSize, reducerValue); }
|
496
883
|
|
497
884
|
{ U32 const h3Size = (zc->hashLog3) ? 1 << zc->hashLog3 : 0;
|
@@ -529,10 +916,11 @@ static size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void
|
|
529
916
|
case 2: /* 2 - 2 - 12 */
|
530
917
|
MEM_writeLE16(ostart, (U16)((U32)set_basic + (1<<2) + (srcSize<<4)));
|
531
918
|
break;
|
532
|
-
default: /*note : should not be necessary : flSize is within {1,2,3} */
|
533
919
|
case 3: /* 2 - 2 - 20 */
|
534
920
|
MEM_writeLE32(ostart, (U32)((U32)set_basic + (3<<2) + (srcSize<<4)));
|
535
921
|
break;
|
922
|
+
default: /* not necessary : flSize is {1,2,3} */
|
923
|
+
assert(0);
|
536
924
|
}
|
537
925
|
|
538
926
|
memcpy(ostart + flSize, src, srcSize);
|
@@ -554,10 +942,11 @@ static size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, cons
|
|
554
942
|
case 2: /* 2 - 2 - 12 */
|
555
943
|
MEM_writeLE16(ostart, (U16)((U32)set_rle + (1<<2) + (srcSize<<4)));
|
556
944
|
break;
|
557
|
-
default: /*note : should not be necessary : flSize is necessarily within {1,2,3} */
|
558
945
|
case 3: /* 2 - 2 - 20 */
|
559
946
|
MEM_writeLE32(ostart, (U32)((U32)set_rle + (3<<2) + (srcSize<<4)));
|
560
947
|
break;
|
948
|
+
default: /* not necessary : flSize is {1,2,3} */
|
949
|
+
assert(0);
|
561
950
|
}
|
562
951
|
|
563
952
|
ostart[flSize] = *(const BYTE*)src;
|
@@ -587,7 +976,7 @@ static size_t ZSTD_compressLiterals (ZSTD_CCtx* zc,
|
|
587
976
|
|
588
977
|
if (dstCapacity < lhSize+1) return ERROR(dstSize_tooSmall); /* not enough space for compression */
|
589
978
|
{ HUF_repeat repeat = zc->hufCTable_repeatMode;
|
590
|
-
int const preferRepeat = zc->
|
979
|
+
int const preferRepeat = zc->appliedParams.cParams.strategy < ZSTD_lazy ? srcSize <= 1024 : 0;
|
591
980
|
if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1;
|
592
981
|
cLitSize = singleStream ? HUF_compress1X_repeat(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11,
|
593
982
|
zc->entropyScratchSpace, entropyScratchSpace_size, zc->hufCTable, &repeat, preferRepeat)
|
@@ -619,13 +1008,14 @@ static size_t ZSTD_compressLiterals (ZSTD_CCtx* zc,
|
|
619
1008
|
MEM_writeLE32(ostart, lhc);
|
620
1009
|
break;
|
621
1010
|
}
|
622
|
-
default: /* should not be necessary, lhSize is only {3,4,5} */
|
623
1011
|
case 5: /* 2 - 2 - 18 - 18 */
|
624
1012
|
{ U32 const lhc = hType + (3 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<22);
|
625
1013
|
MEM_writeLE32(ostart, lhc);
|
626
1014
|
ostart[4] = (BYTE)(cLitSize >> 10);
|
627
1015
|
break;
|
628
1016
|
}
|
1017
|
+
default: /* not possible : lhSize is {3,4,5} */
|
1018
|
+
assert(0);
|
629
1019
|
}
|
630
1020
|
return lhSize+cLitSize;
|
631
1021
|
}
|
@@ -676,7 +1066,7 @@ MEM_STATIC size_t ZSTD_compressSequences (ZSTD_CCtx* zc,
|
|
676
1066
|
void* dst, size_t dstCapacity,
|
677
1067
|
size_t srcSize)
|
678
1068
|
{
|
679
|
-
const int longOffsets = zc->
|
1069
|
+
const int longOffsets = zc->appliedParams.cParams.windowLog > STREAM_ACCUMULATOR_MIN;
|
680
1070
|
const seqStore_t* seqStorePtr = &(zc->seqStore);
|
681
1071
|
U32 count[MaxSeq+1];
|
682
1072
|
S16 norm[MaxSeq+1];
|
@@ -881,12 +1271,6 @@ _check_compressibility:
|
|
881
1271
|
return op - ostart;
|
882
1272
|
}
|
883
1273
|
|
884
|
-
#if 0 /* for debug */
|
885
|
-
# define STORESEQ_DEBUG
|
886
|
-
#include <stdio.h> /* fprintf */
|
887
|
-
U32 g_startDebug = 0;
|
888
|
-
const BYTE* g_start = NULL;
|
889
|
-
#endif
|
890
1274
|
|
891
1275
|
/*! ZSTD_storeSeq() :
|
892
1276
|
Store a sequence (literal length, literals, offset code and match length code) into seqStore_t.
|
@@ -895,16 +1279,16 @@ const BYTE* g_start = NULL;
|
|
895
1279
|
*/
|
896
1280
|
MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const void* literals, U32 offsetCode, size_t matchCode)
|
897
1281
|
{
|
898
|
-
#
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
}
|
1282
|
+
#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG >= 6)
|
1283
|
+
static const BYTE* g_start = NULL;
|
1284
|
+
U32 const pos = (U32)((const BYTE*)literals - g_start);
|
1285
|
+
if (g_start==NULL) g_start = (const BYTE*)literals;
|
1286
|
+
if ((pos > 0) && (pos < 1000000000))
|
1287
|
+
DEBUGLOG(6, "Cpos %6u :%5u literals & match %3u bytes at distance %6u",
|
1288
|
+
pos, (U32)litLength, (U32)matchCode+MINMATCH, (U32)offsetCode);
|
906
1289
|
#endif
|
907
1290
|
/* copy Literals */
|
1291
|
+
assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + 128 KB);
|
908
1292
|
ZSTD_wildcopy(seqStorePtr->lit, literals, litLength);
|
909
1293
|
seqStorePtr->lit += litLength;
|
910
1294
|
|
@@ -1078,7 +1462,7 @@ static size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
|
|
1078
1462
|
static void ZSTD_fillHashTable (ZSTD_CCtx* zc, const void* end, const U32 mls)
|
1079
1463
|
{
|
1080
1464
|
U32* const hashTable = zc->hashTable;
|
1081
|
-
U32 const hBits = zc->
|
1465
|
+
U32 const hBits = zc->appliedParams.cParams.hashLog;
|
1082
1466
|
const BYTE* const base = zc->base;
|
1083
1467
|
const BYTE* ip = base + zc->nextToUpdate;
|
1084
1468
|
const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE;
|
@@ -1097,7 +1481,7 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
|
|
1097
1481
|
const U32 mls)
|
1098
1482
|
{
|
1099
1483
|
U32* const hashTable = cctx->hashTable;
|
1100
|
-
U32 const hBits = cctx->
|
1484
|
+
U32 const hBits = cctx->appliedParams.cParams.hashLog;
|
1101
1485
|
seqStore_t* seqStorePtr = &(cctx->seqStore);
|
1102
1486
|
const BYTE* const base = cctx->base;
|
1103
1487
|
const BYTE* const istart = (const BYTE*)src;
|
@@ -1182,7 +1566,7 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
|
|
1182
1566
|
static void ZSTD_compressBlock_fast(ZSTD_CCtx* ctx,
|
1183
1567
|
const void* src, size_t srcSize)
|
1184
1568
|
{
|
1185
|
-
const U32 mls = ctx->
|
1569
|
+
const U32 mls = ctx->appliedParams.cParams.searchLength;
|
1186
1570
|
switch(mls)
|
1187
1571
|
{
|
1188
1572
|
default: /* includes case 3 */
|
@@ -1203,7 +1587,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1203
1587
|
const U32 mls)
|
1204
1588
|
{
|
1205
1589
|
U32* hashTable = ctx->hashTable;
|
1206
|
-
const U32 hBits = ctx->
|
1590
|
+
const U32 hBits = ctx->appliedParams.cParams.hashLog;
|
1207
1591
|
seqStore_t* seqStorePtr = &(ctx->seqStore);
|
1208
1592
|
const BYTE* const base = ctx->base;
|
1209
1593
|
const BYTE* const dictBase = ctx->dictBase;
|
@@ -1296,7 +1680,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1296
1680
|
static void ZSTD_compressBlock_fast_extDict(ZSTD_CCtx* ctx,
|
1297
1681
|
const void* src, size_t srcSize)
|
1298
1682
|
{
|
1299
|
-
U32 const mls = ctx->
|
1683
|
+
U32 const mls = ctx->appliedParams.cParams.searchLength;
|
1300
1684
|
switch(mls)
|
1301
1685
|
{
|
1302
1686
|
default: /* includes case 3 */
|
@@ -1318,9 +1702,9 @@ static void ZSTD_compressBlock_fast_extDict(ZSTD_CCtx* ctx,
|
|
1318
1702
|
static void ZSTD_fillDoubleHashTable (ZSTD_CCtx* cctx, const void* end, const U32 mls)
|
1319
1703
|
{
|
1320
1704
|
U32* const hashLarge = cctx->hashTable;
|
1321
|
-
U32 const hBitsL = cctx->
|
1705
|
+
U32 const hBitsL = cctx->appliedParams.cParams.hashLog;
|
1322
1706
|
U32* const hashSmall = cctx->chainTable;
|
1323
|
-
U32 const hBitsS = cctx->
|
1707
|
+
U32 const hBitsS = cctx->appliedParams.cParams.chainLog;
|
1324
1708
|
const BYTE* const base = cctx->base;
|
1325
1709
|
const BYTE* ip = base + cctx->nextToUpdate;
|
1326
1710
|
const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE;
|
@@ -1340,9 +1724,9 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
|
|
1340
1724
|
const U32 mls)
|
1341
1725
|
{
|
1342
1726
|
U32* const hashLong = cctx->hashTable;
|
1343
|
-
const U32 hBitsL = cctx->
|
1727
|
+
const U32 hBitsL = cctx->appliedParams.cParams.hashLog;
|
1344
1728
|
U32* const hashSmall = cctx->chainTable;
|
1345
|
-
const U32 hBitsS = cctx->
|
1729
|
+
const U32 hBitsS = cctx->appliedParams.cParams.chainLog;
|
1346
1730
|
seqStore_t* seqStorePtr = &(cctx->seqStore);
|
1347
1731
|
const BYTE* const base = cctx->base;
|
1348
1732
|
const BYTE* const istart = (const BYTE*)src;
|
@@ -1452,7 +1836,7 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
|
|
1452
1836
|
|
1453
1837
|
static void ZSTD_compressBlock_doubleFast(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
|
1454
1838
|
{
|
1455
|
-
const U32 mls = ctx->
|
1839
|
+
const U32 mls = ctx->appliedParams.cParams.searchLength;
|
1456
1840
|
switch(mls)
|
1457
1841
|
{
|
1458
1842
|
default: /* includes case 3 */
|
@@ -1473,9 +1857,9 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1473
1857
|
const U32 mls)
|
1474
1858
|
{
|
1475
1859
|
U32* const hashLong = ctx->hashTable;
|
1476
|
-
U32 const hBitsL = ctx->
|
1860
|
+
U32 const hBitsL = ctx->appliedParams.cParams.hashLog;
|
1477
1861
|
U32* const hashSmall = ctx->chainTable;
|
1478
|
-
U32 const hBitsS = ctx->
|
1862
|
+
U32 const hBitsS = ctx->appliedParams.cParams.chainLog;
|
1479
1863
|
seqStore_t* seqStorePtr = &(ctx->seqStore);
|
1480
1864
|
const BYTE* const base = ctx->base;
|
1481
1865
|
const BYTE* const dictBase = ctx->dictBase;
|
@@ -1602,7 +1986,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1602
1986
|
static void ZSTD_compressBlock_doubleFast_extDict(ZSTD_CCtx* ctx,
|
1603
1987
|
const void* src, size_t srcSize)
|
1604
1988
|
{
|
1605
|
-
U32 const mls = ctx->
|
1989
|
+
U32 const mls = ctx->appliedParams.cParams.searchLength;
|
1606
1990
|
switch(mls)
|
1607
1991
|
{
|
1608
1992
|
default: /* includes case 3 */
|
@@ -1628,10 +2012,10 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co
|
|
1628
2012
|
U32 extDict)
|
1629
2013
|
{
|
1630
2014
|
U32* const hashTable = zc->hashTable;
|
1631
|
-
U32 const hashLog = zc->
|
2015
|
+
U32 const hashLog = zc->appliedParams.cParams.hashLog;
|
1632
2016
|
size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
|
1633
2017
|
U32* const bt = zc->chainTable;
|
1634
|
-
U32 const btLog = zc->
|
2018
|
+
U32 const btLog = zc->appliedParams.cParams.chainLog - 1;
|
1635
2019
|
U32 const btMask = (1 << btLog) - 1;
|
1636
2020
|
U32 matchIndex = hashTable[h];
|
1637
2021
|
size_t commonLengthSmaller=0, commonLengthLarger=0;
|
@@ -1733,10 +2117,10 @@ static size_t ZSTD_insertBtAndFindBestMatch (
|
|
1733
2117
|
U32 extDict)
|
1734
2118
|
{
|
1735
2119
|
U32* const hashTable = zc->hashTable;
|
1736
|
-
U32 const hashLog = zc->
|
2120
|
+
U32 const hashLog = zc->appliedParams.cParams.hashLog;
|
1737
2121
|
size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
|
1738
2122
|
U32* const bt = zc->chainTable;
|
1739
|
-
U32 const btLog = zc->
|
2123
|
+
U32 const btLog = zc->appliedParams.cParams.chainLog - 1;
|
1740
2124
|
U32 const btMask = (1 << btLog) - 1;
|
1741
2125
|
U32 matchIndex = hashTable[h];
|
1742
2126
|
size_t commonLengthSmaller=0, commonLengthLarger=0;
|
@@ -1896,9 +2280,9 @@ FORCE_INLINE
|
|
1896
2280
|
U32 ZSTD_insertAndFindFirstIndex (ZSTD_CCtx* zc, const BYTE* ip, U32 mls)
|
1897
2281
|
{
|
1898
2282
|
U32* const hashTable = zc->hashTable;
|
1899
|
-
const U32 hashLog = zc->
|
2283
|
+
const U32 hashLog = zc->appliedParams.cParams.hashLog;
|
1900
2284
|
U32* const chainTable = zc->chainTable;
|
1901
|
-
const U32 chainMask = (1 << zc->
|
2285
|
+
const U32 chainMask = (1 << zc->appliedParams.cParams.chainLog) - 1;
|
1902
2286
|
const BYTE* const base = zc->base;
|
1903
2287
|
const U32 target = (U32)(ip - base);
|
1904
2288
|
U32 idx = zc->nextToUpdate;
|
@@ -1915,8 +2299,8 @@ U32 ZSTD_insertAndFindFirstIndex (ZSTD_CCtx* zc, const BYTE* ip, U32 mls)
|
|
1915
2299
|
}
|
1916
2300
|
|
1917
2301
|
|
1918
|
-
|
1919
|
-
FORCE_INLINE
|
2302
|
+
/* inlining is important to hardwire a hot branch (template emulation) */
|
2303
|
+
FORCE_INLINE
|
1920
2304
|
size_t ZSTD_HcFindBestMatch_generic (
|
1921
2305
|
ZSTD_CCtx* zc, /* Index table will be updated */
|
1922
2306
|
const BYTE* const ip, const BYTE* const iLimit,
|
@@ -1924,7 +2308,7 @@ size_t ZSTD_HcFindBestMatch_generic (
|
|
1924
2308
|
const U32 maxNbAttempts, const U32 mls, const U32 extDict)
|
1925
2309
|
{
|
1926
2310
|
U32* const chainTable = zc->chainTable;
|
1927
|
-
const U32 chainSize = (1 << zc->
|
2311
|
+
const U32 chainSize = (1 << zc->appliedParams.cParams.chainLog);
|
1928
2312
|
const U32 chainMask = chainSize-1;
|
1929
2313
|
const BYTE* const base = zc->base;
|
1930
2314
|
const BYTE* const dictBase = zc->dictBase;
|
@@ -2018,8 +2402,8 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
|
|
2018
2402
|
const BYTE* const ilimit = iend - 8;
|
2019
2403
|
const BYTE* const base = ctx->base + ctx->dictLimit;
|
2020
2404
|
|
2021
|
-
U32 const maxSearches = 1 << ctx->
|
2022
|
-
U32 const mls = ctx->
|
2405
|
+
U32 const maxSearches = 1 << ctx->appliedParams.cParams.searchLog;
|
2406
|
+
U32 const mls = ctx->appliedParams.cParams.searchLength;
|
2023
2407
|
|
2024
2408
|
typedef size_t (*searchMax_f)(ZSTD_CCtx* zc, const BYTE* ip, const BYTE* iLimit,
|
2025
2409
|
size_t* offsetPtr,
|
@@ -2101,15 +2485,19 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
|
|
2101
2485
|
break; /* nothing found : store previous solution */
|
2102
2486
|
}
|
2103
2487
|
|
2488
|
+
/* NOTE:
|
2489
|
+
* start[-offset+ZSTD_REP_MOVE-1] is undefined behavior.
|
2490
|
+
* (-offset+ZSTD_REP_MOVE-1) is unsigned, and is added to start, which
|
2491
|
+
* overflows the pointer, which is undefined behavior.
|
2492
|
+
*/
|
2104
2493
|
/* catch up */
|
2105
2494
|
if (offset) {
|
2106
2495
|
while ( (start > anchor)
|
2107
2496
|
&& (start > base+offset-ZSTD_REP_MOVE)
|
2108
|
-
&& (start[-1] == start
|
2497
|
+
&& (start[-1] == (start-offset+ZSTD_REP_MOVE)[-1]) ) /* only search for offset within prefix */
|
2109
2498
|
{ start--; matchLength++; }
|
2110
2499
|
offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE);
|
2111
2500
|
}
|
2112
|
-
|
2113
2501
|
/* store sequence */
|
2114
2502
|
_storeSequence:
|
2115
2503
|
{ size_t const litLength = start - anchor;
|
@@ -2182,8 +2570,8 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
|
|
2182
2570
|
const BYTE* const dictEnd = dictBase + dictLimit;
|
2183
2571
|
const BYTE* const dictStart = dictBase + ctx->lowLimit;
|
2184
2572
|
|
2185
|
-
const U32 maxSearches = 1 << ctx->
|
2186
|
-
const U32 mls = ctx->
|
2573
|
+
const U32 maxSearches = 1 << ctx->appliedParams.cParams.searchLog;
|
2574
|
+
const U32 mls = ctx->appliedParams.cParams.searchLength;
|
2187
2575
|
|
2188
2576
|
typedef size_t (*searchMax_f)(ZSTD_CCtx* zc, const BYTE* ip, const BYTE* iLimit,
|
2189
2577
|
size_t* offsetPtr,
|
@@ -2370,7 +2758,7 @@ static void ZSTD_compressBlock_btopt(ZSTD_CCtx* ctx, const void* src, size_t src
|
|
2370
2758
|
#endif
|
2371
2759
|
}
|
2372
2760
|
|
2373
|
-
static void
|
2761
|
+
static void ZSTD_compressBlock_btultra(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
|
2374
2762
|
{
|
2375
2763
|
#ifdef ZSTD_OPT_H_91842398743
|
2376
2764
|
ZSTD_compressBlock_opt_generic(ctx, src, srcSize, 1);
|
@@ -2390,7 +2778,7 @@ static void ZSTD_compressBlock_btopt_extDict(ZSTD_CCtx* ctx, const void* src, si
|
|
2390
2778
|
#endif
|
2391
2779
|
}
|
2392
2780
|
|
2393
|
-
static void
|
2781
|
+
static void ZSTD_compressBlock_btultra_extDict(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
|
2394
2782
|
{
|
2395
2783
|
#ifdef ZSTD_OPT_H_91842398743
|
2396
2784
|
ZSTD_compressBlock_opt_extDict_generic(ctx, src, srcSize, 1);
|
@@ -2401,26 +2789,32 @@ static void ZSTD_compressBlock_btopt2_extDict(ZSTD_CCtx* ctx, const void* src, s
|
|
2401
2789
|
}
|
2402
2790
|
|
2403
2791
|
|
2792
|
+
/* ZSTD_selectBlockCompressor() :
|
2793
|
+
* assumption : strat is a valid strategy */
|
2404
2794
|
typedef void (*ZSTD_blockCompressor) (ZSTD_CCtx* ctx, const void* src, size_t srcSize);
|
2405
|
-
|
2406
2795
|
static ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int extDict)
|
2407
2796
|
{
|
2408
|
-
static const ZSTD_blockCompressor blockCompressor[2][
|
2409
|
-
{ ZSTD_compressBlock_fast
|
2797
|
+
static const ZSTD_blockCompressor blockCompressor[2][(unsigned)ZSTD_btultra+1] = {
|
2798
|
+
{ ZSTD_compressBlock_fast /* default for 0 */,
|
2799
|
+
ZSTD_compressBlock_fast, ZSTD_compressBlock_doubleFast, ZSTD_compressBlock_greedy,
|
2410
2800
|
ZSTD_compressBlock_lazy, ZSTD_compressBlock_lazy2, ZSTD_compressBlock_btlazy2,
|
2411
|
-
ZSTD_compressBlock_btopt,
|
2412
|
-
{ ZSTD_compressBlock_fast_extDict
|
2801
|
+
ZSTD_compressBlock_btopt, ZSTD_compressBlock_btultra },
|
2802
|
+
{ ZSTD_compressBlock_fast_extDict /* default for 0 */,
|
2803
|
+
ZSTD_compressBlock_fast_extDict, ZSTD_compressBlock_doubleFast_extDict, ZSTD_compressBlock_greedy_extDict,
|
2413
2804
|
ZSTD_compressBlock_lazy_extDict,ZSTD_compressBlock_lazy2_extDict, ZSTD_compressBlock_btlazy2_extDict,
|
2414
|
-
ZSTD_compressBlock_btopt_extDict,
|
2805
|
+
ZSTD_compressBlock_btopt_extDict, ZSTD_compressBlock_btultra_extDict }
|
2415
2806
|
};
|
2807
|
+
ZSTD_STATIC_ASSERT((unsigned)ZSTD_fast == 1);
|
2808
|
+
assert((U32)strat >= (U32)ZSTD_fast);
|
2809
|
+
assert((U32)strat <= (U32)ZSTD_btultra);
|
2416
2810
|
|
2417
|
-
return blockCompressor[extDict][(U32)strat];
|
2811
|
+
return blockCompressor[extDict!=0][(U32)strat];
|
2418
2812
|
}
|
2419
2813
|
|
2420
2814
|
|
2421
2815
|
static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
2422
2816
|
{
|
2423
|
-
ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->
|
2817
|
+
ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->appliedParams.cParams.strategy, zc->lowLimit < zc->dictLimit);
|
2424
2818
|
const BYTE* const base = zc->base;
|
2425
2819
|
const BYTE* const istart = (const BYTE*)src;
|
2426
2820
|
const U32 current = (U32)(istart-base);
|
@@ -2433,14 +2827,14 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCa
|
|
2433
2827
|
}
|
2434
2828
|
|
2435
2829
|
|
2436
|
-
/*!
|
2830
|
+
/*! ZSTD_compress_frameChunk() :
|
2437
2831
|
* Compress a chunk of data into one or multiple blocks.
|
2438
2832
|
* All blocks will be terminated, all input will be consumed.
|
2439
2833
|
* Function will issue an error if there is not enough `dstCapacity` to hold the compressed content.
|
2440
2834
|
* Frame is supposed already started (header already produced)
|
2441
2835
|
* @return : compressed size, or an error code
|
2442
2836
|
*/
|
2443
|
-
static size_t
|
2837
|
+
static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
|
2444
2838
|
void* dst, size_t dstCapacity,
|
2445
2839
|
const void* src, size_t srcSize,
|
2446
2840
|
U32 lastFrameChunk)
|
@@ -2450,9 +2844,9 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
|
|
2450
2844
|
const BYTE* ip = (const BYTE*)src;
|
2451
2845
|
BYTE* const ostart = (BYTE*)dst;
|
2452
2846
|
BYTE* op = ostart;
|
2453
|
-
U32 const maxDist = 1 << cctx->
|
2847
|
+
U32 const maxDist = 1 << cctx->appliedParams.cParams.windowLog;
|
2454
2848
|
|
2455
|
-
if (cctx->
|
2849
|
+
if (cctx->appliedParams.fParams.checksumFlag && srcSize)
|
2456
2850
|
XXH64_update(&cctx->xxhState, src, srcSize);
|
2457
2851
|
|
2458
2852
|
while (remaining) {
|
@@ -2465,9 +2859,9 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
|
|
2465
2859
|
|
2466
2860
|
/* preemptive overflow correction */
|
2467
2861
|
if (cctx->lowLimit > (3U<<29)) {
|
2468
|
-
U32 const cycleMask = (1 << ZSTD_cycleLog(cctx->
|
2862
|
+
U32 const cycleMask = (1 << ZSTD_cycleLog(cctx->appliedParams.cParams.hashLog, cctx->appliedParams.cParams.strategy)) - 1;
|
2469
2863
|
U32 const current = (U32)(ip - cctx->base);
|
2470
|
-
U32 const newCurrent = (current & cycleMask) + (1 << cctx->
|
2864
|
+
U32 const newCurrent = (current & cycleMask) + (1 << cctx->appliedParams.cParams.windowLog);
|
2471
2865
|
U32 const correction = current - newCurrent;
|
2472
2866
|
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_64 <= 30);
|
2473
2867
|
ZSTD_reduceIndex(cctx, correction);
|
@@ -2522,22 +2916,20 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
|
|
2522
2916
|
U32 const singleSegment = params.fParams.contentSizeFlag && (windowSize >= pledgedSrcSize);
|
2523
2917
|
BYTE const windowLogByte = (BYTE)((params.cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN) << 3);
|
2524
2918
|
U32 const fcsCode = params.fParams.contentSizeFlag ?
|
2525
|
-
(pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256) + (pledgedSrcSize>=0xFFFFFFFFU) :
|
2526
|
-
0;
|
2919
|
+
(pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256) + (pledgedSrcSize>=0xFFFFFFFFU) : 0; /* 0-3 */
|
2527
2920
|
BYTE const frameHeaderDecriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag<<2) + (singleSegment<<5) + (fcsCode<<6) );
|
2528
2921
|
size_t pos;
|
2529
2922
|
|
2530
2923
|
if (dstCapacity < ZSTD_frameHeaderSize_max) return ERROR(dstSize_tooSmall);
|
2531
|
-
DEBUGLOG(5, "ZSTD_writeFrameHeader : dictIDFlag : %u
|
2532
|
-
|
2533
|
-
DEBUGLOG(5, "ZSTD_writeFrameHeader : dictIDSizeCode : %u \n", dictIDSizeCode);
|
2924
|
+
DEBUGLOG(5, "ZSTD_writeFrameHeader : dictIDFlag : %u ; dictID : %u ; dictIDSizeCode : %u",
|
2925
|
+
!params.fParams.noDictIDFlag, dictID, dictIDSizeCode);
|
2534
2926
|
|
2535
2927
|
MEM_writeLE32(dst, ZSTD_MAGICNUMBER);
|
2536
2928
|
op[4] = frameHeaderDecriptionByte; pos=5;
|
2537
2929
|
if (!singleSegment) op[pos++] = windowLogByte;
|
2538
2930
|
switch(dictIDSizeCode)
|
2539
2931
|
{
|
2540
|
-
default:
|
2932
|
+
default: assert(0); /* impossible */
|
2541
2933
|
case 0 : break;
|
2542
2934
|
case 1 : op[pos] = (BYTE)(dictID); pos++; break;
|
2543
2935
|
case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break;
|
@@ -2545,7 +2937,7 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
|
|
2545
2937
|
}
|
2546
2938
|
switch(fcsCode)
|
2547
2939
|
{
|
2548
|
-
default:
|
2940
|
+
default: assert(0); /* impossible */
|
2549
2941
|
case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break;
|
2550
2942
|
case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break;
|
2551
2943
|
case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break;
|
@@ -2563,10 +2955,13 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|
2563
2955
|
const BYTE* const ip = (const BYTE*) src;
|
2564
2956
|
size_t fhSize = 0;
|
2565
2957
|
|
2958
|
+
DEBUGLOG(5, "ZSTD_compressContinue_internal");
|
2959
|
+
DEBUGLOG(5, "stage: %u", cctx->stage);
|
2566
2960
|
if (cctx->stage==ZSTDcs_created) return ERROR(stage_wrong); /* missing init (ZSTD_compressBegin) */
|
2567
2961
|
|
2568
2962
|
if (frame && (cctx->stage==ZSTDcs_init)) {
|
2569
|
-
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->
|
2963
|
+
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->appliedParams,
|
2964
|
+
cctx->pledgedSrcSizePlusOne-1, cctx->dictID);
|
2570
2965
|
if (ZSTD_isError(fhSize)) return fhSize;
|
2571
2966
|
dstCapacity -= fhSize;
|
2572
2967
|
dst = (char*)dst + fhSize;
|
@@ -2596,7 +2991,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|
2596
2991
|
|
2597
2992
|
if (srcSize) {
|
2598
2993
|
size_t const cSize = frame ?
|
2599
|
-
|
2994
|
+
ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) :
|
2600
2995
|
ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize);
|
2601
2996
|
if (ZSTD_isError(cSize)) return cSize;
|
2602
2997
|
cctx->consumedSrcSize += srcSize;
|
@@ -2614,14 +3009,18 @@ size_t ZSTD_compressContinue (ZSTD_CCtx* cctx,
|
|
2614
3009
|
}
|
2615
3010
|
|
2616
3011
|
|
2617
|
-
size_t
|
3012
|
+
size_t ZSTD_getBlockSize(const ZSTD_CCtx* cctx)
|
2618
3013
|
{
|
2619
|
-
|
3014
|
+
U32 const cLevel = cctx->compressionLevel;
|
3015
|
+
ZSTD_compressionParameters cParams = (cLevel == ZSTD_CLEVEL_CUSTOM) ?
|
3016
|
+
cctx->appliedParams.cParams :
|
3017
|
+
ZSTD_getCParams(cLevel, 0, 0);
|
3018
|
+
return MIN (ZSTD_BLOCKSIZE_MAX, 1 << cParams.windowLog);
|
2620
3019
|
}
|
2621
3020
|
|
2622
3021
|
size_t ZSTD_compressBlock(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
2623
3022
|
{
|
2624
|
-
size_t const blockSizeMax =
|
3023
|
+
size_t const blockSizeMax = ZSTD_getBlockSize(cctx);
|
2625
3024
|
if (srcSize > blockSizeMax) return ERROR(srcSize_wrong);
|
2626
3025
|
return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 0 /* frame mode */, 0 /* last chunk */);
|
2627
3026
|
}
|
@@ -2645,32 +3044,32 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_CCtx* zc, const void* src, size_t
|
|
2645
3044
|
zc->nextSrc = iend;
|
2646
3045
|
if (srcSize <= HASH_READ_SIZE) return 0;
|
2647
3046
|
|
2648
|
-
switch(zc->
|
3047
|
+
switch(zc->appliedParams.cParams.strategy)
|
2649
3048
|
{
|
2650
3049
|
case ZSTD_fast:
|
2651
|
-
ZSTD_fillHashTable (zc, iend, zc->
|
3050
|
+
ZSTD_fillHashTable (zc, iend, zc->appliedParams.cParams.searchLength);
|
2652
3051
|
break;
|
2653
3052
|
|
2654
3053
|
case ZSTD_dfast:
|
2655
|
-
ZSTD_fillDoubleHashTable (zc, iend, zc->
|
3054
|
+
ZSTD_fillDoubleHashTable (zc, iend, zc->appliedParams.cParams.searchLength);
|
2656
3055
|
break;
|
2657
3056
|
|
2658
3057
|
case ZSTD_greedy:
|
2659
3058
|
case ZSTD_lazy:
|
2660
3059
|
case ZSTD_lazy2:
|
2661
3060
|
if (srcSize >= HASH_READ_SIZE)
|
2662
|
-
ZSTD_insertAndFindFirstIndex(zc, iend-HASH_READ_SIZE, zc->
|
3061
|
+
ZSTD_insertAndFindFirstIndex(zc, iend-HASH_READ_SIZE, zc->appliedParams.cParams.searchLength);
|
2663
3062
|
break;
|
2664
3063
|
|
2665
3064
|
case ZSTD_btlazy2:
|
2666
3065
|
case ZSTD_btopt:
|
2667
|
-
case
|
3066
|
+
case ZSTD_btultra:
|
2668
3067
|
if (srcSize >= HASH_READ_SIZE)
|
2669
|
-
ZSTD_updateTree(zc, iend-HASH_READ_SIZE, iend, 1 << zc->
|
3068
|
+
ZSTD_updateTree(zc, iend-HASH_READ_SIZE, iend, 1 << zc->appliedParams.cParams.searchLog, zc->appliedParams.cParams.searchLength);
|
2670
3069
|
break;
|
2671
3070
|
|
2672
3071
|
default:
|
2673
|
-
|
3072
|
+
assert(0); /* not possible : not a valid strategy id */
|
2674
3073
|
}
|
2675
3074
|
|
2676
3075
|
zc->nextToUpdate = (U32)(iend - zc->base);
|
@@ -2710,7 +3109,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx* cctx, const void* dict, size_t
|
|
2710
3109
|
BYTE scratchBuffer[1<<MAX(MLFSELog,LLFSELog)];
|
2711
3110
|
|
2712
3111
|
dictPtr += 4; /* skip magic number */
|
2713
|
-
cctx->dictID = cctx->
|
3112
|
+
cctx->dictID = cctx->appliedParams.fParams.noDictIDFlag ? 0 : MEM_readLE32(dictPtr);
|
2714
3113
|
dictPtr += 4;
|
2715
3114
|
|
2716
3115
|
{ size_t const hufHeaderSize = HUF_readCTable(cctx->hufCTable, 255, dictPtr, dictEnd-dictPtr);
|
@@ -2781,28 +3180,56 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx* cctx, const void* dict, size_t
|
|
2781
3180
|
|
2782
3181
|
/** ZSTD_compress_insertDictionary() :
|
2783
3182
|
* @return : 0, or an error code */
|
2784
|
-
static size_t ZSTD_compress_insertDictionary(ZSTD_CCtx* cctx,
|
3183
|
+
static size_t ZSTD_compress_insertDictionary(ZSTD_CCtx* cctx,
|
3184
|
+
const void* dict, size_t dictSize,
|
3185
|
+
ZSTD_dictMode_e dictMode)
|
2785
3186
|
{
|
3187
|
+
DEBUGLOG(5, "ZSTD_compress_insertDictionary");
|
2786
3188
|
if ((dict==NULL) || (dictSize<=8)) return 0;
|
2787
3189
|
|
2788
|
-
/* dict
|
2789
|
-
if (
|
3190
|
+
/* dict restricted modes */
|
3191
|
+
if (dictMode==ZSTD_dm_rawContent)
|
2790
3192
|
return ZSTD_loadDictionaryContent(cctx, dict, dictSize);
|
2791
3193
|
|
2792
|
-
|
3194
|
+
if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) {
|
3195
|
+
if (dictMode == ZSTD_dm_auto) {
|
3196
|
+
DEBUGLOG(5, "raw content dictionary detected");
|
3197
|
+
return ZSTD_loadDictionaryContent(cctx, dict, dictSize);
|
3198
|
+
}
|
3199
|
+
if (dictMode == ZSTD_dm_fullDict)
|
3200
|
+
return ERROR(dictionary_wrong);
|
3201
|
+
assert(0); /* impossible */
|
3202
|
+
}
|
3203
|
+
|
3204
|
+
/* dict as full zstd dictionary */
|
2793
3205
|
return ZSTD_loadZstdDictionary(cctx, dict, dictSize);
|
2794
3206
|
}
|
2795
3207
|
|
2796
3208
|
/*! ZSTD_compressBegin_internal() :
|
2797
|
-
*
|
3209
|
+
* @return : 0, or an error code */
|
2798
3210
|
static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
|
2799
3211
|
const void* dict, size_t dictSize,
|
2800
|
-
|
3212
|
+
ZSTD_dictMode_e dictMode,
|
3213
|
+
const ZSTD_CDict* cdict,
|
3214
|
+
ZSTD_parameters params, U64 pledgedSrcSize,
|
3215
|
+
ZSTD_buffered_policy_e zbuff)
|
2801
3216
|
{
|
2802
|
-
|
3217
|
+
DEBUGLOG(4, "ZSTD_compressBegin_internal");
|
3218
|
+
DEBUGLOG(4, "dict ? %s", dict ? "dict" : (cdict ? "cdict" : "none"));
|
3219
|
+
DEBUGLOG(4, "dictMode : %u", (U32)dictMode);
|
3220
|
+
/* params are supposed to be fully validated at this point */
|
2803
3221
|
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
|
2804
|
-
|
2805
|
-
|
3222
|
+
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
|
3223
|
+
|
3224
|
+
if (cdict && cdict->dictContentSize>0) {
|
3225
|
+
return ZSTD_copyCCtx_internal(cctx, cdict->refContext,
|
3226
|
+
params.fParams, pledgedSrcSize,
|
3227
|
+
zbuff);
|
3228
|
+
}
|
3229
|
+
|
3230
|
+
CHECK_F( ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
|
3231
|
+
ZSTDcrp_continue, zbuff) );
|
3232
|
+
return ZSTD_compress_insertDictionary(cctx, dict, dictSize, dictMode);
|
2806
3233
|
}
|
2807
3234
|
|
2808
3235
|
|
@@ -2814,14 +3241,16 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx,
|
|
2814
3241
|
{
|
2815
3242
|
/* compression parameters verification and optimization */
|
2816
3243
|
CHECK_F(ZSTD_checkCParams(params.cParams));
|
2817
|
-
return ZSTD_compressBegin_internal(cctx, dict, dictSize,
|
3244
|
+
return ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dm_auto, NULL,
|
3245
|
+
params, pledgedSrcSize, ZSTDb_not_buffered);
|
2818
3246
|
}
|
2819
3247
|
|
2820
3248
|
|
2821
3249
|
size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel)
|
2822
3250
|
{
|
2823
3251
|
ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
|
2824
|
-
return ZSTD_compressBegin_internal(cctx, dict, dictSize,
|
3252
|
+
return ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dm_auto, NULL,
|
3253
|
+
params, 0, ZSTDb_not_buffered);
|
2825
3254
|
}
|
2826
3255
|
|
2827
3256
|
|
@@ -2840,11 +3269,12 @@ static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
|
|
2840
3269
|
BYTE* op = ostart;
|
2841
3270
|
size_t fhSize = 0;
|
2842
3271
|
|
3272
|
+
DEBUGLOG(5, "ZSTD_writeEpilogue");
|
2843
3273
|
if (cctx->stage == ZSTDcs_created) return ERROR(stage_wrong); /* init missing */
|
2844
3274
|
|
2845
3275
|
/* special case : empty frame */
|
2846
3276
|
if (cctx->stage == ZSTDcs_init) {
|
2847
|
-
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->
|
3277
|
+
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->appliedParams, 0, 0);
|
2848
3278
|
if (ZSTD_isError(fhSize)) return fhSize;
|
2849
3279
|
dstCapacity -= fhSize;
|
2850
3280
|
op += fhSize;
|
@@ -2860,7 +3290,7 @@ static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
|
|
2860
3290
|
dstCapacity -= ZSTD_blockHeaderSize;
|
2861
3291
|
}
|
2862
3292
|
|
2863
|
-
if (cctx->
|
3293
|
+
if (cctx->appliedParams.fParams.checksumFlag) {
|
2864
3294
|
U32 const checksum = (U32) XXH64_digest(&cctx->xxhState);
|
2865
3295
|
if (dstCapacity<4) return ERROR(dstSize_tooSmall);
|
2866
3296
|
MEM_writeLE32(op, checksum);
|
@@ -2877,13 +3307,19 @@ size_t ZSTD_compressEnd (ZSTD_CCtx* cctx,
|
|
2877
3307
|
const void* src, size_t srcSize)
|
2878
3308
|
{
|
2879
3309
|
size_t endResult;
|
2880
|
-
size_t const cSize = ZSTD_compressContinue_internal(cctx,
|
3310
|
+
size_t const cSize = ZSTD_compressContinue_internal(cctx,
|
3311
|
+
dst, dstCapacity, src, srcSize,
|
3312
|
+
1 /* frame mode */, 1 /* last chunk */);
|
2881
3313
|
if (ZSTD_isError(cSize)) return cSize;
|
2882
3314
|
endResult = ZSTD_writeEpilogue(cctx, (char*)dst + cSize, dstCapacity-cSize);
|
2883
3315
|
if (ZSTD_isError(endResult)) return endResult;
|
2884
|
-
if (cctx->
|
2885
|
-
|
2886
|
-
|
3316
|
+
if (cctx->appliedParams.fParams.contentSizeFlag) { /* control src size */
|
3317
|
+
DEBUGLOG(5, "end of frame : controlling src size");
|
3318
|
+
if (cctx->pledgedSrcSizePlusOne != cctx->consumedSrcSize+1) {
|
3319
|
+
DEBUGLOG(5, "error : pledgedSrcSize = %u, while realSrcSize = %u",
|
3320
|
+
(U32)cctx->pledgedSrcSizePlusOne-1, (U32)cctx->consumedSrcSize);
|
3321
|
+
return ERROR(srcSize_wrong);
|
3322
|
+
} }
|
2887
3323
|
return cSize + endResult;
|
2888
3324
|
}
|
2889
3325
|
|
@@ -2894,7 +3330,8 @@ static size_t ZSTD_compress_internal (ZSTD_CCtx* cctx,
|
|
2894
3330
|
const void* dict,size_t dictSize,
|
2895
3331
|
ZSTD_parameters params)
|
2896
3332
|
{
|
2897
|
-
CHECK_F(ZSTD_compressBegin_internal(cctx, dict, dictSize,
|
3333
|
+
CHECK_F( ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dm_auto, NULL,
|
3334
|
+
params, srcSize, ZSTDb_not_buffered) );
|
2898
3335
|
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
|
2899
3336
|
}
|
2900
3337
|
|
@@ -2926,25 +3363,36 @@ size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcS
|
|
2926
3363
|
size_t result;
|
2927
3364
|
ZSTD_CCtx ctxBody;
|
2928
3365
|
memset(&ctxBody, 0, sizeof(ctxBody));
|
2929
|
-
|
3366
|
+
ctxBody.customMem = ZSTD_defaultCMem;
|
2930
3367
|
result = ZSTD_compressCCtx(&ctxBody, dst, dstCapacity, src, srcSize, compressionLevel);
|
2931
|
-
ZSTD_free(ctxBody.workSpace,
|
3368
|
+
ZSTD_free(ctxBody.workSpace, ZSTD_defaultCMem); /* can't free ctxBody itself, as it's on stack; free only heap content */
|
2932
3369
|
return result;
|
2933
3370
|
}
|
2934
3371
|
|
2935
3372
|
|
2936
3373
|
/* ===== Dictionary API ===== */
|
2937
3374
|
|
2938
|
-
|
2939
|
-
|
2940
|
-
|
2941
|
-
|
2942
|
-
|
2943
|
-
|
3375
|
+
/*! ZSTD_estimateCDictSize_advanced() :
|
3376
|
+
* Estimate amount of memory that will be needed to create a dictionary with following arguments */
|
3377
|
+
size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, unsigned byReference)
|
3378
|
+
{
|
3379
|
+
DEBUGLOG(5, "sizeof(ZSTD_CDict) : %u", (U32)sizeof(ZSTD_CDict));
|
3380
|
+
DEBUGLOG(5, "CCtx estimate : %u", (U32)ZSTD_estimateCCtxSize_advanced(cParams));
|
3381
|
+
return sizeof(ZSTD_CDict) + ZSTD_estimateCCtxSize_advanced(cParams)
|
3382
|
+
+ (byReference ? 0 : dictSize);
|
3383
|
+
}
|
3384
|
+
|
3385
|
+
size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel)
|
3386
|
+
{
|
3387
|
+
ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel, 0, dictSize);
|
3388
|
+
return ZSTD_estimateCDictSize_advanced(dictSize, cParams, 0);
|
3389
|
+
}
|
2944
3390
|
|
2945
3391
|
size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict)
|
2946
3392
|
{
|
2947
3393
|
if (cdict==NULL) return 0; /* support sizeof on NULL */
|
3394
|
+
DEBUGLOG(5, "sizeof(*cdict) : %u", (U32)sizeof(*cdict));
|
3395
|
+
DEBUGLOG(5, "ZSTD_sizeof_CCtx : %u", (U32)ZSTD_sizeof_CCtx(cdict->refContext));
|
2948
3396
|
return ZSTD_sizeof_CCtx(cdict->refContext) + (cdict->dictBuffer ? cdict->dictContentSize : 0) + sizeof(*cdict);
|
2949
3397
|
}
|
2950
3398
|
|
@@ -2956,13 +3404,46 @@ static ZSTD_parameters ZSTD_makeParams(ZSTD_compressionParameters cParams, ZSTD_
|
|
2956
3404
|
return params;
|
2957
3405
|
}
|
2958
3406
|
|
2959
|
-
|
3407
|
+
static size_t ZSTD_initCDict_internal(
|
3408
|
+
ZSTD_CDict* cdict,
|
3409
|
+
const void* dictBuffer, size_t dictSize,
|
3410
|
+
unsigned byReference, ZSTD_dictMode_e dictMode,
|
3411
|
+
ZSTD_compressionParameters cParams)
|
3412
|
+
{
|
3413
|
+
DEBUGLOG(5, "ZSTD_initCDict_internal, mode %u", (U32)dictMode);
|
3414
|
+
if ((byReference) || (!dictBuffer) || (!dictSize)) {
|
3415
|
+
cdict->dictBuffer = NULL;
|
3416
|
+
cdict->dictContent = dictBuffer;
|
3417
|
+
} else {
|
3418
|
+
void* const internalBuffer = ZSTD_malloc(dictSize, cdict->refContext->customMem);
|
3419
|
+
cdict->dictBuffer = internalBuffer;
|
3420
|
+
cdict->dictContent = internalBuffer;
|
3421
|
+
if (!internalBuffer) return ERROR(memory_allocation);
|
3422
|
+
memcpy(internalBuffer, dictBuffer, dictSize);
|
3423
|
+
}
|
3424
|
+
cdict->dictContentSize = dictSize;
|
3425
|
+
|
3426
|
+
{ ZSTD_frameParameters const fParams = { 0 /* contentSizeFlag */,
|
3427
|
+
0 /* checksumFlag */, 0 /* noDictIDFlag */ }; /* dummy */
|
3428
|
+
ZSTD_parameters const params = ZSTD_makeParams(cParams, fParams);
|
3429
|
+
CHECK_F( ZSTD_compressBegin_internal(cdict->refContext,
|
3430
|
+
cdict->dictContent, dictSize, dictMode,
|
3431
|
+
NULL,
|
3432
|
+
params, ZSTD_CONTENTSIZE_UNKNOWN,
|
3433
|
+
ZSTDb_not_buffered) );
|
3434
|
+
}
|
3435
|
+
|
3436
|
+
return 0;
|
3437
|
+
}
|
3438
|
+
|
3439
|
+
ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize,
|
3440
|
+
unsigned byReference, ZSTD_dictMode_e dictMode,
|
2960
3441
|
ZSTD_compressionParameters cParams, ZSTD_customMem customMem)
|
2961
3442
|
{
|
2962
|
-
|
2963
|
-
if (!customMem.customAlloc
|
3443
|
+
DEBUGLOG(5, "ZSTD_createCDict_advanced, mode %u", (U32)dictMode);
|
3444
|
+
if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
|
2964
3445
|
|
2965
|
-
{ ZSTD_CDict* const cdict = (ZSTD_CDict*)
|
3446
|
+
{ ZSTD_CDict* const cdict = (ZSTD_CDict*)ZSTD_malloc(sizeof(ZSTD_CDict), customMem);
|
2966
3447
|
ZSTD_CCtx* const cctx = ZSTD_createCCtx_advanced(customMem);
|
2967
3448
|
|
2968
3449
|
if (!cdict || !cctx) {
|
@@ -2970,46 +3451,34 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize, u
|
|
2970
3451
|
ZSTD_freeCCtx(cctx);
|
2971
3452
|
return NULL;
|
2972
3453
|
}
|
3454
|
+
cdict->refContext = cctx;
|
2973
3455
|
|
2974
|
-
if ((
|
2975
|
-
|
2976
|
-
|
2977
|
-
|
2978
|
-
|
2979
|
-
|
2980
|
-
memcpy(internalBuffer, dictBuffer, dictSize);
|
2981
|
-
cdict->dictBuffer = internalBuffer;
|
2982
|
-
cdict->dictContent = internalBuffer;
|
3456
|
+
if (ZSTD_isError( ZSTD_initCDict_internal(cdict,
|
3457
|
+
dictBuffer, dictSize,
|
3458
|
+
byReference, dictMode,
|
3459
|
+
cParams) )) {
|
3460
|
+
ZSTD_freeCDict(cdict);
|
3461
|
+
return NULL;
|
2983
3462
|
}
|
2984
3463
|
|
2985
|
-
{ ZSTD_frameParameters const fParams = { 0 /* contentSizeFlag */, 0 /* checksumFlag */, 0 /* noDictIDFlag */ }; /* dummy */
|
2986
|
-
ZSTD_parameters const params = ZSTD_makeParams(cParams, fParams);
|
2987
|
-
size_t const errorCode = ZSTD_compressBegin_advanced(cctx, cdict->dictContent, dictSize, params, 0);
|
2988
|
-
if (ZSTD_isError(errorCode)) {
|
2989
|
-
ZSTD_free(cdict->dictBuffer, customMem);
|
2990
|
-
ZSTD_free(cdict, customMem);
|
2991
|
-
ZSTD_freeCCtx(cctx);
|
2992
|
-
return NULL;
|
2993
|
-
} }
|
2994
|
-
|
2995
|
-
cdict->refContext = cctx;
|
2996
|
-
cdict->dictContentSize = dictSize;
|
2997
3464
|
return cdict;
|
2998
3465
|
}
|
2999
3466
|
}
|
3000
3467
|
|
3001
3468
|
ZSTD_CDict* ZSTD_createCDict(const void* dict, size_t dictSize, int compressionLevel)
|
3002
3469
|
{
|
3003
|
-
ZSTD_customMem const allocator = { NULL, NULL, NULL };
|
3004
3470
|
ZSTD_compressionParameters cParams = ZSTD_getCParams(compressionLevel, 0, dictSize);
|
3005
|
-
return ZSTD_createCDict_advanced(dict, dictSize,
|
3471
|
+
return ZSTD_createCDict_advanced(dict, dictSize,
|
3472
|
+
0 /* byReference */, ZSTD_dm_auto,
|
3473
|
+
cParams, ZSTD_defaultCMem);
|
3006
3474
|
}
|
3007
3475
|
|
3008
3476
|
ZSTD_CDict* ZSTD_createCDict_byReference(const void* dict, size_t dictSize, int compressionLevel)
|
3009
3477
|
{
|
3010
|
-
ZSTD_customMem const allocator = { NULL, NULL, NULL };
|
3011
3478
|
ZSTD_compressionParameters cParams = ZSTD_getCParams(compressionLevel, 0, dictSize);
|
3012
|
-
return ZSTD_createCDict_advanced(dict, dictSize,
|
3479
|
+
return ZSTD_createCDict_advanced(dict, dictSize,
|
3480
|
+
1 /* byReference */, ZSTD_dm_auto,
|
3481
|
+
cParams, ZSTD_defaultCMem);
|
3013
3482
|
}
|
3014
3483
|
|
3015
3484
|
size_t ZSTD_freeCDict(ZSTD_CDict* cdict)
|
@@ -3023,7 +3492,54 @@ size_t ZSTD_freeCDict(ZSTD_CDict* cdict)
|
|
3023
3492
|
}
|
3024
3493
|
}
|
3025
3494
|
|
3026
|
-
|
3495
|
+
/*! ZSTD_initStaticCDict_advanced() :
|
3496
|
+
* Generate a digested dictionary in provided memory area.
|
3497
|
+
* workspace: The memory area to emplace the dictionary into.
|
3498
|
+
* Provided pointer must 8-bytes aligned.
|
3499
|
+
* It must outlive dictionary usage.
|
3500
|
+
* workspaceSize: Use ZSTD_estimateCDictSize()
|
3501
|
+
* to determine how large workspace must be.
|
3502
|
+
* cParams : use ZSTD_getCParams() to transform a compression level
|
3503
|
+
* into its relevants cParams.
|
3504
|
+
* @return : pointer to ZSTD_CDict*, or NULL if error (size too small)
|
3505
|
+
* Note : there is no corresponding "free" function.
|
3506
|
+
* Since workspace was allocated externally, it must be freed externally.
|
3507
|
+
*/
|
3508
|
+
ZSTD_CDict* ZSTD_initStaticCDict(void* workspace, size_t workspaceSize,
|
3509
|
+
const void* dict, size_t dictSize,
|
3510
|
+
unsigned byReference, ZSTD_dictMode_e dictMode,
|
3511
|
+
ZSTD_compressionParameters cParams)
|
3512
|
+
{
|
3513
|
+
size_t const cctxSize = ZSTD_estimateCCtxSize_advanced(cParams);
|
3514
|
+
size_t const neededSize = sizeof(ZSTD_CDict) + (byReference ? 0 : dictSize)
|
3515
|
+
+ cctxSize;
|
3516
|
+
ZSTD_CDict* const cdict = (ZSTD_CDict*) workspace;
|
3517
|
+
void* ptr;
|
3518
|
+
DEBUGLOG(5, "(size_t)workspace & 7 : %u", (U32)(size_t)workspace & 7);
|
3519
|
+
if ((size_t)workspace & 7) return NULL; /* 8-aligned */
|
3520
|
+
DEBUGLOG(5, "(workspaceSize < neededSize) : (%u < %u) => %u",
|
3521
|
+
(U32)workspaceSize, (U32)neededSize, (U32)(workspaceSize < neededSize));
|
3522
|
+
if (workspaceSize < neededSize) return NULL;
|
3523
|
+
|
3524
|
+
if (!byReference) {
|
3525
|
+
memcpy(cdict+1, dict, dictSize);
|
3526
|
+
dict = cdict+1;
|
3527
|
+
ptr = (char*)workspace + sizeof(ZSTD_CDict) + dictSize;
|
3528
|
+
} else {
|
3529
|
+
ptr = cdict+1;
|
3530
|
+
}
|
3531
|
+
cdict->refContext = ZSTD_initStaticCCtx(ptr, cctxSize);
|
3532
|
+
|
3533
|
+
if (ZSTD_isError( ZSTD_initCDict_internal(cdict,
|
3534
|
+
dict, dictSize,
|
3535
|
+
1 /* byReference */, dictMode,
|
3536
|
+
cParams) ))
|
3537
|
+
return NULL;
|
3538
|
+
|
3539
|
+
return cdict;
|
3540
|
+
}
|
3541
|
+
|
3542
|
+
ZSTD_parameters ZSTD_getParamsFromCDict(const ZSTD_CDict* cdict) {
|
3027
3543
|
return ZSTD_getParamsFromCCtx(cdict->refContext);
|
3028
3544
|
}
|
3029
3545
|
|
@@ -3033,16 +3549,16 @@ size_t ZSTD_compressBegin_usingCDict_advanced(
|
|
3033
3549
|
ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict,
|
3034
3550
|
ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize)
|
3035
3551
|
{
|
3036
|
-
if (cdict==NULL) return ERROR(
|
3037
|
-
|
3038
|
-
if (cdict->dictContentSize)
|
3039
|
-
CHECK_F( ZSTD_copyCCtx_internal(cctx, cdict->refContext, fParams, pledgedSrcSize) )
|
3040
|
-
else {
|
3041
|
-
ZSTD_parameters params = cdict->refContext->params;
|
3552
|
+
if (cdict==NULL) return ERROR(dictionary_wrong);
|
3553
|
+
{ ZSTD_parameters params = cdict->refContext->appliedParams;
|
3042
3554
|
params.fParams = fParams;
|
3043
|
-
|
3555
|
+
DEBUGLOG(5, "ZSTD_compressBegin_usingCDict_advanced");
|
3556
|
+
return ZSTD_compressBegin_internal(cctx,
|
3557
|
+
NULL, 0, ZSTD_dm_auto,
|
3558
|
+
cdict,
|
3559
|
+
params, pledgedSrcSize,
|
3560
|
+
ZSTDb_not_buffered);
|
3044
3561
|
}
|
3045
|
-
return 0;
|
3046
3562
|
}
|
3047
3563
|
|
3048
3564
|
/* ZSTD_compressBegin_usingCDict() :
|
@@ -3051,7 +3567,7 @@ size_t ZSTD_compressBegin_usingCDict_advanced(
|
|
3051
3567
|
size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict)
|
3052
3568
|
{
|
3053
3569
|
ZSTD_frameParameters const fParams = { 0 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ };
|
3054
|
-
DEBUGLOG(5, "ZSTD_compressBegin_usingCDict : dictIDFlag == %u
|
3570
|
+
DEBUGLOG(5, "ZSTD_compressBegin_usingCDict : dictIDFlag == %u", !fParams.noDictIDFlag);
|
3055
3571
|
return ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, 0);
|
3056
3572
|
}
|
3057
3573
|
|
@@ -3084,176 +3600,133 @@ size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx,
|
|
3084
3600
|
* Streaming
|
3085
3601
|
********************************************************************/
|
3086
3602
|
|
3087
|
-
typedef enum { zcss_init, zcss_load, zcss_flush, zcss_final } ZSTD_cStreamStage;
|
3088
|
-
|
3089
|
-
struct ZSTD_CStream_s {
|
3090
|
-
ZSTD_CCtx* cctx;
|
3091
|
-
ZSTD_CDict* cdictLocal;
|
3092
|
-
const ZSTD_CDict* cdict;
|
3093
|
-
char* inBuff;
|
3094
|
-
size_t inBuffSize;
|
3095
|
-
size_t inToCompress;
|
3096
|
-
size_t inBuffPos;
|
3097
|
-
size_t inBuffTarget;
|
3098
|
-
size_t blockSize;
|
3099
|
-
char* outBuff;
|
3100
|
-
size_t outBuffSize;
|
3101
|
-
size_t outBuffContentSize;
|
3102
|
-
size_t outBuffFlushedSize;
|
3103
|
-
ZSTD_cStreamStage stage;
|
3104
|
-
U32 checksum;
|
3105
|
-
U32 frameEnded;
|
3106
|
-
U64 pledgedSrcSize;
|
3107
|
-
ZSTD_parameters params;
|
3108
|
-
ZSTD_customMem customMem;
|
3109
|
-
}; /* typedef'd to ZSTD_CStream within "zstd.h" */
|
3110
|
-
|
3111
3603
|
ZSTD_CStream* ZSTD_createCStream(void)
|
3112
3604
|
{
|
3113
|
-
return ZSTD_createCStream_advanced(
|
3605
|
+
return ZSTD_createCStream_advanced(ZSTD_defaultCMem);
|
3114
3606
|
}
|
3115
3607
|
|
3116
|
-
ZSTD_CStream*
|
3608
|
+
ZSTD_CStream* ZSTD_initStaticCStream(void *workspace, size_t workspaceSize)
|
3117
3609
|
{
|
3118
|
-
|
3119
|
-
|
3120
|
-
if (!customMem.customAlloc && !customMem.customFree) customMem = defaultCustomMem;
|
3121
|
-
if (!customMem.customAlloc || !customMem.customFree) return NULL;
|
3610
|
+
return ZSTD_initStaticCCtx(workspace, workspaceSize);
|
3611
|
+
}
|
3122
3612
|
|
3123
|
-
|
3124
|
-
|
3125
|
-
|
3126
|
-
memcpy(&zcs->customMem, &customMem, sizeof(ZSTD_customMem));
|
3127
|
-
zcs->cctx = ZSTD_createCCtx_advanced(customMem);
|
3128
|
-
if (zcs->cctx == NULL) { ZSTD_freeCStream(zcs); return NULL; }
|
3129
|
-
return zcs;
|
3613
|
+
ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem)
|
3614
|
+
{ /* CStream and CCtx are now same object */
|
3615
|
+
return ZSTD_createCCtx_advanced(customMem);
|
3130
3616
|
}
|
3131
3617
|
|
3132
3618
|
size_t ZSTD_freeCStream(ZSTD_CStream* zcs)
|
3133
3619
|
{
|
3134
|
-
|
3135
|
-
{ ZSTD_customMem const cMem = zcs->customMem;
|
3136
|
-
ZSTD_freeCCtx(zcs->cctx);
|
3137
|
-
zcs->cctx = NULL;
|
3138
|
-
ZSTD_freeCDict(zcs->cdictLocal);
|
3139
|
-
zcs->cdictLocal = NULL;
|
3140
|
-
ZSTD_free(zcs->inBuff, cMem);
|
3141
|
-
zcs->inBuff = NULL;
|
3142
|
-
ZSTD_free(zcs->outBuff, cMem);
|
3143
|
-
zcs->outBuff = NULL;
|
3144
|
-
ZSTD_free(zcs, cMem);
|
3145
|
-
return 0;
|
3146
|
-
}
|
3620
|
+
return ZSTD_freeCCtx(zcs); /* same object */
|
3147
3621
|
}
|
3148
3622
|
|
3149
3623
|
|
3624
|
+
|
3150
3625
|
/*====== Initialization ======*/
|
3151
3626
|
|
3152
|
-
size_t ZSTD_CStreamInSize(void) { return
|
3627
|
+
size_t ZSTD_CStreamInSize(void) { return ZSTD_BLOCKSIZE_MAX; }
|
3153
3628
|
|
3154
3629
|
size_t ZSTD_CStreamOutSize(void)
|
3155
3630
|
{
|
3156
|
-
return ZSTD_compressBound(
|
3631
|
+
return ZSTD_compressBound(ZSTD_BLOCKSIZE_MAX) + ZSTD_blockHeaderSize + 4 /* 32-bits hash */ ;
|
3157
3632
|
}
|
3158
3633
|
|
3159
|
-
static size_t ZSTD_resetCStream_internal(ZSTD_CStream* zcs,
|
3634
|
+
static size_t ZSTD_resetCStream_internal(ZSTD_CStream* zcs,
|
3635
|
+
const void* dict, size_t dictSize, ZSTD_dictMode_e dictMode,
|
3636
|
+
const ZSTD_CDict* cdict,
|
3637
|
+
ZSTD_parameters params, unsigned long long pledgedSrcSize)
|
3160
3638
|
{
|
3161
|
-
|
3162
|
-
|
3163
|
-
|
3639
|
+
DEBUGLOG(4, "ZSTD_resetCStream_internal");
|
3640
|
+
/* params are supposed to be fully validated at this point */
|
3641
|
+
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
|
3642
|
+
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
|
3164
3643
|
|
3165
|
-
|
3166
|
-
|
3644
|
+
CHECK_F( ZSTD_compressBegin_internal(zcs,
|
3645
|
+
dict, dictSize, dictMode,
|
3646
|
+
cdict,
|
3647
|
+
params, pledgedSrcSize,
|
3648
|
+
ZSTDb_buffered) );
|
3167
3649
|
|
3168
3650
|
zcs->inToCompress = 0;
|
3169
3651
|
zcs->inBuffPos = 0;
|
3170
3652
|
zcs->inBuffTarget = zcs->blockSize;
|
3171
3653
|
zcs->outBuffContentSize = zcs->outBuffFlushedSize = 0;
|
3172
|
-
zcs->
|
3654
|
+
zcs->streamStage = zcss_load;
|
3173
3655
|
zcs->frameEnded = 0;
|
3174
|
-
zcs->pledgedSrcSize = pledgedSrcSize;
|
3175
3656
|
return 0; /* ready to go */
|
3176
3657
|
}
|
3177
3658
|
|
3178
3659
|
size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize)
|
3179
3660
|
{
|
3180
|
-
|
3181
|
-
|
3182
|
-
DEBUGLOG(5, "ZSTD_resetCStream
|
3183
|
-
|
3661
|
+
ZSTD_parameters params = zcs->requestedParams;
|
3662
|
+
params.fParams.contentSizeFlag = (pledgedSrcSize > 0);
|
3663
|
+
DEBUGLOG(5, "ZSTD_resetCStream");
|
3664
|
+
if (zcs->compressionLevel != ZSTD_CLEVEL_CUSTOM) {
|
3665
|
+
params.cParams = ZSTD_getCParams(zcs->compressionLevel, pledgedSrcSize, 0 /* dictSize */);
|
3666
|
+
}
|
3667
|
+
return ZSTD_resetCStream_internal(zcs, NULL, 0, zcs->dictMode, zcs->cdict, params, pledgedSrcSize);
|
3184
3668
|
}
|
3185
3669
|
|
3186
|
-
|
3187
|
-
*
|
3188
|
-
*
|
3189
|
-
|
3190
|
-
|
3191
|
-
|
3670
|
+
/*! ZSTD_initCStream_internal() :
|
3671
|
+
* Note : not static, but hidden (not exposed). Used by zstdmt_compress.c
|
3672
|
+
* Assumption 1 : params are valid
|
3673
|
+
* Assumption 2 : either dict, or cdict, is defined, not both */
|
3674
|
+
size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs,
|
3675
|
+
const void* dict, size_t dictSize, const ZSTD_CDict* cdict,
|
3676
|
+
ZSTD_parameters params, unsigned long long pledgedSrcSize)
|
3192
3677
|
{
|
3678
|
+
DEBUGLOG(5, "ZSTD_initCStream_internal");
|
3193
3679
|
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
|
3680
|
+
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
|
3194
3681
|
|
3195
|
-
|
3196
|
-
|
3197
|
-
if (zcs->
|
3198
|
-
|
3199
|
-
|
3200
|
-
zcs->inBuff = (char*) ZSTD_malloc(neededInBuffSize, zcs->customMem);
|
3201
|
-
if (zcs->inBuff == NULL) return ERROR(memory_allocation);
|
3202
|
-
zcs->inBuffSize = neededInBuffSize;
|
3682
|
+
if (dict && dictSize >= 8) {
|
3683
|
+
DEBUGLOG(5, "loading dictionary of size %u", (U32)dictSize);
|
3684
|
+
if (zcs->staticSize) { /* static CCtx : never uses malloc */
|
3685
|
+
/* incompatible with internal cdict creation */
|
3686
|
+
return ERROR(memory_allocation);
|
3203
3687
|
}
|
3204
|
-
zcs->
|
3205
|
-
|
3206
|
-
|
3207
|
-
|
3208
|
-
zcs->
|
3209
|
-
|
3210
|
-
|
3211
|
-
if (
|
3212
|
-
|
3688
|
+
ZSTD_freeCDict(zcs->cdictLocal);
|
3689
|
+
zcs->cdictLocal = ZSTD_createCDict_advanced(dict, dictSize,
|
3690
|
+
zcs->dictContentByRef, zcs->dictMode,
|
3691
|
+
params.cParams, zcs->customMem);
|
3692
|
+
zcs->cdict = zcs->cdictLocal;
|
3693
|
+
if (zcs->cdictLocal == NULL) return ERROR(memory_allocation);
|
3694
|
+
} else {
|
3695
|
+
if (cdict) {
|
3696
|
+
ZSTD_parameters const cdictParams = ZSTD_getParamsFromCDict(cdict);
|
3697
|
+
params.cParams = cdictParams.cParams; /* cParams are enforced from cdict */
|
3698
|
+
}
|
3699
|
+
ZSTD_freeCDict(zcs->cdictLocal);
|
3700
|
+
zcs->cdictLocal = NULL;
|
3701
|
+
zcs->cdict = cdict;
|
3213
3702
|
}
|
3214
3703
|
|
3215
|
-
zcs->
|
3216
|
-
zcs->
|
3217
|
-
|
3218
|
-
DEBUGLOG(5, "ZSTD_initCStream_stage2 : dictIDFlag == %u \n", !params.fParams.noDictIDFlag);
|
3219
|
-
return ZSTD_resetCStream_internal(zcs, pledgedSrcSize);
|
3704
|
+
zcs->requestedParams = params;
|
3705
|
+
zcs->compressionLevel = ZSTD_CLEVEL_CUSTOM;
|
3706
|
+
return ZSTD_resetCStream_internal(zcs, NULL, 0, zcs->dictMode, zcs->cdict, params, pledgedSrcSize);
|
3220
3707
|
}
|
3221
3708
|
|
3222
3709
|
/* ZSTD_initCStream_usingCDict_advanced() :
|
3223
3710
|
* same as ZSTD_initCStream_usingCDict(), with control over frame parameters */
|
3224
|
-
size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
|
3225
|
-
|
3226
|
-
|
3711
|
+
size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
|
3712
|
+
const ZSTD_CDict* cdict,
|
3713
|
+
ZSTD_frameParameters fParams,
|
3714
|
+
unsigned long long pledgedSrcSize)
|
3715
|
+
{ /* cannot handle NULL cdict (does not know what to do) */
|
3716
|
+
if (!cdict) return ERROR(dictionary_wrong);
|
3227
3717
|
{ ZSTD_parameters params = ZSTD_getParamsFromCDict(cdict);
|
3228
3718
|
params.fParams = fParams;
|
3229
|
-
zcs
|
3230
|
-
|
3719
|
+
return ZSTD_initCStream_internal(zcs,
|
3720
|
+
NULL, 0, cdict,
|
3721
|
+
params, pledgedSrcSize);
|
3231
3722
|
}
|
3232
3723
|
}
|
3233
3724
|
|
3234
3725
|
/* note : cdict must outlive compression session */
|
3235
3726
|
size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict)
|
3236
3727
|
{
|
3237
|
-
ZSTD_frameParameters const fParams = { 0 /*
|
3238
|
-
return ZSTD_initCStream_usingCDict_advanced(zcs, cdict,
|
3239
|
-
}
|
3240
|
-
|
3241
|
-
static size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs,
|
3242
|
-
const void* dict, size_t dictSize,
|
3243
|
-
ZSTD_parameters params, unsigned long long pledgedSrcSize)
|
3244
|
-
{
|
3245
|
-
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
|
3246
|
-
zcs->cdict = NULL;
|
3247
|
-
|
3248
|
-
if (dict && dictSize >= 8) {
|
3249
|
-
ZSTD_freeCDict(zcs->cdictLocal);
|
3250
|
-
zcs->cdictLocal = ZSTD_createCDict_advanced(dict, dictSize, 0 /* copy */, params.cParams, zcs->customMem);
|
3251
|
-
if (zcs->cdictLocal == NULL) return ERROR(memory_allocation);
|
3252
|
-
zcs->cdict = zcs->cdictLocal;
|
3253
|
-
}
|
3254
|
-
|
3255
|
-
DEBUGLOG(5, "ZSTD_initCStream_internal : dictIDFlag == %u \n", !params.fParams.noDictIDFlag);
|
3256
|
-
return ZSTD_initCStream_stage2(zcs, params, pledgedSrcSize);
|
3728
|
+
ZSTD_frameParameters const fParams = { 0 /* contentSize */, 0 /* checksum */, 0 /* hideDictID */ };
|
3729
|
+
return ZSTD_initCStream_usingCDict_advanced(zcs, cdict, fParams, 0); /* note : will check that cdict != NULL */
|
3257
3730
|
}
|
3258
3731
|
|
3259
3732
|
size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
|
@@ -3261,120 +3734,180 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
|
|
3261
3734
|
ZSTD_parameters params, unsigned long long pledgedSrcSize)
|
3262
3735
|
{
|
3263
3736
|
CHECK_F( ZSTD_checkCParams(params.cParams) );
|
3264
|
-
|
3265
|
-
|
3737
|
+
zcs->requestedParams = params;
|
3738
|
+
zcs->compressionLevel = ZSTD_CLEVEL_CUSTOM;
|
3739
|
+
return ZSTD_initCStream_internal(zcs, dict, dictSize, NULL, params, pledgedSrcSize);
|
3266
3740
|
}
|
3267
3741
|
|
3268
3742
|
size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel)
|
3269
3743
|
{
|
3270
3744
|
ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
|
3271
|
-
|
3745
|
+
zcs->compressionLevel = compressionLevel;
|
3746
|
+
return ZSTD_initCStream_internal(zcs, dict, dictSize, NULL, params, 0);
|
3272
3747
|
}
|
3273
3748
|
|
3274
3749
|
size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pledgedSrcSize)
|
3275
3750
|
{
|
3276
3751
|
ZSTD_parameters params = ZSTD_getParams(compressionLevel, pledgedSrcSize, 0);
|
3277
3752
|
params.fParams.contentSizeFlag = (pledgedSrcSize>0);
|
3278
|
-
return ZSTD_initCStream_internal(zcs, NULL, 0, params, pledgedSrcSize);
|
3753
|
+
return ZSTD_initCStream_internal(zcs, NULL, 0, NULL, params, pledgedSrcSize);
|
3279
3754
|
}
|
3280
3755
|
|
3281
3756
|
size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel)
|
3282
3757
|
{
|
3283
3758
|
ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, 0);
|
3284
|
-
return ZSTD_initCStream_internal(zcs, NULL, 0, params, 0);
|
3285
|
-
}
|
3286
|
-
|
3287
|
-
size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs)
|
3288
|
-
{
|
3289
|
-
if (zcs==NULL) return 0; /* support sizeof on NULL */
|
3290
|
-
return sizeof(*zcs) + ZSTD_sizeof_CCtx(zcs->cctx) + ZSTD_sizeof_CDict(zcs->cdictLocal) + zcs->outBuffSize + zcs->inBuffSize;
|
3759
|
+
return ZSTD_initCStream_internal(zcs, NULL, 0, NULL, params, 0);
|
3291
3760
|
}
|
3292
3761
|
|
3293
3762
|
/*====== Compression ======*/
|
3294
3763
|
|
3295
|
-
|
3296
|
-
|
3297
|
-
MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
3764
|
+
MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity,
|
3765
|
+
const void* src, size_t srcSize)
|
3298
3766
|
{
|
3299
3767
|
size_t const length = MIN(dstCapacity, srcSize);
|
3300
|
-
memcpy(dst, src, length);
|
3768
|
+
if (length) memcpy(dst, src, length);
|
3301
3769
|
return length;
|
3302
3770
|
}
|
3303
3771
|
|
3304
|
-
|
3305
|
-
|
3306
|
-
|
3307
|
-
|
3772
|
+
/** ZSTD_compressStream_generic():
|
3773
|
+
* internal function for all *compressStream*() variants and *compress_generic()
|
3774
|
+
* @return : hint size for next input */
|
3775
|
+
size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
|
3776
|
+
ZSTD_outBuffer* output,
|
3777
|
+
ZSTD_inBuffer* input,
|
3778
|
+
ZSTD_EndDirective const flushMode)
|
3308
3779
|
{
|
3780
|
+
const char* const istart = (const char*)input->src;
|
3781
|
+
const char* const iend = istart + input->size;
|
3782
|
+
const char* ip = istart + input->pos;
|
3783
|
+
char* const ostart = (char*)output->dst;
|
3784
|
+
char* const oend = ostart + output->size;
|
3785
|
+
char* op = ostart + output->pos;
|
3309
3786
|
U32 someMoreWork = 1;
|
3310
|
-
|
3311
|
-
|
3312
|
-
|
3313
|
-
|
3314
|
-
|
3315
|
-
|
3787
|
+
|
3788
|
+
/* check expectations */
|
3789
|
+
DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%u", (U32)flushMode);
|
3790
|
+
assert(zcs->inBuff != NULL);
|
3791
|
+
assert(zcs->inBuffSize>0);
|
3792
|
+
assert(zcs->outBuff!= NULL);
|
3793
|
+
assert(zcs->outBuffSize>0);
|
3794
|
+
assert(output->pos <= output->size);
|
3795
|
+
assert(input->pos <= input->size);
|
3316
3796
|
|
3317
3797
|
while (someMoreWork) {
|
3318
|
-
switch(zcs->
|
3798
|
+
switch(zcs->streamStage)
|
3319
3799
|
{
|
3320
|
-
case zcss_init:
|
3800
|
+
case zcss_init:
|
3801
|
+
/* call ZSTD_initCStream() first ! */
|
3802
|
+
return ERROR(init_missing);
|
3321
3803
|
|
3322
3804
|
case zcss_load:
|
3323
|
-
|
3805
|
+
if ( (flushMode == ZSTD_e_end)
|
3806
|
+
&& ((size_t)(oend-op) >= ZSTD_compressBound(iend-ip)) /* enough dstCapacity */
|
3807
|
+
&& (zcs->inBuffPos == 0) ) {
|
3808
|
+
/* shortcut to compression pass directly into output buffer */
|
3809
|
+
size_t const cSize = ZSTD_compressEnd(zcs,
|
3810
|
+
op, oend-op, ip, iend-ip);
|
3811
|
+
DEBUGLOG(4, "ZSTD_compressEnd : %u", (U32)cSize);
|
3812
|
+
if (ZSTD_isError(cSize)) return cSize;
|
3813
|
+
ip = iend;
|
3814
|
+
op += cSize;
|
3815
|
+
zcs->frameEnded = 1;
|
3816
|
+
ZSTD_startNewCompression(zcs);
|
3817
|
+
someMoreWork = 0; break;
|
3818
|
+
}
|
3819
|
+
/* complete loading into inBuffer */
|
3324
3820
|
{ size_t const toLoad = zcs->inBuffTarget - zcs->inBuffPos;
|
3325
|
-
size_t const loaded = ZSTD_limitCopy(
|
3821
|
+
size_t const loaded = ZSTD_limitCopy(
|
3822
|
+
zcs->inBuff + zcs->inBuffPos, toLoad,
|
3823
|
+
ip, iend-ip);
|
3326
3824
|
zcs->inBuffPos += loaded;
|
3327
3825
|
ip += loaded;
|
3328
|
-
if ( (
|
3329
|
-
|
3330
|
-
|
3826
|
+
if ( (flushMode == ZSTD_e_continue)
|
3827
|
+
&& (zcs->inBuffPos < zcs->inBuffTarget) ) {
|
3828
|
+
/* not enough input to fill full block : stop here */
|
3829
|
+
someMoreWork = 0; break;
|
3830
|
+
}
|
3831
|
+
if ( (flushMode == ZSTD_e_flush)
|
3832
|
+
&& (zcs->inBuffPos == zcs->inToCompress) ) {
|
3833
|
+
/* empty */
|
3834
|
+
someMoreWork = 0; break;
|
3835
|
+
}
|
3836
|
+
}
|
3331
3837
|
/* compress current block (note : this stage cannot be stopped in the middle) */
|
3838
|
+
DEBUGLOG(5, "stream compression stage (flushMode==%u)", flushMode);
|
3332
3839
|
{ void* cDst;
|
3333
3840
|
size_t cSize;
|
3334
3841
|
size_t const iSize = zcs->inBuffPos - zcs->inToCompress;
|
3335
3842
|
size_t oSize = oend-op;
|
3843
|
+
unsigned const lastBlock = (flushMode == ZSTD_e_end) && (ip==iend);
|
3336
3844
|
if (oSize >= ZSTD_compressBound(iSize))
|
3337
|
-
cDst = op; /* compress
|
3845
|
+
cDst = op; /* compress into output buffer, to skip flush stage */
|
3338
3846
|
else
|
3339
3847
|
cDst = zcs->outBuff, oSize = zcs->outBuffSize;
|
3340
|
-
cSize =
|
3341
|
-
ZSTD_compressEnd(zcs
|
3342
|
-
|
3848
|
+
cSize = lastBlock ?
|
3849
|
+
ZSTD_compressEnd(zcs, cDst, oSize,
|
3850
|
+
zcs->inBuff + zcs->inToCompress, iSize) :
|
3851
|
+
ZSTD_compressContinue(zcs, cDst, oSize,
|
3852
|
+
zcs->inBuff + zcs->inToCompress, iSize);
|
3343
3853
|
if (ZSTD_isError(cSize)) return cSize;
|
3344
|
-
|
3854
|
+
zcs->frameEnded = lastBlock;
|
3345
3855
|
/* prepare next block */
|
3346
3856
|
zcs->inBuffTarget = zcs->inBuffPos + zcs->blockSize;
|
3347
3857
|
if (zcs->inBuffTarget > zcs->inBuffSize)
|
3348
|
-
zcs->inBuffPos = 0, zcs->inBuffTarget = zcs->blockSize;
|
3858
|
+
zcs->inBuffPos = 0, zcs->inBuffTarget = zcs->blockSize;
|
3859
|
+
DEBUGLOG(5, "inBuffTarget:%u / inBuffSize:%u",
|
3860
|
+
(U32)zcs->inBuffTarget, (U32)zcs->inBuffSize);
|
3861
|
+
if (!lastBlock)
|
3862
|
+
assert(zcs->inBuffTarget <= zcs->inBuffSize);
|
3349
3863
|
zcs->inToCompress = zcs->inBuffPos;
|
3350
|
-
if (cDst == op) {
|
3864
|
+
if (cDst == op) { /* no need to flush */
|
3865
|
+
op += cSize;
|
3866
|
+
if (zcs->frameEnded) {
|
3867
|
+
DEBUGLOG(5, "Frame completed directly in outBuffer");
|
3868
|
+
someMoreWork = 0;
|
3869
|
+
ZSTD_startNewCompression(zcs);
|
3870
|
+
}
|
3871
|
+
break;
|
3872
|
+
}
|
3351
3873
|
zcs->outBuffContentSize = cSize;
|
3352
3874
|
zcs->outBuffFlushedSize = 0;
|
3353
|
-
zcs->
|
3875
|
+
zcs->streamStage = zcss_flush; /* pass-through to flush stage */
|
3354
3876
|
}
|
3355
|
-
|
3877
|
+
/* fall-through */
|
3356
3878
|
case zcss_flush:
|
3879
|
+
DEBUGLOG(5, "flush stage");
|
3357
3880
|
{ size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
|
3358
|
-
size_t const flushed = ZSTD_limitCopy(op, oend-op,
|
3881
|
+
size_t const flushed = ZSTD_limitCopy(op, oend-op,
|
3882
|
+
zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
|
3883
|
+
DEBUGLOG(5, "toFlush: %u into %u ==> flushed: %u",
|
3884
|
+
(U32)toFlush, (U32)(oend-op), (U32)flushed);
|
3359
3885
|
op += flushed;
|
3360
3886
|
zcs->outBuffFlushedSize += flushed;
|
3361
|
-
if (toFlush!=flushed) {
|
3887
|
+
if (toFlush!=flushed) {
|
3888
|
+
/* flush not fully completed, presumably because dst is too small */
|
3889
|
+
assert(op==oend);
|
3890
|
+
someMoreWork = 0;
|
3891
|
+
break;
|
3892
|
+
}
|
3362
3893
|
zcs->outBuffContentSize = zcs->outBuffFlushedSize = 0;
|
3363
|
-
zcs->
|
3894
|
+
if (zcs->frameEnded) {
|
3895
|
+
DEBUGLOG(5, "Frame completed on flush");
|
3896
|
+
someMoreWork = 0;
|
3897
|
+
ZSTD_startNewCompression(zcs);
|
3898
|
+
break;
|
3899
|
+
}
|
3900
|
+
zcs->streamStage = zcss_load;
|
3364
3901
|
break;
|
3365
3902
|
}
|
3366
3903
|
|
3367
|
-
|
3368
|
-
|
3369
|
-
break;
|
3370
|
-
|
3371
|
-
default:
|
3372
|
-
return ERROR(GENERIC); /* impossible */
|
3904
|
+
default: /* impossible */
|
3905
|
+
assert(0);
|
3373
3906
|
}
|
3374
3907
|
}
|
3375
3908
|
|
3376
|
-
|
3377
|
-
|
3909
|
+
input->pos = ip - istart;
|
3910
|
+
output->pos = op - ostart;
|
3378
3911
|
if (zcs->frameEnded) return 0;
|
3379
3912
|
{ size_t hintInSize = zcs->inBuffTarget - zcs->inBuffPos;
|
3380
3913
|
if (hintInSize==0) hintInSize = zcs->blockSize;
|
@@ -3384,14 +3917,86 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
|
|
3384
3917
|
|
3385
3918
|
size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
|
3386
3919
|
{
|
3387
|
-
|
3388
|
-
|
3389
|
-
|
3390
|
-
|
3391
|
-
|
3392
|
-
|
3393
|
-
|
3394
|
-
|
3920
|
+
/* check conditions */
|
3921
|
+
if (output->pos > output->size) return ERROR(GENERIC);
|
3922
|
+
if (input->pos > input->size) return ERROR(GENERIC);
|
3923
|
+
|
3924
|
+
return ZSTD_compressStream_generic(zcs, output, input, ZSTD_e_continue);
|
3925
|
+
}
|
3926
|
+
|
3927
|
+
/*! ZSTDMT_initCStream_internal() :
|
3928
|
+
* Private use only. Init streaming operation.
|
3929
|
+
* expects params to be valid.
|
3930
|
+
* must receive dict, or cdict, or none, but not both.
|
3931
|
+
* @return : 0, or an error code */
|
3932
|
+
size_t ZSTDMT_initCStream_internal(ZSTDMT_CCtx* zcs,
|
3933
|
+
const void* dict, size_t dictSize, const ZSTD_CDict* cdict,
|
3934
|
+
ZSTD_parameters params, unsigned long long pledgedSrcSize);
|
3935
|
+
|
3936
|
+
|
3937
|
+
size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
|
3938
|
+
ZSTD_outBuffer* output,
|
3939
|
+
ZSTD_inBuffer* input,
|
3940
|
+
ZSTD_EndDirective endOp)
|
3941
|
+
{
|
3942
|
+
/* check conditions */
|
3943
|
+
if (output->pos > output->size) return ERROR(GENERIC);
|
3944
|
+
if (input->pos > input->size) return ERROR(GENERIC);
|
3945
|
+
assert(cctx!=NULL);
|
3946
|
+
|
3947
|
+
/* transparent initialization stage */
|
3948
|
+
if (cctx->streamStage == zcss_init) {
|
3949
|
+
const void* const prefix = cctx->prefix;
|
3950
|
+
size_t const prefixSize = cctx->prefixSize;
|
3951
|
+
ZSTD_parameters params = cctx->requestedParams;
|
3952
|
+
if (cctx->compressionLevel != ZSTD_CLEVEL_CUSTOM)
|
3953
|
+
params.cParams = ZSTD_getCParams(cctx->compressionLevel,
|
3954
|
+
cctx->pledgedSrcSizePlusOne-1, 0 /*dictSize*/);
|
3955
|
+
cctx->prefix = NULL; cctx->prefixSize = 0; /* single usage */
|
3956
|
+
assert(prefix==NULL || cctx->cdict==NULL); /* only one can be set */
|
3957
|
+
|
3958
|
+
#ifdef ZSTD_MULTITHREAD
|
3959
|
+
if (cctx->nbThreads > 1) {
|
3960
|
+
DEBUGLOG(4, "call ZSTDMT_initCStream_internal as nbThreads=%u", cctx->nbThreads);
|
3961
|
+
CHECK_F( ZSTDMT_initCStream_internal(cctx->mtctx, prefix, prefixSize, cctx->cdict, params, cctx->pledgedSrcSizePlusOne-1) );
|
3962
|
+
cctx->streamStage = zcss_load;
|
3963
|
+
} else
|
3964
|
+
#endif
|
3965
|
+
{
|
3966
|
+
CHECK_F( ZSTD_resetCStream_internal(cctx, prefix, prefixSize, cctx->dictMode, cctx->cdict, params, cctx->pledgedSrcSizePlusOne-1) );
|
3967
|
+
} }
|
3968
|
+
|
3969
|
+
/* compression stage */
|
3970
|
+
#ifdef ZSTD_MULTITHREAD
|
3971
|
+
if (cctx->nbThreads > 1) {
|
3972
|
+
size_t const flushMin = ZSTDMT_compressStream_generic(cctx->mtctx, output, input, endOp);
|
3973
|
+
DEBUGLOG(5, "ZSTDMT_compressStream_generic : %u", (U32)flushMin);
|
3974
|
+
if ( ZSTD_isError(flushMin)
|
3975
|
+
|| (endOp == ZSTD_e_end && flushMin == 0) ) { /* compression completed */
|
3976
|
+
ZSTD_startNewCompression(cctx);
|
3977
|
+
}
|
3978
|
+
return flushMin;
|
3979
|
+
}
|
3980
|
+
#endif
|
3981
|
+
|
3982
|
+
CHECK_F( ZSTD_compressStream_generic(cctx, output, input, endOp) );
|
3983
|
+
DEBUGLOG(5, "completed ZSTD_compress_generic");
|
3984
|
+
return cctx->outBuffContentSize - cctx->outBuffFlushedSize; /* remaining to flush */
|
3985
|
+
}
|
3986
|
+
|
3987
|
+
size_t ZSTD_compress_generic_simpleArgs (
|
3988
|
+
ZSTD_CCtx* cctx,
|
3989
|
+
void* dst, size_t dstCapacity, size_t* dstPos,
|
3990
|
+
const void* src, size_t srcSize, size_t* srcPos,
|
3991
|
+
ZSTD_EndDirective endOp)
|
3992
|
+
{
|
3993
|
+
ZSTD_outBuffer output = { dst, dstCapacity, *dstPos };
|
3994
|
+
ZSTD_inBuffer input = { src, srcSize, *srcPos };
|
3995
|
+
/* ZSTD_compress_generic() will check validity of dstPos and srcPos */
|
3996
|
+
size_t const cErr = ZSTD_compress_generic(cctx, &output, &input, endOp);
|
3997
|
+
*dstPos = output.pos;
|
3998
|
+
*srcPos = input.pos;
|
3999
|
+
return cErr;
|
3395
4000
|
}
|
3396
4001
|
|
3397
4002
|
|
@@ -3401,89 +4006,59 @@ size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuf
|
|
3401
4006
|
* @return : amount of data remaining to flush */
|
3402
4007
|
size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
|
3403
4008
|
{
|
3404
|
-
|
3405
|
-
|
3406
|
-
|
3407
|
-
|
3408
|
-
&srcSize, &srcSize, /* use a valid src address instead of NULL */
|
3409
|
-
zsf_flush);
|
3410
|
-
output->pos += sizeWritten;
|
3411
|
-
if (ZSTD_isError(result)) return result;
|
3412
|
-
return zcs->outBuffContentSize - zcs->outBuffFlushedSize; /* remaining to flush */
|
4009
|
+
ZSTD_inBuffer input = { NULL, 0, 0 };
|
4010
|
+
if (output->pos > output->size) return ERROR(GENERIC);
|
4011
|
+
CHECK_F( ZSTD_compressStream_generic(zcs, output, &input, ZSTD_e_flush) );
|
4012
|
+
return zcs->outBuffContentSize - zcs->outBuffFlushedSize; /* remaining to flush */
|
3413
4013
|
}
|
3414
4014
|
|
3415
4015
|
|
3416
4016
|
size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
|
3417
4017
|
{
|
3418
|
-
|
3419
|
-
|
3420
|
-
|
3421
|
-
|
3422
|
-
|
3423
|
-
|
3424
|
-
|
3425
|
-
|
3426
|
-
|
3427
|
-
&srcSize /* use a valid src address instead of NULL */, &srcSize, zsf_end);
|
3428
|
-
size_t const remainingToFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
|
3429
|
-
op += sizeWritten;
|
3430
|
-
if (remainingToFlush) {
|
3431
|
-
output->pos += sizeWritten;
|
3432
|
-
return remainingToFlush + ZSTD_BLOCKHEADERSIZE /* final empty block */ + (zcs->checksum * 4);
|
3433
|
-
}
|
3434
|
-
/* create epilogue */
|
3435
|
-
zcs->stage = zcss_final;
|
3436
|
-
zcs->outBuffContentSize = !notEnded ? 0 :
|
3437
|
-
/* write epilogue, including final empty block, into outBuff */
|
3438
|
-
ZSTD_compressEnd(zcs->cctx, zcs->outBuff, zcs->outBuffSize, NULL, 0);
|
3439
|
-
if (ZSTD_isError(zcs->outBuffContentSize)) return zcs->outBuffContentSize;
|
3440
|
-
}
|
3441
|
-
|
3442
|
-
/* flush epilogue */
|
3443
|
-
{ size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
|
3444
|
-
size_t const flushed = ZSTD_limitCopy(op, oend-op, zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
|
3445
|
-
op += flushed;
|
3446
|
-
zcs->outBuffFlushedSize += flushed;
|
3447
|
-
output->pos += op-ostart;
|
3448
|
-
if (toFlush==flushed) zcs->stage = zcss_init; /* end reached */
|
3449
|
-
return toFlush - flushed;
|
4018
|
+
ZSTD_inBuffer input = { NULL, 0, 0 };
|
4019
|
+
if (output->pos > output->size) return ERROR(GENERIC);
|
4020
|
+
CHECK_F( ZSTD_compressStream_generic(zcs, output, &input, ZSTD_e_end) );
|
4021
|
+
{ size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE;
|
4022
|
+
size_t const checksumSize = zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4;
|
4023
|
+
size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize + lastBlockSize + checksumSize;
|
4024
|
+
DEBUGLOG(5, "ZSTD_endStream : remaining to flush : %u",
|
4025
|
+
(unsigned)toFlush);
|
4026
|
+
return toFlush;
|
3450
4027
|
}
|
3451
4028
|
}
|
3452
4029
|
|
3453
4030
|
|
3454
|
-
|
3455
4031
|
/*-===== Pre-defined compression levels =====-*/
|
3456
4032
|
|
3457
|
-
#define ZSTD_DEFAULT_CLEVEL 1
|
3458
4033
|
#define ZSTD_MAX_CLEVEL 22
|
3459
4034
|
int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
|
3460
4035
|
|
3461
4036
|
static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = {
|
3462
|
-
{ /* "default" */
|
4037
|
+
{ /* "default" - guarantees a monotonically increasing memory budget */
|
3463
4038
|
/* W, C, H, S, L, TL, strat */
|
3464
4039
|
{ 18, 12, 12, 1, 7, 16, ZSTD_fast }, /* level 0 - never used */
|
3465
4040
|
{ 19, 13, 14, 1, 7, 16, ZSTD_fast }, /* level 1 */
|
3466
4041
|
{ 19, 15, 16, 1, 6, 16, ZSTD_fast }, /* level 2 */
|
3467
|
-
{ 20, 16, 17, 1, 5, 16, ZSTD_dfast }, /* level 3
|
3468
|
-
{ 20,
|
3469
|
-
{ 20,
|
3470
|
-
{ 21,
|
3471
|
-
{ 21,
|
4042
|
+
{ 20, 16, 17, 1, 5, 16, ZSTD_dfast }, /* level 3 */
|
4043
|
+
{ 20, 17, 18, 1, 5, 16, ZSTD_dfast }, /* level 4 */
|
4044
|
+
{ 20, 17, 18, 2, 5, 16, ZSTD_greedy }, /* level 5 */
|
4045
|
+
{ 21, 17, 19, 2, 5, 16, ZSTD_lazy }, /* level 6 */
|
4046
|
+
{ 21, 18, 19, 3, 5, 16, ZSTD_lazy }, /* level 7 */
|
3472
4047
|
{ 21, 18, 20, 3, 5, 16, ZSTD_lazy2 }, /* level 8 */
|
3473
|
-
{ 21,
|
4048
|
+
{ 21, 19, 20, 3, 5, 16, ZSTD_lazy2 }, /* level 9 */
|
3474
4049
|
{ 21, 19, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
|
3475
4050
|
{ 22, 20, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
|
3476
4051
|
{ 22, 20, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */
|
3477
4052
|
{ 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 13 */
|
3478
4053
|
{ 22, 21, 22, 6, 5, 16, ZSTD_lazy2 }, /* level 14 */
|
3479
|
-
{ 22, 21,
|
4054
|
+
{ 22, 21, 22, 5, 5, 16, ZSTD_btlazy2 }, /* level 15 */
|
3480
4055
|
{ 23, 22, 22, 5, 5, 16, ZSTD_btlazy2 }, /* level 16 */
|
3481
|
-
{ 23,
|
4056
|
+
{ 23, 22, 22, 4, 5, 24, ZSTD_btopt }, /* level 17 */
|
3482
4057
|
{ 23, 22, 22, 5, 4, 32, ZSTD_btopt }, /* level 18 */
|
3483
4058
|
{ 23, 23, 22, 6, 3, 48, ZSTD_btopt }, /* level 19 */
|
3484
|
-
{ 25, 25, 23, 7, 3, 64,
|
3485
|
-
{ 26, 26,
|
3486
|
-
{ 27, 27, 25, 9, 3,512,
|
4059
|
+
{ 25, 25, 23, 7, 3, 64, ZSTD_btultra }, /* level 20 */
|
4060
|
+
{ 26, 26, 24, 7, 3,256, ZSTD_btultra }, /* level 21 */
|
4061
|
+
{ 27, 27, 25, 9, 3,512, ZSTD_btultra }, /* level 22 */
|
3487
4062
|
},
|
3488
4063
|
{ /* for srcSize <= 256 KB */
|
3489
4064
|
/* W, C, H, S, L, T, strat */
|
@@ -3507,9 +4082,9 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|
3507
4082
|
{ 18, 19, 18, 8, 3, 64, ZSTD_btopt }, /* level 17.*/
|
3508
4083
|
{ 18, 19, 18, 9, 3,128, ZSTD_btopt }, /* level 18.*/
|
3509
4084
|
{ 18, 19, 18, 10, 3,256, ZSTD_btopt }, /* level 19.*/
|
3510
|
-
{ 18, 19, 18, 11, 3,512,
|
3511
|
-
{ 18, 19, 18, 12, 3,512,
|
3512
|
-
{ 18, 19, 18, 13, 3,512,
|
4085
|
+
{ 18, 19, 18, 11, 3,512, ZSTD_btultra }, /* level 20.*/
|
4086
|
+
{ 18, 19, 18, 12, 3,512, ZSTD_btultra }, /* level 21.*/
|
4087
|
+
{ 18, 19, 18, 13, 3,512, ZSTD_btultra }, /* level 22.*/
|
3513
4088
|
},
|
3514
4089
|
{ /* for srcSize <= 128 KB */
|
3515
4090
|
/* W, C, H, S, L, T, strat */
|
@@ -3533,9 +4108,9 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|
3533
4108
|
{ 17, 18, 17, 7, 3, 64, ZSTD_btopt }, /* level 17.*/
|
3534
4109
|
{ 17, 18, 17, 7, 3,256, ZSTD_btopt }, /* level 18.*/
|
3535
4110
|
{ 17, 18, 17, 8, 3,256, ZSTD_btopt }, /* level 19.*/
|
3536
|
-
{ 17, 18, 17, 9, 3,256,
|
3537
|
-
{ 17, 18, 17, 10, 3,256,
|
3538
|
-
{ 17, 18, 17, 11, 3,512,
|
4111
|
+
{ 17, 18, 17, 9, 3,256, ZSTD_btultra }, /* level 20.*/
|
4112
|
+
{ 17, 18, 17, 10, 3,256, ZSTD_btultra }, /* level 21.*/
|
4113
|
+
{ 17, 18, 17, 11, 3,512, ZSTD_btultra }, /* level 22.*/
|
3539
4114
|
},
|
3540
4115
|
{ /* for srcSize <= 16 KB */
|
3541
4116
|
/* W, C, H, S, L, T, strat */
|
@@ -3559,39 +4134,59 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|
3559
4134
|
{ 14, 15, 15, 6, 3,128, ZSTD_btopt }, /* level 17.*/
|
3560
4135
|
{ 14, 15, 15, 6, 3,256, ZSTD_btopt }, /* level 18.*/
|
3561
4136
|
{ 14, 15, 15, 7, 3,256, ZSTD_btopt }, /* level 19.*/
|
3562
|
-
{ 14, 15, 15, 8, 3,256,
|
3563
|
-
{ 14, 15, 15, 9, 3,256,
|
3564
|
-
{ 14, 15, 15, 10, 3,256,
|
4137
|
+
{ 14, 15, 15, 8, 3,256, ZSTD_btultra }, /* level 20.*/
|
4138
|
+
{ 14, 15, 15, 9, 3,256, ZSTD_btultra }, /* level 21.*/
|
4139
|
+
{ 14, 15, 15, 10, 3,256, ZSTD_btultra }, /* level 22.*/
|
3565
4140
|
},
|
3566
4141
|
};
|
3567
4142
|
|
4143
|
+
#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=1)
|
4144
|
+
/* This function just controls
|
4145
|
+
* the monotonic memory budget increase of ZSTD_defaultCParameters[0].
|
4146
|
+
* Run once, on first ZSTD_getCParams() usage, if ZSTD_DEBUG is enabled
|
4147
|
+
*/
|
4148
|
+
MEM_STATIC void ZSTD_check_compressionLevel_monotonicIncrease_memoryBudget(void)
|
4149
|
+
{
|
4150
|
+
int level;
|
4151
|
+
for (level=1; level<ZSTD_maxCLevel(); level++) {
|
4152
|
+
ZSTD_compressionParameters const c1 = ZSTD_defaultCParameters[0][level];
|
4153
|
+
ZSTD_compressionParameters const c2 = ZSTD_defaultCParameters[0][level+1];
|
4154
|
+
assert(c1.windowLog <= c2.windowLog);
|
4155
|
+
# define ZSTD_TABLECOST(h,c) ((1<<(h)) + (1<<(c)))
|
4156
|
+
assert(ZSTD_TABLECOST(c1.hashLog, c1.chainLog) <= ZSTD_TABLECOST(c2.hashLog, c2.chainLog));
|
4157
|
+
}
|
4158
|
+
}
|
4159
|
+
#endif
|
4160
|
+
|
3568
4161
|
/*! ZSTD_getCParams() :
|
3569
4162
|
* @return ZSTD_compressionParameters structure for a selected compression level, `srcSize` and `dictSize`.
|
3570
4163
|
* Size values are optional, provide 0 if not known or unused */
|
3571
|
-
ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long
|
4164
|
+
ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize)
|
3572
4165
|
{
|
3573
|
-
|
3574
|
-
|
3575
|
-
U64 const rSize = srcSize+dictSize ? srcSize+dictSize+addedSize : (U64)-1;
|
4166
|
+
size_t const addedSize = srcSizeHint ? 0 : 500;
|
4167
|
+
U64 const rSize = srcSizeHint+dictSize ? srcSizeHint+dictSize+addedSize : (U64)-1;
|
3576
4168
|
U32 const tableID = (rSize <= 256 KB) + (rSize <= 128 KB) + (rSize <= 16 KB); /* intentional underflow for srcSizeHint == 0 */
|
3577
|
-
|
3578
|
-
|
3579
|
-
|
3580
|
-
if (
|
3581
|
-
|
3582
|
-
|
3583
|
-
if (cp.hashLog > ZSTD_HASHLOG_MAX) cp.hashLog = ZSTD_HASHLOG_MAX;
|
4169
|
+
|
4170
|
+
#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=1)
|
4171
|
+
static int g_monotonicTest = 1;
|
4172
|
+
if (g_monotonicTest) {
|
4173
|
+
ZSTD_check_compressionLevel_monotonicIncrease_memoryBudget();
|
4174
|
+
g_monotonicTest=0;
|
3584
4175
|
}
|
3585
|
-
|
3586
|
-
|
4176
|
+
#endif
|
4177
|
+
|
4178
|
+
if (compressionLevel <= 0) compressionLevel = ZSTD_CLEVEL_DEFAULT; /* 0 == default; no negative compressionLevel yet */
|
4179
|
+
if (compressionLevel > ZSTD_MAX_CLEVEL) compressionLevel = ZSTD_MAX_CLEVEL;
|
4180
|
+
{ ZSTD_compressionParameters const cp = ZSTD_defaultCParameters[tableID][compressionLevel];
|
4181
|
+
return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize); }
|
3587
4182
|
}
|
3588
4183
|
|
3589
4184
|
/*! ZSTD_getParams() :
|
3590
4185
|
* same as ZSTD_getCParams(), but @return a `ZSTD_parameters` object (instead of `ZSTD_compressionParameters`).
|
3591
4186
|
* All fields of `ZSTD_frameParameters` are set to default (0) */
|
3592
|
-
ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long
|
4187
|
+
ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize) {
|
3593
4188
|
ZSTD_parameters params;
|
3594
|
-
ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel,
|
4189
|
+
ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel, srcSizeHint, dictSize);
|
3595
4190
|
memset(¶ms, 0, sizeof(params));
|
3596
4191
|
params.cParams = cParams;
|
3597
4192
|
return params;
|