extzstd 0.0.3.CONCEPT → 0.3.1
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 +5 -5
- data/HISTORY.ja.md +39 -0
- data/LICENSE +6 -6
- data/README.md +26 -45
- data/contrib/zstd/CHANGELOG +555 -0
- data/contrib/zstd/CODE_OF_CONDUCT.md +5 -0
- data/contrib/zstd/CONTRIBUTING.md +392 -0
- data/contrib/zstd/COPYING +339 -0
- data/contrib/zstd/LICENSE +13 -9
- data/contrib/zstd/Makefile +414 -0
- data/contrib/zstd/README.md +170 -45
- data/contrib/zstd/TESTING.md +44 -0
- data/contrib/zstd/appveyor.yml +289 -0
- data/contrib/zstd/lib/BUCK +234 -0
- data/contrib/zstd/lib/Makefile +354 -0
- data/contrib/zstd/lib/README.md +179 -0
- data/contrib/zstd/{common → lib/common}/bitstream.h +170 -130
- data/contrib/zstd/lib/common/compiler.h +175 -0
- data/contrib/zstd/lib/common/cpu.h +215 -0
- data/contrib/zstd/lib/common/debug.c +24 -0
- data/contrib/zstd/lib/common/debug.h +114 -0
- data/contrib/zstd/{common → lib/common}/entropy_common.c +79 -94
- data/contrib/zstd/lib/common/error_private.c +55 -0
- data/contrib/zstd/lib/common/error_private.h +80 -0
- data/contrib/zstd/{common → lib/common}/fse.h +153 -93
- data/contrib/zstd/{common → lib/common}/fse_decompress.c +37 -82
- data/contrib/zstd/lib/common/huf.h +340 -0
- data/contrib/zstd/{common → lib/common}/mem.h +154 -78
- data/contrib/zstd/lib/common/pool.c +344 -0
- data/contrib/zstd/lib/common/pool.h +84 -0
- data/contrib/zstd/lib/common/threading.c +121 -0
- data/contrib/zstd/lib/common/threading.h +155 -0
- data/contrib/zstd/{common → lib/common}/xxhash.c +85 -75
- data/contrib/zstd/{common → lib/common}/xxhash.h +85 -73
- data/contrib/zstd/lib/common/zstd_common.c +83 -0
- data/contrib/zstd/lib/common/zstd_errors.h +94 -0
- data/contrib/zstd/lib/common/zstd_internal.h +447 -0
- data/contrib/zstd/{compress → lib/compress}/fse_compress.c +194 -303
- data/contrib/zstd/lib/compress/hist.c +183 -0
- data/contrib/zstd/lib/compress/hist.h +75 -0
- data/contrib/zstd/lib/compress/huf_compress.c +798 -0
- data/contrib/zstd/lib/compress/zstd_compress.c +4278 -0
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +1125 -0
- data/contrib/zstd/lib/compress/zstd_compress_literals.c +158 -0
- data/contrib/zstd/lib/compress/zstd_compress_literals.h +29 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.c +419 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.h +54 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.c +845 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.h +32 -0
- data/contrib/zstd/lib/compress/zstd_cwksp.h +525 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.c +521 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.h +38 -0
- data/contrib/zstd/lib/compress/zstd_fast.c +496 -0
- data/contrib/zstd/lib/compress/zstd_fast.h +37 -0
- data/contrib/zstd/lib/compress/zstd_lazy.c +1138 -0
- data/contrib/zstd/lib/compress/zstd_lazy.h +67 -0
- data/contrib/zstd/lib/compress/zstd_ldm.c +619 -0
- data/contrib/zstd/lib/compress/zstd_ldm.h +110 -0
- data/contrib/zstd/lib/compress/zstd_opt.c +1200 -0
- data/contrib/zstd/lib/compress/zstd_opt.h +56 -0
- data/contrib/zstd/lib/compress/zstdmt_compress.c +2143 -0
- data/contrib/zstd/lib/compress/zstdmt_compress.h +192 -0
- data/contrib/zstd/lib/decompress/huf_decompress.c +1248 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.c +244 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.h +44 -0
- data/contrib/zstd/lib/decompress/zstd_decompress.c +1885 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1432 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_block.h +59 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +189 -0
- data/contrib/zstd/{common → lib/deprecated}/zbuff.h +86 -69
- data/contrib/zstd/lib/deprecated/zbuff_common.c +26 -0
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +147 -0
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +75 -0
- data/contrib/zstd/lib/dictBuilder/cover.c +1236 -0
- data/contrib/zstd/lib/dictBuilder/cover.h +157 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.c +3 -3
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.h +5 -5
- data/contrib/zstd/lib/dictBuilder/fastcover.c +757 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/zdict.c +437 -347
- data/contrib/zstd/lib/dictBuilder/zdict.h +305 -0
- data/contrib/zstd/lib/legacy/zstd_legacy.h +415 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.c +272 -292
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.h +26 -32
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.c +162 -392
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.h +26 -32
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.c +162 -391
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.h +27 -33
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.c +195 -604
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.h +26 -32
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.c +300 -575
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.h +22 -31
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.c +165 -592
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.h +54 -67
- data/contrib/zstd/lib/legacy/zstd_v07.c +4541 -0
- data/contrib/zstd/lib/legacy/zstd_v07.h +187 -0
- data/contrib/zstd/lib/libzstd.pc.in +15 -0
- data/contrib/zstd/lib/zstd.h +2090 -0
- data/ext/depend +2 -0
- data/ext/extconf.rb +18 -5
- data/ext/extzstd.c +296 -214
- data/ext/extzstd.h +81 -36
- data/ext/extzstd_nogvls.h +0 -117
- data/ext/extzstd_stream.c +622 -0
- data/ext/libzstd_conf.h +8 -0
- data/ext/zstd_common.c +11 -0
- data/ext/zstd_compress.c +15 -0
- data/ext/zstd_decompress.c +6 -0
- data/ext/zstd_dictbuilder.c +10 -0
- data/ext/zstd_dictbuilder_fastcover.c +3 -0
- data/ext/zstd_legacy_v01.c +3 -1
- data/ext/zstd_legacy_v02.c +3 -1
- data/ext/zstd_legacy_v03.c +3 -1
- data/ext/zstd_legacy_v04.c +3 -1
- data/ext/zstd_legacy_v05.c +3 -1
- data/ext/zstd_legacy_v06.c +3 -1
- data/ext/zstd_legacy_v07.c +3 -0
- data/gemstub.rb +27 -21
- data/lib/extzstd.rb +82 -161
- data/lib/extzstd/version.rb +1 -1
- data/test/test_basic.rb +19 -6
- metadata +127 -59
- data/contrib/zstd/common/error_private.h +0 -125
- data/contrib/zstd/common/error_public.h +0 -77
- data/contrib/zstd/common/huf.h +0 -228
- data/contrib/zstd/common/zstd.h +0 -475
- data/contrib/zstd/common/zstd_common.c +0 -91
- data/contrib/zstd/common/zstd_internal.h +0 -238
- data/contrib/zstd/compress/huf_compress.c +0 -577
- data/contrib/zstd/compress/zbuff_compress.c +0 -327
- data/contrib/zstd/compress/zstd_compress.c +0 -3074
- data/contrib/zstd/compress/zstd_opt.h +0 -1046
- data/contrib/zstd/decompress/huf_decompress.c +0 -894
- data/contrib/zstd/decompress/zbuff_decompress.c +0 -294
- data/contrib/zstd/decompress/zstd_decompress.c +0 -1362
- data/contrib/zstd/dictBuilder/zdict.h +0 -113
- data/contrib/zstd/legacy/zstd_legacy.h +0 -140
- data/ext/extzstd_buffered.c +0 -265
- data/ext/zstd_amalgam.c +0 -18
|
@@ -1,34 +1,13 @@
|
|
|
1
1
|
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* Redistributions of source code must retain the above copyright
|
|
12
|
-
notice, this list of conditions and the following disclaimer.
|
|
13
|
-
* Redistributions in binary form must reproduce the above
|
|
14
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
15
|
-
in the documentation and/or other materials provided with the
|
|
16
|
-
distribution.
|
|
17
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
18
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
19
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
20
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
21
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
22
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
23
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
24
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
25
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
27
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
-
|
|
29
|
-
You can contact the author at :
|
|
30
|
-
- zstd source repository : https://github.com/Cyan4973/zstd
|
|
31
|
-
*/
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
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
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
9
|
+
*/
|
|
10
|
+
|
|
32
11
|
#ifndef ZSTDv05_H
|
|
33
12
|
#define ZSTDv05_H
|
|
34
13
|
|
|
@@ -40,7 +19,7 @@ extern "C" {
|
|
|
40
19
|
* Dependencies
|
|
41
20
|
***************************************/
|
|
42
21
|
#include <stddef.h> /* size_t */
|
|
43
|
-
#include "mem.h" /* U64, U32 */
|
|
22
|
+
#include "../common/mem.h" /* U64, U32 */
|
|
44
23
|
|
|
45
24
|
|
|
46
25
|
/* *************************************
|
|
@@ -54,6 +33,18 @@ extern "C" {
|
|
|
54
33
|
size_t ZSTDv05_decompress( void* dst, size_t dstCapacity,
|
|
55
34
|
const void* src, size_t compressedSize);
|
|
56
35
|
|
|
36
|
+
/**
|
|
37
|
+
ZSTDv05_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.5.x format
|
|
38
|
+
srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
|
39
|
+
cSize (output parameter) : the number of bytes that would be read to decompress this frame
|
|
40
|
+
or an error code if it fails (which can be tested using ZSTDv01_isError())
|
|
41
|
+
dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
|
|
42
|
+
or ZSTD_CONTENTSIZE_ERROR if an error occurs
|
|
43
|
+
|
|
44
|
+
note : assumes `cSize` and `dBound` are _not_ NULL.
|
|
45
|
+
*/
|
|
46
|
+
void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
|
47
|
+
size_t* cSize, unsigned long long* dBound);
|
|
57
48
|
|
|
58
49
|
/* *************************************
|
|
59
50
|
* Helper functions
|
|
@@ -1,42 +1,20 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
met:
|
|
11
|
-
|
|
12
|
-
* Redistributions of source code must retain the above copyright
|
|
13
|
-
notice, this list of conditions and the following disclaimer.
|
|
14
|
-
* Redistributions in binary form must reproduce the above
|
|
15
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
16
|
-
in the documentation and/or other materials provided with the
|
|
17
|
-
distribution.
|
|
18
|
-
|
|
19
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
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
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
9
|
+
*/
|
|
30
10
|
|
|
31
|
-
You can contact the author at :
|
|
32
|
-
- Homepage : http://www.zstd.net/
|
|
33
|
-
****************************************************************** */
|
|
34
11
|
|
|
35
12
|
/*- Dependencies -*/
|
|
36
13
|
#include "zstd_v06.h"
|
|
37
14
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
|
38
15
|
#include <string.h> /* memcpy */
|
|
39
16
|
#include <stdlib.h> /* malloc, free, qsort */
|
|
17
|
+
#include "../common/error_private.h"
|
|
40
18
|
|
|
41
19
|
|
|
42
20
|
|
|
@@ -85,6 +63,10 @@ extern "C" {
|
|
|
85
63
|
/*-****************************************
|
|
86
64
|
* Compiler specifics
|
|
87
65
|
******************************************/
|
|
66
|
+
#if defined(_MSC_VER) /* Visual Studio */
|
|
67
|
+
# include <stdlib.h> /* _byteswap_ulong */
|
|
68
|
+
# include <intrin.h> /* _byteswap_* */
|
|
69
|
+
#endif
|
|
88
70
|
#if defined(__GNUC__)
|
|
89
71
|
# define MEM_STATIC static __attribute__((unused))
|
|
90
72
|
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
|
@@ -138,7 +120,7 @@ extern "C" {
|
|
|
138
120
|
#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
|
139
121
|
# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
|
|
140
122
|
# define MEM_FORCE_MEMORY_ACCESS 2
|
|
141
|
-
# elif defined(__INTEL_COMPILER) || \
|
|
123
|
+
# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
|
|
142
124
|
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
|
143
125
|
# define MEM_FORCE_MEMORY_ACCESS 1
|
|
144
126
|
# endif
|
|
@@ -160,11 +142,8 @@ Only use if no other choice to achieve best performance on target platform */
|
|
|
160
142
|
MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; }
|
|
161
143
|
MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
|
|
162
144
|
MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
|
|
163
|
-
MEM_STATIC U64 MEM_readST(const void* memPtr) { return *(const size_t*) memPtr; }
|
|
164
145
|
|
|
165
146
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
|
|
166
|
-
MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; }
|
|
167
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; }
|
|
168
147
|
|
|
169
148
|
#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
|
|
170
149
|
|
|
@@ -175,11 +154,8 @@ typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed))
|
|
|
175
154
|
MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
|
|
176
155
|
MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
|
|
177
156
|
MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
|
|
178
|
-
MEM_STATIC U64 MEM_readST(const void* ptr) { return ((const unalign*)ptr)->st; }
|
|
179
157
|
|
|
180
158
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
|
|
181
|
-
MEM_STATIC void MEM_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; }
|
|
182
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value) { ((unalign*)memPtr)->u64 = value; }
|
|
183
159
|
|
|
184
160
|
#else
|
|
185
161
|
|
|
@@ -201,25 +177,11 @@ MEM_STATIC U64 MEM_read64(const void* memPtr)
|
|
|
201
177
|
U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
|
|
202
178
|
}
|
|
203
179
|
|
|
204
|
-
MEM_STATIC size_t MEM_readST(const void* memPtr)
|
|
205
|
-
{
|
|
206
|
-
size_t val; memcpy(&val, memPtr, sizeof(val)); return val;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
180
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
210
181
|
{
|
|
211
182
|
memcpy(memPtr, &value, sizeof(value));
|
|
212
183
|
}
|
|
213
184
|
|
|
214
|
-
MEM_STATIC void MEM_write32(void* memPtr, U32 value)
|
|
215
|
-
{
|
|
216
|
-
memcpy(memPtr, &value, sizeof(value));
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value)
|
|
220
|
-
{
|
|
221
|
-
memcpy(memPtr, &value, sizeof(value));
|
|
222
|
-
}
|
|
223
185
|
|
|
224
186
|
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
|
225
187
|
|
|
@@ -227,7 +189,7 @@ MEM_STATIC U32 MEM_swap32(U32 in)
|
|
|
227
189
|
{
|
|
228
190
|
#if defined(_MSC_VER) /* Visual Studio */
|
|
229
191
|
return _byteswap_ulong(in);
|
|
230
|
-
#elif defined (__GNUC__)
|
|
192
|
+
#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
|
|
231
193
|
return __builtin_bswap32(in);
|
|
232
194
|
#else
|
|
233
195
|
return ((in << 24) & 0xff000000 ) |
|
|
@@ -241,7 +203,7 @@ MEM_STATIC U64 MEM_swap64(U64 in)
|
|
|
241
203
|
{
|
|
242
204
|
#if defined(_MSC_VER) /* Visual Studio */
|
|
243
205
|
return _byteswap_uint64(in);
|
|
244
|
-
#elif defined (__GNUC__)
|
|
206
|
+
#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
|
|
245
207
|
return __builtin_bswap64(in);
|
|
246
208
|
#else
|
|
247
209
|
return ((in << 56) & 0xff00000000000000ULL) |
|
|
@@ -255,13 +217,6 @@ MEM_STATIC U64 MEM_swap64(U64 in)
|
|
|
255
217
|
#endif
|
|
256
218
|
}
|
|
257
219
|
|
|
258
|
-
MEM_STATIC size_t MEM_swapST(size_t in)
|
|
259
|
-
{
|
|
260
|
-
if (MEM_32bits())
|
|
261
|
-
return (size_t)MEM_swap32((U32)in);
|
|
262
|
-
else
|
|
263
|
-
return (size_t)MEM_swap64((U64)in);
|
|
264
|
-
}
|
|
265
220
|
|
|
266
221
|
/*=== Little endian r/w ===*/
|
|
267
222
|
|
|
@@ -294,13 +249,6 @@ MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
|
|
294
249
|
return MEM_swap32(MEM_read32(memPtr));
|
|
295
250
|
}
|
|
296
251
|
|
|
297
|
-
MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32)
|
|
298
|
-
{
|
|
299
|
-
if (MEM_isLittleEndian())
|
|
300
|
-
MEM_write32(memPtr, val32);
|
|
301
|
-
else
|
|
302
|
-
MEM_write32(memPtr, MEM_swap32(val32));
|
|
303
|
-
}
|
|
304
252
|
|
|
305
253
|
MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
|
306
254
|
{
|
|
@@ -310,13 +258,6 @@ MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
|
|
310
258
|
return MEM_swap64(MEM_read64(memPtr));
|
|
311
259
|
}
|
|
312
260
|
|
|
313
|
-
MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64)
|
|
314
|
-
{
|
|
315
|
-
if (MEM_isLittleEndian())
|
|
316
|
-
MEM_write64(memPtr, val64);
|
|
317
|
-
else
|
|
318
|
-
MEM_write64(memPtr, MEM_swap64(val64));
|
|
319
|
-
}
|
|
320
261
|
|
|
321
262
|
MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
322
263
|
{
|
|
@@ -326,78 +267,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
|
326
267
|
return (size_t)MEM_readLE64(memPtr);
|
|
327
268
|
}
|
|
328
269
|
|
|
329
|
-
MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val)
|
|
330
|
-
{
|
|
331
|
-
if (MEM_32bits())
|
|
332
|
-
MEM_writeLE32(memPtr, (U32)val);
|
|
333
|
-
else
|
|
334
|
-
MEM_writeLE64(memPtr, (U64)val);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/*=== Big endian r/w ===*/
|
|
338
|
-
|
|
339
|
-
MEM_STATIC U32 MEM_readBE32(const void* memPtr)
|
|
340
|
-
{
|
|
341
|
-
if (MEM_isLittleEndian())
|
|
342
|
-
return MEM_swap32(MEM_read32(memPtr));
|
|
343
|
-
else
|
|
344
|
-
return MEM_read32(memPtr);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32)
|
|
348
|
-
{
|
|
349
|
-
if (MEM_isLittleEndian())
|
|
350
|
-
MEM_write32(memPtr, MEM_swap32(val32));
|
|
351
|
-
else
|
|
352
|
-
MEM_write32(memPtr, val32);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
MEM_STATIC U64 MEM_readBE64(const void* memPtr)
|
|
356
|
-
{
|
|
357
|
-
if (MEM_isLittleEndian())
|
|
358
|
-
return MEM_swap64(MEM_read64(memPtr));
|
|
359
|
-
else
|
|
360
|
-
return MEM_read64(memPtr);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64)
|
|
364
|
-
{
|
|
365
|
-
if (MEM_isLittleEndian())
|
|
366
|
-
MEM_write64(memPtr, MEM_swap64(val64));
|
|
367
|
-
else
|
|
368
|
-
MEM_write64(memPtr, val64);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
MEM_STATIC size_t MEM_readBEST(const void* memPtr)
|
|
372
|
-
{
|
|
373
|
-
if (MEM_32bits())
|
|
374
|
-
return (size_t)MEM_readBE32(memPtr);
|
|
375
|
-
else
|
|
376
|
-
return (size_t)MEM_readBE64(memPtr);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val)
|
|
380
|
-
{
|
|
381
|
-
if (MEM_32bits())
|
|
382
|
-
MEM_writeBE32(memPtr, (U32)val);
|
|
383
|
-
else
|
|
384
|
-
MEM_writeBE64(memPtr, (U64)val);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
270
|
|
|
388
|
-
/* function safe only for comparisons */
|
|
389
|
-
MEM_STATIC U32 MEM_readMINMATCH(const void* memPtr, U32 length)
|
|
390
|
-
{
|
|
391
|
-
switch (length)
|
|
392
|
-
{
|
|
393
|
-
default :
|
|
394
|
-
case 4 : return MEM_read32(memPtr);
|
|
395
|
-
case 3 : if (MEM_isLittleEndian())
|
|
396
|
-
return MEM_read32(memPtr)<<8;
|
|
397
|
-
else
|
|
398
|
-
return MEM_read32(memPtr)>>8;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
271
|
|
|
402
272
|
#if defined (__cplusplus)
|
|
403
273
|
}
|
|
@@ -405,77 +275,6 @@ MEM_STATIC U32 MEM_readMINMATCH(const void* memPtr, U32 length)
|
|
|
405
275
|
|
|
406
276
|
#endif /* MEM_H_MODULE */
|
|
407
277
|
|
|
408
|
-
/* ******************************************************************
|
|
409
|
-
Error codes list
|
|
410
|
-
Copyright (C) 2016, Yann Collet
|
|
411
|
-
|
|
412
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
413
|
-
|
|
414
|
-
Redistribution and use in source and binary forms, with or without
|
|
415
|
-
modification, are permitted provided that the following conditions are
|
|
416
|
-
met:
|
|
417
|
-
|
|
418
|
-
* Redistributions of source code must retain the above copyright
|
|
419
|
-
notice, this list of conditions and the following disclaimer.
|
|
420
|
-
* Redistributions in binary form must reproduce the above
|
|
421
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
422
|
-
in the documentation and/or other materials provided with the
|
|
423
|
-
distribution.
|
|
424
|
-
|
|
425
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
426
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
427
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
428
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
429
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
430
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
431
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
432
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
433
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
434
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
435
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
436
|
-
|
|
437
|
-
You can contact the author at :
|
|
438
|
-
- Homepage : http://www.zstd.net
|
|
439
|
-
****************************************************************** */
|
|
440
|
-
#ifndef ERROR_PUBLIC_H_MODULE
|
|
441
|
-
#define ERROR_PUBLIC_H_MODULE
|
|
442
|
-
|
|
443
|
-
#if defined (__cplusplus)
|
|
444
|
-
extern "C" {
|
|
445
|
-
#endif
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
/* ****************************************
|
|
449
|
-
* error codes list
|
|
450
|
-
******************************************/
|
|
451
|
-
typedef enum {
|
|
452
|
-
ZSTDv06_error_no_error,
|
|
453
|
-
ZSTDv06_error_GENERIC,
|
|
454
|
-
ZSTDv06_error_prefix_unknown,
|
|
455
|
-
ZSTDv06_error_frameParameter_unsupported,
|
|
456
|
-
ZSTDv06_error_frameParameter_unsupportedBy32bits,
|
|
457
|
-
ZSTDv06_error_compressionParameter_unsupported,
|
|
458
|
-
ZSTDv06_error_init_missing,
|
|
459
|
-
ZSTDv06_error_memory_allocation,
|
|
460
|
-
ZSTDv06_error_stage_wrong,
|
|
461
|
-
ZSTDv06_error_dstSize_tooSmall,
|
|
462
|
-
ZSTDv06_error_srcSize_wrong,
|
|
463
|
-
ZSTDv06_error_corruption_detected,
|
|
464
|
-
ZSTDv06_error_tableLog_tooLarge,
|
|
465
|
-
ZSTDv06_error_maxSymbolValue_tooLarge,
|
|
466
|
-
ZSTDv06_error_maxSymbolValue_tooSmall,
|
|
467
|
-
ZSTDv06_error_dictionary_corrupted,
|
|
468
|
-
ZSTDv06_error_maxCode
|
|
469
|
-
} ZSTDv06_ErrorCode;
|
|
470
|
-
|
|
471
|
-
/* note : compare with size_t function results using ZSTDv06_getError() */
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
#if defined (__cplusplus)
|
|
475
|
-
}
|
|
476
|
-
#endif
|
|
477
|
-
|
|
478
|
-
#endif /* ERROR_PUBLIC_H_MODULE */
|
|
479
278
|
/*
|
|
480
279
|
zstd - standard compression library
|
|
481
280
|
Header File for static linking only
|
|
@@ -528,7 +327,7 @@ extern "C" {
|
|
|
528
327
|
* It avoids reloading the dictionary each time.
|
|
529
328
|
* `preparedDCtx` must have been properly initialized using ZSTDv06_decompressBegin_usingDict().
|
|
530
329
|
* Requires 2 contexts : 1 for reference (preparedDCtx), which will not be modified, and 1 to run the decompression operation (dctx) */
|
|
531
|
-
|
|
330
|
+
ZSTDLIBv06_API size_t ZSTDv06_decompress_usingPreparedDCtx(
|
|
532
331
|
ZSTDv06_DCtx* dctx, const ZSTDv06_DCtx* preparedDCtx,
|
|
533
332
|
void* dst, size_t dstCapacity,
|
|
534
333
|
const void* src, size_t srcSize);
|
|
@@ -539,7 +338,7 @@ ZSTDLIB_API size_t ZSTDv06_decompress_usingPreparedDCtx(
|
|
|
539
338
|
static const size_t ZSTDv06_frameHeaderSize_min = 5;
|
|
540
339
|
static const size_t ZSTDv06_frameHeaderSize_max = ZSTDv06_FRAMEHEADERSIZE_MAX;
|
|
541
340
|
|
|
542
|
-
|
|
341
|
+
ZSTDLIBv06_API size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx);
|
|
543
342
|
|
|
544
343
|
/*
|
|
545
344
|
Streaming decompression, direct mode (bufferless)
|
|
@@ -598,140 +397,15 @@ ZSTDLIB_API size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx);
|
|
|
598
397
|
*/
|
|
599
398
|
|
|
600
399
|
#define ZSTDv06_BLOCKSIZE_MAX (128 * 1024) /* define, for static allocation */
|
|
601
|
-
|
|
400
|
+
ZSTDLIBv06_API size_t ZSTDv06_decompressBlock(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
|
|
602
401
|
|
|
603
402
|
|
|
604
|
-
/*-*************************************
|
|
605
|
-
* Error management
|
|
606
|
-
***************************************/
|
|
607
|
-
/*! ZSTDv06_getErrorCode() :
|
|
608
|
-
convert a `size_t` function result into a `ZSTDv06_ErrorCode` enum type,
|
|
609
|
-
which can be used to compare directly with enum list published into "error_public.h" */
|
|
610
|
-
ZSTDLIB_API ZSTDv06_ErrorCode ZSTDv06_getErrorCode(size_t functionResult);
|
|
611
|
-
ZSTDLIB_API const char* ZSTDv06_getErrorString(ZSTDv06_ErrorCode code);
|
|
612
|
-
|
|
613
403
|
|
|
614
404
|
#if defined (__cplusplus)
|
|
615
405
|
}
|
|
616
406
|
#endif
|
|
617
407
|
|
|
618
408
|
#endif /* ZSTDv06_STATIC_H */
|
|
619
|
-
/* ******************************************************************
|
|
620
|
-
Error codes and messages
|
|
621
|
-
Copyright (C) 2013-2016, Yann Collet
|
|
622
|
-
|
|
623
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
624
|
-
|
|
625
|
-
Redistribution and use in source and binary forms, with or without
|
|
626
|
-
modification, are permitted provided that the following conditions are
|
|
627
|
-
met:
|
|
628
|
-
|
|
629
|
-
* Redistributions of source code must retain the above copyright
|
|
630
|
-
notice, this list of conditions and the following disclaimer.
|
|
631
|
-
* Redistributions in binary form must reproduce the above
|
|
632
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
633
|
-
in the documentation and/or other materials provided with the
|
|
634
|
-
distribution.
|
|
635
|
-
|
|
636
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
637
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
638
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
639
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
640
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
641
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
642
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
643
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
644
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
645
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
646
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
647
|
-
|
|
648
|
-
You can contact the author at :
|
|
649
|
-
- Homepage : http://www.zstd.net
|
|
650
|
-
****************************************************************** */
|
|
651
|
-
/* Note : this module is expected to remain private, do not expose it */
|
|
652
|
-
|
|
653
|
-
#ifndef ERROR_H_MODULE
|
|
654
|
-
#define ERROR_H_MODULE
|
|
655
|
-
|
|
656
|
-
#if defined (__cplusplus)
|
|
657
|
-
extern "C" {
|
|
658
|
-
#endif
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
/* ****************************************
|
|
662
|
-
* Compiler-specific
|
|
663
|
-
******************************************/
|
|
664
|
-
#if defined(__GNUC__)
|
|
665
|
-
# define ERR_STATIC static __attribute__((unused))
|
|
666
|
-
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
|
667
|
-
# define ERR_STATIC static inline
|
|
668
|
-
#elif defined(_MSC_VER)
|
|
669
|
-
# define ERR_STATIC static __inline
|
|
670
|
-
#else
|
|
671
|
-
# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
|
672
|
-
#endif
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
/*-****************************************
|
|
676
|
-
* Customization (error_public.h)
|
|
677
|
-
******************************************/
|
|
678
|
-
typedef ZSTDv06_ErrorCode ERR_enum;
|
|
679
|
-
#define PREFIX(name) ZSTDv06_error_##name
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
/*-****************************************
|
|
683
|
-
* Error codes handling
|
|
684
|
-
******************************************/
|
|
685
|
-
#ifdef ERROR
|
|
686
|
-
# undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */
|
|
687
|
-
#endif
|
|
688
|
-
#define ERROR(name) ((size_t)-PREFIX(name))
|
|
689
|
-
|
|
690
|
-
ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
|
691
|
-
|
|
692
|
-
ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); }
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
/*-****************************************
|
|
696
|
-
* Error Strings
|
|
697
|
-
******************************************/
|
|
698
|
-
|
|
699
|
-
ERR_STATIC const char* ERR_getErrorString(ERR_enum code)
|
|
700
|
-
{
|
|
701
|
-
static const char* notErrorCode = "Unspecified error code";
|
|
702
|
-
switch( code )
|
|
703
|
-
{
|
|
704
|
-
case PREFIX(no_error): return "No error detected";
|
|
705
|
-
case PREFIX(GENERIC): return "Error (generic)";
|
|
706
|
-
case PREFIX(prefix_unknown): return "Unknown frame descriptor";
|
|
707
|
-
case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter";
|
|
708
|
-
case PREFIX(frameParameter_unsupportedBy32bits): return "Frame parameter unsupported in 32-bits mode";
|
|
709
|
-
case PREFIX(compressionParameter_unsupported): return "Compression parameter is out of bound";
|
|
710
|
-
case PREFIX(init_missing): return "Context should be init first";
|
|
711
|
-
case PREFIX(memory_allocation): return "Allocation error : not enough memory";
|
|
712
|
-
case PREFIX(stage_wrong): return "Operation not authorized at current processing stage";
|
|
713
|
-
case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
|
|
714
|
-
case PREFIX(srcSize_wrong): return "Src size incorrect";
|
|
715
|
-
case PREFIX(corruption_detected): return "Corrupted block detected";
|
|
716
|
-
case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported";
|
|
717
|
-
case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large";
|
|
718
|
-
case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";
|
|
719
|
-
case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";
|
|
720
|
-
case PREFIX(maxCode):
|
|
721
|
-
default: return notErrorCode;
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
726
|
-
{
|
|
727
|
-
return ERR_getErrorString(ERR_getErrorCode(code));
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
#if defined (__cplusplus)
|
|
731
|
-
}
|
|
732
|
-
#endif
|
|
733
|
-
|
|
734
|
-
#endif /* ERROR_H_MODULE */
|
|
735
409
|
/*
|
|
736
410
|
zstd_internal - common functions to include
|
|
737
411
|
Header File for include
|
|
@@ -777,19 +451,6 @@ ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
|
777
451
|
/*-*************************************
|
|
778
452
|
* Common constants
|
|
779
453
|
***************************************/
|
|
780
|
-
#define ZSTDv06_OPT_DEBUG 0 // 3 = compression stats; 5 = check encoded sequences; 9 = full logs
|
|
781
|
-
#include <stdio.h>
|
|
782
|
-
#if defined(ZSTDv06_OPT_DEBUG) && ZSTDv06_OPT_DEBUG>=9
|
|
783
|
-
#define ZSTDv06_LOG_PARSER(...) printf(__VA_ARGS__)
|
|
784
|
-
#define ZSTDv06_LOG_ENCODE(...) printf(__VA_ARGS__)
|
|
785
|
-
#define ZSTDv06_LOG_BLOCK(...) printf(__VA_ARGS__)
|
|
786
|
-
#else
|
|
787
|
-
#define ZSTDv06_LOG_PARSER(...)
|
|
788
|
-
#define ZSTDv06_LOG_ENCODE(...)
|
|
789
|
-
#define ZSTDv06_LOG_BLOCK(...)
|
|
790
|
-
#endif
|
|
791
|
-
|
|
792
|
-
#define ZSTDv06_OPT_NUM (1<<12)
|
|
793
454
|
#define ZSTDv06_DICT_MAGIC 0xEC30A436
|
|
794
455
|
|
|
795
456
|
#define ZSTDv06_REP_NUM 3
|
|
@@ -845,6 +506,8 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|
|
845
506
|
#define FSEv06_ENCODING_STATIC 2
|
|
846
507
|
#define FSEv06_ENCODING_DYNAMIC 3
|
|
847
508
|
|
|
509
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
|
510
|
+
|
|
848
511
|
static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
849
512
|
1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9,10,11,12,
|
|
850
513
|
13,14,15,16 };
|
|
@@ -877,7 +540,7 @@ static void ZSTDv06_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
|
877
540
|
/*! ZSTDv06_wildcopy() :
|
|
878
541
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
|
879
542
|
#define WILDCOPY_OVERLENGTH 8
|
|
880
|
-
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src,
|
|
543
|
+
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
|
881
544
|
{
|
|
882
545
|
const BYTE* ip = (const BYTE*)src;
|
|
883
546
|
BYTE* op = (BYTE*)dst;
|
|
@@ -887,27 +550,6 @@ MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src, size_t length)
|
|
|
887
550
|
while (op < oend);
|
|
888
551
|
}
|
|
889
552
|
|
|
890
|
-
MEM_STATIC unsigned ZSTDv06_highbit(U32 val)
|
|
891
|
-
{
|
|
892
|
-
# if defined(_MSC_VER) /* Visual */
|
|
893
|
-
unsigned long r=0;
|
|
894
|
-
_BitScanReverse(&r, val);
|
|
895
|
-
return (unsigned)r;
|
|
896
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
|
|
897
|
-
return 31 - __builtin_clz(val);
|
|
898
|
-
# else /* Software version */
|
|
899
|
-
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 };
|
|
900
|
-
U32 v = val;
|
|
901
|
-
int r;
|
|
902
|
-
v |= v >> 1;
|
|
903
|
-
v |= v >> 2;
|
|
904
|
-
v |= v >> 4;
|
|
905
|
-
v |= v >> 8;
|
|
906
|
-
v |= v >> 16;
|
|
907
|
-
r = DeBruijnClz[(U32)(v * 0x07C4ACDDU) >> 27];
|
|
908
|
-
return r;
|
|
909
|
-
# endif
|
|
910
|
-
}
|
|
911
553
|
|
|
912
554
|
|
|
913
555
|
/*-*******************************************
|
|
@@ -926,15 +568,7 @@ typedef struct {
|
|
|
926
568
|
U32 rep[ZSTDv06_REP_INIT];
|
|
927
569
|
} ZSTDv06_optimal_t;
|
|
928
570
|
|
|
929
|
-
|
|
930
|
-
#include ".debug/zstd_stats.h"
|
|
931
|
-
#else
|
|
932
|
-
typedef struct { U32 unused; } ZSTDv06_stats_t;
|
|
933
|
-
MEM_STATIC void ZSTDv06_statsPrint(ZSTDv06_stats_t* stats, U32 searchLength) { (void)stats; (void)searchLength; }
|
|
934
|
-
MEM_STATIC void ZSTDv06_statsInit(ZSTDv06_stats_t* stats) { (void)stats; }
|
|
935
|
-
MEM_STATIC void ZSTDv06_statsResetFreqs(ZSTDv06_stats_t* stats) { (void)stats; }
|
|
936
|
-
MEM_STATIC void ZSTDv06_statsUpdatePrices(ZSTDv06_stats_t* stats, size_t litLength, const BYTE* literals, size_t offset, size_t matchLength) { (void)stats; (void)litLength; (void)literals; (void)offset; (void)matchLength; }
|
|
937
|
-
#endif
|
|
571
|
+
typedef struct { U32 unused; } ZSTDv06_stats_t;
|
|
938
572
|
|
|
939
573
|
typedef struct {
|
|
940
574
|
void* buffer;
|
|
@@ -1207,16 +841,6 @@ MEM_STATIC BITv06_DStream_status BITv06_reloadDStream(BITv06_DStream_t* bitD);
|
|
|
1207
841
|
MEM_STATIC unsigned BITv06_endOfDStream(const BITv06_DStream_t* bitD);
|
|
1208
842
|
|
|
1209
843
|
|
|
1210
|
-
/* Start by invoking BITv06_initDStream().
|
|
1211
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
1212
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
1213
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
1214
|
-
* Local register is explicitly reloaded from memory by the BITv06_reloadDStream() method.
|
|
1215
|
-
* A reload guarantee a minimum of ((8*sizeof(bitD->bitContainer))-7) bits when its result is BITv06_DStream_unfinished.
|
|
1216
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
1217
|
-
* Checking if DStream has reached its end can be performed with BITv06_endOfDStream().
|
|
1218
|
-
*/
|
|
1219
|
-
|
|
1220
844
|
|
|
1221
845
|
/*-****************************************
|
|
1222
846
|
* unsafe API
|
|
@@ -1229,14 +853,14 @@ MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, unsigned nbBits);
|
|
|
1229
853
|
/*-**************************************************************
|
|
1230
854
|
* Internal functions
|
|
1231
855
|
****************************************************************/
|
|
1232
|
-
MEM_STATIC unsigned BITv06_highbit32 (
|
|
856
|
+
MEM_STATIC unsigned BITv06_highbit32 ( U32 val)
|
|
1233
857
|
{
|
|
1234
858
|
# if defined(_MSC_VER) /* Visual */
|
|
1235
859
|
unsigned long r=0;
|
|
1236
860
|
_BitScanReverse ( &r, val );
|
|
1237
861
|
return (unsigned) r;
|
|
1238
862
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
1239
|
-
return
|
|
863
|
+
return __builtin_clz (val) ^ 31;
|
|
1240
864
|
# else /* Software version */
|
|
1241
865
|
static const unsigned 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 };
|
|
1242
866
|
U32 v = val;
|
|
@@ -1251,9 +875,6 @@ MEM_STATIC unsigned BITv06_highbit32 (register U32 val)
|
|
|
1251
875
|
# endif
|
|
1252
876
|
}
|
|
1253
877
|
|
|
1254
|
-
/*===== Local Constants =====*/
|
|
1255
|
-
static const unsigned BITv06_mask[] = { 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF }; /* up to 26 bits */
|
|
1256
|
-
|
|
1257
878
|
|
|
1258
879
|
|
|
1259
880
|
/*-********************************************************
|
|
@@ -1282,13 +903,13 @@ MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuff
|
|
|
1282
903
|
bitD->bitContainer = *(const BYTE*)(bitD->start);
|
|
1283
904
|
switch(srcSize)
|
|
1284
905
|
{
|
|
1285
|
-
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16)
|
|
1286
|
-
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24)
|
|
1287
|
-
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32)
|
|
1288
|
-
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24;
|
|
1289
|
-
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16;
|
|
1290
|
-
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8;
|
|
1291
|
-
default
|
|
906
|
+
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);/* fall-through */
|
|
907
|
+
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);/* fall-through */
|
|
908
|
+
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);/* fall-through */
|
|
909
|
+
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; /* fall-through */
|
|
910
|
+
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; /* fall-through */
|
|
911
|
+
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8; /* fall-through */
|
|
912
|
+
default: break;
|
|
1292
913
|
}
|
|
1293
914
|
{ BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1];
|
|
1294
915
|
if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */
|
|
@@ -1299,45 +920,11 @@ MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuff
|
|
|
1299
920
|
return srcSize;
|
|
1300
921
|
}
|
|
1301
922
|
|
|
1302
|
-
MEM_STATIC size_t BITv06_getUpperBits(size_t bitContainer, U32 const start)
|
|
1303
|
-
{
|
|
1304
|
-
return bitContainer >> start;
|
|
1305
|
-
}
|
|
1306
923
|
|
|
1307
|
-
MEM_STATIC size_t BITv06_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits)
|
|
1308
|
-
{
|
|
1309
|
-
#if defined(__BMI__) && defined(__GNUC__) /* experimental */
|
|
1310
|
-
# if defined(__x86_64__)
|
|
1311
|
-
if (sizeof(bitContainer)==8)
|
|
1312
|
-
return _bextr_u64(bitContainer, start, nbBits);
|
|
1313
|
-
else
|
|
1314
|
-
# endif
|
|
1315
|
-
return _bextr_u32(bitContainer, start, nbBits);
|
|
1316
|
-
#else
|
|
1317
|
-
return (bitContainer >> start) & BITv06_mask[nbBits];
|
|
1318
|
-
#endif
|
|
1319
|
-
}
|
|
1320
|
-
|
|
1321
|
-
MEM_STATIC size_t BITv06_getLowerBits(size_t bitContainer, U32 const nbBits)
|
|
1322
|
-
{
|
|
1323
|
-
return bitContainer & BITv06_mask[nbBits];
|
|
1324
|
-
}
|
|
1325
|
-
|
|
1326
|
-
/*! BITv06_lookBits() :
|
|
1327
|
-
* Provides next n bits from local register.
|
|
1328
|
-
* local register is not modified.
|
|
1329
|
-
* On 32-bits, maxNbBits==24.
|
|
1330
|
-
* On 64-bits, maxNbBits==56.
|
|
1331
|
-
* @return : value extracted
|
|
1332
|
-
*/
|
|
1333
924
|
MEM_STATIC size_t BITv06_lookBits(const BITv06_DStream_t* bitD, U32 nbBits)
|
|
1334
925
|
{
|
|
1335
|
-
#if defined(__BMI__) && defined(__GNUC__) /* experimental; fails if bitD->bitsConsumed + nbBits > sizeof(bitD->bitContainer)*8 */
|
|
1336
|
-
return BITv06_getMiddleBits(bitD->bitContainer, (sizeof(bitD->bitContainer)*8) - bitD->bitsConsumed - nbBits, nbBits);
|
|
1337
|
-
#else
|
|
1338
926
|
U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
1339
927
|
return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
|
|
1340
|
-
#endif
|
|
1341
928
|
}
|
|
1342
929
|
|
|
1343
930
|
/*! BITv06_lookBitsFast() :
|
|
@@ -1353,11 +940,6 @@ MEM_STATIC void BITv06_skipBits(BITv06_DStream_t* bitD, U32 nbBits)
|
|
|
1353
940
|
bitD->bitsConsumed += nbBits;
|
|
1354
941
|
}
|
|
1355
942
|
|
|
1356
|
-
/*! BITv06_readBits() :
|
|
1357
|
-
* Read (consume) next n bits from local register and update.
|
|
1358
|
-
* Pay attention to not read more than nbBits contained into local register.
|
|
1359
|
-
* @return : extracted value.
|
|
1360
|
-
*/
|
|
1361
943
|
MEM_STATIC size_t BITv06_readBits(BITv06_DStream_t* bitD, U32 nbBits)
|
|
1362
944
|
{
|
|
1363
945
|
size_t const value = BITv06_lookBits(bitD, nbBits);
|
|
@@ -1374,15 +956,10 @@ MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, U32 nbBits)
|
|
|
1374
956
|
return value;
|
|
1375
957
|
}
|
|
1376
958
|
|
|
1377
|
-
/*! BITv06_reloadDStream() :
|
|
1378
|
-
* Refill `BITv06_DStream_t` from src buffer previously defined (see BITv06_initDStream() ).
|
|
1379
|
-
* This function is safe, it guarantees it will not read beyond src buffer.
|
|
1380
|
-
* @return : status of `BITv06_DStream_t` internal register.
|
|
1381
|
-
if status == unfinished, internal register is filled with >= (sizeof(bitD->bitContainer)*8 - 7) bits */
|
|
1382
959
|
MEM_STATIC BITv06_DStream_status BITv06_reloadDStream(BITv06_DStream_t* bitD)
|
|
1383
960
|
{
|
|
1384
|
-
|
|
1385
|
-
|
|
961
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
|
962
|
+
return BITv06_DStream_overflow;
|
|
1386
963
|
|
|
1387
964
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) {
|
|
1388
965
|
bitD->ptr -= bitD->bitsConsumed >> 3;
|
|
@@ -1501,57 +1078,6 @@ static void FSEv06_initDState(FSEv06_DState_t* DStatePtr, BITv06_DStream_t*
|
|
|
1501
1078
|
|
|
1502
1079
|
static unsigned char FSEv06_decodeSymbol(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD);
|
|
1503
1080
|
|
|
1504
|
-
static unsigned FSEv06_endOfDState(const FSEv06_DState_t* DStatePtr);
|
|
1505
|
-
|
|
1506
|
-
/*!
|
|
1507
|
-
Let's now decompose FSEv06_decompress_usingDTable() into its unitary components.
|
|
1508
|
-
You will decode FSE-encoded symbols from the bitStream,
|
|
1509
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
1510
|
-
|
|
1511
|
-
You will need a few variables to track your bitStream. They are :
|
|
1512
|
-
|
|
1513
|
-
BITv06_DStream_t DStream; // Stream context
|
|
1514
|
-
FSEv06_DState_t DState; // State context. Multiple ones are possible
|
|
1515
|
-
FSEv06_DTable* DTablePtr; // Decoding table, provided by FSEv06_buildDTable()
|
|
1516
|
-
|
|
1517
|
-
The first thing to do is to init the bitStream.
|
|
1518
|
-
errorCode = BITv06_initDStream(&DStream, srcBuffer, srcSize);
|
|
1519
|
-
|
|
1520
|
-
You should then retrieve your initial state(s)
|
|
1521
|
-
(in reverse flushing order if you have several ones) :
|
|
1522
|
-
errorCode = FSEv06_initDState(&DState, &DStream, DTablePtr);
|
|
1523
|
-
|
|
1524
|
-
You can then decode your data, symbol after symbol.
|
|
1525
|
-
For information the maximum number of bits read by FSEv06_decodeSymbol() is 'tableLog'.
|
|
1526
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
1527
|
-
unsigned char symbol = FSEv06_decodeSymbol(&DState, &DStream);
|
|
1528
|
-
|
|
1529
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
1530
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
1531
|
-
size_t bitField = BITv06_readBits(&DStream, nbBits);
|
|
1532
|
-
|
|
1533
|
-
All above operations only read from local register (which size depends on size_t).
|
|
1534
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
1535
|
-
endSignal = FSEv06_reloadDStream(&DStream);
|
|
1536
|
-
|
|
1537
|
-
BITv06_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
1538
|
-
BITv06_DStream_unfinished : there is still some data left into the DStream.
|
|
1539
|
-
BITv06_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
1540
|
-
BITv06_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
1541
|
-
BITv06_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
1542
|
-
|
|
1543
|
-
When reaching end of buffer (BITv06_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
1544
|
-
to properly detect the exact end of stream.
|
|
1545
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
1546
|
-
BITv06_reloadDStream(&DStream) >= BITv06_DStream_completed
|
|
1547
|
-
|
|
1548
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
1549
|
-
Checking if DStream has reached its end is performed by :
|
|
1550
|
-
BITv06_endOfDStream(&DStream);
|
|
1551
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
1552
|
-
FSEv06_endOfDState(&DState);
|
|
1553
|
-
*/
|
|
1554
|
-
|
|
1555
1081
|
|
|
1556
1082
|
/* *****************************************
|
|
1557
1083
|
* FSE unsafe API
|
|
@@ -1565,7 +1091,7 @@ static unsigned char FSEv06_decodeSymbolFast(FSEv06_DState_t* DStatePtr, BITv06_
|
|
|
1565
1091
|
*******************************************/
|
|
1566
1092
|
|
|
1567
1093
|
|
|
1568
|
-
|
|
1094
|
+
/* ====== Decompression ====== */
|
|
1569
1095
|
|
|
1570
1096
|
typedef struct {
|
|
1571
1097
|
U16 tableLog;
|
|
@@ -1626,11 +1152,6 @@ MEM_STATIC BYTE FSEv06_decodeSymbolFast(FSEv06_DState_t* DStatePtr, BITv06_DStre
|
|
|
1626
1152
|
return symbol;
|
|
1627
1153
|
}
|
|
1628
1154
|
|
|
1629
|
-
MEM_STATIC unsigned FSEv06_endOfDState(const FSEv06_DState_t* DStatePtr)
|
|
1630
|
-
{
|
|
1631
|
-
return DStatePtr->state == 0;
|
|
1632
|
-
}
|
|
1633
|
-
|
|
1634
1155
|
|
|
1635
1156
|
|
|
1636
1157
|
#ifndef FSEv06_COMMONDEFS_ONLY
|
|
@@ -1731,9 +1252,7 @@ const char* FSEv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
|
|
|
1731
1252
|
/* **************************************************************
|
|
1732
1253
|
* HUF Error Management
|
|
1733
1254
|
****************************************************************/
|
|
1734
|
-
unsigned HUFv06_isError(size_t code) { return ERR_isError(code); }
|
|
1735
|
-
|
|
1736
|
-
const char* HUFv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
|
|
1255
|
+
static unsigned HUFv06_isError(size_t code) { return ERR_isError(code); }
|
|
1737
1256
|
|
|
1738
1257
|
|
|
1739
1258
|
/*-**************************************************************
|
|
@@ -1876,12 +1395,15 @@ size_t FSEv06_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned
|
|
|
1876
1395
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
1877
1396
|
# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
|
|
1878
1397
|
#else
|
|
1879
|
-
#
|
|
1880
|
-
#
|
|
1881
|
-
#
|
|
1398
|
+
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
|
1399
|
+
# ifdef __GNUC__
|
|
1400
|
+
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
1401
|
+
# else
|
|
1402
|
+
# define FORCE_INLINE static inline
|
|
1403
|
+
# endif
|
|
1882
1404
|
# else
|
|
1883
|
-
# define FORCE_INLINE static
|
|
1884
|
-
# endif
|
|
1405
|
+
# define FORCE_INLINE static
|
|
1406
|
+
# endif /* __STDC_VERSION__ */
|
|
1885
1407
|
#endif
|
|
1886
1408
|
|
|
1887
1409
|
|
|
@@ -2335,10 +1857,12 @@ MEM_STATIC size_t HUFv06_readStats(BYTE* huffWeight, size_t hwSize, U32* rankSta
|
|
|
2335
1857
|
{
|
|
2336
1858
|
U32 weightTotal;
|
|
2337
1859
|
const BYTE* ip = (const BYTE*) src;
|
|
2338
|
-
size_t iSize
|
|
1860
|
+
size_t iSize;
|
|
2339
1861
|
size_t oSize;
|
|
2340
1862
|
|
|
2341
|
-
|
|
1863
|
+
if (!srcSize) return ERROR(srcSize_wrong);
|
|
1864
|
+
iSize = ip[0];
|
|
1865
|
+
/* memset(huffWeight, 0, hwSize); */ /* is not necessary, even though some analyzer complain ... */
|
|
2342
1866
|
|
|
2343
1867
|
if (iSize >= 128) { /* special header */
|
|
2344
1868
|
if (iSize >= (242)) { /* RLE */
|
|
@@ -2372,6 +1896,7 @@ MEM_STATIC size_t HUFv06_readStats(BYTE* huffWeight, size_t hwSize, U32* rankSta
|
|
|
2372
1896
|
rankStats[huffWeight[n]]++;
|
|
2373
1897
|
weightTotal += (1 << huffWeight[n]) >> 1;
|
|
2374
1898
|
} }
|
|
1899
|
+
if (weightTotal == 0) return ERROR(corruption_detected);
|
|
2375
1900
|
|
|
2376
1901
|
/* get last non-null symbol weight (implied, total must be 2^n) */
|
|
2377
1902
|
{ U32 const tableLog = BITv06_highbit32(weightTotal) + 1;
|
|
@@ -2449,14 +1974,7 @@ MEM_STATIC size_t HUFv06_readStats(BYTE* huffWeight, size_t hwSize, U32* rankSta
|
|
|
2449
1974
|
|
|
2450
1975
|
|
|
2451
1976
|
#ifdef _MSC_VER /* Visual Studio */
|
|
2452
|
-
# define FORCE_INLINE static __forceinline
|
|
2453
1977
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
2454
|
-
#else
|
|
2455
|
-
# ifdef __GNUC__
|
|
2456
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
2457
|
-
# else
|
|
2458
|
-
# define FORCE_INLINE static inline
|
|
2459
|
-
# endif
|
|
2460
1978
|
#endif
|
|
2461
1979
|
|
|
2462
1980
|
|
|
@@ -2496,7 +2014,7 @@ size_t HUFv06_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
|
|
|
2496
2014
|
HUFv06_DEltX2* const dt = (HUFv06_DEltX2*)dtPtr;
|
|
2497
2015
|
|
|
2498
2016
|
HUFv06_STATIC_ASSERT(sizeof(HUFv06_DEltX2) == sizeof(U16)); /* if compilation fails here, assertion is false */
|
|
2499
|
-
|
|
2017
|
+
/* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2500
2018
|
|
|
2501
2019
|
iSize = HUFv06_readStats(huffWeight, HUFv06_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
|
|
2502
2020
|
if (HUFv06_isError(iSize)) return iSize;
|
|
@@ -2822,7 +2340,7 @@ size_t HUFv06_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
|
|
|
2822
2340
|
|
|
2823
2341
|
HUFv06_STATIC_ASSERT(sizeof(HUFv06_DEltX4) == sizeof(U32)); /* if compilation fails here, assertion is false */
|
|
2824
2342
|
if (memLog > HUFv06_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
|
|
2825
|
-
|
|
2343
|
+
/* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2826
2344
|
|
|
2827
2345
|
iSize = HUFv06_readStats(weightList, HUFv06_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
|
|
2828
2346
|
if (HUFv06_isError(iSize)) return iSize;
|
|
@@ -3146,13 +2664,13 @@ size_t HUFv06_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
|
3146
2664
|
|
|
3147
2665
|
{ U32 algoNb = 0;
|
|
3148
2666
|
if (Dtime[1] < Dtime[0]) algoNb = 1;
|
|
3149
|
-
|
|
2667
|
+
/* if (Dtime[2] < Dtime[algoNb]) algoNb = 2; */ /* current speed of HUFv06_decompress4X6 is not good */
|
|
3150
2668
|
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
|
3151
2669
|
}
|
|
3152
2670
|
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
2671
|
+
/* return HUFv06_decompress4X2(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams single-symbol decoding */
|
|
2672
|
+
/* return HUFv06_decompress4X4(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams double-symbols decoding */
|
|
2673
|
+
/* return HUFv06_decompress4X6(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams quad-symbols decoding */
|
|
3156
2674
|
}
|
|
3157
2675
|
/*
|
|
3158
2676
|
Common functions of Zstd compression library
|
|
@@ -3201,14 +2719,6 @@ unsigned ZSTDv06_isError(size_t code) { return ERR_isError(code); }
|
|
|
3201
2719
|
* provides error code string from function result (useful for debugging) */
|
|
3202
2720
|
const char* ZSTDv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
|
|
3203
2721
|
|
|
3204
|
-
/*! ZSTDv06_getError() :
|
|
3205
|
-
* convert a `size_t` function result into a proper ZSTDv06_errorCode enum */
|
|
3206
|
-
ZSTDv06_ErrorCode ZSTDv06_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
|
|
3207
|
-
|
|
3208
|
-
/*! ZSTDv06_getErrorString() :
|
|
3209
|
-
* provides error code string from enum */
|
|
3210
|
-
const char* ZSTDv06_getErrorString(ZSTDv06_ErrorCode code) { return ERR_getErrorName(code); }
|
|
3211
|
-
|
|
3212
2722
|
|
|
3213
2723
|
/* **************************************************************
|
|
3214
2724
|
* ZBUFF Error Management
|
|
@@ -3265,16 +2775,9 @@ const char* ZBUFFv06_getErrorName(size_t errorCode) { return ERR_getErrorName(er
|
|
|
3265
2775
|
* Compiler specifics
|
|
3266
2776
|
*********************************************************/
|
|
3267
2777
|
#ifdef _MSC_VER /* Visual Studio */
|
|
3268
|
-
# define FORCE_INLINE static __forceinline
|
|
3269
2778
|
# include <intrin.h> /* For Visual 2005 */
|
|
3270
2779
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
3271
2780
|
# pragma warning(disable : 4324) /* disable: C4324: padded structure */
|
|
3272
|
-
#else
|
|
3273
|
-
# ifdef __GNUC__
|
|
3274
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
3275
|
-
# else
|
|
3276
|
-
# define FORCE_INLINE static inline
|
|
3277
|
-
# endif
|
|
3278
2781
|
#endif
|
|
3279
2782
|
|
|
3280
2783
|
|
|
@@ -3315,13 +2818,13 @@ struct ZSTDv06_DCtx_s
|
|
|
3315
2818
|
ZSTDv06_dStage stage;
|
|
3316
2819
|
U32 flagRepeatTable;
|
|
3317
2820
|
const BYTE* litPtr;
|
|
3318
|
-
size_t litBufSize;
|
|
3319
2821
|
size_t litSize;
|
|
3320
2822
|
BYTE litBuffer[ZSTDv06_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
|
|
3321
2823
|
BYTE headerBuffer[ZSTDv06_FRAMEHEADERSIZE_MAX];
|
|
3322
2824
|
}; /* typedef'd to ZSTDv06_DCtx within "zstd_static.h" */
|
|
3323
2825
|
|
|
3324
|
-
size_t ZSTDv06_sizeofDCtx (void)
|
|
2826
|
+
size_t ZSTDv06_sizeofDCtx (void); /* Hidden declaration */
|
|
2827
|
+
size_t ZSTDv06_sizeofDCtx (void) { return sizeof(ZSTDv06_DCtx); }
|
|
3325
2828
|
|
|
3326
2829
|
size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx)
|
|
3327
2830
|
{
|
|
@@ -3507,7 +3010,7 @@ size_t ZSTDv06_getFrameParams(ZSTDv06_frameParams* fparamsPtr, const void* src,
|
|
|
3507
3010
|
static size_t ZSTDv06_decodeFrameHeader(ZSTDv06_DCtx* zc, const void* src, size_t srcSize)
|
|
3508
3011
|
{
|
|
3509
3012
|
size_t const result = ZSTDv06_getFrameParams(&(zc->fParams), src, srcSize);
|
|
3510
|
-
if ((MEM_32bits()) && (zc->fParams.windowLog > 25)) return ERROR(
|
|
3013
|
+
if ((MEM_32bits()) && (zc->fParams.windowLog > 25)) return ERROR(frameParameter_unsupported);
|
|
3511
3014
|
return result;
|
|
3512
3015
|
}
|
|
3513
3016
|
|
|
@@ -3520,7 +3023,7 @@ typedef struct
|
|
|
3520
3023
|
|
|
3521
3024
|
/*! ZSTDv06_getcBlockSize() :
|
|
3522
3025
|
* Provides the size of compressed block from block header `src` */
|
|
3523
|
-
size_t ZSTDv06_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
3026
|
+
static size_t ZSTDv06_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
3524
3027
|
{
|
|
3525
3028
|
const BYTE* const in = (const BYTE* const)src;
|
|
3526
3029
|
U32 cSize;
|
|
@@ -3539,6 +3042,7 @@ size_t ZSTDv06_getcBlockSize(const void* src, size_t srcSize, blockProperties_t*
|
|
|
3539
3042
|
|
|
3540
3043
|
static size_t ZSTDv06_copyRawBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
|
3541
3044
|
{
|
|
3045
|
+
if (dst==NULL) return ERROR(dstSize_tooSmall);
|
|
3542
3046
|
if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
|
|
3543
3047
|
memcpy(dst, src, srcSize);
|
|
3544
3048
|
return srcSize;
|
|
@@ -3547,7 +3051,7 @@ static size_t ZSTDv06_copyRawBlock(void* dst, size_t dstCapacity, const void* sr
|
|
|
3547
3051
|
|
|
3548
3052
|
/*! ZSTDv06_decodeLiteralsBlock() :
|
|
3549
3053
|
@return : nb of bytes read from src (< srcSize ) */
|
|
3550
|
-
size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3054
|
+
static size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3551
3055
|
const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
|
|
3552
3056
|
{
|
|
3553
3057
|
const BYTE* const istart = (const BYTE*) src;
|
|
@@ -3592,8 +3096,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3592
3096
|
return ERROR(corruption_detected);
|
|
3593
3097
|
|
|
3594
3098
|
dctx->litPtr = dctx->litBuffer;
|
|
3595
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8;
|
|
3596
3099
|
dctx->litSize = litSize;
|
|
3100
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3597
3101
|
return litCSize + lhSize;
|
|
3598
3102
|
}
|
|
3599
3103
|
case IS_PCH:
|
|
@@ -3608,13 +3112,14 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3608
3112
|
lhSize=3;
|
|
3609
3113
|
litSize = ((istart[0] & 15) << 6) + (istart[1] >> 2);
|
|
3610
3114
|
litCSize = ((istart[1] & 3) << 8) + istart[2];
|
|
3115
|
+
if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
|
|
3611
3116
|
|
|
3612
3117
|
{ size_t const errorCode = HUFv06_decompress1X4_usingDTable(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->hufTableX4);
|
|
3613
3118
|
if (HUFv06_isError(errorCode)) return ERROR(corruption_detected);
|
|
3614
3119
|
}
|
|
3615
3120
|
dctx->litPtr = dctx->litBuffer;
|
|
3616
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH;
|
|
3617
3121
|
dctx->litSize = litSize;
|
|
3122
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3618
3123
|
return litCSize + lhSize;
|
|
3619
3124
|
}
|
|
3620
3125
|
case IS_RAW:
|
|
@@ -3638,13 +3143,12 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3638
3143
|
if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
|
|
3639
3144
|
memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
|
3640
3145
|
dctx->litPtr = dctx->litBuffer;
|
|
3641
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8;
|
|
3642
3146
|
dctx->litSize = litSize;
|
|
3147
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3643
3148
|
return lhSize+litSize;
|
|
3644
3149
|
}
|
|
3645
3150
|
/* direct reference into compressed stream */
|
|
3646
3151
|
dctx->litPtr = istart+lhSize;
|
|
3647
|
-
dctx->litBufSize = srcSize-lhSize;
|
|
3648
3152
|
dctx->litSize = litSize;
|
|
3649
3153
|
return lhSize+litSize;
|
|
3650
3154
|
}
|
|
@@ -3666,9 +3170,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3666
3170
|
break;
|
|
3667
3171
|
}
|
|
3668
3172
|
if (litSize > ZSTDv06_BLOCKSIZE_MAX) return ERROR(corruption_detected);
|
|
3669
|
-
memset(dctx->litBuffer, istart[lhSize], litSize);
|
|
3173
|
+
memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
|
3670
3174
|
dctx->litPtr = dctx->litBuffer;
|
|
3671
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH;
|
|
3672
3175
|
dctx->litSize = litSize;
|
|
3673
3176
|
return lhSize+1;
|
|
3674
3177
|
}
|
|
@@ -3682,7 +3185,7 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3682
3185
|
@return : nb bytes read from src,
|
|
3683
3186
|
or an error code if it fails, testable with ZSTDv06_isError()
|
|
3684
3187
|
*/
|
|
3685
|
-
size_t ZSTDv06_buildSeqTable(FSEv06_DTable* DTable, U32 type, U32 max, U32 maxLog,
|
|
3188
|
+
static size_t ZSTDv06_buildSeqTable(FSEv06_DTable* DTable, U32 type, U32 max, U32 maxLog,
|
|
3686
3189
|
const void* src, size_t srcSize,
|
|
3687
3190
|
const S16* defaultNorm, U32 defaultLog, U32 flagRepeatTable)
|
|
3688
3191
|
{
|
|
@@ -3712,7 +3215,7 @@ size_t ZSTDv06_buildSeqTable(FSEv06_DTable* DTable, U32 type, U32 max, U32 maxLo
|
|
|
3712
3215
|
}
|
|
3713
3216
|
|
|
3714
3217
|
|
|
3715
|
-
size_t ZSTDv06_decodeSeqHeaders(int* nbSeqPtr,
|
|
3218
|
+
static size_t ZSTDv06_decodeSeqHeaders(int* nbSeqPtr,
|
|
3716
3219
|
FSEv06_DTable* DTableLL, FSEv06_DTable* DTableML, FSEv06_DTable* DTableOffb, U32 flagRepeatTable,
|
|
3717
3220
|
const void* src, size_t srcSize)
|
|
3718
3221
|
{
|
|
@@ -3727,23 +3230,24 @@ size_t ZSTDv06_decodeSeqHeaders(int* nbSeqPtr,
|
|
|
3727
3230
|
{ int nbSeq = *ip++;
|
|
3728
3231
|
if (!nbSeq) { *nbSeqPtr=0; return 1; }
|
|
3729
3232
|
if (nbSeq > 0x7F) {
|
|
3730
|
-
if (nbSeq == 0xFF)
|
|
3233
|
+
if (nbSeq == 0xFF) {
|
|
3234
|
+
if (ip+2 > iend) return ERROR(srcSize_wrong);
|
|
3731
3235
|
nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
|
|
3732
|
-
else
|
|
3236
|
+
} else {
|
|
3237
|
+
if (ip >= iend) return ERROR(srcSize_wrong);
|
|
3733
3238
|
nbSeq = ((nbSeq-0x80)<<8) + *ip++;
|
|
3239
|
+
}
|
|
3734
3240
|
}
|
|
3735
3241
|
*nbSeqPtr = nbSeq;
|
|
3736
3242
|
}
|
|
3737
3243
|
|
|
3738
3244
|
/* FSE table descriptors */
|
|
3245
|
+
if (ip + 4 > iend) return ERROR(srcSize_wrong); /* min : header byte + all 3 are "raw", hence no header, but at least xxLog bits per type */
|
|
3739
3246
|
{ U32 const LLtype = *ip >> 6;
|
|
3740
3247
|
U32 const Offtype = (*ip >> 4) & 3;
|
|
3741
3248
|
U32 const MLtype = (*ip >> 2) & 3;
|
|
3742
3249
|
ip++;
|
|
3743
3250
|
|
|
3744
|
-
/* check */
|
|
3745
|
-
if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
|
|
3746
|
-
|
|
3747
3251
|
/* Build DTables */
|
|
3748
3252
|
{ size_t const bhSize = ZSTDv06_buildSeqTable(DTableLL, LLtype, MaxLL, LLFSELog, ip, iend-ip, LL_defaultNorm, LL_defaultNormLog, flagRepeatTable);
|
|
3749
3253
|
if (ZSTDv06_isError(bhSize)) return ERROR(corruption_detected);
|
|
@@ -3854,9 +3358,9 @@ static void ZSTDv06_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3854
3358
|
}
|
|
3855
3359
|
|
|
3856
3360
|
|
|
3857
|
-
size_t ZSTDv06_execSequence(BYTE* op,
|
|
3361
|
+
static size_t ZSTDv06_execSequence(BYTE* op,
|
|
3858
3362
|
BYTE* const oend, seq_t sequence,
|
|
3859
|
-
const BYTE** litPtr, const BYTE* const
|
|
3363
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
|
3860
3364
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
|
3861
3365
|
{
|
|
3862
3366
|
BYTE* const oLitEnd = op + sequence.litLength;
|
|
@@ -3869,7 +3373,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
|
3869
3373
|
/* check */
|
|
3870
3374
|
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
|
|
3871
3375
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
|
3872
|
-
if (iLitEnd >
|
|
3376
|
+
if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
|
|
3873
3377
|
|
|
3874
3378
|
/* copy Literals */
|
|
3875
3379
|
ZSTDv06_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
|
@@ -3891,13 +3395,18 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
|
3891
3395
|
op = oLitEnd + length1;
|
|
3892
3396
|
sequence.matchLength -= length1;
|
|
3893
3397
|
match = base;
|
|
3398
|
+
if (op > oend_8 || sequence.matchLength < MINMATCH) {
|
|
3399
|
+
while (op < oMatchEnd) *op++ = *match++;
|
|
3400
|
+
return sequenceLength;
|
|
3401
|
+
}
|
|
3894
3402
|
} }
|
|
3403
|
+
/* Requirement: op <= oend_8 */
|
|
3895
3404
|
|
|
3896
3405
|
/* match within prefix */
|
|
3897
3406
|
if (sequence.offset < 8) {
|
|
3898
3407
|
/* close range match, overlap */
|
|
3899
3408
|
static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
|
3900
|
-
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /*
|
|
3409
|
+
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
|
|
3901
3410
|
int const sub2 = dec64table[sequence.offset];
|
|
3902
3411
|
op[0] = match[0];
|
|
3903
3412
|
op[1] = match[1];
|
|
@@ -3919,7 +3428,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
|
3919
3428
|
}
|
|
3920
3429
|
while (op < oMatchEnd) *op++ = *match++;
|
|
3921
3430
|
} else {
|
|
3922
|
-
ZSTDv06_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3431
|
+
ZSTDv06_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3923
3432
|
}
|
|
3924
3433
|
return sequenceLength;
|
|
3925
3434
|
}
|
|
@@ -3936,7 +3445,6 @@ static size_t ZSTDv06_decompressSequences(
|
|
|
3936
3445
|
BYTE* const oend = ostart + maxDstSize;
|
|
3937
3446
|
BYTE* op = ostart;
|
|
3938
3447
|
const BYTE* litPtr = dctx->litPtr;
|
|
3939
|
-
const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8;
|
|
3940
3448
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
|
3941
3449
|
FSEv06_DTable* DTableLL = dctx->LLTable;
|
|
3942
3450
|
FSEv06_DTable* DTableML = dctx->MLTable;
|
|
@@ -3980,7 +3488,7 @@ static size_t ZSTDv06_decompressSequences(
|
|
|
3980
3488
|
pos, (U32)sequence.litLength, (U32)sequence.matchLength, (U32)sequence.offset);
|
|
3981
3489
|
#endif
|
|
3982
3490
|
|
|
3983
|
-
{ size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr,
|
|
3491
|
+
{ size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
|
3984
3492
|
if (ZSTDv06_isError(oneSeqSize)) return oneSeqSize;
|
|
3985
3493
|
op += oneSeqSize;
|
|
3986
3494
|
} }
|
|
@@ -3993,8 +3501,10 @@ static size_t ZSTDv06_decompressSequences(
|
|
|
3993
3501
|
{ size_t const lastLLSize = litEnd - litPtr;
|
|
3994
3502
|
if (litPtr > litEnd) return ERROR(corruption_detected); /* too many literals already used */
|
|
3995
3503
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3996
|
-
|
|
3997
|
-
|
|
3504
|
+
if (lastLLSize > 0) {
|
|
3505
|
+
memcpy(op, litPtr, lastLLSize);
|
|
3506
|
+
op += lastLLSize;
|
|
3507
|
+
}
|
|
3998
3508
|
}
|
|
3999
3509
|
|
|
4000
3510
|
return op-ostart;
|
|
@@ -4146,6 +3656,63 @@ size_t ZSTDv06_decompress(void* dst, size_t dstCapacity, const void* src, size_t
|
|
|
4146
3656
|
#endif
|
|
4147
3657
|
}
|
|
4148
3658
|
|
|
3659
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
|
3660
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
|
3661
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
|
3662
|
+
{
|
|
3663
|
+
*cSize = ret;
|
|
3664
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
|
3665
|
+
}
|
|
3666
|
+
|
|
3667
|
+
void ZSTDv06_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
|
3668
|
+
{
|
|
3669
|
+
const BYTE* ip = (const BYTE*)src;
|
|
3670
|
+
size_t remainingSize = srcSize;
|
|
3671
|
+
size_t nbBlocks = 0;
|
|
3672
|
+
blockProperties_t blockProperties = { bt_compressed, 0 };
|
|
3673
|
+
|
|
3674
|
+
/* Frame Header */
|
|
3675
|
+
{ size_t const frameHeaderSize = ZSTDv06_frameHeaderSize(src, srcSize);
|
|
3676
|
+
if (ZSTDv06_isError(frameHeaderSize)) {
|
|
3677
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, frameHeaderSize);
|
|
3678
|
+
return;
|
|
3679
|
+
}
|
|
3680
|
+
if (MEM_readLE32(src) != ZSTDv06_MAGICNUMBER) {
|
|
3681
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
|
3682
|
+
return;
|
|
3683
|
+
}
|
|
3684
|
+
if (srcSize < frameHeaderSize+ZSTDv06_blockHeaderSize) {
|
|
3685
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3686
|
+
return;
|
|
3687
|
+
}
|
|
3688
|
+
ip += frameHeaderSize; remainingSize -= frameHeaderSize;
|
|
3689
|
+
}
|
|
3690
|
+
|
|
3691
|
+
/* Loop on each block */
|
|
3692
|
+
while (1) {
|
|
3693
|
+
size_t const cBlockSize = ZSTDv06_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
3694
|
+
if (ZSTDv06_isError(cBlockSize)) {
|
|
3695
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
|
3696
|
+
return;
|
|
3697
|
+
}
|
|
3698
|
+
|
|
3699
|
+
ip += ZSTDv06_blockHeaderSize;
|
|
3700
|
+
remainingSize -= ZSTDv06_blockHeaderSize;
|
|
3701
|
+
if (cBlockSize > remainingSize) {
|
|
3702
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3703
|
+
return;
|
|
3704
|
+
}
|
|
3705
|
+
|
|
3706
|
+
if (cBlockSize == 0) break; /* bt_end */
|
|
3707
|
+
|
|
3708
|
+
ip += cBlockSize;
|
|
3709
|
+
remainingSize -= cBlockSize;
|
|
3710
|
+
nbBlocks++;
|
|
3711
|
+
}
|
|
3712
|
+
|
|
3713
|
+
*cSize = ip - (const BYTE*)src;
|
|
3714
|
+
*dBound = nbBlocks * ZSTDv06_BLOCKSIZE_MAX;
|
|
3715
|
+
}
|
|
4149
3716
|
|
|
4150
3717
|
/*_******************************
|
|
4151
3718
|
* Streaming Decompression API
|
|
@@ -4175,7 +3742,7 @@ size_t ZSTDv06_decompressContinue(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapac
|
|
|
4175
3742
|
return 0;
|
|
4176
3743
|
}
|
|
4177
3744
|
dctx->expected = 0; /* not necessary to copy more */
|
|
4178
|
-
|
|
3745
|
+
/* fall-through */
|
|
4179
3746
|
case ZSTDds_decodeFrameHeader:
|
|
4180
3747
|
{ size_t result;
|
|
4181
3748
|
memcpy(dctx->headerBuffer + ZSTDv06_frameHeaderSize_min, src, dctx->expected);
|
|
@@ -4247,9 +3814,10 @@ static size_t ZSTDv06_loadEntropy(ZSTDv06_DCtx* dctx, const void* dict, size_t d
|
|
|
4247
3814
|
dictSize -= hSize;
|
|
4248
3815
|
|
|
4249
3816
|
{ short offcodeNCount[MaxOff+1];
|
|
4250
|
-
U32 offcodeMaxValue=MaxOff, offcodeLog
|
|
3817
|
+
U32 offcodeMaxValue=MaxOff, offcodeLog;
|
|
4251
3818
|
offcodeHeaderSize = FSEv06_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dict, dictSize);
|
|
4252
3819
|
if (FSEv06_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
|
|
3820
|
+
if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
|
|
4253
3821
|
{ size_t const errorCode = FSEv06_buildDTable(dctx->OffTable, offcodeNCount, offcodeMaxValue, offcodeLog);
|
|
4254
3822
|
if (FSEv06_isError(errorCode)) return ERROR(dictionary_corrupted); }
|
|
4255
3823
|
dict = (const char*)dict + offcodeHeaderSize;
|
|
@@ -4257,9 +3825,10 @@ static size_t ZSTDv06_loadEntropy(ZSTDv06_DCtx* dctx, const void* dict, size_t d
|
|
|
4257
3825
|
}
|
|
4258
3826
|
|
|
4259
3827
|
{ short matchlengthNCount[MaxML+1];
|
|
4260
|
-
unsigned matchlengthMaxValue = MaxML, matchlengthLog
|
|
3828
|
+
unsigned matchlengthMaxValue = MaxML, matchlengthLog;
|
|
4261
3829
|
matchlengthHeaderSize = FSEv06_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dict, dictSize);
|
|
4262
3830
|
if (FSEv06_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
|
|
3831
|
+
if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
|
|
4263
3832
|
{ size_t const errorCode = FSEv06_buildDTable(dctx->MLTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog);
|
|
4264
3833
|
if (FSEv06_isError(errorCode)) return ERROR(dictionary_corrupted); }
|
|
4265
3834
|
dict = (const char*)dict + matchlengthHeaderSize;
|
|
@@ -4267,9 +3836,10 @@ static size_t ZSTDv06_loadEntropy(ZSTDv06_DCtx* dctx, const void* dict, size_t d
|
|
|
4267
3836
|
}
|
|
4268
3837
|
|
|
4269
3838
|
{ short litlengthNCount[MaxLL+1];
|
|
4270
|
-
unsigned litlengthMaxValue = MaxLL, litlengthLog
|
|
3839
|
+
unsigned litlengthMaxValue = MaxLL, litlengthLog;
|
|
4271
3840
|
litlengthHeaderSize = FSEv06_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dict, dictSize);
|
|
4272
3841
|
if (FSEv06_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
|
|
3842
|
+
if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
|
|
4273
3843
|
{ size_t const errorCode = FSEv06_buildDTable(dctx->LLTable, litlengthNCount, litlengthMaxValue, litlengthLog);
|
|
4274
3844
|
if (FSEv06_isError(errorCode)) return ERROR(dictionary_corrupted); }
|
|
4275
3845
|
}
|
|
@@ -4432,7 +4002,9 @@ size_t ZBUFFv06_decompressInit(ZBUFFv06_DCtx* zbd)
|
|
|
4432
4002
|
MEM_STATIC size_t ZBUFFv06_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
|
4433
4003
|
{
|
|
4434
4004
|
size_t length = MIN(dstCapacity, srcSize);
|
|
4435
|
-
|
|
4005
|
+
if (length > 0) {
|
|
4006
|
+
memcpy(dst, src, length);
|
|
4007
|
+
}
|
|
4436
4008
|
return length;
|
|
4437
4009
|
}
|
|
4438
4010
|
|
|
@@ -4464,7 +4036,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4464
4036
|
if (ZSTDv06_isError(hSize)) return hSize;
|
|
4465
4037
|
if (toLoad > (size_t)(iend-ip)) { /* not enough input to load full header */
|
|
4466
4038
|
memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);
|
|
4467
|
-
zbd->lhSize += iend-ip;
|
|
4039
|
+
zbd->lhSize += iend-ip;
|
|
4468
4040
|
*dstCapacityPtr = 0;
|
|
4469
4041
|
return (hSize - zbd->lhSize) + ZSTDv06_blockHeaderSize; /* remaining header bytes + next block header */
|
|
4470
4042
|
}
|
|
@@ -4491,7 +4063,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4491
4063
|
zbd->inBuff = (char*)malloc(blockSize);
|
|
4492
4064
|
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
|
4493
4065
|
}
|
|
4494
|
-
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize;
|
|
4066
|
+
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize + WILDCOPY_OVERLENGTH * 2;
|
|
4495
4067
|
if (zbd->outBuffSize < neededOutSize) {
|
|
4496
4068
|
free(zbd->outBuff);
|
|
4497
4069
|
zbd->outBuffSize = neededOutSize;
|
|
@@ -4499,7 +4071,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4499
4071
|
if (zbd->outBuff == NULL) return ERROR(memory_allocation);
|
|
4500
4072
|
} } }
|
|
4501
4073
|
zbd->stage = ZBUFFds_read;
|
|
4502
|
-
|
|
4074
|
+
/* fall-through */
|
|
4503
4075
|
case ZBUFFds_read:
|
|
4504
4076
|
{ size_t const neededInSize = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
|
|
4505
4077
|
if (neededInSize==0) { /* end of frame */
|
|
@@ -4521,7 +4093,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4521
4093
|
if (ip==iend) { notDone = 0; break; } /* no more input */
|
|
4522
4094
|
zbd->stage = ZBUFFds_load;
|
|
4523
4095
|
}
|
|
4524
|
-
|
|
4096
|
+
/* fall-through */
|
|
4525
4097
|
case ZBUFFds_load:
|
|
4526
4098
|
{ size_t const neededInSize = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
|
|
4527
4099
|
size_t const toLoad = neededInSize - zbd->inPos; /* should always be <= remaining space within inBuff */
|
|
@@ -4541,9 +4113,10 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4541
4113
|
if (!decodedSize) { zbd->stage = ZBUFFds_read; break; } /* this was just a header */
|
|
4542
4114
|
zbd->outEnd = zbd->outStart + decodedSize;
|
|
4543
4115
|
zbd->stage = ZBUFFds_flush;
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
|
|
4116
|
+
/* break; */ /* ZBUFFds_flush follows */
|
|
4117
|
+
}
|
|
4118
|
+
}
|
|
4119
|
+
/* fall-through */
|
|
4547
4120
|
case ZBUFFds_flush:
|
|
4548
4121
|
{ size_t const toFlushSize = zbd->outEnd - zbd->outStart;
|
|
4549
4122
|
size_t const flushedSize = ZBUFFv06_limitCopy(op, oend-op, zbd->outBuff + zbd->outStart, toFlushSize);
|