extzstd 0.0.3.CONCEPT → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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,36 +1,15 @@
|
|
1
1
|
/*
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
- ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
|
32
|
-
*/
|
33
|
-
#pragma once
|
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
|
+
|
11
|
+
#ifndef ZSTD_V01_H_28739879432
|
12
|
+
#define ZSTD_V01_H_28739879432
|
34
13
|
|
35
14
|
#if defined (__cplusplus)
|
36
15
|
extern "C" {
|
@@ -56,6 +35,19 @@ ZSTDv01_decompress() : decompress ZSTD frames compliant with v0.1.x format
|
|
56
35
|
size_t ZSTDv01_decompress( void* dst, size_t maxOriginalSize,
|
57
36
|
const void* src, size_t compressedSize);
|
58
37
|
|
38
|
+
/**
|
39
|
+
ZSTDv01_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.1.x format
|
40
|
+
srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
41
|
+
cSize (output parameter) : the number of bytes that would be read to decompress this frame
|
42
|
+
or an error code if it fails (which can be tested using ZSTDv01_isError())
|
43
|
+
dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
|
44
|
+
or ZSTD_CONTENTSIZE_ERROR if an error occurs
|
45
|
+
|
46
|
+
note : assumes `cSize` and `dBound` are _not_ NULL.
|
47
|
+
*/
|
48
|
+
void ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
49
|
+
size_t* cSize, unsigned long long* dBound);
|
50
|
+
|
59
51
|
/**
|
60
52
|
ZSTDv01_isError() : tells if the result of ZSTDv01_decompress() is an error
|
61
53
|
*/
|
@@ -98,3 +90,5 @@ size_t ZSTDv01_decompressContinue(ZSTDv01_Dctx* dctx, void* dst, size_t maxDstSi
|
|
98
90
|
#if defined (__cplusplus)
|
99
91
|
}
|
100
92
|
#endif
|
93
|
+
|
94
|
+
#endif /* ZSTD_V01_H_28739879432 */
|
@@ -1,90 +1,27 @@
|
|
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
|
-
|
18
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
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
|
+
*/
|
29
10
|
|
30
|
-
You can contact the author at :
|
31
|
-
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
32
|
-
- Public forum : https://groups.google.com/forum/#!forum/lz4c
|
33
|
-
****************************************************************** */
|
34
|
-
#ifndef ERROR_H_MODULE
|
35
|
-
#define ERROR_H_MODULE
|
36
|
-
|
37
|
-
#if defined (__cplusplus)
|
38
|
-
extern "C" {
|
39
|
-
#endif
|
40
11
|
|
41
12
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
42
13
|
#include "zstd_v02.h"
|
43
|
-
|
44
|
-
/******************************************
|
45
|
-
* Compiler-specific
|
46
|
-
******************************************/
|
47
|
-
#if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
48
|
-
# define ERR_STATIC static inline
|
49
|
-
#elif defined(_MSC_VER)
|
50
|
-
# define ERR_STATIC static __inline
|
51
|
-
#elif defined(__GNUC__)
|
52
|
-
# define ERR_STATIC static __attribute__((unused))
|
53
|
-
#else
|
54
|
-
# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
55
|
-
#endif
|
14
|
+
#include "../common/error_private.h"
|
56
15
|
|
57
16
|
|
58
17
|
/******************************************
|
59
|
-
*
|
18
|
+
* Compiler-specific
|
60
19
|
******************************************/
|
61
|
-
#
|
62
|
-
|
63
|
-
#
|
64
|
-
|
65
|
-
#define ERROR_LIST(ITEM) \
|
66
|
-
ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \
|
67
|
-
ITEM(PREFIX(memory_allocation)) \
|
68
|
-
ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \
|
69
|
-
ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(corruption_detected)) \
|
70
|
-
ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \
|
71
|
-
ITEM(PREFIX(maxCode))
|
72
|
-
|
73
|
-
#define ERROR_GENERATE_ENUM(ENUM) ENUM,
|
74
|
-
typedef enum { ERROR_LIST(ERROR_GENERATE_ENUM) } ERR_codes; /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */
|
75
|
-
|
76
|
-
#define ERROR_CONVERTTOSTRING(STRING) #STRING,
|
77
|
-
#define ERROR_GENERATE_STRING(EXPR) ERROR_CONVERTTOSTRING(EXPR)
|
78
|
-
|
79
|
-
ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
80
|
-
|
81
|
-
|
82
|
-
#if defined (__cplusplus)
|
83
|
-
}
|
20
|
+
#if defined(_MSC_VER) /* Visual Studio */
|
21
|
+
# include <stdlib.h> /* _byteswap_ulong */
|
22
|
+
# include <intrin.h> /* _byteswap_* */
|
84
23
|
#endif
|
85
24
|
|
86
|
-
#endif /* ERROR_H_MODULE */
|
87
|
-
|
88
25
|
|
89
26
|
/* ******************************************************************
|
90
27
|
mem.h
|
@@ -190,7 +127,7 @@ extern "C" {
|
|
190
127
|
#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
191
128
|
# 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__) )
|
192
129
|
# define MEM_FORCE_MEMORY_ACCESS 2
|
193
|
-
# elif defined(__INTEL_COMPILER) || \
|
130
|
+
# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
|
194
131
|
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
195
132
|
# define MEM_FORCE_MEMORY_ACCESS 1
|
196
133
|
# endif
|
@@ -214,8 +151,6 @@ MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
|
|
214
151
|
MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
|
215
152
|
|
216
153
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
|
217
|
-
MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; }
|
218
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; }
|
219
154
|
|
220
155
|
#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
|
221
156
|
|
@@ -228,8 +163,6 @@ MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32;
|
|
228
163
|
MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
|
229
164
|
|
230
165
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
|
231
|
-
MEM_STATIC void MEM_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; }
|
232
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value) { ((unalign*)memPtr)->u64 = value; }
|
233
166
|
|
234
167
|
#else
|
235
168
|
|
@@ -256,17 +189,7 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
256
189
|
memcpy(memPtr, &value, sizeof(value));
|
257
190
|
}
|
258
191
|
|
259
|
-
|
260
|
-
{
|
261
|
-
memcpy(memPtr, &value, sizeof(value));
|
262
|
-
}
|
263
|
-
|
264
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value)
|
265
|
-
{
|
266
|
-
memcpy(memPtr, &value, sizeof(value));
|
267
|
-
}
|
268
|
-
|
269
|
-
#endif // MEM_FORCE_MEMORY_ACCESS
|
192
|
+
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
270
193
|
|
271
194
|
|
272
195
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
|
@@ -294,6 +217,11 @@ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
|
|
294
217
|
}
|
295
218
|
}
|
296
219
|
|
220
|
+
MEM_STATIC U32 MEM_readLE24(const void* memPtr)
|
221
|
+
{
|
222
|
+
return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
|
223
|
+
}
|
224
|
+
|
297
225
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
298
226
|
{
|
299
227
|
if (MEM_isLittleEndian())
|
@@ -305,21 +233,6 @@ MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
|
305
233
|
}
|
306
234
|
}
|
307
235
|
|
308
|
-
MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32)
|
309
|
-
{
|
310
|
-
if (MEM_isLittleEndian())
|
311
|
-
{
|
312
|
-
MEM_write32(memPtr, val32);
|
313
|
-
}
|
314
|
-
else
|
315
|
-
{
|
316
|
-
BYTE* p = (BYTE*)memPtr;
|
317
|
-
p[0] = (BYTE)val32;
|
318
|
-
p[1] = (BYTE)(val32>>8);
|
319
|
-
p[2] = (BYTE)(val32>>16);
|
320
|
-
p[3] = (BYTE)(val32>>24);
|
321
|
-
}
|
322
|
-
}
|
323
236
|
|
324
237
|
MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
325
238
|
{
|
@@ -333,25 +246,6 @@ MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
|
333
246
|
}
|
334
247
|
}
|
335
248
|
|
336
|
-
MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64)
|
337
|
-
{
|
338
|
-
if (MEM_isLittleEndian())
|
339
|
-
{
|
340
|
-
MEM_write64(memPtr, val64);
|
341
|
-
}
|
342
|
-
else
|
343
|
-
{
|
344
|
-
BYTE* p = (BYTE*)memPtr;
|
345
|
-
p[0] = (BYTE)val64;
|
346
|
-
p[1] = (BYTE)(val64>>8);
|
347
|
-
p[2] = (BYTE)(val64>>16);
|
348
|
-
p[3] = (BYTE)(val64>>24);
|
349
|
-
p[4] = (BYTE)(val64>>32);
|
350
|
-
p[5] = (BYTE)(val64>>40);
|
351
|
-
p[6] = (BYTE)(val64>>48);
|
352
|
-
p[7] = (BYTE)(val64>>56);
|
353
|
-
}
|
354
|
-
}
|
355
249
|
|
356
250
|
MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
357
251
|
{
|
@@ -361,14 +255,6 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
361
255
|
return (size_t)MEM_readLE64(memPtr);
|
362
256
|
}
|
363
257
|
|
364
|
-
MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val)
|
365
|
-
{
|
366
|
-
if (MEM_32bits())
|
367
|
-
MEM_writeLE32(memPtr, (U32)val);
|
368
|
-
else
|
369
|
-
MEM_writeLE64(memPtr, (U64)val);
|
370
|
-
}
|
371
|
-
|
372
258
|
#if defined (__cplusplus)
|
373
259
|
}
|
374
260
|
#endif
|
@@ -449,18 +335,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
449
335
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
450
336
|
|
451
337
|
|
452
|
-
/*
|
453
|
-
* Start by invoking BIT_initDStream().
|
454
|
-
* A chunk of the bitStream is then stored into a local register.
|
455
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
456
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
457
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
458
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
459
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
460
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
461
|
-
*/
|
462
|
-
|
463
|
-
|
464
338
|
/******************************************
|
465
339
|
* unsafe API
|
466
340
|
******************************************/
|
@@ -472,14 +346,14 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
472
346
|
/****************************************************************
|
473
347
|
* Helper functions
|
474
348
|
****************************************************************/
|
475
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
349
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
476
350
|
{
|
477
351
|
# if defined(_MSC_VER) /* Visual */
|
478
352
|
unsigned long r=0;
|
479
353
|
_BitScanReverse ( &r, val );
|
480
354
|
return (unsigned) r;
|
481
355
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
482
|
-
return
|
356
|
+
return __builtin_clz (val) ^ 31;
|
483
357
|
# else /* Software version */
|
484
358
|
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 };
|
485
359
|
U32 v = val;
|
@@ -530,11 +404,17 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
530
404
|
switch(srcSize)
|
531
405
|
{
|
532
406
|
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);
|
407
|
+
/* fallthrough */
|
533
408
|
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);
|
409
|
+
/* fallthrough */
|
534
410
|
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);
|
411
|
+
/* fallthrough */
|
535
412
|
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
|
413
|
+
/* fallthrough */
|
536
414
|
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
|
415
|
+
/* fallthrough */
|
537
416
|
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
|
417
|
+
/* fallthrough */
|
538
418
|
default:;
|
539
419
|
}
|
540
420
|
contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
|
@@ -546,13 +426,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
546
426
|
return srcSize;
|
547
427
|
}
|
548
428
|
|
549
|
-
/*!BIT_lookBits
|
550
|
-
* Provides next n bits from local register
|
551
|
-
* local register is not modified (bits are still present for next read/look)
|
552
|
-
* On 32-bits, maxNbBits==25
|
553
|
-
* On 64-bits, maxNbBits==57
|
554
|
-
* @return : value extracted
|
555
|
-
*/
|
556
429
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
557
430
|
{
|
558
431
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
@@ -572,11 +445,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
572
445
|
bitD->bitsConsumed += nbBits;
|
573
446
|
}
|
574
447
|
|
575
|
-
/*!BIT_readBits
|
576
|
-
* Read next n bits from local register.
|
577
|
-
* pay attention to not read more than nbBits contained into local register.
|
578
|
-
* @return : extracted value.
|
579
|
-
*/
|
580
448
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
581
449
|
{
|
582
450
|
size_t value = BIT_lookBits(bitD, nbBits);
|
@@ -595,8 +463,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
|
595
463
|
|
596
464
|
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
597
465
|
{
|
598
|
-
|
599
|
-
|
466
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
467
|
+
return BIT_DStream_overflow;
|
600
468
|
|
601
469
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
|
602
470
|
{
|
@@ -814,55 +682,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
814
682
|
|
815
683
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
816
684
|
|
817
|
-
/*
|
818
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
819
|
-
You will decode FSE-encoded symbols from the bitStream,
|
820
|
-
and also any other bitFields you put in, **in reverse order**.
|
821
|
-
|
822
|
-
You will need a few variables to track your bitStream. They are :
|
823
|
-
|
824
|
-
BIT_DStream_t DStream; // Stream context
|
825
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
826
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
827
|
-
|
828
|
-
The first thing to do is to init the bitStream.
|
829
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
830
|
-
|
831
|
-
You should then retrieve your initial state(s)
|
832
|
-
(in reverse flushing order if you have several ones) :
|
833
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
834
|
-
|
835
|
-
You can then decode your data, symbol after symbol.
|
836
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
837
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
838
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
839
|
-
|
840
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
841
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
842
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
843
|
-
|
844
|
-
All above operations only read from local register (which size depends on size_t).
|
845
|
-
Refueling the register from memory is manually performed by the reload method.
|
846
|
-
endSignal = FSE_reloadDStream(&DStream);
|
847
|
-
|
848
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
849
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
850
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
851
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
852
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
853
|
-
|
854
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
855
|
-
to properly detect the exact end of stream.
|
856
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
857
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
858
|
-
|
859
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
860
|
-
Checking if DStream has reached its end is performed by :
|
861
|
-
BIT_endOfDStream(&DStream);
|
862
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
863
|
-
FSE_endOfDState(&DState);
|
864
|
-
*/
|
865
|
-
|
866
685
|
|
867
686
|
/******************************************
|
868
687
|
* FSE unsafe API
|
@@ -1198,12 +1017,15 @@ typedef struct ZSTD_DCtx_s ZSTD_DCtx;
|
|
1198
1017
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
1199
1018
|
# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
|
1200
1019
|
#else
|
1201
|
-
#
|
1202
|
-
#
|
1203
|
-
#
|
1020
|
+
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
1021
|
+
# ifdef __GNUC__
|
1022
|
+
# define FORCE_INLINE static inline __attribute__((always_inline))
|
1023
|
+
# else
|
1024
|
+
# define FORCE_INLINE static inline
|
1025
|
+
# endif
|
1204
1026
|
# else
|
1205
|
-
# define FORCE_INLINE static
|
1206
|
-
# endif
|
1027
|
+
# define FORCE_INLINE static
|
1028
|
+
# endif /* __STDC_VERSION__ */
|
1207
1029
|
#endif
|
1208
1030
|
|
1209
1031
|
|
@@ -1350,7 +1172,7 @@ static unsigned FSE_isError(size_t code) { return ERR_isError(code); }
|
|
1350
1172
|
****************************************************************/
|
1351
1173
|
static short FSE_abs(short a)
|
1352
1174
|
{
|
1353
|
-
return a<0 ? -a : a;
|
1175
|
+
return (short)(a<0 ? -a : a);
|
1354
1176
|
}
|
1355
1177
|
|
1356
1178
|
static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
|
@@ -1451,8 +1273,8 @@ static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsi
|
|
1451
1273
|
else
|
1452
1274
|
{
|
1453
1275
|
bitCount -= (int)(8 * (iend - 4 - ip));
|
1454
|
-
|
1455
|
-
|
1276
|
+
ip = iend - 4;
|
1277
|
+
}
|
1456
1278
|
bitStream = MEM_readLE32(ip) >> (bitCount & 31);
|
1457
1279
|
}
|
1458
1280
|
}
|
@@ -1671,15 +1493,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz
|
|
1671
1493
|
|
1672
1494
|
|
1673
1495
|
#ifdef _MSC_VER /* Visual Studio */
|
1674
|
-
# define FORCE_INLINE static __forceinline
|
1675
1496
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
1676
|
-
#else
|
1677
|
-
# ifdef __GNUC__
|
1678
|
-
# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
1679
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
1680
|
-
# else
|
1681
|
-
# define FORCE_INLINE static inline
|
1682
|
-
# endif
|
1683
1497
|
#endif
|
1684
1498
|
|
1685
1499
|
|
@@ -1732,10 +1546,12 @@ static size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
1732
1546
|
U32 weightTotal;
|
1733
1547
|
U32 tableLog;
|
1734
1548
|
const BYTE* ip = (const BYTE*) src;
|
1735
|
-
size_t iSize
|
1549
|
+
size_t iSize;
|
1736
1550
|
size_t oSize;
|
1737
1551
|
U32 n;
|
1738
1552
|
|
1553
|
+
if (!srcSize) return ERROR(srcSize_wrong);
|
1554
|
+
iSize = ip[0];
|
1739
1555
|
//memset(huffWeight, 0, hwSize); /* is not necessary, even though some analyzer complain ... */
|
1740
1556
|
|
1741
1557
|
if (iSize >= 128) /* special header */
|
@@ -1777,6 +1593,7 @@ static size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
1777
1593
|
rankStats[huffWeight[n]]++;
|
1778
1594
|
weightTotal += (1 << huffWeight[n]) >> 1;
|
1779
1595
|
}
|
1596
|
+
if (weightTotal == 0) return ERROR(corruption_detected);
|
1780
1597
|
|
1781
1598
|
/* get last non-null symbol weight (implied, total must be 2^n) */
|
1782
1599
|
tableLog = BIT_highbit32(weightTotal) + 1;
|
@@ -2162,7 +1979,7 @@ static size_t HUF_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
|
|
2162
1979
|
rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
|
2163
1980
|
}
|
2164
1981
|
|
2165
|
-
|
1982
|
+
/* Build rankVal */
|
2166
1983
|
{
|
2167
1984
|
const U32 minBits = tableLog+1 - maxW;
|
2168
1985
|
U32 nextRankVal = 0;
|
@@ -2496,7 +2313,7 @@ static size_t HUF_readDTableX6 (U32* DTable, const void* src, size_t srcSize)
|
|
2496
2313
|
rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
|
2497
2314
|
}
|
2498
2315
|
|
2499
|
-
|
2316
|
+
/* Build rankVal */
|
2500
2317
|
{
|
2501
2318
|
const U32 minBits = tableLog+1 - maxW;
|
2502
2319
|
U32 nextRankVal = 0;
|
@@ -2866,17 +2683,9 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
|
|
2866
2683
|
#endif
|
2867
2684
|
|
2868
2685
|
#ifdef _MSC_VER /* Visual Studio */
|
2869
|
-
# define FORCE_INLINE static __forceinline
|
2870
2686
|
# include <intrin.h> /* For Visual 2005 */
|
2871
2687
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
2872
2688
|
# pragma warning(disable : 4324) /* disable: C4324: padded structure */
|
2873
|
-
#else
|
2874
|
-
# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
2875
|
-
# ifdef __GNUC__
|
2876
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
2877
|
-
# else
|
2878
|
-
# define FORCE_INLINE static inline
|
2879
|
-
# endif
|
2880
2689
|
#endif
|
2881
2690
|
|
2882
2691
|
|
@@ -2924,6 +2733,8 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
|
|
2924
2733
|
#define LITERAL_NOENTROPY 63
|
2925
2734
|
#define COMMAND_NOENTROPY 7 /* to remove */
|
2926
2735
|
|
2736
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
2737
|
+
|
2927
2738
|
static const size_t ZSTD_blockHeaderSize = 3;
|
2928
2739
|
static const size_t ZSTD_frameHeaderSize = 4;
|
2929
2740
|
|
@@ -2938,7 +2749,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
2938
2749
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
2939
2750
|
|
2940
2751
|
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
2941
|
-
static void ZSTD_wildcopy(void* dst, const void* src,
|
2752
|
+
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
2942
2753
|
{
|
2943
2754
|
const BYTE* ip = (const BYTE*)src;
|
2944
2755
|
BYTE* op = (BYTE*)dst;
|
@@ -2983,98 +2794,6 @@ typedef struct {
|
|
2983
2794
|
static unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
|
2984
2795
|
|
2985
2796
|
|
2986
|
-
/* *************************************
|
2987
|
-
* Function body to include
|
2988
|
-
***************************************/
|
2989
|
-
static size_t ZSTD_read_ARCH(const void* p) { size_t r; memcpy(&r, p, sizeof(r)); return r; }
|
2990
|
-
|
2991
|
-
MEM_STATIC unsigned ZSTD_NbCommonBytes (register size_t val)
|
2992
|
-
{
|
2993
|
-
if (MEM_isLittleEndian())
|
2994
|
-
{
|
2995
|
-
if (MEM_64bits())
|
2996
|
-
{
|
2997
|
-
# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
2998
|
-
unsigned long r = 0;
|
2999
|
-
_BitScanForward64( &r, (U64)val );
|
3000
|
-
return (int)(r>>3);
|
3001
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
3002
|
-
return (__builtin_ctzll((U64)val) >> 3);
|
3003
|
-
# else
|
3004
|
-
static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 };
|
3005
|
-
return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58];
|
3006
|
-
# endif
|
3007
|
-
}
|
3008
|
-
else /* 32 bits */
|
3009
|
-
{
|
3010
|
-
# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
3011
|
-
unsigned long r;
|
3012
|
-
_BitScanForward( &r, (U32)val );
|
3013
|
-
return (int)(r>>3);
|
3014
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
3015
|
-
return (__builtin_ctz((U32)val) >> 3);
|
3016
|
-
# else
|
3017
|
-
static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 };
|
3018
|
-
return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27];
|
3019
|
-
# endif
|
3020
|
-
}
|
3021
|
-
}
|
3022
|
-
else /* Big Endian CPU */
|
3023
|
-
{
|
3024
|
-
if (MEM_32bits())
|
3025
|
-
{
|
3026
|
-
# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
3027
|
-
unsigned long r = 0;
|
3028
|
-
_BitScanReverse64( &r, val );
|
3029
|
-
return (unsigned)(r>>3);
|
3030
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
3031
|
-
return (__builtin_clzll(val) >> 3);
|
3032
|
-
# else
|
3033
|
-
unsigned r;
|
3034
|
-
const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */
|
3035
|
-
if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; }
|
3036
|
-
if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; }
|
3037
|
-
r += (!val);
|
3038
|
-
return r;
|
3039
|
-
# endif
|
3040
|
-
}
|
3041
|
-
else /* 32 bits */
|
3042
|
-
{
|
3043
|
-
# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
3044
|
-
unsigned long r = 0;
|
3045
|
-
_BitScanReverse( &r, (unsigned long)val );
|
3046
|
-
return (unsigned)(r>>3);
|
3047
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) && !defined(LZ4_FORCE_SW_BITCOUNT)
|
3048
|
-
return (__builtin_clz((U32)val) >> 3);
|
3049
|
-
# else
|
3050
|
-
unsigned r;
|
3051
|
-
if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; }
|
3052
|
-
r += (!val);
|
3053
|
-
return r;
|
3054
|
-
# endif
|
3055
|
-
}
|
3056
|
-
}
|
3057
|
-
}
|
3058
|
-
|
3059
|
-
|
3060
|
-
MEM_STATIC size_t ZSTD_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit)
|
3061
|
-
{
|
3062
|
-
const BYTE* const pStart = pIn;
|
3063
|
-
|
3064
|
-
while ((pIn<pInLimit-(sizeof(size_t)-1)))
|
3065
|
-
{
|
3066
|
-
size_t diff = ZSTD_read_ARCH(pMatch) ^ ZSTD_read_ARCH(pIn);
|
3067
|
-
if (!diff) { pIn+=sizeof(size_t); pMatch+=sizeof(size_t); continue; }
|
3068
|
-
pIn += ZSTD_NbCommonBytes(diff);
|
3069
|
-
return (size_t)(pIn - pStart);
|
3070
|
-
}
|
3071
|
-
|
3072
|
-
if (MEM_32bits()) if ((pIn<(pInLimit-3)) && (MEM_read32(pMatch) == MEM_read32(pIn))) { pIn+=4; pMatch+=4; }
|
3073
|
-
if ((pIn<(pInLimit-1)) && (MEM_read16(pMatch) == MEM_read16(pIn))) { pIn+=2; pMatch+=2; }
|
3074
|
-
if ((pIn<pInLimit) && (*pMatch == *pIn)) pIn++;
|
3075
|
-
return (size_t)(pIn - pStart);
|
3076
|
-
}
|
3077
|
-
|
3078
2797
|
|
3079
2798
|
/* *************************************************************
|
3080
2799
|
* Decompression section
|
@@ -3090,7 +2809,6 @@ struct ZSTD_DCtx_s
|
|
3090
2809
|
blockType_t bType;
|
3091
2810
|
U32 phase;
|
3092
2811
|
const BYTE* litPtr;
|
3093
|
-
size_t litBufSize;
|
3094
2812
|
size_t litSize;
|
3095
2813
|
BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */];
|
3096
2814
|
}; /* typedef'd to ZSTD_Dctx within "zstd_static.h" */
|
@@ -3118,7 +2836,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
3118
2836
|
static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
3119
2837
|
{
|
3120
2838
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
3121
|
-
|
2839
|
+
if (srcSize > 0) {
|
2840
|
+
memcpy(dst, src, srcSize);
|
2841
|
+
}
|
3122
2842
|
return srcSize;
|
3123
2843
|
}
|
3124
2844
|
|
@@ -3162,8 +2882,8 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
3162
2882
|
size_t litSize = BLOCKSIZE;
|
3163
2883
|
const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize);
|
3164
2884
|
dctx->litPtr = dctx->litBuffer;
|
3165
|
-
dctx->litBufSize = BLOCKSIZE;
|
3166
2885
|
dctx->litSize = litSize;
|
2886
|
+
memset(dctx->litBuffer + dctx->litSize, 0, 8);
|
3167
2887
|
return readSize; /* works if it's an error too */
|
3168
2888
|
}
|
3169
2889
|
case IS_RAW:
|
@@ -3171,16 +2891,16 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
3171
2891
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
3172
2892
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
3173
2893
|
{
|
3174
|
-
|
3175
|
-
|
3176
|
-
|
3177
|
-
|
3178
|
-
|
3179
|
-
|
3180
|
-
|
3181
|
-
|
2894
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
2895
|
+
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
2896
|
+
memcpy(dctx->litBuffer, istart, litSize);
|
2897
|
+
dctx->litPtr = dctx->litBuffer;
|
2898
|
+
dctx->litSize = litSize;
|
2899
|
+
memset(dctx->litBuffer + dctx->litSize, 0, 8);
|
2900
|
+
return litSize+3;
|
2901
|
+
}
|
2902
|
+
/* direct reference into compressed stream */
|
3182
2903
|
dctx->litPtr = istart+3;
|
3183
|
-
dctx->litBufSize = srcSize-3;
|
3184
2904
|
dctx->litSize = litSize;
|
3185
2905
|
return litSize+3;
|
3186
2906
|
}
|
@@ -3188,9 +2908,8 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
3188
2908
|
{
|
3189
2909
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
3190
2910
|
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
3191
|
-
memset(dctx->litBuffer, istart[3], litSize);
|
2911
|
+
memset(dctx->litBuffer, istart[3], litSize + 8);
|
3192
2912
|
dctx->litPtr = dctx->litBuffer;
|
3193
|
-
dctx->litBufSize = BLOCKSIZE;
|
3194
2913
|
dctx->litSize = litSize;
|
3195
2914
|
return 4;
|
3196
2915
|
}
|
@@ -3244,7 +2963,6 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
3244
2963
|
/* Build DTables */
|
3245
2964
|
switch(LLtype)
|
3246
2965
|
{
|
3247
|
-
U32 max;
|
3248
2966
|
case bt_rle :
|
3249
2967
|
LLlog = 0;
|
3250
2968
|
FSE_buildDTable_rle(DTableLL, *ip++); break;
|
@@ -3252,17 +2970,16 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
3252
2970
|
LLlog = LLbits;
|
3253
2971
|
FSE_buildDTable_raw(DTableLL, LLbits); break;
|
3254
2972
|
default :
|
3255
|
-
max = MaxLL;
|
3256
|
-
|
3257
|
-
|
3258
|
-
|
3259
|
-
|
3260
|
-
|
3261
|
-
}
|
2973
|
+
{ U32 max = MaxLL;
|
2974
|
+
headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
|
2975
|
+
if (FSE_isError(headerSize)) return ERROR(GENERIC);
|
2976
|
+
if (LLlog > LLFSELog) return ERROR(corruption_detected);
|
2977
|
+
ip += headerSize;
|
2978
|
+
FSE_buildDTable(DTableLL, norm, max, LLlog);
|
2979
|
+
} }
|
3262
2980
|
|
3263
2981
|
switch(Offtype)
|
3264
2982
|
{
|
3265
|
-
U32 max;
|
3266
2983
|
case bt_rle :
|
3267
2984
|
Offlog = 0;
|
3268
2985
|
if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
|
@@ -3272,17 +2989,16 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
3272
2989
|
Offlog = Offbits;
|
3273
2990
|
FSE_buildDTable_raw(DTableOffb, Offbits); break;
|
3274
2991
|
default :
|
3275
|
-
max = MaxOff;
|
3276
|
-
|
3277
|
-
|
3278
|
-
|
3279
|
-
|
3280
|
-
|
3281
|
-
}
|
2992
|
+
{ U32 max = MaxOff;
|
2993
|
+
headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
|
2994
|
+
if (FSE_isError(headerSize)) return ERROR(GENERIC);
|
2995
|
+
if (Offlog > OffFSELog) return ERROR(corruption_detected);
|
2996
|
+
ip += headerSize;
|
2997
|
+
FSE_buildDTable(DTableOffb, norm, max, Offlog);
|
2998
|
+
} }
|
3282
2999
|
|
3283
3000
|
switch(MLtype)
|
3284
3001
|
{
|
3285
|
-
U32 max;
|
3286
3002
|
case bt_rle :
|
3287
3003
|
MLlog = 0;
|
3288
3004
|
if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
|
@@ -3291,14 +3007,13 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
3291
3007
|
MLlog = MLbits;
|
3292
3008
|
FSE_buildDTable_raw(DTableML, MLbits); break;
|
3293
3009
|
default :
|
3294
|
-
max = MaxML;
|
3295
|
-
|
3296
|
-
|
3297
|
-
|
3298
|
-
|
3299
|
-
|
3300
|
-
|
3301
|
-
}
|
3010
|
+
{ U32 max = MaxML;
|
3011
|
+
headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
|
3012
|
+
if (FSE_isError(headerSize)) return ERROR(GENERIC);
|
3013
|
+
if (MLlog > MLFSELog) return ERROR(corruption_detected);
|
3014
|
+
ip += headerSize;
|
3015
|
+
FSE_buildDTable(DTableML, norm, max, MLlog);
|
3016
|
+
} } }
|
3302
3017
|
|
3303
3018
|
return ip-istart;
|
3304
3019
|
}
|
@@ -3336,11 +3051,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3336
3051
|
seqState->prevOffset = seq->offset;
|
3337
3052
|
if (litLength == MaxLL)
|
3338
3053
|
{
|
3339
|
-
U32 add = *dumps
|
3054
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
3340
3055
|
if (add < 255) litLength += add;
|
3341
|
-
else
|
3056
|
+
else if (dumps + 3 <= de)
|
3342
3057
|
{
|
3343
|
-
litLength =
|
3058
|
+
litLength = MEM_readLE24(dumps);
|
3344
3059
|
dumps += 3;
|
3345
3060
|
}
|
3346
3061
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
@@ -3366,11 +3081,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3366
3081
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
3367
3082
|
if (matchLength == MaxML)
|
3368
3083
|
{
|
3369
|
-
U32 add = *dumps
|
3084
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
3370
3085
|
if (add < 255) matchLength += add;
|
3371
|
-
else
|
3086
|
+
else if (dumps + 3 <= de)
|
3372
3087
|
{
|
3373
|
-
matchLength =
|
3088
|
+
matchLength = MEM_readLE24(dumps);
|
3374
3089
|
dumps += 3;
|
3375
3090
|
}
|
3376
3091
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
@@ -3391,7 +3106,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
3391
3106
|
BYTE* const base, BYTE* const oend)
|
3392
3107
|
{
|
3393
3108
|
static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
|
3394
|
-
static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /*
|
3109
|
+
static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
|
3395
3110
|
const BYTE* const ostart = op;
|
3396
3111
|
BYTE* const oLitEnd = op + sequence.litLength;
|
3397
3112
|
BYTE* const oMatchEnd = op + sequence.litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
|
@@ -3401,7 +3116,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
3401
3116
|
/* checks */
|
3402
3117
|
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
|
3403
3118
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
3404
|
-
if (litEnd > litLimit
|
3119
|
+
if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */
|
3405
3120
|
|
3406
3121
|
/* copy Literals */
|
3407
3122
|
ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
@@ -3435,7 +3150,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
3435
3150
|
}
|
3436
3151
|
op += 8; match += 8;
|
3437
3152
|
|
3438
|
-
if (oMatchEnd > oend-
|
3153
|
+
if (oMatchEnd > oend-(16-MINMATCH))
|
3439
3154
|
{
|
3440
3155
|
if (op < oend_8)
|
3441
3156
|
{
|
@@ -3447,7 +3162,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
3447
3162
|
}
|
3448
3163
|
else
|
3449
3164
|
{
|
3450
|
-
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
3165
|
+
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
3451
3166
|
}
|
3452
3167
|
}
|
3453
3168
|
|
@@ -3467,7 +3182,6 @@ static size_t ZSTD_decompressSequences(
|
|
3467
3182
|
BYTE* const oend = ostart + maxDstSize;
|
3468
3183
|
size_t errorCode, dumpsLength;
|
3469
3184
|
const BYTE* litPtr = dctx->litPtr;
|
3470
|
-
const BYTE* const litMax = litPtr + dctx->litBufSize;
|
3471
3185
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
3472
3186
|
int nbSeq;
|
3473
3187
|
const BYTE* dumps;
|
@@ -3503,7 +3217,7 @@ static size_t ZSTD_decompressSequences(
|
|
3503
3217
|
size_t oneSeqSize;
|
3504
3218
|
nbSeq--;
|
3505
3219
|
ZSTD_decodeSequence(&sequence, &seqState);
|
3506
|
-
oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr,
|
3220
|
+
oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend);
|
3507
3221
|
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
3508
3222
|
op += oneSeqSize;
|
3509
3223
|
}
|
@@ -3517,8 +3231,10 @@ static size_t ZSTD_decompressSequences(
|
|
3517
3231
|
size_t lastLLSize = litEnd - litPtr;
|
3518
3232
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
3519
3233
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
3520
|
-
if (
|
3521
|
-
|
3234
|
+
if (lastLLSize > 0) {
|
3235
|
+
if (op != litPtr) memmove(op, litPtr, lastLLSize);
|
3236
|
+
op += lastLLSize;
|
3237
|
+
}
|
3522
3238
|
}
|
3523
3239
|
}
|
3524
3240
|
|
@@ -3608,6 +3324,60 @@ static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, siz
|
|
3608
3324
|
return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
|
3609
3325
|
}
|
3610
3326
|
|
3327
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
3328
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
3329
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
3330
|
+
{
|
3331
|
+
*cSize = ret;
|
3332
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
3333
|
+
}
|
3334
|
+
|
3335
|
+
void ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
3336
|
+
{
|
3337
|
+
const BYTE* ip = (const BYTE*)src;
|
3338
|
+
size_t remainingSize = srcSize;
|
3339
|
+
size_t nbBlocks = 0;
|
3340
|
+
U32 magicNumber;
|
3341
|
+
blockProperties_t blockProperties;
|
3342
|
+
|
3343
|
+
/* Frame Header */
|
3344
|
+
if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
|
3345
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
3346
|
+
return;
|
3347
|
+
}
|
3348
|
+
magicNumber = MEM_readLE32(src);
|
3349
|
+
if (magicNumber != ZSTD_magicNumber) {
|
3350
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
3351
|
+
return;
|
3352
|
+
}
|
3353
|
+
ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
|
3354
|
+
|
3355
|
+
/* Loop on each block */
|
3356
|
+
while (1)
|
3357
|
+
{
|
3358
|
+
size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
|
3359
|
+
if (ZSTD_isError(cBlockSize)) {
|
3360
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
3361
|
+
return;
|
3362
|
+
}
|
3363
|
+
|
3364
|
+
ip += ZSTD_blockHeaderSize;
|
3365
|
+
remainingSize -= ZSTD_blockHeaderSize;
|
3366
|
+
if (cBlockSize > remainingSize) {
|
3367
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
3368
|
+
return;
|
3369
|
+
}
|
3370
|
+
|
3371
|
+
if (cBlockSize == 0) break; /* bt_end */
|
3372
|
+
|
3373
|
+
ip += cBlockSize;
|
3374
|
+
remainingSize -= cBlockSize;
|
3375
|
+
nbBlocks++;
|
3376
|
+
}
|
3377
|
+
|
3378
|
+
*cSize = ip - (const BYTE*)src;
|
3379
|
+
*dBound = nbBlocks * BLOCKSIZE;
|
3380
|
+
}
|
3611
3381
|
|
3612
3382
|
/*******************************
|
3613
3383
|
* Streaming Decompression API
|
@@ -3713,36 +3483,36 @@ static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSi
|
|
3713
3483
|
|
3714
3484
|
unsigned ZSTDv02_isError(size_t code)
|
3715
3485
|
{
|
3716
|
-
|
3486
|
+
return ZSTD_isError(code);
|
3717
3487
|
}
|
3718
3488
|
|
3719
3489
|
size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize,
|
3720
3490
|
const void* src, size_t compressedSize)
|
3721
3491
|
{
|
3722
|
-
|
3492
|
+
return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
|
3723
3493
|
}
|
3724
3494
|
|
3725
3495
|
ZSTDv02_Dctx* ZSTDv02_createDCtx(void)
|
3726
3496
|
{
|
3727
|
-
|
3497
|
+
return (ZSTDv02_Dctx*)ZSTD_createDCtx();
|
3728
3498
|
}
|
3729
3499
|
|
3730
3500
|
size_t ZSTDv02_freeDCtx(ZSTDv02_Dctx* dctx)
|
3731
3501
|
{
|
3732
|
-
|
3502
|
+
return ZSTD_freeDCtx((ZSTD_DCtx*)dctx);
|
3733
3503
|
}
|
3734
3504
|
|
3735
3505
|
size_t ZSTDv02_resetDCtx(ZSTDv02_Dctx* dctx)
|
3736
3506
|
{
|
3737
|
-
|
3507
|
+
return ZSTD_resetDCtx((ZSTD_DCtx*)dctx);
|
3738
3508
|
}
|
3739
3509
|
|
3740
3510
|
size_t ZSTDv02_nextSrcSizeToDecompress(ZSTDv02_Dctx* dctx)
|
3741
3511
|
{
|
3742
|
-
|
3512
|
+
return ZSTD_nextSrcSizeToDecompress((ZSTD_DCtx*)dctx);
|
3743
3513
|
}
|
3744
3514
|
|
3745
3515
|
size_t ZSTDv02_decompressContinue(ZSTDv02_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
3746
3516
|
{
|
3747
|
-
|
3517
|
+
return ZSTD_decompressContinue((ZSTD_DCtx*)dctx, dst, maxDstSize, src, srcSize);
|
3748
3518
|
}
|