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_V03_H_298734209782
|
|
12
|
+
#define ZSTD_V03_H_298734209782
|
|
34
13
|
|
|
35
14
|
#if defined (__cplusplus)
|
|
36
15
|
extern "C" {
|
|
@@ -56,7 +35,20 @@ ZSTDv03_decompress() : decompress ZSTD frames compliant with v0.3.x format
|
|
|
56
35
|
size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize,
|
|
57
36
|
const void* src, size_t compressedSize);
|
|
58
37
|
|
|
59
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
ZSTDv03_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.3.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 ZSTDv03_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
|
49
|
+
size_t* cSize, unsigned long long* dBound);
|
|
50
|
+
|
|
51
|
+
/**
|
|
60
52
|
ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error
|
|
61
53
|
*/
|
|
62
54
|
unsigned ZSTDv03_isError(size_t code);
|
|
@@ -97,3 +89,5 @@ size_t ZSTDv03_decompressContinue(ZSTDv03_Dctx* dctx, void* dst, size_t maxDstSi
|
|
|
97
89
|
#if defined (__cplusplus)
|
|
98
90
|
}
|
|
99
91
|
#endif
|
|
92
|
+
|
|
93
|
+
#endif /* ZSTD_V03_H_298734209782 */
|
|
@@ -1,75 +1,27 @@
|
|
|
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.
|
|
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
|
+
*/
|
|
18
10
|
|
|
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.
|
|
30
11
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
12
|
+
/******************************************
|
|
13
|
+
* Includes
|
|
14
|
+
******************************************/
|
|
15
|
+
#include <stddef.h> /* size_t, ptrdiff_t */
|
|
16
|
+
#include <string.h> /* memcpy */
|
|
34
17
|
|
|
35
|
-
/*- Dependencies -*/
|
|
36
18
|
#include "zstd_v04.h"
|
|
19
|
+
#include "../common/error_private.h"
|
|
37
20
|
|
|
38
21
|
|
|
39
22
|
/* ******************************************************************
|
|
40
|
-
mem.h
|
|
41
|
-
|
|
42
|
-
Copyright (C) 2013-2015, Yann Collet.
|
|
43
|
-
|
|
44
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
45
|
-
|
|
46
|
-
Redistribution and use in source and binary forms, with or without
|
|
47
|
-
modification, are permitted provided that the following conditions are
|
|
48
|
-
met:
|
|
49
|
-
|
|
50
|
-
* Redistributions of source code must retain the above copyright
|
|
51
|
-
notice, this list of conditions and the following disclaimer.
|
|
52
|
-
* Redistributions in binary form must reproduce the above
|
|
53
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
54
|
-
in the documentation and/or other materials provided with the
|
|
55
|
-
distribution.
|
|
56
|
-
|
|
57
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
58
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
59
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
60
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
61
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
62
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
63
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
64
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
65
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
66
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
67
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
68
|
-
|
|
69
|
-
You can contact the author at :
|
|
70
|
-
- FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
71
|
-
- Public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
72
|
-
****************************************************************** */
|
|
23
|
+
* mem.h
|
|
24
|
+
*******************************************************************/
|
|
73
25
|
#ifndef MEM_H_MODULE
|
|
74
26
|
#define MEM_H_MODULE
|
|
75
27
|
|
|
@@ -77,16 +29,14 @@
|
|
|
77
29
|
extern "C" {
|
|
78
30
|
#endif
|
|
79
31
|
|
|
80
|
-
/******************************************
|
|
81
|
-
* Includes
|
|
82
|
-
******************************************/
|
|
83
|
-
#include <stddef.h> /* size_t, ptrdiff_t */
|
|
84
|
-
#include <string.h> /* memcpy */
|
|
85
|
-
|
|
86
32
|
|
|
87
33
|
/******************************************
|
|
88
34
|
* Compiler-specific
|
|
89
35
|
******************************************/
|
|
36
|
+
#if defined(_MSC_VER) /* Visual Studio */
|
|
37
|
+
# include <stdlib.h> /* _byteswap_ulong */
|
|
38
|
+
# include <intrin.h> /* _byteswap_* */
|
|
39
|
+
#endif
|
|
90
40
|
#if defined(__GNUC__)
|
|
91
41
|
# define MEM_STATIC static __attribute__((unused))
|
|
92
42
|
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
|
@@ -121,6 +71,15 @@ extern "C" {
|
|
|
121
71
|
#endif
|
|
122
72
|
|
|
123
73
|
|
|
74
|
+
/*-*************************************
|
|
75
|
+
* Debug
|
|
76
|
+
***************************************/
|
|
77
|
+
#include "debug.h"
|
|
78
|
+
#ifndef assert
|
|
79
|
+
# define assert(condition) ((void)0)
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
|
|
124
83
|
/****************************************************************
|
|
125
84
|
* Memory I/O
|
|
126
85
|
*****************************************************************/
|
|
@@ -140,7 +99,7 @@ extern "C" {
|
|
|
140
99
|
#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
|
141
100
|
# 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
101
|
# define MEM_FORCE_MEMORY_ACCESS 2
|
|
143
|
-
# elif defined(__INTEL_COMPILER) || \
|
|
102
|
+
# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
|
|
144
103
|
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
|
145
104
|
# define MEM_FORCE_MEMORY_ACCESS 1
|
|
146
105
|
# endif
|
|
@@ -164,8 +123,6 @@ MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
|
|
|
164
123
|
MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
|
|
165
124
|
|
|
166
125
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
|
|
167
|
-
MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; }
|
|
168
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; }
|
|
169
126
|
|
|
170
127
|
#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
|
|
171
128
|
|
|
@@ -178,8 +135,6 @@ MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32;
|
|
|
178
135
|
MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
|
|
179
136
|
|
|
180
137
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
|
|
181
|
-
MEM_STATIC void MEM_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; }
|
|
182
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value) { ((unalign*)memPtr)->u64 = value; }
|
|
183
138
|
|
|
184
139
|
#else
|
|
185
140
|
|
|
@@ -206,17 +161,7 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
|
206
161
|
memcpy(memPtr, &value, sizeof(value));
|
|
207
162
|
}
|
|
208
163
|
|
|
209
|
-
|
|
210
|
-
{
|
|
211
|
-
memcpy(memPtr, &value, sizeof(value));
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
MEM_STATIC void MEM_write64(void* memPtr, U64 value)
|
|
215
|
-
{
|
|
216
|
-
memcpy(memPtr, &value, sizeof(value));
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
#endif // MEM_FORCE_MEMORY_ACCESS
|
|
164
|
+
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
|
220
165
|
|
|
221
166
|
|
|
222
167
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
|
|
@@ -244,6 +189,11 @@ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
|
|
|
244
189
|
}
|
|
245
190
|
}
|
|
246
191
|
|
|
192
|
+
MEM_STATIC U32 MEM_readLE24(const void* memPtr)
|
|
193
|
+
{
|
|
194
|
+
return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
|
|
195
|
+
}
|
|
196
|
+
|
|
247
197
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
|
248
198
|
{
|
|
249
199
|
if (MEM_isLittleEndian())
|
|
@@ -255,21 +205,6 @@ MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
|
|
255
205
|
}
|
|
256
206
|
}
|
|
257
207
|
|
|
258
|
-
MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32)
|
|
259
|
-
{
|
|
260
|
-
if (MEM_isLittleEndian())
|
|
261
|
-
{
|
|
262
|
-
MEM_write32(memPtr, val32);
|
|
263
|
-
}
|
|
264
|
-
else
|
|
265
|
-
{
|
|
266
|
-
BYTE* p = (BYTE*)memPtr;
|
|
267
|
-
p[0] = (BYTE)val32;
|
|
268
|
-
p[1] = (BYTE)(val32>>8);
|
|
269
|
-
p[2] = (BYTE)(val32>>16);
|
|
270
|
-
p[3] = (BYTE)(val32>>24);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
208
|
|
|
274
209
|
MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
|
275
210
|
{
|
|
@@ -283,25 +218,6 @@ MEM_STATIC U64 MEM_readLE64(const void* memPtr)
|
|
|
283
218
|
}
|
|
284
219
|
}
|
|
285
220
|
|
|
286
|
-
MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64)
|
|
287
|
-
{
|
|
288
|
-
if (MEM_isLittleEndian())
|
|
289
|
-
{
|
|
290
|
-
MEM_write64(memPtr, val64);
|
|
291
|
-
}
|
|
292
|
-
else
|
|
293
|
-
{
|
|
294
|
-
BYTE* p = (BYTE*)memPtr;
|
|
295
|
-
p[0] = (BYTE)val64;
|
|
296
|
-
p[1] = (BYTE)(val64>>8);
|
|
297
|
-
p[2] = (BYTE)(val64>>16);
|
|
298
|
-
p[3] = (BYTE)(val64>>24);
|
|
299
|
-
p[4] = (BYTE)(val64>>32);
|
|
300
|
-
p[5] = (BYTE)(val64>>40);
|
|
301
|
-
p[6] = (BYTE)(val64>>48);
|
|
302
|
-
p[7] = (BYTE)(val64>>56);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
221
|
|
|
306
222
|
MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
307
223
|
{
|
|
@@ -311,13 +227,6 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
|
311
227
|
return (size_t)MEM_readLE64(memPtr);
|
|
312
228
|
}
|
|
313
229
|
|
|
314
|
-
MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val)
|
|
315
|
-
{
|
|
316
|
-
if (MEM_32bits())
|
|
317
|
-
MEM_writeLE32(memPtr, (U32)val);
|
|
318
|
-
else
|
|
319
|
-
MEM_writeLE64(memPtr, (U64)val);
|
|
320
|
-
}
|
|
321
230
|
|
|
322
231
|
#if defined (__cplusplus)
|
|
323
232
|
}
|
|
@@ -325,137 +234,18 @@ MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val)
|
|
|
325
234
|
|
|
326
235
|
#endif /* MEM_H_MODULE */
|
|
327
236
|
|
|
328
|
-
/* ******************************************************************
|
|
329
|
-
Error codes list
|
|
330
|
-
Copyright (C) 2016, Yann Collet
|
|
331
|
-
|
|
332
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
333
|
-
|
|
334
|
-
Redistribution and use in source and binary forms, with or without
|
|
335
|
-
modification, are permitted provided that the following conditions are
|
|
336
|
-
met:
|
|
337
|
-
|
|
338
|
-
* Redistributions of source code must retain the above copyright
|
|
339
|
-
notice, this list of conditions and the following disclaimer.
|
|
340
|
-
* Redistributions in binary form must reproduce the above
|
|
341
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
342
|
-
in the documentation and/or other materials provided with the
|
|
343
|
-
distribution.
|
|
344
|
-
|
|
345
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
346
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
347
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
348
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
349
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
350
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
351
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
352
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
353
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
354
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
355
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
356
|
-
|
|
357
|
-
You can contact the author at :
|
|
358
|
-
- Source repository : https://github.com/Cyan4973/zstd
|
|
359
|
-
****************************************************************** */
|
|
360
|
-
#ifndef ERROR_PUBLIC_H_MODULE
|
|
361
|
-
#define ERROR_PUBLIC_H_MODULE
|
|
362
|
-
|
|
363
|
-
#if defined (__cplusplus)
|
|
364
|
-
extern "C" {
|
|
365
|
-
#endif
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
/* ****************************************
|
|
369
|
-
* error list
|
|
370
|
-
******************************************/
|
|
371
|
-
enum {
|
|
372
|
-
ZSTD_error_No_Error,
|
|
373
|
-
ZSTD_error_GENERIC,
|
|
374
|
-
ZSTD_error_prefix_unknown,
|
|
375
|
-
ZSTD_error_frameParameter_unsupported,
|
|
376
|
-
ZSTD_error_frameParameter_unsupportedBy32bitsImplementation,
|
|
377
|
-
ZSTD_error_init_missing,
|
|
378
|
-
ZSTD_error_memory_allocation,
|
|
379
|
-
ZSTD_error_stage_wrong,
|
|
380
|
-
ZSTD_error_dstSize_tooSmall,
|
|
381
|
-
ZSTD_error_srcSize_wrong,
|
|
382
|
-
ZSTD_error_corruption_detected,
|
|
383
|
-
ZSTD_error_tableLog_tooLarge,
|
|
384
|
-
ZSTD_error_maxSymbolValue_tooLarge,
|
|
385
|
-
ZSTD_error_maxSymbolValue_tooSmall,
|
|
386
|
-
ZSTD_error_maxCode
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
/* note : functions provide error codes in reverse negative order,
|
|
390
|
-
so compare with (size_t)(0-enum) */
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
#if defined (__cplusplus)
|
|
394
|
-
}
|
|
395
|
-
#endif
|
|
396
|
-
|
|
397
|
-
#endif /* ERROR_PUBLIC_H_MODULE */
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
237
|
/*
|
|
402
238
|
zstd - standard compression library
|
|
403
239
|
Header File for static linking only
|
|
404
|
-
Copyright (C) 2014-2015, Yann Collet.
|
|
405
|
-
|
|
406
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
407
|
-
|
|
408
|
-
Redistribution and use in source and binary forms, with or without
|
|
409
|
-
modification, are permitted provided that the following conditions are
|
|
410
|
-
met:
|
|
411
|
-
* Redistributions of source code must retain the above copyright
|
|
412
|
-
notice, this list of conditions and the following disclaimer.
|
|
413
|
-
* Redistributions in binary form must reproduce the above
|
|
414
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
415
|
-
in the documentation and/or other materials provided with the
|
|
416
|
-
distribution.
|
|
417
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
418
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
419
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
420
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
421
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
422
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
423
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
424
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
425
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
426
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
427
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
428
|
-
|
|
429
|
-
You can contact the author at :
|
|
430
|
-
- zstd source repository : https://github.com/Cyan4973/zstd
|
|
431
|
-
- ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
432
240
|
*/
|
|
433
241
|
#ifndef ZSTD_STATIC_H
|
|
434
242
|
#define ZSTD_STATIC_H
|
|
435
243
|
|
|
436
|
-
/* The objects defined into this file shall be considered experimental.
|
|
437
|
-
* They are not considered stable, as their prototype may change in the future.
|
|
438
|
-
* You can use them for tests, provide feedback, or if you can endure risks of future changes.
|
|
439
|
-
*/
|
|
440
|
-
|
|
441
|
-
#if defined (__cplusplus)
|
|
442
|
-
extern "C" {
|
|
443
|
-
#endif
|
|
444
244
|
|
|
445
245
|
/* *************************************
|
|
446
246
|
* Types
|
|
447
247
|
***************************************/
|
|
448
|
-
#define ZSTD_WINDOWLOG_MAX 26
|
|
449
|
-
#define ZSTD_WINDOWLOG_MIN 18
|
|
450
248
|
#define ZSTD_WINDOWLOG_ABSOLUTEMIN 11
|
|
451
|
-
#define ZSTD_CONTENTLOG_MAX (ZSTD_WINDOWLOG_MAX+1)
|
|
452
|
-
#define ZSTD_CONTENTLOG_MIN 4
|
|
453
|
-
#define ZSTD_HASHLOG_MAX 28
|
|
454
|
-
#define ZSTD_HASHLOG_MIN 4
|
|
455
|
-
#define ZSTD_SEARCHLOG_MAX (ZSTD_CONTENTLOG_MAX-1)
|
|
456
|
-
#define ZSTD_SEARCHLOG_MIN 1
|
|
457
|
-
#define ZSTD_SEARCHLENGTH_MAX 7
|
|
458
|
-
#define ZSTD_SEARCHLENGTH_MIN 4
|
|
459
249
|
|
|
460
250
|
/** from faster to stronger */
|
|
461
251
|
typedef enum { ZSTD_fast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2, ZSTD_btlazy2 } ZSTD_strategy;
|
|
@@ -527,118 +317,6 @@ static size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t maxDstS
|
|
|
527
317
|
*/
|
|
528
318
|
|
|
529
319
|
|
|
530
|
-
#if defined (__cplusplus)
|
|
531
|
-
}
|
|
532
|
-
#endif
|
|
533
|
-
|
|
534
|
-
/* ******************************************************************
|
|
535
|
-
Error codes and messages
|
|
536
|
-
Copyright (C) 2013-2016, Yann Collet
|
|
537
|
-
|
|
538
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
539
|
-
|
|
540
|
-
Redistribution and use in source and binary forms, with or without
|
|
541
|
-
modification, are permitted provided that the following conditions are
|
|
542
|
-
met:
|
|
543
|
-
|
|
544
|
-
* Redistributions of source code must retain the above copyright
|
|
545
|
-
notice, this list of conditions and the following disclaimer.
|
|
546
|
-
* Redistributions in binary form must reproduce the above
|
|
547
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
548
|
-
in the documentation and/or other materials provided with the
|
|
549
|
-
distribution.
|
|
550
|
-
|
|
551
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
552
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
553
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
554
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
555
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
556
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
557
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
558
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
559
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
560
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
561
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
562
|
-
|
|
563
|
-
You can contact the author at :
|
|
564
|
-
- Source repository : https://github.com/Cyan4973/zstd
|
|
565
|
-
****************************************************************** */
|
|
566
|
-
/* Note : this module is expected to remain private, do not expose it */
|
|
567
|
-
|
|
568
|
-
#ifndef ERROR_H_MODULE
|
|
569
|
-
#define ERROR_H_MODULE
|
|
570
|
-
|
|
571
|
-
#if defined (__cplusplus)
|
|
572
|
-
extern "C" {
|
|
573
|
-
#endif
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
/* *****************************************
|
|
577
|
-
* Includes
|
|
578
|
-
******************************************/
|
|
579
|
-
#include <stddef.h> /* size_t, ptrdiff_t */
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
/* *****************************************
|
|
583
|
-
* Compiler-specific
|
|
584
|
-
******************************************/
|
|
585
|
-
#if defined(__GNUC__)
|
|
586
|
-
# define ERR_STATIC static __attribute__((unused))
|
|
587
|
-
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
|
588
|
-
# define ERR_STATIC static inline
|
|
589
|
-
#elif defined(_MSC_VER)
|
|
590
|
-
# define ERR_STATIC static __inline
|
|
591
|
-
#else
|
|
592
|
-
# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
|
593
|
-
#endif
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
/* *****************************************
|
|
597
|
-
* Error Codes
|
|
598
|
-
******************************************/
|
|
599
|
-
#define PREFIX(name) ZSTD_error_##name
|
|
600
|
-
|
|
601
|
-
#ifdef ERROR
|
|
602
|
-
# undef ERROR /* reported already defined on VS 2015 by Rich Geldreich */
|
|
603
|
-
#endif
|
|
604
|
-
#define ERROR(name) (size_t)-PREFIX(name)
|
|
605
|
-
|
|
606
|
-
ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
/* *****************************************
|
|
610
|
-
* Error Strings
|
|
611
|
-
******************************************/
|
|
612
|
-
|
|
613
|
-
ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
614
|
-
{
|
|
615
|
-
static const char* codeError = "Unspecified error code";
|
|
616
|
-
switch( (size_t)(0-code) )
|
|
617
|
-
{
|
|
618
|
-
case ZSTD_error_No_Error: return "No error detected";
|
|
619
|
-
case ZSTD_error_GENERIC: return "Error (generic)";
|
|
620
|
-
case ZSTD_error_prefix_unknown: return "Unknown frame descriptor";
|
|
621
|
-
case ZSTD_error_frameParameter_unsupported: return "Unsupported frame parameter";
|
|
622
|
-
case ZSTD_error_frameParameter_unsupportedBy32bitsImplementation: return "Frame parameter unsupported in 32-bits mode";
|
|
623
|
-
case ZSTD_error_init_missing: return "Context should be init first";
|
|
624
|
-
case ZSTD_error_memory_allocation: return "Allocation error : not enough memory";
|
|
625
|
-
case ZSTD_error_dstSize_tooSmall: return "Destination buffer is too small";
|
|
626
|
-
case ZSTD_error_srcSize_wrong: return "Src size incorrect";
|
|
627
|
-
case ZSTD_error_corruption_detected: return "Corrupted block detected";
|
|
628
|
-
case ZSTD_error_tableLog_tooLarge: return "tableLog requires too much memory";
|
|
629
|
-
case ZSTD_error_maxSymbolValue_tooLarge: return "Unsupported max possible Symbol Value : too large";
|
|
630
|
-
case ZSTD_error_maxSymbolValue_tooSmall: return "Specified maxSymbolValue is too small";
|
|
631
|
-
case ZSTD_error_maxCode:
|
|
632
|
-
default: return codeError;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
#if defined (__cplusplus)
|
|
638
|
-
}
|
|
639
|
-
#endif
|
|
640
|
-
|
|
641
|
-
#endif /* ERROR_H_MODULE */
|
|
642
320
|
|
|
643
321
|
|
|
644
322
|
#endif /* ZSTD_STATIC_H */
|
|
@@ -647,42 +325,10 @@ ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
|
647
325
|
/*
|
|
648
326
|
zstd_internal - common functions to include
|
|
649
327
|
Header File for include
|
|
650
|
-
Copyright (C) 2014-2015, Yann Collet.
|
|
651
|
-
|
|
652
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
653
|
-
|
|
654
|
-
Redistribution and use in source and binary forms, with or without
|
|
655
|
-
modification, are permitted provided that the following conditions are
|
|
656
|
-
met:
|
|
657
|
-
* Redistributions of source code must retain the above copyright
|
|
658
|
-
notice, this list of conditions and the following disclaimer.
|
|
659
|
-
* Redistributions in binary form must reproduce the above
|
|
660
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
661
|
-
in the documentation and/or other materials provided with the
|
|
662
|
-
distribution.
|
|
663
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
664
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
665
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
666
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
667
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
668
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
669
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
670
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
671
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
672
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
673
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
674
|
-
|
|
675
|
-
You can contact the author at :
|
|
676
|
-
- zstd source repository : https://github.com/Cyan4973/zstd
|
|
677
|
-
- ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
678
328
|
*/
|
|
679
329
|
#ifndef ZSTD_CCOMMON_H_MODULE
|
|
680
330
|
#define ZSTD_CCOMMON_H_MODULE
|
|
681
331
|
|
|
682
|
-
#if defined (__cplusplus)
|
|
683
|
-
extern "C" {
|
|
684
|
-
#endif
|
|
685
|
-
|
|
686
332
|
/* *************************************
|
|
687
333
|
* Common macros
|
|
688
334
|
***************************************/
|
|
@@ -732,6 +378,8 @@ static const size_t ZSTD_frameHeaderSize_min = 5;
|
|
|
732
378
|
#define MIN_SEQUENCES_SIZE (2 /*seqNb*/ + 2 /*dumps*/ + 3 /*seqTables*/ + 1 /*bitStream*/)
|
|
733
379
|
#define MIN_CBLOCK_SIZE (3 /*litCSize*/ + MIN_SEQUENCES_SIZE)
|
|
734
380
|
|
|
381
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
|
382
|
+
|
|
735
383
|
typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|
736
384
|
|
|
737
385
|
|
|
@@ -743,7 +391,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
|
743
391
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
|
744
392
|
|
|
745
393
|
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
|
746
|
-
static void ZSTD_wildcopy(void* dst, const void* src,
|
|
394
|
+
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
|
747
395
|
{
|
|
748
396
|
const BYTE* ip = (const BYTE*)src;
|
|
749
397
|
BYTE* op = (BYTE*)dst;
|
|
@@ -754,44 +402,10 @@ static void ZSTD_wildcopy(void* dst, const void* src, size_t length)
|
|
|
754
402
|
}
|
|
755
403
|
|
|
756
404
|
|
|
757
|
-
#if defined (__cplusplus)
|
|
758
|
-
}
|
|
759
|
-
#endif
|
|
760
|
-
|
|
761
405
|
|
|
762
406
|
/* ******************************************************************
|
|
763
407
|
FSE : Finite State Entropy coder
|
|
764
408
|
header file
|
|
765
|
-
Copyright (C) 2013-2015, Yann Collet.
|
|
766
|
-
|
|
767
|
-
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
768
|
-
|
|
769
|
-
Redistribution and use in source and binary forms, with or without
|
|
770
|
-
modification, are permitted provided that the following conditions are
|
|
771
|
-
met:
|
|
772
|
-
|
|
773
|
-
* Redistributions of source code must retain the above copyright
|
|
774
|
-
notice, this list of conditions and the following disclaimer.
|
|
775
|
-
* Redistributions in binary form must reproduce the above
|
|
776
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
777
|
-
in the documentation and/or other materials provided with the
|
|
778
|
-
distribution.
|
|
779
|
-
|
|
780
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
781
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
782
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
783
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
784
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
785
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
786
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
787
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
788
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
789
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
790
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
791
|
-
|
|
792
|
-
You can contact the author at :
|
|
793
|
-
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
794
|
-
- Public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
795
409
|
****************************************************************** */
|
|
796
410
|
#ifndef FSE_H
|
|
797
411
|
#define FSE_H
|
|
@@ -993,16 +607,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
|
993
607
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
|
994
608
|
|
|
995
609
|
|
|
996
|
-
/*
|
|
997
|
-
* Start by invoking BIT_initDStream().
|
|
998
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
999
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
1000
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
1001
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
|
1002
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
|
1003
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
1004
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
|
1005
|
-
*/
|
|
1006
610
|
|
|
1007
611
|
|
|
1008
612
|
/******************************************
|
|
@@ -1016,14 +620,14 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
|
1016
620
|
/****************************************************************
|
|
1017
621
|
* Helper functions
|
|
1018
622
|
****************************************************************/
|
|
1019
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
|
623
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
1020
624
|
{
|
|
1021
625
|
# if defined(_MSC_VER) /* Visual */
|
|
1022
626
|
unsigned long r=0;
|
|
1023
627
|
_BitScanReverse ( &r, val );
|
|
1024
628
|
return (unsigned) r;
|
|
1025
629
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
1026
|
-
return
|
|
630
|
+
return __builtin_clz (val) ^ 31;
|
|
1027
631
|
# else /* Software version */
|
|
1028
632
|
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 };
|
|
1029
633
|
U32 v = val;
|
|
@@ -1072,13 +676,13 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
|
1072
676
|
bitD->bitContainer = *(const BYTE*)(bitD->start);
|
|
1073
677
|
switch(srcSize)
|
|
1074
678
|
{
|
|
1075
|
-
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16)
|
|
1076
|
-
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24)
|
|
1077
|
-
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32)
|
|
1078
|
-
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
|
|
1079
|
-
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
|
|
1080
|
-
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
|
|
1081
|
-
default
|
|
679
|
+
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);/* fall-through */
|
|
680
|
+
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);/* fall-through */
|
|
681
|
+
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);/* fall-through */
|
|
682
|
+
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24; /* fall-through */
|
|
683
|
+
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16; /* fall-through */
|
|
684
|
+
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8; /* fall-through */
|
|
685
|
+
default: break;
|
|
1082
686
|
}
|
|
1083
687
|
contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
|
|
1084
688
|
if (contain32 == 0) return ERROR(GENERIC); /* endMark not present */
|
|
@@ -1089,13 +693,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
|
1089
693
|
return srcSize;
|
|
1090
694
|
}
|
|
1091
695
|
|
|
1092
|
-
/*!BIT_lookBits
|
|
1093
|
-
* Provides next n bits from local register
|
|
1094
|
-
* local register is not modified (bits are still present for next read/look)
|
|
1095
|
-
* On 32-bits, maxNbBits==25
|
|
1096
|
-
* On 64-bits, maxNbBits==57
|
|
1097
|
-
* @return : value extracted
|
|
1098
|
-
*/
|
|
1099
696
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
1100
697
|
{
|
|
1101
698
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
@@ -1115,11 +712,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
1115
712
|
bitD->bitsConsumed += nbBits;
|
|
1116
713
|
}
|
|
1117
714
|
|
|
1118
|
-
/*!BIT_readBits
|
|
1119
|
-
* Read next n bits from local register.
|
|
1120
|
-
* pay attention to not read more than nbBits contained into local register.
|
|
1121
|
-
* @return : extracted value.
|
|
1122
|
-
*/
|
|
1123
715
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
1124
716
|
{
|
|
1125
717
|
size_t value = BIT_lookBits(bitD, nbBits);
|
|
@@ -1138,8 +730,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
1138
730
|
|
|
1139
731
|
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
|
1140
732
|
{
|
|
1141
|
-
|
|
1142
|
-
|
|
733
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
|
734
|
+
return BIT_DStream_overflow;
|
|
1143
735
|
|
|
1144
736
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
|
|
1145
737
|
{
|
|
@@ -1266,55 +858,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
|
1266
858
|
|
|
1267
859
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
|
1268
860
|
|
|
1269
|
-
/*!
|
|
1270
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
|
1271
|
-
You will decode FSE-encoded symbols from the bitStream,
|
|
1272
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
1273
|
-
|
|
1274
|
-
You will need a few variables to track your bitStream. They are :
|
|
1275
|
-
|
|
1276
|
-
BIT_DStream_t DStream; // Stream context
|
|
1277
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
|
1278
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
|
1279
|
-
|
|
1280
|
-
The first thing to do is to init the bitStream.
|
|
1281
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
|
1282
|
-
|
|
1283
|
-
You should then retrieve your initial state(s)
|
|
1284
|
-
(in reverse flushing order if you have several ones) :
|
|
1285
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
|
1286
|
-
|
|
1287
|
-
You can then decode your data, symbol after symbol.
|
|
1288
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
|
1289
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
1290
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
|
1291
|
-
|
|
1292
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
1293
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
1294
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
|
1295
|
-
|
|
1296
|
-
All above operations only read from local register (which size depends on size_t).
|
|
1297
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
1298
|
-
endSignal = FSE_reloadDStream(&DStream);
|
|
1299
|
-
|
|
1300
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
1301
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
|
1302
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
1303
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
1304
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
1305
|
-
|
|
1306
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
1307
|
-
to properly detect the exact end of stream.
|
|
1308
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
1309
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
|
1310
|
-
|
|
1311
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
1312
|
-
Checking if DStream has reached its end is performed by :
|
|
1313
|
-
BIT_endOfDStream(&DStream);
|
|
1314
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
1315
|
-
FSE_endOfDState(&DState);
|
|
1316
|
-
*/
|
|
1317
|
-
|
|
1318
861
|
|
|
1319
862
|
/* *****************************************
|
|
1320
863
|
* FSE unsafe API
|
|
@@ -1455,12 +998,15 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
|
1455
998
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
1456
999
|
# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
|
|
1457
1000
|
#else
|
|
1458
|
-
#
|
|
1459
|
-
#
|
|
1460
|
-
#
|
|
1001
|
+
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
|
1002
|
+
# ifdef __GNUC__
|
|
1003
|
+
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
1004
|
+
# else
|
|
1005
|
+
# define FORCE_INLINE static inline
|
|
1006
|
+
# endif
|
|
1461
1007
|
# else
|
|
1462
|
-
# define FORCE_INLINE static
|
|
1463
|
-
# endif
|
|
1008
|
+
# define FORCE_INLINE static
|
|
1009
|
+
# endif /* __STDC_VERSION__ */
|
|
1464
1010
|
#endif
|
|
1465
1011
|
|
|
1466
1012
|
|
|
@@ -1544,6 +1090,7 @@ static size_t FSE_buildDTable(FSE_DTable* dt, const short* normalizedCounter, un
|
|
|
1544
1090
|
if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
|
|
1545
1091
|
|
|
1546
1092
|
/* Init, lay down lowprob symbols */
|
|
1093
|
+
memset(tableDecode, 0, sizeof(FSE_DECODE_TYPE) * (maxSymbolValue+1) ); /* useless init, but keep static analyzer happy, and we don't need to performance optimize legacy decoders */
|
|
1547
1094
|
DTableH.tableLog = (U16)tableLog;
|
|
1548
1095
|
for (s=0; s<=maxSymbolValue; s++)
|
|
1549
1096
|
{
|
|
@@ -1704,8 +1251,8 @@ static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsi
|
|
|
1704
1251
|
else
|
|
1705
1252
|
{
|
|
1706
1253
|
bitCount -= (int)(8 * (iend - 4 - ip));
|
|
1707
|
-
|
|
1708
|
-
|
|
1254
|
+
ip = iend - 4;
|
|
1255
|
+
}
|
|
1709
1256
|
bitStream = MEM_readLE32(ip) >> (bitCount & 31);
|
|
1710
1257
|
}
|
|
1711
1258
|
}
|
|
@@ -2096,15 +1643,7 @@ static size_t HUF_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const
|
|
|
2096
1643
|
|
|
2097
1644
|
|
|
2098
1645
|
#ifdef _MSC_VER /* Visual Studio */
|
|
2099
|
-
# define FORCE_INLINE static __forceinline
|
|
2100
1646
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
2101
|
-
#else
|
|
2102
|
-
# ifdef __GNUC__
|
|
2103
|
-
# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
|
2104
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
2105
|
-
# else
|
|
2106
|
-
# define FORCE_INLINE static inline
|
|
2107
|
-
# endif
|
|
2108
1647
|
#endif
|
|
2109
1648
|
|
|
2110
1649
|
|
|
@@ -2157,10 +1696,12 @@ static size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
2157
1696
|
U32 weightTotal;
|
|
2158
1697
|
U32 tableLog;
|
|
2159
1698
|
const BYTE* ip = (const BYTE*) src;
|
|
2160
|
-
size_t iSize
|
|
1699
|
+
size_t iSize;
|
|
2161
1700
|
size_t oSize;
|
|
2162
1701
|
U32 n;
|
|
2163
1702
|
|
|
1703
|
+
if (!srcSize) return ERROR(srcSize_wrong);
|
|
1704
|
+
iSize = ip[0];
|
|
2164
1705
|
//memset(huffWeight, 0, hwSize); /* is not necessary, even though some analyzer complain ... */
|
|
2165
1706
|
|
|
2166
1707
|
if (iSize >= 128) /* special header */
|
|
@@ -2202,6 +1743,7 @@ static size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
2202
1743
|
rankStats[huffWeight[n]]++;
|
|
2203
1744
|
weightTotal += (1 << huffWeight[n]) >> 1;
|
|
2204
1745
|
}
|
|
1746
|
+
if (weightTotal == 0) return ERROR(corruption_detected);
|
|
2205
1747
|
|
|
2206
1748
|
/* get last non-null symbol weight (implied, total must be 2^n) */
|
|
2207
1749
|
tableLog = BIT_highbit32(weightTotal) + 1;
|
|
@@ -2912,17 +2454,9 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
|
|
|
2912
2454
|
* Compiler specifics
|
|
2913
2455
|
*********************************************************/
|
|
2914
2456
|
#ifdef _MSC_VER /* Visual Studio */
|
|
2915
|
-
# define FORCE_INLINE static __forceinline
|
|
2916
2457
|
# include <intrin.h> /* For Visual 2005 */
|
|
2917
2458
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
2918
2459
|
# pragma warning(disable : 4324) /* disable: C4324: padded structure */
|
|
2919
|
-
#else
|
|
2920
|
-
# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
|
2921
|
-
# ifdef __GNUC__
|
|
2922
|
-
# define FORCE_INLINE static inline __attribute__((always_inline))
|
|
2923
|
-
# else
|
|
2924
|
-
# define FORCE_INLINE static inline
|
|
2925
|
-
# endif
|
|
2926
2460
|
#endif
|
|
2927
2461
|
|
|
2928
2462
|
|
|
@@ -2972,7 +2506,6 @@ struct ZSTDv04_Dctx_s
|
|
|
2972
2506
|
blockType_t bType;
|
|
2973
2507
|
ZSTD_dStage stage;
|
|
2974
2508
|
const BYTE* litPtr;
|
|
2975
|
-
size_t litBufSize;
|
|
2976
2509
|
size_t litSize;
|
|
2977
2510
|
BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */];
|
|
2978
2511
|
BYTE headerBuffer[ZSTD_frameHeaderSize_max];
|
|
@@ -3043,7 +2576,7 @@ static size_t ZSTD_decodeFrameHeader_Part2(ZSTD_DCtx* zc, const void* src, size_
|
|
|
3043
2576
|
size_t result;
|
|
3044
2577
|
if (srcSize != zc->headerSize) return ERROR(srcSize_wrong);
|
|
3045
2578
|
result = ZSTD_getFrameParams(&(zc->params), src, srcSize);
|
|
3046
|
-
if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(
|
|
2579
|
+
if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(frameParameter_unsupported);
|
|
3047
2580
|
return result;
|
|
3048
2581
|
}
|
|
3049
2582
|
|
|
@@ -3070,7 +2603,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
|
3070
2603
|
static size_t ZSTD_copyRawBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3071
2604
|
{
|
|
3072
2605
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
|
3073
|
-
|
|
2606
|
+
if (srcSize > 0) {
|
|
2607
|
+
memcpy(dst, src, srcSize);
|
|
2608
|
+
}
|
|
3074
2609
|
return srcSize;
|
|
3075
2610
|
}
|
|
3076
2611
|
|
|
@@ -3113,8 +2648,8 @@ static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
|
3113
2648
|
size_t litSize = BLOCKSIZE;
|
|
3114
2649
|
const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize);
|
|
3115
2650
|
dctx->litPtr = dctx->litBuffer;
|
|
3116
|
-
dctx->litBufSize = BLOCKSIZE+8;
|
|
3117
2651
|
dctx->litSize = litSize;
|
|
2652
|
+
memset(dctx->litBuffer + dctx->litSize, 0, 8);
|
|
3118
2653
|
return readSize; /* works if it's an error too */
|
|
3119
2654
|
}
|
|
3120
2655
|
case IS_RAW:
|
|
@@ -3122,25 +2657,24 @@ static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
|
3122
2657
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
3123
2658
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
|
3124
2659
|
{
|
|
2660
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
3125
2661
|
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
|
3126
2662
|
memcpy(dctx->litBuffer, istart, litSize);
|
|
3127
2663
|
dctx->litPtr = dctx->litBuffer;
|
|
3128
|
-
dctx->litBufSize = BLOCKSIZE+8;
|
|
3129
2664
|
dctx->litSize = litSize;
|
|
2665
|
+
memset(dctx->litBuffer + dctx->litSize, 0, 8);
|
|
3130
2666
|
return litSize+3;
|
|
3131
2667
|
}
|
|
3132
2668
|
/* direct reference into compressed stream */
|
|
3133
2669
|
dctx->litPtr = istart+3;
|
|
3134
|
-
dctx->litBufSize = srcSize-3;
|
|
3135
2670
|
dctx->litSize = litSize;
|
|
3136
2671
|
return litSize+3; }
|
|
3137
2672
|
case IS_RLE:
|
|
3138
2673
|
{
|
|
3139
2674
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
3140
2675
|
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
3141
|
-
memset(dctx->litBuffer, istart[3], litSize);
|
|
2676
|
+
memset(dctx->litBuffer, istart[3], litSize + 8);
|
|
3142
2677
|
dctx->litPtr = dctx->litBuffer;
|
|
3143
|
-
dctx->litBufSize = BLOCKSIZE+8;
|
|
3144
2678
|
dctx->litSize = litSize;
|
|
3145
2679
|
return 4;
|
|
3146
2680
|
}
|
|
@@ -3196,7 +2730,6 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
|
3196
2730
|
/* Build DTables */
|
|
3197
2731
|
switch(LLtype)
|
|
3198
2732
|
{
|
|
3199
|
-
U32 max;
|
|
3200
2733
|
case bt_rle :
|
|
3201
2734
|
LLlog = 0;
|
|
3202
2735
|
FSE_buildDTable_rle(DTableLL, *ip++); break;
|
|
@@ -3204,17 +2737,16 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
|
3204
2737
|
LLlog = LLbits;
|
|
3205
2738
|
FSE_buildDTable_raw(DTableLL, LLbits); break;
|
|
3206
2739
|
default :
|
|
3207
|
-
max = MaxLL;
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
}
|
|
2740
|
+
{ U32 max = MaxLL;
|
|
2741
|
+
headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
|
|
2742
|
+
if (FSE_isError(headerSize)) return ERROR(GENERIC);
|
|
2743
|
+
if (LLlog > LLFSELog) return ERROR(corruption_detected);
|
|
2744
|
+
ip += headerSize;
|
|
2745
|
+
FSE_buildDTable(DTableLL, norm, max, LLlog);
|
|
2746
|
+
} }
|
|
3214
2747
|
|
|
3215
2748
|
switch(Offtype)
|
|
3216
2749
|
{
|
|
3217
|
-
U32 max;
|
|
3218
2750
|
case bt_rle :
|
|
3219
2751
|
Offlog = 0;
|
|
3220
2752
|
if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
|
|
@@ -3224,17 +2756,16 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
|
3224
2756
|
Offlog = Offbits;
|
|
3225
2757
|
FSE_buildDTable_raw(DTableOffb, Offbits); break;
|
|
3226
2758
|
default :
|
|
3227
|
-
max = MaxOff;
|
|
3228
|
-
|
|
3229
|
-
|
|
3230
|
-
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
}
|
|
2759
|
+
{ U32 max = MaxOff;
|
|
2760
|
+
headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
|
|
2761
|
+
if (FSE_isError(headerSize)) return ERROR(GENERIC);
|
|
2762
|
+
if (Offlog > OffFSELog) return ERROR(corruption_detected);
|
|
2763
|
+
ip += headerSize;
|
|
2764
|
+
FSE_buildDTable(DTableOffb, norm, max, Offlog);
|
|
2765
|
+
} }
|
|
3234
2766
|
|
|
3235
2767
|
switch(MLtype)
|
|
3236
2768
|
{
|
|
3237
|
-
U32 max;
|
|
3238
2769
|
case bt_rle :
|
|
3239
2770
|
MLlog = 0;
|
|
3240
2771
|
if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
|
|
@@ -3243,14 +2774,13 @@ static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* d
|
|
|
3243
2774
|
MLlog = MLbits;
|
|
3244
2775
|
FSE_buildDTable_raw(DTableML, MLbits); break;
|
|
3245
2776
|
default :
|
|
3246
|
-
max = MaxML;
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
}
|
|
2777
|
+
{ U32 max = MaxML;
|
|
2778
|
+
headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
|
|
2779
|
+
if (FSE_isError(headerSize)) return ERROR(GENERIC);
|
|
2780
|
+
if (MLlog > MLFSELog) return ERROR(corruption_detected);
|
|
2781
|
+
ip += headerSize;
|
|
2782
|
+
FSE_buildDTable(DTableML, norm, max, MLlog);
|
|
2783
|
+
} } }
|
|
3254
2784
|
|
|
3255
2785
|
return ip-istart;
|
|
3256
2786
|
}
|
|
@@ -3285,21 +2815,18 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3285
2815
|
/* Literal length */
|
|
3286
2816
|
litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
|
|
3287
2817
|
prevOffset = litLength ? seq->offset : seqState->prevOffset;
|
|
3288
|
-
if (litLength == MaxLL)
|
|
3289
|
-
|
|
3290
|
-
U32 add = *dumps++;
|
|
2818
|
+
if (litLength == MaxLL) {
|
|
2819
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
3291
2820
|
if (add < 255) litLength += add;
|
|
3292
|
-
else
|
|
3293
|
-
|
|
3294
|
-
litLength = MEM_readLE32(dumps) & 0xFFFFFF; /* no pb : dumps is always followed by seq tables > 1 byte */
|
|
2821
|
+
else if (dumps + 3 <= de) {
|
|
2822
|
+
litLength = MEM_readLE24(dumps);
|
|
3295
2823
|
dumps += 3;
|
|
3296
2824
|
}
|
|
3297
|
-
if (dumps >= de) dumps = de-1;
|
|
2825
|
+
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3298
2826
|
}
|
|
3299
2827
|
|
|
3300
2828
|
/* Offset */
|
|
3301
|
-
{
|
|
3302
|
-
static const U32 offsetPrefix[MaxOff+1] = {
|
|
2829
|
+
{ static const U32 offsetPrefix[MaxOff+1] = {
|
|
3303
2830
|
1 /*fake*/, 1, 2, 4, 8, 16, 32, 64, 128, 256,
|
|
3304
2831
|
512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144,
|
|
3305
2832
|
524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, /*fake*/ 1, 1, 1, 1, 1 };
|
|
@@ -3316,16 +2843,14 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3316
2843
|
|
|
3317
2844
|
/* MatchLength */
|
|
3318
2845
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
3319
|
-
if (matchLength == MaxML)
|
|
3320
|
-
|
|
3321
|
-
U32 add = *dumps++;
|
|
2846
|
+
if (matchLength == MaxML) {
|
|
2847
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
3322
2848
|
if (add < 255) matchLength += add;
|
|
3323
|
-
else
|
|
3324
|
-
|
|
3325
|
-
matchLength = MEM_readLE32(dumps) & 0xFFFFFF; /* no pb : dumps is always followed by seq tables > 1 byte */
|
|
2849
|
+
else if (dumps + 3 <= de){
|
|
2850
|
+
matchLength = MEM_readLE24(dumps);
|
|
3326
2851
|
dumps += 3;
|
|
3327
2852
|
}
|
|
3328
|
-
if (dumps >= de) dumps = de-1;
|
|
2853
|
+
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3329
2854
|
}
|
|
3330
2855
|
matchLength += MINMATCH;
|
|
3331
2856
|
|
|
@@ -3339,11 +2864,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3339
2864
|
|
|
3340
2865
|
static size_t ZSTD_execSequence(BYTE* op,
|
|
3341
2866
|
BYTE* const oend, seq_t sequence,
|
|
3342
|
-
const BYTE** litPtr, const BYTE* const
|
|
2867
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
|
3343
2868
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
|
3344
2869
|
{
|
|
3345
2870
|
static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
|
3346
|
-
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /*
|
|
2871
|
+
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
|
|
3347
2872
|
BYTE* const oLitEnd = op + sequence.litLength;
|
|
3348
2873
|
const size_t sequenceLength = sequence.litLength + sequence.matchLength;
|
|
3349
2874
|
BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
|
|
@@ -3354,7 +2879,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
|
3354
2879
|
/* check */
|
|
3355
2880
|
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
|
|
3356
2881
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
|
3357
|
-
if (litEnd >
|
|
2882
|
+
if (litEnd > litLimit) return ERROR(corruption_detected); /* risk read beyond lit buffer */
|
|
3358
2883
|
|
|
3359
2884
|
/* copy Literals */
|
|
3360
2885
|
ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
|
@@ -3380,12 +2905,16 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
|
3380
2905
|
op = oLitEnd + length1;
|
|
3381
2906
|
sequence.matchLength -= length1;
|
|
3382
2907
|
match = base;
|
|
2908
|
+
if (op > oend_8 || sequence.matchLength < MINMATCH) {
|
|
2909
|
+
while (op < oMatchEnd) *op++ = *match++;
|
|
2910
|
+
return sequenceLength;
|
|
2911
|
+
}
|
|
3383
2912
|
}
|
|
3384
2913
|
}
|
|
2914
|
+
/* Requirement: op <= oend_8 */
|
|
3385
2915
|
|
|
3386
2916
|
/* match within prefix */
|
|
3387
|
-
if (sequence.offset < 8)
|
|
3388
|
-
{
|
|
2917
|
+
if (sequence.offset < 8) {
|
|
3389
2918
|
/* close range match, overlap */
|
|
3390
2919
|
const int sub2 = dec64table[sequence.offset];
|
|
3391
2920
|
op[0] = match[0];
|
|
@@ -3395,14 +2924,12 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
|
3395
2924
|
match += dec32table[sequence.offset];
|
|
3396
2925
|
ZSTD_copy4(op+4, match);
|
|
3397
2926
|
match -= sub2;
|
|
3398
|
-
}
|
|
3399
|
-
else
|
|
3400
|
-
{
|
|
2927
|
+
} else {
|
|
3401
2928
|
ZSTD_copy8(op, match);
|
|
3402
2929
|
}
|
|
3403
2930
|
op += 8; match += 8;
|
|
3404
2931
|
|
|
3405
|
-
if (oMatchEnd > oend-
|
|
2932
|
+
if (oMatchEnd > oend-(16-MINMATCH))
|
|
3406
2933
|
{
|
|
3407
2934
|
if (op < oend_8)
|
|
3408
2935
|
{
|
|
@@ -3414,7 +2941,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
|
3414
2941
|
}
|
|
3415
2942
|
else
|
|
3416
2943
|
{
|
|
3417
|
-
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
2944
|
+
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8, but must be signed */
|
|
3418
2945
|
}
|
|
3419
2946
|
return sequenceLength;
|
|
3420
2947
|
}
|
|
@@ -3432,7 +2959,6 @@ static size_t ZSTD_decompressSequences(
|
|
|
3432
2959
|
BYTE* const oend = ostart + maxDstSize;
|
|
3433
2960
|
size_t errorCode, dumpsLength;
|
|
3434
2961
|
const BYTE* litPtr = dctx->litPtr;
|
|
3435
|
-
const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8;
|
|
3436
2962
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
|
3437
2963
|
int nbSeq;
|
|
3438
2964
|
const BYTE* dumps;
|
|
@@ -3471,7 +2997,7 @@ static size_t ZSTD_decompressSequences(
|
|
|
3471
2997
|
size_t oneSeqSize;
|
|
3472
2998
|
nbSeq--;
|
|
3473
2999
|
ZSTD_decodeSequence(&sequence, &seqState);
|
|
3474
|
-
oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr,
|
|
3000
|
+
oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
|
3475
3001
|
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
|
3476
3002
|
op += oneSeqSize;
|
|
3477
3003
|
}
|
|
@@ -3484,8 +3010,10 @@ static size_t ZSTD_decompressSequences(
|
|
|
3484
3010
|
size_t lastLLSize = litEnd - litPtr;
|
|
3485
3011
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
|
3486
3012
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3487
|
-
if (
|
|
3488
|
-
|
|
3013
|
+
if (lastLLSize > 0) {
|
|
3014
|
+
if (op != litPtr) memcpy(op, litPtr, lastLLSize);
|
|
3015
|
+
op += lastLLSize;
|
|
3016
|
+
}
|
|
3489
3017
|
}
|
|
3490
3018
|
}
|
|
3491
3019
|
|
|
@@ -3511,9 +3039,12 @@ static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
|
|
3511
3039
|
{
|
|
3512
3040
|
/* blockType == blockCompressed */
|
|
3513
3041
|
const BYTE* ip = (const BYTE*)src;
|
|
3042
|
+
size_t litCSize;
|
|
3043
|
+
|
|
3044
|
+
if (srcSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
3514
3045
|
|
|
3515
3046
|
/* Decode literals sub-block */
|
|
3516
|
-
|
|
3047
|
+
litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
|
|
3517
3048
|
if (ZSTD_isError(litCSize)) return litCSize;
|
|
3518
3049
|
ip += litCSize;
|
|
3519
3050
|
srcSize -= litCSize;
|
|
@@ -3601,6 +3132,58 @@ static size_t ZSTD_decompress_usingDict(ZSTD_DCtx* ctx,
|
|
|
3601
3132
|
return op-ostart;
|
|
3602
3133
|
}
|
|
3603
3134
|
|
|
3135
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
|
3136
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
|
3137
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
|
3138
|
+
{
|
|
3139
|
+
*cSize = ret;
|
|
3140
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
|
3141
|
+
}
|
|
3142
|
+
|
|
3143
|
+
void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
|
3144
|
+
{
|
|
3145
|
+
const BYTE* ip = (const BYTE*)src;
|
|
3146
|
+
size_t remainingSize = srcSize;
|
|
3147
|
+
size_t nbBlocks = 0;
|
|
3148
|
+
blockProperties_t blockProperties;
|
|
3149
|
+
|
|
3150
|
+
/* Frame Header */
|
|
3151
|
+
if (srcSize < ZSTD_frameHeaderSize_min) {
|
|
3152
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3153
|
+
return;
|
|
3154
|
+
}
|
|
3155
|
+
if (MEM_readLE32(src) != ZSTD_MAGICNUMBER) {
|
|
3156
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
|
3157
|
+
return;
|
|
3158
|
+
}
|
|
3159
|
+
ip += ZSTD_frameHeaderSize_min; remainingSize -= ZSTD_frameHeaderSize_min;
|
|
3160
|
+
|
|
3161
|
+
/* Loop on each block */
|
|
3162
|
+
while (1)
|
|
3163
|
+
{
|
|
3164
|
+
size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
3165
|
+
if (ZSTD_isError(cBlockSize)) {
|
|
3166
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
|
3167
|
+
return;
|
|
3168
|
+
}
|
|
3169
|
+
|
|
3170
|
+
ip += ZSTD_blockHeaderSize;
|
|
3171
|
+
remainingSize -= ZSTD_blockHeaderSize;
|
|
3172
|
+
if (cBlockSize > remainingSize) {
|
|
3173
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3174
|
+
return;
|
|
3175
|
+
}
|
|
3176
|
+
|
|
3177
|
+
if (cBlockSize == 0) break; /* bt_end */
|
|
3178
|
+
|
|
3179
|
+
ip += cBlockSize;
|
|
3180
|
+
remainingSize -= cBlockSize;
|
|
3181
|
+
nbBlocks++;
|
|
3182
|
+
}
|
|
3183
|
+
|
|
3184
|
+
*cSize = ip - (const BYTE*)src;
|
|
3185
|
+
*dBound = nbBlocks * BLOCKSIZE;
|
|
3186
|
+
}
|
|
3604
3187
|
|
|
3605
3188
|
/* ******************************
|
|
3606
3189
|
* Streaming Decompression API
|
|
@@ -3752,7 +3335,7 @@ static void ZSTD_decompress_insertDictionary(ZSTD_DCtx* ctx, const void* dict, s
|
|
|
3752
3335
|
* The function will report how many bytes were read or written by modifying *srcSizePtr and *maxDstSizePtr.
|
|
3753
3336
|
* 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.
|
|
3754
3337
|
* The content of dst will be overwritten (up to *maxDstSizePtr) at each function call, so save its content if it matters or change dst .
|
|
3755
|
-
*
|
|
3338
|
+
* return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to improve latency)
|
|
3756
3339
|
* or 0 when a frame is completely decoded
|
|
3757
3340
|
* or an error code, which can be tested using ZBUFF_isError().
|
|
3758
3341
|
*
|
|
@@ -3828,7 +3411,9 @@ static size_t ZBUFF_decompressWithDictionary(ZBUFF_DCtx* zbc, const void* src, s
|
|
|
3828
3411
|
static size_t ZBUFF_limitCopy(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3829
3412
|
{
|
|
3830
3413
|
size_t length = MIN(maxDstSize, srcSize);
|
|
3831
|
-
|
|
3414
|
+
if (length > 0) {
|
|
3415
|
+
memcpy(dst, src, length);
|
|
3416
|
+
}
|
|
3832
3417
|
return length;
|
|
3833
3418
|
}
|
|
3834
3419
|
|
|
@@ -3844,12 +3429,14 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
|
3844
3429
|
char* const oend = ostart + *maxDstSizePtr;
|
|
3845
3430
|
U32 notDone = 1;
|
|
3846
3431
|
|
|
3432
|
+
DEBUGLOG(5, "ZBUFF_decompressContinue");
|
|
3847
3433
|
while (notDone)
|
|
3848
3434
|
{
|
|
3849
3435
|
switch(zbc->stage)
|
|
3850
3436
|
{
|
|
3851
3437
|
|
|
3852
3438
|
case ZBUFFds_init :
|
|
3439
|
+
DEBUGLOG(5, "ZBUFF_decompressContinue: stage==ZBUFFds_init => ERROR(init_missing)");
|
|
3853
3440
|
return ERROR(init_missing);
|
|
3854
3441
|
|
|
3855
3442
|
case ZBUFFds_readHeader :
|
|
@@ -3911,7 +3498,7 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
|
3911
3498
|
break;
|
|
3912
3499
|
}
|
|
3913
3500
|
zbc->stage = ZBUFFds_read;
|
|
3914
|
-
|
|
3501
|
+
/* fall-through */
|
|
3915
3502
|
case ZBUFFds_read:
|
|
3916
3503
|
{
|
|
3917
3504
|
size_t neededInSize = ZSTD_nextSrcSizeToDecompress(zbc->zc);
|
|
@@ -3937,7 +3524,7 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
|
3937
3524
|
if (ip==iend) { notDone = 0; break; } /* no more input */
|
|
3938
3525
|
zbc->stage = ZBUFFds_load;
|
|
3939
3526
|
}
|
|
3940
|
-
|
|
3527
|
+
/* fall-through */
|
|
3941
3528
|
case ZBUFFds_load:
|
|
3942
3529
|
{
|
|
3943
3530
|
size_t neededInSize = ZSTD_nextSrcSizeToDecompress(zbc->zc);
|
|
@@ -3957,9 +3544,10 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
|
3957
3544
|
if (!decodedSize) { zbc->stage = ZBUFFds_read; break; } /* this was just a header */
|
|
3958
3545
|
zbc->outEnd = zbc->outStart + decodedSize;
|
|
3959
3546
|
zbc->stage = ZBUFFds_flush;
|
|
3960
|
-
|
|
3547
|
+
/* ZBUFFds_flush follows */
|
|
3961
3548
|
}
|
|
3962
3549
|
}
|
|
3550
|
+
/* fall-through */
|
|
3963
3551
|
case ZBUFFds_flush:
|
|
3964
3552
|
{
|
|
3965
3553
|
size_t toFlushSize = zbc->outEnd - zbc->outStart;
|
|
@@ -4024,11 +3612,10 @@ size_t ZSTDv04_decompress(void* dst, size_t maxDstSize, const void* src, size_t
|
|
|
4024
3612
|
return regenSize;
|
|
4025
3613
|
#else
|
|
4026
3614
|
ZSTD_DCtx dctx;
|
|
4027
|
-
return
|
|
3615
|
+
return ZSTDv04_decompressDCtx(&dctx, dst, maxDstSize, src, srcSize);
|
|
4028
3616
|
#endif
|
|
4029
3617
|
}
|
|
4030
3618
|
|
|
4031
|
-
|
|
4032
3619
|
size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx) { return ZSTD_resetDCtx(dctx); }
|
|
4033
3620
|
|
|
4034
3621
|
size_t ZSTDv04_nextSrcSizeToDecompress(ZSTDv04_Dctx* dctx)
|
|
@@ -4044,7 +3631,7 @@ size_t ZSTDv04_decompressContinue(ZSTDv04_Dctx* dctx, void* dst, size_t maxDstSi
|
|
|
4044
3631
|
|
|
4045
3632
|
|
|
4046
3633
|
ZBUFFv04_DCtx* ZBUFFv04_createDCtx(void) { return ZBUFF_createDCtx(); }
|
|
4047
|
-
size_t
|
|
3634
|
+
size_t ZBUFFv04_freeDCtx(ZBUFFv04_DCtx* dctx) { return ZBUFF_freeDCtx(dctx); }
|
|
4048
3635
|
|
|
4049
3636
|
size_t ZBUFFv04_decompressInit(ZBUFFv04_DCtx* dctx) { return ZBUFF_decompressInit(dctx); }
|
|
4050
3637
|
size_t ZBUFFv04_decompressWithDictionary(ZBUFFv04_DCtx* dctx, const void* src, size_t srcSize)
|
|
@@ -4052,5 +3639,9 @@ size_t ZBUFFv04_decompressWithDictionary(ZBUFFv04_DCtx* dctx, const void* src, s
|
|
|
4052
3639
|
|
|
4053
3640
|
size_t ZBUFFv04_decompressContinue(ZBUFFv04_DCtx* dctx, void* dst, size_t* maxDstSizePtr, const void* src, size_t* srcSizePtr)
|
|
4054
3641
|
{
|
|
3642
|
+
DEBUGLOG(5, "ZBUFFv04_decompressContinue");
|
|
4055
3643
|
return ZBUFF_decompressContinue(dctx, dst, maxDstSizePtr, src, srcSizePtr);
|
|
4056
3644
|
}
|
|
3645
|
+
|
|
3646
|
+
ZSTD_DCtx* ZSTDv04_createDCtx(void) { return ZSTD_createDCtx(); }
|
|
3647
|
+
size_t ZSTDv04_freeDCtx(ZSTD_DCtx* dctx) { return ZSTD_freeDCtx(dctx); }
|