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,16 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
copyright notice, this list of conditions and the following disclaimer
|
|
15
|
-
in the documentation and/or other materials provided with the
|
|
16
|
-
distribution.
|
|
17
|
-
|
|
18
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
19
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
20
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
21
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
22
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
23
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
24
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
25
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
26
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
27
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
29
|
-
|
|
30
|
-
You can contact the author at :
|
|
31
|
-
- FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
32
|
-
- Public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
33
|
-
*************************************************************************** */
|
|
1
|
+
/* ******************************************************************
|
|
2
|
+
* Common functions of New Generation Entropy library
|
|
3
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
4
|
+
*
|
|
5
|
+
* You can contact the author at :
|
|
6
|
+
* - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
7
|
+
* - Public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under both the BSD-style license (found in the
|
|
10
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
11
|
+
* in the COPYING file in the root directory of this source tree).
|
|
12
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
13
|
+
****************************************************************** */
|
|
34
14
|
|
|
35
15
|
/* *************************************
|
|
36
16
|
* Dependencies
|
|
@@ -38,33 +18,26 @@
|
|
|
38
18
|
#include "mem.h"
|
|
39
19
|
#include "error_private.h" /* ERR_*, ERROR */
|
|
40
20
|
#define FSE_STATIC_LINKING_ONLY /* FSE_MIN_TABLELOG */
|
|
41
|
-
#include "fse.h"
|
|
21
|
+
#include "fse.h"
|
|
42
22
|
#define HUF_STATIC_LINKING_ONLY /* HUF_TABLELOG_ABSOLUTEMAX */
|
|
43
|
-
#include "huf.h"
|
|
23
|
+
#include "huf.h"
|
|
44
24
|
|
|
45
25
|
|
|
26
|
+
/*=== Version ===*/
|
|
27
|
+
unsigned FSE_versionNumber(void) { return FSE_VERSION_NUMBER; }
|
|
46
28
|
|
|
47
|
-
/*-****************************************
|
|
48
|
-
* FSE Error Management
|
|
49
|
-
******************************************/
|
|
50
|
-
unsigned FSE_isError(size_t code) { return ERR_isError(code); }
|
|
51
29
|
|
|
30
|
+
/*=== Error Management ===*/
|
|
31
|
+
unsigned FSE_isError(size_t code) { return ERR_isError(code); }
|
|
52
32
|
const char* FSE_getErrorName(size_t code) { return ERR_getErrorName(code); }
|
|
53
33
|
|
|
54
|
-
|
|
55
|
-
/* **************************************************************
|
|
56
|
-
* HUF Error Management
|
|
57
|
-
****************************************************************/
|
|
58
34
|
unsigned HUF_isError(size_t code) { return ERR_isError(code); }
|
|
59
|
-
|
|
60
35
|
const char* HUF_getErrorName(size_t code) { return ERR_getErrorName(code); }
|
|
61
36
|
|
|
62
37
|
|
|
63
38
|
/*-**************************************************************
|
|
64
39
|
* FSE NCount encoding-decoding
|
|
65
40
|
****************************************************************/
|
|
66
|
-
static short FSE_abs(short a) { return a<0 ? -a : a; }
|
|
67
|
-
|
|
68
41
|
size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
|
|
69
42
|
const void* headerBuffer, size_t hbSize)
|
|
70
43
|
{
|
|
@@ -79,7 +52,21 @@ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* t
|
|
|
79
52
|
unsigned charnum = 0;
|
|
80
53
|
int previous0 = 0;
|
|
81
54
|
|
|
82
|
-
if (hbSize < 4)
|
|
55
|
+
if (hbSize < 4) {
|
|
56
|
+
/* This function only works when hbSize >= 4 */
|
|
57
|
+
char buffer[4];
|
|
58
|
+
memset(buffer, 0, sizeof(buffer));
|
|
59
|
+
memcpy(buffer, headerBuffer, hbSize);
|
|
60
|
+
{ size_t const countSize = FSE_readNCount(normalizedCounter, maxSVPtr, tableLogPtr,
|
|
61
|
+
buffer, sizeof(buffer));
|
|
62
|
+
if (FSE_isError(countSize)) return countSize;
|
|
63
|
+
if (countSize > hbSize) return ERROR(corruption_detected);
|
|
64
|
+
return countSize;
|
|
65
|
+
} }
|
|
66
|
+
assert(hbSize >= 4);
|
|
67
|
+
|
|
68
|
+
/* init */
|
|
69
|
+
memset(normalizedCounter, 0, (*maxSVPtr+1) * sizeof(normalizedCounter[0])); /* all symbols not present in NCount have a frequency of 0 */
|
|
83
70
|
bitStream = MEM_readLE32(ip);
|
|
84
71
|
nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
|
|
85
72
|
if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge);
|
|
@@ -90,50 +77,50 @@ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* t
|
|
|
90
77
|
threshold = 1<<nbBits;
|
|
91
78
|
nbBits++;
|
|
92
79
|
|
|
93
|
-
while ((remaining>1)
|
|
80
|
+
while ((remaining>1) & (charnum<=*maxSVPtr)) {
|
|
94
81
|
if (previous0) {
|
|
95
82
|
unsigned n0 = charnum;
|
|
96
83
|
while ((bitStream & 0xFFFF) == 0xFFFF) {
|
|
97
|
-
n0+=24;
|
|
84
|
+
n0 += 24;
|
|
98
85
|
if (ip < iend-5) {
|
|
99
|
-
ip+=2;
|
|
86
|
+
ip += 2;
|
|
100
87
|
bitStream = MEM_readLE32(ip) >> bitCount;
|
|
101
88
|
} else {
|
|
102
89
|
bitStream >>= 16;
|
|
103
|
-
bitCount+=16;
|
|
90
|
+
bitCount += 16;
|
|
104
91
|
} }
|
|
105
92
|
while ((bitStream & 3) == 3) {
|
|
106
|
-
n0+=3;
|
|
107
|
-
bitStream>>=2;
|
|
108
|
-
bitCount+=2;
|
|
93
|
+
n0 += 3;
|
|
94
|
+
bitStream >>= 2;
|
|
95
|
+
bitCount += 2;
|
|
109
96
|
}
|
|
110
97
|
n0 += bitStream & 3;
|
|
111
98
|
bitCount += 2;
|
|
112
99
|
if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall);
|
|
113
100
|
while (charnum < n0) normalizedCounter[charnum++] = 0;
|
|
114
101
|
if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) {
|
|
102
|
+
assert((bitCount >> 3) <= 3); /* For first condition to work */
|
|
115
103
|
ip += bitCount>>3;
|
|
116
104
|
bitCount &= 7;
|
|
117
105
|
bitStream = MEM_readLE32(ip) >> bitCount;
|
|
118
|
-
}
|
|
119
|
-
else
|
|
106
|
+
} else {
|
|
120
107
|
bitStream >>= 2;
|
|
121
|
-
}
|
|
122
|
-
{
|
|
123
|
-
|
|
108
|
+
} }
|
|
109
|
+
{ int const max = (2*threshold-1) - remaining;
|
|
110
|
+
int count;
|
|
124
111
|
|
|
125
112
|
if ((bitStream & (threshold-1)) < (U32)max) {
|
|
126
|
-
count =
|
|
127
|
-
bitCount
|
|
113
|
+
count = bitStream & (threshold-1);
|
|
114
|
+
bitCount += nbBits-1;
|
|
128
115
|
} else {
|
|
129
|
-
count =
|
|
116
|
+
count = bitStream & (2*threshold-1);
|
|
130
117
|
if (count >= threshold) count -= max;
|
|
131
|
-
bitCount
|
|
118
|
+
bitCount += nbBits;
|
|
132
119
|
}
|
|
133
120
|
|
|
134
121
|
count--; /* extra accuracy */
|
|
135
|
-
remaining -=
|
|
136
|
-
normalizedCounter[charnum++] = count;
|
|
122
|
+
remaining -= count < 0 ? -count : count; /* -1 means +1 */
|
|
123
|
+
normalizedCounter[charnum++] = (short)count;
|
|
137
124
|
previous0 = !count;
|
|
138
125
|
while (remaining < threshold) {
|
|
139
126
|
nbBits--;
|
|
@@ -148,12 +135,12 @@ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* t
|
|
|
148
135
|
ip = iend - 4;
|
|
149
136
|
}
|
|
150
137
|
bitStream = MEM_readLE32(ip) >> (bitCount & 31);
|
|
151
|
-
} } /* while ((remaining>1)
|
|
152
|
-
if (remaining != 1) return ERROR(
|
|
138
|
+
} } /* while ((remaining>1) & (charnum<=*maxSVPtr)) */
|
|
139
|
+
if (remaining != 1) return ERROR(corruption_detected);
|
|
140
|
+
if (bitCount > 32) return ERROR(corruption_detected);
|
|
153
141
|
*maxSVPtr = charnum-1;
|
|
154
142
|
|
|
155
143
|
ip += (bitCount+7)>>3;
|
|
156
|
-
if ((size_t)(ip-istart) > hbSize) return ERROR(srcSize_wrong);
|
|
157
144
|
return ip-istart;
|
|
158
145
|
}
|
|
159
146
|
|
|
@@ -161,8 +148,9 @@ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* t
|
|
|
161
148
|
/*! HUF_readStats() :
|
|
162
149
|
Read compact Huffman tree, saved by HUF_writeCTable().
|
|
163
150
|
`huffWeight` is destination buffer.
|
|
151
|
+
`rankStats` is assumed to be a table of at least HUF_TABLELOG_MAX U32.
|
|
164
152
|
@return : size read from `src` , or an error Code .
|
|
165
|
-
Note : Needed by HUF_readCTable() and
|
|
153
|
+
Note : Needed by HUF_readCTable() and HUF_readDTableX?() .
|
|
166
154
|
*/
|
|
167
155
|
size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
168
156
|
U32* nbSymbolsPtr, U32* tableLogPtr,
|
|
@@ -170,47 +158,44 @@ size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
170
158
|
{
|
|
171
159
|
U32 weightTotal;
|
|
172
160
|
const BYTE* ip = (const BYTE*) src;
|
|
173
|
-
size_t iSize
|
|
161
|
+
size_t iSize;
|
|
174
162
|
size_t oSize;
|
|
175
163
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
{ U32 n;
|
|
192
|
-
for (n=0; n<oSize; n+=2) {
|
|
193
|
-
huffWeight[n] = ip[n/2] >> 4;
|
|
194
|
-
huffWeight[n+1] = ip[n/2] & 15;
|
|
195
|
-
} } } }
|
|
164
|
+
if (!srcSize) return ERROR(srcSize_wrong);
|
|
165
|
+
iSize = ip[0];
|
|
166
|
+
/* memset(huffWeight, 0, hwSize); *//* is not necessary, even though some analyzer complain ... */
|
|
167
|
+
|
|
168
|
+
if (iSize >= 128) { /* special header */
|
|
169
|
+
oSize = iSize - 127;
|
|
170
|
+
iSize = ((oSize+1)/2);
|
|
171
|
+
if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
|
|
172
|
+
if (oSize >= hwSize) return ERROR(corruption_detected);
|
|
173
|
+
ip += 1;
|
|
174
|
+
{ U32 n;
|
|
175
|
+
for (n=0; n<oSize; n+=2) {
|
|
176
|
+
huffWeight[n] = ip[n/2] >> 4;
|
|
177
|
+
huffWeight[n+1] = ip[n/2] & 15;
|
|
178
|
+
} } }
|
|
196
179
|
else { /* header compressed with FSE (normal case) */
|
|
180
|
+
FSE_DTable fseWorkspace[FSE_DTABLE_SIZE_U32(6)]; /* 6 is max possible tableLog for HUF header (maybe even 5, to be tested) */
|
|
197
181
|
if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
|
|
198
|
-
oSize =
|
|
182
|
+
oSize = FSE_decompress_wksp(huffWeight, hwSize-1, ip+1, iSize, fseWorkspace, 6); /* max (hwSize-1) values decoded, as last one is implied */
|
|
199
183
|
if (FSE_isError(oSize)) return oSize;
|
|
200
184
|
}
|
|
201
185
|
|
|
202
186
|
/* collect weight stats */
|
|
203
|
-
memset(rankStats, 0, (
|
|
187
|
+
memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32));
|
|
204
188
|
weightTotal = 0;
|
|
205
189
|
{ U32 n; for (n=0; n<oSize; n++) {
|
|
206
|
-
if (huffWeight[n] >=
|
|
190
|
+
if (huffWeight[n] >= HUF_TABLELOG_MAX) return ERROR(corruption_detected);
|
|
207
191
|
rankStats[huffWeight[n]]++;
|
|
208
192
|
weightTotal += (1 << huffWeight[n]) >> 1;
|
|
209
193
|
} }
|
|
194
|
+
if (weightTotal == 0) return ERROR(corruption_detected);
|
|
210
195
|
|
|
211
196
|
/* get last non-null symbol weight (implied, total must be 2^n) */
|
|
212
197
|
{ U32 const tableLog = BIT_highbit32(weightTotal) + 1;
|
|
213
|
-
if (tableLog >
|
|
198
|
+
if (tableLog > HUF_TABLELOG_MAX) return ERROR(corruption_detected);
|
|
214
199
|
*tableLogPtr = tableLog;
|
|
215
200
|
/* determine last weight */
|
|
216
201
|
{ U32 const total = 1 << tableLog;
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
*/
|
|
10
|
+
|
|
11
|
+
/* The purpose of this file is to have a single list of error strings embedded in binary */
|
|
12
|
+
|
|
13
|
+
#include "error_private.h"
|
|
14
|
+
|
|
15
|
+
const char* ERR_getErrorString(ERR_enum code)
|
|
16
|
+
{
|
|
17
|
+
#ifdef ZSTD_STRIP_ERROR_STRINGS
|
|
18
|
+
(void)code;
|
|
19
|
+
return "Error strings stripped";
|
|
20
|
+
#else
|
|
21
|
+
static const char* const notErrorCode = "Unspecified error code";
|
|
22
|
+
switch( code )
|
|
23
|
+
{
|
|
24
|
+
case PREFIX(no_error): return "No error detected";
|
|
25
|
+
case PREFIX(GENERIC): return "Error (generic)";
|
|
26
|
+
case PREFIX(prefix_unknown): return "Unknown frame descriptor";
|
|
27
|
+
case PREFIX(version_unsupported): return "Version not supported";
|
|
28
|
+
case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter";
|
|
29
|
+
case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding";
|
|
30
|
+
case PREFIX(corruption_detected): return "Corrupted block detected";
|
|
31
|
+
case PREFIX(checksum_wrong): return "Restored data doesn't match checksum";
|
|
32
|
+
case PREFIX(parameter_unsupported): return "Unsupported parameter";
|
|
33
|
+
case PREFIX(parameter_outOfBound): return "Parameter is out of bound";
|
|
34
|
+
case PREFIX(init_missing): return "Context should be init first";
|
|
35
|
+
case PREFIX(memory_allocation): return "Allocation error : not enough memory";
|
|
36
|
+
case PREFIX(workSpace_tooSmall): return "workSpace buffer is not large enough";
|
|
37
|
+
case PREFIX(stage_wrong): return "Operation not authorized at current processing stage";
|
|
38
|
+
case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported";
|
|
39
|
+
case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large";
|
|
40
|
+
case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";
|
|
41
|
+
case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";
|
|
42
|
+
case PREFIX(dictionary_wrong): return "Dictionary mismatch";
|
|
43
|
+
case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples";
|
|
44
|
+
case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
|
|
45
|
+
case PREFIX(srcSize_wrong): return "Src size is incorrect";
|
|
46
|
+
case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer";
|
|
47
|
+
/* following error codes are not stable and may be removed or changed in a future version */
|
|
48
|
+
case PREFIX(frameIndex_tooLarge): return "Frame index is too large";
|
|
49
|
+
case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking";
|
|
50
|
+
case PREFIX(dstBuffer_wrong): return "Destination buffer is wrong";
|
|
51
|
+
case PREFIX(maxCode):
|
|
52
|
+
default: return notErrorCode;
|
|
53
|
+
}
|
|
54
|
+
#endif
|
|
55
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
*/
|
|
10
|
+
|
|
11
|
+
/* Note : this module is expected to remain private, do not expose it */
|
|
12
|
+
|
|
13
|
+
#ifndef ERROR_H_MODULE
|
|
14
|
+
#define ERROR_H_MODULE
|
|
15
|
+
|
|
16
|
+
#if defined (__cplusplus)
|
|
17
|
+
extern "C" {
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
/* ****************************************
|
|
22
|
+
* Dependencies
|
|
23
|
+
******************************************/
|
|
24
|
+
#include <stddef.h> /* size_t */
|
|
25
|
+
#include "zstd_errors.h" /* enum list */
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
/* ****************************************
|
|
29
|
+
* Compiler-specific
|
|
30
|
+
******************************************/
|
|
31
|
+
#if defined(__GNUC__)
|
|
32
|
+
# define ERR_STATIC static __attribute__((unused))
|
|
33
|
+
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
|
34
|
+
# define ERR_STATIC static inline
|
|
35
|
+
#elif defined(_MSC_VER)
|
|
36
|
+
# define ERR_STATIC static __inline
|
|
37
|
+
#else
|
|
38
|
+
# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
/*-****************************************
|
|
43
|
+
* Customization (error_public.h)
|
|
44
|
+
******************************************/
|
|
45
|
+
typedef ZSTD_ErrorCode ERR_enum;
|
|
46
|
+
#define PREFIX(name) ZSTD_error_##name
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
/*-****************************************
|
|
50
|
+
* Error codes handling
|
|
51
|
+
******************************************/
|
|
52
|
+
#undef ERROR /* already defined on Visual Studio */
|
|
53
|
+
#define ERROR(name) ZSTD_ERROR(name)
|
|
54
|
+
#define ZSTD_ERROR(name) ((size_t)-PREFIX(name))
|
|
55
|
+
|
|
56
|
+
ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
|
57
|
+
|
|
58
|
+
ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); }
|
|
59
|
+
|
|
60
|
+
/* check and forward error code */
|
|
61
|
+
#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e
|
|
62
|
+
#define CHECK_F(f) { CHECK_V_F(_var_err__, f); }
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
/*-****************************************
|
|
66
|
+
* Error Strings
|
|
67
|
+
******************************************/
|
|
68
|
+
|
|
69
|
+
const char* ERR_getErrorString(ERR_enum code); /* error_private.c */
|
|
70
|
+
|
|
71
|
+
ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
72
|
+
{
|
|
73
|
+
return ERR_getErrorString(ERR_getErrorCode(code));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#if defined (__cplusplus)
|
|
77
|
+
}
|
|
78
|
+
#endif
|
|
79
|
+
|
|
80
|
+
#endif /* ERROR_H_MODULE */
|
|
@@ -1,43 +1,24 @@
|
|
|
1
1
|
/* ******************************************************************
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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.
|
|
30
|
-
|
|
31
|
-
You can contact the author at :
|
|
32
|
-
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
2
|
+
* FSE : Finite State Entropy codec
|
|
3
|
+
* Public Prototypes declaration
|
|
4
|
+
* Copyright (c) 2013-2020, Yann Collet, Facebook, Inc.
|
|
5
|
+
*
|
|
6
|
+
* You can contact the author at :
|
|
7
|
+
* - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under both the BSD-style license (found in the
|
|
10
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
11
|
+
* in the COPYING file in the root directory of this source tree).
|
|
12
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
33
13
|
****************************************************************** */
|
|
34
|
-
#ifndef FSE_H
|
|
35
|
-
#define FSE_H
|
|
36
14
|
|
|
37
15
|
#if defined (__cplusplus)
|
|
38
16
|
extern "C" {
|
|
39
17
|
#endif
|
|
40
18
|
|
|
19
|
+
#ifndef FSE_H
|
|
20
|
+
#define FSE_H
|
|
21
|
+
|
|
41
22
|
|
|
42
23
|
/*-*****************************************
|
|
43
24
|
* Dependencies
|
|
@@ -45,6 +26,33 @@ extern "C" {
|
|
|
45
26
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
|
46
27
|
|
|
47
28
|
|
|
29
|
+
/*-*****************************************
|
|
30
|
+
* FSE_PUBLIC_API : control library symbols visibility
|
|
31
|
+
******************************************/
|
|
32
|
+
#if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4)
|
|
33
|
+
# define FSE_PUBLIC_API __attribute__ ((visibility ("default")))
|
|
34
|
+
#elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) /* Visual expected */
|
|
35
|
+
# define FSE_PUBLIC_API __declspec(dllexport)
|
|
36
|
+
#elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1)
|
|
37
|
+
# define FSE_PUBLIC_API __declspec(dllimport) /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
|
|
38
|
+
#else
|
|
39
|
+
# define FSE_PUBLIC_API
|
|
40
|
+
#endif
|
|
41
|
+
|
|
42
|
+
/*------ Version ------*/
|
|
43
|
+
#define FSE_VERSION_MAJOR 0
|
|
44
|
+
#define FSE_VERSION_MINOR 9
|
|
45
|
+
#define FSE_VERSION_RELEASE 0
|
|
46
|
+
|
|
47
|
+
#define FSE_LIB_VERSION FSE_VERSION_MAJOR.FSE_VERSION_MINOR.FSE_VERSION_RELEASE
|
|
48
|
+
#define FSE_QUOTE(str) #str
|
|
49
|
+
#define FSE_EXPAND_AND_QUOTE(str) FSE_QUOTE(str)
|
|
50
|
+
#define FSE_VERSION_STRING FSE_EXPAND_AND_QUOTE(FSE_LIB_VERSION)
|
|
51
|
+
|
|
52
|
+
#define FSE_VERSION_NUMBER (FSE_VERSION_MAJOR *100*100 + FSE_VERSION_MINOR *100 + FSE_VERSION_RELEASE)
|
|
53
|
+
FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */
|
|
54
|
+
|
|
55
|
+
|
|
48
56
|
/*-****************************************
|
|
49
57
|
* FSE simple functions
|
|
50
58
|
******************************************/
|
|
@@ -56,8 +64,8 @@ extern "C" {
|
|
|
56
64
|
if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression instead.
|
|
57
65
|
if FSE_isError(return), compression failed (more details using FSE_getErrorName())
|
|
58
66
|
*/
|
|
59
|
-
size_t FSE_compress(void* dst, size_t dstCapacity,
|
|
60
|
-
|
|
67
|
+
FSE_PUBLIC_API size_t FSE_compress(void* dst, size_t dstCapacity,
|
|
68
|
+
const void* src, size_t srcSize);
|
|
61
69
|
|
|
62
70
|
/*! FSE_decompress():
|
|
63
71
|
Decompress FSE data from buffer 'cSrc', of size 'cSrcSize',
|
|
@@ -69,18 +77,18 @@ size_t FSE_compress(void* dst, size_t dstCapacity,
|
|
|
69
77
|
Why ? : making this distinction requires a header.
|
|
70
78
|
Header management is intentionally delegated to the user layer, which can better manage special cases.
|
|
71
79
|
*/
|
|
72
|
-
size_t FSE_decompress(void* dst, size_t dstCapacity,
|
|
73
|
-
|
|
80
|
+
FSE_PUBLIC_API size_t FSE_decompress(void* dst, size_t dstCapacity,
|
|
81
|
+
const void* cSrc, size_t cSrcSize);
|
|
74
82
|
|
|
75
83
|
|
|
76
84
|
/*-*****************************************
|
|
77
85
|
* Tool functions
|
|
78
86
|
******************************************/
|
|
79
|
-
size_t FSE_compressBound(size_t size); /* maximum compressed size */
|
|
87
|
+
FSE_PUBLIC_API size_t FSE_compressBound(size_t size); /* maximum compressed size */
|
|
80
88
|
|
|
81
89
|
/* Error Management */
|
|
82
|
-
unsigned FSE_isError(size_t code); /* tells if a return value is an error code */
|
|
83
|
-
const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */
|
|
90
|
+
FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return value is an error code */
|
|
91
|
+
FSE_PUBLIC_API const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */
|
|
84
92
|
|
|
85
93
|
|
|
86
94
|
/*-*****************************************
|
|
@@ -94,7 +102,7 @@ const char* FSE_getErrorName(size_t code); /* provides error code string (usef
|
|
|
94
102
|
if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression.
|
|
95
103
|
if FSE_isError(return), it's an error code.
|
|
96
104
|
*/
|
|
97
|
-
size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
|
105
|
+
FSE_PUBLIC_API size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
|
98
106
|
|
|
99
107
|
|
|
100
108
|
/*-*****************************************
|
|
@@ -102,7 +110,7 @@ size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize
|
|
|
102
110
|
******************************************/
|
|
103
111
|
/*!
|
|
104
112
|
FSE_compress() does the following:
|
|
105
|
-
1. count symbol occurrence from source[] into table count[]
|
|
113
|
+
1. count symbol occurrence from source[] into table count[] (see hist.h)
|
|
106
114
|
2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog)
|
|
107
115
|
3. save normalized counters to memory buffer using writeNCount()
|
|
108
116
|
4. build encoding table 'CTable' from normalized counters
|
|
@@ -120,57 +128,50 @@ or to save and provide normalized distribution using external method.
|
|
|
120
128
|
|
|
121
129
|
/* *** COMPRESSION *** */
|
|
122
130
|
|
|
123
|
-
/*! FSE_count():
|
|
124
|
-
Provides the precise count of each byte within a table 'count'.
|
|
125
|
-
'count' is a table of unsigned int, of minimum size (*maxSymbolValuePtr+1).
|
|
126
|
-
*maxSymbolValuePtr will be updated if detected smaller than initial value.
|
|
127
|
-
@return : the count of the most frequent symbol (which is not identified).
|
|
128
|
-
if return == srcSize, there is only one symbol.
|
|
129
|
-
Can also return an error code, which can be tested with FSE_isError(). */
|
|
130
|
-
size_t FSE_count(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
|
|
131
|
-
|
|
132
131
|
/*! FSE_optimalTableLog():
|
|
133
132
|
dynamically downsize 'tableLog' when conditions are met.
|
|
134
133
|
It saves CPU time, by using smaller tables, while preserving or even improving compression ratio.
|
|
135
134
|
@return : recommended tableLog (necessarily <= 'maxTableLog') */
|
|
136
|
-
unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
|
|
135
|
+
FSE_PUBLIC_API unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
|
|
137
136
|
|
|
138
137
|
/*! FSE_normalizeCount():
|
|
139
138
|
normalize counts so that sum(count[]) == Power_of_2 (2^tableLog)
|
|
140
139
|
'normalizedCounter' is a table of short, of minimum size (maxSymbolValue+1).
|
|
141
140
|
@return : tableLog,
|
|
142
141
|
or an errorCode, which can be tested using FSE_isError() */
|
|
143
|
-
size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog,
|
|
142
|
+
FSE_PUBLIC_API size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog,
|
|
143
|
+
const unsigned* count, size_t srcSize, unsigned maxSymbolValue);
|
|
144
144
|
|
|
145
145
|
/*! FSE_NCountWriteBound():
|
|
146
146
|
Provides the maximum possible size of an FSE normalized table, given 'maxSymbolValue' and 'tableLog'.
|
|
147
147
|
Typically useful for allocation purpose. */
|
|
148
|
-
size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog);
|
|
148
|
+
FSE_PUBLIC_API size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog);
|
|
149
149
|
|
|
150
150
|
/*! FSE_writeNCount():
|
|
151
151
|
Compactly save 'normalizedCounter' into 'buffer'.
|
|
152
152
|
@return : size of the compressed table,
|
|
153
153
|
or an errorCode, which can be tested using FSE_isError(). */
|
|
154
|
-
size_t FSE_writeNCount (void* buffer, size_t bufferSize,
|
|
155
|
-
|
|
154
|
+
FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize,
|
|
155
|
+
const short* normalizedCounter,
|
|
156
|
+
unsigned maxSymbolValue, unsigned tableLog);
|
|
156
157
|
|
|
157
158
|
/*! Constructor and Destructor of FSE_CTable.
|
|
158
159
|
Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */
|
|
159
160
|
typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */
|
|
160
|
-
FSE_CTable* FSE_createCTable (unsigned
|
|
161
|
-
void FSE_freeCTable (FSE_CTable* ct);
|
|
161
|
+
FSE_PUBLIC_API FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog);
|
|
162
|
+
FSE_PUBLIC_API void FSE_freeCTable (FSE_CTable* ct);
|
|
162
163
|
|
|
163
164
|
/*! FSE_buildCTable():
|
|
164
165
|
Builds `ct`, which must be already allocated, using FSE_createCTable().
|
|
165
166
|
@return : 0, or an errorCode, which can be tested using FSE_isError() */
|
|
166
|
-
size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
|
167
|
+
FSE_PUBLIC_API size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
|
167
168
|
|
|
168
169
|
/*! FSE_compress_usingCTable():
|
|
169
170
|
Compress `src` using `ct` into `dst` which must be already allocated.
|
|
170
171
|
@return : size of compressed data (<= `dstCapacity`),
|
|
171
172
|
or 0 if compressed data could not fit into `dst`,
|
|
172
173
|
or an errorCode, which can be tested using FSE_isError() */
|
|
173
|
-
size_t FSE_compress_usingCTable (void* dst, size_t dstCapacity, const void* src, size_t srcSize, const FSE_CTable* ct);
|
|
174
|
+
FSE_PUBLIC_API size_t FSE_compress_usingCTable (void* dst, size_t dstCapacity, const void* src, size_t srcSize, const FSE_CTable* ct);
|
|
174
175
|
|
|
175
176
|
/*!
|
|
176
177
|
Tutorial :
|
|
@@ -223,25 +224,27 @@ If there is an error, the function will return an ErrorCode (which can be tested
|
|
|
223
224
|
@return : size read from 'rBuffer',
|
|
224
225
|
or an errorCode, which can be tested using FSE_isError().
|
|
225
226
|
maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */
|
|
226
|
-
size_t FSE_readNCount (short* normalizedCounter,
|
|
227
|
+
FSE_PUBLIC_API size_t FSE_readNCount (short* normalizedCounter,
|
|
228
|
+
unsigned* maxSymbolValuePtr, unsigned* tableLogPtr,
|
|
229
|
+
const void* rBuffer, size_t rBuffSize);
|
|
227
230
|
|
|
228
231
|
/*! Constructor and Destructor of FSE_DTable.
|
|
229
232
|
Note that its size depends on 'tableLog' */
|
|
230
233
|
typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
|
|
231
|
-
FSE_DTable* FSE_createDTable(unsigned tableLog);
|
|
232
|
-
void FSE_freeDTable(FSE_DTable* dt);
|
|
234
|
+
FSE_PUBLIC_API FSE_DTable* FSE_createDTable(unsigned tableLog);
|
|
235
|
+
FSE_PUBLIC_API void FSE_freeDTable(FSE_DTable* dt);
|
|
233
236
|
|
|
234
237
|
/*! FSE_buildDTable():
|
|
235
238
|
Builds 'dt', which must be already allocated, using FSE_createDTable().
|
|
236
239
|
return : 0, or an errorCode, which can be tested using FSE_isError() */
|
|
237
|
-
size_t FSE_buildDTable (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
|
240
|
+
FSE_PUBLIC_API size_t FSE_buildDTable (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
|
238
241
|
|
|
239
242
|
/*! FSE_decompress_usingDTable():
|
|
240
243
|
Decompress compressed source `cSrc` of size `cSrcSize` using `dt`
|
|
241
244
|
into `dst` which must be already allocated.
|
|
242
245
|
@return : size of regenerated data (necessarily <= `dstCapacity`),
|
|
243
246
|
or an errorCode, which can be tested using FSE_isError() */
|
|
244
|
-
size_t FSE_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt);
|
|
247
|
+
FSE_PUBLIC_API size_t FSE_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt);
|
|
245
248
|
|
|
246
249
|
/*!
|
|
247
250
|
Tutorial :
|
|
@@ -271,8 +274,10 @@ FSE_decompress_usingDTable() result will tell how many bytes were regenerated (<
|
|
|
271
274
|
If there is an error, the function will return an error code, which can be tested using FSE_isError(). (ex: dst buffer too small)
|
|
272
275
|
*/
|
|
273
276
|
|
|
277
|
+
#endif /* FSE_H */
|
|
274
278
|
|
|
275
|
-
#
|
|
279
|
+
#if defined(FSE_STATIC_LINKING_ONLY) && !defined(FSE_H_FSE_STATIC_LINKING_ONLY)
|
|
280
|
+
#define FSE_H_FSE_STATIC_LINKING_ONLY
|
|
276
281
|
|
|
277
282
|
/* *** Dependency *** */
|
|
278
283
|
#include "bitstream.h"
|
|
@@ -283,48 +288,67 @@ If there is an error, the function will return an error code, which can be teste
|
|
|
283
288
|
*******************************************/
|
|
284
289
|
/* FSE buffer bounds */
|
|
285
290
|
#define FSE_NCOUNTBOUND 512
|
|
286
|
-
#define FSE_BLOCKBOUND(size) (size + (size>>7))
|
|
291
|
+
#define FSE_BLOCKBOUND(size) (size + (size>>7) + 4 /* fse states */ + sizeof(size_t) /* bitContainer */)
|
|
287
292
|
#define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
|
|
288
293
|
|
|
289
|
-
/* It is possible to statically allocate FSE CTable/DTable as a table of
|
|
294
|
+
/* It is possible to statically allocate FSE CTable/DTable as a table of FSE_CTable/FSE_DTable using below macros */
|
|
290
295
|
#define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))
|
|
291
296
|
#define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<maxTableLog))
|
|
292
297
|
|
|
298
|
+
/* or use the size to malloc() space directly. Pay attention to alignment restrictions though */
|
|
299
|
+
#define FSE_CTABLE_SIZE(maxTableLog, maxSymbolValue) (FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(FSE_CTable))
|
|
300
|
+
#define FSE_DTABLE_SIZE(maxTableLog) (FSE_DTABLE_SIZE_U32(maxTableLog) * sizeof(FSE_DTable))
|
|
301
|
+
|
|
293
302
|
|
|
294
303
|
/* *****************************************
|
|
295
|
-
* FSE advanced API
|
|
296
|
-
|
|
297
|
-
size_t FSE_countFast(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
|
|
298
|
-
/**< same as FSE_count(), but blindly trusts that all byte values within src are <= *maxSymbolValuePtr */
|
|
304
|
+
* FSE advanced API
|
|
305
|
+
***************************************** */
|
|
299
306
|
|
|
300
307
|
unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus);
|
|
301
308
|
/**< same as FSE_optimalTableLog(), which used `minus==2` */
|
|
302
309
|
|
|
310
|
+
/* FSE_compress_wksp() :
|
|
311
|
+
* Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).
|
|
312
|
+
* FSE_WKSP_SIZE_U32() provides the minimum size required for `workSpace` as a table of FSE_CTable.
|
|
313
|
+
*/
|
|
314
|
+
#define FSE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + ((maxTableLog > 12) ? (1 << (maxTableLog - 2)) : 1024) )
|
|
315
|
+
size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
|
316
|
+
|
|
303
317
|
size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits);
|
|
304
|
-
/**< build a fake FSE_CTable, designed
|
|
318
|
+
/**< build a fake FSE_CTable, designed for a flat distribution, where each symbol uses nbBits */
|
|
305
319
|
|
|
306
320
|
size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue);
|
|
307
321
|
/**< build a fake FSE_CTable, designed to compress always the same symbolValue */
|
|
308
322
|
|
|
323
|
+
/* FSE_buildCTable_wksp() :
|
|
324
|
+
* Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
|
|
325
|
+
* `wkspSize` must be >= `(1<<tableLog)`.
|
|
326
|
+
*/
|
|
327
|
+
size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
|
328
|
+
|
|
309
329
|
size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits);
|
|
310
|
-
/**< build a fake FSE_DTable, designed to read
|
|
330
|
+
/**< build a fake FSE_DTable, designed to read a flat distribution where each symbol uses nbBits */
|
|
311
331
|
|
|
312
332
|
size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue);
|
|
313
333
|
/**< build a fake FSE_DTable, designed to always generate the same symbolValue */
|
|
314
334
|
|
|
335
|
+
size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, FSE_DTable* workSpace, unsigned maxLog);
|
|
336
|
+
/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DTABLE_SIZE_U32(maxLog)` */
|
|
337
|
+
|
|
338
|
+
typedef enum {
|
|
339
|
+
FSE_repeat_none, /**< Cannot use the previous table */
|
|
340
|
+
FSE_repeat_check, /**< Can use the previous table but it must be checked */
|
|
341
|
+
FSE_repeat_valid /**< Can use the previous table and it is assumed to be valid */
|
|
342
|
+
} FSE_repeat;
|
|
315
343
|
|
|
316
344
|
/* *****************************************
|
|
317
345
|
* FSE symbol compression API
|
|
318
346
|
*******************************************/
|
|
319
347
|
/*!
|
|
320
348
|
This API consists of small unitary functions, which highly benefit from being inlined.
|
|
321
|
-
|
|
322
|
-
Visual seems to do it automatically.
|
|
323
|
-
For gcc or clang, you'll need to add -flto flag at compilation and linking stages.
|
|
324
|
-
If none of these solutions is applicable, include "fse.c" directly.
|
|
349
|
+
Hence their body are included in next section.
|
|
325
350
|
*/
|
|
326
|
-
typedef struct
|
|
327
|
-
{
|
|
351
|
+
typedef struct {
|
|
328
352
|
ptrdiff_t value;
|
|
329
353
|
const void* stateTable;
|
|
330
354
|
const void* symbolTT;
|
|
@@ -384,8 +408,7 @@ If there is an error, it returns an errorCode (which can be tested using FSE_isE
|
|
|
384
408
|
/* *****************************************
|
|
385
409
|
* FSE symbol decompression API
|
|
386
410
|
*******************************************/
|
|
387
|
-
typedef struct
|
|
388
|
-
{
|
|
411
|
+
typedef struct {
|
|
389
412
|
size_t state;
|
|
390
413
|
const void* table; /* precise table may vary, depending on U16 */
|
|
391
414
|
} FSE_DState_t;
|
|
@@ -469,7 +492,7 @@ MEM_STATIC void FSE_initCState(FSE_CState_t* statePtr, const FSE_CTable* ct)
|
|
|
469
492
|
const U32 tableLog = MEM_read16(ptr);
|
|
470
493
|
statePtr->value = (ptrdiff_t)1<<tableLog;
|
|
471
494
|
statePtr->stateTable = u16ptr+2;
|
|
472
|
-
statePtr->symbolTT =
|
|
495
|
+
statePtr->symbolTT = ct + 1 + (tableLog ? (1<<(tableLog-1)) : 1);
|
|
473
496
|
statePtr->stateLog = tableLog;
|
|
474
497
|
}
|
|
475
498
|
|
|
@@ -488,11 +511,11 @@ MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U3
|
|
|
488
511
|
}
|
|
489
512
|
}
|
|
490
513
|
|
|
491
|
-
MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr,
|
|
514
|
+
MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, unsigned symbol)
|
|
492
515
|
{
|
|
493
|
-
const
|
|
516
|
+
FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
|
|
494
517
|
const U16* const stateTable = (const U16*)(statePtr->stateTable);
|
|
495
|
-
U32 nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
|
|
518
|
+
U32 const nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
|
|
496
519
|
BIT_addBits(bitC, statePtr->value, nbBitsOut);
|
|
497
520
|
statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
|
|
498
521
|
}
|
|
@@ -503,7 +526,41 @@ MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePt
|
|
|
503
526
|
BIT_flushBits(bitC);
|
|
504
527
|
}
|
|
505
528
|
|
|
506
|
-
|
|
529
|
+
|
|
530
|
+
/* FSE_getMaxNbBits() :
|
|
531
|
+
* Approximate maximum cost of a symbol, in bits.
|
|
532
|
+
* Fractional get rounded up (i.e : a symbol with a normalized frequency of 3 gives the same result as a frequency of 2)
|
|
533
|
+
* note 1 : assume symbolValue is valid (<= maxSymbolValue)
|
|
534
|
+
* note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
|
|
535
|
+
MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue)
|
|
536
|
+
{
|
|
537
|
+
const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
|
|
538
|
+
return (symbolTT[symbolValue].deltaNbBits + ((1<<16)-1)) >> 16;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/* FSE_bitCost() :
|
|
542
|
+
* Approximate symbol cost, as fractional value, using fixed-point format (accuracyLog fractional bits)
|
|
543
|
+
* note 1 : assume symbolValue is valid (<= maxSymbolValue)
|
|
544
|
+
* note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
|
|
545
|
+
MEM_STATIC U32 FSE_bitCost(const void* symbolTTPtr, U32 tableLog, U32 symbolValue, U32 accuracyLog)
|
|
546
|
+
{
|
|
547
|
+
const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
|
|
548
|
+
U32 const minNbBits = symbolTT[symbolValue].deltaNbBits >> 16;
|
|
549
|
+
U32 const threshold = (minNbBits+1) << 16;
|
|
550
|
+
assert(tableLog < 16);
|
|
551
|
+
assert(accuracyLog < 31-tableLog); /* ensure enough room for renormalization double shift */
|
|
552
|
+
{ U32 const tableSize = 1 << tableLog;
|
|
553
|
+
U32 const deltaFromThreshold = threshold - (symbolTT[symbolValue].deltaNbBits + tableSize);
|
|
554
|
+
U32 const normalizedDeltaFromThreshold = (deltaFromThreshold << accuracyLog) >> tableLog; /* linear interpolation (very approximate) */
|
|
555
|
+
U32 const bitMultiplier = 1 << accuracyLog;
|
|
556
|
+
assert(symbolTT[symbolValue].deltaNbBits + tableSize <= threshold);
|
|
557
|
+
assert(normalizedDeltaFromThreshold <= bitMultiplier);
|
|
558
|
+
return (minNbBits+1)*bitMultiplier - normalizedDeltaFromThreshold;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
/* ====== Decompression ====== */
|
|
507
564
|
|
|
508
565
|
typedef struct {
|
|
509
566
|
U16 tableLog;
|
|
@@ -581,14 +638,19 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
|
581
638
|
* Increasing memory usage improves compression ratio
|
|
582
639
|
* Reduced memory usage can improve speed, due to cache effect
|
|
583
640
|
* Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
|
|
584
|
-
#
|
|
585
|
-
#define
|
|
641
|
+
#ifndef FSE_MAX_MEMORY_USAGE
|
|
642
|
+
# define FSE_MAX_MEMORY_USAGE 14
|
|
643
|
+
#endif
|
|
644
|
+
#ifndef FSE_DEFAULT_MEMORY_USAGE
|
|
645
|
+
# define FSE_DEFAULT_MEMORY_USAGE 13
|
|
646
|
+
#endif
|
|
586
647
|
|
|
587
648
|
/*!FSE_MAX_SYMBOL_VALUE :
|
|
588
649
|
* Maximum symbol value authorized.
|
|
589
650
|
* Required for proper stack allocation */
|
|
590
|
-
#
|
|
591
|
-
|
|
651
|
+
#ifndef FSE_MAX_SYMBOL_VALUE
|
|
652
|
+
# define FSE_MAX_SYMBOL_VALUE 255
|
|
653
|
+
#endif
|
|
592
654
|
|
|
593
655
|
/* **************************************************************
|
|
594
656
|
* template functions type & suffix
|
|
@@ -624,5 +686,3 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
|
624
686
|
#if defined (__cplusplus)
|
|
625
687
|
}
|
|
626
688
|
#endif
|
|
627
|
-
|
|
628
|
-
#endif /* FSE_H */
|