extzstd 0.1.1 → 0.2
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 +18 -0
- data/README.md +15 -50
- data/contrib/zstd/CONTRIBUTING.md +1 -1
- data/contrib/zstd/COPYING +339 -0
- data/contrib/zstd/Makefile +82 -51
- data/contrib/zstd/NEWS +92 -5
- data/contrib/zstd/README.md +50 -41
- data/contrib/zstd/appveyor.yml +164 -102
- data/contrib/zstd/circle.yml +10 -22
- data/contrib/zstd/lib/BUCK +31 -10
- data/contrib/zstd/lib/Makefile +57 -31
- data/contrib/zstd/lib/README.md +68 -37
- data/contrib/zstd/lib/common/bitstream.h +130 -76
- data/contrib/zstd/lib/common/compiler.h +86 -0
- data/contrib/zstd/lib/common/error_private.c +15 -11
- data/contrib/zstd/lib/common/error_private.h +8 -8
- data/contrib/zstd/lib/common/fse.h +19 -9
- data/contrib/zstd/lib/common/fse_decompress.c +3 -22
- data/contrib/zstd/lib/common/huf.h +68 -26
- data/contrib/zstd/lib/common/mem.h +23 -35
- data/contrib/zstd/lib/common/pool.c +123 -63
- data/contrib/zstd/lib/common/pool.h +19 -10
- data/contrib/zstd/lib/common/threading.c +11 -16
- data/contrib/zstd/lib/common/threading.h +52 -33
- data/contrib/zstd/lib/common/xxhash.c +28 -22
- data/contrib/zstd/lib/common/zstd_common.c +40 -27
- data/contrib/zstd/lib/common/zstd_errors.h +43 -34
- data/contrib/zstd/lib/common/zstd_internal.h +131 -123
- data/contrib/zstd/lib/compress/fse_compress.c +17 -33
- data/contrib/zstd/lib/compress/huf_compress.c +15 -9
- data/contrib/zstd/lib/compress/zstd_compress.c +2096 -2363
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +462 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.c +309 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.h +29 -0
- data/contrib/zstd/lib/compress/zstd_fast.c +243 -0
- data/contrib/zstd/lib/compress/zstd_fast.h +31 -0
- data/contrib/zstd/lib/compress/zstd_lazy.c +765 -0
- data/contrib/zstd/lib/compress/zstd_lazy.h +39 -0
- data/contrib/zstd/lib/compress/zstd_ldm.c +707 -0
- data/contrib/zstd/lib/compress/zstd_ldm.h +68 -0
- data/contrib/zstd/lib/compress/zstd_opt.c +785 -0
- data/contrib/zstd/lib/compress/zstd_opt.h +19 -908
- data/contrib/zstd/lib/compress/zstdmt_compress.c +737 -327
- data/contrib/zstd/lib/compress/zstdmt_compress.h +88 -26
- data/contrib/zstd/lib/decompress/huf_decompress.c +158 -50
- data/contrib/zstd/lib/decompress/zstd_decompress.c +884 -699
- data/contrib/zstd/lib/deprecated/zbuff.h +5 -4
- data/contrib/zstd/lib/deprecated/zbuff_common.c +5 -5
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +6 -4
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +5 -4
- data/contrib/zstd/lib/dictBuilder/cover.c +93 -77
- data/contrib/zstd/lib/dictBuilder/zdict.c +107 -92
- data/contrib/zstd/lib/dictBuilder/zdict.h +112 -102
- data/contrib/zstd/lib/legacy/zstd_legacy.h +9 -4
- data/contrib/zstd/lib/legacy/zstd_v01.c +7 -6
- data/contrib/zstd/lib/legacy/zstd_v01.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v02.c +27 -99
- data/contrib/zstd/lib/legacy/zstd_v02.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v03.c +26 -98
- data/contrib/zstd/lib/legacy/zstd_v03.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v04.c +22 -91
- data/contrib/zstd/lib/legacy/zstd_v04.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v05.c +23 -99
- data/contrib/zstd/lib/legacy/zstd_v05.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v06.c +22 -96
- data/contrib/zstd/lib/legacy/zstd_v06.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v07.c +19 -95
- data/contrib/zstd/lib/legacy/zstd_v07.h +5 -4
- data/contrib/zstd/lib/zstd.h +895 -271
- data/ext/extconf.rb +11 -2
- data/ext/extzstd.c +45 -128
- data/ext/extzstd.h +74 -31
- data/ext/extzstd_stream.c +401 -142
- data/ext/zstd_common.c +5 -0
- data/ext/zstd_compress.c +8 -0
- data/ext/zstd_decompress.c +1 -0
- data/ext/zstd_dictbuilder.c +2 -0
- data/lib/extzstd/version.rb +1 -1
- data/lib/extzstd.rb +48 -1
- data/test/test_basic.rb +9 -1
- metadata +17 -7
- data/HISTORY.ja +0 -10
- data/contrib/zstd/LICENSE-examples +0 -11
- data/contrib/zstd/PATENTS +0 -33
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
#ifndef DICTBUILDER_H_001
|
|
@@ -20,10 +21,12 @@ extern "C" {
|
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
/* ===== ZDICTLIB_API : control library symbols visibility ===== */
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
24
|
+
#ifndef ZDICTLIB_VISIBILITY
|
|
25
|
+
# if defined(__GNUC__) && (__GNUC__ >= 4)
|
|
26
|
+
# define ZDICTLIB_VISIBILITY __attribute__ ((visibility ("default")))
|
|
27
|
+
# else
|
|
28
|
+
# define ZDICTLIB_VISIBILITY
|
|
29
|
+
# endif
|
|
27
30
|
#endif
|
|
28
31
|
#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1)
|
|
29
32
|
# define ZDICTLIB_API __declspec(dllexport) ZDICTLIB_VISIBILITY
|
|
@@ -34,18 +37,20 @@ extern "C" {
|
|
|
34
37
|
#endif
|
|
35
38
|
|
|
36
39
|
|
|
37
|
-
/*! ZDICT_trainFromBuffer()
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
/*! ZDICT_trainFromBuffer():
|
|
41
|
+
* Train a dictionary from an array of samples.
|
|
42
|
+
* Uses ZDICT_optimizeTrainFromBuffer_cover() single-threaded, with d=8 and steps=4.
|
|
43
|
+
* Samples must be stored concatenated in a single flat buffer `samplesBuffer`,
|
|
44
|
+
* supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.
|
|
45
|
+
* The resulting dictionary will be saved into `dictBuffer`.
|
|
46
|
+
* @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)
|
|
47
|
+
* or an error code, which can be tested with ZDICT_isError().
|
|
48
|
+
* Note: ZDICT_trainFromBuffer() requires about 9 bytes of memory for each input byte.
|
|
49
|
+
* Tips: In general, a reasonable dictionary has a size of ~ 100 KB.
|
|
50
|
+
* It's obviously possible to target smaller or larger ones, just by specifying different `dictBufferCapacity`.
|
|
51
|
+
* In general, it's recommended to provide a few thousands samples, but this can vary a lot.
|
|
52
|
+
* It's recommended that total size of all samples be about ~x100 times the target size of dictionary.
|
|
53
|
+
*/
|
|
49
54
|
ZDICTLIB_API size_t ZDICT_trainFromBuffer(void* dictBuffer, size_t dictBufferCapacity,
|
|
50
55
|
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples);
|
|
51
56
|
|
|
@@ -67,102 +72,107 @@ ZDICTLIB_API const char* ZDICT_getErrorName(size_t errorCode);
|
|
|
67
72
|
* ==================================================================================== */
|
|
68
73
|
|
|
69
74
|
typedef struct {
|
|
70
|
-
unsigned selectivityLevel; /* 0 means default; larger => select more => larger dictionary */
|
|
71
75
|
int compressionLevel; /* 0 means default; target a specific zstd compression level */
|
|
72
76
|
unsigned notificationLevel; /* Write to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug; */
|
|
73
77
|
unsigned dictID; /* 0 means auto mode (32-bits random value); other : force dictID value */
|
|
74
|
-
unsigned reserved[2]; /* reserved space for future parameters */
|
|
75
78
|
} ZDICT_params_t;
|
|
76
79
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
@return : size of dictionary stored into `dictBuffer` (<= `dictBufferSize`),
|
|
82
|
-
or an error code, which can be tested by ZDICT_isError().
|
|
83
|
-
note : ZDICT_trainFromBuffer_advanced() will send notifications into stderr if instructed to, using notificationLevel>0.
|
|
84
|
-
*/
|
|
85
|
-
ZDICTLIB_API size_t ZDICT_trainFromBuffer_advanced(void* dictBuffer, size_t dictBufferCapacity,
|
|
86
|
-
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
|
|
87
|
-
ZDICT_params_t parameters);
|
|
88
|
-
|
|
89
|
-
/*! COVER_params_t :
|
|
90
|
-
For all values 0 means default.
|
|
91
|
-
kMin and d are the only required parameters.
|
|
92
|
-
*/
|
|
80
|
+
/*! ZDICT_cover_params_t:
|
|
81
|
+
* For all values 0 means default.
|
|
82
|
+
* k and d are the only required parameters.
|
|
83
|
+
*/
|
|
93
84
|
typedef struct {
|
|
94
85
|
unsigned k; /* Segment size : constraint: 0 < k : Reasonable range [16, 2048+] */
|
|
95
86
|
unsigned d; /* dmer size : constraint: 0 < d <= k : Reasonable range [6, 16] */
|
|
96
87
|
unsigned steps; /* Number of steps : Only used for optimization : 0 means default (32) : Higher means more parameters checked */
|
|
97
|
-
|
|
98
88
|
unsigned nbThreads; /* Number of threads : constraint: 0 < nbThreads : 1 means single-threaded : Only used for optimization : Ignored if ZSTD_MULTITHREAD is not defined */
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
/*! ZDICT_finalizeDictionary()
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
#define
|
|
159
|
-
#define ZDICT_DICTSIZE_MIN 512
|
|
89
|
+
ZDICT_params_t zParams;
|
|
90
|
+
} ZDICT_cover_params_t;
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
/*! ZDICT_trainFromBuffer_cover():
|
|
94
|
+
* Train a dictionary from an array of samples using the COVER algorithm.
|
|
95
|
+
* Samples must be stored concatenated in a single flat buffer `samplesBuffer`,
|
|
96
|
+
* supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.
|
|
97
|
+
* The resulting dictionary will be saved into `dictBuffer`.
|
|
98
|
+
* @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)
|
|
99
|
+
* or an error code, which can be tested with ZDICT_isError().
|
|
100
|
+
* Note: ZDICT_trainFromBuffer_cover() requires about 9 bytes of memory for each input byte.
|
|
101
|
+
* Tips: In general, a reasonable dictionary has a size of ~ 100 KB.
|
|
102
|
+
* It's obviously possible to target smaller or larger ones, just by specifying different `dictBufferCapacity`.
|
|
103
|
+
* In general, it's recommended to provide a few thousands samples, but this can vary a lot.
|
|
104
|
+
* It's recommended that total size of all samples be about ~x100 times the target size of dictionary.
|
|
105
|
+
*/
|
|
106
|
+
ZDICTLIB_API size_t ZDICT_trainFromBuffer_cover(
|
|
107
|
+
void *dictBuffer, size_t dictBufferCapacity, const void *samplesBuffer,
|
|
108
|
+
const size_t *samplesSizes, unsigned nbSamples,
|
|
109
|
+
ZDICT_cover_params_t parameters);
|
|
110
|
+
|
|
111
|
+
/*! ZDICT_optimizeTrainFromBuffer_cover():
|
|
112
|
+
* The same requirements as above hold for all the parameters except `parameters`.
|
|
113
|
+
* This function tries many parameter combinations and picks the best parameters.
|
|
114
|
+
* `*parameters` is filled with the best parameters found, and the dictionary
|
|
115
|
+
* constructed with those parameters is stored in `dictBuffer`.
|
|
116
|
+
*
|
|
117
|
+
* All of the parameters d, k, steps are optional.
|
|
118
|
+
* If d is non-zero then we don't check multiple values of d, otherwise we check d = {6, 8, 10, 12, 14, 16}.
|
|
119
|
+
* if steps is zero it defaults to its default value.
|
|
120
|
+
* If k is non-zero then we don't check multiple values of k, otherwise we check steps values in [16, 2048].
|
|
121
|
+
*
|
|
122
|
+
* @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)
|
|
123
|
+
* or an error code, which can be tested with ZDICT_isError().
|
|
124
|
+
* On success `*parameters` contains the parameters selected.
|
|
125
|
+
* Note: ZDICT_optimizeTrainFromBuffer_cover() requires about 8 bytes of memory for each input byte and additionally another 5 bytes of memory for each byte of memory for each thread.
|
|
126
|
+
*/
|
|
127
|
+
ZDICTLIB_API size_t ZDICT_optimizeTrainFromBuffer_cover(
|
|
128
|
+
void *dictBuffer, size_t dictBufferCapacity, const void *samplesBuffer,
|
|
129
|
+
const size_t *samplesSizes, unsigned nbSamples,
|
|
130
|
+
ZDICT_cover_params_t *parameters);
|
|
131
|
+
|
|
132
|
+
/*! ZDICT_finalizeDictionary():
|
|
133
|
+
* Given a custom content as a basis for dictionary, and a set of samples,
|
|
134
|
+
* finalize dictionary by adding headers and statistics.
|
|
135
|
+
*
|
|
136
|
+
* Samples must be stored concatenated in a flat buffer `samplesBuffer`,
|
|
137
|
+
* supplied with an array of sizes `samplesSizes`, providing the size of each sample in order.
|
|
138
|
+
*
|
|
139
|
+
* dictContentSize must be >= ZDICT_CONTENTSIZE_MIN bytes.
|
|
140
|
+
* maxDictSize must be >= dictContentSize, and must be >= ZDICT_DICTSIZE_MIN bytes.
|
|
141
|
+
*
|
|
142
|
+
* @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`),
|
|
143
|
+
* or an error code, which can be tested by ZDICT_isError().
|
|
144
|
+
* Note: ZDICT_finalizeDictionary() will push notifications into stderr if instructed to, using notificationLevel>0.
|
|
145
|
+
* Note 2: dictBuffer and dictContent can overlap
|
|
146
|
+
*/
|
|
147
|
+
#define ZDICT_CONTENTSIZE_MIN 128
|
|
148
|
+
#define ZDICT_DICTSIZE_MIN 256
|
|
160
149
|
ZDICTLIB_API size_t ZDICT_finalizeDictionary(void* dictBuffer, size_t dictBufferCapacity,
|
|
161
|
-
const void*
|
|
150
|
+
const void* dictContent, size_t dictContentSize,
|
|
162
151
|
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
|
|
163
152
|
ZDICT_params_t parameters);
|
|
164
153
|
|
|
165
|
-
|
|
154
|
+
typedef struct {
|
|
155
|
+
unsigned selectivityLevel; /* 0 means default; larger => select more => larger dictionary */
|
|
156
|
+
ZDICT_params_t zParams;
|
|
157
|
+
} ZDICT_legacy_params_t;
|
|
158
|
+
|
|
159
|
+
/*! ZDICT_trainFromBuffer_legacy():
|
|
160
|
+
* Train a dictionary from an array of samples.
|
|
161
|
+
* Samples must be stored concatenated in a single flat buffer `samplesBuffer`,
|
|
162
|
+
* supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.
|
|
163
|
+
* The resulting dictionary will be saved into `dictBuffer`.
|
|
164
|
+
* `parameters` is optional and can be provided with values set to 0 to mean "default".
|
|
165
|
+
* @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)
|
|
166
|
+
* or an error code, which can be tested with ZDICT_isError().
|
|
167
|
+
* Tips: In general, a reasonable dictionary has a size of ~ 100 KB.
|
|
168
|
+
* It's obviously possible to target smaller or larger ones, just by specifying different `dictBufferCapacity`.
|
|
169
|
+
* In general, it's recommended to provide a few thousands samples, but this can vary a lot.
|
|
170
|
+
* It's recommended that total size of all samples be about ~x100 times the target size of dictionary.
|
|
171
|
+
* Note: ZDICT_trainFromBuffer_legacy() will send notifications into stderr if instructed to, using notificationLevel>0.
|
|
172
|
+
*/
|
|
173
|
+
ZDICTLIB_API size_t ZDICT_trainFromBuffer_legacy(
|
|
174
|
+
void *dictBuffer, size_t dictBufferCapacity, const void *samplesBuffer,
|
|
175
|
+
const size_t *samplesSizes, unsigned nbSamples, ZDICT_legacy_params_t parameters);
|
|
166
176
|
|
|
167
177
|
/* Deprecation warnings */
|
|
168
178
|
/* It is generally possible to disable deprecation warnings from compiler,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
#ifndef ZSTD_LEGACY_H
|
|
@@ -123,6 +124,7 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
|
|
|
123
124
|
const void* dict,size_t dictSize)
|
|
124
125
|
{
|
|
125
126
|
U32 const version = ZSTD_isLegacy(src, compressedSize);
|
|
127
|
+
(void)dst; (void)dstCapacity; (void)dict; (void)dictSize; /* unused when ZSTD_LEGACY_SUPPORT >= 8 */
|
|
126
128
|
switch(version)
|
|
127
129
|
{
|
|
128
130
|
#if (ZSTD_LEGACY_SUPPORT <= 1)
|
|
@@ -223,6 +225,7 @@ MEM_STATIC size_t ZSTD_freeLegacyStreamContext(void* legacyContext, U32 version)
|
|
|
223
225
|
case 1 :
|
|
224
226
|
case 2 :
|
|
225
227
|
case 3 :
|
|
228
|
+
(void)legacyContext;
|
|
226
229
|
return ERROR(version_unsupported);
|
|
227
230
|
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
228
231
|
case 4 : return ZBUFFv04_freeDCtx((ZBUFFv04_DCtx*)legacyContext);
|
|
@@ -250,6 +253,7 @@ MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U
|
|
|
250
253
|
case 1 :
|
|
251
254
|
case 2 :
|
|
252
255
|
case 3 :
|
|
256
|
+
(void)dict; (void)dictSize;
|
|
253
257
|
return 0;
|
|
254
258
|
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
255
259
|
case 4 :
|
|
@@ -306,6 +310,7 @@ MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version,
|
|
|
306
310
|
case 1 :
|
|
307
311
|
case 2 :
|
|
308
312
|
case 3 :
|
|
313
|
+
(void)legacyContext; (void)output; (void)input;
|
|
309
314
|
return ERROR(version_unsupported);
|
|
310
315
|
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
311
316
|
case 4 :
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
|
|
@@ -338,7 +339,7 @@ typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
|
|
|
338
339
|
/****************************************************************
|
|
339
340
|
* Internal functions
|
|
340
341
|
****************************************************************/
|
|
341
|
-
FORCE_INLINE unsigned FSE_highbit32 (
|
|
342
|
+
FORCE_INLINE unsigned FSE_highbit32 (U32 val)
|
|
342
343
|
{
|
|
343
344
|
# if defined(_MSC_VER) /* Visual */
|
|
344
345
|
unsigned long r;
|
|
@@ -1432,7 +1433,7 @@ typedef struct ZSTD_Cctx_s
|
|
|
1432
1433
|
#else
|
|
1433
1434
|
U32 hashTable[HASH_TABLESIZE];
|
|
1434
1435
|
#endif
|
|
1435
|
-
|
|
1436
|
+
BYTE buffer[WORKPLACESIZE];
|
|
1436
1437
|
} cctxi_t;
|
|
1437
1438
|
|
|
1438
1439
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
#ifndef ZSTD_V01_H_28739879432
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
|
|
@@ -329,18 +330,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
|
329
330
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
|
330
331
|
|
|
331
332
|
|
|
332
|
-
/*
|
|
333
|
-
* Start by invoking BIT_initDStream().
|
|
334
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
335
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
336
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
337
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
|
338
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
|
339
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
340
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
|
341
|
-
*/
|
|
342
|
-
|
|
343
|
-
|
|
344
333
|
/******************************************
|
|
345
334
|
* unsafe API
|
|
346
335
|
******************************************/
|
|
@@ -352,7 +341,7 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
|
352
341
|
/****************************************************************
|
|
353
342
|
* Helper functions
|
|
354
343
|
****************************************************************/
|
|
355
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
|
344
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
356
345
|
{
|
|
357
346
|
# if defined(_MSC_VER) /* Visual */
|
|
358
347
|
unsigned long r=0;
|
|
@@ -426,13 +415,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
|
426
415
|
return srcSize;
|
|
427
416
|
}
|
|
428
417
|
|
|
429
|
-
/*!BIT_lookBits
|
|
430
|
-
* Provides next n bits from local register
|
|
431
|
-
* local register is not modified (bits are still present for next read/look)
|
|
432
|
-
* On 32-bits, maxNbBits==25
|
|
433
|
-
* On 64-bits, maxNbBits==57
|
|
434
|
-
* @return : value extracted
|
|
435
|
-
*/
|
|
436
418
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
437
419
|
{
|
|
438
420
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
@@ -452,11 +434,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
452
434
|
bitD->bitsConsumed += nbBits;
|
|
453
435
|
}
|
|
454
436
|
|
|
455
|
-
/*!BIT_readBits
|
|
456
|
-
* Read next n bits from local register.
|
|
457
|
-
* pay attention to not read more than nbBits contained into local register.
|
|
458
|
-
* @return : extracted value.
|
|
459
|
-
*/
|
|
460
437
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
461
438
|
{
|
|
462
439
|
size_t value = BIT_lookBits(bitD, nbBits);
|
|
@@ -475,8 +452,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
475
452
|
|
|
476
453
|
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
|
477
454
|
{
|
|
478
|
-
|
|
479
|
-
|
|
455
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
|
456
|
+
return BIT_DStream_overflow;
|
|
480
457
|
|
|
481
458
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
|
|
482
459
|
{
|
|
@@ -694,55 +671,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
|
694
671
|
|
|
695
672
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
|
696
673
|
|
|
697
|
-
/*
|
|
698
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
|
699
|
-
You will decode FSE-encoded symbols from the bitStream,
|
|
700
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
701
|
-
|
|
702
|
-
You will need a few variables to track your bitStream. They are :
|
|
703
|
-
|
|
704
|
-
BIT_DStream_t DStream; // Stream context
|
|
705
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
|
706
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
|
707
|
-
|
|
708
|
-
The first thing to do is to init the bitStream.
|
|
709
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
|
710
|
-
|
|
711
|
-
You should then retrieve your initial state(s)
|
|
712
|
-
(in reverse flushing order if you have several ones) :
|
|
713
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
|
714
|
-
|
|
715
|
-
You can then decode your data, symbol after symbol.
|
|
716
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
|
717
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
718
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
|
719
|
-
|
|
720
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
721
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
722
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
|
723
|
-
|
|
724
|
-
All above operations only read from local register (which size depends on size_t).
|
|
725
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
726
|
-
endSignal = FSE_reloadDStream(&DStream);
|
|
727
|
-
|
|
728
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
729
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
|
730
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
731
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
732
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
733
|
-
|
|
734
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
735
|
-
to properly detect the exact end of stream.
|
|
736
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
737
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
|
738
|
-
|
|
739
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
740
|
-
Checking if DStream has reached its end is performed by :
|
|
741
|
-
BIT_endOfDStream(&DStream);
|
|
742
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
743
|
-
FSE_endOfDState(&DState);
|
|
744
|
-
*/
|
|
745
|
-
|
|
746
674
|
|
|
747
675
|
/******************************************
|
|
748
676
|
* FSE unsafe API
|
|
@@ -1334,8 +1262,8 @@ static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsi
|
|
|
1334
1262
|
else
|
|
1335
1263
|
{
|
|
1336
1264
|
bitCount -= (int)(8 * (iend - 4 - ip));
|
|
1337
|
-
|
|
1338
|
-
|
|
1265
|
+
ip = iend - 4;
|
|
1266
|
+
}
|
|
1339
1267
|
bitStream = MEM_readLE32(ip) >> (bitCount & 31);
|
|
1340
1268
|
}
|
|
1341
1269
|
}
|
|
@@ -2040,7 +1968,7 @@ static size_t HUF_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
|
|
|
2040
1968
|
rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
|
|
2041
1969
|
}
|
|
2042
1970
|
|
|
2043
|
-
|
|
1971
|
+
/* Build rankVal */
|
|
2044
1972
|
{
|
|
2045
1973
|
const U32 minBits = tableLog+1 - maxW;
|
|
2046
1974
|
U32 nextRankVal = 0;
|
|
@@ -2374,7 +2302,7 @@ static size_t HUF_readDTableX6 (U32* DTable, const void* src, size_t srcSize)
|
|
|
2374
2302
|
rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
|
|
2375
2303
|
}
|
|
2376
2304
|
|
|
2377
|
-
|
|
2305
|
+
/* Build rankVal */
|
|
2378
2306
|
{
|
|
2379
2307
|
const U32 minBits = tableLog+1 - maxW;
|
|
2380
2308
|
U32 nextRankVal = 0;
|
|
@@ -2948,14 +2876,14 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
|
2948
2876
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
2949
2877
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
|
2950
2878
|
{
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
|
|
2879
|
+
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
|
2880
|
+
memcpy(dctx->litBuffer, istart, litSize);
|
|
2881
|
+
dctx->litPtr = dctx->litBuffer;
|
|
2882
|
+
dctx->litSize = litSize;
|
|
2883
|
+
memset(dctx->litBuffer + dctx->litSize, 0, 8);
|
|
2884
|
+
return litSize+3;
|
|
2885
|
+
}
|
|
2886
|
+
/* direct reference into compressed stream */
|
|
2959
2887
|
dctx->litPtr = istart+3;
|
|
2960
2888
|
dctx->litSize = litSize;
|
|
2961
2889
|
return litSize+3;
|
|
@@ -3515,13 +3443,13 @@ static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSi
|
|
|
3515
3443
|
|
|
3516
3444
|
unsigned ZSTDv02_isError(size_t code)
|
|
3517
3445
|
{
|
|
3518
|
-
|
|
3446
|
+
return ZSTD_isError(code);
|
|
3519
3447
|
}
|
|
3520
3448
|
|
|
3521
3449
|
size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize,
|
|
3522
3450
|
const void* src, size_t compressedSize)
|
|
3523
3451
|
{
|
|
3524
|
-
|
|
3452
|
+
return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
|
|
3525
3453
|
}
|
|
3526
3454
|
|
|
3527
3455
|
size_t ZSTDv02_findFrameCompressedSize(const void *src, size_t compressedSize)
|
|
@@ -3531,25 +3459,25 @@ size_t ZSTDv02_findFrameCompressedSize(const void *src, size_t compressedSize)
|
|
|
3531
3459
|
|
|
3532
3460
|
ZSTDv02_Dctx* ZSTDv02_createDCtx(void)
|
|
3533
3461
|
{
|
|
3534
|
-
|
|
3462
|
+
return (ZSTDv02_Dctx*)ZSTD_createDCtx();
|
|
3535
3463
|
}
|
|
3536
3464
|
|
|
3537
3465
|
size_t ZSTDv02_freeDCtx(ZSTDv02_Dctx* dctx)
|
|
3538
3466
|
{
|
|
3539
|
-
|
|
3467
|
+
return ZSTD_freeDCtx((ZSTD_DCtx*)dctx);
|
|
3540
3468
|
}
|
|
3541
3469
|
|
|
3542
3470
|
size_t ZSTDv02_resetDCtx(ZSTDv02_Dctx* dctx)
|
|
3543
3471
|
{
|
|
3544
|
-
|
|
3472
|
+
return ZSTD_resetDCtx((ZSTD_DCtx*)dctx);
|
|
3545
3473
|
}
|
|
3546
3474
|
|
|
3547
3475
|
size_t ZSTDv02_nextSrcSizeToDecompress(ZSTDv02_Dctx* dctx)
|
|
3548
3476
|
{
|
|
3549
|
-
|
|
3477
|
+
return ZSTD_nextSrcSizeToDecompress((ZSTD_DCtx*)dctx);
|
|
3550
3478
|
}
|
|
3551
3479
|
|
|
3552
3480
|
size_t ZSTDv02_decompressContinue(ZSTDv02_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3553
3481
|
{
|
|
3554
|
-
|
|
3482
|
+
return ZSTD_decompressContinue((ZSTD_DCtx*)dctx, dst, maxDstSize, src, srcSize);
|
|
3555
3483
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
#ifndef ZSTD_V02_H_4174539423
|