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,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_V04_H_91868324769238
|
|
12
|
+
#define ZSTD_V04_H_91868324769238
|
|
34
13
|
|
|
35
14
|
#if defined (__cplusplus)
|
|
36
15
|
extern "C" {
|
|
@@ -56,6 +35,19 @@ ZSTDv04_decompress() : decompress ZSTD frames compliant with v0.4.x format
|
|
|
56
35
|
size_t ZSTDv04_decompress( void* dst, size_t maxOriginalSize,
|
|
57
36
|
const void* src, size_t compressedSize);
|
|
58
37
|
|
|
38
|
+
/**
|
|
39
|
+
ZSTDv04_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.4.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 ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
|
49
|
+
size_t* cSize, unsigned long long* dBound);
|
|
50
|
+
|
|
59
51
|
/**
|
|
60
52
|
ZSTDv04_isError() : tells if the result of ZSTDv04_decompress() is an error
|
|
61
53
|
*/
|
|
@@ -146,3 +138,5 @@ size_t ZBUFFv04_recommendedDOutSize(void);
|
|
|
146
138
|
#if defined (__cplusplus)
|
|
147
139
|
}
|
|
148
140
|
#endif
|
|
141
|
+
|
|
142
|
+
#endif /* ZSTD_V04_H_91868324769238 */
|
|
@@ -1,39 +1,17 @@
|
|
|
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_v05.h"
|
|
14
|
+
#include "../common/error_private.h"
|
|
37
15
|
|
|
38
16
|
|
|
39
17
|
/* ******************************************************************
|
|
@@ -140,7 +118,7 @@ extern "C" {
|
|
|
140
118
|
#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
|
141
119
|
# 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__) )
|
|
142
120
|
# define MEM_FORCE_MEMORY_ACCESS 2
|
|
143
|
-
# elif defined(__INTEL_COMPILER) || \
|
|
121
|
+
# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
|
|
144
122
|
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
|
145
123
|
# define MEM_FORCE_MEMORY_ACCESS 1
|
|
146
124
|
# endif
|
|
@@ -250,18 +228,6 @@ MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
|
|
250
228
|
}
|
|
251
229
|
}
|
|
252
230
|
|
|
253
|
-
MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32)
|
|
254
|
-
{
|
|
255
|
-
if (MEM_isLittleEndian()) {
|
|
256
|
-
MEM_write32(memPtr, val32);
|
|
257
|
-
} else {
|
|
258
|
-
BYTE* p = (BYTE*)memPtr;
|
|
259
|
-
p[0] = (BYTE)val32;
|
|
260
|
-
p[1] = (BYTE)(val32>>8);
|
|
261
|
-
p[2] = (BYTE)(val32>>16);
|
|
262
|
-
p[3] = (BYTE)(val32>>24);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
231
|
|
|
266
232
|
MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
|
267
233
|
{
|
|
@@ -274,22 +240,6 @@ MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
|
|
274
240
|
}
|
|
275
241
|
}
|
|
276
242
|
|
|
277
|
-
MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64)
|
|
278
|
-
{
|
|
279
|
-
if (MEM_isLittleEndian()) {
|
|
280
|
-
MEM_write64(memPtr, val64);
|
|
281
|
-
} else {
|
|
282
|
-
BYTE* p = (BYTE*)memPtr;
|
|
283
|
-
p[0] = (BYTE)val64;
|
|
284
|
-
p[1] = (BYTE)(val64>>8);
|
|
285
|
-
p[2] = (BYTE)(val64>>16);
|
|
286
|
-
p[3] = (BYTE)(val64>>24);
|
|
287
|
-
p[4] = (BYTE)(val64>>32);
|
|
288
|
-
p[5] = (BYTE)(val64>>40);
|
|
289
|
-
p[6] = (BYTE)(val64>>48);
|
|
290
|
-
p[7] = (BYTE)(val64>>56);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
243
|
|
|
294
244
|
MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
295
245
|
{
|
|
@@ -299,13 +249,6 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
|
299
249
|
return (size_t)MEM_readLE64(memPtr);
|
|
300
250
|
}
|
|
301
251
|
|
|
302
|
-
MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val)
|
|
303
|
-
{
|
|
304
|
-
if (MEM_32bits())
|
|
305
|
-
MEM_writeLE32(memPtr, (U32)val);
|
|
306
|
-
else
|
|
307
|
-
MEM_writeLE64(memPtr, (U64)val);
|
|
308
|
-
}
|
|
309
252
|
|
|
310
253
|
#if defined (__cplusplus)
|
|
311
254
|
}
|
|
@@ -313,79 +256,6 @@ MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val)
|
|
|
313
256
|
|
|
314
257
|
#endif /* MEM_H_MODULE */
|
|
315
258
|
|
|
316
|
-
/* ******************************************************************
|
|
317
|
-
Error codes list
|
|
318
|
-
Copyright (C) 2016, Yann Collet
|
|
319
|
-
|
|
320
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
321
|
-
|
|
322
|
-
Redistribution and use in source and binary forms, with or without
|
|
323
|
-
modification, are permitted provided that the following conditions are
|
|
324
|
-
met:
|
|
325
|
-
|
|
326
|
-
* Redistributions of source code must retain the above copyright
|
|
327
|
-
notice, this list of conditions and the following disclaimer.
|
|
328
|
-
* Redistributions in binary form must reproduce the above
|
|
329
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
330
|
-
in the documentation and/or other materials provided with the
|
|
331
|
-
distribution.
|
|
332
|
-
|
|
333
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
334
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
335
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
336
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
337
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
338
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
339
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
340
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
341
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
342
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
343
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
344
|
-
|
|
345
|
-
You can contact the author at :
|
|
346
|
-
- Source repository : https://github.com/Cyan4973/zstd
|
|
347
|
-
****************************************************************** */
|
|
348
|
-
#ifndef ERROR_PUBLIC_H_MODULE
|
|
349
|
-
#define ERROR_PUBLIC_H_MODULE
|
|
350
|
-
|
|
351
|
-
#if defined (__cplusplus)
|
|
352
|
-
extern "C" {
|
|
353
|
-
#endif
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
/* ****************************************
|
|
357
|
-
* error codes list
|
|
358
|
-
******************************************/
|
|
359
|
-
typedef enum {
|
|
360
|
-
ZSTDv05_error_no_error,
|
|
361
|
-
ZSTDv05_error_GENERIC,
|
|
362
|
-
ZSTDv05_error_prefix_unknown,
|
|
363
|
-
ZSTDv05_error_frameParameter_unsupported,
|
|
364
|
-
ZSTDv05_error_frameParameter_unsupportedBy32bits,
|
|
365
|
-
ZSTDv05_error_init_missing,
|
|
366
|
-
ZSTDv05_error_memory_allocation,
|
|
367
|
-
ZSTDv05_error_stage_wrong,
|
|
368
|
-
ZSTDv05_error_dstSize_tooSmall,
|
|
369
|
-
ZSTDv05_error_srcSize_wrong,
|
|
370
|
-
ZSTDv05_error_corruption_detected,
|
|
371
|
-
ZSTDv05_error_tableLog_tooLarge,
|
|
372
|
-
ZSTDv05_error_maxSymbolValue_tooLarge,
|
|
373
|
-
ZSTDv05_error_maxSymbolValue_tooSmall,
|
|
374
|
-
ZSTDv05_error_dictionary_corrupted,
|
|
375
|
-
ZSTDv05_error_maxCode
|
|
376
|
-
} ZSTDv05_ErrorCode;
|
|
377
|
-
|
|
378
|
-
/* note : functions provide error codes in reverse negative order,
|
|
379
|
-
so compare with (size_t)(0-enum) */
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
#if defined (__cplusplus)
|
|
383
|
-
}
|
|
384
|
-
#endif
|
|
385
|
-
|
|
386
|
-
#endif /* ERROR_PUBLIC_H_MODULE */
|
|
387
|
-
|
|
388
|
-
|
|
389
259
|
/*
|
|
390
260
|
zstd - standard compression library
|
|
391
261
|
Header File for static linking only
|
|
@@ -457,13 +327,6 @@ size_t ZSTDv05_decompress_usingPreparedDCtx(
|
|
|
457
327
|
* Streaming functions (direct mode)
|
|
458
328
|
****************************************/
|
|
459
329
|
size_t ZSTDv05_decompressBegin(ZSTDv05_DCtx* dctx);
|
|
460
|
-
size_t ZSTDv05_decompressBegin_usingDict(ZSTDv05_DCtx* dctx, const void* dict, size_t dictSize);
|
|
461
|
-
void ZSTDv05_copyDCtx(ZSTDv05_DCtx* dctx, const ZSTDv05_DCtx* preparedDCtx);
|
|
462
|
-
|
|
463
|
-
size_t ZSTDv05_getFrameParams(ZSTDv05_parameters* params, const void* src, size_t srcSize);
|
|
464
|
-
|
|
465
|
-
size_t ZSTDv05_nextSrcSizeToDecompress(ZSTDv05_DCtx* dctx);
|
|
466
|
-
size_t ZSTDv05_decompressContinue(ZSTDv05_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
|
|
467
330
|
|
|
468
331
|
/*
|
|
469
332
|
Streaming decompression, direct mode (bufferless)
|
|
@@ -529,119 +392,6 @@ size_t ZSTDv05_decompressBlock(ZSTDv05_DCtx* dctx, void* dst, size_t dstCapacity
|
|
|
529
392
|
#endif /* ZSTDv05_STATIC_H */
|
|
530
393
|
|
|
531
394
|
|
|
532
|
-
|
|
533
|
-
/* ******************************************************************
|
|
534
|
-
Error codes and messages
|
|
535
|
-
Copyright (C) 2013-2016, Yann Collet
|
|
536
|
-
|
|
537
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
538
|
-
|
|
539
|
-
Redistribution and use in source and binary forms, with or without
|
|
540
|
-
modification, are permitted provided that the following conditions are
|
|
541
|
-
met:
|
|
542
|
-
|
|
543
|
-
* Redistributions of source code must retain the above copyright
|
|
544
|
-
notice, this list of conditions and the following disclaimer.
|
|
545
|
-
* Redistributions in binary form must reproduce the above
|
|
546
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
547
|
-
in the documentation and/or other materials provided with the
|
|
548
|
-
distribution.
|
|
549
|
-
|
|
550
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
551
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
552
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
553
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
554
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
555
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
556
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
557
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
558
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
559
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
560
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
561
|
-
|
|
562
|
-
You can contact the author at :
|
|
563
|
-
- Source repository : https://github.com/Cyan4973/zstd
|
|
564
|
-
****************************************************************** */
|
|
565
|
-
/* Note : this module is expected to remain private, do not expose it */
|
|
566
|
-
|
|
567
|
-
#ifndef ERROR_H_MODULE
|
|
568
|
-
#define ERROR_H_MODULE
|
|
569
|
-
|
|
570
|
-
#if defined (__cplusplus)
|
|
571
|
-
extern "C" {
|
|
572
|
-
#endif
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
/* ****************************************
|
|
577
|
-
* Compiler-specific
|
|
578
|
-
******************************************/
|
|
579
|
-
#if defined(__GNUC__)
|
|
580
|
-
# define ERR_STATIC static __attribute__((unused))
|
|
581
|
-
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
|
582
|
-
# define ERR_STATIC static inline
|
|
583
|
-
#elif defined(_MSC_VER)
|
|
584
|
-
# define ERR_STATIC static __inline
|
|
585
|
-
#else
|
|
586
|
-
# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
|
587
|
-
#endif
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
/*-****************************************
|
|
591
|
-
* Customization
|
|
592
|
-
******************************************/
|
|
593
|
-
typedef ZSTDv05_ErrorCode ERR_enum;
|
|
594
|
-
#define PREFIX(name) ZSTDv05_error_##name
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
/*-****************************************
|
|
598
|
-
* Error codes handling
|
|
599
|
-
******************************************/
|
|
600
|
-
#ifdef ERROR
|
|
601
|
-
# undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */
|
|
602
|
-
#endif
|
|
603
|
-
#define ERROR(name) (size_t)-PREFIX(name)
|
|
604
|
-
|
|
605
|
-
ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
|
606
|
-
|
|
607
|
-
ERR_STATIC ERR_enum ERR_getError(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); }
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
/*-****************************************
|
|
611
|
-
* Error Strings
|
|
612
|
-
******************************************/
|
|
613
|
-
|
|
614
|
-
ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
615
|
-
{
|
|
616
|
-
static const char* notErrorCode = "Unspecified error code";
|
|
617
|
-
switch( ERR_getError(code) )
|
|
618
|
-
{
|
|
619
|
-
case PREFIX(no_error): return "No error detected";
|
|
620
|
-
case PREFIX(GENERIC): return "Error (generic)";
|
|
621
|
-
case PREFIX(prefix_unknown): return "Unknown frame descriptor";
|
|
622
|
-
case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter";
|
|
623
|
-
case PREFIX(frameParameter_unsupportedBy32bits): return "Frame parameter unsupported in 32-bits mode";
|
|
624
|
-
case PREFIX(init_missing): return "Context should be init first";
|
|
625
|
-
case PREFIX(memory_allocation): return "Allocation error : not enough memory";
|
|
626
|
-
case PREFIX(stage_wrong): return "Operation not authorized at current processing stage";
|
|
627
|
-
case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
|
|
628
|
-
case PREFIX(srcSize_wrong): return "Src size incorrect";
|
|
629
|
-
case PREFIX(corruption_detected): return "Corrupted block detected";
|
|
630
|
-
case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory";
|
|
631
|
-
case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max possible Symbol Value : too large";
|
|
632
|
-
case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";
|
|
633
|
-
case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";
|
|
634
|
-
case PREFIX(maxCode):
|
|
635
|
-
default: return notErrorCode; /* should be impossible, due to ERR_getError() */
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
#if defined (__cplusplus)
|
|
641
|
-
}
|
|
642
|
-
#endif
|
|
643
|
-
|
|
644
|
-
#endif /* ERROR_H_MODULE */
|
|
645
395
|
/*
|
|
646
396
|
zstd_internal - common functions to include
|
|
647
397
|
Header File for include
|
|
@@ -741,6 +491,8 @@ static const size_t ZSTDv05_frameHeaderSize_min = 5;
|
|
|
741
491
|
|
|
742
492
|
#define WILDCOPY_OVERLENGTH 8
|
|
743
493
|
|
|
494
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
|
495
|
+
|
|
744
496
|
typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|
745
497
|
|
|
746
498
|
|
|
@@ -753,7 +505,7 @@ static void ZSTDv05_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
|
753
505
|
|
|
754
506
|
/*! ZSTDv05_wildcopy() :
|
|
755
507
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
|
756
|
-
MEM_STATIC void ZSTDv05_wildcopy(void* dst, const void* src,
|
|
508
|
+
MEM_STATIC void ZSTDv05_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
|
757
509
|
{
|
|
758
510
|
const BYTE* ip = (const BYTE*)src;
|
|
759
511
|
BYTE* op = (BYTE*)dst;
|
|
@@ -763,28 +515,6 @@ MEM_STATIC void ZSTDv05_wildcopy(void* dst, const void* src, size_t length)
|
|
|
763
515
|
while (op < oend);
|
|
764
516
|
}
|
|
765
517
|
|
|
766
|
-
MEM_STATIC unsigned ZSTDv05_highbit(U32 val)
|
|
767
|
-
{
|
|
768
|
-
# if defined(_MSC_VER) /* Visual */
|
|
769
|
-
unsigned long r=0;
|
|
770
|
-
_BitScanReverse(&r, val);
|
|
771
|
-
return (unsigned)r;
|
|
772
|
-
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
|
|
773
|
-
return 31 - __builtin_clz(val);
|
|
774
|
-
# else /* Software version */
|
|
775
|
-
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 };
|
|
776
|
-
U32 v = val;
|
|
777
|
-
int r;
|
|
778
|
-
v |= v >> 1;
|
|
779
|
-
v |= v >> 2;
|
|
780
|
-
v |= v >> 4;
|
|
781
|
-
v |= v >> 8;
|
|
782
|
-
v |= v >> 16;
|
|
783
|
-
r = DeBruijnClz[(U32)(v * 0x07C4ACDDU) >> 27];
|
|
784
|
-
return r;
|
|
785
|
-
# endif
|
|
786
|
-
}
|
|
787
|
-
|
|
788
518
|
|
|
789
519
|
/*-*******************************************
|
|
790
520
|
* Private interfaces
|
|
@@ -916,16 +646,16 @@ void FSEv05_freeDTable(FSEv05_DTable* dt);
|
|
|
916
646
|
/*!
|
|
917
647
|
FSEv05_buildDTable():
|
|
918
648
|
Builds 'dt', which must be already allocated, using FSEv05_createDTable()
|
|
919
|
-
return : 0,
|
|
920
|
-
|
|
649
|
+
@return : 0,
|
|
650
|
+
or an errorCode, which can be tested using FSEv05_isError() */
|
|
921
651
|
size_t FSEv05_buildDTable (FSEv05_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
|
922
652
|
|
|
923
653
|
/*!
|
|
924
654
|
FSEv05_decompress_usingDTable():
|
|
925
|
-
Decompress compressed source @cSrc of size @cSrcSize using
|
|
926
|
-
into
|
|
927
|
-
return : size of regenerated data (necessarily <= @dstCapacity)
|
|
928
|
-
|
|
655
|
+
Decompress compressed source @cSrc of size @cSrcSize using `dt`
|
|
656
|
+
into `dst` which must be already allocated.
|
|
657
|
+
@return : size of regenerated data (necessarily <= @dstCapacity)
|
|
658
|
+
or an errorCode, which can be tested using FSEv05_isError() */
|
|
929
659
|
size_t FSEv05_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSEv05_DTable* dt);
|
|
930
660
|
|
|
931
661
|
|
|
@@ -1008,18 +738,6 @@ MEM_STATIC BITv05_DStream_status BITv05_reloadDStream(BITv05_DStream_t* bitD);
|
|
|
1008
738
|
MEM_STATIC unsigned BITv05_endOfDStream(const BITv05_DStream_t* bitD);
|
|
1009
739
|
|
|
1010
740
|
|
|
1011
|
-
/*!
|
|
1012
|
-
* Start by invoking BITv05_initDStream().
|
|
1013
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
1014
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
1015
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
1016
|
-
* Local register is explicitly reloaded from memory by the BITv05_reloadDStream() method.
|
|
1017
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BITv05_DStream_unfinished.
|
|
1018
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
1019
|
-
* Checking if DStream has reached its end can be performed with BITv05_endOfDStream()
|
|
1020
|
-
*/
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
741
|
/*-****************************************
|
|
1024
742
|
* unsafe API
|
|
1025
743
|
******************************************/
|
|
@@ -1031,14 +749,14 @@ MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, unsigned nbBits);
|
|
|
1031
749
|
/*-**************************************************************
|
|
1032
750
|
* Helper functions
|
|
1033
751
|
****************************************************************/
|
|
1034
|
-
MEM_STATIC unsigned BITv05_highbit32 (
|
|
752
|
+
MEM_STATIC unsigned BITv05_highbit32 (U32 val)
|
|
1035
753
|
{
|
|
1036
754
|
# if defined(_MSC_VER) /* Visual */
|
|
1037
755
|
unsigned long r=0;
|
|
1038
756
|
_BitScanReverse ( &r, val );
|
|
1039
757
|
return (unsigned) r;
|
|
1040
758
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
1041
|
-
return
|
|
759
|
+
return __builtin_clz (val) ^ 31;
|
|
1042
760
|
# else /* Software version */
|
|
1043
761
|
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 };
|
|
1044
762
|
U32 v = val;
|
|
@@ -1084,13 +802,13 @@ MEM_STATIC size_t BITv05_initDStream(BITv05_DStream_t* bitD, const void* srcBuff
|
|
|
1084
802
|
bitD->bitContainer = *(const BYTE*)(bitD->start);
|
|
1085
803
|
switch(srcSize)
|
|
1086
804
|
{
|
|
1087
|
-
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16)
|
|
1088
|
-
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24)
|
|
1089
|
-
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32)
|
|
1090
|
-
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
|
|
1091
|
-
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
|
|
1092
|
-
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
|
|
1093
|
-
default
|
|
805
|
+
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);/* fall-through */
|
|
806
|
+
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);/* fall-through */
|
|
807
|
+
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);/* fall-through */
|
|
808
|
+
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24; /* fall-through */
|
|
809
|
+
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16; /* fall-through */
|
|
810
|
+
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8; /* fall-through */
|
|
811
|
+
default: break;
|
|
1094
812
|
}
|
|
1095
813
|
contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
|
|
1096
814
|
if (contain32 == 0) return ERROR(GENERIC); /* endMark not present */
|
|
@@ -1101,13 +819,6 @@ MEM_STATIC size_t BITv05_initDStream(BITv05_DStream_t* bitD, const void* srcBuff
|
|
|
1101
819
|
return srcSize;
|
|
1102
820
|
}
|
|
1103
821
|
|
|
1104
|
-
/*!BITv05_lookBits
|
|
1105
|
-
* Provides next n bits from local register
|
|
1106
|
-
* local register is not modified (bits are still present for next read/look)
|
|
1107
|
-
* On 32-bits, maxNbBits==25
|
|
1108
|
-
* On 64-bits, maxNbBits==57
|
|
1109
|
-
* @return : value extracted
|
|
1110
|
-
*/
|
|
1111
822
|
MEM_STATIC size_t BITv05_lookBits(BITv05_DStream_t* bitD, U32 nbBits)
|
|
1112
823
|
{
|
|
1113
824
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
@@ -1127,12 +838,7 @@ MEM_STATIC void BITv05_skipBits(BITv05_DStream_t* bitD, U32 nbBits)
|
|
|
1127
838
|
bitD->bitsConsumed += nbBits;
|
|
1128
839
|
}
|
|
1129
840
|
|
|
1130
|
-
|
|
1131
|
-
* Read next n bits from local register.
|
|
1132
|
-
* pay attention to not read more than nbBits contained into local register.
|
|
1133
|
-
* @return : extracted value.
|
|
1134
|
-
*/
|
|
1135
|
-
MEM_STATIC size_t BITv05_readBits(BITv05_DStream_t* bitD, U32 nbBits)
|
|
841
|
+
MEM_STATIC size_t BITv05_readBits(BITv05_DStream_t* bitD, unsigned nbBits)
|
|
1136
842
|
{
|
|
1137
843
|
size_t value = BITv05_lookBits(bitD, nbBits);
|
|
1138
844
|
BITv05_skipBits(bitD, nbBits);
|
|
@@ -1141,7 +847,7 @@ MEM_STATIC size_t BITv05_readBits(BITv05_DStream_t* bitD, U32 nbBits)
|
|
|
1141
847
|
|
|
1142
848
|
/*!BITv05_readBitsFast :
|
|
1143
849
|
* unsafe version; only works only if nbBits >= 1 */
|
|
1144
|
-
MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD,
|
|
850
|
+
MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, unsigned nbBits)
|
|
1145
851
|
{
|
|
1146
852
|
size_t value = BITv05_lookBitsFast(bitD, nbBits);
|
|
1147
853
|
BITv05_skipBits(bitD, nbBits);
|
|
@@ -1150,8 +856,8 @@ MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, U32 nbBits)
|
|
|
1150
856
|
|
|
1151
857
|
MEM_STATIC BITv05_DStream_status BITv05_reloadDStream(BITv05_DStream_t* bitD)
|
|
1152
858
|
{
|
|
1153
|
-
|
|
1154
|
-
|
|
859
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
|
860
|
+
return BITv05_DStream_overflow;
|
|
1155
861
|
|
|
1156
862
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) {
|
|
1157
863
|
bitD->ptr -= bitD->bitsConsumed >> 3;
|
|
@@ -1267,54 +973,6 @@ static unsigned char FSEv05_decodeSymbol(FSEv05_DState_t* DStatePtr, BITv05_DStr
|
|
|
1267
973
|
|
|
1268
974
|
static unsigned FSEv05_endOfDState(const FSEv05_DState_t* DStatePtr);
|
|
1269
975
|
|
|
1270
|
-
/*!
|
|
1271
|
-
Let's now decompose FSEv05_decompress_usingDTable() into its unitary components.
|
|
1272
|
-
You will decode FSEv05-encoded symbols from the bitStream,
|
|
1273
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
1274
|
-
|
|
1275
|
-
You will need a few variables to track your bitStream. They are :
|
|
1276
|
-
|
|
1277
|
-
BITv05_DStream_t DStream; // Stream context
|
|
1278
|
-
FSEv05_DState_t DState; // State context. Multiple ones are possible
|
|
1279
|
-
FSEv05_DTable* DTablePtr; // Decoding table, provided by FSEv05_buildDTable()
|
|
1280
|
-
|
|
1281
|
-
The first thing to do is to init the bitStream.
|
|
1282
|
-
errorCode = BITv05_initDStream(&DStream, srcBuffer, srcSize);
|
|
1283
|
-
|
|
1284
|
-
You should then retrieve your initial state(s)
|
|
1285
|
-
(in reverse flushing order if you have several ones) :
|
|
1286
|
-
errorCode = FSEv05_initDState(&DState, &DStream, DTablePtr);
|
|
1287
|
-
|
|
1288
|
-
You can then decode your data, symbol after symbol.
|
|
1289
|
-
For information the maximum number of bits read by FSEv05_decodeSymbol() is 'tableLog'.
|
|
1290
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
1291
|
-
unsigned char symbol = FSEv05_decodeSymbol(&DState, &DStream);
|
|
1292
|
-
|
|
1293
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
1294
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
1295
|
-
size_t bitField = BITv05_readBits(&DStream, nbBits);
|
|
1296
|
-
|
|
1297
|
-
All above operations only read from local register (which size depends on size_t).
|
|
1298
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
1299
|
-
endSignal = FSEv05_reloadDStream(&DStream);
|
|
1300
|
-
|
|
1301
|
-
BITv05_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
1302
|
-
BITv05_DStream_unfinished : there is still some data left into the DStream.
|
|
1303
|
-
BITv05_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
1304
|
-
BITv05_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
1305
|
-
BITv05_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
1306
|
-
|
|
1307
|
-
When reaching end of buffer (BITv05_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
1308
|
-
to properly detect the exact end of stream.
|
|
1309
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
1310
|
-
BITv05_reloadDStream(&DStream) >= BITv05_DStream_completed
|
|
1311
|
-
|
|
1312
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
1313
|
-
Checking if DStream has reached its end is performed by :
|
|
1314
|
-
BITv05_endOfDStream(&DStream);
|
|
1315
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
1316
|
-
FSEv05_endOfDState(&DState);
|
|
1317
|
-
*/
|
|
1318
976
|
|
|
1319
977
|
|
|
1320
978
|
/* *****************************************
|
|
@@ -1350,11 +1008,6 @@ MEM_STATIC void FSEv05_initDState(FSEv05_DState_t* DStatePtr, BITv05_DStream_t*
|
|
|
1350
1008
|
DStatePtr->table = dt + 1;
|
|
1351
1009
|
}
|
|
1352
1010
|
|
|
1353
|
-
MEM_STATIC size_t FSEv05_getStateValue(FSEv05_DState_t* DStatePtr)
|
|
1354
|
-
{
|
|
1355
|
-
return DStatePtr->state;
|
|
1356
|
-
}
|
|
1357
|
-
|
|
1358
1011
|
MEM_STATIC BYTE FSEv05_peakSymbol(FSEv05_DState_t* DStatePtr)
|
|
1359
1012
|
{
|
|
1360
1013
|
const FSEv05_decode_t DInfo = ((const FSEv05_decode_t*)(DStatePtr->table))[DStatePtr->state];
|
|
@@ -1466,12 +1119,15 @@ MEM_STATIC unsigned FSEv05_endOfDState(const FSEv05_DState_t* DStatePtr)
|
|
|
1466
1119
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
1467
1120
|
# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
|
|
1468
1121
|
#else
|
|
1469
|
-
#
|
|
1470
|
-
#
|
|
1471
|
-
#
|
|
1122
|
+
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
|
1123
|
+
# ifdef __GNUC__
|
|
1124
|
+
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
1125
|
+
# else
|
|
1126
|
+
# define FORCE_INLINE static inline
|
|
1127
|
+
# endif
|
|
1472
1128
|
# else
|
|
1473
|
-
# define FORCE_INLINE static
|
|
1474
|
-
# endif
|
|
1129
|
+
# define FORCE_INLINE static
|
|
1130
|
+
# endif /* __STDC_VERSION__ */
|
|
1475
1131
|
#endif
|
|
1476
1132
|
|
|
1477
1133
|
|
|
@@ -1508,7 +1164,7 @@ MEM_STATIC unsigned FSEv05_endOfDState(const FSEv05_DState_t* DStatePtr)
|
|
|
1508
1164
|
/* **************************************************************
|
|
1509
1165
|
* Complex types
|
|
1510
1166
|
****************************************************************/
|
|
1511
|
-
typedef
|
|
1167
|
+
typedef unsigned DTable_max_t[FSEv05_DTABLE_SIZE_U32(FSEv05_MAX_TABLELOG)];
|
|
1512
1168
|
|
|
1513
1169
|
|
|
1514
1170
|
/* **************************************************************
|
|
@@ -1570,6 +1226,7 @@ size_t FSEv05_buildDTable(FSEv05_DTable* dt, const short* normalizedCounter, uns
|
|
|
1570
1226
|
if (tableLog > FSEv05_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
|
|
1571
1227
|
|
|
1572
1228
|
/* Init, lay down lowprob symbols */
|
|
1229
|
+
memset(tableDecode, 0, sizeof(FSEv05_FUNCTION_TYPE) * (maxSymbolValue+1) ); /* useless init, but keep static analyzer happy, and we don't need to performance optimize legacy decoders */
|
|
1573
1230
|
DTableH.tableLog = (U16)tableLog;
|
|
1574
1231
|
for (s=0; s<=maxSymbolValue; s++) {
|
|
1575
1232
|
if (normalizedCounter[s]==-1) {
|
|
@@ -2088,14 +1745,7 @@ size_t HUFv05_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void
|
|
|
2088
1745
|
|
|
2089
1746
|
|
|
2090
1747
|
#ifdef _MSC_VER /* Visual Studio */
|
|
2091
|
-
# define FORCE_INLINE static __forceinline
|
|
2092
1748
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
2093
|
-
#else
|
|
2094
|
-
# ifdef __GNUC__
|
|
2095
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
2096
|
-
# else
|
|
2097
|
-
# define FORCE_INLINE static inline
|
|
2098
|
-
# endif
|
|
2099
1749
|
#endif
|
|
2100
1750
|
|
|
2101
1751
|
|
|
@@ -2148,11 +1798,13 @@ static size_t HUFv05_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
2148
1798
|
U32 weightTotal;
|
|
2149
1799
|
U32 tableLog;
|
|
2150
1800
|
const BYTE* ip = (const BYTE*) src;
|
|
2151
|
-
size_t iSize
|
|
1801
|
+
size_t iSize;
|
|
2152
1802
|
size_t oSize;
|
|
2153
1803
|
U32 n;
|
|
2154
1804
|
|
|
2155
|
-
|
|
1805
|
+
if (!srcSize) return ERROR(srcSize_wrong);
|
|
1806
|
+
iSize = ip[0];
|
|
1807
|
+
/* memset(huffWeight, 0, hwSize); */ /* is not necessary, even though some analyzer complain ... */
|
|
2156
1808
|
|
|
2157
1809
|
if (iSize >= 128) { /* special header */
|
|
2158
1810
|
if (iSize >= (242)) { /* RLE */
|
|
@@ -2185,6 +1837,7 @@ static size_t HUFv05_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
2185
1837
|
rankStats[huffWeight[n]]++;
|
|
2186
1838
|
weightTotal += (1 << huffWeight[n]) >> 1;
|
|
2187
1839
|
}
|
|
1840
|
+
if (weightTotal == 0) return ERROR(corruption_detected);
|
|
2188
1841
|
|
|
2189
1842
|
/* get last non-null symbol weight (implied, total must be 2^n) */
|
|
2190
1843
|
tableLog = BITv05_highbit32(weightTotal) + 1;
|
|
@@ -2226,7 +1879,7 @@ size_t HUFv05_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
|
|
|
2226
1879
|
HUFv05_DEltX2* const dt = (HUFv05_DEltX2*)dtPtr;
|
|
2227
1880
|
|
|
2228
1881
|
HUFv05_STATIC_ASSERT(sizeof(HUFv05_DEltX2) == sizeof(U16)); /* if compilation fails here, assertion is false */
|
|
2229
|
-
|
|
1882
|
+
/* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2230
1883
|
|
|
2231
1884
|
iSize = HUFv05_readStats(huffWeight, HUFv05_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
|
|
2232
1885
|
if (HUFv05_isError(iSize)) return iSize;
|
|
@@ -2307,13 +1960,14 @@ size_t HUFv05_decompress1X2_usingDTable(
|
|
|
2307
1960
|
{
|
|
2308
1961
|
BYTE* op = (BYTE*)dst;
|
|
2309
1962
|
BYTE* const oend = op + dstSize;
|
|
2310
|
-
size_t errorCode;
|
|
2311
1963
|
const U32 dtLog = DTable[0];
|
|
2312
1964
|
const void* dtPtr = DTable;
|
|
2313
1965
|
const HUFv05_DEltX2* const dt = ((const HUFv05_DEltX2*)dtPtr)+1;
|
|
2314
1966
|
BITv05_DStream_t bitD;
|
|
2315
|
-
|
|
2316
|
-
if (
|
|
1967
|
+
|
|
1968
|
+
if (dstSize <= cSrcSize) return ERROR(dstSize_tooSmall);
|
|
1969
|
+
{ size_t const errorCode = BITv05_initDStream(&bitD, cSrc, cSrcSize);
|
|
1970
|
+
if (HUFv05_isError(errorCode)) return errorCode; }
|
|
2317
1971
|
|
|
2318
1972
|
HUFv05_decodeStreamX2(op, &bitD, oend, dt, dtLog);
|
|
2319
1973
|
|
|
@@ -2344,91 +1998,92 @@ size_t HUFv05_decompress4X2_usingDTable(
|
|
|
2344
1998
|
const void* cSrc, size_t cSrcSize,
|
|
2345
1999
|
const U16* DTable)
|
|
2346
2000
|
{
|
|
2347
|
-
const BYTE* const istart = (const BYTE*) cSrc;
|
|
2348
|
-
BYTE* const ostart = (BYTE*) dst;
|
|
2349
|
-
BYTE* const oend = ostart + dstSize;
|
|
2350
|
-
const void* const dtPtr = DTable;
|
|
2351
|
-
const HUFv05_DEltX2* const dt = ((const HUFv05_DEltX2*)dtPtr) +1;
|
|
2352
|
-
const U32 dtLog = DTable[0];
|
|
2353
|
-
size_t errorCode;
|
|
2354
|
-
|
|
2355
|
-
/* Init */
|
|
2356
|
-
BITv05_DStream_t bitD1;
|
|
2357
|
-
BITv05_DStream_t bitD2;
|
|
2358
|
-
BITv05_DStream_t bitD3;
|
|
2359
|
-
BITv05_DStream_t bitD4;
|
|
2360
|
-
const size_t length1 = MEM_readLE16(istart);
|
|
2361
|
-
const size_t length2 = MEM_readLE16(istart+2);
|
|
2362
|
-
const size_t length3 = MEM_readLE16(istart+4);
|
|
2363
|
-
size_t length4;
|
|
2364
|
-
const BYTE* const istart1 = istart + 6; /* jumpTable */
|
|
2365
|
-
const BYTE* const istart2 = istart1 + length1;
|
|
2366
|
-
const BYTE* const istart3 = istart2 + length2;
|
|
2367
|
-
const BYTE* const istart4 = istart3 + length3;
|
|
2368
|
-
const size_t segmentSize = (dstSize+3) / 4;
|
|
2369
|
-
BYTE* const opStart2 = ostart + segmentSize;
|
|
2370
|
-
BYTE* const opStart3 = opStart2 + segmentSize;
|
|
2371
|
-
BYTE* const opStart4 = opStart3 + segmentSize;
|
|
2372
|
-
BYTE* op1 = ostart;
|
|
2373
|
-
BYTE* op2 = opStart2;
|
|
2374
|
-
BYTE* op3 = opStart3;
|
|
2375
|
-
BYTE* op4 = opStart4;
|
|
2376
|
-
U32 endSignal;
|
|
2377
|
-
|
|
2378
2001
|
/* Check */
|
|
2379
2002
|
if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
|
|
2003
|
+
{
|
|
2004
|
+
const BYTE* const istart = (const BYTE*) cSrc;
|
|
2005
|
+
BYTE* const ostart = (BYTE*) dst;
|
|
2006
|
+
BYTE* const oend = ostart + dstSize;
|
|
2007
|
+
const void* const dtPtr = DTable;
|
|
2008
|
+
const HUFv05_DEltX2* const dt = ((const HUFv05_DEltX2*)dtPtr) +1;
|
|
2009
|
+
const U32 dtLog = DTable[0];
|
|
2010
|
+
size_t errorCode;
|
|
2380
2011
|
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2012
|
+
/* Init */
|
|
2013
|
+
BITv05_DStream_t bitD1;
|
|
2014
|
+
BITv05_DStream_t bitD2;
|
|
2015
|
+
BITv05_DStream_t bitD3;
|
|
2016
|
+
BITv05_DStream_t bitD4;
|
|
2017
|
+
const size_t length1 = MEM_readLE16(istart);
|
|
2018
|
+
const size_t length2 = MEM_readLE16(istart+2);
|
|
2019
|
+
const size_t length3 = MEM_readLE16(istart+4);
|
|
2020
|
+
size_t length4;
|
|
2021
|
+
const BYTE* const istart1 = istart + 6; /* jumpTable */
|
|
2022
|
+
const BYTE* const istart2 = istart1 + length1;
|
|
2023
|
+
const BYTE* const istart3 = istart2 + length2;
|
|
2024
|
+
const BYTE* const istart4 = istart3 + length3;
|
|
2025
|
+
const size_t segmentSize = (dstSize+3) / 4;
|
|
2026
|
+
BYTE* const opStart2 = ostart + segmentSize;
|
|
2027
|
+
BYTE* const opStart3 = opStart2 + segmentSize;
|
|
2028
|
+
BYTE* const opStart4 = opStart3 + segmentSize;
|
|
2029
|
+
BYTE* op1 = ostart;
|
|
2030
|
+
BYTE* op2 = opStart2;
|
|
2031
|
+
BYTE* op3 = opStart3;
|
|
2032
|
+
BYTE* op4 = opStart4;
|
|
2033
|
+
U32 endSignal;
|
|
2391
2034
|
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
HUFv05_DECODE_SYMBOLX2_2(op2, &bitD2);
|
|
2405
|
-
HUFv05_DECODE_SYMBOLX2_2(op3, &bitD3);
|
|
2406
|
-
HUFv05_DECODE_SYMBOLX2_2(op4, &bitD4);
|
|
2407
|
-
HUFv05_DECODE_SYMBOLX2_0(op1, &bitD1);
|
|
2408
|
-
HUFv05_DECODE_SYMBOLX2_0(op2, &bitD2);
|
|
2409
|
-
HUFv05_DECODE_SYMBOLX2_0(op3, &bitD3);
|
|
2410
|
-
HUFv05_DECODE_SYMBOLX2_0(op4, &bitD4);
|
|
2035
|
+
length4 = cSrcSize - (length1 + length2 + length3 + 6);
|
|
2036
|
+
if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
|
|
2037
|
+
errorCode = BITv05_initDStream(&bitD1, istart1, length1);
|
|
2038
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2039
|
+
errorCode = BITv05_initDStream(&bitD2, istart2, length2);
|
|
2040
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2041
|
+
errorCode = BITv05_initDStream(&bitD3, istart3, length3);
|
|
2042
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2043
|
+
errorCode = BITv05_initDStream(&bitD4, istart4, length4);
|
|
2044
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2045
|
+
|
|
2046
|
+
/* 16-32 symbols per loop (4-8 symbols per stream) */
|
|
2411
2047
|
endSignal = BITv05_reloadDStream(&bitD1) | BITv05_reloadDStream(&bitD2) | BITv05_reloadDStream(&bitD3) | BITv05_reloadDStream(&bitD4);
|
|
2412
|
-
|
|
2048
|
+
for ( ; (endSignal==BITv05_DStream_unfinished) && (op4<(oend-7)) ; ) {
|
|
2049
|
+
HUFv05_DECODE_SYMBOLX2_2(op1, &bitD1);
|
|
2050
|
+
HUFv05_DECODE_SYMBOLX2_2(op2, &bitD2);
|
|
2051
|
+
HUFv05_DECODE_SYMBOLX2_2(op3, &bitD3);
|
|
2052
|
+
HUFv05_DECODE_SYMBOLX2_2(op4, &bitD4);
|
|
2053
|
+
HUFv05_DECODE_SYMBOLX2_1(op1, &bitD1);
|
|
2054
|
+
HUFv05_DECODE_SYMBOLX2_1(op2, &bitD2);
|
|
2055
|
+
HUFv05_DECODE_SYMBOLX2_1(op3, &bitD3);
|
|
2056
|
+
HUFv05_DECODE_SYMBOLX2_1(op4, &bitD4);
|
|
2057
|
+
HUFv05_DECODE_SYMBOLX2_2(op1, &bitD1);
|
|
2058
|
+
HUFv05_DECODE_SYMBOLX2_2(op2, &bitD2);
|
|
2059
|
+
HUFv05_DECODE_SYMBOLX2_2(op3, &bitD3);
|
|
2060
|
+
HUFv05_DECODE_SYMBOLX2_2(op4, &bitD4);
|
|
2061
|
+
HUFv05_DECODE_SYMBOLX2_0(op1, &bitD1);
|
|
2062
|
+
HUFv05_DECODE_SYMBOLX2_0(op2, &bitD2);
|
|
2063
|
+
HUFv05_DECODE_SYMBOLX2_0(op3, &bitD3);
|
|
2064
|
+
HUFv05_DECODE_SYMBOLX2_0(op4, &bitD4);
|
|
2065
|
+
endSignal = BITv05_reloadDStream(&bitD1) | BITv05_reloadDStream(&bitD2) | BITv05_reloadDStream(&bitD3) | BITv05_reloadDStream(&bitD4);
|
|
2066
|
+
}
|
|
2413
2067
|
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2068
|
+
/* check corruption */
|
|
2069
|
+
if (op1 > opStart2) return ERROR(corruption_detected);
|
|
2070
|
+
if (op2 > opStart3) return ERROR(corruption_detected);
|
|
2071
|
+
if (op3 > opStart4) return ERROR(corruption_detected);
|
|
2072
|
+
/* note : op4 supposed already verified within main loop */
|
|
2419
2073
|
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2074
|
+
/* finish bitStreams one by one */
|
|
2075
|
+
HUFv05_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
|
|
2076
|
+
HUFv05_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
|
|
2077
|
+
HUFv05_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
|
|
2078
|
+
HUFv05_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);
|
|
2425
2079
|
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2080
|
+
/* check */
|
|
2081
|
+
endSignal = BITv05_endOfDStream(&bitD1) & BITv05_endOfDStream(&bitD2) & BITv05_endOfDStream(&bitD3) & BITv05_endOfDStream(&bitD4);
|
|
2082
|
+
if (!endSignal) return ERROR(corruption_detected);
|
|
2429
2083
|
|
|
2430
|
-
|
|
2431
|
-
|
|
2084
|
+
/* decoded size */
|
|
2085
|
+
return dstSize;
|
|
2086
|
+
}
|
|
2432
2087
|
}
|
|
2433
2088
|
|
|
2434
2089
|
|
|
@@ -2539,7 +2194,7 @@ static void HUFv05_fillDTableX4(HUFv05_DEltX4* DTable, const U32 targetLog,
|
|
|
2539
2194
|
}
|
|
2540
2195
|
}
|
|
2541
2196
|
|
|
2542
|
-
size_t HUFv05_readDTableX4 (
|
|
2197
|
+
size_t HUFv05_readDTableX4 (unsigned* DTable, const void* src, size_t srcSize)
|
|
2543
2198
|
{
|
|
2544
2199
|
BYTE weightList[HUFv05_MAX_SYMBOL_VALUE + 1];
|
|
2545
2200
|
sortedSymbol_t sortedSymbol[HUFv05_MAX_SYMBOL_VALUE + 1];
|
|
@@ -2553,9 +2208,9 @@ size_t HUFv05_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
|
|
|
2553
2208
|
void* dtPtr = DTable;
|
|
2554
2209
|
HUFv05_DEltX4* const dt = ((HUFv05_DEltX4*)dtPtr) + 1;
|
|
2555
2210
|
|
|
2556
|
-
HUFv05_STATIC_ASSERT(sizeof(HUFv05_DEltX4) == sizeof(
|
|
2211
|
+
HUFv05_STATIC_ASSERT(sizeof(HUFv05_DEltX4) == sizeof(unsigned)); /* if compilation fails here, assertion is false */
|
|
2557
2212
|
if (memLog > HUFv05_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
|
|
2558
|
-
|
|
2213
|
+
/* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2559
2214
|
|
|
2560
2215
|
iSize = HUFv05_readStats(weightList, HUFv05_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
|
|
2561
2216
|
if (HUFv05_isError(iSize)) return iSize;
|
|
@@ -2680,7 +2335,7 @@ static inline size_t HUFv05_decodeStreamX4(BYTE* p, BITv05_DStream_t* bitDPtr, B
|
|
|
2680
2335
|
size_t HUFv05_decompress1X4_usingDTable(
|
|
2681
2336
|
void* dst, size_t dstSize,
|
|
2682
2337
|
const void* cSrc, size_t cSrcSize,
|
|
2683
|
-
const
|
|
2338
|
+
const unsigned* DTable)
|
|
2684
2339
|
{
|
|
2685
2340
|
const BYTE* const istart = (const BYTE*) cSrc;
|
|
2686
2341
|
BYTE* const ostart = (BYTE*) dst;
|
|
@@ -2723,7 +2378,7 @@ size_t HUFv05_decompress1X4 (void* dst, size_t dstSize, const void* cSrc, size_t
|
|
|
2723
2378
|
size_t HUFv05_decompress4X4_usingDTable(
|
|
2724
2379
|
void* dst, size_t dstSize,
|
|
2725
2380
|
const void* cSrc, size_t cSrcSize,
|
|
2726
|
-
const
|
|
2381
|
+
const unsigned* DTable)
|
|
2727
2382
|
{
|
|
2728
2383
|
if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
|
|
2729
2384
|
|
|
@@ -2884,9 +2539,9 @@ size_t HUFv05_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
|
2884
2539
|
|
|
2885
2540
|
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
|
2886
2541
|
|
|
2887
|
-
|
|
2888
|
-
|
|
2889
|
-
|
|
2542
|
+
/* return HUFv05_decompress4X2(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams single-symbol decoding */
|
|
2543
|
+
/* return HUFv05_decompress4X4(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams double-symbols decoding */
|
|
2544
|
+
/* return HUFv05_decompress4X6(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams quad-symbols decoding */
|
|
2890
2545
|
}
|
|
2891
2546
|
/*
|
|
2892
2547
|
zstd - standard compression library
|
|
@@ -2944,17 +2599,9 @@ size_t HUFv05_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
|
2944
2599
|
* Compiler specifics
|
|
2945
2600
|
*********************************************************/
|
|
2946
2601
|
#ifdef _MSC_VER /* Visual Studio */
|
|
2947
|
-
# define FORCE_INLINE static __forceinline
|
|
2948
2602
|
# include <intrin.h> /* For Visual 2005 */
|
|
2949
2603
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
2950
2604
|
# pragma warning(disable : 4324) /* disable: C4324: padded structure */
|
|
2951
|
-
#else
|
|
2952
|
-
# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
|
2953
|
-
# ifdef __GNUC__
|
|
2954
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
2955
|
-
# else
|
|
2956
|
-
# define FORCE_INLINE static inline
|
|
2957
|
-
# endif
|
|
2958
2605
|
#endif
|
|
2959
2606
|
|
|
2960
2607
|
|
|
@@ -2981,9 +2628,6 @@ static void ZSTDv05_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
|
|
|
2981
2628
|
* tells if a return value is an error code */
|
|
2982
2629
|
unsigned ZSTDv05_isError(size_t code) { return ERR_isError(code); }
|
|
2983
2630
|
|
|
2984
|
-
/*! ZSTDv05_getError() :
|
|
2985
|
-
* convert a `size_t` function result into a proper ZSTDv05_errorCode enum */
|
|
2986
|
-
ZSTDv05_ErrorCode ZSTDv05_getError(size_t code) { return ERR_getError(code); }
|
|
2987
2631
|
|
|
2988
2632
|
/*! ZSTDv05_getErrorName() :
|
|
2989
2633
|
* provides error code string (useful for debugging) */
|
|
@@ -3013,12 +2657,12 @@ struct ZSTDv05_DCtx_s
|
|
|
3013
2657
|
ZSTDv05_dStage stage;
|
|
3014
2658
|
U32 flagStaticTables;
|
|
3015
2659
|
const BYTE* litPtr;
|
|
3016
|
-
size_t litBufSize;
|
|
3017
2660
|
size_t litSize;
|
|
3018
2661
|
BYTE litBuffer[BLOCKSIZE + WILDCOPY_OVERLENGTH];
|
|
3019
2662
|
BYTE headerBuffer[ZSTDv05_frameHeaderSize_max];
|
|
3020
2663
|
}; /* typedef'd to ZSTDv05_DCtx within "zstd_static.h" */
|
|
3021
2664
|
|
|
2665
|
+
size_t ZSTDv05_sizeofDCtx (void); /* Hidden declaration */
|
|
3022
2666
|
size_t ZSTDv05_sizeofDCtx (void) { return sizeof(ZSTDv05_DCtx); }
|
|
3023
2667
|
|
|
3024
2668
|
size_t ZSTDv05_decompressBegin(ZSTDv05_DCtx* dctx)
|
|
@@ -3178,12 +2822,12 @@ static size_t ZSTDv05_decodeFrameHeader_Part2(ZSTDv05_DCtx* zc, const void* src,
|
|
|
3178
2822
|
if (srcSize != zc->headerSize)
|
|
3179
2823
|
return ERROR(srcSize_wrong);
|
|
3180
2824
|
result = ZSTDv05_getFrameParams(&(zc->params), src, srcSize);
|
|
3181
|
-
if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(
|
|
2825
|
+
if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(frameParameter_unsupported);
|
|
3182
2826
|
return result;
|
|
3183
2827
|
}
|
|
3184
2828
|
|
|
3185
2829
|
|
|
3186
|
-
size_t ZSTDv05_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
2830
|
+
static size_t ZSTDv05_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
3187
2831
|
{
|
|
3188
2832
|
const BYTE* const in = (const BYTE* const)src;
|
|
3189
2833
|
BYTE headerFlags;
|
|
@@ -3206,6 +2850,7 @@ size_t ZSTDv05_getcBlockSize(const void* src, size_t srcSize, blockProperties_t*
|
|
|
3206
2850
|
|
|
3207
2851
|
static size_t ZSTDv05_copyRawBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3208
2852
|
{
|
|
2853
|
+
if (dst==NULL) return ERROR(dstSize_tooSmall);
|
|
3209
2854
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
|
3210
2855
|
memcpy(dst, src, srcSize);
|
|
3211
2856
|
return srcSize;
|
|
@@ -3214,8 +2859,8 @@ static size_t ZSTDv05_copyRawBlock(void* dst, size_t maxDstSize, const void* src
|
|
|
3214
2859
|
|
|
3215
2860
|
/*! ZSTDv05_decodeLiteralsBlock() :
|
|
3216
2861
|
@return : nb of bytes read from src (< srcSize ) */
|
|
3217
|
-
size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
3218
|
-
|
|
2862
|
+
static size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
2863
|
+
const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
|
|
3219
2864
|
{
|
|
3220
2865
|
const BYTE* const istart = (const BYTE*) src;
|
|
3221
2866
|
|
|
@@ -3228,6 +2873,7 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
|
3228
2873
|
{
|
|
3229
2874
|
size_t litSize, litCSize, singleStream=0;
|
|
3230
2875
|
U32 lhSize = ((istart[0]) >> 4) & 3;
|
|
2876
|
+
if (srcSize < 5) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
|
|
3231
2877
|
switch(lhSize)
|
|
3232
2878
|
{
|
|
3233
2879
|
case 0: case 1: default: /* note : default is impossible, since lhSize into [0..3] */
|
|
@@ -3251,6 +2897,7 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
|
3251
2897
|
break;
|
|
3252
2898
|
}
|
|
3253
2899
|
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
2900
|
+
if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
|
|
3254
2901
|
|
|
3255
2902
|
if (HUFv05_isError(singleStream ?
|
|
3256
2903
|
HUFv05_decompress1X2(dctx->litBuffer, litSize, istart+lhSize, litCSize) :
|
|
@@ -3258,8 +2905,8 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
|
3258
2905
|
return ERROR(corruption_detected);
|
|
3259
2906
|
|
|
3260
2907
|
dctx->litPtr = dctx->litBuffer;
|
|
3261
|
-
dctx->litBufSize = BLOCKSIZE+8;
|
|
3262
2908
|
dctx->litSize = litSize;
|
|
2909
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3263
2910
|
return litCSize + lhSize;
|
|
3264
2911
|
}
|
|
3265
2912
|
case IS_PCH:
|
|
@@ -3276,13 +2923,14 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
|
3276
2923
|
lhSize=3;
|
|
3277
2924
|
litSize = ((istart[0] & 15) << 6) + (istart[1] >> 2);
|
|
3278
2925
|
litCSize = ((istart[1] & 3) << 8) + istart[2];
|
|
2926
|
+
if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
|
|
3279
2927
|
|
|
3280
2928
|
errorCode = HUFv05_decompress1X4_usingDTable(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->hufTableX4);
|
|
3281
2929
|
if (HUFv05_isError(errorCode)) return ERROR(corruption_detected);
|
|
3282
2930
|
|
|
3283
2931
|
dctx->litPtr = dctx->litBuffer;
|
|
3284
|
-
dctx->litBufSize = BLOCKSIZE+WILDCOPY_OVERLENGTH;
|
|
3285
2932
|
dctx->litSize = litSize;
|
|
2933
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3286
2934
|
return litCSize + lhSize;
|
|
3287
2935
|
}
|
|
3288
2936
|
case IS_RAW:
|
|
@@ -3307,13 +2955,12 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
|
3307
2955
|
if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
|
|
3308
2956
|
memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
|
3309
2957
|
dctx->litPtr = dctx->litBuffer;
|
|
3310
|
-
dctx->litBufSize = BLOCKSIZE+8;
|
|
3311
2958
|
dctx->litSize = litSize;
|
|
2959
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3312
2960
|
return lhSize+litSize;
|
|
3313
2961
|
}
|
|
3314
2962
|
/* direct reference into compressed stream */
|
|
3315
2963
|
dctx->litPtr = istart+lhSize;
|
|
3316
|
-
dctx->litBufSize = srcSize-lhSize;
|
|
3317
2964
|
dctx->litSize = litSize;
|
|
3318
2965
|
return lhSize+litSize;
|
|
3319
2966
|
}
|
|
@@ -3332,12 +2979,12 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
|
3332
2979
|
break;
|
|
3333
2980
|
case 3:
|
|
3334
2981
|
litSize = ((istart[0] & 15) << 16) + (istart[1] << 8) + istart[2];
|
|
2982
|
+
if (srcSize<4) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
|
|
3335
2983
|
break;
|
|
3336
2984
|
}
|
|
3337
2985
|
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
3338
|
-
memset(dctx->litBuffer, istart[lhSize], litSize);
|
|
2986
|
+
memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
|
3339
2987
|
dctx->litPtr = dctx->litBuffer;
|
|
3340
|
-
dctx->litBufSize = BLOCKSIZE+WILDCOPY_OVERLENGTH;
|
|
3341
2988
|
dctx->litSize = litSize;
|
|
3342
2989
|
return lhSize+1;
|
|
3343
2990
|
}
|
|
@@ -3347,15 +2994,15 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
|
3347
2994
|
}
|
|
3348
2995
|
|
|
3349
2996
|
|
|
3350
|
-
size_t ZSTDv05_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
|
|
2997
|
+
static size_t ZSTDv05_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
|
|
3351
2998
|
FSEv05_DTable* DTableLL, FSEv05_DTable* DTableML, FSEv05_DTable* DTableOffb,
|
|
3352
|
-
const void* src, size_t srcSize)
|
|
2999
|
+
const void* src, size_t srcSize, U32 flagStaticTable)
|
|
3353
3000
|
{
|
|
3354
3001
|
const BYTE* const istart = (const BYTE* const)src;
|
|
3355
3002
|
const BYTE* ip = istart;
|
|
3356
3003
|
const BYTE* const iend = istart + srcSize;
|
|
3357
3004
|
U32 LLtype, Offtype, MLtype;
|
|
3358
|
-
|
|
3005
|
+
unsigned LLlog, Offlog, MLlog;
|
|
3359
3006
|
size_t dumpsLength;
|
|
3360
3007
|
|
|
3361
3008
|
/* check */
|
|
@@ -3365,17 +3012,22 @@ size_t ZSTDv05_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumps
|
|
|
3365
3012
|
/* SeqHead */
|
|
3366
3013
|
*nbSeq = *ip++;
|
|
3367
3014
|
if (*nbSeq==0) return 1;
|
|
3368
|
-
if (*nbSeq >= 128)
|
|
3015
|
+
if (*nbSeq >= 128) {
|
|
3016
|
+
if (ip >= iend) return ERROR(srcSize_wrong);
|
|
3369
3017
|
*nbSeq = ((nbSeq[0]-128)<<8) + *ip++;
|
|
3018
|
+
}
|
|
3370
3019
|
|
|
3020
|
+
if (ip >= iend) return ERROR(srcSize_wrong);
|
|
3371
3021
|
LLtype = *ip >> 6;
|
|
3372
3022
|
Offtype = (*ip >> 4) & 3;
|
|
3373
3023
|
MLtype = (*ip >> 2) & 3;
|
|
3374
3024
|
if (*ip & 2) {
|
|
3025
|
+
if (ip+3 > iend) return ERROR(srcSize_wrong);
|
|
3375
3026
|
dumpsLength = ip[2];
|
|
3376
3027
|
dumpsLength += ip[1] << 8;
|
|
3377
3028
|
ip += 3;
|
|
3378
3029
|
} else {
|
|
3030
|
+
if (ip+2 > iend) return ERROR(srcSize_wrong);
|
|
3379
3031
|
dumpsLength = ip[1];
|
|
3380
3032
|
dumpsLength += (ip[0] & 1) << 8;
|
|
3381
3033
|
ip += 2;
|
|
@@ -3395,7 +3047,6 @@ size_t ZSTDv05_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumps
|
|
|
3395
3047
|
/* Build DTables */
|
|
3396
3048
|
switch(LLtype)
|
|
3397
3049
|
{
|
|
3398
|
-
U32 max;
|
|
3399
3050
|
case FSEv05_ENCODING_RLE :
|
|
3400
3051
|
LLlog = 0;
|
|
3401
3052
|
FSEv05_buildDTable_rle(DTableLL, *ip++);
|
|
@@ -3405,20 +3056,20 @@ size_t ZSTDv05_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumps
|
|
|
3405
3056
|
FSEv05_buildDTable_raw(DTableLL, LLbits);
|
|
3406
3057
|
break;
|
|
3407
3058
|
case FSEv05_ENCODING_STATIC:
|
|
3059
|
+
if (!flagStaticTable) return ERROR(corruption_detected);
|
|
3408
3060
|
break;
|
|
3409
3061
|
case FSEv05_ENCODING_DYNAMIC :
|
|
3410
3062
|
default : /* impossible */
|
|
3411
|
-
max = MaxLL;
|
|
3412
|
-
|
|
3413
|
-
|
|
3414
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
3417
|
-
}
|
|
3063
|
+
{ unsigned max = MaxLL;
|
|
3064
|
+
headerSize = FSEv05_readNCount(norm, &max, &LLlog, ip, iend-ip);
|
|
3065
|
+
if (FSEv05_isError(headerSize)) return ERROR(GENERIC);
|
|
3066
|
+
if (LLlog > LLFSEv05Log) return ERROR(corruption_detected);
|
|
3067
|
+
ip += headerSize;
|
|
3068
|
+
FSEv05_buildDTable(DTableLL, norm, max, LLlog);
|
|
3069
|
+
} }
|
|
3418
3070
|
|
|
3419
3071
|
switch(Offtype)
|
|
3420
3072
|
{
|
|
3421
|
-
U32 max;
|
|
3422
3073
|
case FSEv05_ENCODING_RLE :
|
|
3423
3074
|
Offlog = 0;
|
|
3424
3075
|
if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
|
|
@@ -3429,20 +3080,20 @@ size_t ZSTDv05_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumps
|
|
|
3429
3080
|
FSEv05_buildDTable_raw(DTableOffb, Offbits);
|
|
3430
3081
|
break;
|
|
3431
3082
|
case FSEv05_ENCODING_STATIC:
|
|
3083
|
+
if (!flagStaticTable) return ERROR(corruption_detected);
|
|
3432
3084
|
break;
|
|
3433
3085
|
case FSEv05_ENCODING_DYNAMIC :
|
|
3434
3086
|
default : /* impossible */
|
|
3435
|
-
max = MaxOff;
|
|
3436
|
-
|
|
3437
|
-
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
}
|
|
3087
|
+
{ unsigned max = MaxOff;
|
|
3088
|
+
headerSize = FSEv05_readNCount(norm, &max, &Offlog, ip, iend-ip);
|
|
3089
|
+
if (FSEv05_isError(headerSize)) return ERROR(GENERIC);
|
|
3090
|
+
if (Offlog > OffFSEv05Log) return ERROR(corruption_detected);
|
|
3091
|
+
ip += headerSize;
|
|
3092
|
+
FSEv05_buildDTable(DTableOffb, norm, max, Offlog);
|
|
3093
|
+
} }
|
|
3442
3094
|
|
|
3443
3095
|
switch(MLtype)
|
|
3444
3096
|
{
|
|
3445
|
-
U32 max;
|
|
3446
3097
|
case FSEv05_ENCODING_RLE :
|
|
3447
3098
|
MLlog = 0;
|
|
3448
3099
|
if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
|
|
@@ -3453,16 +3104,17 @@ size_t ZSTDv05_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumps
|
|
|
3453
3104
|
FSEv05_buildDTable_raw(DTableML, MLbits);
|
|
3454
3105
|
break;
|
|
3455
3106
|
case FSEv05_ENCODING_STATIC:
|
|
3107
|
+
if (!flagStaticTable) return ERROR(corruption_detected);
|
|
3456
3108
|
break;
|
|
3457
3109
|
case FSEv05_ENCODING_DYNAMIC :
|
|
3458
3110
|
default : /* impossible */
|
|
3459
|
-
max = MaxML;
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
} }
|
|
3111
|
+
{ unsigned max = MaxML;
|
|
3112
|
+
headerSize = FSEv05_readNCount(norm, &max, &MLlog, ip, iend-ip);
|
|
3113
|
+
if (FSEv05_isError(headerSize)) return ERROR(GENERIC);
|
|
3114
|
+
if (MLlog > MLFSEv05Log) return ERROR(corruption_detected);
|
|
3115
|
+
ip += headerSize;
|
|
3116
|
+
FSEv05_buildDTable(DTableML, norm, max, MLlog);
|
|
3117
|
+
} } }
|
|
3466
3118
|
|
|
3467
3119
|
return ip-istart;
|
|
3468
3120
|
}
|
|
@@ -3499,14 +3151,18 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3499
3151
|
litLength = FSEv05_peakSymbol(&(seqState->stateLL));
|
|
3500
3152
|
prevOffset = litLength ? seq->offset : seqState->prevOffset;
|
|
3501
3153
|
if (litLength == MaxLL) {
|
|
3502
|
-
U32 add = *dumps++;
|
|
3154
|
+
const U32 add = *dumps++;
|
|
3503
3155
|
if (add < 255) litLength += add;
|
|
3504
|
-
else {
|
|
3505
|
-
litLength =
|
|
3506
|
-
|
|
3507
|
-
|
|
3156
|
+
else if (dumps + 2 <= de) {
|
|
3157
|
+
litLength = MEM_readLE16(dumps);
|
|
3158
|
+
dumps += 2;
|
|
3159
|
+
if ((litLength & 1) && dumps < de) {
|
|
3160
|
+
litLength += *dumps << 16;
|
|
3161
|
+
dumps += 1;
|
|
3162
|
+
}
|
|
3163
|
+
litLength>>=1;
|
|
3508
3164
|
}
|
|
3509
|
-
if (dumps >= de) dumps = de-1;
|
|
3165
|
+
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3510
3166
|
}
|
|
3511
3167
|
|
|
3512
3168
|
/* Offset */
|
|
@@ -3532,14 +3188,18 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3532
3188
|
/* MatchLength */
|
|
3533
3189
|
matchLength = FSEv05_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
3534
3190
|
if (matchLength == MaxML) {
|
|
3535
|
-
U32 add = *dumps
|
|
3191
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
3536
3192
|
if (add < 255) matchLength += add;
|
|
3537
|
-
else {
|
|
3538
|
-
matchLength =
|
|
3539
|
-
|
|
3540
|
-
|
|
3193
|
+
else if (dumps + 2 <= de) {
|
|
3194
|
+
matchLength = MEM_readLE16(dumps);
|
|
3195
|
+
dumps += 2;
|
|
3196
|
+
if ((matchLength & 1) && dumps < de) {
|
|
3197
|
+
matchLength += *dumps << 16;
|
|
3198
|
+
dumps += 1;
|
|
3199
|
+
}
|
|
3200
|
+
matchLength >>= 1;
|
|
3541
3201
|
}
|
|
3542
|
-
if (dumps >= de) dumps = de-1;
|
|
3202
|
+
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3543
3203
|
}
|
|
3544
3204
|
matchLength += MINMATCH;
|
|
3545
3205
|
|
|
@@ -3562,11 +3222,11 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3562
3222
|
|
|
3563
3223
|
static size_t ZSTDv05_execSequence(BYTE* op,
|
|
3564
3224
|
BYTE* const oend, seq_t sequence,
|
|
3565
|
-
const BYTE** litPtr, const BYTE* const
|
|
3225
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
|
3566
3226
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
|
3567
3227
|
{
|
|
3568
3228
|
static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
|
3569
|
-
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /*
|
|
3229
|
+
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
|
|
3570
3230
|
BYTE* const oLitEnd = op + sequence.litLength;
|
|
3571
3231
|
const size_t sequenceLength = sequence.litLength + sequence.matchLength;
|
|
3572
3232
|
BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
|
|
@@ -3577,7 +3237,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
|
3577
3237
|
/* check */
|
|
3578
3238
|
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
|
|
3579
3239
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
|
3580
|
-
if (litEnd >
|
|
3240
|
+
if (litEnd > litLimit) return ERROR(corruption_detected); /* risk read beyond lit buffer */
|
|
3581
3241
|
|
|
3582
3242
|
/* copy Literals */
|
|
3583
3243
|
ZSTDv05_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
|
@@ -3601,7 +3261,12 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
|
3601
3261
|
op = oLitEnd + length1;
|
|
3602
3262
|
sequence.matchLength -= length1;
|
|
3603
3263
|
match = base;
|
|
3264
|
+
if (op > oend_8 || sequence.matchLength < MINMATCH) {
|
|
3265
|
+
while (op < oMatchEnd) *op++ = *match++;
|
|
3266
|
+
return sequenceLength;
|
|
3267
|
+
}
|
|
3604
3268
|
} }
|
|
3269
|
+
/* Requirement: op <= oend_8 */
|
|
3605
3270
|
|
|
3606
3271
|
/* match within prefix */
|
|
3607
3272
|
if (sequence.offset < 8) {
|
|
@@ -3619,7 +3284,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
|
3619
3284
|
}
|
|
3620
3285
|
op += 8; match += 8;
|
|
3621
3286
|
|
|
3622
|
-
if (oMatchEnd > oend-
|
|
3287
|
+
if (oMatchEnd > oend-(16-MINMATCH)) {
|
|
3623
3288
|
if (op < oend_8) {
|
|
3624
3289
|
ZSTDv05_wildcopy(op, match, oend_8 - op);
|
|
3625
3290
|
match += oend_8 - op;
|
|
@@ -3628,7 +3293,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
|
3628
3293
|
while (op < oMatchEnd)
|
|
3629
3294
|
*op++ = *match++;
|
|
3630
3295
|
} else {
|
|
3631
|
-
ZSTDv05_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3296
|
+
ZSTDv05_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3632
3297
|
}
|
|
3633
3298
|
return sequenceLength;
|
|
3634
3299
|
}
|
|
@@ -3644,15 +3309,14 @@ static size_t ZSTDv05_decompressSequences(
|
|
|
3644
3309
|
BYTE* const ostart = (BYTE* const)dst;
|
|
3645
3310
|
BYTE* op = ostart;
|
|
3646
3311
|
BYTE* const oend = ostart + maxDstSize;
|
|
3647
|
-
size_t errorCode, dumpsLength;
|
|
3312
|
+
size_t errorCode, dumpsLength=0;
|
|
3648
3313
|
const BYTE* litPtr = dctx->litPtr;
|
|
3649
|
-
const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8;
|
|
3650
3314
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
|
3651
|
-
int nbSeq;
|
|
3652
|
-
const BYTE* dumps;
|
|
3653
|
-
|
|
3654
|
-
|
|
3655
|
-
|
|
3315
|
+
int nbSeq=0;
|
|
3316
|
+
const BYTE* dumps = NULL;
|
|
3317
|
+
unsigned* DTableLL = dctx->LLTable;
|
|
3318
|
+
unsigned* DTableML = dctx->MLTable;
|
|
3319
|
+
unsigned* DTableOffb = dctx->OffTable;
|
|
3656
3320
|
const BYTE* const base = (const BYTE*) (dctx->base);
|
|
3657
3321
|
const BYTE* const vBase = (const BYTE*) (dctx->vBase);
|
|
3658
3322
|
const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
|
|
@@ -3660,7 +3324,7 @@ static size_t ZSTDv05_decompressSequences(
|
|
|
3660
3324
|
/* Build Decoding Tables */
|
|
3661
3325
|
errorCode = ZSTDv05_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
|
|
3662
3326
|
DTableLL, DTableML, DTableOffb,
|
|
3663
|
-
ip, seqSize);
|
|
3327
|
+
ip, seqSize, dctx->flagStaticTables);
|
|
3664
3328
|
if (ZSTDv05_isError(errorCode)) return errorCode;
|
|
3665
3329
|
ip += errorCode;
|
|
3666
3330
|
|
|
@@ -3684,7 +3348,7 @@ static size_t ZSTDv05_decompressSequences(
|
|
|
3684
3348
|
size_t oneSeqSize;
|
|
3685
3349
|
nbSeq--;
|
|
3686
3350
|
ZSTDv05_decodeSequence(&sequence, &seqState);
|
|
3687
|
-
oneSeqSize = ZSTDv05_execSequence(op, oend, sequence, &litPtr,
|
|
3351
|
+
oneSeqSize = ZSTDv05_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
|
3688
3352
|
if (ZSTDv05_isError(oneSeqSize)) return oneSeqSize;
|
|
3689
3353
|
op += oneSeqSize;
|
|
3690
3354
|
}
|
|
@@ -3698,8 +3362,10 @@ static size_t ZSTDv05_decompressSequences(
|
|
|
3698
3362
|
size_t lastLLSize = litEnd - litPtr;
|
|
3699
3363
|
if (litPtr > litEnd) return ERROR(corruption_detected); /* too many literals already used */
|
|
3700
3364
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3701
|
-
|
|
3702
|
-
|
|
3365
|
+
if (lastLLSize > 0) {
|
|
3366
|
+
memcpy(op, litPtr, lastLLSize);
|
|
3367
|
+
op += lastLLSize;
|
|
3368
|
+
}
|
|
3703
3369
|
}
|
|
3704
3370
|
|
|
3705
3371
|
return op-ostart;
|
|
@@ -3758,10 +3424,10 @@ static size_t ZSTDv05_decompress_continueDCtx(ZSTDv05_DCtx* dctx,
|
|
|
3758
3424
|
BYTE* const oend = ostart + maxDstSize;
|
|
3759
3425
|
size_t remainingSize = srcSize;
|
|
3760
3426
|
blockProperties_t blockProperties;
|
|
3427
|
+
memset(&blockProperties, 0, sizeof(blockProperties));
|
|
3761
3428
|
|
|
3762
3429
|
/* Frame Header */
|
|
3763
|
-
{
|
|
3764
|
-
size_t frameHeaderSize;
|
|
3430
|
+
{ size_t frameHeaderSize;
|
|
3765
3431
|
if (srcSize < ZSTDv05_frameHeaderSize_min+ZSTDv05_blockHeaderSize) return ERROR(srcSize_wrong);
|
|
3766
3432
|
frameHeaderSize = ZSTDv05_decodeFrameHeader_Part1(dctx, src, ZSTDv05_frameHeaderSize_min);
|
|
3767
3433
|
if (ZSTDv05_isError(frameHeaderSize)) return frameHeaderSize;
|
|
@@ -3853,6 +3519,58 @@ size_t ZSTDv05_decompress(void* dst, size_t maxDstSize, const void* src, size_t
|
|
|
3853
3519
|
#endif
|
|
3854
3520
|
}
|
|
3855
3521
|
|
|
3522
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
|
3523
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
|
3524
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
|
3525
|
+
{
|
|
3526
|
+
*cSize = ret;
|
|
3527
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
|
3528
|
+
}
|
|
3529
|
+
|
|
3530
|
+
void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
|
3531
|
+
{
|
|
3532
|
+
const BYTE* ip = (const BYTE*)src;
|
|
3533
|
+
size_t remainingSize = srcSize;
|
|
3534
|
+
size_t nbBlocks = 0;
|
|
3535
|
+
blockProperties_t blockProperties;
|
|
3536
|
+
|
|
3537
|
+
/* Frame Header */
|
|
3538
|
+
if (srcSize < ZSTDv05_frameHeaderSize_min) {
|
|
3539
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3540
|
+
return;
|
|
3541
|
+
}
|
|
3542
|
+
if (MEM_readLE32(src) != ZSTDv05_MAGICNUMBER) {
|
|
3543
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
|
3544
|
+
return;
|
|
3545
|
+
}
|
|
3546
|
+
ip += ZSTDv05_frameHeaderSize_min; remainingSize -= ZSTDv05_frameHeaderSize_min;
|
|
3547
|
+
|
|
3548
|
+
/* Loop on each block */
|
|
3549
|
+
while (1)
|
|
3550
|
+
{
|
|
3551
|
+
size_t cBlockSize = ZSTDv05_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
3552
|
+
if (ZSTDv05_isError(cBlockSize)) {
|
|
3553
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
|
3554
|
+
return;
|
|
3555
|
+
}
|
|
3556
|
+
|
|
3557
|
+
ip += ZSTDv05_blockHeaderSize;
|
|
3558
|
+
remainingSize -= ZSTDv05_blockHeaderSize;
|
|
3559
|
+
if (cBlockSize > remainingSize) {
|
|
3560
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3561
|
+
return;
|
|
3562
|
+
}
|
|
3563
|
+
|
|
3564
|
+
if (cBlockSize == 0) break; /* bt_end */
|
|
3565
|
+
|
|
3566
|
+
ip += cBlockSize;
|
|
3567
|
+
remainingSize -= cBlockSize;
|
|
3568
|
+
nbBlocks++;
|
|
3569
|
+
}
|
|
3570
|
+
|
|
3571
|
+
*cSize = ip - (const BYTE*)src;
|
|
3572
|
+
*dBound = nbBlocks * BLOCKSIZE;
|
|
3573
|
+
}
|
|
3856
3574
|
|
|
3857
3575
|
/* ******************************
|
|
3858
3576
|
* Streaming Decompression API
|
|
@@ -3949,11 +3667,11 @@ static size_t ZSTDv05_loadEntropy(ZSTDv05_DCtx* dctx, const void* dict, size_t d
|
|
|
3949
3667
|
{
|
|
3950
3668
|
size_t hSize, offcodeHeaderSize, matchlengthHeaderSize, errorCode, litlengthHeaderSize;
|
|
3951
3669
|
short offcodeNCount[MaxOff+1];
|
|
3952
|
-
|
|
3670
|
+
unsigned offcodeMaxValue=MaxOff, offcodeLog;
|
|
3953
3671
|
short matchlengthNCount[MaxML+1];
|
|
3954
|
-
unsigned matchlengthMaxValue = MaxML, matchlengthLog
|
|
3672
|
+
unsigned matchlengthMaxValue = MaxML, matchlengthLog;
|
|
3955
3673
|
short litlengthNCount[MaxLL+1];
|
|
3956
|
-
unsigned litlengthMaxValue = MaxLL, litlengthLog
|
|
3674
|
+
unsigned litlengthMaxValue = MaxLL, litlengthLog;
|
|
3957
3675
|
|
|
3958
3676
|
hSize = HUFv05_readDTableX4(dctx->hufTableX4, dict, dictSize);
|
|
3959
3677
|
if (HUFv05_isError(hSize)) return ERROR(dictionary_corrupted);
|
|
@@ -3962,6 +3680,7 @@ static size_t ZSTDv05_loadEntropy(ZSTDv05_DCtx* dctx, const void* dict, size_t d
|
|
|
3962
3680
|
|
|
3963
3681
|
offcodeHeaderSize = FSEv05_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dict, dictSize);
|
|
3964
3682
|
if (FSEv05_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
|
|
3683
|
+
if (offcodeLog > OffFSEv05Log) return ERROR(dictionary_corrupted);
|
|
3965
3684
|
errorCode = FSEv05_buildDTable(dctx->OffTable, offcodeNCount, offcodeMaxValue, offcodeLog);
|
|
3966
3685
|
if (FSEv05_isError(errorCode)) return ERROR(dictionary_corrupted);
|
|
3967
3686
|
dict = (const char*)dict + offcodeHeaderSize;
|
|
@@ -3969,12 +3688,14 @@ static size_t ZSTDv05_loadEntropy(ZSTDv05_DCtx* dctx, const void* dict, size_t d
|
|
|
3969
3688
|
|
|
3970
3689
|
matchlengthHeaderSize = FSEv05_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dict, dictSize);
|
|
3971
3690
|
if (FSEv05_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
|
|
3691
|
+
if (matchlengthLog > MLFSEv05Log) return ERROR(dictionary_corrupted);
|
|
3972
3692
|
errorCode = FSEv05_buildDTable(dctx->MLTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog);
|
|
3973
3693
|
if (FSEv05_isError(errorCode)) return ERROR(dictionary_corrupted);
|
|
3974
3694
|
dict = (const char*)dict + matchlengthHeaderSize;
|
|
3975
3695
|
dictSize -= matchlengthHeaderSize;
|
|
3976
3696
|
|
|
3977
3697
|
litlengthHeaderSize = FSEv05_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dict, dictSize);
|
|
3698
|
+
if (litlengthLog > LLFSEv05Log) return ERROR(dictionary_corrupted);
|
|
3978
3699
|
if (FSEv05_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
|
|
3979
3700
|
errorCode = FSEv05_buildDTable(dctx->LLTable, litlengthNCount, litlengthMaxValue, litlengthLog);
|
|
3980
3701
|
if (FSEv05_isError(errorCode)) return ERROR(dictionary_corrupted);
|
|
@@ -4072,7 +3793,9 @@ static size_t ZBUFFv05_blockHeaderSize = 3;
|
|
|
4072
3793
|
static size_t ZBUFFv05_limitCopy(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
4073
3794
|
{
|
|
4074
3795
|
size_t length = MIN(maxDstSize, srcSize);
|
|
4075
|
-
|
|
3796
|
+
if (length > 0) {
|
|
3797
|
+
memcpy(dst, src, length);
|
|
3798
|
+
}
|
|
4076
3799
|
return length;
|
|
4077
3800
|
}
|
|
4078
3801
|
|
|
@@ -4092,7 +3815,7 @@ static size_t ZBUFFv05_limitCopy(void* dst, size_t maxDstSize, const void* src,
|
|
|
4092
3815
|
* The function will report how many bytes were read or written by modifying *srcSizePtr and *maxDstSizePtr.
|
|
4093
3816
|
* Note that it may not consume the entire input, in which case it's up to the caller to call again the function with remaining input.
|
|
4094
3817
|
* The content of dst will be overwritten (up to *maxDstSizePtr) at each function call, so save its content if it matters or change dst .
|
|
4095
|
-
*
|
|
3818
|
+
* return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to improve latency)
|
|
4096
3819
|
* or 0 when a frame is completely decoded
|
|
4097
3820
|
* or an error code, which can be tested using ZBUFFv05_isError().
|
|
4098
3821
|
*
|
|
@@ -4193,7 +3916,7 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
4193
3916
|
zbc->stage = ZBUFFv05ds_decodeHeader;
|
|
4194
3917
|
break;
|
|
4195
3918
|
}
|
|
4196
|
-
|
|
3919
|
+
/* fall-through */
|
|
4197
3920
|
case ZBUFFv05ds_loadHeader:
|
|
4198
3921
|
/* complete header from src */
|
|
4199
3922
|
{
|
|
@@ -4209,9 +3932,9 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
4209
3932
|
*maxDstSizePtr = 0;
|
|
4210
3933
|
return headerSize - zbc->hPos;
|
|
4211
3934
|
}
|
|
4212
|
-
|
|
3935
|
+
/* zbc->stage = ZBUFFv05ds_decodeHeader; break; */ /* useless : stage follows */
|
|
4213
3936
|
}
|
|
4214
|
-
|
|
3937
|
+
/* fall-through */
|
|
4215
3938
|
case ZBUFFv05ds_decodeHeader:
|
|
4216
3939
|
/* apply header to create / resize buffers */
|
|
4217
3940
|
{
|
|
@@ -4238,7 +3961,7 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
4238
3961
|
break;
|
|
4239
3962
|
}
|
|
4240
3963
|
zbc->stage = ZBUFFv05ds_read;
|
|
4241
|
-
|
|
3964
|
+
/* fall-through */
|
|
4242
3965
|
case ZBUFFv05ds_read:
|
|
4243
3966
|
{
|
|
4244
3967
|
size_t neededInSize = ZSTDv05_nextSrcSizeToDecompress(zbc->zc);
|
|
@@ -4262,7 +3985,7 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
4262
3985
|
if (ip==iend) { notDone = 0; break; } /* no more input */
|
|
4263
3986
|
zbc->stage = ZBUFFv05ds_load;
|
|
4264
3987
|
}
|
|
4265
|
-
|
|
3988
|
+
/* fall-through */
|
|
4266
3989
|
case ZBUFFv05ds_load:
|
|
4267
3990
|
{
|
|
4268
3991
|
size_t neededInSize = ZSTDv05_nextSrcSizeToDecompress(zbc->zc);
|
|
@@ -4282,8 +4005,10 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
4282
4005
|
if (!decodedSize) { zbc->stage = ZBUFFv05ds_read; break; } /* this was just a header */
|
|
4283
4006
|
zbc->outEnd = zbc->outStart + decodedSize;
|
|
4284
4007
|
zbc->stage = ZBUFFv05ds_flush;
|
|
4285
|
-
|
|
4286
|
-
|
|
4008
|
+
/* break; */ /* ZBUFFv05ds_flush follows */
|
|
4009
|
+
}
|
|
4010
|
+
}
|
|
4011
|
+
/* fall-through */
|
|
4287
4012
|
case ZBUFFv05ds_flush:
|
|
4288
4013
|
{
|
|
4289
4014
|
size_t toFlushSize = zbc->outEnd - zbc->outStart;
|