extzstd 0.0.3.CONCEPT-x86-mingw32 → 0.1-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/HISTORY.ja +5 -0
- data/LICENSE +6 -6
- data/README.md +35 -22
- data/contrib/zstd/LICENSE +13 -9
- data/contrib/zstd/README.md +37 -44
- data/contrib/zstd/common/entropy_common.c +33 -39
- data/contrib/zstd/common/error_private.c +43 -0
- data/contrib/zstd/common/error_private.h +11 -60
- data/contrib/zstd/common/fse.h +11 -5
- data/contrib/zstd/common/fse_decompress.c +14 -16
- data/contrib/zstd/common/huf.h +1 -1
- data/contrib/zstd/common/mem.h +36 -43
- data/contrib/zstd/common/xxhash.c +31 -18
- data/contrib/zstd/common/xxhash.h +71 -35
- data/contrib/zstd/common/zbuff.h +29 -35
- data/contrib/zstd/common/zstd_common.c +24 -32
- data/contrib/zstd/common/zstd_errors.h +60 -0
- data/contrib/zstd/common/zstd_internal.h +109 -80
- data/contrib/zstd/compress/fse_compress.c +9 -6
- data/contrib/zstd/compress/huf_compress.c +30 -74
- data/contrib/zstd/compress/zbuff_compress.c +43 -51
- data/contrib/zstd/compress/zstd_compress.c +953 -763
- data/contrib/zstd/compress/zstd_opt.h +115 -261
- data/contrib/zstd/decompress/huf_decompress.c +29 -40
- data/contrib/zstd/decompress/zbuff_decompress.c +36 -78
- data/contrib/zstd/decompress/zstd_decompress.c +976 -496
- data/contrib/zstd/dictBuilder/divsufsort.h +5 -5
- data/contrib/zstd/dictBuilder/zdict.c +194 -229
- data/contrib/zstd/dictBuilder/zdict.h +66 -68
- data/contrib/zstd/legacy/zstd_legacy.h +168 -49
- data/contrib/zstd/legacy/zstd_v01.c +95 -178
- data/contrib/zstd/legacy/zstd_v01.h +12 -32
- data/contrib/zstd/legacy/zstd_v02.c +48 -274
- data/contrib/zstd/legacy/zstd_v02.h +12 -32
- data/contrib/zstd/legacy/zstd_v03.c +48 -274
- data/contrib/zstd/legacy/zstd_v03.h +12 -32
- data/contrib/zstd/legacy/zstd_v04.c +63 -320
- data/contrib/zstd/legacy/zstd_v04.h +13 -33
- data/contrib/zstd/legacy/zstd_v05.c +80 -345
- data/contrib/zstd/legacy/zstd_v05.h +9 -31
- data/contrib/zstd/legacy/zstd_v06.c +48 -458
- data/contrib/zstd/legacy/zstd_v06.h +41 -67
- data/contrib/zstd/legacy/zstd_v07.c +4544 -0
- data/contrib/zstd/legacy/zstd_v07.h +173 -0
- data/contrib/zstd/zstd.h +640 -0
- data/ext/extconf.rb +7 -3
- data/ext/extzstd.c +263 -106
- data/ext/extzstd.h +8 -6
- data/ext/extzstd_nogvls.h +0 -117
- data/ext/extzstd_stream.c +347 -0
- data/ext/zstd_common.c +8 -0
- data/ext/zstd_compress.c +6 -0
- data/ext/zstd_decompress.c +5 -0
- data/ext/zstd_dictbuilder.c +5 -0
- data/ext/zstd_legacy_v07.c +1 -0
- data/gemstub.rb +18 -16
- data/lib/2.1/extzstd.so +0 -0
- data/lib/2.2/extzstd.so +0 -0
- data/lib/2.3/extzstd.so +0 -0
- data/lib/extzstd/version.rb +1 -1
- data/lib/extzstd.rb +77 -43
- data/test/test_basic.rb +11 -6
- metadata +23 -11
- data/contrib/zstd/common/error_public.h +0 -77
- data/contrib/zstd/common/zstd.h +0 -475
- data/ext/extzstd_buffered.c +0 -265
- data/ext/zstd_amalgam.c +0 -18
- data/lib/2.0/extzstd.so +0 -0
@@ -1,51 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
met:
|
10
|
-
|
11
|
-
* Redistributions of source code must retain the above copyright
|
12
|
-
notice, this list of conditions and the following disclaimer.
|
13
|
-
* Redistributions in binary form must reproduce the above
|
14
|
-
copyright notice, this list of conditions and the following disclaimer
|
15
|
-
in the documentation and/or other materials provided with the
|
16
|
-
distribution.
|
17
|
-
|
18
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
-
|
30
|
-
You can contact the author at :
|
31
|
-
- Zstd source repository : https://www.zstd.net
|
32
|
-
*/
|
33
|
-
|
34
|
-
|
35
|
-
/* *******************************************************
|
36
|
-
* Compiler specifics
|
37
|
-
*********************************************************/
|
38
|
-
#ifdef _MSC_VER /* Visual Studio */
|
39
|
-
# define FORCE_INLINE static __forceinline
|
40
|
-
# include <intrin.h> /* For Visual 2005 */
|
41
|
-
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
42
|
-
#else
|
43
|
-
# ifdef __GNUC__
|
44
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
45
|
-
# else
|
46
|
-
# define FORCE_INLINE static inline
|
47
|
-
# endif
|
48
|
-
#endif
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
6
|
+
* LICENSE file in the root directory of this source tree. An additional grant
|
7
|
+
* of patent rights can be found in the PATENTS file in the same directory.
|
8
|
+
*/
|
49
9
|
|
50
10
|
|
51
11
|
/*-*************************************
|
@@ -54,8 +14,8 @@
|
|
54
14
|
#include <string.h> /* memset */
|
55
15
|
#include "mem.h"
|
56
16
|
#define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
|
57
|
-
#include "xxhash.h"
|
58
|
-
#define FSE_STATIC_LINKING_ONLY
|
17
|
+
#include "xxhash.h" /* XXH_reset, update, digest */
|
18
|
+
#define FSE_STATIC_LINKING_ONLY /* FSE_encodeSymbol */
|
59
19
|
#include "fse.h"
|
60
20
|
#define HUF_STATIC_LINKING_ONLY
|
61
21
|
#include "huf.h"
|
@@ -66,6 +26,8 @@
|
|
66
26
|
* Constants
|
67
27
|
***************************************/
|
68
28
|
static const U32 g_searchStrength = 8; /* control skip over incompressible data */
|
29
|
+
#define HASH_READ_SIZE 8
|
30
|
+
typedef enum { ZSTDcs_created=0, ZSTDcs_init, ZSTDcs_ongoing, ZSTDcs_ending } ZSTD_compressionStage_e;
|
69
31
|
|
70
32
|
|
71
33
|
/*-*************************************
|
@@ -73,37 +35,14 @@ static const U32 g_searchStrength = 8; /* control skip over incompressible dat
|
|
73
35
|
***************************************/
|
74
36
|
size_t ZSTD_compressBound(size_t srcSize) { return FSE_compressBound(srcSize) + 12; }
|
75
37
|
|
76
|
-
static U32 ZSTD_highbit32(U32 val)
|
77
|
-
{
|
78
|
-
# if defined(_MSC_VER) /* Visual */
|
79
|
-
unsigned long r=0;
|
80
|
-
_BitScanReverse(&r, val);
|
81
|
-
return (unsigned)r;
|
82
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
|
83
|
-
return 31 - __builtin_clz(val);
|
84
|
-
# else /* Software version */
|
85
|
-
static const int DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
|
86
|
-
U32 v = val;
|
87
|
-
int r;
|
88
|
-
v |= v >> 1;
|
89
|
-
v |= v >> 2;
|
90
|
-
v |= v >> 4;
|
91
|
-
v |= v >> 8;
|
92
|
-
v |= v >> 16;
|
93
|
-
r = DeBruijnClz[(U32)(v * 0x07C4ACDDU) >> 27];
|
94
|
-
return r;
|
95
|
-
# endif
|
96
|
-
}
|
97
38
|
|
98
39
|
/*-*************************************
|
99
40
|
* Sequence storage
|
100
41
|
***************************************/
|
101
42
|
static void ZSTD_resetSeqStore(seqStore_t* ssPtr)
|
102
43
|
{
|
103
|
-
ssPtr->offset = ssPtr->offsetStart;
|
104
44
|
ssPtr->lit = ssPtr->litStart;
|
105
|
-
ssPtr->
|
106
|
-
ssPtr->matchLength = ssPtr->matchLengthStart;
|
45
|
+
ssPtr->sequences = ssPtr->sequencesStart;
|
107
46
|
ssPtr->longLengthID = 0;
|
108
47
|
}
|
109
48
|
|
@@ -122,7 +61,7 @@ struct ZSTD_CCtx_s
|
|
122
61
|
U32 nextToUpdate3; /* index from which to continue dictionary update */
|
123
62
|
U32 hashLog3; /* dispatch table : larger == faster, more memory */
|
124
63
|
U32 loadedDictEnd;
|
125
|
-
|
64
|
+
ZSTD_compressionStage_e stage;
|
126
65
|
U32 rep[ZSTD_REP_NUM];
|
127
66
|
U32 savedRep[ZSTD_REP_NUM];
|
128
67
|
U32 dictID;
|
@@ -140,9 +79,9 @@ struct ZSTD_CCtx_s
|
|
140
79
|
U32* chainTable;
|
141
80
|
HUF_CElt* hufTable;
|
142
81
|
U32 flagStaticTables;
|
143
|
-
FSE_CTable offcodeCTable
|
144
|
-
FSE_CTable matchlengthCTable
|
145
|
-
FSE_CTable litlengthCTable
|
82
|
+
FSE_CTable offcodeCTable [FSE_CTABLE_SIZE_U32(OffFSELog, MaxOff)];
|
83
|
+
FSE_CTable matchlengthCTable[FSE_CTABLE_SIZE_U32(MLFSELog, MaxML)];
|
84
|
+
FSE_CTable litlengthCTable [FSE_CTABLE_SIZE_U32(LLFSELog, MaxLL)];
|
146
85
|
};
|
147
86
|
|
148
87
|
ZSTD_CCtx* ZSTD_createCCtx(void)
|
@@ -154,29 +93,27 @@ ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem)
|
|
154
93
|
{
|
155
94
|
ZSTD_CCtx* cctx;
|
156
95
|
|
157
|
-
if (!customMem.customAlloc && !customMem.customFree)
|
158
|
-
|
96
|
+
if (!customMem.customAlloc && !customMem.customFree) customMem = defaultCustomMem;
|
97
|
+
if (!customMem.customAlloc || !customMem.customFree) return NULL;
|
159
98
|
|
160
|
-
|
161
|
-
return NULL;
|
162
|
-
|
163
|
-
cctx = (ZSTD_CCtx*) customMem.customAlloc(customMem.opaque, sizeof(ZSTD_CCtx));
|
99
|
+
cctx = (ZSTD_CCtx*) ZSTD_malloc(sizeof(ZSTD_CCtx), customMem);
|
164
100
|
if (!cctx) return NULL;
|
165
101
|
memset(cctx, 0, sizeof(ZSTD_CCtx));
|
166
|
-
memcpy(&(cctx->customMem), &customMem, sizeof(
|
102
|
+
memcpy(&(cctx->customMem), &customMem, sizeof(customMem));
|
167
103
|
return cctx;
|
168
104
|
}
|
169
105
|
|
170
106
|
size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
|
171
107
|
{
|
172
108
|
if (cctx==NULL) return 0; /* support free on NULL */
|
173
|
-
|
174
|
-
|
109
|
+
ZSTD_free(cctx->workSpace, cctx->customMem);
|
110
|
+
ZSTD_free(cctx, cctx->customMem);
|
175
111
|
return 0; /* reserved as a potential error code in the future */
|
176
112
|
}
|
177
113
|
|
178
|
-
size_t
|
114
|
+
size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx)
|
179
115
|
{
|
116
|
+
if (cctx==NULL) return 0; /* support sizeof on NULL */
|
180
117
|
return sizeof(*cctx) + cctx->workSpaceSize;
|
181
118
|
}
|
182
119
|
|
@@ -185,43 +122,33 @@ const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx) /* hidden interface *
|
|
185
122
|
return &(ctx->seqStore);
|
186
123
|
}
|
187
124
|
|
125
|
+
static ZSTD_parameters ZSTD_getParamsFromCCtx(const ZSTD_CCtx* cctx)
|
126
|
+
{
|
127
|
+
return cctx->params;
|
128
|
+
}
|
188
129
|
|
189
|
-
#define CLAMP(val,min,max) { if (val<min) val=min; else if (val>max) val=max; }
|
190
|
-
#define CLAMPCHECK(val,min,max) { if ((val<min) || (val>max)) return ERROR(compressionParameter_unsupported); }
|
191
130
|
|
192
131
|
/** ZSTD_checkParams() :
|
193
132
|
ensure param values remain within authorized range.
|
194
133
|
@return : 0, or an error code if one value is beyond authorized range */
|
195
134
|
size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
|
196
135
|
{
|
136
|
+
# define CLAMPCHECK(val,min,max) { if ((val<min) | (val>max)) return ERROR(compressionParameter_unsupported); }
|
197
137
|
CLAMPCHECK(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
|
198
138
|
CLAMPCHECK(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
|
199
139
|
CLAMPCHECK(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
|
200
140
|
CLAMPCHECK(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
|
201
|
-
{ U32 const searchLengthMin = (cParams.strategy == ZSTD_fast
|
141
|
+
{ U32 const searchLengthMin = ((cParams.strategy == ZSTD_fast) | (cParams.strategy == ZSTD_greedy)) ? ZSTD_SEARCHLENGTH_MIN+1 : ZSTD_SEARCHLENGTH_MIN;
|
202
142
|
U32 const searchLengthMax = (cParams.strategy == ZSTD_fast) ? ZSTD_SEARCHLENGTH_MAX : ZSTD_SEARCHLENGTH_MAX-1;
|
203
143
|
CLAMPCHECK(cParams.searchLength, searchLengthMin, searchLengthMax); }
|
204
144
|
CLAMPCHECK(cParams.targetLength, ZSTD_TARGETLENGTH_MIN, ZSTD_TARGETLENGTH_MAX);
|
205
|
-
if ((U32)(cParams.strategy) > (U32)
|
145
|
+
if ((U32)(cParams.strategy) > (U32)ZSTD_btopt2) return ERROR(compressionParameter_unsupported);
|
206
146
|
return 0;
|
207
147
|
}
|
208
148
|
|
209
149
|
|
210
|
-
/** ZSTD_checkCParams_advanced() :
|
211
|
-
temporary work-around, while the compressor compatibility remains limited regarding windowLog < 18 */
|
212
|
-
size_t ZSTD_checkCParams_advanced(ZSTD_compressionParameters cParams, U64 srcSize)
|
213
|
-
{
|
214
|
-
if (srcSize > (1ULL << ZSTD_WINDOWLOG_MIN)) return ZSTD_checkCParams(cParams);
|
215
|
-
if (cParams.windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN) return ERROR(compressionParameter_unsupported);
|
216
|
-
if (srcSize <= (1ULL << cParams.windowLog)) cParams.windowLog = ZSTD_WINDOWLOG_MIN; /* fake value - temporary work around */
|
217
|
-
if (srcSize <= (1ULL << cParams.chainLog)) cParams.chainLog = ZSTD_CHAINLOG_MIN; /* fake value - temporary work around */
|
218
|
-
if ((srcSize <= (1ULL << cParams.hashLog)) && ((U32)cParams.strategy < (U32)ZSTD_btlazy2)) cParams.hashLog = ZSTD_HASHLOG_MIN; /* fake value - temporary work around */
|
219
|
-
return ZSTD_checkCParams(cParams);
|
220
|
-
}
|
221
|
-
|
222
|
-
|
223
150
|
/** ZSTD_adjustCParams() :
|
224
|
-
optimize cPar for a given input (`srcSize` and `dictSize`).
|
151
|
+
optimize `cPar` for a given input (`srcSize` and `dictSize`).
|
225
152
|
mostly downsizing to reduce memory consumption and initialization.
|
226
153
|
Both `srcSize` and `dictSize` are optional (use 0 if unknown),
|
227
154
|
but if both are 0, no optimization can be done.
|
@@ -234,16 +161,15 @@ ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, u
|
|
234
161
|
{ U32 const minSrcSize = (srcSize==0) ? 500 : 0;
|
235
162
|
U64 const rSize = srcSize + dictSize + minSrcSize;
|
236
163
|
if (rSize < ((U64)1<<ZSTD_WINDOWLOG_MAX)) {
|
237
|
-
U32 const srcLog = ZSTD_highbit32((U32)(rSize)-1) + 1;
|
164
|
+
U32 const srcLog = MAX(ZSTD_HASHLOG_MIN, ZSTD_highbit32((U32)(rSize)-1) + 1);
|
238
165
|
if (cPar.windowLog > srcLog) cPar.windowLog = srcLog;
|
239
166
|
} }
|
240
167
|
if (cPar.hashLog > cPar.windowLog) cPar.hashLog = cPar.windowLog;
|
241
|
-
{ U32 const btPlus = (cPar.strategy == ZSTD_btlazy2)
|
168
|
+
{ U32 const btPlus = (cPar.strategy == ZSTD_btlazy2) | (cPar.strategy == ZSTD_btopt) | (cPar.strategy == ZSTD_btopt2);
|
242
169
|
U32 const maxChainLog = cPar.windowLog+btPlus;
|
243
170
|
if (cPar.chainLog > maxChainLog) cPar.chainLog = maxChainLog; } /* <= ZSTD_CHAINLOG_MAX */
|
244
171
|
|
245
172
|
if (cPar.windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN) cPar.windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN; /* required for frame header */
|
246
|
-
if ((cPar.hashLog < ZSTD_HASHLOG_MIN) && ( (U32)cPar.strategy >= (U32)ZSTD_btlazy2)) cPar.hashLog = ZSTD_HASHLOG_MIN; /* required to ensure collision resistance in bt */
|
247
173
|
|
248
174
|
return cPar;
|
249
175
|
}
|
@@ -251,121 +177,154 @@ ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, u
|
|
251
177
|
|
252
178
|
size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams)
|
253
179
|
{
|
254
|
-
const
|
255
|
-
const
|
256
|
-
const
|
257
|
-
const
|
180
|
+
size_t const blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, (size_t)1 << cParams.windowLog);
|
181
|
+
U32 const divider = (cParams.searchLength==3) ? 3 : 4;
|
182
|
+
size_t const maxNbSeq = blockSize / divider;
|
183
|
+
size_t const tokenSpace = blockSize + 11*maxNbSeq;
|
258
184
|
|
259
|
-
const
|
260
|
-
const
|
261
|
-
const
|
262
|
-
const
|
263
|
-
const
|
185
|
+
size_t const chainSize = (cParams.strategy == ZSTD_fast) ? 0 : (1 << cParams.chainLog);
|
186
|
+
size_t const hSize = ((size_t)1) << cParams.hashLog;
|
187
|
+
U32 const hashLog3 = (cParams.searchLength>3) ? 0 : MIN(ZSTD_HASHLOG3_MAX, cParams.windowLog);
|
188
|
+
size_t const h3Size = ((size_t)1) << hashLog3;
|
189
|
+
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
264
190
|
|
265
191
|
size_t const optSpace = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits))*sizeof(U32)
|
266
192
|
+ (ZSTD_OPT_NUM+1)*(sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
|
267
193
|
size_t const neededSpace = tableSpace + (256*sizeof(U32)) /* huffTable */ + tokenSpace
|
268
|
-
+ ((cParams.strategy == ZSTD_btopt) ? optSpace : 0);
|
194
|
+
+ (((cParams.strategy == ZSTD_btopt) || (cParams.strategy == ZSTD_btopt2)) ? optSpace : 0);
|
269
195
|
|
270
196
|
return sizeof(ZSTD_CCtx) + neededSpace;
|
271
197
|
}
|
272
198
|
|
199
|
+
|
200
|
+
static U32 ZSTD_equivalentParams(ZSTD_parameters param1, ZSTD_parameters param2)
|
201
|
+
{
|
202
|
+
return (param1.cParams.hashLog == param2.cParams.hashLog)
|
203
|
+
& (param1.cParams.chainLog == param2.cParams.chainLog)
|
204
|
+
& (param1.cParams.strategy == param2.cParams.strategy)
|
205
|
+
& ((param1.cParams.searchLength==3) == (param2.cParams.searchLength==3));
|
206
|
+
}
|
207
|
+
|
208
|
+
/*! ZSTD_continueCCtx() :
|
209
|
+
reuse CCtx without reset (note : requires no dictionary) */
|
210
|
+
static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_parameters params, U64 frameContentSize)
|
211
|
+
{
|
212
|
+
U32 const end = (U32)(cctx->nextSrc - cctx->base);
|
213
|
+
cctx->params = params;
|
214
|
+
cctx->frameContentSize = frameContentSize;
|
215
|
+
cctx->lowLimit = end;
|
216
|
+
cctx->dictLimit = end;
|
217
|
+
cctx->nextToUpdate = end+1;
|
218
|
+
cctx->stage = ZSTDcs_init;
|
219
|
+
cctx->dictID = 0;
|
220
|
+
cctx->loadedDictEnd = 0;
|
221
|
+
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) cctx->rep[i] = repStartValue[i]; }
|
222
|
+
cctx->seqStore.litLengthSum = 0; /* force reset of btopt stats */
|
223
|
+
XXH64_reset(&cctx->xxhState, 0);
|
224
|
+
return 0;
|
225
|
+
}
|
226
|
+
|
227
|
+
typedef enum { ZSTDcrp_continue, ZSTDcrp_noMemset, ZSTDcrp_fullReset } ZSTD_compResetPolicy_e;
|
228
|
+
|
273
229
|
/*! ZSTD_resetCCtx_advanced() :
|
274
|
-
note : 'params'
|
230
|
+
note : 'params' must be validated */
|
275
231
|
static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
|
276
232
|
ZSTD_parameters params, U64 frameContentSize,
|
277
|
-
|
278
|
-
{
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
const
|
284
|
-
const
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
if
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
233
|
+
ZSTD_compResetPolicy_e const crp)
|
234
|
+
{
|
235
|
+
if (crp == ZSTDcrp_continue)
|
236
|
+
if (ZSTD_equivalentParams(params, zc->params))
|
237
|
+
return ZSTD_continueCCtx(zc, params, frameContentSize);
|
238
|
+
|
239
|
+
{ size_t const blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, (size_t)1 << params.cParams.windowLog);
|
240
|
+
U32 const divider = (params.cParams.searchLength==3) ? 3 : 4;
|
241
|
+
size_t const maxNbSeq = blockSize / divider;
|
242
|
+
size_t const tokenSpace = blockSize + 11*maxNbSeq;
|
243
|
+
size_t const chainSize = (params.cParams.strategy == ZSTD_fast) ? 0 : (1 << params.cParams.chainLog);
|
244
|
+
size_t const hSize = ((size_t)1) << params.cParams.hashLog;
|
245
|
+
U32 const hashLog3 = (params.cParams.searchLength>3) ? 0 : MIN(ZSTD_HASHLOG3_MAX, params.cParams.windowLog);
|
246
|
+
size_t const h3Size = ((size_t)1) << hashLog3;
|
247
|
+
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
248
|
+
void* ptr;
|
249
|
+
|
250
|
+
/* Check if workSpace is large enough, alloc a new one if needed */
|
251
|
+
{ size_t const optSpace = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits))*sizeof(U32)
|
252
|
+
+ (ZSTD_OPT_NUM+1)*(sizeof(ZSTD_match_t) + sizeof(ZSTD_optimal_t));
|
253
|
+
size_t const neededSpace = tableSpace + (256*sizeof(U32)) /* huffTable */ + tokenSpace
|
254
|
+
+ (((params.cParams.strategy == ZSTD_btopt) || (params.cParams.strategy == ZSTD_btopt2)) ? optSpace : 0);
|
255
|
+
if (zc->workSpaceSize < neededSpace) {
|
256
|
+
ZSTD_free(zc->workSpace, zc->customMem);
|
257
|
+
zc->workSpace = ZSTD_malloc(neededSpace, zc->customMem);
|
258
|
+
if (zc->workSpace == NULL) return ERROR(memory_allocation);
|
259
|
+
zc->workSpaceSize = neededSpace;
|
260
|
+
} }
|
300
261
|
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
262
|
+
if (crp!=ZSTDcrp_noMemset) memset(zc->workSpace, 0, tableSpace); /* reset tables only */
|
263
|
+
XXH64_reset(&zc->xxhState, 0);
|
264
|
+
zc->hashLog3 = hashLog3;
|
265
|
+
zc->hashTable = (U32*)(zc->workSpace);
|
266
|
+
zc->chainTable = zc->hashTable + hSize;
|
267
|
+
zc->hashTable3 = zc->chainTable + chainSize;
|
268
|
+
ptr = zc->hashTable3 + h3Size;
|
269
|
+
zc->hufTable = (HUF_CElt*)ptr;
|
270
|
+
zc->flagStaticTables = 0;
|
271
|
+
ptr = ((U32*)ptr) + 256; /* note : HUF_CElt* is incomplete type, size is simulated using U32 */
|
272
|
+
|
273
|
+
zc->nextToUpdate = 1;
|
274
|
+
zc->nextSrc = NULL;
|
275
|
+
zc->base = NULL;
|
276
|
+
zc->dictBase = NULL;
|
277
|
+
zc->dictLimit = 0;
|
278
|
+
zc->lowLimit = 0;
|
279
|
+
zc->params = params;
|
280
|
+
zc->blockSize = blockSize;
|
281
|
+
zc->frameContentSize = frameContentSize;
|
282
|
+
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) zc->rep[i] = repStartValue[i]; }
|
283
|
+
|
284
|
+
if ((params.cParams.strategy == ZSTD_btopt) || (params.cParams.strategy == ZSTD_btopt2)) {
|
285
|
+
zc->seqStore.litFreq = (U32*)ptr;
|
286
|
+
zc->seqStore.litLengthFreq = zc->seqStore.litFreq + (1<<Litbits);
|
287
|
+
zc->seqStore.matchLengthFreq = zc->seqStore.litLengthFreq + (MaxLL+1);
|
288
|
+
zc->seqStore.offCodeFreq = zc->seqStore.matchLengthFreq + (MaxML+1);
|
289
|
+
ptr = zc->seqStore.offCodeFreq + (MaxOff+1);
|
290
|
+
zc->seqStore.matchTable = (ZSTD_match_t*)ptr;
|
291
|
+
ptr = zc->seqStore.matchTable + ZSTD_OPT_NUM+1;
|
292
|
+
zc->seqStore.priceTable = (ZSTD_optimal_t*)ptr;
|
293
|
+
ptr = zc->seqStore.priceTable + ZSTD_OPT_NUM+1;
|
294
|
+
zc->seqStore.litLengthSum = 0;
|
295
|
+
}
|
296
|
+
zc->seqStore.sequencesStart = (seqDef*)ptr;
|
297
|
+
ptr = zc->seqStore.sequencesStart + maxNbSeq;
|
298
|
+
zc->seqStore.llCode = (BYTE*) ptr;
|
299
|
+
zc->seqStore.mlCode = zc->seqStore.llCode + maxNbSeq;
|
300
|
+
zc->seqStore.ofCode = zc->seqStore.mlCode + maxNbSeq;
|
301
|
+
zc->seqStore.litStart = zc->seqStore.ofCode + maxNbSeq;
|
302
|
+
|
303
|
+
zc->stage = ZSTDcs_init;
|
304
|
+
zc->dictID = 0;
|
305
|
+
zc->loadedDictEnd = 0;
|
306
|
+
|
307
|
+
return 0;
|
334
308
|
}
|
335
|
-
zc->seqStore.offsetStart = (U32*)(zc->seqStore.buffer);
|
336
|
-
zc->seqStore.buffer = zc->seqStore.offsetStart + maxNbSeq;
|
337
|
-
zc->seqStore.litLengthStart = (U16*)zc->seqStore.buffer;
|
338
|
-
zc->seqStore.matchLengthStart = zc->seqStore.litLengthStart + maxNbSeq;
|
339
|
-
zc->seqStore.llCodeStart = (BYTE*) (zc->seqStore.matchLengthStart + maxNbSeq);
|
340
|
-
zc->seqStore.mlCodeStart = zc->seqStore.llCodeStart + maxNbSeq;
|
341
|
-
zc->seqStore.offCodeStart = zc->seqStore.mlCodeStart + maxNbSeq;
|
342
|
-
zc->seqStore.litStart = zc->seqStore.offCodeStart + maxNbSeq;
|
343
|
-
|
344
|
-
zc->stage = 1;
|
345
|
-
zc->dictID = 0;
|
346
|
-
zc->loadedDictEnd = 0;
|
347
|
-
|
348
|
-
return 0;
|
349
309
|
}
|
350
310
|
|
351
311
|
|
352
312
|
/*! ZSTD_copyCCtx() :
|
353
313
|
* Duplicate an existing context `srcCCtx` into another one `dstCCtx`.
|
354
|
-
* Only works during stage
|
314
|
+
* Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()).
|
355
315
|
* @return : 0, or an error code */
|
356
|
-
size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx)
|
316
|
+
size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx, unsigned long long pledgedSrcSize)
|
357
317
|
{
|
358
|
-
if (srcCCtx->stage!=
|
318
|
+
if (srcCCtx->stage!=ZSTDcs_init) return ERROR(stage_wrong);
|
359
319
|
|
360
320
|
memcpy(&dstCCtx->customMem, &srcCCtx->customMem, sizeof(ZSTD_customMem));
|
361
|
-
ZSTD_resetCCtx_advanced(dstCCtx, srcCCtx->params,
|
362
|
-
dstCCtx->params.fParams.contentSizeFlag = 0; /* content size different from the one set during srcCCtx init */
|
321
|
+
ZSTD_resetCCtx_advanced(dstCCtx, srcCCtx->params, pledgedSrcSize, ZSTDcrp_noMemset);
|
363
322
|
|
364
323
|
/* copy tables */
|
365
|
-
{ const
|
366
|
-
const
|
367
|
-
const
|
368
|
-
const
|
324
|
+
{ size_t const chainSize = (srcCCtx->params.cParams.strategy == ZSTD_fast) ? 0 : (1 << srcCCtx->params.cParams.chainLog);
|
325
|
+
size_t const hSize = ((size_t)1) << srcCCtx->params.cParams.hashLog;
|
326
|
+
size_t const h3Size = (size_t)1 << srcCCtx->hashLog3;
|
327
|
+
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
369
328
|
memcpy(dstCCtx->workSpace, srcCCtx->workSpace, tableSpace);
|
370
329
|
}
|
371
330
|
|
@@ -408,13 +367,13 @@ static void ZSTD_reduceTable (U32* const table, U32 const size, U32 const reduce
|
|
408
367
|
* rescale all indexes to avoid future overflow (indexes are U32) */
|
409
368
|
static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
|
410
369
|
{
|
411
|
-
{ const
|
370
|
+
{ U32 const hSize = 1 << zc->params.cParams.hashLog;
|
412
371
|
ZSTD_reduceTable(zc->hashTable, hSize, reducerValue); }
|
413
372
|
|
414
|
-
{ const
|
373
|
+
{ U32 const chainSize = (zc->params.cParams.strategy == ZSTD_fast) ? 0 : (1 << zc->params.cParams.chainLog);
|
415
374
|
ZSTD_reduceTable(zc->chainTable, chainSize, reducerValue); }
|
416
375
|
|
417
|
-
{ const
|
376
|
+
{ U32 const h3Size = (zc->hashLog3) ? 1 << zc->hashLog3 : 0;
|
418
377
|
ZSTD_reduceTable(zc->hashTable3, h3Size, reducerValue); }
|
419
378
|
}
|
420
379
|
|
@@ -423,149 +382,13 @@ static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
|
|
423
382
|
* Block entropic compression
|
424
383
|
*********************************************************/
|
425
384
|
|
426
|
-
/*
|
427
|
-
Frame Header - [ Block Header - Block ] - Frame End
|
428
|
-
1) Frame Header
|
429
|
-
- 4 bytes : Magic Number : ZSTD_MAGICNUMBER (defined within zstd_static.h)
|
430
|
-
- 1 byte : Frame Header Descriptor
|
431
|
-
- 1-13 bytes : Optional fields
|
432
|
-
2) Block Header
|
433
|
-
- 3 bytes, starting with a 2-bits descriptor
|
434
|
-
Uncompressed, Compressed, Frame End, unused
|
435
|
-
3) Block
|
436
|
-
See Block Format Description
|
437
|
-
4) Frame End
|
438
|
-
- 3 bytes, compatible with Block Header
|
439
|
-
*/
|
440
|
-
|
441
|
-
|
442
|
-
/* Frame header :
|
443
|
-
|
444
|
-
1 byte - FrameHeaderDescription :
|
445
|
-
bit 0-1 : dictID (0, 1, 2 or 4 bytes)
|
446
|
-
bit 2-4 : reserved (must be zero)
|
447
|
-
bit 5 : SkippedWindowLog (if 1, WindowLog byte is not present)
|
448
|
-
bit 6-7 : FrameContentFieldsize (0, 2, 4, or 8)
|
449
|
-
if (SkippedWindowLog && !FrameContentFieldsize) FrameContentFieldsize=1;
|
450
|
-
|
451
|
-
Optional : WindowLog (0 or 1 byte)
|
452
|
-
bit 0-2 : octal Fractional (1/8th)
|
453
|
-
bit 3-7 : Power of 2, with 0 = 1 KB (up to 2 TB)
|
454
|
-
|
455
|
-
Optional : content size (0, 1, 2, 4 or 8 bytes)
|
456
|
-
0 : unknown
|
457
|
-
1 : 0-255 bytes
|
458
|
-
2 : 256 - 65535+256
|
459
|
-
8 : up to 16 exa
|
460
|
-
|
461
|
-
Optional : dictID (0, 1, 2 or 4 bytes)
|
462
|
-
Automatic adaptation
|
463
|
-
0 : no dictID
|
464
|
-
1 : 1 - 255
|
465
|
-
2 : 256 - 65535
|
466
|
-
4 : all other values
|
467
|
-
*/
|
468
|
-
|
469
|
-
|
470
|
-
/* Block format description
|
471
|
-
|
472
|
-
Block = Literals Section - Sequences Section
|
473
|
-
Prerequisite : size of (compressed) block, maximum size of regenerated data
|
474
|
-
|
475
|
-
1) Literal Section
|
476
|
-
|
477
|
-
1.1) Header : 1-5 bytes
|
478
|
-
flags: 2 bits
|
479
|
-
00 compressed by Huff0
|
480
|
-
01 repeat
|
481
|
-
10 is Raw (uncompressed)
|
482
|
-
11 is Rle
|
483
|
-
Note : using 01 => Huff0 with precomputed table ?
|
484
|
-
Note : delta map ? => compressed ?
|
485
|
-
|
486
|
-
1.1.1) Huff0-compressed literal block : 3-5 bytes
|
487
|
-
srcSize < 1 KB => 3 bytes (2-2-10-10) => single stream
|
488
|
-
srcSize < 1 KB => 3 bytes (2-2-10-10)
|
489
|
-
srcSize < 16KB => 4 bytes (2-2-14-14)
|
490
|
-
else => 5 bytes (2-2-18-18)
|
491
|
-
big endian convention
|
492
|
-
|
493
|
-
1.1.2) Raw (uncompressed) literal block header : 1-3 bytes
|
494
|
-
size : 5 bits: (IS_RAW<<6) + (0<<4) + size
|
495
|
-
12 bits: (IS_RAW<<6) + (2<<4) + (size>>8)
|
496
|
-
size&255
|
497
|
-
20 bits: (IS_RAW<<6) + (3<<4) + (size>>16)
|
498
|
-
size>>8&255
|
499
|
-
size&255
|
500
|
-
|
501
|
-
1.1.3) Rle (repeated single byte) literal block header : 1-3 bytes
|
502
|
-
size : 5 bits: (IS_RLE<<6) + (0<<4) + size
|
503
|
-
12 bits: (IS_RLE<<6) + (2<<4) + (size>>8)
|
504
|
-
size&255
|
505
|
-
20 bits: (IS_RLE<<6) + (3<<4) + (size>>16)
|
506
|
-
size>>8&255
|
507
|
-
size&255
|
508
|
-
|
509
|
-
1.1.4) Huff0-compressed literal block, using precomputed CTables : 3-5 bytes
|
510
|
-
srcSize < 1 KB => 3 bytes (2-2-10-10) => single stream
|
511
|
-
srcSize < 1 KB => 3 bytes (2-2-10-10)
|
512
|
-
srcSize < 16KB => 4 bytes (2-2-14-14)
|
513
|
-
else => 5 bytes (2-2-18-18)
|
514
|
-
big endian convention
|
515
|
-
|
516
|
-
1- CTable available (stored into workspace)
|
517
|
-
2- Small input (fast heuristic ? Full comparison ? depend on clevel ?)
|
518
|
-
|
519
|
-
|
520
|
-
1.2) Literal block content
|
521
|
-
|
522
|
-
1.2.1) Huff0 block, using sizes from header
|
523
|
-
See Huff0 format
|
524
|
-
|
525
|
-
1.2.2) Huff0 block, using prepared table
|
526
|
-
|
527
|
-
1.2.3) Raw content
|
528
|
-
|
529
|
-
1.2.4) single byte
|
530
|
-
|
531
|
-
|
532
|
-
2) Sequences section
|
533
|
-
|
534
|
-
- Nb Sequences : 2 bytes, little endian
|
535
|
-
- Control Token : 1 byte (see below)
|
536
|
-
- Dumps Length : 1 or 2 bytes (depending on control token)
|
537
|
-
- Dumps : as stated by dumps length
|
538
|
-
- Literal Lengths FSE table (as needed depending on encoding method)
|
539
|
-
- Offset Codes FSE table (as needed depending on encoding method)
|
540
|
-
- Match Lengths FSE table (as needed depending on encoding method)
|
541
|
-
|
542
|
-
2.1) Control Token
|
543
|
-
8 bits, divided as :
|
544
|
-
0-1 : dumpsLength
|
545
|
-
2-3 : MatchLength, FSE encoding method
|
546
|
-
4-5 : Offset Codes, FSE encoding method
|
547
|
-
6-7 : Literal Lengths, FSE encoding method
|
548
|
-
|
549
|
-
FSE encoding method :
|
550
|
-
FSE_ENCODING_RAW : uncompressed; no header
|
551
|
-
FSE_ENCODING_RLE : single repeated value; header 1 byte
|
552
|
-
FSE_ENCODING_STATIC : use prepared table; no header
|
553
|
-
FSE_ENCODING_DYNAMIC : read NCount
|
554
|
-
*/
|
385
|
+
/* See doc/zstd_compression_format.md for detailed format description */
|
555
386
|
|
556
387
|
size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
557
388
|
{
|
558
|
-
BYTE* const ostart = (BYTE* const)dst;
|
559
|
-
|
560
389
|
if (srcSize + ZSTD_blockHeaderSize > dstCapacity) return ERROR(dstSize_tooSmall);
|
561
|
-
memcpy(
|
562
|
-
|
563
|
-
/* Build header */
|
564
|
-
ostart[0] = (BYTE)(srcSize>>16);
|
565
|
-
ostart[1] = (BYTE)(srcSize>>8);
|
566
|
-
ostart[2] = (BYTE) srcSize;
|
567
|
-
ostart[0] += (BYTE)(bt_raw<<6); /* is a raw (uncompressed) block */
|
568
|
-
|
390
|
+
memcpy((BYTE*)dst + ZSTD_blockHeaderSize, src, srcSize);
|
391
|
+
MEM_writeLE24(dst, (U32)(srcSize << 2) + (U32)bt_raw);
|
569
392
|
return ZSTD_blockHeaderSize+srcSize;
|
570
393
|
}
|
571
394
|
|
@@ -573,24 +396,21 @@ size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const void* src, siz
|
|
573
396
|
static size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
574
397
|
{
|
575
398
|
BYTE* const ostart = (BYTE* const)dst;
|
576
|
-
U32
|
399
|
+
U32 const flSize = 1 + (srcSize>31) + (srcSize>4095);
|
577
400
|
|
578
401
|
if (srcSize + flSize > dstCapacity) return ERROR(dstSize_tooSmall);
|
579
402
|
|
580
403
|
switch(flSize)
|
581
404
|
{
|
582
405
|
case 1: /* 2 - 1 - 5 */
|
583
|
-
ostart[0] = (BYTE)((
|
406
|
+
ostart[0] = (BYTE)((U32)set_basic + (srcSize<<3));
|
584
407
|
break;
|
585
408
|
case 2: /* 2 - 2 - 12 */
|
586
|
-
ostart
|
587
|
-
ostart[1] = (BYTE)srcSize;
|
409
|
+
MEM_writeLE16(ostart, (U16)((U32)set_basic + (1<<2) + (srcSize<<4)));
|
588
410
|
break;
|
589
411
|
default: /*note : should not be necessary : flSize is within {1,2,3} */
|
590
412
|
case 3: /* 2 - 2 - 20 */
|
591
|
-
ostart
|
592
|
-
ostart[1] = (BYTE)(srcSize>>8);
|
593
|
-
ostart[2] = (BYTE)srcSize;
|
413
|
+
MEM_writeLE32(ostart, (U32)((U32)set_basic + (3<<2) + (srcSize<<4)));
|
594
414
|
break;
|
595
415
|
}
|
596
416
|
|
@@ -601,24 +421,21 @@ static size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void
|
|
601
421
|
static size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
602
422
|
{
|
603
423
|
BYTE* const ostart = (BYTE* const)dst;
|
604
|
-
U32
|
424
|
+
U32 const flSize = 1 + (srcSize>31) + (srcSize>4095);
|
605
425
|
|
606
|
-
(void)dstCapacity; /* dstCapacity guaranteed to be >=4, hence large enough */
|
426
|
+
(void)dstCapacity; /* dstCapacity already guaranteed to be >=4, hence large enough */
|
607
427
|
|
608
428
|
switch(flSize)
|
609
429
|
{
|
610
430
|
case 1: /* 2 - 1 - 5 */
|
611
|
-
ostart[0] = (BYTE)((
|
431
|
+
ostart[0] = (BYTE)((U32)set_rle + (srcSize<<3));
|
612
432
|
break;
|
613
433
|
case 2: /* 2 - 2 - 12 */
|
614
|
-
ostart
|
615
|
-
ostart[1] = (BYTE)srcSize;
|
434
|
+
MEM_writeLE16(ostart, (U16)((U32)set_rle + (1<<2) + (srcSize<<4)));
|
616
435
|
break;
|
617
436
|
default: /*note : should not be necessary : flSize is necessarily within {1,2,3} */
|
618
437
|
case 3: /* 2 - 2 - 20 */
|
619
|
-
ostart
|
620
|
-
ostart[1] = (BYTE)(srcSize>>8);
|
621
|
-
ostart[2] = (BYTE)srcSize;
|
438
|
+
MEM_writeLE32(ostart, (U32)((U32)set_rle + (3<<2) + (srcSize<<4)));
|
622
439
|
break;
|
623
440
|
}
|
624
441
|
|
@@ -635,9 +452,9 @@ static size_t ZSTD_compressLiterals (ZSTD_CCtx* zc,
|
|
635
452
|
{
|
636
453
|
size_t const minGain = ZSTD_minGain(srcSize);
|
637
454
|
size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB);
|
638
|
-
BYTE*
|
455
|
+
BYTE* const ostart = (BYTE*)dst;
|
639
456
|
U32 singleStream = srcSize < 256;
|
640
|
-
|
457
|
+
symbolEncodingType_e hType = set_compressed;
|
641
458
|
size_t cLitSize;
|
642
459
|
|
643
460
|
|
@@ -649,7 +466,7 @@ static size_t ZSTD_compressLiterals (ZSTD_CCtx* zc,
|
|
649
466
|
|
650
467
|
if (dstCapacity < lhSize+1) return ERROR(dstSize_tooSmall); /* not enough space for compression */
|
651
468
|
if (zc->flagStaticTables && (lhSize==3)) {
|
652
|
-
hType =
|
469
|
+
hType = set_repeat;
|
653
470
|
singleStream = 1;
|
654
471
|
cLitSize = HUF_compress1X_usingCTable(ostart+lhSize, dstCapacity-lhSize, src, srcSize, zc->hufTable);
|
655
472
|
} else {
|
@@ -666,79 +483,66 @@ static size_t ZSTD_compressLiterals (ZSTD_CCtx* zc,
|
|
666
483
|
switch(lhSize)
|
667
484
|
{
|
668
485
|
case 3: /* 2 - 2 - 10 - 10 */
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
486
|
+
{ U32 const lhc = hType + ((!singleStream) << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<14);
|
487
|
+
MEM_writeLE24(ostart, lhc);
|
488
|
+
break;
|
489
|
+
}
|
673
490
|
case 4: /* 2 - 2 - 14 - 14 */
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
break;
|
491
|
+
{ U32 const lhc = hType + (2 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<18);
|
492
|
+
MEM_writeLE32(ostart, lhc);
|
493
|
+
break;
|
494
|
+
}
|
679
495
|
default: /* should not be necessary, lhSize is only {3,4,5} */
|
680
496
|
case 5: /* 2 - 2 - 18 - 18 */
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
break;
|
497
|
+
{ U32 const lhc = hType + (3 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<22);
|
498
|
+
MEM_writeLE32(ostart, lhc);
|
499
|
+
ostart[4] = (BYTE)(cLitSize >> 10);
|
500
|
+
break;
|
501
|
+
}
|
687
502
|
}
|
688
503
|
return lhSize+cLitSize;
|
689
504
|
}
|
690
505
|
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39,
|
727
|
-
40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
|
728
|
-
41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
|
729
|
-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
730
|
-
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 };
|
731
|
-
const BYTE ML_deltaCode = 36;
|
732
|
-
const U16* const mlTable = seqStorePtr->matchLengthStart;
|
733
|
-
BYTE* const mlCodeTable = seqStorePtr->mlCodeStart;
|
734
|
-
size_t u;
|
735
|
-
for (u=0; u<nbSeq; u++) {
|
736
|
-
U32 const ml = mlTable[u];
|
737
|
-
mlCodeTable[u] = (ml>127) ? (BYTE)ZSTD_highbit32(ml) + ML_deltaCode : ML_Code[ml];
|
738
|
-
}
|
739
|
-
if (seqStorePtr->longLengthID==2)
|
740
|
-
mlCodeTable[seqStorePtr->longLengthPos] = MaxML;
|
506
|
+
static const BYTE LL_Code[64] = { 0, 1, 2, 3, 4, 5, 6, 7,
|
507
|
+
8, 9, 10, 11, 12, 13, 14, 15,
|
508
|
+
16, 16, 17, 17, 18, 18, 19, 19,
|
509
|
+
20, 20, 20, 20, 21, 21, 21, 21,
|
510
|
+
22, 22, 22, 22, 22, 22, 22, 22,
|
511
|
+
23, 23, 23, 23, 23, 23, 23, 23,
|
512
|
+
24, 24, 24, 24, 24, 24, 24, 24,
|
513
|
+
24, 24, 24, 24, 24, 24, 24, 24 };
|
514
|
+
|
515
|
+
static const BYTE ML_Code[128] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
516
|
+
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
517
|
+
32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37,
|
518
|
+
38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39,
|
519
|
+
40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
|
520
|
+
41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
|
521
|
+
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
522
|
+
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 };
|
523
|
+
|
524
|
+
|
525
|
+
void ZSTD_seqToCodes(const seqStore_t* seqStorePtr)
|
526
|
+
{
|
527
|
+
BYTE const LL_deltaCode = 19;
|
528
|
+
BYTE const ML_deltaCode = 36;
|
529
|
+
const seqDef* const sequences = seqStorePtr->sequencesStart;
|
530
|
+
BYTE* const llCodeTable = seqStorePtr->llCode;
|
531
|
+
BYTE* const ofCodeTable = seqStorePtr->ofCode;
|
532
|
+
BYTE* const mlCodeTable = seqStorePtr->mlCode;
|
533
|
+
U32 const nbSeq = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
|
534
|
+
U32 u;
|
535
|
+
for (u=0; u<nbSeq; u++) {
|
536
|
+
U32 const llv = sequences[u].litLength;
|
537
|
+
U32 const mlv = sequences[u].matchLength;
|
538
|
+
llCodeTable[u] = (llv> 63) ? (BYTE)ZSTD_highbit32(llv) + LL_deltaCode : LL_Code[llv];
|
539
|
+
ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u].offset);
|
540
|
+
mlCodeTable[u] = (mlv>127) ? (BYTE)ZSTD_highbit32(mlv) + ML_deltaCode : ML_Code[mlv];
|
741
541
|
}
|
542
|
+
if (seqStorePtr->longLengthID==1)
|
543
|
+
llCodeTable[seqStorePtr->longLengthPos] = MaxLL;
|
544
|
+
if (seqStorePtr->longLengthID==2)
|
545
|
+
mlCodeTable[seqStorePtr->longLengthPos] = MaxML;
|
742
546
|
}
|
743
547
|
|
744
548
|
|
@@ -753,17 +557,14 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
753
557
|
FSE_CTable* CTable_OffsetBits = zc->offcodeCTable;
|
754
558
|
FSE_CTable* CTable_MatchLength = zc->matchlengthCTable;
|
755
559
|
U32 LLtype, Offtype, MLtype; /* compressed, raw or rle */
|
756
|
-
|
757
|
-
|
758
|
-
const
|
759
|
-
const
|
760
|
-
BYTE* const ofCodeTable = seqStorePtr->offCodeStart;
|
761
|
-
BYTE* const llCodeTable = seqStorePtr->llCodeStart;
|
762
|
-
BYTE* const mlCodeTable = seqStorePtr->mlCodeStart;
|
560
|
+
const seqDef* const sequences = seqStorePtr->sequencesStart;
|
561
|
+
const BYTE* const ofCodeTable = seqStorePtr->ofCode;
|
562
|
+
const BYTE* const llCodeTable = seqStorePtr->llCode;
|
563
|
+
const BYTE* const mlCodeTable = seqStorePtr->mlCode;
|
763
564
|
BYTE* const ostart = (BYTE*)dst;
|
764
565
|
BYTE* const oend = ostart + dstCapacity;
|
765
566
|
BYTE* op = ostart;
|
766
|
-
size_t const nbSeq =
|
567
|
+
size_t const nbSeq = seqStorePtr->sequences - seqStorePtr->sequencesStart;
|
767
568
|
BYTE* seqHead;
|
768
569
|
|
769
570
|
/* Compress literals */
|
@@ -788,7 +589,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
788
589
|
#define MAX_SEQ_FOR_STATIC_FSE 1000
|
789
590
|
|
790
591
|
/* convert length/distances into codes */
|
791
|
-
ZSTD_seqToCodes(seqStorePtr
|
592
|
+
ZSTD_seqToCodes(seqStorePtr);
|
792
593
|
|
793
594
|
/* CTable for Literal Lengths */
|
794
595
|
{ U32 max = MaxLL;
|
@@ -796,12 +597,12 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
796
597
|
if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
|
797
598
|
*op++ = llCodeTable[0];
|
798
599
|
FSE_buildCTable_rle(CTable_LitLength, (BYTE)max);
|
799
|
-
LLtype =
|
600
|
+
LLtype = set_rle;
|
800
601
|
} else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
|
801
|
-
LLtype =
|
602
|
+
LLtype = set_repeat;
|
802
603
|
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (LL_defaultNormLog-1)))) {
|
803
604
|
FSE_buildCTable(CTable_LitLength, LL_defaultNorm, MaxLL, LL_defaultNormLog);
|
804
|
-
LLtype =
|
605
|
+
LLtype = set_basic;
|
805
606
|
} else {
|
806
607
|
size_t nbSeq_1 = nbSeq;
|
807
608
|
const U32 tableLog = FSE_optimalTableLog(LLFSELog, nbSeq, max);
|
@@ -811,7 +612,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
811
612
|
if (FSE_isError(NCountSize)) return ERROR(GENERIC);
|
812
613
|
op += NCountSize; }
|
813
614
|
FSE_buildCTable(CTable_LitLength, norm, max, tableLog);
|
814
|
-
LLtype =
|
615
|
+
LLtype = set_compressed;
|
815
616
|
} }
|
816
617
|
|
817
618
|
/* CTable for Offsets */
|
@@ -820,12 +621,12 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
820
621
|
if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
|
821
622
|
*op++ = ofCodeTable[0];
|
822
623
|
FSE_buildCTable_rle(CTable_OffsetBits, (BYTE)max);
|
823
|
-
Offtype =
|
624
|
+
Offtype = set_rle;
|
824
625
|
} else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
|
825
|
-
Offtype =
|
626
|
+
Offtype = set_repeat;
|
826
627
|
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (OF_defaultNormLog-1)))) {
|
827
628
|
FSE_buildCTable(CTable_OffsetBits, OF_defaultNorm, MaxOff, OF_defaultNormLog);
|
828
|
-
Offtype =
|
629
|
+
Offtype = set_basic;
|
829
630
|
} else {
|
830
631
|
size_t nbSeq_1 = nbSeq;
|
831
632
|
const U32 tableLog = FSE_optimalTableLog(OffFSELog, nbSeq, max);
|
@@ -835,7 +636,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
835
636
|
if (FSE_isError(NCountSize)) return ERROR(GENERIC);
|
836
637
|
op += NCountSize; }
|
837
638
|
FSE_buildCTable(CTable_OffsetBits, norm, max, tableLog);
|
838
|
-
Offtype =
|
639
|
+
Offtype = set_compressed;
|
839
640
|
} }
|
840
641
|
|
841
642
|
/* CTable for MatchLengths */
|
@@ -844,12 +645,12 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
844
645
|
if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
|
845
646
|
*op++ = *mlCodeTable;
|
846
647
|
FSE_buildCTable_rle(CTable_MatchLength, (BYTE)max);
|
847
|
-
MLtype =
|
648
|
+
MLtype = set_rle;
|
848
649
|
} else if ((zc->flagStaticTables) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
|
849
|
-
MLtype =
|
650
|
+
MLtype = set_repeat;
|
850
651
|
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (ML_defaultNormLog-1)))) {
|
851
652
|
FSE_buildCTable(CTable_MatchLength, ML_defaultNorm, MaxML, ML_defaultNormLog);
|
852
|
-
MLtype =
|
653
|
+
MLtype = set_basic;
|
853
654
|
} else {
|
854
655
|
size_t nbSeq_1 = nbSeq;
|
855
656
|
const U32 tableLog = FSE_optimalTableLog(MLFSELog, nbSeq, max);
|
@@ -859,7 +660,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
859
660
|
if (FSE_isError(NCountSize)) return ERROR(GENERIC);
|
860
661
|
op += NCountSize; }
|
861
662
|
FSE_buildCTable(CTable_MatchLength, norm, max, tableLog);
|
862
|
-
MLtype =
|
663
|
+
MLtype = set_compressed;
|
863
664
|
} }
|
864
665
|
|
865
666
|
*seqHead = (BYTE)((LLtype<<6) + (Offtype<<4) + (MLtype<<2));
|
@@ -871,28 +672,27 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
871
672
|
FSE_CState_t stateOffsetBits;
|
872
673
|
FSE_CState_t stateLitLength;
|
873
674
|
|
874
|
-
|
875
|
-
if (ERR_isError(errorCode)) return ERROR(dstSize_tooSmall); } /* not enough space remaining */
|
675
|
+
CHECK_E(BIT_initCStream(&blockStream, op, oend-op), dstSize_tooSmall); /* not enough space remaining */
|
876
676
|
|
877
677
|
/* first symbols */
|
878
678
|
FSE_initCState2(&stateMatchLength, CTable_MatchLength, mlCodeTable[nbSeq-1]);
|
879
679
|
FSE_initCState2(&stateOffsetBits, CTable_OffsetBits, ofCodeTable[nbSeq-1]);
|
880
680
|
FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]);
|
881
|
-
BIT_addBits(&blockStream,
|
681
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].litLength, LL_bits[llCodeTable[nbSeq-1]]);
|
882
682
|
if (MEM_32bits()) BIT_flushBits(&blockStream);
|
883
|
-
BIT_addBits(&blockStream,
|
683
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].matchLength, ML_bits[mlCodeTable[nbSeq-1]]);
|
884
684
|
if (MEM_32bits()) BIT_flushBits(&blockStream);
|
885
|
-
BIT_addBits(&blockStream,
|
685
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].offset, ofCodeTable[nbSeq-1]);
|
886
686
|
BIT_flushBits(&blockStream);
|
887
687
|
|
888
688
|
{ size_t n;
|
889
689
|
for (n=nbSeq-2 ; n<nbSeq ; n--) { /* intentional underflow */
|
890
|
-
const
|
891
|
-
const
|
892
|
-
const
|
893
|
-
const
|
894
|
-
|
895
|
-
|
690
|
+
BYTE const llCode = llCodeTable[n];
|
691
|
+
BYTE const ofCode = ofCodeTable[n];
|
692
|
+
BYTE const mlCode = mlCodeTable[n];
|
693
|
+
U32 const llBits = LL_bits[llCode];
|
694
|
+
U32 const ofBits = ofCode; /* 32b*/ /* 64b*/
|
695
|
+
U32 const mlBits = ML_bits[mlCode];
|
896
696
|
/* (7)*/ /* (7)*/
|
897
697
|
FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */
|
898
698
|
FSE_encodeSymbol(&blockStream, &stateMatchLength, mlCode); /* 24 */ /* 24 */
|
@@ -900,11 +700,11 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
|
|
900
700
|
FSE_encodeSymbol(&blockStream, &stateLitLength, llCode); /* 16 */ /* 33 */
|
901
701
|
if (MEM_32bits() || (ofBits+mlBits+llBits >= 64-7-(LLFSELog+MLFSELog+OffFSELog)))
|
902
702
|
BIT_flushBits(&blockStream); /* (7)*/
|
903
|
-
BIT_addBits(&blockStream,
|
703
|
+
BIT_addBits(&blockStream, sequences[n].litLength, llBits);
|
904
704
|
if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream);
|
905
|
-
BIT_addBits(&blockStream,
|
705
|
+
BIT_addBits(&blockStream, sequences[n].matchLength, mlBits);
|
906
706
|
if (MEM_32bits()) BIT_flushBits(&blockStream); /* (7)*/
|
907
|
-
BIT_addBits(&blockStream,
|
707
|
+
BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */
|
908
708
|
BIT_flushBits(&blockStream); /* (7)*/
|
909
709
|
} }
|
910
710
|
|
@@ -945,22 +745,22 @@ MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const v
|
|
945
745
|
printf("Cpos %6u :%5u literals & match %3u bytes at distance %6u \n",
|
946
746
|
pos, (U32)litLength, (U32)matchCode+MINMATCH, (U32)offsetCode);
|
947
747
|
#endif
|
948
|
-
ZSTD_statsUpdatePrices(&seqStorePtr->stats, litLength, (const BYTE*)literals, offsetCode, matchCode); /* debug only */
|
949
|
-
|
950
748
|
/* copy Literals */
|
951
749
|
ZSTD_wildcopy(seqStorePtr->lit, literals, litLength);
|
952
750
|
seqStorePtr->lit += litLength;
|
953
751
|
|
954
752
|
/* literal Length */
|
955
|
-
if (litLength>0xFFFF) { seqStorePtr->longLengthID = 1; seqStorePtr->longLengthPos = (U32)(seqStorePtr->
|
956
|
-
|
753
|
+
if (litLength>0xFFFF) { seqStorePtr->longLengthID = 1; seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); }
|
754
|
+
seqStorePtr->sequences[0].litLength = (U16)litLength;
|
957
755
|
|
958
756
|
/* match offset */
|
959
|
-
|
757
|
+
seqStorePtr->sequences[0].offset = offsetCode + 1;
|
960
758
|
|
961
759
|
/* match Length */
|
962
|
-
if (matchCode>0xFFFF) { seqStorePtr->longLengthID = 2; seqStorePtr->longLengthPos = (U32)(seqStorePtr->
|
963
|
-
|
760
|
+
if (matchCode>0xFFFF) { seqStorePtr->longLengthID = 2; seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); }
|
761
|
+
seqStorePtr->sequences[0].matchLength = (U16)matchCode;
|
762
|
+
|
763
|
+
seqStorePtr->sequences++;
|
964
764
|
}
|
965
765
|
|
966
766
|
|
@@ -1050,10 +850,9 @@ static size_t ZSTD_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* const
|
|
1050
850
|
static size_t ZSTD_count_2segments(const BYTE* ip, const BYTE* match, const BYTE* iEnd, const BYTE* mEnd, const BYTE* iStart)
|
1051
851
|
{
|
1052
852
|
const BYTE* const vEnd = MIN( ip + (mEnd - match), iEnd);
|
1053
|
-
size_t matchLength = ZSTD_count(ip, match, vEnd);
|
1054
|
-
if (match + matchLength
|
1055
|
-
|
1056
|
-
return matchLength;
|
853
|
+
size_t const matchLength = ZSTD_count(ip, match, vEnd);
|
854
|
+
if (match + matchLength != mEnd) return matchLength;
|
855
|
+
return matchLength + ZSTD_count(ip+matchLength, iStart, iEnd);
|
1057
856
|
}
|
1058
857
|
|
1059
858
|
|
@@ -1080,7 +879,6 @@ static const U64 prime7bytes = 58295818150454627ULL;
|
|
1080
879
|
static size_t ZSTD_hash7(U64 u, U32 h) { return (size_t)(((u << (64-56)) * prime7bytes) >> (64-h)) ; }
|
1081
880
|
static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h); }
|
1082
881
|
|
1083
|
-
//static const U64 prime8bytes = 58295818150454627ULL;
|
1084
882
|
static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL;
|
1085
883
|
static size_t ZSTD_hash8(U64 u, U32 h) { return (size_t)(((u) * prime8bytes) >> (64-h)) ; }
|
1086
884
|
static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h); }
|
@@ -1105,10 +903,10 @@ static size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
|
|
1105
903
|
static void ZSTD_fillHashTable (ZSTD_CCtx* zc, const void* end, const U32 mls)
|
1106
904
|
{
|
1107
905
|
U32* const hashTable = zc->hashTable;
|
1108
|
-
const
|
906
|
+
U32 const hBits = zc->params.cParams.hashLog;
|
1109
907
|
const BYTE* const base = zc->base;
|
1110
908
|
const BYTE* ip = base + zc->nextToUpdate;
|
1111
|
-
const BYTE* const iend = ((const BYTE*)end) -
|
909
|
+
const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE;
|
1112
910
|
const size_t fastHashFillStep = 3;
|
1113
911
|
|
1114
912
|
while(ip <= iend) {
|
@@ -1120,20 +918,20 @@ static void ZSTD_fillHashTable (ZSTD_CCtx* zc, const void* end, const U32 mls)
|
|
1120
918
|
|
1121
919
|
FORCE_INLINE
|
1122
920
|
void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
|
1123
|
-
|
1124
|
-
|
921
|
+
const void* src, size_t srcSize,
|
922
|
+
const U32 mls)
|
1125
923
|
{
|
1126
924
|
U32* const hashTable = cctx->hashTable;
|
1127
|
-
const
|
925
|
+
U32 const hBits = cctx->params.cParams.hashLog;
|
1128
926
|
seqStore_t* seqStorePtr = &(cctx->seqStore);
|
1129
927
|
const BYTE* const base = cctx->base;
|
1130
928
|
const BYTE* const istart = (const BYTE*)src;
|
1131
929
|
const BYTE* ip = istart;
|
1132
930
|
const BYTE* anchor = istart;
|
1133
|
-
const U32
|
931
|
+
const U32 lowestIndex = cctx->dictLimit;
|
1134
932
|
const BYTE* const lowest = base + lowestIndex;
|
1135
933
|
const BYTE* const iend = istart + srcSize;
|
1136
|
-
const BYTE* const ilimit = iend -
|
934
|
+
const BYTE* const ilimit = iend - HASH_READ_SIZE;
|
1137
935
|
U32 offset_1=cctx->rep[0], offset_2=cctx->rep[1];
|
1138
936
|
U32 offsetSaved = 0;
|
1139
937
|
|
@@ -1153,7 +951,7 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
|
|
1153
951
|
const BYTE* match = base + matchIndex;
|
1154
952
|
hashTable[h] = current; /* update hash table */
|
1155
953
|
|
1156
|
-
if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) {
|
954
|
+
if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) {
|
1157
955
|
mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
|
1158
956
|
ip++;
|
1159
957
|
ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, 0, mLength-MINMATCH);
|
@@ -1288,7 +1086,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1288
1086
|
|
1289
1087
|
if (ip <= ilimit) {
|
1290
1088
|
/* Fill Table */
|
1291
|
-
|
1089
|
+
hashTable[ZSTD_hashPtr(base+current+2, hBits, mls)] = current+2;
|
1292
1090
|
hashTable[ZSTD_hashPtr(ip-2, hBits, mls)] = (U32)(ip-2-base);
|
1293
1091
|
/* check immediate repcode */
|
1294
1092
|
while (ip <= ilimit) {
|
@@ -1323,7 +1121,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1323
1121
|
static void ZSTD_compressBlock_fast_extDict(ZSTD_CCtx* ctx,
|
1324
1122
|
const void* src, size_t srcSize)
|
1325
1123
|
{
|
1326
|
-
const
|
1124
|
+
U32 const mls = ctx->params.cParams.searchLength;
|
1327
1125
|
switch(mls)
|
1328
1126
|
{
|
1329
1127
|
default:
|
@@ -1345,12 +1143,12 @@ static void ZSTD_compressBlock_fast_extDict(ZSTD_CCtx* ctx,
|
|
1345
1143
|
static void ZSTD_fillDoubleHashTable (ZSTD_CCtx* cctx, const void* end, const U32 mls)
|
1346
1144
|
{
|
1347
1145
|
U32* const hashLarge = cctx->hashTable;
|
1348
|
-
const
|
1146
|
+
U32 const hBitsL = cctx->params.cParams.hashLog;
|
1349
1147
|
U32* const hashSmall = cctx->chainTable;
|
1350
|
-
const
|
1148
|
+
U32 const hBitsS = cctx->params.cParams.chainLog;
|
1351
1149
|
const BYTE* const base = cctx->base;
|
1352
1150
|
const BYTE* ip = base + cctx->nextToUpdate;
|
1353
|
-
const BYTE* const iend = ((const BYTE*)end) -
|
1151
|
+
const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE;
|
1354
1152
|
const size_t fastHashFillStep = 3;
|
1355
1153
|
|
1356
1154
|
while(ip <= iend) {
|
@@ -1378,7 +1176,7 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
|
|
1378
1176
|
const U32 lowestIndex = cctx->dictLimit;
|
1379
1177
|
const BYTE* const lowest = base + lowestIndex;
|
1380
1178
|
const BYTE* const iend = istart + srcSize;
|
1381
|
-
const BYTE* const ilimit = iend -
|
1179
|
+
const BYTE* const ilimit = iend - HASH_READ_SIZE;
|
1382
1180
|
U32 offset_1=cctx->rep[0], offset_2=cctx->rep[1];
|
1383
1181
|
U32 offsetSaved = 0;
|
1384
1182
|
|
@@ -1412,9 +1210,20 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
|
|
1412
1210
|
offset = (U32)(ip-matchLong);
|
1413
1211
|
while (((ip>anchor) & (matchLong>lowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
|
1414
1212
|
} else if ( (matchIndexS > lowestIndex) && (MEM_read32(match) == MEM_read32(ip)) ) {
|
1415
|
-
|
1416
|
-
|
1417
|
-
|
1213
|
+
size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8);
|
1214
|
+
U32 const matchIndex3 = hashLong[h3];
|
1215
|
+
const BYTE* match3 = base + matchIndex3;
|
1216
|
+
hashLong[h3] = current + 1;
|
1217
|
+
if ( (matchIndex3 > lowestIndex) && (MEM_read64(match3) == MEM_read64(ip+1)) ) {
|
1218
|
+
mLength = ZSTD_count(ip+9, match3+8, iend) + 8;
|
1219
|
+
ip++;
|
1220
|
+
offset = (U32)(ip-match3);
|
1221
|
+
while (((ip>anchor) & (match3>lowest)) && (ip[-1] == match3[-1])) { ip--; match3--; mLength++; } /* catch up */
|
1222
|
+
} else {
|
1223
|
+
mLength = ZSTD_count(ip+4, match+4, iend) + 4;
|
1224
|
+
offset = (U32)(ip-match);
|
1225
|
+
while (((ip>anchor) & (match>lowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
|
1226
|
+
}
|
1418
1227
|
} else {
|
1419
1228
|
ip += ((ip-anchor) >> g_searchStrength) + 1;
|
1420
1229
|
continue;
|
@@ -1487,9 +1296,9 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1487
1296
|
const U32 mls)
|
1488
1297
|
{
|
1489
1298
|
U32* const hashLong = ctx->hashTable;
|
1490
|
-
const
|
1299
|
+
U32 const hBitsL = ctx->params.cParams.hashLog;
|
1491
1300
|
U32* const hashSmall = ctx->chainTable;
|
1492
|
-
const
|
1301
|
+
U32 const hBitsS = ctx->params.cParams.chainLog;
|
1493
1302
|
seqStore_t* seqStorePtr = &(ctx->seqStore);
|
1494
1303
|
const BYTE* const base = ctx->base;
|
1495
1304
|
const BYTE* const dictBase = ctx->dictBase;
|
@@ -1541,16 +1350,32 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1541
1350
|
offset_2 = offset_1;
|
1542
1351
|
offset_1 = offset;
|
1543
1352
|
ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
|
1353
|
+
|
1544
1354
|
} else if ((matchIndex > lowestIndex) && (MEM_read32(match) == MEM_read32(ip))) {
|
1545
|
-
const
|
1546
|
-
const
|
1355
|
+
size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8);
|
1356
|
+
U32 const matchIndex3 = hashLong[h3];
|
1357
|
+
const BYTE* const match3Base = matchIndex3 < dictLimit ? dictBase : base;
|
1358
|
+
const BYTE* match3 = match3Base + matchIndex3;
|
1547
1359
|
U32 offset;
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1360
|
+
hashLong[h3] = current + 1;
|
1361
|
+
if ( (matchIndex3 > lowestIndex) && (MEM_read64(match3) == MEM_read64(ip+1)) ) {
|
1362
|
+
const BYTE* matchEnd = matchIndex3 < dictLimit ? dictEnd : iend;
|
1363
|
+
const BYTE* lowMatchPtr = matchIndex3 < dictLimit ? dictStart : lowPrefixPtr;
|
1364
|
+
mLength = ZSTD_count_2segments(ip+9, match3+8, iend, matchEnd, lowPrefixPtr) + 8;
|
1365
|
+
ip++;
|
1366
|
+
offset = current+1 - matchIndex3;
|
1367
|
+
while (((ip>anchor) & (match3>lowMatchPtr)) && (ip[-1] == match3[-1])) { ip--; match3--; mLength++; } /* catch up */
|
1368
|
+
} else {
|
1369
|
+
const BYTE* matchEnd = matchIndex < dictLimit ? dictEnd : iend;
|
1370
|
+
const BYTE* lowMatchPtr = matchIndex < dictLimit ? dictStart : lowPrefixPtr;
|
1371
|
+
mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, lowPrefixPtr) + 4;
|
1372
|
+
offset = current - matchIndex;
|
1373
|
+
while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
|
1374
|
+
}
|
1551
1375
|
offset_2 = offset_1;
|
1552
1376
|
offset_1 = offset;
|
1553
1377
|
ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
|
1378
|
+
|
1554
1379
|
} else {
|
1555
1380
|
ip += ((ip-anchor) >> g_searchStrength) + 1;
|
1556
1381
|
continue;
|
@@ -1600,7 +1425,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1600
1425
|
static void ZSTD_compressBlock_doubleFast_extDict(ZSTD_CCtx* ctx,
|
1601
1426
|
const void* src, size_t srcSize)
|
1602
1427
|
{
|
1603
|
-
const
|
1428
|
+
U32 const mls = ctx->params.cParams.searchLength;
|
1604
1429
|
switch(mls)
|
1605
1430
|
{
|
1606
1431
|
default:
|
@@ -1625,26 +1450,26 @@ static void ZSTD_compressBlock_doubleFast_extDict(ZSTD_CCtx* ctx,
|
|
1625
1450
|
static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, const BYTE* const iend, U32 nbCompares,
|
1626
1451
|
U32 extDict)
|
1627
1452
|
{
|
1628
|
-
U32*
|
1629
|
-
const
|
1630
|
-
const
|
1631
|
-
U32*
|
1632
|
-
const
|
1633
|
-
const
|
1634
|
-
U32 matchIndex
|
1453
|
+
U32* const hashTable = zc->hashTable;
|
1454
|
+
U32 const hashLog = zc->params.cParams.hashLog;
|
1455
|
+
size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
|
1456
|
+
U32* const bt = zc->chainTable;
|
1457
|
+
U32 const btLog = zc->params.cParams.chainLog - 1;
|
1458
|
+
U32 const btMask = (1 << btLog) - 1;
|
1459
|
+
U32 matchIndex = hashTable[h];
|
1635
1460
|
size_t commonLengthSmaller=0, commonLengthLarger=0;
|
1636
1461
|
const BYTE* const base = zc->base;
|
1637
1462
|
const BYTE* const dictBase = zc->dictBase;
|
1638
1463
|
const U32 dictLimit = zc->dictLimit;
|
1639
1464
|
const BYTE* const dictEnd = dictBase + dictLimit;
|
1640
1465
|
const BYTE* const prefixStart = base + dictLimit;
|
1641
|
-
const BYTE* match
|
1466
|
+
const BYTE* match;
|
1642
1467
|
const U32 current = (U32)(ip-base);
|
1643
1468
|
const U32 btLow = btMask >= current ? 0 : current - btMask;
|
1644
1469
|
U32* smallerPtr = bt + 2*(current&btMask);
|
1645
1470
|
U32* largerPtr = smallerPtr + 1;
|
1646
1471
|
U32 dummy32; /* to be nullified at the end */
|
1647
|
-
const
|
1472
|
+
U32 const windowLow = zc->lowLimit;
|
1648
1473
|
U32 matchEndIdx = current+8;
|
1649
1474
|
size_t bestLength = 8;
|
1650
1475
|
#ifdef ZSTD_C_PREDICT
|
@@ -1729,12 +1554,12 @@ static size_t ZSTD_insertBtAndFindBestMatch (
|
|
1729
1554
|
U32 nbCompares, const U32 mls,
|
1730
1555
|
U32 extDict)
|
1731
1556
|
{
|
1732
|
-
U32*
|
1733
|
-
const
|
1734
|
-
const
|
1735
|
-
U32*
|
1736
|
-
const
|
1737
|
-
const
|
1557
|
+
U32* const hashTable = zc->hashTable;
|
1558
|
+
U32 const hashLog = zc->params.cParams.hashLog;
|
1559
|
+
size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
|
1560
|
+
U32* const bt = zc->chainTable;
|
1561
|
+
U32 const btLog = zc->params.cParams.chainLog - 1;
|
1562
|
+
U32 const btMask = (1 << btLog) - 1;
|
1738
1563
|
U32 matchIndex = hashTable[h];
|
1739
1564
|
size_t commonLengthSmaller=0, commonLengthLarger=0;
|
1740
1565
|
const BYTE* const base = zc->base;
|
@@ -1880,13 +1705,11 @@ static size_t ZSTD_BtFindBestMatch_selectMLS_extDict (
|
|
1880
1705
|
|
1881
1706
|
|
1882
1707
|
|
1883
|
-
/*
|
1708
|
+
/* *********************************
|
1884
1709
|
* Hash Chain
|
1885
|
-
|
1886
|
-
|
1710
|
+
***********************************/
|
1887
1711
|
#define NEXT_IN_CHAIN(d, mask) chainTable[(d) & mask]
|
1888
1712
|
|
1889
|
-
|
1890
1713
|
/* Update chains up to ip (excluded)
|
1891
1714
|
Assumption : always within prefix (ie. not within extDict) */
|
1892
1715
|
FORCE_INLINE
|
@@ -2127,7 +1950,6 @@ _storeSequence:
|
|
2127
1950
|
{ size_t const lastLLSize = iend - anchor;
|
2128
1951
|
memcpy(seqStorePtr->lit, anchor, lastLLSize);
|
2129
1952
|
seqStorePtr->lit += lastLLSize;
|
2130
|
-
ZSTD_statsUpdatePrices(&seqStorePtr->stats, lastLLSize, anchor, 0, 0);
|
2131
1953
|
}
|
2132
1954
|
}
|
2133
1955
|
|
@@ -2353,7 +2175,17 @@ static void ZSTD_compressBlock_btlazy2_extDict(ZSTD_CCtx* ctx, const void* src,
|
|
2353
2175
|
static void ZSTD_compressBlock_btopt(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
|
2354
2176
|
{
|
2355
2177
|
#ifdef ZSTD_OPT_H_91842398743
|
2356
|
-
ZSTD_compressBlock_opt_generic(ctx, src, srcSize);
|
2178
|
+
ZSTD_compressBlock_opt_generic(ctx, src, srcSize, 0);
|
2179
|
+
#else
|
2180
|
+
(void)ctx; (void)src; (void)srcSize;
|
2181
|
+
return;
|
2182
|
+
#endif
|
2183
|
+
}
|
2184
|
+
|
2185
|
+
static void ZSTD_compressBlock_btopt2(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
|
2186
|
+
{
|
2187
|
+
#ifdef ZSTD_OPT_H_91842398743
|
2188
|
+
ZSTD_compressBlock_opt_generic(ctx, src, srcSize, 1);
|
2357
2189
|
#else
|
2358
2190
|
(void)ctx; (void)src; (void)srcSize;
|
2359
2191
|
return;
|
@@ -2363,7 +2195,17 @@ static void ZSTD_compressBlock_btopt(ZSTD_CCtx* ctx, const void* src, size_t src
|
|
2363
2195
|
static void ZSTD_compressBlock_btopt_extDict(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
|
2364
2196
|
{
|
2365
2197
|
#ifdef ZSTD_OPT_H_91842398743
|
2366
|
-
ZSTD_compressBlock_opt_extDict_generic(ctx, src, srcSize);
|
2198
|
+
ZSTD_compressBlock_opt_extDict_generic(ctx, src, srcSize, 0);
|
2199
|
+
#else
|
2200
|
+
(void)ctx; (void)src; (void)srcSize;
|
2201
|
+
return;
|
2202
|
+
#endif
|
2203
|
+
}
|
2204
|
+
|
2205
|
+
static void ZSTD_compressBlock_btopt2_extDict(ZSTD_CCtx* ctx, const void* src, size_t srcSize)
|
2206
|
+
{
|
2207
|
+
#ifdef ZSTD_OPT_H_91842398743
|
2208
|
+
ZSTD_compressBlock_opt_extDict_generic(ctx, src, srcSize, 1);
|
2367
2209
|
#else
|
2368
2210
|
(void)ctx; (void)src; (void)srcSize;
|
2369
2211
|
return;
|
@@ -2375,9 +2217,9 @@ typedef void (*ZSTD_blockCompressor) (ZSTD_CCtx* ctx, const void* src, size_t sr
|
|
2375
2217
|
|
2376
2218
|
static ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int extDict)
|
2377
2219
|
{
|
2378
|
-
static const ZSTD_blockCompressor blockCompressor[2][
|
2379
|
-
{ ZSTD_compressBlock_fast, ZSTD_compressBlock_doubleFast, ZSTD_compressBlock_greedy, ZSTD_compressBlock_lazy, ZSTD_compressBlock_lazy2, ZSTD_compressBlock_btlazy2, ZSTD_compressBlock_btopt },
|
2380
|
-
{ ZSTD_compressBlock_fast_extDict, ZSTD_compressBlock_doubleFast_extDict, ZSTD_compressBlock_greedy_extDict, ZSTD_compressBlock_lazy_extDict,ZSTD_compressBlock_lazy2_extDict, ZSTD_compressBlock_btlazy2_extDict, ZSTD_compressBlock_btopt_extDict }
|
2220
|
+
static const ZSTD_blockCompressor blockCompressor[2][8] = {
|
2221
|
+
{ ZSTD_compressBlock_fast, ZSTD_compressBlock_doubleFast, ZSTD_compressBlock_greedy, ZSTD_compressBlock_lazy, ZSTD_compressBlock_lazy2, ZSTD_compressBlock_btlazy2, ZSTD_compressBlock_btopt, ZSTD_compressBlock_btopt2 },
|
2222
|
+
{ ZSTD_compressBlock_fast_extDict, ZSTD_compressBlock_doubleFast_extDict, ZSTD_compressBlock_greedy_extDict, ZSTD_compressBlock_lazy_extDict,ZSTD_compressBlock_lazy2_extDict, ZSTD_compressBlock_btlazy2_extDict, ZSTD_compressBlock_btopt_extDict, ZSTD_compressBlock_btopt2_extDict }
|
2381
2223
|
};
|
2382
2224
|
|
2383
2225
|
return blockCompressor[extDict][(U32)strat];
|
@@ -2387,38 +2229,63 @@ static ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int
|
|
2387
2229
|
static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
2388
2230
|
{
|
2389
2231
|
ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->params.cParams.strategy, zc->lowLimit < zc->dictLimit);
|
2232
|
+
const BYTE* const base = zc->base;
|
2233
|
+
const BYTE* const istart = (const BYTE*)src;
|
2234
|
+
const U32 current = (U32)(istart-base);
|
2390
2235
|
if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) return 0; /* don't even attempt compression below a certain srcSize */
|
2391
2236
|
ZSTD_resetSeqStore(&(zc->seqStore));
|
2237
|
+
if (current > zc->nextToUpdate + 384)
|
2238
|
+
zc->nextToUpdate = current - MIN(192, (U32)(current - zc->nextToUpdate - 384)); /* update tree not updated after finding very long rep matches */
|
2392
2239
|
blockCompressor(zc, src, srcSize);
|
2393
2240
|
return ZSTD_compressSequences(zc, dst, dstCapacity, srcSize);
|
2394
2241
|
}
|
2395
2242
|
|
2396
2243
|
|
2397
|
-
|
2398
|
-
|
2244
|
+
/*! ZSTD_compress_generic() :
|
2245
|
+
* Compress a chunk of data into one or multiple blocks.
|
2246
|
+
* All blocks will be terminated, all input will be consumed.
|
2247
|
+
* Function will issue an error if there is not enough `dstCapacity` to hold the compressed content.
|
2248
|
+
* Frame is supposed already started (header already produced)
|
2249
|
+
* @return : compressed size, or an error code
|
2250
|
+
*/
|
2399
2251
|
static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
|
2400
2252
|
void* dst, size_t dstCapacity,
|
2401
|
-
const void* src, size_t srcSize
|
2253
|
+
const void* src, size_t srcSize,
|
2254
|
+
U32 lastFrameChunk)
|
2402
2255
|
{
|
2403
2256
|
size_t blockSize = cctx->blockSize;
|
2404
2257
|
size_t remaining = srcSize;
|
2405
2258
|
const BYTE* ip = (const BYTE*)src;
|
2406
2259
|
BYTE* const ostart = (BYTE*)dst;
|
2407
2260
|
BYTE* op = ostart;
|
2408
|
-
const
|
2409
|
-
ZSTD_stats_t* stats = &cctx->seqStore.stats;
|
2410
|
-
ZSTD_statsInit(stats); /* debug only */
|
2261
|
+
U32 const maxDist = 1 << cctx->params.cParams.windowLog;
|
2411
2262
|
|
2412
|
-
if (cctx->params.fParams.checksumFlag)
|
2263
|
+
if (cctx->params.fParams.checksumFlag && srcSize)
|
2413
2264
|
XXH64_update(&cctx->xxhState, src, srcSize);
|
2414
2265
|
|
2415
2266
|
while (remaining) {
|
2267
|
+
U32 const lastBlock = lastFrameChunk & (blockSize >= remaining);
|
2416
2268
|
size_t cSize;
|
2417
|
-
ZSTD_statsResetFreqs(stats); /* debug only */
|
2418
2269
|
|
2419
2270
|
if (dstCapacity < ZSTD_blockHeaderSize + MIN_CBLOCK_SIZE) return ERROR(dstSize_tooSmall); /* not enough space to store compressed block */
|
2420
2271
|
if (remaining < blockSize) blockSize = remaining;
|
2421
2272
|
|
2273
|
+
/* preemptive overflow correction */
|
2274
|
+
if (cctx->lowLimit > (1<<30)) {
|
2275
|
+
U32 const btplus = (cctx->params.cParams.strategy == ZSTD_btlazy2) | (cctx->params.cParams.strategy == ZSTD_btopt) | (cctx->params.cParams.strategy == ZSTD_btopt2);
|
2276
|
+
U32 const chainMask = (1 << (cctx->params.cParams.chainLog - btplus)) - 1;
|
2277
|
+
U32 const supLog = MAX(cctx->params.cParams.chainLog, 17 /* blockSize */);
|
2278
|
+
U32 const newLowLimit = (cctx->lowLimit & chainMask) + (1 << supLog); /* preserve position % chainSize, ensure current-repcode doesn't underflow */
|
2279
|
+
U32 const correction = cctx->lowLimit - newLowLimit;
|
2280
|
+
ZSTD_reduceIndex(cctx, correction);
|
2281
|
+
cctx->base += correction;
|
2282
|
+
cctx->dictBase += correction;
|
2283
|
+
cctx->lowLimit = newLowLimit;
|
2284
|
+
cctx->dictLimit -= correction;
|
2285
|
+
if (cctx->nextToUpdate < correction) cctx->nextToUpdate = 0;
|
2286
|
+
else cctx->nextToUpdate -= correction;
|
2287
|
+
}
|
2288
|
+
|
2422
2289
|
if ((U32)(ip+blockSize - cctx->base) > cctx->loadedDictEnd + maxDist) {
|
2423
2290
|
/* enforce maxDist */
|
2424
2291
|
U32 const newLowLimit = (U32)(ip+blockSize - cctx->base) - maxDist;
|
@@ -2430,14 +2297,15 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
|
|
2430
2297
|
if (ZSTD_isError(cSize)) return cSize;
|
2431
2298
|
|
2432
2299
|
if (cSize == 0) { /* block is not compressible */
|
2433
|
-
|
2434
|
-
if (
|
2300
|
+
U32 const cBlockHeader24 = lastBlock + (((U32)bt_raw)<<1) + (U32)(blockSize << 3);
|
2301
|
+
if (blockSize + ZSTD_blockHeaderSize > dstCapacity) return ERROR(dstSize_tooSmall);
|
2302
|
+
MEM_writeLE32(op, cBlockHeader24); /* no pb, 4th byte will be overwritten */
|
2303
|
+
memcpy(op + ZSTD_blockHeaderSize, ip, blockSize);
|
2304
|
+
cSize = ZSTD_blockHeaderSize+blockSize;
|
2435
2305
|
} else {
|
2436
|
-
|
2437
|
-
op
|
2438
|
-
|
2439
|
-
op[0] += (BYTE)(bt_compressed << 6); /* is a compressed block */
|
2440
|
-
cSize += 3;
|
2306
|
+
U32 const cBlockHeader24 = lastBlock + (((U32)bt_compressed)<<1) + (U32)(cSize << 3);
|
2307
|
+
MEM_writeLE24(op, cBlockHeader24);
|
2308
|
+
cSize += ZSTD_blockHeaderSize;
|
2441
2309
|
}
|
2442
2310
|
|
2443
2311
|
remaining -= blockSize;
|
@@ -2446,7 +2314,7 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
|
|
2446
2314
|
op += cSize;
|
2447
2315
|
}
|
2448
2316
|
|
2449
|
-
|
2317
|
+
if (lastFrameChunk && (op>ostart)) cctx->stage = ZSTDcs_ending;
|
2450
2318
|
return op-ostart;
|
2451
2319
|
}
|
2452
2320
|
|
@@ -2454,34 +2322,34 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
|
|
2454
2322
|
static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
|
2455
2323
|
ZSTD_parameters params, U64 pledgedSrcSize, U32 dictID)
|
2456
2324
|
{ BYTE* const op = (BYTE*)dst;
|
2457
|
-
U32
|
2458
|
-
U32
|
2459
|
-
U32
|
2460
|
-
U32
|
2461
|
-
BYTE
|
2462
|
-
U32
|
2325
|
+
U32 const dictIDSizeCode = (dictID>0) + (dictID>=256) + (dictID>=65536); /* 0-3 */
|
2326
|
+
U32 const checksumFlag = params.fParams.checksumFlag>0;
|
2327
|
+
U32 const windowSize = 1U << params.cParams.windowLog;
|
2328
|
+
U32 const singleSegment = params.fParams.contentSizeFlag && (windowSize > (pledgedSrcSize-1));
|
2329
|
+
BYTE const windowLogByte = (BYTE)((params.cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN) << 3);
|
2330
|
+
U32 const fcsCode = params.fParams.contentSizeFlag ?
|
2463
2331
|
(pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256) + (pledgedSrcSize>=0xFFFFFFFFU) : /* 0-3 */
|
2464
2332
|
0;
|
2465
|
-
BYTE
|
2333
|
+
BYTE const frameHeaderDecriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag<<2) + (singleSegment<<5) + (fcsCode<<6) );
|
2466
2334
|
size_t pos;
|
2467
2335
|
|
2468
2336
|
if (dstCapacity < ZSTD_frameHeaderSize_max) return ERROR(dstSize_tooSmall);
|
2469
2337
|
|
2470
2338
|
MEM_writeLE32(dst, ZSTD_MAGICNUMBER);
|
2471
2339
|
op[4] = frameHeaderDecriptionByte; pos=5;
|
2472
|
-
if (!
|
2340
|
+
if (!singleSegment) op[pos++] = windowLogByte;
|
2473
2341
|
switch(dictIDSizeCode)
|
2474
2342
|
{
|
2475
2343
|
default: /* impossible */
|
2476
2344
|
case 0 : break;
|
2477
2345
|
case 1 : op[pos] = (BYTE)(dictID); pos++; break;
|
2478
|
-
case 2 : MEM_writeLE16(op+pos, (U16)
|
2346
|
+
case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break;
|
2479
2347
|
case 3 : MEM_writeLE32(op+pos, dictID); pos+=4; break;
|
2480
2348
|
}
|
2481
2349
|
switch(fcsCode)
|
2482
2350
|
{
|
2483
2351
|
default: /* impossible */
|
2484
|
-
case 0 : if (
|
2352
|
+
case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break;
|
2485
2353
|
case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break;
|
2486
2354
|
case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break;
|
2487
2355
|
case 3 : MEM_writeLE64(op+pos, (U64)(pledgedSrcSize)); pos+=8; break;
|
@@ -2490,80 +2358,72 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
|
|
2490
2358
|
}
|
2491
2359
|
|
2492
2360
|
|
2493
|
-
static size_t ZSTD_compressContinue_internal (ZSTD_CCtx*
|
2361
|
+
static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
2494
2362
|
void* dst, size_t dstCapacity,
|
2495
2363
|
const void* src, size_t srcSize,
|
2496
|
-
U32 frame)
|
2364
|
+
U32 frame, U32 lastFrameChunk)
|
2497
2365
|
{
|
2498
2366
|
const BYTE* const ip = (const BYTE*) src;
|
2499
2367
|
size_t fhSize = 0;
|
2500
2368
|
|
2501
|
-
if (
|
2502
|
-
|
2503
|
-
|
2369
|
+
if (cctx->stage==ZSTDcs_created) return ERROR(stage_wrong); /* missing init (ZSTD_compressBegin) */
|
2370
|
+
|
2371
|
+
if (frame && (cctx->stage==ZSTDcs_init)) {
|
2372
|
+
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->params, cctx->frameContentSize, cctx->dictID);
|
2504
2373
|
if (ZSTD_isError(fhSize)) return fhSize;
|
2505
2374
|
dstCapacity -= fhSize;
|
2506
2375
|
dst = (char*)dst + fhSize;
|
2507
|
-
|
2376
|
+
cctx->stage = ZSTDcs_ongoing;
|
2508
2377
|
}
|
2509
2378
|
|
2510
2379
|
/* Check if blocks follow each other */
|
2511
|
-
if (src !=
|
2380
|
+
if (src != cctx->nextSrc) {
|
2512
2381
|
/* not contiguous */
|
2513
|
-
|
2514
|
-
|
2515
|
-
|
2516
|
-
|
2517
|
-
|
2518
|
-
|
2519
|
-
if (
|
2382
|
+
ptrdiff_t const delta = cctx->nextSrc - ip;
|
2383
|
+
cctx->lowLimit = cctx->dictLimit;
|
2384
|
+
cctx->dictLimit = (U32)(cctx->nextSrc - cctx->base);
|
2385
|
+
cctx->dictBase = cctx->base;
|
2386
|
+
cctx->base -= delta;
|
2387
|
+
cctx->nextToUpdate = cctx->dictLimit;
|
2388
|
+
if (cctx->dictLimit - cctx->lowLimit < HASH_READ_SIZE) cctx->lowLimit = cctx->dictLimit; /* too small extDict */
|
2520
2389
|
}
|
2521
2390
|
|
2522
|
-
/*
|
2523
|
-
if (
|
2524
|
-
|
2525
|
-
U32 const
|
2526
|
-
|
2527
|
-
U32 const correction = zc->lowLimit - newLowLimit;
|
2528
|
-
ZSTD_reduceIndex(zc, correction);
|
2529
|
-
zc->base += correction;
|
2530
|
-
zc->dictBase += correction;
|
2531
|
-
zc->lowLimit = newLowLimit;
|
2532
|
-
zc->dictLimit -= correction;
|
2533
|
-
if (zc->nextToUpdate < correction) zc->nextToUpdate = 0;
|
2534
|
-
else zc->nextToUpdate -= correction;
|
2391
|
+
/* if input and dictionary overlap : reduce dictionary (area presumed modified by input) */
|
2392
|
+
if ((ip+srcSize > cctx->dictBase + cctx->lowLimit) & (ip < cctx->dictBase + cctx->dictLimit)) {
|
2393
|
+
ptrdiff_t const highInputIdx = (ip + srcSize) - cctx->dictBase;
|
2394
|
+
U32 const lowLimitMax = (highInputIdx > (ptrdiff_t)cctx->dictLimit) ? cctx->dictLimit : (U32)highInputIdx;
|
2395
|
+
cctx->lowLimit = lowLimitMax;
|
2535
2396
|
}
|
2536
2397
|
|
2537
|
-
|
2538
|
-
if ((ip+srcSize > zc->dictBase + zc->lowLimit) && (ip < zc->dictBase + zc->dictLimit)) {
|
2539
|
-
zc->lowLimit = (U32)(ip + srcSize - zc->dictBase);
|
2540
|
-
if (zc->lowLimit > zc->dictLimit) zc->lowLimit = zc->dictLimit;
|
2541
|
-
}
|
2398
|
+
cctx->nextSrc = ip + srcSize;
|
2542
2399
|
|
2543
|
-
zc->nextSrc = ip + srcSize;
|
2544
2400
|
{ size_t const cSize = frame ?
|
2545
|
-
ZSTD_compress_generic (
|
2546
|
-
ZSTD_compressBlock_internal (
|
2401
|
+
ZSTD_compress_generic (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) :
|
2402
|
+
ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize);
|
2547
2403
|
if (ZSTD_isError(cSize)) return cSize;
|
2548
2404
|
return cSize + fhSize;
|
2549
2405
|
}
|
2550
2406
|
}
|
2551
2407
|
|
2552
2408
|
|
2553
|
-
size_t ZSTD_compressContinue (ZSTD_CCtx*
|
2409
|
+
size_t ZSTD_compressContinue (ZSTD_CCtx* cctx,
|
2554
2410
|
void* dst, size_t dstCapacity,
|
2555
2411
|
const void* src, size_t srcSize)
|
2556
2412
|
{
|
2557
|
-
return ZSTD_compressContinue_internal(
|
2413
|
+
return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 1, 0);
|
2558
2414
|
}
|
2559
2415
|
|
2560
2416
|
|
2561
|
-
size_t
|
2417
|
+
size_t ZSTD_getBlockSizeMax(ZSTD_CCtx* cctx)
|
2562
2418
|
{
|
2563
|
-
|
2419
|
+
return MIN (ZSTD_BLOCKSIZE_ABSOLUTEMAX, 1 << cctx->params.cParams.windowLog);
|
2420
|
+
}
|
2421
|
+
|
2422
|
+
size_t ZSTD_compressBlock(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
2423
|
+
{
|
2424
|
+
size_t const blockSizeMax = ZSTD_getBlockSizeMax(cctx);
|
2564
2425
|
if (srcSize > blockSizeMax) return ERROR(srcSize_wrong);
|
2565
|
-
|
2566
|
-
return ZSTD_compressContinue_internal(zc, dst, dstCapacity, src, srcSize, 0);
|
2426
|
+
return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 0, 0);
|
2567
2427
|
}
|
2568
2428
|
|
2569
2429
|
|
@@ -2581,7 +2441,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_CCtx* zc, const void* src, size_t
|
|
2581
2441
|
zc->loadedDictEnd = (U32)(iend - zc->base);
|
2582
2442
|
|
2583
2443
|
zc->nextSrc = iend;
|
2584
|
-
if (srcSize <=
|
2444
|
+
if (srcSize <= HASH_READ_SIZE) return 0;
|
2585
2445
|
|
2586
2446
|
switch(zc->params.cParams.strategy)
|
2587
2447
|
{
|
@@ -2596,12 +2456,13 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_CCtx* zc, const void* src, size_t
|
|
2596
2456
|
case ZSTD_greedy:
|
2597
2457
|
case ZSTD_lazy:
|
2598
2458
|
case ZSTD_lazy2:
|
2599
|
-
ZSTD_insertAndFindFirstIndex (zc, iend-
|
2459
|
+
ZSTD_insertAndFindFirstIndex (zc, iend-HASH_READ_SIZE, zc->params.cParams.searchLength);
|
2600
2460
|
break;
|
2601
2461
|
|
2602
2462
|
case ZSTD_btlazy2:
|
2603
2463
|
case ZSTD_btopt:
|
2604
|
-
|
2464
|
+
case ZSTD_btopt2:
|
2465
|
+
ZSTD_updateTree(zc, iend-HASH_READ_SIZE, iend, 1 << zc->params.cParams.searchLog, zc->params.cParams.searchLength);
|
2605
2466
|
break;
|
2606
2467
|
|
2607
2468
|
default:
|
@@ -2613,14 +2474,28 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_CCtx* zc, const void* src, size_t
|
|
2613
2474
|
}
|
2614
2475
|
|
2615
2476
|
|
2477
|
+
/* Dictionaries that assign zero probability to symbols that show up causes problems
|
2478
|
+
when FSE encoding. Refuse dictionaries that assign zero probability to symbols
|
2479
|
+
that we may encounter during compression.
|
2480
|
+
NOTE: This behavior is not standard and could be improved in the future. */
|
2481
|
+
static size_t ZSTD_checkDictNCount(short* normalizedCounter, unsigned dictMaxSymbolValue, unsigned maxSymbolValue) {
|
2482
|
+
U32 s;
|
2483
|
+
if (dictMaxSymbolValue < maxSymbolValue) return ERROR(dictionary_corrupted);
|
2484
|
+
for (s = 0; s <= maxSymbolValue; ++s) {
|
2485
|
+
if (normalizedCounter[s] == 0) return ERROR(dictionary_corrupted);
|
2486
|
+
}
|
2487
|
+
return 0;
|
2488
|
+
}
|
2489
|
+
|
2490
|
+
|
2616
2491
|
/* Dictionary format :
|
2617
|
-
|
2618
|
-
|
2619
|
-
|
2620
|
-
|
2621
|
-
|
2622
|
-
|
2623
|
-
|
2492
|
+
Magic == ZSTD_DICT_MAGIC (4 bytes)
|
2493
|
+
HUF_writeCTable(256)
|
2494
|
+
FSE_writeNCount(off)
|
2495
|
+
FSE_writeNCount(ml)
|
2496
|
+
FSE_writeNCount(ll)
|
2497
|
+
RepOffsets
|
2498
|
+
Dictionary content
|
2624
2499
|
*/
|
2625
2500
|
/*! ZSTD_loadDictEntropyStats() :
|
2626
2501
|
@return : size read from dictionary
|
@@ -2629,36 +2504,42 @@ static size_t ZSTD_loadDictEntropyStats(ZSTD_CCtx* cctx, const void* dict, size_
|
|
2629
2504
|
{
|
2630
2505
|
const BYTE* dictPtr = (const BYTE*)dict;
|
2631
2506
|
const BYTE* const dictEnd = dictPtr + dictSize;
|
2507
|
+
short offcodeNCount[MaxOff+1];
|
2508
|
+
unsigned offcodeMaxValue = MaxOff;
|
2632
2509
|
|
2633
2510
|
{ size_t const hufHeaderSize = HUF_readCTable(cctx->hufTable, 255, dict, dictSize);
|
2634
2511
|
if (HUF_isError(hufHeaderSize)) return ERROR(dictionary_corrupted);
|
2635
2512
|
dictPtr += hufHeaderSize;
|
2636
2513
|
}
|
2637
2514
|
|
2638
|
-
{
|
2639
|
-
unsigned offcodeMaxValue = MaxOff, offcodeLog = OffFSELog;
|
2515
|
+
{ unsigned offcodeLog;
|
2640
2516
|
size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd-dictPtr);
|
2641
2517
|
if (FSE_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
|
2642
|
-
|
2643
|
-
|
2518
|
+
if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
|
2519
|
+
/* Defer checking offcodeMaxValue because we need to know the size of the dictionary content */
|
2520
|
+
CHECK_E (FSE_buildCTable(cctx->offcodeCTable, offcodeNCount, offcodeMaxValue, offcodeLog), dictionary_corrupted);
|
2644
2521
|
dictPtr += offcodeHeaderSize;
|
2645
2522
|
}
|
2646
2523
|
|
2647
2524
|
{ short matchlengthNCount[MaxML+1];
|
2648
|
-
unsigned matchlengthMaxValue = MaxML, matchlengthLog
|
2525
|
+
unsigned matchlengthMaxValue = MaxML, matchlengthLog;
|
2649
2526
|
size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd-dictPtr);
|
2650
2527
|
if (FSE_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
|
2651
|
-
|
2652
|
-
|
2528
|
+
if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
|
2529
|
+
/* Every match length code must have non-zero probability */
|
2530
|
+
CHECK_F (ZSTD_checkDictNCount(matchlengthNCount, matchlengthMaxValue, MaxML));
|
2531
|
+
CHECK_E (FSE_buildCTable(cctx->matchlengthCTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog), dictionary_corrupted);
|
2653
2532
|
dictPtr += matchlengthHeaderSize;
|
2654
2533
|
}
|
2655
2534
|
|
2656
2535
|
{ short litlengthNCount[MaxLL+1];
|
2657
|
-
unsigned litlengthMaxValue = MaxLL, litlengthLog
|
2536
|
+
unsigned litlengthMaxValue = MaxLL, litlengthLog;
|
2658
2537
|
size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd-dictPtr);
|
2659
2538
|
if (FSE_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
|
2660
|
-
|
2661
|
-
|
2539
|
+
if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
|
2540
|
+
/* Every literal length code must have non-zero probability */
|
2541
|
+
CHECK_F (ZSTD_checkDictNCount(litlengthNCount, litlengthMaxValue, MaxLL));
|
2542
|
+
CHECK_E(FSE_buildCTable(cctx->litlengthCTable, litlengthNCount, litlengthMaxValue, litlengthLog), dictionary_corrupted);
|
2662
2543
|
dictPtr += litlengthHeaderSize;
|
2663
2544
|
}
|
2664
2545
|
|
@@ -2668,6 +2549,16 @@ static size_t ZSTD_loadDictEntropyStats(ZSTD_CCtx* cctx, const void* dict, size_
|
|
2668
2549
|
cctx->rep[2] = MEM_readLE32(dictPtr+8); if (cctx->rep[2] >= dictSize) return ERROR(dictionary_corrupted);
|
2669
2550
|
dictPtr += 12;
|
2670
2551
|
|
2552
|
+
{ U32 offcodeMax = MaxOff;
|
2553
|
+
if ((size_t)(dictEnd - dictPtr) <= ((U32)-1) - 128 KB) {
|
2554
|
+
U32 const maxOffset = (U32)(dictEnd - dictPtr) + 128 KB; /* The maximum offset that must be supported */
|
2555
|
+
/* Calculate minimum offset code required to represent maxOffset */
|
2556
|
+
offcodeMax = ZSTD_highbit32(maxOffset);
|
2557
|
+
}
|
2558
|
+
/* Every possible supported offset <= dictContentSize + 128 KB must be representable */
|
2559
|
+
CHECK_F (ZSTD_checkDictNCount(offcodeNCount, offcodeMaxValue, MIN(offcodeMax, MaxOff)));
|
2560
|
+
}
|
2561
|
+
|
2671
2562
|
cctx->flagStaticTables = 1;
|
2672
2563
|
return dictPtr - (const BYTE*)dict;
|
2673
2564
|
}
|
@@ -2683,8 +2574,9 @@ static size_t ZSTD_compress_insertDictionary(ZSTD_CCtx* zc, const void* dict, si
|
|
2683
2574
|
zc->dictID = zc->params.fParams.noDictIDFlag ? 0 : MEM_readLE32((const char*)dict+4);
|
2684
2575
|
|
2685
2576
|
/* known magic number : dict is parsed for entropy stats and content */
|
2686
|
-
{ size_t const
|
2687
|
-
|
2577
|
+
{ size_t const loadError = ZSTD_loadDictEntropyStats(zc, (const char*)dict+8 /* skip dictHeader */, dictSize-8);
|
2578
|
+
size_t const eSize = loadError + 8;
|
2579
|
+
if (ZSTD_isError(loadError)) return loadError;
|
2688
2580
|
return ZSTD_loadDictionaryContent(zc, (const char*)dict+eSize, dictSize-eSize);
|
2689
2581
|
}
|
2690
2582
|
}
|
@@ -2692,14 +2584,13 @@ static size_t ZSTD_compress_insertDictionary(ZSTD_CCtx* zc, const void* dict, si
|
|
2692
2584
|
|
2693
2585
|
/*! ZSTD_compressBegin_internal() :
|
2694
2586
|
* @return : 0, or an error code */
|
2695
|
-
static size_t ZSTD_compressBegin_internal(ZSTD_CCtx*
|
2587
|
+
static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
|
2696
2588
|
const void* dict, size_t dictSize,
|
2697
2589
|
ZSTD_parameters params, U64 pledgedSrcSize)
|
2698
2590
|
{
|
2699
|
-
|
2700
|
-
|
2701
|
-
|
2702
|
-
return ZSTD_compress_insertDictionary(zc, dict, dictSize);
|
2591
|
+
ZSTD_compResetPolicy_e const crp = dictSize ? ZSTDcrp_fullReset : ZSTDcrp_continue;
|
2592
|
+
CHECK_F(ZSTD_resetCCtx_advanced(cctx, params, pledgedSrcSize, crp));
|
2593
|
+
return ZSTD_compress_insertDictionary(cctx, dict, dictSize);
|
2703
2594
|
}
|
2704
2595
|
|
2705
2596
|
|
@@ -2710,9 +2601,7 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx,
|
|
2710
2601
|
ZSTD_parameters params, unsigned long long pledgedSrcSize)
|
2711
2602
|
{
|
2712
2603
|
/* compression parameters verification and optimization */
|
2713
|
-
|
2714
|
-
if (ZSTD_isError(errorCode)) return errorCode; }
|
2715
|
-
|
2604
|
+
CHECK_F(ZSTD_checkCParams(params.cParams));
|
2716
2605
|
return ZSTD_compressBegin_internal(cctx, dict, dictSize, params, pledgedSrcSize);
|
2717
2606
|
}
|
2718
2607
|
|
@@ -2720,100 +2609,78 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx,
|
|
2720
2609
|
size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel)
|
2721
2610
|
{
|
2722
2611
|
ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
|
2723
|
-
ZSTD_LOG_BLOCK("%p: ZSTD_compressBegin_usingDict compressionLevel=%d\n", cctx->base, compressionLevel);
|
2724
2612
|
return ZSTD_compressBegin_internal(cctx, dict, dictSize, params, 0);
|
2725
2613
|
}
|
2726
2614
|
|
2727
2615
|
|
2728
2616
|
size_t ZSTD_compressBegin(ZSTD_CCtx* zc, int compressionLevel)
|
2729
2617
|
{
|
2730
|
-
ZSTD_LOG_BLOCK("%p: ZSTD_compressBegin compressionLevel=%d\n", zc->base, compressionLevel);
|
2731
2618
|
return ZSTD_compressBegin_usingDict(zc, NULL, 0, compressionLevel);
|
2732
2619
|
}
|
2733
2620
|
|
2734
2621
|
|
2735
|
-
/*!
|
2736
|
-
*
|
2622
|
+
/*! ZSTD_writeEpilogue() :
|
2623
|
+
* Ends a frame.
|
2737
2624
|
* @return : nb of bytes written into dst (or an error code) */
|
2738
|
-
size_t
|
2625
|
+
static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
|
2739
2626
|
{
|
2740
|
-
BYTE*
|
2627
|
+
BYTE* const ostart = (BYTE*)dst;
|
2628
|
+
BYTE* op = ostart;
|
2741
2629
|
size_t fhSize = 0;
|
2742
2630
|
|
2743
|
-
|
2744
|
-
if (cctx->stage==0) return ERROR(stage_wrong);
|
2631
|
+
if (cctx->stage == ZSTDcs_created) return ERROR(stage_wrong); /* init missing */
|
2745
2632
|
|
2746
2633
|
/* special case : empty frame */
|
2747
|
-
if (cctx->stage==
|
2634
|
+
if (cctx->stage == ZSTDcs_init) {
|
2748
2635
|
fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->params, 0, 0);
|
2749
2636
|
if (ZSTD_isError(fhSize)) return fhSize;
|
2750
2637
|
dstCapacity -= fhSize;
|
2751
2638
|
op += fhSize;
|
2752
|
-
cctx->stage =
|
2639
|
+
cctx->stage = ZSTDcs_ongoing;
|
2640
|
+
}
|
2641
|
+
|
2642
|
+
if (cctx->stage != ZSTDcs_ending) {
|
2643
|
+
/* write one last empty block, make it the "last" block */
|
2644
|
+
U32 const cBlockHeader24 = 1 /* last block */ + (((U32)bt_raw)<<1) + 0;
|
2645
|
+
if (dstCapacity<4) return ERROR(dstSize_tooSmall);
|
2646
|
+
MEM_writeLE32(op, cBlockHeader24);
|
2647
|
+
op += ZSTD_blockHeaderSize;
|
2648
|
+
dstCapacity -= ZSTD_blockHeaderSize;
|
2753
2649
|
}
|
2754
2650
|
|
2755
|
-
|
2756
|
-
|
2757
|
-
|
2758
|
-
|
2759
|
-
|
2760
|
-
op[0] = (BYTE)((bt_end<<6) + (checksum>>16));
|
2761
|
-
op[1] = (BYTE)(checksum>>8);
|
2762
|
-
op[2] = (BYTE)checksum;
|
2651
|
+
if (cctx->params.fParams.checksumFlag) {
|
2652
|
+
U32 const checksum = (U32) XXH64_digest(&cctx->xxhState);
|
2653
|
+
if (dstCapacity<4) return ERROR(dstSize_tooSmall);
|
2654
|
+
MEM_writeLE32(op, checksum);
|
2655
|
+
op += 4;
|
2763
2656
|
}
|
2764
2657
|
|
2765
|
-
cctx->stage =
|
2766
|
-
return
|
2658
|
+
cctx->stage = ZSTDcs_created; /* return to "created but no init" status */
|
2659
|
+
return op-ostart;
|
2767
2660
|
}
|
2768
2661
|
|
2769
2662
|
|
2770
|
-
|
2771
|
-
*
|
2772
|
-
*
|
2773
|
-
* `preparedCCtx` must have been properly initialized using ZSTD_compressBegin_usingDict() or ZSTD_compressBegin_advanced().
|
2774
|
-
* Requires 2 contexts : 1 for reference (preparedCCtx) which will not be modified, and 1 to run the compression operation (cctx) */
|
2775
|
-
static size_t ZSTD_compress_usingPreparedCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx,
|
2776
|
-
void* dst, size_t dstCapacity,
|
2777
|
-
const void* src, size_t srcSize)
|
2663
|
+
size_t ZSTD_compressEnd (ZSTD_CCtx* cctx,
|
2664
|
+
void* dst, size_t dstCapacity,
|
2665
|
+
const void* src, size_t srcSize)
|
2778
2666
|
{
|
2779
|
-
|
2780
|
-
|
2781
|
-
|
2782
|
-
|
2783
|
-
|
2784
|
-
|
2785
|
-
{ size_t const endSize = ZSTD_compressEnd(cctx, (char*)dst+cSize, dstCapacity-cSize);
|
2786
|
-
if (ZSTD_isError(endSize)) return endSize;
|
2787
|
-
return cSize + endSize;
|
2788
|
-
} }
|
2667
|
+
size_t endResult;
|
2668
|
+
size_t const cSize = ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 1, 1);
|
2669
|
+
if (ZSTD_isError(cSize)) return cSize;
|
2670
|
+
endResult = ZSTD_writeEpilogue(cctx, (char*)dst + cSize, dstCapacity-cSize);
|
2671
|
+
if (ZSTD_isError(endResult)) return endResult;
|
2672
|
+
return cSize + endResult;
|
2789
2673
|
}
|
2790
2674
|
|
2791
2675
|
|
2792
|
-
static size_t ZSTD_compress_internal (ZSTD_CCtx*
|
2676
|
+
static size_t ZSTD_compress_internal (ZSTD_CCtx* cctx,
|
2793
2677
|
void* dst, size_t dstCapacity,
|
2794
2678
|
const void* src, size_t srcSize,
|
2795
2679
|
const void* dict,size_t dictSize,
|
2796
2680
|
ZSTD_parameters params)
|
2797
2681
|
{
|
2798
|
-
|
2799
|
-
|
2800
|
-
|
2801
|
-
/* Init */
|
2802
|
-
{ size_t const errorCode = ZSTD_compressBegin_internal(ctx, dict, dictSize, params, srcSize);
|
2803
|
-
if(ZSTD_isError(errorCode)) return errorCode; }
|
2804
|
-
|
2805
|
-
/* body (compression) */
|
2806
|
-
{ size_t const oSize = ZSTD_compressContinue (ctx, op, dstCapacity, src, srcSize);
|
2807
|
-
if(ZSTD_isError(oSize)) return oSize;
|
2808
|
-
op += oSize;
|
2809
|
-
dstCapacity -= oSize; }
|
2810
|
-
|
2811
|
-
/* Close frame */
|
2812
|
-
{ size_t const oSize = ZSTD_compressEnd(ctx, op, dstCapacity);
|
2813
|
-
if(ZSTD_isError(oSize)) return oSize;
|
2814
|
-
op += oSize; }
|
2815
|
-
|
2816
|
-
return (op - ostart);
|
2682
|
+
CHECK_F(ZSTD_compressBegin_internal(cctx, dict, dictSize, params, srcSize));
|
2683
|
+
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
|
2817
2684
|
}
|
2818
2685
|
|
2819
2686
|
size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx,
|
@@ -2822,8 +2689,7 @@ size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx,
|
|
2822
2689
|
const void* dict,size_t dictSize,
|
2823
2690
|
ZSTD_parameters params)
|
2824
2691
|
{
|
2825
|
-
|
2826
|
-
if (ZSTD_isError(errorCode)) return errorCode;
|
2692
|
+
CHECK_F(ZSTD_checkCParams(params.cParams));
|
2827
2693
|
return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, dict, dictSize, params);
|
2828
2694
|
}
|
2829
2695
|
|
@@ -2831,13 +2697,11 @@ size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, co
|
|
2831
2697
|
{
|
2832
2698
|
ZSTD_parameters params = ZSTD_getParams(compressionLevel, srcSize, dictSize);
|
2833
2699
|
params.fParams.contentSizeFlag = 1;
|
2834
|
-
ZSTD_LOG_BLOCK("%p: ZSTD_compress_usingDict srcSize=%d dictSize=%d compressionLevel=%d\n", ctx->base, (int)srcSize, (int)dictSize, compressionLevel);
|
2835
2700
|
return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, dict, dictSize, params);
|
2836
2701
|
}
|
2837
2702
|
|
2838
2703
|
size_t ZSTD_compressCCtx (ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel)
|
2839
2704
|
{
|
2840
|
-
ZSTD_LOG_BLOCK("%p: ZSTD_compressCCtx srcSize=%d compressionLevel=%d\n", ctx->base, (int)srcSize, compressionLevel);
|
2841
2705
|
return ZSTD_compress_usingDict(ctx, dst, dstCapacity, src, srcSize, NULL, 0, compressionLevel);
|
2842
2706
|
}
|
2843
2707
|
|
@@ -2848,7 +2712,7 @@ size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcS
|
|
2848
2712
|
memset(&ctxBody, 0, sizeof(ctxBody));
|
2849
2713
|
memcpy(&ctxBody.customMem, &defaultCustomMem, sizeof(ZSTD_customMem));
|
2850
2714
|
result = ZSTD_compressCCtx(&ctxBody, dst, dstCapacity, src, srcSize, compressionLevel);
|
2851
|
-
|
2715
|
+
ZSTD_free(ctxBody.workSpace, defaultCustomMem); /* can't free ctxBody itself, as it's on stack; free only heap content */
|
2852
2716
|
return result;
|
2853
2717
|
}
|
2854
2718
|
|
@@ -2859,33 +2723,38 @@ struct ZSTD_CDict_s {
|
|
2859
2723
|
void* dictContent;
|
2860
2724
|
size_t dictContentSize;
|
2861
2725
|
ZSTD_CCtx* refContext;
|
2862
|
-
}; /* typedef'd tp ZSTD_CDict within zstd.h */
|
2726
|
+
}; /* typedef'd tp ZSTD_CDict within "zstd.h" */
|
2863
2727
|
|
2864
|
-
|
2728
|
+
size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict)
|
2865
2729
|
{
|
2866
|
-
if (
|
2867
|
-
|
2730
|
+
if (cdict==NULL) return 0; /* support sizeof on NULL */
|
2731
|
+
return ZSTD_sizeof_CCtx(cdict->refContext) + cdict->dictContentSize;
|
2732
|
+
}
|
2868
2733
|
|
2869
|
-
|
2870
|
-
|
2734
|
+
ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, ZSTD_parameters params, ZSTD_customMem customMem)
|
2735
|
+
{
|
2736
|
+
if (!customMem.customAlloc && !customMem.customFree) customMem = defaultCustomMem;
|
2737
|
+
if (!customMem.customAlloc || !customMem.customFree) return NULL;
|
2871
2738
|
|
2872
|
-
{ ZSTD_CDict* const cdict = (ZSTD_CDict*)
|
2873
|
-
void* const dictContent =
|
2739
|
+
{ ZSTD_CDict* const cdict = (ZSTD_CDict*) ZSTD_malloc(sizeof(ZSTD_CDict), customMem);
|
2740
|
+
void* const dictContent = ZSTD_malloc(dictSize, customMem);
|
2874
2741
|
ZSTD_CCtx* const cctx = ZSTD_createCCtx_advanced(customMem);
|
2875
2742
|
|
2876
2743
|
if (!dictContent || !cdict || !cctx) {
|
2877
|
-
|
2878
|
-
|
2879
|
-
|
2744
|
+
ZSTD_free(dictContent, customMem);
|
2745
|
+
ZSTD_free(cdict, customMem);
|
2746
|
+
ZSTD_free(cctx, customMem);
|
2880
2747
|
return NULL;
|
2881
2748
|
}
|
2882
2749
|
|
2883
|
-
|
2750
|
+
if (dictSize) {
|
2751
|
+
memcpy(dictContent, dict, dictSize);
|
2752
|
+
}
|
2884
2753
|
{ size_t const errorCode = ZSTD_compressBegin_advanced(cctx, dictContent, dictSize, params, 0);
|
2885
2754
|
if (ZSTD_isError(errorCode)) {
|
2886
|
-
|
2887
|
-
|
2888
|
-
|
2755
|
+
ZSTD_free(dictContent, customMem);
|
2756
|
+
ZSTD_free(cdict, customMem);
|
2757
|
+
ZSTD_free(cctx, customMem);
|
2889
2758
|
return NULL;
|
2890
2759
|
} }
|
2891
2760
|
|
@@ -2899,31 +2768,352 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, ZSTD_pa
|
|
2899
2768
|
ZSTD_CDict* ZSTD_createCDict(const void* dict, size_t dictSize, int compressionLevel)
|
2900
2769
|
{
|
2901
2770
|
ZSTD_customMem const allocator = { NULL, NULL, NULL };
|
2902
|
-
ZSTD_parameters params;
|
2903
|
-
memset(¶ms, 0, sizeof(params));
|
2904
|
-
params.cParams = ZSTD_getCParams(compressionLevel, 0, dictSize);
|
2771
|
+
ZSTD_parameters params = ZSTD_getParams(compressionLevel, 0, dictSize);
|
2905
2772
|
params.fParams.contentSizeFlag = 1;
|
2906
2773
|
return ZSTD_createCDict_advanced(dict, dictSize, params, allocator);
|
2907
2774
|
}
|
2908
2775
|
|
2909
2776
|
size_t ZSTD_freeCDict(ZSTD_CDict* cdict)
|
2910
2777
|
{
|
2911
|
-
|
2912
|
-
|
2913
|
-
|
2914
|
-
|
2915
|
-
|
2778
|
+
if (cdict==NULL) return 0; /* support free on NULL */
|
2779
|
+
{ ZSTD_customMem const cMem = cdict->refContext->customMem;
|
2780
|
+
ZSTD_freeCCtx(cdict->refContext);
|
2781
|
+
ZSTD_free(cdict->dictContent, cMem);
|
2782
|
+
ZSTD_free(cdict, cMem);
|
2783
|
+
return 0;
|
2784
|
+
}
|
2785
|
+
}
|
2786
|
+
|
2787
|
+
static ZSTD_parameters ZSTD_getParamsFromCDict(const ZSTD_CDict* cdict) {
|
2788
|
+
return ZSTD_getParamsFromCCtx(cdict->refContext);
|
2789
|
+
}
|
2790
|
+
|
2791
|
+
size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict, U64 pledgedSrcSize)
|
2792
|
+
{
|
2793
|
+
if (cdict->dictContentSize) CHECK_F(ZSTD_copyCCtx(cctx, cdict->refContext, pledgedSrcSize))
|
2794
|
+
else CHECK_F(ZSTD_compressBegin_advanced(cctx, NULL, 0, cdict->refContext->params, pledgedSrcSize));
|
2916
2795
|
return 0;
|
2917
2796
|
}
|
2918
2797
|
|
2919
|
-
|
2920
|
-
|
2921
|
-
|
2922
|
-
|
2798
|
+
/*! ZSTD_compress_usingCDict() :
|
2799
|
+
* Compression using a digested Dictionary.
|
2800
|
+
* Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times.
|
2801
|
+
* Note that compression level is decided during dictionary creation */
|
2802
|
+
size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx,
|
2803
|
+
void* dst, size_t dstCapacity,
|
2804
|
+
const void* src, size_t srcSize,
|
2805
|
+
const ZSTD_CDict* cdict)
|
2806
|
+
{
|
2807
|
+
CHECK_F(ZSTD_compressBegin_usingCDict(cctx, cdict, srcSize));
|
2808
|
+
|
2809
|
+
if (cdict->refContext->params.fParams.contentSizeFlag==1) {
|
2810
|
+
cctx->params.fParams.contentSizeFlag = 1;
|
2811
|
+
cctx->frameContentSize = srcSize;
|
2812
|
+
}
|
2813
|
+
|
2814
|
+
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
|
2815
|
+
}
|
2816
|
+
|
2817
|
+
|
2818
|
+
|
2819
|
+
/* ******************************************************************
|
2820
|
+
* Streaming
|
2821
|
+
********************************************************************/
|
2822
|
+
|
2823
|
+
typedef enum { zcss_init, zcss_load, zcss_flush, zcss_final } ZSTD_cStreamStage;
|
2824
|
+
|
2825
|
+
struct ZSTD_CStream_s {
|
2826
|
+
ZSTD_CCtx* cctx;
|
2827
|
+
ZSTD_CDict* cdictLocal;
|
2828
|
+
const ZSTD_CDict* cdict;
|
2829
|
+
char* inBuff;
|
2830
|
+
size_t inBuffSize;
|
2831
|
+
size_t inToCompress;
|
2832
|
+
size_t inBuffPos;
|
2833
|
+
size_t inBuffTarget;
|
2834
|
+
size_t blockSize;
|
2835
|
+
char* outBuff;
|
2836
|
+
size_t outBuffSize;
|
2837
|
+
size_t outBuffContentSize;
|
2838
|
+
size_t outBuffFlushedSize;
|
2839
|
+
ZSTD_cStreamStage stage;
|
2840
|
+
U32 checksum;
|
2841
|
+
U32 frameEnded;
|
2842
|
+
ZSTD_parameters params;
|
2843
|
+
ZSTD_customMem customMem;
|
2844
|
+
}; /* typedef'd to ZSTD_CStream within "zstd.h" */
|
2845
|
+
|
2846
|
+
ZSTD_CStream* ZSTD_createCStream(void)
|
2923
2847
|
{
|
2924
|
-
return
|
2925
|
-
|
2926
|
-
|
2848
|
+
return ZSTD_createCStream_advanced(defaultCustomMem);
|
2849
|
+
}
|
2850
|
+
|
2851
|
+
ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem)
|
2852
|
+
{
|
2853
|
+
ZSTD_CStream* zcs;
|
2854
|
+
|
2855
|
+
if (!customMem.customAlloc && !customMem.customFree) customMem = defaultCustomMem;
|
2856
|
+
if (!customMem.customAlloc || !customMem.customFree) return NULL;
|
2857
|
+
|
2858
|
+
zcs = (ZSTD_CStream*)ZSTD_malloc(sizeof(ZSTD_CStream), customMem);
|
2859
|
+
if (zcs==NULL) return NULL;
|
2860
|
+
memset(zcs, 0, sizeof(ZSTD_CStream));
|
2861
|
+
memcpy(&zcs->customMem, &customMem, sizeof(ZSTD_customMem));
|
2862
|
+
zcs->cctx = ZSTD_createCCtx_advanced(customMem);
|
2863
|
+
if (zcs->cctx == NULL) { ZSTD_freeCStream(zcs); return NULL; }
|
2864
|
+
return zcs;
|
2865
|
+
}
|
2866
|
+
|
2867
|
+
size_t ZSTD_freeCStream(ZSTD_CStream* zcs)
|
2868
|
+
{
|
2869
|
+
if (zcs==NULL) return 0; /* support free on NULL */
|
2870
|
+
{ ZSTD_customMem const cMem = zcs->customMem;
|
2871
|
+
ZSTD_freeCCtx(zcs->cctx);
|
2872
|
+
ZSTD_freeCDict(zcs->cdictLocal);
|
2873
|
+
ZSTD_free(zcs->inBuff, cMem);
|
2874
|
+
ZSTD_free(zcs->outBuff, cMem);
|
2875
|
+
ZSTD_free(zcs, cMem);
|
2876
|
+
return 0;
|
2877
|
+
}
|
2878
|
+
}
|
2879
|
+
|
2880
|
+
|
2881
|
+
/*====== Initialization ======*/
|
2882
|
+
|
2883
|
+
size_t ZSTD_CStreamInSize(void) { return ZSTD_BLOCKSIZE_ABSOLUTEMAX; }
|
2884
|
+
size_t ZSTD_CStreamOutSize(void) { return ZSTD_compressBound(ZSTD_BLOCKSIZE_ABSOLUTEMAX) + ZSTD_blockHeaderSize + 4 /* 32-bits hash */ ; }
|
2885
|
+
|
2886
|
+
size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize)
|
2887
|
+
{
|
2888
|
+
if (zcs->inBuffSize==0) return ERROR(stage_wrong); /* zcs has not been init at least once */
|
2889
|
+
|
2890
|
+
if (zcs->cdict) CHECK_F(ZSTD_compressBegin_usingCDict(zcs->cctx, zcs->cdict, pledgedSrcSize))
|
2891
|
+
else CHECK_F(ZSTD_compressBegin_advanced(zcs->cctx, NULL, 0, zcs->params, pledgedSrcSize));
|
2892
|
+
|
2893
|
+
zcs->inToCompress = 0;
|
2894
|
+
zcs->inBuffPos = 0;
|
2895
|
+
zcs->inBuffTarget = zcs->blockSize;
|
2896
|
+
zcs->outBuffContentSize = zcs->outBuffFlushedSize = 0;
|
2897
|
+
zcs->stage = zcss_load;
|
2898
|
+
zcs->frameEnded = 0;
|
2899
|
+
return 0; /* ready to go */
|
2900
|
+
}
|
2901
|
+
|
2902
|
+
size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
|
2903
|
+
const void* dict, size_t dictSize,
|
2904
|
+
ZSTD_parameters params, unsigned long long pledgedSrcSize)
|
2905
|
+
{
|
2906
|
+
/* allocate buffers */
|
2907
|
+
{ size_t const neededInBuffSize = (size_t)1 << params.cParams.windowLog;
|
2908
|
+
if (zcs->inBuffSize < neededInBuffSize) {
|
2909
|
+
zcs->inBuffSize = neededInBuffSize;
|
2910
|
+
ZSTD_free(zcs->inBuff, zcs->customMem);
|
2911
|
+
zcs->inBuff = (char*) ZSTD_malloc(neededInBuffSize, zcs->customMem);
|
2912
|
+
if (zcs->inBuff == NULL) return ERROR(memory_allocation);
|
2913
|
+
}
|
2914
|
+
zcs->blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, neededInBuffSize);
|
2915
|
+
}
|
2916
|
+
if (zcs->outBuffSize < ZSTD_compressBound(zcs->blockSize)+1) {
|
2917
|
+
zcs->outBuffSize = ZSTD_compressBound(zcs->blockSize)+1;
|
2918
|
+
ZSTD_free(zcs->outBuff, zcs->customMem);
|
2919
|
+
zcs->outBuff = (char*) ZSTD_malloc(zcs->outBuffSize, zcs->customMem);
|
2920
|
+
if (zcs->outBuff == NULL) return ERROR(memory_allocation);
|
2921
|
+
}
|
2922
|
+
|
2923
|
+
if (dict) {
|
2924
|
+
ZSTD_freeCDict(zcs->cdictLocal);
|
2925
|
+
zcs->cdictLocal = ZSTD_createCDict_advanced(dict, dictSize, params, zcs->customMem);
|
2926
|
+
if (zcs->cdictLocal == NULL) return ERROR(memory_allocation);
|
2927
|
+
zcs->cdict = zcs->cdictLocal;
|
2928
|
+
} else zcs->cdict = NULL;
|
2929
|
+
|
2930
|
+
zcs->checksum = params.fParams.checksumFlag > 0;
|
2931
|
+
zcs->params = params;
|
2932
|
+
|
2933
|
+
return ZSTD_resetCStream(zcs, pledgedSrcSize);
|
2934
|
+
}
|
2935
|
+
|
2936
|
+
/* note : cdict must outlive compression session */
|
2937
|
+
size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict)
|
2938
|
+
{
|
2939
|
+
ZSTD_parameters const params = ZSTD_getParamsFromCDict(cdict);
|
2940
|
+
size_t const initError = ZSTD_initCStream_advanced(zcs, NULL, 0, params, 0);
|
2941
|
+
zcs->cdict = cdict;
|
2942
|
+
return initError;
|
2943
|
+
}
|
2944
|
+
|
2945
|
+
size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel)
|
2946
|
+
{
|
2947
|
+
ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
|
2948
|
+
return ZSTD_initCStream_advanced(zcs, dict, dictSize, params, 0);
|
2949
|
+
}
|
2950
|
+
|
2951
|
+
size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel)
|
2952
|
+
{
|
2953
|
+
return ZSTD_initCStream_usingDict(zcs, NULL, 0, compressionLevel);
|
2954
|
+
}
|
2955
|
+
|
2956
|
+
size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs)
|
2957
|
+
{
|
2958
|
+
if (zcs==NULL) return 0; /* support sizeof on NULL */
|
2959
|
+
return sizeof(zcs) + ZSTD_sizeof_CCtx(zcs->cctx) + ZSTD_sizeof_CDict(zcs->cdictLocal) + zcs->outBuffSize + zcs->inBuffSize;
|
2960
|
+
}
|
2961
|
+
|
2962
|
+
/*====== Compression ======*/
|
2963
|
+
|
2964
|
+
typedef enum { zsf_gather, zsf_flush, zsf_end } ZSTD_flush_e;
|
2965
|
+
|
2966
|
+
MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
2967
|
+
{
|
2968
|
+
size_t const length = MIN(dstCapacity, srcSize);
|
2969
|
+
memcpy(dst, src, length);
|
2970
|
+
return length;
|
2971
|
+
}
|
2972
|
+
|
2973
|
+
static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
|
2974
|
+
void* dst, size_t* dstCapacityPtr,
|
2975
|
+
const void* src, size_t* srcSizePtr,
|
2976
|
+
ZSTD_flush_e const flush)
|
2977
|
+
{
|
2978
|
+
U32 someMoreWork = 1;
|
2979
|
+
const char* const istart = (const char*)src;
|
2980
|
+
const char* const iend = istart + *srcSizePtr;
|
2981
|
+
const char* ip = istart;
|
2982
|
+
char* const ostart = (char*)dst;
|
2983
|
+
char* const oend = ostart + *dstCapacityPtr;
|
2984
|
+
char* op = ostart;
|
2985
|
+
|
2986
|
+
while (someMoreWork) {
|
2987
|
+
switch(zcs->stage)
|
2988
|
+
{
|
2989
|
+
case zcss_init: return ERROR(init_missing); /* call ZBUFF_compressInit() first ! */
|
2990
|
+
|
2991
|
+
case zcss_load:
|
2992
|
+
/* complete inBuffer */
|
2993
|
+
{ size_t const toLoad = zcs->inBuffTarget - zcs->inBuffPos;
|
2994
|
+
size_t const loaded = ZSTD_limitCopy(zcs->inBuff + zcs->inBuffPos, toLoad, ip, iend-ip);
|
2995
|
+
zcs->inBuffPos += loaded;
|
2996
|
+
ip += loaded;
|
2997
|
+
if ( (zcs->inBuffPos==zcs->inToCompress) || (!flush && (toLoad != loaded)) ) {
|
2998
|
+
someMoreWork = 0; break; /* not enough input to get a full block : stop there, wait for more */
|
2999
|
+
} }
|
3000
|
+
/* compress current block (note : this stage cannot be stopped in the middle) */
|
3001
|
+
{ void* cDst;
|
3002
|
+
size_t cSize;
|
3003
|
+
size_t const iSize = zcs->inBuffPos - zcs->inToCompress;
|
3004
|
+
size_t oSize = oend-op;
|
3005
|
+
if (oSize >= ZSTD_compressBound(iSize))
|
3006
|
+
cDst = op; /* compress directly into output buffer (avoid flush stage) */
|
3007
|
+
else
|
3008
|
+
cDst = zcs->outBuff, oSize = zcs->outBuffSize;
|
3009
|
+
cSize = (flush == zsf_end) ?
|
3010
|
+
ZSTD_compressEnd(zcs->cctx, cDst, oSize, zcs->inBuff + zcs->inToCompress, iSize) :
|
3011
|
+
ZSTD_compressContinue(zcs->cctx, cDst, oSize, zcs->inBuff + zcs->inToCompress, iSize);
|
3012
|
+
if (ZSTD_isError(cSize)) return cSize;
|
3013
|
+
if (flush == zsf_end) zcs->frameEnded = 1;
|
3014
|
+
/* prepare next block */
|
3015
|
+
zcs->inBuffTarget = zcs->inBuffPos + zcs->blockSize;
|
3016
|
+
if (zcs->inBuffTarget > zcs->inBuffSize)
|
3017
|
+
zcs->inBuffPos = 0, zcs->inBuffTarget = zcs->blockSize; /* note : inBuffSize >= blockSize */
|
3018
|
+
zcs->inToCompress = zcs->inBuffPos;
|
3019
|
+
if (cDst == op) { op += cSize; break; } /* no need to flush */
|
3020
|
+
zcs->outBuffContentSize = cSize;
|
3021
|
+
zcs->outBuffFlushedSize = 0;
|
3022
|
+
zcs->stage = zcss_flush; /* pass-through to flush stage */
|
3023
|
+
}
|
3024
|
+
|
3025
|
+
case zcss_flush:
|
3026
|
+
{ size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
|
3027
|
+
size_t const flushed = ZSTD_limitCopy(op, oend-op, zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
|
3028
|
+
op += flushed;
|
3029
|
+
zcs->outBuffFlushedSize += flushed;
|
3030
|
+
if (toFlush!=flushed) { someMoreWork = 0; break; } /* dst too small to store flushed data : stop there */
|
3031
|
+
zcs->outBuffContentSize = zcs->outBuffFlushedSize = 0;
|
3032
|
+
zcs->stage = zcss_load;
|
3033
|
+
break;
|
3034
|
+
}
|
3035
|
+
|
3036
|
+
case zcss_final:
|
3037
|
+
someMoreWork = 0; /* do nothing */
|
3038
|
+
break;
|
3039
|
+
|
3040
|
+
default:
|
3041
|
+
return ERROR(GENERIC); /* impossible */
|
3042
|
+
}
|
3043
|
+
}
|
3044
|
+
|
3045
|
+
*srcSizePtr = ip - istart;
|
3046
|
+
*dstCapacityPtr = op - ostart;
|
3047
|
+
if (zcs->frameEnded) return 0;
|
3048
|
+
{ size_t hintInSize = zcs->inBuffTarget - zcs->inBuffPos;
|
3049
|
+
if (hintInSize==0) hintInSize = zcs->blockSize;
|
3050
|
+
return hintInSize;
|
3051
|
+
}
|
3052
|
+
}
|
3053
|
+
|
3054
|
+
size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
|
3055
|
+
{
|
3056
|
+
size_t sizeRead = input->size - input->pos;
|
3057
|
+
size_t sizeWritten = output->size - output->pos;
|
3058
|
+
size_t const result = ZSTD_compressStream_generic(zcs,
|
3059
|
+
(char*)(output->dst) + output->pos, &sizeWritten,
|
3060
|
+
(const char*)(input->src) + input->pos, &sizeRead, zsf_gather);
|
3061
|
+
input->pos += sizeRead;
|
3062
|
+
output->pos += sizeWritten;
|
3063
|
+
return result;
|
3064
|
+
}
|
3065
|
+
|
3066
|
+
|
3067
|
+
/*====== Finalize ======*/
|
3068
|
+
|
3069
|
+
/*! ZSTD_flushStream() :
|
3070
|
+
* @return : amount of data remaining to flush */
|
3071
|
+
size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
|
3072
|
+
{
|
3073
|
+
size_t srcSize = 0;
|
3074
|
+
size_t sizeWritten = output->size - output->pos;
|
3075
|
+
size_t const result = ZSTD_compressStream_generic(zcs,
|
3076
|
+
(char*)(output->dst) + output->pos, &sizeWritten,
|
3077
|
+
&srcSize, &srcSize, /* use a valid src address instead of NULL */
|
3078
|
+
zsf_flush);
|
3079
|
+
output->pos += sizeWritten;
|
3080
|
+
if (ZSTD_isError(result)) return result;
|
3081
|
+
return zcs->outBuffContentSize - zcs->outBuffFlushedSize; /* remaining to flush */
|
3082
|
+
}
|
3083
|
+
|
3084
|
+
|
3085
|
+
size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
|
3086
|
+
{
|
3087
|
+
BYTE* const ostart = (BYTE*)(output->dst) + output->pos;
|
3088
|
+
BYTE* const oend = (BYTE*)(output->dst) + output->size;
|
3089
|
+
BYTE* op = ostart;
|
3090
|
+
|
3091
|
+
if (zcs->stage != zcss_final) {
|
3092
|
+
/* flush whatever remains */
|
3093
|
+
size_t srcSize = 0;
|
3094
|
+
size_t sizeWritten = output->size - output->pos;
|
3095
|
+
size_t const notEnded = ZSTD_compressStream_generic(zcs, ostart, &sizeWritten, &srcSize, &srcSize, zsf_end); /* use a valid src address instead of NULL */
|
3096
|
+
size_t const remainingToFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
|
3097
|
+
op += sizeWritten;
|
3098
|
+
if (remainingToFlush) {
|
3099
|
+
output->pos += sizeWritten;
|
3100
|
+
return remainingToFlush + ZSTD_BLOCKHEADERSIZE /* final empty block */ + (zcs->checksum * 4);
|
3101
|
+
}
|
3102
|
+
/* create epilogue */
|
3103
|
+
zcs->stage = zcss_final;
|
3104
|
+
zcs->outBuffContentSize = !notEnded ? 0 :
|
3105
|
+
ZSTD_compressEnd(zcs->cctx, zcs->outBuff, zcs->outBuffSize, NULL, 0); /* write epilogue, including final empty block, into outBuff */
|
3106
|
+
}
|
3107
|
+
|
3108
|
+
/* flush epilogue */
|
3109
|
+
{ size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize;
|
3110
|
+
size_t const flushed = ZSTD_limitCopy(op, oend-op, zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
|
3111
|
+
op += flushed;
|
3112
|
+
zcs->outBuffFlushedSize += flushed;
|
3113
|
+
output->pos += op-ostart;
|
3114
|
+
if (toFlush==flushed) zcs->stage = zcss_init; /* end reached */
|
3115
|
+
return toFlush - flushed;
|
3116
|
+
}
|
2927
3117
|
}
|
2928
3118
|
|
2929
3119
|
|
@@ -2932,20 +3122,20 @@ ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx,
|
|
2932
3122
|
|
2933
3123
|
#define ZSTD_DEFAULT_CLEVEL 1
|
2934
3124
|
#define ZSTD_MAX_CLEVEL 22
|
2935
|
-
|
3125
|
+
int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
|
2936
3126
|
|
2937
3127
|
static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = {
|
2938
3128
|
{ /* "default" */
|
2939
3129
|
/* W, C, H, S, L, TL, strat */
|
2940
|
-
{ 18, 12, 12, 1, 7, 16, ZSTD_fast }, /* level 0 -
|
3130
|
+
{ 18, 12, 12, 1, 7, 16, ZSTD_fast }, /* level 0 - never used */
|
2941
3131
|
{ 19, 13, 14, 1, 7, 16, ZSTD_fast }, /* level 1 */
|
2942
3132
|
{ 19, 15, 16, 1, 6, 16, ZSTD_fast }, /* level 2 */
|
2943
|
-
{ 20, 16,
|
2944
|
-
{ 20,
|
3133
|
+
{ 20, 16, 17, 1, 5, 16, ZSTD_dfast }, /* level 3.*/
|
3134
|
+
{ 20, 18, 18, 1, 5, 16, ZSTD_dfast }, /* level 4.*/
|
2945
3135
|
{ 20, 15, 18, 3, 5, 16, ZSTD_greedy }, /* level 5 */
|
2946
3136
|
{ 21, 16, 19, 2, 5, 16, ZSTD_lazy }, /* level 6 */
|
2947
3137
|
{ 21, 17, 20, 3, 5, 16, ZSTD_lazy }, /* level 7 */
|
2948
|
-
{ 21, 18, 20, 3, 5, 16, ZSTD_lazy2 }, /* level 8
|
3138
|
+
{ 21, 18, 20, 3, 5, 16, ZSTD_lazy2 }, /* level 8 */
|
2949
3139
|
{ 21, 20, 20, 3, 5, 16, ZSTD_lazy2 }, /* level 9 */
|
2950
3140
|
{ 21, 19, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
|
2951
3141
|
{ 22, 20, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
|
@@ -2954,69 +3144,69 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|
2954
3144
|
{ 22, 21, 22, 6, 5, 16, ZSTD_lazy2 }, /* level 14 */
|
2955
3145
|
{ 22, 21, 21, 5, 5, 16, ZSTD_btlazy2 }, /* level 15 */
|
2956
3146
|
{ 23, 22, 22, 5, 5, 16, ZSTD_btlazy2 }, /* level 16 */
|
2957
|
-
{ 23,
|
2958
|
-
{ 23, 23, 22, 6, 5,
|
2959
|
-
{ 23, 23, 22, 6, 3, 48, ZSTD_btopt }, /* level 19
|
2960
|
-
{ 25,
|
2961
|
-
{ 26, 26, 23, 7, 3,256,
|
2962
|
-
{ 27, 27, 25, 9, 3,512,
|
3147
|
+
{ 23, 21, 22, 4, 5, 24, ZSTD_btopt }, /* level 17 */
|
3148
|
+
{ 23, 23, 22, 6, 5, 32, ZSTD_btopt }, /* level 18 */
|
3149
|
+
{ 23, 23, 22, 6, 3, 48, ZSTD_btopt }, /* level 19 */
|
3150
|
+
{ 25, 25, 23, 7, 3, 64, ZSTD_btopt2 }, /* level 20 */
|
3151
|
+
{ 26, 26, 23, 7, 3,256, ZSTD_btopt2 }, /* level 21 */
|
3152
|
+
{ 27, 27, 25, 9, 3,512, ZSTD_btopt2 }, /* level 22 */
|
2963
3153
|
},
|
2964
3154
|
{ /* for srcSize <= 256 KB */
|
2965
3155
|
/* W, C, H, S, L, T, strat */
|
2966
|
-
{
|
2967
|
-
{ 18, 13, 14, 1, 6,
|
2968
|
-
{ 18,
|
2969
|
-
{ 18,
|
2970
|
-
{ 18, 15, 17, 1, 5,
|
2971
|
-
{ 18, 16, 17, 4, 5,
|
2972
|
-
{ 18,
|
2973
|
-
{ 18, 17, 17, 4, 4,
|
2974
|
-
{ 18, 17, 17, 4, 4,
|
2975
|
-
{ 18, 17, 17, 5, 4,
|
2976
|
-
{ 18, 17, 17, 6, 4,
|
2977
|
-
{ 18, 18, 17, 6, 4,
|
2978
|
-
{ 18, 18, 17, 7, 4,
|
2979
|
-
{ 18, 19, 17,
|
3156
|
+
{ 0, 0, 0, 0, 0, 0, ZSTD_fast }, /* level 0 - not used */
|
3157
|
+
{ 18, 13, 14, 1, 6, 8, ZSTD_fast }, /* level 1 */
|
3158
|
+
{ 18, 14, 13, 1, 5, 8, ZSTD_dfast }, /* level 2 */
|
3159
|
+
{ 18, 16, 15, 1, 5, 8, ZSTD_dfast }, /* level 3 */
|
3160
|
+
{ 18, 15, 17, 1, 5, 8, ZSTD_greedy }, /* level 4.*/
|
3161
|
+
{ 18, 16, 17, 4, 5, 8, ZSTD_greedy }, /* level 5.*/
|
3162
|
+
{ 18, 16, 17, 3, 5, 8, ZSTD_lazy }, /* level 6.*/
|
3163
|
+
{ 18, 17, 17, 4, 4, 8, ZSTD_lazy }, /* level 7 */
|
3164
|
+
{ 18, 17, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */
|
3165
|
+
{ 18, 17, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */
|
3166
|
+
{ 18, 17, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */
|
3167
|
+
{ 18, 18, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 11.*/
|
3168
|
+
{ 18, 18, 17, 7, 4, 8, ZSTD_lazy2 }, /* level 12.*/
|
3169
|
+
{ 18, 19, 17, 6, 4, 8, ZSTD_btlazy2 }, /* level 13 */
|
2980
3170
|
{ 18, 18, 18, 4, 4, 16, ZSTD_btopt }, /* level 14.*/
|
2981
|
-
{ 18, 18, 18,
|
2982
|
-
{ 18, 19, 18,
|
2983
|
-
{ 18, 19, 18, 8, 3,
|
3171
|
+
{ 18, 18, 18, 4, 3, 16, ZSTD_btopt }, /* level 15.*/
|
3172
|
+
{ 18, 19, 18, 6, 3, 32, ZSTD_btopt }, /* level 16.*/
|
3173
|
+
{ 18, 19, 18, 8, 3, 64, ZSTD_btopt }, /* level 17.*/
|
2984
3174
|
{ 18, 19, 18, 9, 3,128, ZSTD_btopt }, /* level 18.*/
|
2985
3175
|
{ 18, 19, 18, 10, 3,256, ZSTD_btopt }, /* level 19.*/
|
2986
|
-
{ 18, 19, 18, 11, 3,512,
|
2987
|
-
{ 18, 19, 18, 12, 3,512,
|
2988
|
-
{ 18, 19, 18, 13, 3,512,
|
3176
|
+
{ 18, 19, 18, 11, 3,512, ZSTD_btopt2 }, /* level 20.*/
|
3177
|
+
{ 18, 19, 18, 12, 3,512, ZSTD_btopt2 }, /* level 21.*/
|
3178
|
+
{ 18, 19, 18, 13, 3,512, ZSTD_btopt2 }, /* level 22.*/
|
2989
3179
|
},
|
2990
3180
|
{ /* for srcSize <= 128 KB */
|
2991
3181
|
/* W, C, H, S, L, T, strat */
|
2992
|
-
{ 17, 12, 12, 1, 7,
|
2993
|
-
{ 17, 12, 13, 1, 6,
|
2994
|
-
{ 17, 13, 16, 1, 5,
|
2995
|
-
{ 17,
|
2996
|
-
{ 17, 13, 15, 3, 4,
|
2997
|
-
{ 17, 15, 17, 4, 4,
|
2998
|
-
{ 17, 16, 17, 3, 4,
|
2999
|
-
{ 17, 15, 17, 4, 4,
|
3000
|
-
{ 17, 17, 17, 4, 4,
|
3001
|
-
{ 17, 17, 17, 5, 4,
|
3002
|
-
{ 17, 17, 17, 6, 4,
|
3003
|
-
{ 17, 17, 17, 7, 4,
|
3004
|
-
{ 17, 17, 17, 8, 4,
|
3005
|
-
{ 17, 18, 17, 6, 4,
|
3182
|
+
{ 17, 12, 12, 1, 7, 8, ZSTD_fast }, /* level 0 - not used */
|
3183
|
+
{ 17, 12, 13, 1, 6, 8, ZSTD_fast }, /* level 1 */
|
3184
|
+
{ 17, 13, 16, 1, 5, 8, ZSTD_fast }, /* level 2 */
|
3185
|
+
{ 17, 16, 16, 2, 5, 8, ZSTD_dfast }, /* level 3 */
|
3186
|
+
{ 17, 13, 15, 3, 4, 8, ZSTD_greedy }, /* level 4 */
|
3187
|
+
{ 17, 15, 17, 4, 4, 8, ZSTD_greedy }, /* level 5 */
|
3188
|
+
{ 17, 16, 17, 3, 4, 8, ZSTD_lazy }, /* level 6 */
|
3189
|
+
{ 17, 15, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 7 */
|
3190
|
+
{ 17, 17, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */
|
3191
|
+
{ 17, 17, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */
|
3192
|
+
{ 17, 17, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */
|
3193
|
+
{ 17, 17, 17, 7, 4, 8, ZSTD_lazy2 }, /* level 11 */
|
3194
|
+
{ 17, 17, 17, 8, 4, 8, ZSTD_lazy2 }, /* level 12 */
|
3195
|
+
{ 17, 18, 17, 6, 4, 8, ZSTD_btlazy2 }, /* level 13.*/
|
3006
3196
|
{ 17, 17, 17, 7, 3, 8, ZSTD_btopt }, /* level 14.*/
|
3007
3197
|
{ 17, 17, 17, 7, 3, 16, ZSTD_btopt }, /* level 15.*/
|
3008
3198
|
{ 17, 18, 17, 7, 3, 32, ZSTD_btopt }, /* level 16.*/
|
3009
3199
|
{ 17, 18, 17, 7, 3, 64, ZSTD_btopt }, /* level 17.*/
|
3010
3200
|
{ 17, 18, 17, 7, 3,256, ZSTD_btopt }, /* level 18.*/
|
3011
3201
|
{ 17, 18, 17, 8, 3,256, ZSTD_btopt }, /* level 19.*/
|
3012
|
-
{ 17, 18, 17, 9, 3,256,
|
3013
|
-
{ 17, 18, 17, 10, 3,256,
|
3014
|
-
{ 17, 18, 17, 11, 3,
|
3202
|
+
{ 17, 18, 17, 9, 3,256, ZSTD_btopt2 }, /* level 20.*/
|
3203
|
+
{ 17, 18, 17, 10, 3,256, ZSTD_btopt2 }, /* level 21.*/
|
3204
|
+
{ 17, 18, 17, 11, 3,512, ZSTD_btopt2 }, /* level 22.*/
|
3015
3205
|
},
|
3016
3206
|
{ /* for srcSize <= 16 KB */
|
3017
3207
|
/* W, C, H, S, L, T, strat */
|
3018
3208
|
{ 14, 12, 12, 1, 7, 6, ZSTD_fast }, /* level 0 - not used */
|
3019
|
-
{ 14, 14, 14, 1,
|
3209
|
+
{ 14, 14, 14, 1, 6, 6, ZSTD_fast }, /* level 1 */
|
3020
3210
|
{ 14, 14, 14, 1, 4, 6, ZSTD_fast }, /* level 2 */
|
3021
3211
|
{ 14, 14, 14, 1, 4, 6, ZSTD_dfast }, /* level 3.*/
|
3022
3212
|
{ 14, 14, 14, 4, 4, 6, ZSTD_greedy }, /* level 4.*/
|
@@ -3035,9 +3225,9 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|
3035
3225
|
{ 14, 15, 15, 6, 3,128, ZSTD_btopt }, /* level 17.*/
|
3036
3226
|
{ 14, 15, 15, 6, 3,256, ZSTD_btopt }, /* level 18.*/
|
3037
3227
|
{ 14, 15, 15, 7, 3,256, ZSTD_btopt }, /* level 19.*/
|
3038
|
-
{ 14, 15, 15, 8, 3,256,
|
3039
|
-
{ 14, 15, 15, 9, 3,256,
|
3040
|
-
{ 14, 15, 15, 10, 3,256,
|
3228
|
+
{ 14, 15, 15, 8, 3,256, ZSTD_btopt2 }, /* level 20.*/
|
3229
|
+
{ 14, 15, 15, 9, 3,256, ZSTD_btopt2 }, /* level 21.*/
|
3230
|
+
{ 14, 15, 15, 10, 3,256, ZSTD_btopt2 }, /* level 22.*/
|
3041
3231
|
},
|
3042
3232
|
};
|
3043
3233
|
|