zstd-ruby 1.3.0.0 → 1.3.1.0
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/README.md +1 -1
- data/ext/zstdruby/libzstd/common/bitstream.h +40 -41
- data/ext/zstdruby/libzstd/common/compiler.h +85 -0
- data/ext/zstdruby/libzstd/common/error_private.c +8 -10
- data/ext/zstdruby/libzstd/common/error_private.h +4 -4
- data/ext/zstdruby/libzstd/common/fse.h +11 -5
- data/ext/zstdruby/libzstd/common/fse_decompress.c +3 -22
- data/ext/zstdruby/libzstd/common/huf.h +5 -6
- data/ext/zstdruby/libzstd/common/mem.h +6 -6
- data/ext/zstdruby/libzstd/common/pool.c +61 -27
- data/ext/zstdruby/libzstd/common/pool.h +10 -10
- data/ext/zstdruby/libzstd/common/threading.h +5 -6
- data/ext/zstdruby/libzstd/common/xxhash.c +28 -22
- data/ext/zstdruby/libzstd/common/zstd_common.c +4 -4
- data/ext/zstdruby/libzstd/common/zstd_errors.h +30 -32
- data/ext/zstdruby/libzstd/common/zstd_internal.h +57 -56
- data/ext/zstdruby/libzstd/compress/fse_compress.c +4 -22
- data/ext/zstdruby/libzstd/compress/huf_compress.c +4 -3
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +314 -304
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +118 -116
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +223 -156
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +10 -9
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +8 -24
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +95 -115
- data/ext/zstdruby/libzstd/deprecated/zbuff.h +4 -4
- data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +4 -5
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +4 -4
- data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +4 -4
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +7 -9
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +5 -5
- data/ext/zstdruby/libzstd/dictBuilder/zdict.h +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +8 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v01.h +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v02.h +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v03.h +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +5 -5
- data/ext/zstdruby/libzstd/legacy/zstd_v04.h +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +5 -5
- data/ext/zstdruby/libzstd/legacy/zstd_v05.h +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +5 -5
- data/ext/zstdruby/libzstd/legacy/zstd_v06.h +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +4 -4
- data/ext/zstdruby/libzstd/legacy/zstd_v07.h +4 -4
- data/ext/zstdruby/libzstd/zstd.h +16 -14
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +3 -2
@@ -1,55 +1,28 @@
|
|
1
|
-
|
1
|
+
/*
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
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
|
7
|
-
*
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
8
8
|
*/
|
9
9
|
|
10
10
|
#ifndef ZSTD_CCOMMON_H_MODULE
|
11
11
|
#define ZSTD_CCOMMON_H_MODULE
|
12
12
|
|
13
|
-
/*-*******************************************************
|
14
|
-
* Compiler specifics
|
15
|
-
*********************************************************/
|
16
|
-
#ifdef _MSC_VER /* Visual Studio */
|
17
|
-
# define FORCE_INLINE static __forceinline
|
18
|
-
# include <intrin.h> /* For Visual 2005 */
|
19
|
-
# pragma warning(disable : 4100) /* disable: C4100: unreferenced formal parameter */
|
20
|
-
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
21
|
-
# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */
|
22
|
-
# pragma warning(disable : 4324) /* disable: C4324: padded structure */
|
23
|
-
#else
|
24
|
-
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
25
|
-
# ifdef __GNUC__
|
26
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
27
|
-
# else
|
28
|
-
# define FORCE_INLINE static inline
|
29
|
-
# endif
|
30
|
-
# else
|
31
|
-
# define FORCE_INLINE static
|
32
|
-
# endif /* __STDC_VERSION__ */
|
33
|
-
#endif
|
34
|
-
|
35
|
-
#ifdef _MSC_VER
|
36
|
-
# define FORCE_NOINLINE static __declspec(noinline)
|
37
|
-
#else
|
38
|
-
# ifdef __GNUC__
|
39
|
-
# define FORCE_NOINLINE static __attribute__((__noinline__))
|
40
|
-
# else
|
41
|
-
# define FORCE_NOINLINE static
|
42
|
-
# endif
|
43
|
-
#endif
|
44
|
-
|
45
13
|
|
46
14
|
/*-*************************************
|
47
15
|
* Dependencies
|
48
16
|
***************************************/
|
17
|
+
#include "compiler.h"
|
49
18
|
#include "mem.h"
|
50
19
|
#include "error_private.h"
|
51
20
|
#define ZSTD_STATIC_LINKING_ONLY
|
52
21
|
#include "zstd.h"
|
22
|
+
#define FSE_STATIC_LINKING_ONLY
|
23
|
+
#include "fse.h"
|
24
|
+
#define HUF_STATIC_LINKING_ONLY
|
25
|
+
#include "huf.h"
|
53
26
|
#ifndef XXH_STATIC_LINKING_ONLY
|
54
27
|
# define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
|
55
28
|
#endif
|
@@ -211,20 +184,6 @@ MEM_STATIC void ZSTD_wildcopy_e(void* dst, const void* src, void* dstEnd) /* s
|
|
211
184
|
*********************************************/
|
212
185
|
typedef struct ZSTD_stats_s ZSTD_stats_t;
|
213
186
|
|
214
|
-
typedef struct {
|
215
|
-
U32 off;
|
216
|
-
U32 len;
|
217
|
-
} ZSTD_match_t;
|
218
|
-
|
219
|
-
typedef struct {
|
220
|
-
U32 price;
|
221
|
-
U32 off;
|
222
|
-
U32 mlen;
|
223
|
-
U32 litlen;
|
224
|
-
U32 rep[ZSTD_REP_NUM];
|
225
|
-
} ZSTD_optimal_t;
|
226
|
-
|
227
|
-
|
228
187
|
typedef struct seqDef_s {
|
229
188
|
U32 offset;
|
230
189
|
U16 litLength;
|
@@ -242,13 +201,31 @@ typedef struct {
|
|
242
201
|
BYTE* ofCode;
|
243
202
|
U32 longLengthID; /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
|
244
203
|
U32 longLengthPos;
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
204
|
+
U32 rep[ZSTD_REP_NUM];
|
205
|
+
U32 repToConfirm[ZSTD_REP_NUM];
|
206
|
+
} seqStore_t;
|
207
|
+
|
208
|
+
typedef struct {
|
209
|
+
U32 off;
|
210
|
+
U32 len;
|
211
|
+
} ZSTD_match_t;
|
212
|
+
|
213
|
+
typedef struct {
|
214
|
+
U32 price;
|
215
|
+
U32 off;
|
216
|
+
U32 mlen;
|
217
|
+
U32 litlen;
|
218
|
+
U32 rep[ZSTD_REP_NUM];
|
219
|
+
} ZSTD_optimal_t;
|
220
|
+
|
221
|
+
typedef struct {
|
250
222
|
U32* litFreq;
|
223
|
+
U32* litLengthFreq;
|
224
|
+
U32* matchLengthFreq;
|
251
225
|
U32* offCodeFreq;
|
226
|
+
ZSTD_match_t* matchTable;
|
227
|
+
ZSTD_optimal_t* priceTable;
|
228
|
+
|
252
229
|
U32 matchLengthSum;
|
253
230
|
U32 matchSum;
|
254
231
|
U32 litLengthSum;
|
@@ -264,7 +241,19 @@ typedef struct {
|
|
264
241
|
U32 cachedPrice;
|
265
242
|
U32 cachedLitLength;
|
266
243
|
const BYTE* cachedLiterals;
|
267
|
-
}
|
244
|
+
} optState_t;
|
245
|
+
|
246
|
+
typedef struct {
|
247
|
+
U32 hufCTable[HUF_CTABLE_SIZE_U32(255)];
|
248
|
+
FSE_CTable offcodeCTable[FSE_CTABLE_SIZE_U32(OffFSELog, MaxOff)];
|
249
|
+
FSE_CTable matchlengthCTable[FSE_CTABLE_SIZE_U32(MLFSELog, MaxML)];
|
250
|
+
FSE_CTable litlengthCTable[FSE_CTABLE_SIZE_U32(LLFSELog, MaxLL)];
|
251
|
+
U32 workspace[HUF_WORKSPACE_SIZE_U32];
|
252
|
+
HUF_repeat hufCTable_repeatMode;
|
253
|
+
FSE_repeat offcode_repeatMode;
|
254
|
+
FSE_repeat matchlength_repeatMode;
|
255
|
+
FSE_repeat litlength_repeatMode;
|
256
|
+
} ZSTD_entropyCTables_t;
|
268
257
|
|
269
258
|
const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx);
|
270
259
|
void ZSTD_seqToCodes(const seqStore_t* seqStorePtr);
|
@@ -331,4 +320,16 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
|
|
331
320
|
ZSTD_parameters ZSTD_getParamsFromCDict(const ZSTD_CDict* cdict);
|
332
321
|
|
333
322
|
|
323
|
+
typedef struct {
|
324
|
+
blockType_e blockType;
|
325
|
+
U32 lastBlock;
|
326
|
+
U32 origSize;
|
327
|
+
} blockProperties_t;
|
328
|
+
|
329
|
+
/*! ZSTD_getcBlockSize() :
|
330
|
+
* Provides the size of compressed block from block header `src` */
|
331
|
+
size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
|
332
|
+
blockProperties_t* bpPtr);
|
333
|
+
|
334
|
+
|
334
335
|
#endif /* ZSTD_CCOMMON_H_MODULE */
|
@@ -32,27 +32,6 @@
|
|
32
32
|
- Public forum : https://groups.google.com/forum/#!forum/lz4c
|
33
33
|
****************************************************************** */
|
34
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
|
-
# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
|
43
|
-
#else
|
44
|
-
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
45
|
-
# ifdef __GNUC__
|
46
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
47
|
-
# else
|
48
|
-
# define FORCE_INLINE static inline
|
49
|
-
# endif
|
50
|
-
# else
|
51
|
-
# define FORCE_INLINE static
|
52
|
-
# endif /* __STDC_VERSION__ */
|
53
|
-
#endif
|
54
|
-
|
55
|
-
|
56
35
|
/* **************************************************************
|
57
36
|
* Includes
|
58
37
|
****************************************************************/
|
@@ -60,13 +39,16 @@
|
|
60
39
|
#include <string.h> /* memcpy, memset */
|
61
40
|
#include <stdio.h> /* printf (debug) */
|
62
41
|
#include "bitstream.h"
|
42
|
+
#include "compiler.h"
|
63
43
|
#define FSE_STATIC_LINKING_ONLY
|
64
44
|
#include "fse.h"
|
45
|
+
#include "error_private.h"
|
65
46
|
|
66
47
|
|
67
48
|
/* **************************************************************
|
68
49
|
* Error Management
|
69
50
|
****************************************************************/
|
51
|
+
#define FSE_isError ERR_isError
|
70
52
|
#define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
|
71
53
|
|
72
54
|
|
@@ -781,7 +763,7 @@ size_t FSE_compress_usingCTable (void* dst, size_t dstSize,
|
|
781
763
|
|
782
764
|
size_t FSE_compressBound(size_t size) { return FSE_COMPRESSBOUND(size); }
|
783
765
|
|
784
|
-
#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return
|
766
|
+
#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e
|
785
767
|
#define CHECK_F(f) { CHECK_V_F(_var_err__, f); }
|
786
768
|
|
787
769
|
/* FSE_compress_wksp() :
|
@@ -50,13 +50,15 @@
|
|
50
50
|
#include "fse.h" /* header compression */
|
51
51
|
#define HUF_STATIC_LINKING_ONLY
|
52
52
|
#include "huf.h"
|
53
|
+
#include "error_private.h"
|
53
54
|
|
54
55
|
|
55
56
|
/* **************************************************************
|
56
57
|
* Error Management
|
57
58
|
****************************************************************/
|
59
|
+
#define HUF_isError ERR_isError
|
58
60
|
#define HUF_STATIC_ASSERT(c) { enum { HUF_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
|
59
|
-
#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return
|
61
|
+
#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e
|
60
62
|
#define CHECK_F(f) { CHECK_V_F(_var_err__, f); }
|
61
63
|
|
62
64
|
|
@@ -436,7 +438,7 @@ static void HUF_encodeSymbol(BIT_CStream_t* bitCPtr, U32 symbol, const HUF_CElt*
|
|
436
438
|
|
437
439
|
size_t HUF_compressBound(size_t size) { return HUF_COMPRESSBOUND(size); }
|
438
440
|
|
439
|
-
#define HUF_FLUSHBITS(s)
|
441
|
+
#define HUF_FLUSHBITS(s) BIT_flushBits(s)
|
440
442
|
|
441
443
|
#define HUF_FLUSHBITS_1(stream) \
|
442
444
|
if (sizeof((stream)->bitContainer)*8 < HUF_TABLELOG_MAX*2+7) HUF_FLUSHBITS(stream)
|
@@ -451,7 +453,6 @@ size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, si
|
|
451
453
|
BYTE* const oend = ostart + dstSize;
|
452
454
|
BYTE* op = ostart;
|
453
455
|
size_t n;
|
454
|
-
const unsigned fast = (dstSize >= HUF_BLOCKBOUND(srcSize));
|
455
456
|
BIT_CStream_t bitC;
|
456
457
|
|
457
458
|
/* init */
|
@@ -1,10 +1,10 @@
|
|
1
|
-
|
1
|
+
/*
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
3
3
|
* All rights reserved.
|
4
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
|
7
|
-
*
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
8
8
|
*/
|
9
9
|
|
10
10
|
|
@@ -36,13 +36,6 @@ static const U32 g_searchStrength = 8; /* control skip over incompressible dat
|
|
36
36
|
#define HASH_READ_SIZE 8
|
37
37
|
typedef enum { ZSTDcs_created=0, ZSTDcs_init, ZSTDcs_ongoing, ZSTDcs_ending } ZSTD_compressionStage_e;
|
38
38
|
|
39
|
-
/* entropy tables always have same size */
|
40
|
-
static size_t const hufCTable_size = HUF_CTABLE_SIZE(255);
|
41
|
-
static size_t const litlengthCTable_size = FSE_CTABLE_SIZE(LLFSELog, MaxLL);
|
42
|
-
static size_t const offcodeCTable_size = FSE_CTABLE_SIZE(OffFSELog, MaxOff);
|
43
|
-
static size_t const matchlengthCTable_size = FSE_CTABLE_SIZE(MLFSELog, MaxML);
|
44
|
-
static size_t const entropyScratchSpace_size = HUF_WORKSPACE_SIZE;
|
45
|
-
|
46
39
|
|
47
40
|
/*-*************************************
|
48
41
|
* Helper functions
|
@@ -89,8 +82,6 @@ struct ZSTD_CCtx_s {
|
|
89
82
|
U32 loadedDictEnd; /* index of end of dictionary */
|
90
83
|
U32 forceWindow; /* force back-references to respect limit of 1<<wLog, even for dictionary */
|
91
84
|
ZSTD_compressionStage_e stage;
|
92
|
-
U32 rep[ZSTD_REP_NUM];
|
93
|
-
U32 repToConfirm[ZSTD_REP_NUM];
|
94
85
|
U32 dictID;
|
95
86
|
int compressionLevel;
|
96
87
|
ZSTD_parameters requestedParams;
|
@@ -105,16 +96,11 @@ struct ZSTD_CCtx_s {
|
|
105
96
|
size_t staticSize;
|
106
97
|
|
107
98
|
seqStore_t seqStore; /* sequences storage ptrs */
|
99
|
+
optState_t optState;
|
108
100
|
U32* hashTable;
|
109
101
|
U32* hashTable3;
|
110
102
|
U32* chainTable;
|
111
|
-
|
112
|
-
HUF_CElt* hufCTable;
|
113
|
-
U32 fseCTables_ready;
|
114
|
-
FSE_CTable* offcodeCTable;
|
115
|
-
FSE_CTable* matchlengthCTable;
|
116
|
-
FSE_CTable* litlengthCTable;
|
117
|
-
unsigned* entropyScratchSpace;
|
103
|
+
ZSTD_entropyCTables_t* entropy;
|
118
104
|
|
119
105
|
/* streaming */
|
120
106
|
char* inBuff;
|
@@ -174,19 +160,9 @@ ZSTD_CCtx* ZSTD_initStaticCCtx(void *workspace, size_t workspaceSize)
|
|
174
160
|
cctx->workSpaceSize = workspaceSize - sizeof(ZSTD_CCtx);
|
175
161
|
|
176
162
|
/* entropy space (never moves) */
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
ptr = (char*)cctx->hufCTable + hufCTable_size;
|
181
|
-
cctx->offcodeCTable = (FSE_CTable*) ptr;
|
182
|
-
ptr = (char*)ptr + offcodeCTable_size;
|
183
|
-
cctx->matchlengthCTable = (FSE_CTable*) ptr;
|
184
|
-
ptr = (char*)ptr + matchlengthCTable_size;
|
185
|
-
cctx->litlengthCTable = (FSE_CTable*) ptr;
|
186
|
-
ptr = (char*)ptr + litlengthCTable_size;
|
187
|
-
assert(((size_t)ptr & 3) == 0); /* ensure correct alignment */
|
188
|
-
cctx->entropyScratchSpace = (unsigned*) ptr;
|
189
|
-
}
|
163
|
+
if (cctx->workSpaceSize < sizeof(ZSTD_entropyCTables_t)) return NULL;
|
164
|
+
assert(((size_t)cctx->workSpace & 7) == 0); /* ensure correct alignment */
|
165
|
+
cctx->entropy = (ZSTD_entropyCTables_t*)cctx->workSpace;
|
190
166
|
|
191
167
|
return cctx;
|
192
168
|
}
|
@@ -237,7 +213,7 @@ size_t ZSTD_setCCtxParameter(ZSTD_CCtx* cctx, ZSTD_CCtxParameter param, unsigned
|
|
237
213
|
ZSTD_STATIC_ASSERT(ZSTD_dm_auto==0);
|
238
214
|
ZSTD_STATIC_ASSERT(ZSTD_dm_rawContent==1);
|
239
215
|
case ZSTD_p_forceRawDict : cctx->dictMode = (ZSTD_dictMode_e)(value>0); return 0;
|
240
|
-
default: return ERROR(
|
216
|
+
default: return ERROR(parameter_unsupported);
|
241
217
|
}
|
242
218
|
}
|
243
219
|
|
@@ -251,9 +227,9 @@ static void ZSTD_cLevelToCParams(ZSTD_CCtx* cctx)
|
|
251
227
|
cctx->compressionLevel = ZSTD_CLEVEL_CUSTOM;
|
252
228
|
}
|
253
229
|
|
254
|
-
#define CLAMPCHECK(val,min,max) {
|
255
|
-
if (((val)<(min)) | ((val)>(max))) {
|
256
|
-
return ERROR(
|
230
|
+
#define CLAMPCHECK(val,min,max) { \
|
231
|
+
if (((val)<(min)) | ((val)>(max))) { \
|
232
|
+
return ERROR(parameter_outOfBound); \
|
257
233
|
} }
|
258
234
|
|
259
235
|
size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value)
|
@@ -349,7 +325,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v
|
|
349
325
|
/* restrict dictionary mode, to "rawContent" or "fullDict" only */
|
350
326
|
ZSTD_STATIC_ASSERT((U32)ZSTD_dm_fullDict > (U32)ZSTD_dm_rawContent);
|
351
327
|
if (value > (unsigned)ZSTD_dm_fullDict)
|
352
|
-
return ERROR(
|
328
|
+
return ERROR(parameter_outOfBound);
|
353
329
|
cctx->dictMode = (ZSTD_dictMode_e)value;
|
354
330
|
return 0;
|
355
331
|
|
@@ -370,31 +346,31 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v
|
|
370
346
|
if (value==0) return 0;
|
371
347
|
DEBUGLOG(5, " setting nbThreads : %u", value);
|
372
348
|
#ifndef ZSTD_MULTITHREAD
|
373
|
-
if (value > 1) return ERROR(
|
349
|
+
if (value > 1) return ERROR(parameter_unsupported);
|
374
350
|
#endif
|
375
351
|
if ((value>1) && (cctx->nbThreads != value)) {
|
376
352
|
if (cctx->staticSize) /* MT not compatible with static alloc */
|
377
|
-
return ERROR(
|
353
|
+
return ERROR(parameter_unsupported);
|
378
354
|
ZSTDMT_freeCCtx(cctx->mtctx);
|
379
355
|
cctx->nbThreads = 1;
|
380
|
-
cctx->mtctx =
|
356
|
+
cctx->mtctx = ZSTDMT_createCCtx_advanced(value, cctx->customMem);
|
381
357
|
if (cctx->mtctx == NULL) return ERROR(memory_allocation);
|
382
358
|
}
|
383
359
|
cctx->nbThreads = value;
|
384
360
|
return 0;
|
385
361
|
|
386
362
|
case ZSTD_p_jobSize:
|
387
|
-
if (cctx->nbThreads <= 1) return ERROR(
|
363
|
+
if (cctx->nbThreads <= 1) return ERROR(parameter_unsupported);
|
388
364
|
assert(cctx->mtctx != NULL);
|
389
365
|
return ZSTDMT_setMTCtxParameter(cctx->mtctx, ZSTDMT_p_sectionSize, value);
|
390
366
|
|
391
367
|
case ZSTD_p_overlapSizeLog:
|
392
368
|
DEBUGLOG(5, " setting overlap with nbThreads == %u", cctx->nbThreads);
|
393
|
-
if (cctx->nbThreads <= 1) return ERROR(
|
369
|
+
if (cctx->nbThreads <= 1) return ERROR(parameter_unsupported);
|
394
370
|
assert(cctx->mtctx != NULL);
|
395
371
|
return ZSTDMT_setMTCtxParameter(cctx->mtctx, ZSTDMT_p_overlapSectionLog, value);
|
396
372
|
|
397
|
-
default: return ERROR(
|
373
|
+
default: return ERROR(parameter_unsupported);
|
398
374
|
}
|
399
375
|
}
|
400
376
|
|
@@ -474,7 +450,8 @@ size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
|
|
474
450
|
CLAMPCHECK(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
|
475
451
|
CLAMPCHECK(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
|
476
452
|
CLAMPCHECK(cParams.targetLength, ZSTD_TARGETLENGTH_MIN, ZSTD_TARGETLENGTH_MAX);
|
477
|
-
if ((U32)(cParams.strategy) > (U32)ZSTD_btultra)
|
453
|
+
if ((U32)(cParams.strategy) > (U32)ZSTD_btultra)
|
454
|
+
return ERROR(parameter_unsupported);
|
478
455
|
return 0;
|
479
456
|
}
|
480
457
|
|
@@ -551,9 +528,7 @@ size_t ZSTD_estimateCCtxSize_advanced(ZSTD_compressionParameters cParams)
|
|
551
528
|
size_t const hSize = ((size_t)1) << cParams.hashLog;
|
552
529
|
U32 const hashLog3 = (cParams.searchLength>3) ? 0 : MIN(ZSTD_HASHLOG3_MAX, cParams.windowLog);
|
553
530
|
size_t const h3Size = ((size_t)1) << hashLog3;
|
554
|
-
size_t const entropySpace =
|
555
|
-
+ offcodeCTable_size + matchlengthCTable_size
|
556
|
-
+ entropyScratchSpace_size;
|
531
|
+
size_t const entropySpace = sizeof(ZSTD_entropyCTables_t);
|
557
532
|
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
|
558
533
|
|
559
534
|
size_t const optBudget = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits))*sizeof(U32)
|
@@ -620,8 +595,8 @@ static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_parameters params, U64 ple
|
|
620
595
|
cctx->stage = ZSTDcs_init;
|
621
596
|
cctx->dictID = 0;
|
622
597
|
cctx->loadedDictEnd = 0;
|
623
|
-
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) cctx->rep[i] = repStartValue[i]; }
|
624
|
-
cctx->
|
598
|
+
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) cctx->seqStore.rep[i] = repStartValue[i]; }
|
599
|
+
cctx->optState.litLengthSum = 0; /* force reset of btopt stats */
|
625
600
|
XXH64_reset(&cctx->xxhState, 0);
|
626
601
|
return 0;
|
627
602
|
}
|
@@ -641,8 +616,10 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
641
616
|
if (crp == ZSTDcrp_continue) {
|
642
617
|
if (ZSTD_equivalentParams(params.cParams, zc->appliedParams.cParams)) {
|
643
618
|
DEBUGLOG(5, "ZSTD_equivalentParams()==1");
|
644
|
-
zc->
|
645
|
-
zc->
|
619
|
+
zc->entropy->hufCTable_repeatMode = HUF_repeat_none;
|
620
|
+
zc->entropy->offcode_repeatMode = FSE_repeat_none;
|
621
|
+
zc->entropy->matchlength_repeatMode = FSE_repeat_none;
|
622
|
+
zc->entropy->litlength_repeatMode = FSE_repeat_none;
|
646
623
|
return ZSTD_continueCCtx(zc, params, pledgedSrcSize);
|
647
624
|
} }
|
648
625
|
|
@@ -662,9 +639,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
662
639
|
void* ptr;
|
663
640
|
|
664
641
|
/* Check if workSpace is large enough, alloc a new one if needed */
|
665
|
-
{ size_t const entropySpace =
|
666
|
-
+ offcodeCTable_size + matchlengthCTable_size
|
667
|
-
+ entropyScratchSpace_size;
|
642
|
+
{ size_t const entropySpace = sizeof(ZSTD_entropyCTables_t);
|
668
643
|
size_t const optPotentialSpace = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits)) * sizeof(U32)
|
669
644
|
+ (ZSTD_OPT_NUM+1) * (sizeof(ZSTD_match_t)+sizeof(ZSTD_optimal_t));
|
670
645
|
size_t const optSpace = ( (params.cParams.strategy == ZSTD_btopt)
|
@@ -689,16 +664,9 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
689
664
|
ptr = zc->workSpace;
|
690
665
|
|
691
666
|
/* entropy space */
|
692
|
-
zc->
|
693
|
-
|
694
|
-
zc->
|
695
|
-
ptr = (char*)ptr + offcodeCTable_size;
|
696
|
-
zc->matchlengthCTable = (FSE_CTable*) ptr;
|
697
|
-
ptr = (char*)ptr + matchlengthCTable_size;
|
698
|
-
zc->litlengthCTable = (FSE_CTable*) ptr;
|
699
|
-
ptr = (char*)ptr + litlengthCTable_size;
|
700
|
-
assert(((size_t)ptr & 3) == 0); /* ensure correct alignment */
|
701
|
-
zc->entropyScratchSpace = (unsigned*) ptr;
|
667
|
+
assert(((size_t)zc->workSpace & 3) == 0); /* ensure correct alignment */
|
668
|
+
assert(zc->workSpaceSize >= sizeof(ZSTD_entropyCTables_t));
|
669
|
+
zc->entropy = (ZSTD_entropyCTables_t*)zc->workSpace;
|
702
670
|
} }
|
703
671
|
|
704
672
|
/* init params */
|
@@ -715,39 +683,35 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
715
683
|
zc->stage = ZSTDcs_init;
|
716
684
|
zc->dictID = 0;
|
717
685
|
zc->loadedDictEnd = 0;
|
718
|
-
zc->
|
719
|
-
zc->
|
686
|
+
zc->entropy->hufCTable_repeatMode = HUF_repeat_none;
|
687
|
+
zc->entropy->offcode_repeatMode = FSE_repeat_none;
|
688
|
+
zc->entropy->matchlength_repeatMode = FSE_repeat_none;
|
689
|
+
zc->entropy->litlength_repeatMode = FSE_repeat_none;
|
720
690
|
zc->nextToUpdate = 1;
|
721
691
|
zc->nextSrc = NULL;
|
722
692
|
zc->base = NULL;
|
723
693
|
zc->dictBase = NULL;
|
724
694
|
zc->dictLimit = 0;
|
725
695
|
zc->lowLimit = 0;
|
726
|
-
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) zc->rep[i] = repStartValue[i]; }
|
696
|
+
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) zc->seqStore.rep[i] = repStartValue[i]; }
|
727
697
|
zc->hashLog3 = hashLog3;
|
728
|
-
zc->
|
698
|
+
zc->optState.litLengthSum = 0;
|
729
699
|
|
730
|
-
|
731
|
-
assert((void*)zc->hufCTable == zc->workSpace);
|
732
|
-
assert((char*)zc->offcodeCTable == (char*)zc->hufCTable + hufCTable_size);
|
733
|
-
assert((char*)zc->matchlengthCTable == (char*)zc->offcodeCTable + offcodeCTable_size);
|
734
|
-
assert((char*)zc->litlengthCTable == (char*)zc->matchlengthCTable + matchlengthCTable_size);
|
735
|
-
assert((char*)zc->entropyScratchSpace == (char*)zc->litlengthCTable + litlengthCTable_size);
|
736
|
-
ptr = (char*)zc->entropyScratchSpace + entropyScratchSpace_size;
|
700
|
+
ptr = zc->entropy + 1;
|
737
701
|
|
738
702
|
/* opt parser space */
|
739
703
|
if ((params.cParams.strategy == ZSTD_btopt) || (params.cParams.strategy == ZSTD_btultra)) {
|
740
704
|
DEBUGLOG(5, "reserving optimal parser space");
|
741
705
|
assert(((size_t)ptr & 3) == 0); /* ensure ptr is properly aligned */
|
742
|
-
zc->
|
743
|
-
zc->
|
744
|
-
zc->
|
745
|
-
zc->
|
746
|
-
ptr = zc->
|
747
|
-
zc->
|
748
|
-
ptr = zc->
|
749
|
-
zc->
|
750
|
-
ptr = zc->
|
706
|
+
zc->optState.litFreq = (U32*)ptr;
|
707
|
+
zc->optState.litLengthFreq = zc->optState.litFreq + (1<<Litbits);
|
708
|
+
zc->optState.matchLengthFreq = zc->optState.litLengthFreq + (MaxLL+1);
|
709
|
+
zc->optState.offCodeFreq = zc->optState.matchLengthFreq + (MaxML+1);
|
710
|
+
ptr = zc->optState.offCodeFreq + (MaxOff+1);
|
711
|
+
zc->optState.matchTable = (ZSTD_match_t*)ptr;
|
712
|
+
ptr = zc->optState.matchTable + ZSTD_OPT_NUM+1;
|
713
|
+
zc->optState.priceTable = (ZSTD_optimal_t*)ptr;
|
714
|
+
ptr = zc->optState.priceTable + ZSTD_OPT_NUM+1;
|
751
715
|
}
|
752
716
|
|
753
717
|
/* table Space */
|
@@ -783,7 +747,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|
783
747
|
* do not use with extDict variant ! */
|
784
748
|
void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx) {
|
785
749
|
int i;
|
786
|
-
for (i=0; i<ZSTD_REP_NUM; i++) cctx->rep[i] = 0;
|
750
|
+
for (i=0; i<ZSTD_REP_NUM; i++) cctx->seqStore.rep[i] = 0;
|
787
751
|
}
|
788
752
|
|
789
753
|
|
@@ -830,16 +794,7 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx,
|
|
830
794
|
dstCCtx->dictID = srcCCtx->dictID;
|
831
795
|
|
832
796
|
/* copy entropy tables */
|
833
|
-
dstCCtx->
|
834
|
-
if (srcCCtx->fseCTables_ready) {
|
835
|
-
memcpy(dstCCtx->litlengthCTable, srcCCtx->litlengthCTable, litlengthCTable_size);
|
836
|
-
memcpy(dstCCtx->matchlengthCTable, srcCCtx->matchlengthCTable, matchlengthCTable_size);
|
837
|
-
memcpy(dstCCtx->offcodeCTable, srcCCtx->offcodeCTable, offcodeCTable_size);
|
838
|
-
}
|
839
|
-
dstCCtx->hufCTable_repeatMode = srcCCtx->hufCTable_repeatMode;
|
840
|
-
if (srcCCtx->hufCTable_repeatMode) {
|
841
|
-
memcpy(dstCCtx->hufCTable, srcCCtx->hufCTable, hufCTable_size);
|
842
|
-
}
|
797
|
+
memcpy(dstCCtx->entropy, srcCCtx->entropy, sizeof(ZSTD_entropyCTables_t));
|
843
798
|
|
844
799
|
return 0;
|
845
800
|
}
|
@@ -956,7 +911,8 @@ static size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, cons
|
|
956
911
|
|
957
912
|
static size_t ZSTD_minGain(size_t srcSize) { return (srcSize >> 6) + 2; }
|
958
913
|
|
959
|
-
static size_t ZSTD_compressLiterals (
|
914
|
+
static size_t ZSTD_compressLiterals (ZSTD_entropyCTables_t * entropy,
|
915
|
+
ZSTD_strategy strategy,
|
960
916
|
void* dst, size_t dstCapacity,
|
961
917
|
const void* src, size_t srcSize)
|
962
918
|
{
|
@@ -970,28 +926,28 @@ static size_t ZSTD_compressLiterals (ZSTD_CCtx* zc,
|
|
970
926
|
|
971
927
|
/* small ? don't even attempt compression (speed opt) */
|
972
928
|
# define LITERAL_NOENTROPY 63
|
973
|
-
{ size_t const minLitSize =
|
929
|
+
{ size_t const minLitSize = entropy->hufCTable_repeatMode == HUF_repeat_valid ? 6 : LITERAL_NOENTROPY;
|
974
930
|
if (srcSize <= minLitSize) return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
|
975
931
|
}
|
976
932
|
|
977
933
|
if (dstCapacity < lhSize+1) return ERROR(dstSize_tooSmall); /* not enough space for compression */
|
978
|
-
{ HUF_repeat repeat =
|
979
|
-
int const preferRepeat =
|
934
|
+
{ HUF_repeat repeat = entropy->hufCTable_repeatMode;
|
935
|
+
int const preferRepeat = strategy < ZSTD_lazy ? srcSize <= 1024 : 0;
|
980
936
|
if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1;
|
981
937
|
cLitSize = singleStream ? HUF_compress1X_repeat(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11,
|
982
|
-
|
938
|
+
entropy->workspace, sizeof(entropy->workspace), (HUF_CElt*)entropy->hufCTable, &repeat, preferRepeat)
|
983
939
|
: HUF_compress4X_repeat(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11,
|
984
|
-
|
940
|
+
entropy->workspace, sizeof(entropy->workspace), (HUF_CElt*)entropy->hufCTable, &repeat, preferRepeat);
|
985
941
|
if (repeat != HUF_repeat_none) { hType = set_repeat; } /* reused the existing table */
|
986
|
-
else {
|
942
|
+
else { entropy->hufCTable_repeatMode = HUF_repeat_check; } /* now have a table to reuse */
|
987
943
|
}
|
988
944
|
|
989
|
-
if ((cLitSize==0) | (cLitSize >= srcSize - minGain)) {
|
990
|
-
|
945
|
+
if ((cLitSize==0) | (cLitSize >= srcSize - minGain) | ERR_isError(cLitSize)) {
|
946
|
+
entropy->hufCTable_repeatMode = HUF_repeat_none;
|
991
947
|
return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
|
992
948
|
}
|
993
949
|
if (cLitSize==1) {
|
994
|
-
|
950
|
+
entropy->hufCTable_repeatMode = HUF_repeat_none;
|
995
951
|
return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize);
|
996
952
|
}
|
997
953
|
|
@@ -1062,17 +1018,154 @@ void ZSTD_seqToCodes(const seqStore_t* seqStorePtr)
|
|
1062
1018
|
mlCodeTable[seqStorePtr->longLengthPos] = MaxML;
|
1063
1019
|
}
|
1064
1020
|
|
1065
|
-
MEM_STATIC
|
1066
|
-
|
1067
|
-
|
1021
|
+
MEM_STATIC symbolEncodingType_e ZSTD_selectEncodingType(FSE_repeat* repeatMode,
|
1022
|
+
size_t const mostFrequent, size_t nbSeq, U32 defaultNormLog)
|
1023
|
+
{
|
1024
|
+
#define MIN_SEQ_FOR_DYNAMIC_FSE 64
|
1025
|
+
#define MAX_SEQ_FOR_STATIC_FSE 1000
|
1026
|
+
|
1027
|
+
if ((mostFrequent == nbSeq) && (nbSeq > 2)) {
|
1028
|
+
*repeatMode = FSE_repeat_check;
|
1029
|
+
return set_rle;
|
1030
|
+
}
|
1031
|
+
if ((*repeatMode == FSE_repeat_valid) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
|
1032
|
+
return set_repeat;
|
1033
|
+
}
|
1034
|
+
if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (defaultNormLog-1)))) {
|
1035
|
+
*repeatMode = FSE_repeat_valid;
|
1036
|
+
return set_basic;
|
1037
|
+
}
|
1038
|
+
*repeatMode = FSE_repeat_check;
|
1039
|
+
return set_compressed;
|
1040
|
+
}
|
1041
|
+
|
1042
|
+
MEM_STATIC size_t ZSTD_buildCTable(void* dst, size_t dstCapacity,
|
1043
|
+
FSE_CTable* CTable, U32 FSELog, symbolEncodingType_e type,
|
1044
|
+
U32* count, U32 max,
|
1045
|
+
BYTE const* codeTable, size_t nbSeq,
|
1046
|
+
S16 const* defaultNorm, U32 defaultNormLog, U32 defaultMax,
|
1047
|
+
void* workspace, size_t workspaceSize)
|
1048
|
+
{
|
1049
|
+
BYTE* op = (BYTE*)dst;
|
1050
|
+
BYTE const* const oend = op + dstCapacity;
|
1051
|
+
|
1052
|
+
switch (type) {
|
1053
|
+
case set_rle:
|
1054
|
+
*op = codeTable[0];
|
1055
|
+
CHECK_F(FSE_buildCTable_rle(CTable, (BYTE)max));
|
1056
|
+
return 1;
|
1057
|
+
case set_repeat:
|
1058
|
+
return 0;
|
1059
|
+
case set_basic:
|
1060
|
+
CHECK_F(FSE_buildCTable_wksp(CTable, defaultNorm, defaultMax, defaultNormLog, workspace, workspaceSize));
|
1061
|
+
return 0;
|
1062
|
+
case set_compressed: {
|
1063
|
+
S16 norm[MaxSeq + 1];
|
1064
|
+
size_t nbSeq_1 = nbSeq;
|
1065
|
+
const U32 tableLog = FSE_optimalTableLog(FSELog, nbSeq, max);
|
1066
|
+
if (count[codeTable[nbSeq-1]] > 1) {
|
1067
|
+
count[codeTable[nbSeq-1]]--;
|
1068
|
+
nbSeq_1--;
|
1069
|
+
}
|
1070
|
+
CHECK_F(FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max));
|
1071
|
+
{ size_t const NCountSize = FSE_writeNCount(op, oend - op, norm, max, tableLog); /* overflow protected */
|
1072
|
+
if (FSE_isError(NCountSize)) return NCountSize;
|
1073
|
+
CHECK_F(FSE_buildCTable_wksp(CTable, norm, max, tableLog, workspace, workspaceSize));
|
1074
|
+
return NCountSize;
|
1075
|
+
}
|
1076
|
+
}
|
1077
|
+
default: return assert(0), ERROR(GENERIC);
|
1078
|
+
}
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
MEM_STATIC size_t ZSTD_encodeSequences(void* dst, size_t dstCapacity,
|
1082
|
+
FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable,
|
1083
|
+
FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable,
|
1084
|
+
FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
|
1085
|
+
seqDef const* sequences, size_t nbSeq, int longOffsets)
|
1086
|
+
{
|
1087
|
+
BIT_CStream_t blockStream;
|
1088
|
+
FSE_CState_t stateMatchLength;
|
1089
|
+
FSE_CState_t stateOffsetBits;
|
1090
|
+
FSE_CState_t stateLitLength;
|
1091
|
+
|
1092
|
+
CHECK_E(BIT_initCStream(&blockStream, dst, dstCapacity), dstSize_tooSmall); /* not enough space remaining */
|
1093
|
+
|
1094
|
+
/* first symbols */
|
1095
|
+
FSE_initCState2(&stateMatchLength, CTable_MatchLength, mlCodeTable[nbSeq-1]);
|
1096
|
+
FSE_initCState2(&stateOffsetBits, CTable_OffsetBits, ofCodeTable[nbSeq-1]);
|
1097
|
+
FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]);
|
1098
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].litLength, LL_bits[llCodeTable[nbSeq-1]]);
|
1099
|
+
if (MEM_32bits()) BIT_flushBits(&blockStream);
|
1100
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].matchLength, ML_bits[mlCodeTable[nbSeq-1]]);
|
1101
|
+
if (MEM_32bits()) BIT_flushBits(&blockStream);
|
1102
|
+
if (longOffsets) {
|
1103
|
+
U32 const ofBits = ofCodeTable[nbSeq-1];
|
1104
|
+
int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1);
|
1105
|
+
if (extraBits) {
|
1106
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].offset, extraBits);
|
1107
|
+
BIT_flushBits(&blockStream);
|
1108
|
+
}
|
1109
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].offset >> extraBits,
|
1110
|
+
ofBits - extraBits);
|
1111
|
+
} else {
|
1112
|
+
BIT_addBits(&blockStream, sequences[nbSeq-1].offset, ofCodeTable[nbSeq-1]);
|
1113
|
+
}
|
1114
|
+
BIT_flushBits(&blockStream);
|
1115
|
+
|
1116
|
+
{ size_t n;
|
1117
|
+
for (n=nbSeq-2 ; n<nbSeq ; n--) { /* intentional underflow */
|
1118
|
+
BYTE const llCode = llCodeTable[n];
|
1119
|
+
BYTE const ofCode = ofCodeTable[n];
|
1120
|
+
BYTE const mlCode = mlCodeTable[n];
|
1121
|
+
U32 const llBits = LL_bits[llCode];
|
1122
|
+
U32 const ofBits = ofCode; /* 32b*/ /* 64b*/
|
1123
|
+
U32 const mlBits = ML_bits[mlCode];
|
1124
|
+
/* (7)*/ /* (7)*/
|
1125
|
+
FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */
|
1126
|
+
FSE_encodeSymbol(&blockStream, &stateMatchLength, mlCode); /* 24 */ /* 24 */
|
1127
|
+
if (MEM_32bits()) BIT_flushBits(&blockStream); /* (7)*/
|
1128
|
+
FSE_encodeSymbol(&blockStream, &stateLitLength, llCode); /* 16 */ /* 33 */
|
1129
|
+
if (MEM_32bits() || (ofBits+mlBits+llBits >= 64-7-(LLFSELog+MLFSELog+OffFSELog)))
|
1130
|
+
BIT_flushBits(&blockStream); /* (7)*/
|
1131
|
+
BIT_addBits(&blockStream, sequences[n].litLength, llBits);
|
1132
|
+
if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream);
|
1133
|
+
BIT_addBits(&blockStream, sequences[n].matchLength, mlBits);
|
1134
|
+
if (MEM_32bits()) BIT_flushBits(&blockStream); /* (7)*/
|
1135
|
+
if (longOffsets) {
|
1136
|
+
int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1);
|
1137
|
+
if (extraBits) {
|
1138
|
+
BIT_addBits(&blockStream, sequences[n].offset, extraBits);
|
1139
|
+
BIT_flushBits(&blockStream); /* (7)*/
|
1140
|
+
}
|
1141
|
+
BIT_addBits(&blockStream, sequences[n].offset >> extraBits,
|
1142
|
+
ofBits - extraBits); /* 31 */
|
1143
|
+
} else {
|
1144
|
+
BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */
|
1145
|
+
}
|
1146
|
+
BIT_flushBits(&blockStream); /* (7)*/
|
1147
|
+
} }
|
1148
|
+
|
1149
|
+
FSE_flushCState(&blockStream, &stateMatchLength);
|
1150
|
+
FSE_flushCState(&blockStream, &stateOffsetBits);
|
1151
|
+
FSE_flushCState(&blockStream, &stateLitLength);
|
1152
|
+
|
1153
|
+
{ size_t const streamSize = BIT_closeCStream(&blockStream);
|
1154
|
+
if (streamSize==0) return ERROR(dstSize_tooSmall); /* not enough space */
|
1155
|
+
return streamSize;
|
1156
|
+
}
|
1157
|
+
}
|
1158
|
+
|
1159
|
+
MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
1160
|
+
ZSTD_entropyCTables_t* entropy,
|
1161
|
+
ZSTD_compressionParameters const* cParams,
|
1162
|
+
void* dst, size_t dstCapacity)
|
1068
1163
|
{
|
1069
|
-
const int longOffsets =
|
1070
|
-
const seqStore_t* seqStorePtr = &(zc->seqStore);
|
1164
|
+
const int longOffsets = cParams->windowLog > STREAM_ACCUMULATOR_MIN;
|
1071
1165
|
U32 count[MaxSeq+1];
|
1072
|
-
|
1073
|
-
FSE_CTable*
|
1074
|
-
FSE_CTable*
|
1075
|
-
FSE_CTable* CTable_MatchLength = zc->matchlengthCTable;
|
1166
|
+
FSE_CTable* CTable_LitLength = entropy->litlengthCTable;
|
1167
|
+
FSE_CTable* CTable_OffsetBits = entropy->offcodeCTable;
|
1168
|
+
FSE_CTable* CTable_MatchLength = entropy->matchlengthCTable;
|
1076
1169
|
U32 LLtype, Offtype, MLtype; /* compressed, raw or rle */
|
1077
1170
|
const seqDef* const sequences = seqStorePtr->sequencesStart;
|
1078
1171
|
const BYTE* const ofCodeTable = seqStorePtr->ofCode;
|
@@ -1083,13 +1176,16 @@ MEM_STATIC size_t ZSTD_compressSequences (ZSTD_CCtx* zc,
|
|
1083
1176
|
BYTE* op = ostart;
|
1084
1177
|
size_t const nbSeq = seqStorePtr->sequences - seqStorePtr->sequencesStart;
|
1085
1178
|
BYTE* seqHead;
|
1086
|
-
|
1179
|
+
|
1180
|
+
ZSTD_STATIC_ASSERT(sizeof(entropy->workspace) >= (1<<MAX(MLFSELog,LLFSELog)));
|
1087
1181
|
|
1088
1182
|
/* Compress literals */
|
1089
1183
|
{ const BYTE* const literals = seqStorePtr->litStart;
|
1090
1184
|
size_t const litSize = seqStorePtr->lit - literals;
|
1091
|
-
size_t const cSize = ZSTD_compressLiterals(
|
1092
|
-
|
1185
|
+
size_t const cSize = ZSTD_compressLiterals(
|
1186
|
+
entropy, cParams->strategy, op, dstCapacity, literals, litSize);
|
1187
|
+
if (ZSTD_isError(cSize))
|
1188
|
+
return cSize;
|
1093
1189
|
op += cSize;
|
1094
1190
|
}
|
1095
1191
|
|
@@ -1098,177 +1194,89 @@ MEM_STATIC size_t ZSTD_compressSequences (ZSTD_CCtx* zc,
|
|
1098
1194
|
if (nbSeq < 0x7F) *op++ = (BYTE)nbSeq;
|
1099
1195
|
else if (nbSeq < LONGNBSEQ) op[0] = (BYTE)((nbSeq>>8) + 0x80), op[1] = (BYTE)nbSeq, op+=2;
|
1100
1196
|
else op[0]=0xFF, MEM_writeLE16(op+1, (U16)(nbSeq - LONGNBSEQ)), op+=3;
|
1101
|
-
if (nbSeq==0)
|
1197
|
+
if (nbSeq==0) return op - ostart;
|
1102
1198
|
|
1103
1199
|
/* seqHead : flags for FSE encoding type */
|
1104
1200
|
seqHead = op++;
|
1105
1201
|
|
1106
|
-
#define MIN_SEQ_FOR_DYNAMIC_FSE 64
|
1107
|
-
#define MAX_SEQ_FOR_STATIC_FSE 1000
|
1108
|
-
|
1109
1202
|
/* convert length/distances into codes */
|
1110
1203
|
ZSTD_seqToCodes(seqStorePtr);
|
1111
|
-
|
1112
1204
|
/* CTable for Literal Lengths */
|
1113
1205
|
{ U32 max = MaxLL;
|
1114
|
-
size_t const mostFrequent = FSE_countFast_wksp(count, &max, llCodeTable, nbSeq,
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (LL_defaultNormLog-1)))) {
|
1122
|
-
FSE_buildCTable_wksp(CTable_LitLength, LL_defaultNorm, MaxLL, LL_defaultNormLog, scratchBuffer, sizeof(scratchBuffer));
|
1123
|
-
LLtype = set_basic;
|
1124
|
-
} else {
|
1125
|
-
size_t nbSeq_1 = nbSeq;
|
1126
|
-
const U32 tableLog = FSE_optimalTableLog(LLFSELog, nbSeq, max);
|
1127
|
-
if (count[llCodeTable[nbSeq-1]]>1) { count[llCodeTable[nbSeq-1]]--; nbSeq_1--; }
|
1128
|
-
FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max);
|
1129
|
-
{ size_t const NCountSize = FSE_writeNCount(op, oend-op, norm, max, tableLog); /* overflow protected */
|
1130
|
-
if (FSE_isError(NCountSize)) return NCountSize;
|
1131
|
-
op += NCountSize; }
|
1132
|
-
FSE_buildCTable_wksp(CTable_LitLength, norm, max, tableLog, scratchBuffer, sizeof(scratchBuffer));
|
1133
|
-
LLtype = set_compressed;
|
1206
|
+
size_t const mostFrequent = FSE_countFast_wksp(count, &max, llCodeTable, nbSeq, entropy->workspace);
|
1207
|
+
LLtype = ZSTD_selectEncodingType(&entropy->litlength_repeatMode, mostFrequent, nbSeq, LL_defaultNormLog);
|
1208
|
+
{ size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_LitLength, LLFSELog, (symbolEncodingType_e)LLtype,
|
1209
|
+
count, max, llCodeTable, nbSeq, LL_defaultNorm, LL_defaultNormLog, MaxLL,
|
1210
|
+
entropy->workspace, sizeof(entropy->workspace));
|
1211
|
+
if (ZSTD_isError(countSize)) return countSize;
|
1212
|
+
op += countSize;
|
1134
1213
|
} }
|
1135
|
-
|
1136
1214
|
/* CTable for Offsets */
|
1137
1215
|
{ U32 max = MaxOff;
|
1138
|
-
size_t const mostFrequent = FSE_countFast_wksp(count, &max, ofCodeTable, nbSeq,
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (OF_defaultNormLog-1)))) {
|
1146
|
-
FSE_buildCTable_wksp(CTable_OffsetBits, OF_defaultNorm, MaxOff, OF_defaultNormLog, scratchBuffer, sizeof(scratchBuffer));
|
1147
|
-
Offtype = set_basic;
|
1148
|
-
} else {
|
1149
|
-
size_t nbSeq_1 = nbSeq;
|
1150
|
-
const U32 tableLog = FSE_optimalTableLog(OffFSELog, nbSeq, max);
|
1151
|
-
if (count[ofCodeTable[nbSeq-1]]>1) { count[ofCodeTable[nbSeq-1]]--; nbSeq_1--; }
|
1152
|
-
FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max);
|
1153
|
-
{ size_t const NCountSize = FSE_writeNCount(op, oend-op, norm, max, tableLog); /* overflow protected */
|
1154
|
-
if (FSE_isError(NCountSize)) return NCountSize;
|
1155
|
-
op += NCountSize; }
|
1156
|
-
FSE_buildCTable_wksp(CTable_OffsetBits, norm, max, tableLog, scratchBuffer, sizeof(scratchBuffer));
|
1157
|
-
Offtype = set_compressed;
|
1216
|
+
size_t const mostFrequent = FSE_countFast_wksp(count, &max, ofCodeTable, nbSeq, entropy->workspace);
|
1217
|
+
Offtype = ZSTD_selectEncodingType(&entropy->offcode_repeatMode, mostFrequent, nbSeq, OF_defaultNormLog);
|
1218
|
+
{ size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_OffsetBits, OffFSELog, (symbolEncodingType_e)Offtype,
|
1219
|
+
count, max, ofCodeTable, nbSeq, OF_defaultNorm, OF_defaultNormLog, MaxOff,
|
1220
|
+
entropy->workspace, sizeof(entropy->workspace));
|
1221
|
+
if (ZSTD_isError(countSize)) return countSize;
|
1222
|
+
op += countSize;
|
1158
1223
|
} }
|
1159
|
-
|
1160
1224
|
/* CTable for MatchLengths */
|
1161
1225
|
{ U32 max = MaxML;
|
1162
|
-
size_t const mostFrequent = FSE_countFast_wksp(count, &max, mlCodeTable, nbSeq,
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
} else if ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (ML_defaultNormLog-1)))) {
|
1170
|
-
FSE_buildCTable_wksp(CTable_MatchLength, ML_defaultNorm, MaxML, ML_defaultNormLog, scratchBuffer, sizeof(scratchBuffer));
|
1171
|
-
MLtype = set_basic;
|
1172
|
-
} else {
|
1173
|
-
size_t nbSeq_1 = nbSeq;
|
1174
|
-
const U32 tableLog = FSE_optimalTableLog(MLFSELog, nbSeq, max);
|
1175
|
-
if (count[mlCodeTable[nbSeq-1]]>1) { count[mlCodeTable[nbSeq-1]]--; nbSeq_1--; }
|
1176
|
-
FSE_normalizeCount(norm, tableLog, count, nbSeq_1, max);
|
1177
|
-
{ size_t const NCountSize = FSE_writeNCount(op, oend-op, norm, max, tableLog); /* overflow protected */
|
1178
|
-
if (FSE_isError(NCountSize)) return NCountSize;
|
1179
|
-
op += NCountSize; }
|
1180
|
-
FSE_buildCTable_wksp(CTable_MatchLength, norm, max, tableLog, scratchBuffer, sizeof(scratchBuffer));
|
1181
|
-
MLtype = set_compressed;
|
1226
|
+
size_t const mostFrequent = FSE_countFast_wksp(count, &max, mlCodeTable, nbSeq, entropy->workspace);
|
1227
|
+
MLtype = ZSTD_selectEncodingType(&entropy->matchlength_repeatMode, mostFrequent, nbSeq, ML_defaultNormLog);
|
1228
|
+
{ size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_MatchLength, MLFSELog, (symbolEncodingType_e)MLtype,
|
1229
|
+
count, max, mlCodeTable, nbSeq, ML_defaultNorm, ML_defaultNormLog, MaxML,
|
1230
|
+
entropy->workspace, sizeof(entropy->workspace));
|
1231
|
+
if (ZSTD_isError(countSize)) return countSize;
|
1232
|
+
op += countSize;
|
1182
1233
|
} }
|
1183
1234
|
|
1184
1235
|
*seqHead = (BYTE)((LLtype<<6) + (Offtype<<4) + (MLtype<<2));
|
1185
|
-
zc->fseCTables_ready = 0;
|
1186
|
-
|
1187
|
-
/* Encoding Sequences */
|
1188
|
-
{ BIT_CStream_t blockStream;
|
1189
|
-
FSE_CState_t stateMatchLength;
|
1190
|
-
FSE_CState_t stateOffsetBits;
|
1191
|
-
FSE_CState_t stateLitLength;
|
1192
|
-
|
1193
|
-
CHECK_E(BIT_initCStream(&blockStream, op, oend-op), dstSize_tooSmall); /* not enough space remaining */
|
1194
|
-
|
1195
|
-
/* first symbols */
|
1196
|
-
FSE_initCState2(&stateMatchLength, CTable_MatchLength, mlCodeTable[nbSeq-1]);
|
1197
|
-
FSE_initCState2(&stateOffsetBits, CTable_OffsetBits, ofCodeTable[nbSeq-1]);
|
1198
|
-
FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]);
|
1199
|
-
BIT_addBits(&blockStream, sequences[nbSeq-1].litLength, LL_bits[llCodeTable[nbSeq-1]]);
|
1200
|
-
if (MEM_32bits()) BIT_flushBits(&blockStream);
|
1201
|
-
BIT_addBits(&blockStream, sequences[nbSeq-1].matchLength, ML_bits[mlCodeTable[nbSeq-1]]);
|
1202
|
-
if (MEM_32bits()) BIT_flushBits(&blockStream);
|
1203
|
-
if (longOffsets) {
|
1204
|
-
U32 const ofBits = ofCodeTable[nbSeq-1];
|
1205
|
-
int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1);
|
1206
|
-
if (extraBits) {
|
1207
|
-
BIT_addBits(&blockStream, sequences[nbSeq-1].offset, extraBits);
|
1208
|
-
BIT_flushBits(&blockStream);
|
1209
|
-
}
|
1210
|
-
BIT_addBits(&blockStream, sequences[nbSeq-1].offset >> extraBits,
|
1211
|
-
ofBits - extraBits);
|
1212
|
-
} else {
|
1213
|
-
BIT_addBits(&blockStream, sequences[nbSeq-1].offset, ofCodeTable[nbSeq-1]);
|
1214
|
-
}
|
1215
|
-
BIT_flushBits(&blockStream);
|
1216
|
-
|
1217
|
-
{ size_t n;
|
1218
|
-
for (n=nbSeq-2 ; n<nbSeq ; n--) { /* intentional underflow */
|
1219
|
-
BYTE const llCode = llCodeTable[n];
|
1220
|
-
BYTE const ofCode = ofCodeTable[n];
|
1221
|
-
BYTE const mlCode = mlCodeTable[n];
|
1222
|
-
U32 const llBits = LL_bits[llCode];
|
1223
|
-
U32 const ofBits = ofCode; /* 32b*/ /* 64b*/
|
1224
|
-
U32 const mlBits = ML_bits[mlCode];
|
1225
|
-
/* (7)*/ /* (7)*/
|
1226
|
-
FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */
|
1227
|
-
FSE_encodeSymbol(&blockStream, &stateMatchLength, mlCode); /* 24 */ /* 24 */
|
1228
|
-
if (MEM_32bits()) BIT_flushBits(&blockStream); /* (7)*/
|
1229
|
-
FSE_encodeSymbol(&blockStream, &stateLitLength, llCode); /* 16 */ /* 33 */
|
1230
|
-
if (MEM_32bits() || (ofBits+mlBits+llBits >= 64-7-(LLFSELog+MLFSELog+OffFSELog)))
|
1231
|
-
BIT_flushBits(&blockStream); /* (7)*/
|
1232
|
-
BIT_addBits(&blockStream, sequences[n].litLength, llBits);
|
1233
|
-
if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream);
|
1234
|
-
BIT_addBits(&blockStream, sequences[n].matchLength, mlBits);
|
1235
|
-
if (MEM_32bits()) BIT_flushBits(&blockStream); /* (7)*/
|
1236
|
-
if (longOffsets) {
|
1237
|
-
int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1);
|
1238
|
-
if (extraBits) {
|
1239
|
-
BIT_addBits(&blockStream, sequences[n].offset, extraBits);
|
1240
|
-
BIT_flushBits(&blockStream); /* (7)*/
|
1241
|
-
}
|
1242
|
-
BIT_addBits(&blockStream, sequences[n].offset >> extraBits,
|
1243
|
-
ofBits - extraBits); /* 31 */
|
1244
|
-
} else {
|
1245
|
-
BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */
|
1246
|
-
}
|
1247
|
-
BIT_flushBits(&blockStream); /* (7)*/
|
1248
|
-
} }
|
1249
1236
|
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1237
|
+
{ size_t const streamSize = ZSTD_encodeSequences(op, oend - op,
|
1238
|
+
CTable_MatchLength, mlCodeTable,
|
1239
|
+
CTable_OffsetBits, ofCodeTable,
|
1240
|
+
CTable_LitLength, llCodeTable,
|
1241
|
+
sequences, nbSeq, longOffsets);
|
1242
|
+
if (ZSTD_isError(streamSize)) return streamSize;
|
1243
|
+
op += streamSize;
|
1244
|
+
}
|
1253
1245
|
|
1254
|
-
|
1255
|
-
|
1256
|
-
op += streamSize;
|
1257
|
-
} }
|
1246
|
+
return op - ostart;
|
1247
|
+
}
|
1258
1248
|
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1249
|
+
MEM_STATIC size_t ZSTD_compressSequences(seqStore_t* seqStorePtr,
|
1250
|
+
ZSTD_entropyCTables_t* entropy,
|
1251
|
+
ZSTD_compressionParameters const* cParams,
|
1252
|
+
void* dst, size_t dstCapacity,
|
1253
|
+
size_t srcSize)
|
1254
|
+
{
|
1255
|
+
size_t const cSize = ZSTD_compressSequences_internal(seqStorePtr, entropy, cParams,
|
1256
|
+
dst, dstCapacity);
|
1257
|
+
size_t const minGain = ZSTD_minGain(srcSize);
|
1258
|
+
size_t const maxCSize = srcSize - minGain;
|
1259
|
+
/* If the srcSize <= dstCapacity, then there is enough space to write a
|
1260
|
+
* raw uncompressed block. Since we ran out of space, the block must not
|
1261
|
+
* be compressible, so fall back to a raw uncompressed block.
|
1262
|
+
*/
|
1263
|
+
int const uncompressibleError = cSize == ERROR(dstSize_tooSmall) && srcSize <= dstCapacity;
|
1264
|
+
|
1265
|
+
if (ZSTD_isError(cSize) && !uncompressibleError)
|
1266
|
+
return cSize;
|
1267
|
+
/* Check compressibility */
|
1268
|
+
if (cSize >= maxCSize || uncompressibleError) {
|
1269
|
+
entropy->hufCTable_repeatMode = HUF_repeat_none;
|
1270
|
+
entropy->offcode_repeatMode = FSE_repeat_none;
|
1271
|
+
entropy->matchlength_repeatMode = FSE_repeat_none;
|
1272
|
+
entropy->litlength_repeatMode = FSE_repeat_none;
|
1273
|
+
return 0;
|
1274
|
+
}
|
1275
|
+
assert(!ZSTD_isError(cSize));
|
1267
1276
|
|
1268
1277
|
/* confirm repcodes */
|
1269
|
-
{ int i; for (i=0; i<ZSTD_REP_NUM; i++)
|
1270
|
-
|
1271
|
-
return op - ostart;
|
1278
|
+
{ int i; for (i=0; i<ZSTD_REP_NUM; i++) seqStorePtr->rep[i] = seqStorePtr->repToConfirm[i]; }
|
1279
|
+
return cSize;
|
1272
1280
|
}
|
1273
1281
|
|
1274
1282
|
|
@@ -1475,7 +1483,7 @@ static void ZSTD_fillHashTable (ZSTD_CCtx* zc, const void* end, const U32 mls)
|
|
1475
1483
|
}
|
1476
1484
|
|
1477
1485
|
|
1478
|
-
|
1486
|
+
FORCE_INLINE_TEMPLATE
|
1479
1487
|
void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
|
1480
1488
|
const void* src, size_t srcSize,
|
1481
1489
|
const U32 mls)
|
@@ -1491,7 +1499,7 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
|
|
1491
1499
|
const BYTE* const lowest = base + lowestIndex;
|
1492
1500
|
const BYTE* const iend = istart + srcSize;
|
1493
1501
|
const BYTE* const ilimit = iend - HASH_READ_SIZE;
|
1494
|
-
U32 offset_1=
|
1502
|
+
U32 offset_1=seqStorePtr->rep[0], offset_2=seqStorePtr->rep[1];
|
1495
1503
|
U32 offsetSaved = 0;
|
1496
1504
|
|
1497
1505
|
/* init */
|
@@ -1552,8 +1560,8 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx* cctx,
|
|
1552
1560
|
} } }
|
1553
1561
|
|
1554
1562
|
/* save reps for next block */
|
1555
|
-
|
1556
|
-
|
1563
|
+
seqStorePtr->repToConfirm[0] = offset_1 ? offset_1 : offsetSaved;
|
1564
|
+
seqStorePtr->repToConfirm[1] = offset_2 ? offset_2 : offsetSaved;
|
1557
1565
|
|
1558
1566
|
/* Last Literals */
|
1559
1567
|
{ size_t const lastLLSize = iend - anchor;
|
@@ -1601,7 +1609,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1601
1609
|
const BYTE* const dictEnd = dictBase + dictLimit;
|
1602
1610
|
const BYTE* const iend = istart + srcSize;
|
1603
1611
|
const BYTE* const ilimit = iend - 8;
|
1604
|
-
U32 offset_1=
|
1612
|
+
U32 offset_1=seqStorePtr->rep[0], offset_2=seqStorePtr->rep[1];
|
1605
1613
|
|
1606
1614
|
/* Search Loop */
|
1607
1615
|
while (ip < ilimit) { /* < instead of <=, because (ip+1) */
|
@@ -1667,7 +1675,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1667
1675
|
} } }
|
1668
1676
|
|
1669
1677
|
/* save reps for next block */
|
1670
|
-
|
1678
|
+
seqStorePtr->repToConfirm[0] = offset_1; seqStorePtr->repToConfirm[1] = offset_2;
|
1671
1679
|
|
1672
1680
|
/* Last Literals */
|
1673
1681
|
{ size_t const lastLLSize = iend - anchor;
|
@@ -1718,7 +1726,7 @@ static void ZSTD_fillDoubleHashTable (ZSTD_CCtx* cctx, const void* end, const U3
|
|
1718
1726
|
}
|
1719
1727
|
|
1720
1728
|
|
1721
|
-
|
1729
|
+
FORCE_INLINE_TEMPLATE
|
1722
1730
|
void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
|
1723
1731
|
const void* src, size_t srcSize,
|
1724
1732
|
const U32 mls)
|
@@ -1736,7 +1744,7 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
|
|
1736
1744
|
const BYTE* const lowest = base + lowestIndex;
|
1737
1745
|
const BYTE* const iend = istart + srcSize;
|
1738
1746
|
const BYTE* const ilimit = iend - HASH_READ_SIZE;
|
1739
|
-
U32 offset_1=
|
1747
|
+
U32 offset_1=seqStorePtr->rep[0], offset_2=seqStorePtr->rep[1];
|
1740
1748
|
U32 offsetSaved = 0;
|
1741
1749
|
|
1742
1750
|
/* init */
|
@@ -1823,8 +1831,8 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx* cctx,
|
|
1823
1831
|
} } }
|
1824
1832
|
|
1825
1833
|
/* save reps for next block */
|
1826
|
-
|
1827
|
-
|
1834
|
+
seqStorePtr->repToConfirm[0] = offset_1 ? offset_1 : offsetSaved;
|
1835
|
+
seqStorePtr->repToConfirm[1] = offset_2 ? offset_2 : offsetSaved;
|
1828
1836
|
|
1829
1837
|
/* Last Literals */
|
1830
1838
|
{ size_t const lastLLSize = iend - anchor;
|
@@ -1873,7 +1881,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1873
1881
|
const BYTE* const dictEnd = dictBase + dictLimit;
|
1874
1882
|
const BYTE* const iend = istart + srcSize;
|
1875
1883
|
const BYTE* const ilimit = iend - 8;
|
1876
|
-
U32 offset_1=
|
1884
|
+
U32 offset_1=seqStorePtr->rep[0], offset_2=seqStorePtr->rep[1];
|
1877
1885
|
|
1878
1886
|
/* Search Loop */
|
1879
1887
|
while (ip < ilimit) { /* < instead of <=, because (ip+1) */
|
@@ -1973,7 +1981,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx* ctx,
|
|
1973
1981
|
} } }
|
1974
1982
|
|
1975
1983
|
/* save reps for next block */
|
1976
|
-
|
1984
|
+
seqStorePtr->repToConfirm[0] = offset_1; seqStorePtr->repToConfirm[1] = offset_2;
|
1977
1985
|
|
1978
1986
|
/* Last Literals */
|
1979
1987
|
{ size_t const lastLLSize = iend - anchor;
|
@@ -2276,7 +2284,7 @@ static size_t ZSTD_BtFindBestMatch_selectMLS_extDict (
|
|
2276
2284
|
|
2277
2285
|
/* Update chains up to ip (excluded)
|
2278
2286
|
Assumption : always within prefix (i.e. not within extDict) */
|
2279
|
-
|
2287
|
+
FORCE_INLINE_TEMPLATE
|
2280
2288
|
U32 ZSTD_insertAndFindFirstIndex (ZSTD_CCtx* zc, const BYTE* ip, U32 mls)
|
2281
2289
|
{
|
2282
2290
|
U32* const hashTable = zc->hashTable;
|
@@ -2300,7 +2308,7 @@ U32 ZSTD_insertAndFindFirstIndex (ZSTD_CCtx* zc, const BYTE* ip, U32 mls)
|
|
2300
2308
|
|
2301
2309
|
|
2302
2310
|
/* inlining is important to hardwire a hot branch (template emulation) */
|
2303
|
-
|
2311
|
+
FORCE_INLINE_TEMPLATE
|
2304
2312
|
size_t ZSTD_HcFindBestMatch_generic (
|
2305
2313
|
ZSTD_CCtx* zc, /* Index table will be updated */
|
2306
2314
|
const BYTE* const ip, const BYTE* const iLimit,
|
@@ -2352,7 +2360,7 @@ size_t ZSTD_HcFindBestMatch_generic (
|
|
2352
2360
|
}
|
2353
2361
|
|
2354
2362
|
|
2355
|
-
|
2363
|
+
FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_selectMLS (
|
2356
2364
|
ZSTD_CCtx* zc,
|
2357
2365
|
const BYTE* ip, const BYTE* const iLimit,
|
2358
2366
|
size_t* offsetPtr,
|
@@ -2369,7 +2377,7 @@ FORCE_INLINE size_t ZSTD_HcFindBestMatch_selectMLS (
|
|
2369
2377
|
}
|
2370
2378
|
|
2371
2379
|
|
2372
|
-
|
2380
|
+
FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_extDict_selectMLS (
|
2373
2381
|
ZSTD_CCtx* zc,
|
2374
2382
|
const BYTE* ip, const BYTE* const iLimit,
|
2375
2383
|
size_t* offsetPtr,
|
@@ -2389,7 +2397,7 @@ FORCE_INLINE size_t ZSTD_HcFindBestMatch_extDict_selectMLS (
|
|
2389
2397
|
/* *******************************
|
2390
2398
|
* Common parser - lazy strategy
|
2391
2399
|
*********************************/
|
2392
|
-
|
2400
|
+
FORCE_INLINE_TEMPLATE
|
2393
2401
|
void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
|
2394
2402
|
const void* src, size_t srcSize,
|
2395
2403
|
const U32 searchMethod, const U32 depth)
|
@@ -2409,7 +2417,7 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
|
|
2409
2417
|
size_t* offsetPtr,
|
2410
2418
|
U32 maxNbAttempts, U32 matchLengthSearch);
|
2411
2419
|
searchMax_f const searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS : ZSTD_HcFindBestMatch_selectMLS;
|
2412
|
-
U32 offset_1 =
|
2420
|
+
U32 offset_1 = seqStorePtr->rep[0], offset_2 = seqStorePtr->rep[1], savedOffset=0;
|
2413
2421
|
|
2414
2422
|
/* init */
|
2415
2423
|
ip += (ip==base);
|
@@ -2519,8 +2527,8 @@ _storeSequence:
|
|
2519
2527
|
} }
|
2520
2528
|
|
2521
2529
|
/* Save reps for next block */
|
2522
|
-
|
2523
|
-
|
2530
|
+
seqStorePtr->repToConfirm[0] = offset_1 ? offset_1 : savedOffset;
|
2531
|
+
seqStorePtr->repToConfirm[1] = offset_2 ? offset_2 : savedOffset;
|
2524
2532
|
|
2525
2533
|
/* Last Literals */
|
2526
2534
|
{ size_t const lastLLSize = iend - anchor;
|
@@ -2551,7 +2559,7 @@ static void ZSTD_compressBlock_greedy(ZSTD_CCtx* ctx, const void* src, size_t sr
|
|
2551
2559
|
}
|
2552
2560
|
|
2553
2561
|
|
2554
|
-
|
2562
|
+
FORCE_INLINE_TEMPLATE
|
2555
2563
|
void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
|
2556
2564
|
const void* src, size_t srcSize,
|
2557
2565
|
const U32 searchMethod, const U32 depth)
|
@@ -2578,7 +2586,7 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx,
|
|
2578
2586
|
U32 maxNbAttempts, U32 matchLengthSearch);
|
2579
2587
|
searchMax_f searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS_extDict : ZSTD_HcFindBestMatch_extDict_selectMLS;
|
2580
2588
|
|
2581
|
-
U32 offset_1 =
|
2589
|
+
U32 offset_1 = seqStorePtr->rep[0], offset_2 = seqStorePtr->rep[1];
|
2582
2590
|
|
2583
2591
|
/* init */
|
2584
2592
|
ctx->nextToUpdate3 = ctx->nextToUpdate;
|
@@ -2714,7 +2722,7 @@ _storeSequence:
|
|
2714
2722
|
} }
|
2715
2723
|
|
2716
2724
|
/* Save reps for next block */
|
2717
|
-
|
2725
|
+
seqStorePtr->repToConfirm[0] = offset_1; seqStorePtr->repToConfirm[1] = offset_2;
|
2718
2726
|
|
2719
2727
|
/* Last Literals */
|
2720
2728
|
{ size_t const lastLLSize = iend - anchor;
|
@@ -2823,7 +2831,7 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCa
|
|
2823
2831
|
if (current > zc->nextToUpdate + 384)
|
2824
2832
|
zc->nextToUpdate = current - MIN(192, (U32)(current - zc->nextToUpdate - 384)); /* limited update after finding a very long match */
|
2825
2833
|
blockCompressor(zc, src, srcSize);
|
2826
|
-
return ZSTD_compressSequences(zc, dst, dstCapacity, srcSize);
|
2834
|
+
return ZSTD_compressSequences(&zc->seqStore, zc->entropy, &zc->appliedParams.cParams, dst, dstCapacity, srcSize);
|
2827
2835
|
}
|
2828
2836
|
|
2829
2837
|
|
@@ -3000,7 +3008,6 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|
3000
3008
|
return fhSize;
|
3001
3009
|
}
|
3002
3010
|
|
3003
|
-
|
3004
3011
|
size_t ZSTD_compressContinue (ZSTD_CCtx* cctx,
|
3005
3012
|
void* dst, size_t dstCapacity,
|
3006
3013
|
const void* src, size_t srcSize)
|
@@ -3106,13 +3113,14 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx* cctx, const void* dict, size_t
|
|
3106
3113
|
const BYTE* const dictEnd = dictPtr + dictSize;
|
3107
3114
|
short offcodeNCount[MaxOff+1];
|
3108
3115
|
unsigned offcodeMaxValue = MaxOff;
|
3109
|
-
|
3116
|
+
|
3117
|
+
ZSTD_STATIC_ASSERT(sizeof(cctx->entropy->workspace) >= (1<<MAX(MLFSELog,LLFSELog)));
|
3110
3118
|
|
3111
3119
|
dictPtr += 4; /* skip magic number */
|
3112
3120
|
cctx->dictID = cctx->appliedParams.fParams.noDictIDFlag ? 0 : MEM_readLE32(dictPtr);
|
3113
3121
|
dictPtr += 4;
|
3114
3122
|
|
3115
|
-
{ size_t const hufHeaderSize = HUF_readCTable(cctx->hufCTable, 255, dictPtr, dictEnd-dictPtr);
|
3123
|
+
{ size_t const hufHeaderSize = HUF_readCTable((HUF_CElt*)cctx->entropy->hufCTable, 255, dictPtr, dictEnd-dictPtr);
|
3116
3124
|
if (HUF_isError(hufHeaderSize)) return ERROR(dictionary_corrupted);
|
3117
3125
|
dictPtr += hufHeaderSize;
|
3118
3126
|
}
|
@@ -3122,7 +3130,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx* cctx, const void* dict, size_t
|
|
3122
3130
|
if (FSE_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
|
3123
3131
|
if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
|
3124
3132
|
/* Defer checking offcodeMaxValue because we need to know the size of the dictionary content */
|
3125
|
-
CHECK_E( FSE_buildCTable_wksp(cctx->offcodeCTable, offcodeNCount, offcodeMaxValue, offcodeLog,
|
3133
|
+
CHECK_E( FSE_buildCTable_wksp(cctx->entropy->offcodeCTable, offcodeNCount, offcodeMaxValue, offcodeLog, cctx->entropy->workspace, sizeof(cctx->entropy->workspace)),
|
3126
3134
|
dictionary_corrupted);
|
3127
3135
|
dictPtr += offcodeHeaderSize;
|
3128
3136
|
}
|
@@ -3134,7 +3142,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx* cctx, const void* dict, size_t
|
|
3134
3142
|
if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
|
3135
3143
|
/* Every match length code must have non-zero probability */
|
3136
3144
|
CHECK_F( ZSTD_checkDictNCount(matchlengthNCount, matchlengthMaxValue, MaxML));
|
3137
|
-
CHECK_E( FSE_buildCTable_wksp(cctx->matchlengthCTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog,
|
3145
|
+
CHECK_E( FSE_buildCTable_wksp(cctx->entropy->matchlengthCTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog, cctx->entropy->workspace, sizeof(cctx->entropy->workspace)),
|
3138
3146
|
dictionary_corrupted);
|
3139
3147
|
dictPtr += matchlengthHeaderSize;
|
3140
3148
|
}
|
@@ -3146,15 +3154,15 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx* cctx, const void* dict, size_t
|
|
3146
3154
|
if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
|
3147
3155
|
/* Every literal length code must have non-zero probability */
|
3148
3156
|
CHECK_F( ZSTD_checkDictNCount(litlengthNCount, litlengthMaxValue, MaxLL));
|
3149
|
-
CHECK_E( FSE_buildCTable_wksp(cctx->litlengthCTable, litlengthNCount, litlengthMaxValue, litlengthLog,
|
3157
|
+
CHECK_E( FSE_buildCTable_wksp(cctx->entropy->litlengthCTable, litlengthNCount, litlengthMaxValue, litlengthLog, cctx->entropy->workspace, sizeof(cctx->entropy->workspace)),
|
3150
3158
|
dictionary_corrupted);
|
3151
3159
|
dictPtr += litlengthHeaderSize;
|
3152
3160
|
}
|
3153
3161
|
|
3154
3162
|
if (dictPtr+12 > dictEnd) return ERROR(dictionary_corrupted);
|
3155
|
-
cctx->rep[0] = MEM_readLE32(dictPtr+0);
|
3156
|
-
cctx->rep[1] = MEM_readLE32(dictPtr+4);
|
3157
|
-
cctx->rep[2] = MEM_readLE32(dictPtr+8);
|
3163
|
+
cctx->seqStore.rep[0] = MEM_readLE32(dictPtr+0);
|
3164
|
+
cctx->seqStore.rep[1] = MEM_readLE32(dictPtr+4);
|
3165
|
+
cctx->seqStore.rep[2] = MEM_readLE32(dictPtr+8);
|
3158
3166
|
dictPtr += 12;
|
3159
3167
|
|
3160
3168
|
{ size_t const dictContentSize = (size_t)(dictEnd - dictPtr);
|
@@ -3168,12 +3176,14 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_CCtx* cctx, const void* dict, size_t
|
|
3168
3176
|
/* All repCodes must be <= dictContentSize and != 0*/
|
3169
3177
|
{ U32 u;
|
3170
3178
|
for (u=0; u<3; u++) {
|
3171
|
-
if (cctx->rep[u] == 0) return ERROR(dictionary_corrupted);
|
3172
|
-
if (cctx->rep[u] > dictContentSize) return ERROR(dictionary_corrupted);
|
3179
|
+
if (cctx->seqStore.rep[u] == 0) return ERROR(dictionary_corrupted);
|
3180
|
+
if (cctx->seqStore.rep[u] > dictContentSize) return ERROR(dictionary_corrupted);
|
3173
3181
|
} }
|
3174
3182
|
|
3175
|
-
cctx->
|
3176
|
-
cctx->
|
3183
|
+
cctx->entropy->hufCTable_repeatMode = HUF_repeat_valid;
|
3184
|
+
cctx->entropy->offcode_repeatMode = FSE_repeat_valid;
|
3185
|
+
cctx->entropy->matchlength_repeatMode = FSE_repeat_valid;
|
3186
|
+
cctx->entropy->litlength_repeatMode = FSE_repeat_valid;
|
3177
3187
|
return ZSTD_loadDictionaryContent(cctx, dictPtr, dictContentSize);
|
3178
3188
|
}
|
3179
3189
|
}
|