extzstd 0.3.2 → 0.4
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 +4 -4
- data/README.md +4 -3
- data/contrib/zstd/CHANGELOG +225 -1
- data/contrib/zstd/CONTRIBUTING.md +158 -75
- data/contrib/zstd/LICENSE +4 -4
- data/contrib/zstd/Makefile +106 -69
- data/contrib/zstd/Package.swift +36 -0
- data/contrib/zstd/README.md +64 -36
- data/contrib/zstd/SECURITY.md +15 -0
- data/contrib/zstd/TESTING.md +2 -3
- data/contrib/zstd/lib/BUCK +5 -7
- data/contrib/zstd/lib/Makefile +117 -199
- data/contrib/zstd/lib/README.md +37 -7
- data/contrib/zstd/lib/common/allocations.h +55 -0
- data/contrib/zstd/lib/common/bits.h +200 -0
- data/contrib/zstd/lib/common/bitstream.h +80 -86
- data/contrib/zstd/lib/common/compiler.h +225 -63
- data/contrib/zstd/lib/common/cpu.h +37 -1
- data/contrib/zstd/lib/common/debug.c +7 -1
- data/contrib/zstd/lib/common/debug.h +21 -12
- data/contrib/zstd/lib/common/entropy_common.c +15 -37
- data/contrib/zstd/lib/common/error_private.c +9 -2
- data/contrib/zstd/lib/common/error_private.h +93 -5
- data/contrib/zstd/lib/common/fse.h +12 -87
- data/contrib/zstd/lib/common/fse_decompress.c +37 -117
- data/contrib/zstd/lib/common/huf.h +97 -172
- data/contrib/zstd/lib/common/mem.h +58 -58
- data/contrib/zstd/lib/common/pool.c +38 -17
- data/contrib/zstd/lib/common/pool.h +10 -4
- data/contrib/zstd/lib/common/portability_macros.h +158 -0
- data/contrib/zstd/lib/common/threading.c +74 -14
- data/contrib/zstd/lib/common/threading.h +5 -10
- data/contrib/zstd/lib/common/xxhash.c +6 -814
- data/contrib/zstd/lib/common/xxhash.h +6930 -195
- data/contrib/zstd/lib/common/zstd_common.c +1 -36
- data/contrib/zstd/lib/common/zstd_deps.h +1 -1
- data/contrib/zstd/lib/common/zstd_internal.h +68 -154
- data/contrib/zstd/lib/common/zstd_trace.h +163 -0
- data/contrib/zstd/lib/compress/clevels.h +134 -0
- data/contrib/zstd/lib/compress/fse_compress.c +75 -155
- data/contrib/zstd/lib/compress/hist.c +1 -1
- data/contrib/zstd/lib/compress/hist.h +1 -1
- data/contrib/zstd/lib/compress/huf_compress.c +810 -259
- data/contrib/zstd/lib/compress/zstd_compress.c +2864 -919
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +523 -192
- data/contrib/zstd/lib/compress/zstd_compress_literals.c +117 -40
- data/contrib/zstd/lib/compress/zstd_compress_literals.h +16 -6
- data/contrib/zstd/lib/compress/zstd_compress_sequences.c +28 -19
- data/contrib/zstd/lib/compress/zstd_compress_sequences.h +1 -1
- data/contrib/zstd/lib/compress/zstd_compress_superblock.c +251 -412
- data/contrib/zstd/lib/compress/zstd_compress_superblock.h +1 -1
- data/contrib/zstd/lib/compress/zstd_cwksp.h +284 -97
- data/contrib/zstd/lib/compress/zstd_double_fast.c +382 -133
- data/contrib/zstd/lib/compress/zstd_double_fast.h +14 -2
- data/contrib/zstd/lib/compress/zstd_fast.c +732 -260
- data/contrib/zstd/lib/compress/zstd_fast.h +3 -2
- data/contrib/zstd/lib/compress/zstd_lazy.c +1177 -390
- data/contrib/zstd/lib/compress/zstd_lazy.h +129 -14
- data/contrib/zstd/lib/compress/zstd_ldm.c +280 -210
- data/contrib/zstd/lib/compress/zstd_ldm.h +3 -2
- data/contrib/zstd/lib/compress/zstd_ldm_geartab.h +106 -0
- data/contrib/zstd/lib/compress/zstd_opt.c +516 -285
- data/contrib/zstd/lib/compress/zstd_opt.h +32 -8
- data/contrib/zstd/lib/compress/zstdmt_compress.c +202 -131
- data/contrib/zstd/lib/compress/zstdmt_compress.h +9 -6
- data/contrib/zstd/lib/decompress/huf_decompress.c +1149 -555
- data/contrib/zstd/lib/decompress/huf_decompress_amd64.S +595 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.c +4 -4
- data/contrib/zstd/lib/decompress/zstd_ddict.h +1 -1
- data/contrib/zstd/lib/decompress/zstd_decompress.c +583 -106
- data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1054 -379
- data/contrib/zstd/lib/decompress/zstd_decompress_block.h +14 -3
- data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +56 -6
- data/contrib/zstd/lib/deprecated/zbuff.h +1 -1
- data/contrib/zstd/lib/deprecated/zbuff_common.c +1 -1
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +24 -4
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +3 -1
- data/contrib/zstd/lib/dictBuilder/cover.c +60 -44
- data/contrib/zstd/lib/dictBuilder/cover.h +6 -11
- data/contrib/zstd/lib/dictBuilder/divsufsort.c +1 -1
- data/contrib/zstd/lib/dictBuilder/fastcover.c +26 -18
- data/contrib/zstd/lib/dictBuilder/zdict.c +100 -101
- data/contrib/zstd/lib/legacy/zstd_legacy.h +38 -1
- data/contrib/zstd/lib/legacy/zstd_v01.c +18 -53
- data/contrib/zstd/lib/legacy/zstd_v01.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v02.c +28 -85
- data/contrib/zstd/lib/legacy/zstd_v02.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v03.c +29 -88
- data/contrib/zstd/lib/legacy/zstd_v03.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v04.c +27 -80
- data/contrib/zstd/lib/legacy/zstd_v04.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v05.c +36 -85
- data/contrib/zstd/lib/legacy/zstd_v05.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v06.c +44 -96
- data/contrib/zstd/lib/legacy/zstd_v06.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v07.c +37 -92
- data/contrib/zstd/lib/legacy/zstd_v07.h +1 -1
- data/contrib/zstd/lib/libzstd.mk +237 -0
- data/contrib/zstd/lib/libzstd.pc.in +4 -3
- data/contrib/zstd/lib/module.modulemap +35 -0
- data/contrib/zstd/lib/{dictBuilder/zdict.h → zdict.h} +202 -33
- data/contrib/zstd/lib/zstd.h +1030 -332
- data/contrib/zstd/lib/{common/zstd_errors.h → zstd_errors.h} +27 -8
- data/ext/extconf.rb +26 -7
- data/ext/extzstd.c +51 -24
- data/ext/extzstd.h +33 -6
- data/ext/extzstd_stream.c +74 -31
- data/ext/libzstd_conf.h +0 -1
- data/ext/zstd_decompress_asm.S +1 -0
- metadata +17 -7
- data/contrib/zstd/appveyor.yml +0 -292
- data/ext/depend +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -27,9 +27,11 @@ const char* ERR_getErrorString(ERR_enum code)
|
|
|
27
27
|
case PREFIX(version_unsupported): return "Version not supported";
|
|
28
28
|
case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter";
|
|
29
29
|
case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding";
|
|
30
|
-
case PREFIX(corruption_detected): return "
|
|
30
|
+
case PREFIX(corruption_detected): return "Data corruption detected";
|
|
31
31
|
case PREFIX(checksum_wrong): return "Restored data doesn't match checksum";
|
|
32
|
+
case PREFIX(literals_headerWrong): return "Header of Literals' block doesn't respect format specification";
|
|
32
33
|
case PREFIX(parameter_unsupported): return "Unsupported parameter";
|
|
34
|
+
case PREFIX(parameter_combination_unsupported): return "Unsupported combination of parameters";
|
|
33
35
|
case PREFIX(parameter_outOfBound): return "Parameter is out of bound";
|
|
34
36
|
case PREFIX(init_missing): return "Context should be init first";
|
|
35
37
|
case PREFIX(memory_allocation): return "Allocation error : not enough memory";
|
|
@@ -38,17 +40,22 @@ const char* ERR_getErrorString(ERR_enum code)
|
|
|
38
40
|
case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported";
|
|
39
41
|
case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large";
|
|
40
42
|
case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";
|
|
43
|
+
case PREFIX(stabilityCondition_notRespected): return "pledged buffer stability condition is not respected";
|
|
41
44
|
case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";
|
|
42
45
|
case PREFIX(dictionary_wrong): return "Dictionary mismatch";
|
|
43
46
|
case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples";
|
|
44
47
|
case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
|
|
45
48
|
case PREFIX(srcSize_wrong): return "Src size is incorrect";
|
|
46
49
|
case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer";
|
|
50
|
+
case PREFIX(noForwardProgress_destFull): return "Operation made no progress over multiple calls, due to output buffer being full";
|
|
51
|
+
case PREFIX(noForwardProgress_inputEmpty): return "Operation made no progress over multiple calls, due to input being empty";
|
|
47
52
|
/* following error codes are not stable and may be removed or changed in a future version */
|
|
48
53
|
case PREFIX(frameIndex_tooLarge): return "Frame index is too large";
|
|
49
54
|
case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking";
|
|
50
55
|
case PREFIX(dstBuffer_wrong): return "Destination buffer is wrong";
|
|
51
56
|
case PREFIX(srcBuffer_wrong): return "Source buffer is wrong";
|
|
57
|
+
case PREFIX(sequenceProducer_failed): return "Block-level external sequence producer returned an error code";
|
|
58
|
+
case PREFIX(externalSequences_invalid): return "External sequences are not valid";
|
|
52
59
|
case PREFIX(maxCode):
|
|
53
60
|
default: return notErrorCode;
|
|
54
61
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -21,8 +21,10 @@ extern "C" {
|
|
|
21
21
|
/* ****************************************
|
|
22
22
|
* Dependencies
|
|
23
23
|
******************************************/
|
|
24
|
-
#include "
|
|
25
|
-
#include "
|
|
24
|
+
#include "../zstd_errors.h" /* enum list */
|
|
25
|
+
#include "compiler.h"
|
|
26
|
+
#include "debug.h"
|
|
27
|
+
#include "zstd_deps.h" /* size_t */
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
/* ****************************************
|
|
@@ -58,8 +60,13 @@ ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
|
|
58
60
|
ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); }
|
|
59
61
|
|
|
60
62
|
/* check and forward error code */
|
|
61
|
-
#define CHECK_V_F(e, f)
|
|
62
|
-
|
|
63
|
+
#define CHECK_V_F(e, f) \
|
|
64
|
+
size_t const e = f; \
|
|
65
|
+
do { \
|
|
66
|
+
if (ERR_isError(e)) \
|
|
67
|
+
return e; \
|
|
68
|
+
} while (0)
|
|
69
|
+
#define CHECK_F(f) do { CHECK_V_F(_var_err__, f); } while (0)
|
|
63
70
|
|
|
64
71
|
|
|
65
72
|
/*-****************************************
|
|
@@ -73,6 +80,87 @@ ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
|
73
80
|
return ERR_getErrorString(ERR_getErrorCode(code));
|
|
74
81
|
}
|
|
75
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Ignore: this is an internal helper.
|
|
85
|
+
*
|
|
86
|
+
* This is a helper function to help force C99-correctness during compilation.
|
|
87
|
+
* Under strict compilation modes, variadic macro arguments can't be empty.
|
|
88
|
+
* However, variadic function arguments can be. Using a function therefore lets
|
|
89
|
+
* us statically check that at least one (string) argument was passed,
|
|
90
|
+
* independent of the compilation flags.
|
|
91
|
+
*/
|
|
92
|
+
static INLINE_KEYWORD UNUSED_ATTR
|
|
93
|
+
void _force_has_format_string(const char *format, ...) {
|
|
94
|
+
(void)format;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Ignore: this is an internal helper.
|
|
99
|
+
*
|
|
100
|
+
* We want to force this function invocation to be syntactically correct, but
|
|
101
|
+
* we don't want to force runtime evaluation of its arguments.
|
|
102
|
+
*/
|
|
103
|
+
#define _FORCE_HAS_FORMAT_STRING(...) \
|
|
104
|
+
do { \
|
|
105
|
+
if (0) { \
|
|
106
|
+
_force_has_format_string(__VA_ARGS__); \
|
|
107
|
+
} \
|
|
108
|
+
} while (0)
|
|
109
|
+
|
|
110
|
+
#define ERR_QUOTE(str) #str
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Return the specified error if the condition evaluates to true.
|
|
114
|
+
*
|
|
115
|
+
* In debug modes, prints additional information.
|
|
116
|
+
* In order to do that (particularly, printing the conditional that failed),
|
|
117
|
+
* this can't just wrap RETURN_ERROR().
|
|
118
|
+
*/
|
|
119
|
+
#define RETURN_ERROR_IF(cond, err, ...) \
|
|
120
|
+
do { \
|
|
121
|
+
if (cond) { \
|
|
122
|
+
RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
|
|
123
|
+
__FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \
|
|
124
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
|
125
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
|
126
|
+
RAWLOG(3, "\n"); \
|
|
127
|
+
return ERROR(err); \
|
|
128
|
+
} \
|
|
129
|
+
} while (0)
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Unconditionally return the specified error.
|
|
133
|
+
*
|
|
134
|
+
* In debug modes, prints additional information.
|
|
135
|
+
*/
|
|
136
|
+
#define RETURN_ERROR(err, ...) \
|
|
137
|
+
do { \
|
|
138
|
+
RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
|
|
139
|
+
__FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \
|
|
140
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
|
141
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
|
142
|
+
RAWLOG(3, "\n"); \
|
|
143
|
+
return ERROR(err); \
|
|
144
|
+
} while(0)
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* If the provided expression evaluates to an error code, returns that error code.
|
|
148
|
+
*
|
|
149
|
+
* In debug modes, prints additional information.
|
|
150
|
+
*/
|
|
151
|
+
#define FORWARD_IF_ERROR(err, ...) \
|
|
152
|
+
do { \
|
|
153
|
+
size_t const err_code = (err); \
|
|
154
|
+
if (ERR_isError(err_code)) { \
|
|
155
|
+
RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
|
|
156
|
+
__FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \
|
|
157
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
|
158
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
|
159
|
+
RAWLOG(3, "\n"); \
|
|
160
|
+
return err_code; \
|
|
161
|
+
} \
|
|
162
|
+
} while(0)
|
|
163
|
+
|
|
76
164
|
#if defined (__cplusplus)
|
|
77
165
|
}
|
|
78
166
|
#endif
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* ******************************************************************
|
|
2
2
|
* FSE : Finite State Entropy codec
|
|
3
3
|
* Public Prototypes declaration
|
|
4
|
-
* Copyright (c)
|
|
4
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
5
5
|
*
|
|
6
6
|
* You can contact the author at :
|
|
7
7
|
* - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
@@ -53,34 +53,6 @@ extern "C" {
|
|
|
53
53
|
FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
/*-****************************************
|
|
57
|
-
* FSE simple functions
|
|
58
|
-
******************************************/
|
|
59
|
-
/*! FSE_compress() :
|
|
60
|
-
Compress content of buffer 'src', of size 'srcSize', into destination buffer 'dst'.
|
|
61
|
-
'dst' buffer must be already allocated. Compression runs faster is dstCapacity >= FSE_compressBound(srcSize).
|
|
62
|
-
@return : size of compressed data (<= dstCapacity).
|
|
63
|
-
Special values : if return == 0, srcData is not compressible => Nothing is stored within dst !!!
|
|
64
|
-
if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression instead.
|
|
65
|
-
if FSE_isError(return), compression failed (more details using FSE_getErrorName())
|
|
66
|
-
*/
|
|
67
|
-
FSE_PUBLIC_API size_t FSE_compress(void* dst, size_t dstCapacity,
|
|
68
|
-
const void* src, size_t srcSize);
|
|
69
|
-
|
|
70
|
-
/*! FSE_decompress():
|
|
71
|
-
Decompress FSE data from buffer 'cSrc', of size 'cSrcSize',
|
|
72
|
-
into already allocated destination buffer 'dst', of size 'dstCapacity'.
|
|
73
|
-
@return : size of regenerated data (<= maxDstSize),
|
|
74
|
-
or an error code, which can be tested using FSE_isError() .
|
|
75
|
-
|
|
76
|
-
** Important ** : FSE_decompress() does not decompress non-compressible nor RLE data !!!
|
|
77
|
-
Why ? : making this distinction requires a header.
|
|
78
|
-
Header management is intentionally delegated to the user layer, which can better manage special cases.
|
|
79
|
-
*/
|
|
80
|
-
FSE_PUBLIC_API size_t FSE_decompress(void* dst, size_t dstCapacity,
|
|
81
|
-
const void* cSrc, size_t cSrcSize);
|
|
82
|
-
|
|
83
|
-
|
|
84
56
|
/*-*****************************************
|
|
85
57
|
* Tool functions
|
|
86
58
|
******************************************/
|
|
@@ -91,20 +63,6 @@ FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return
|
|
|
91
63
|
FSE_PUBLIC_API const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */
|
|
92
64
|
|
|
93
65
|
|
|
94
|
-
/*-*****************************************
|
|
95
|
-
* FSE advanced functions
|
|
96
|
-
******************************************/
|
|
97
|
-
/*! FSE_compress2() :
|
|
98
|
-
Same as FSE_compress(), but allows the selection of 'maxSymbolValue' and 'tableLog'
|
|
99
|
-
Both parameters can be defined as '0' to mean : use default value
|
|
100
|
-
@return : size of compressed data
|
|
101
|
-
Special values : if return == 0, srcData is not compressible => Nothing is stored within cSrc !!!
|
|
102
|
-
if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression.
|
|
103
|
-
if FSE_isError(return), it's an error code.
|
|
104
|
-
*/
|
|
105
|
-
FSE_PUBLIC_API size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
|
106
|
-
|
|
107
|
-
|
|
108
66
|
/*-*****************************************
|
|
109
67
|
* FSE detailed API
|
|
110
68
|
******************************************/
|
|
@@ -164,8 +122,6 @@ FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize,
|
|
|
164
122
|
/*! Constructor and Destructor of FSE_CTable.
|
|
165
123
|
Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */
|
|
166
124
|
typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */
|
|
167
|
-
FSE_PUBLIC_API FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog);
|
|
168
|
-
FSE_PUBLIC_API void FSE_freeCTable (FSE_CTable* ct);
|
|
169
125
|
|
|
170
126
|
/*! FSE_buildCTable():
|
|
171
127
|
Builds `ct`, which must be already allocated, using FSE_createCTable().
|
|
@@ -241,23 +197,7 @@ FSE_PUBLIC_API size_t FSE_readNCount_bmi2(short* normalizedCounter,
|
|
|
241
197
|
unsigned* maxSymbolValuePtr, unsigned* tableLogPtr,
|
|
242
198
|
const void* rBuffer, size_t rBuffSize, int bmi2);
|
|
243
199
|
|
|
244
|
-
/*! Constructor and Destructor of FSE_DTable.
|
|
245
|
-
Note that its size depends on 'tableLog' */
|
|
246
200
|
typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
|
|
247
|
-
FSE_PUBLIC_API FSE_DTable* FSE_createDTable(unsigned tableLog);
|
|
248
|
-
FSE_PUBLIC_API void FSE_freeDTable(FSE_DTable* dt);
|
|
249
|
-
|
|
250
|
-
/*! FSE_buildDTable():
|
|
251
|
-
Builds 'dt', which must be already allocated, using FSE_createDTable().
|
|
252
|
-
return : 0, or an errorCode, which can be tested using FSE_isError() */
|
|
253
|
-
FSE_PUBLIC_API size_t FSE_buildDTable (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
|
|
254
|
-
|
|
255
|
-
/*! FSE_decompress_usingDTable():
|
|
256
|
-
Decompress compressed source `cSrc` of size `cSrcSize` using `dt`
|
|
257
|
-
into `dst` which must be already allocated.
|
|
258
|
-
@return : size of regenerated data (necessarily <= `dstCapacity`),
|
|
259
|
-
or an errorCode, which can be tested using FSE_isError() */
|
|
260
|
-
FSE_PUBLIC_API size_t FSE_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt);
|
|
261
201
|
|
|
262
202
|
/*!
|
|
263
203
|
Tutorial :
|
|
@@ -289,6 +229,7 @@ If there is an error, the function will return an error code, which can be teste
|
|
|
289
229
|
|
|
290
230
|
#endif /* FSE_H */
|
|
291
231
|
|
|
232
|
+
|
|
292
233
|
#if defined(FSE_STATIC_LINKING_ONLY) && !defined(FSE_H_FSE_STATIC_LINKING_ONLY)
|
|
293
234
|
#define FSE_H_FSE_STATIC_LINKING_ONLY
|
|
294
235
|
|
|
@@ -320,24 +261,16 @@ If there is an error, the function will return an error code, which can be teste
|
|
|
320
261
|
unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus);
|
|
321
262
|
/**< same as FSE_optimalTableLog(), which used `minus==2` */
|
|
322
263
|
|
|
323
|
-
/* FSE_compress_wksp() :
|
|
324
|
-
* Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).
|
|
325
|
-
* FSE_COMPRESS_WKSP_SIZE_U32() provides the minimum size required for `workSpace` as a table of FSE_CTable.
|
|
326
|
-
*/
|
|
327
|
-
#define FSE_COMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + ((maxTableLog > 12) ? (1 << (maxTableLog - 2)) : 1024) )
|
|
328
|
-
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);
|
|
329
|
-
|
|
330
|
-
size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits);
|
|
331
|
-
/**< build a fake FSE_CTable, designed for a flat distribution, where each symbol uses nbBits */
|
|
332
|
-
|
|
333
264
|
size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue);
|
|
334
265
|
/**< build a fake FSE_CTable, designed to compress always the same symbolValue */
|
|
335
266
|
|
|
336
267
|
/* FSE_buildCTable_wksp() :
|
|
337
268
|
* Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
|
|
338
|
-
* `wkspSize` must be >= `
|
|
269
|
+
* `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`.
|
|
270
|
+
* See FSE_buildCTable_wksp() for breakdown of workspace usage.
|
|
339
271
|
*/
|
|
340
|
-
#define
|
|
272
|
+
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (((maxSymbolValue + 2) + (1ull << (tableLog)))/2 + sizeof(U64)/sizeof(U32) /* additional 8 bytes for potential table overwrite */)
|
|
273
|
+
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog))
|
|
341
274
|
size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
|
342
275
|
|
|
343
276
|
#define FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) (sizeof(short) * (maxSymbolValue + 1) + (1ULL << maxTableLog) + 8)
|
|
@@ -345,19 +278,11 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
|
|
|
345
278
|
FSE_PUBLIC_API size_t FSE_buildDTable_wksp(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
|
346
279
|
/**< Same as FSE_buildDTable(), using an externally allocated `workspace` produced with `FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxSymbolValue)` */
|
|
347
280
|
|
|
348
|
-
|
|
349
|
-
/**< build a fake FSE_DTable, designed to read a flat distribution where each symbol uses nbBits */
|
|
350
|
-
|
|
351
|
-
size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue);
|
|
352
|
-
/**< build a fake FSE_DTable, designed to always generate the same symbolValue */
|
|
353
|
-
|
|
354
|
-
#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue))
|
|
281
|
+
#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + 1 + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) + (FSE_MAX_SYMBOL_VALUE + 1) / 2 + 1)
|
|
355
282
|
#define FSE_DECOMPRESS_WKSP_SIZE(maxTableLog, maxSymbolValue) (FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(unsigned))
|
|
356
|
-
size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize);
|
|
357
|
-
/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)` */
|
|
358
|
-
|
|
359
283
|
size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize, int bmi2);
|
|
360
|
-
/**<
|
|
284
|
+
/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)`.
|
|
285
|
+
* Set bmi2 to 1 if your CPU supports BMI2 or 0 if it doesn't */
|
|
361
286
|
|
|
362
287
|
typedef enum {
|
|
363
288
|
FSE_repeat_none, /**< Cannot use the previous table */
|
|
@@ -540,20 +465,20 @@ MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, un
|
|
|
540
465
|
FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
|
|
541
466
|
const U16* const stateTable = (const U16*)(statePtr->stateTable);
|
|
542
467
|
U32 const nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
|
|
543
|
-
BIT_addBits(bitC,
|
|
468
|
+
BIT_addBits(bitC, (size_t)statePtr->value, nbBitsOut);
|
|
544
469
|
statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
|
|
545
470
|
}
|
|
546
471
|
|
|
547
472
|
MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePtr)
|
|
548
473
|
{
|
|
549
|
-
BIT_addBits(bitC, statePtr->value, statePtr->stateLog);
|
|
474
|
+
BIT_addBits(bitC, (size_t)statePtr->value, statePtr->stateLog);
|
|
550
475
|
BIT_flushBits(bitC);
|
|
551
476
|
}
|
|
552
477
|
|
|
553
478
|
|
|
554
479
|
/* FSE_getMaxNbBits() :
|
|
555
480
|
* Approximate maximum cost of a symbol, in bits.
|
|
556
|
-
* Fractional get rounded up (i.e
|
|
481
|
+
* Fractional get rounded up (i.e. a symbol with a normalized frequency of 3 gives the same result as a frequency of 2)
|
|
557
482
|
* note 1 : assume symbolValue is valid (<= maxSymbolValue)
|
|
558
483
|
* note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
|
|
559
484
|
MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* ******************************************************************
|
|
2
2
|
* FSE : Finite State Entropy decoder
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
4
|
*
|
|
5
5
|
* You can contact the author at :
|
|
6
6
|
* - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
#define FSE_STATIC_LINKING_ONLY
|
|
23
23
|
#include "fse.h"
|
|
24
24
|
#include "error_private.h"
|
|
25
|
-
#
|
|
26
|
-
#include "
|
|
25
|
+
#include "zstd_deps.h" /* ZSTD_memcpy */
|
|
26
|
+
#include "bits.h" /* ZSTD_highbit32 */
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
/* **************************************************************
|
|
@@ -55,19 +55,6 @@
|
|
|
55
55
|
#define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
|
|
56
56
|
#define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
/* Function templates */
|
|
60
|
-
FSE_DTable* FSE_createDTable (unsigned tableLog)
|
|
61
|
-
{
|
|
62
|
-
if (tableLog > FSE_TABLELOG_ABSOLUTE_MAX) tableLog = FSE_TABLELOG_ABSOLUTE_MAX;
|
|
63
|
-
return (FSE_DTable*)ZSTD_malloc( FSE_DTABLE_SIZE_U32(tableLog) * sizeof (U32) );
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
void FSE_freeDTable (FSE_DTable* dt)
|
|
67
|
-
{
|
|
68
|
-
ZSTD_free(dt);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
58
|
static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize)
|
|
72
59
|
{
|
|
73
60
|
void* const tdPtr = dt+1; /* because *dt is unsigned, 32-bits aligned on 32-bits */
|
|
@@ -96,7 +83,7 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo
|
|
|
96
83
|
symbolNext[s] = 1;
|
|
97
84
|
} else {
|
|
98
85
|
if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
|
|
99
|
-
symbolNext[s] = normalizedCounter[s];
|
|
86
|
+
symbolNext[s] = (U16)normalizedCounter[s];
|
|
100
87
|
} } }
|
|
101
88
|
ZSTD_memcpy(dt, &DTableH, sizeof(DTableH));
|
|
102
89
|
}
|
|
@@ -111,8 +98,7 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo
|
|
|
111
98
|
* all symbols have counts <= 8. We ensure we have 8 bytes at the end of
|
|
112
99
|
* our buffer to handle the over-write.
|
|
113
100
|
*/
|
|
114
|
-
{
|
|
115
|
-
U64 const add = 0x0101010101010101ull;
|
|
101
|
+
{ U64 const add = 0x0101010101010101ull;
|
|
116
102
|
size_t pos = 0;
|
|
117
103
|
U64 sv = 0;
|
|
118
104
|
U32 s;
|
|
@@ -123,14 +109,13 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo
|
|
|
123
109
|
for (i = 8; i < n; i += 8) {
|
|
124
110
|
MEM_write64(spread + pos + i, sv);
|
|
125
111
|
}
|
|
126
|
-
pos += n;
|
|
127
|
-
|
|
128
|
-
}
|
|
112
|
+
pos += (size_t)n;
|
|
113
|
+
} }
|
|
129
114
|
/* Now we spread those positions across the table.
|
|
130
|
-
* The benefit of doing it in two stages is that we avoid the
|
|
115
|
+
* The benefit of doing it in two stages is that we avoid the
|
|
131
116
|
* variable size inner loop, which caused lots of branch misses.
|
|
132
117
|
* Now we can run through all the positions without any branch misses.
|
|
133
|
-
* We unroll the loop twice, since that is what
|
|
118
|
+
* We unroll the loop twice, since that is what empirically worked best.
|
|
134
119
|
*/
|
|
135
120
|
{
|
|
136
121
|
size_t position = 0;
|
|
@@ -166,7 +151,7 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo
|
|
|
166
151
|
for (u=0; u<tableSize; u++) {
|
|
167
152
|
FSE_FUNCTION_TYPE const symbol = (FSE_FUNCTION_TYPE)(tableDecode[u].symbol);
|
|
168
153
|
U32 const nextState = symbolNext[symbol]++;
|
|
169
|
-
tableDecode[u].nbBits = (BYTE) (tableLog -
|
|
154
|
+
tableDecode[u].nbBits = (BYTE) (tableLog - ZSTD_highbit32(nextState) );
|
|
170
155
|
tableDecode[u].newState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
|
|
171
156
|
} }
|
|
172
157
|
|
|
@@ -184,49 +169,6 @@ size_t FSE_buildDTable_wksp(FSE_DTable* dt, const short* normalizedCounter, unsi
|
|
|
184
169
|
/*-*******************************************************
|
|
185
170
|
* Decompression (Byte symbols)
|
|
186
171
|
*********************************************************/
|
|
187
|
-
size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
|
|
188
|
-
{
|
|
189
|
-
void* ptr = dt;
|
|
190
|
-
FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
|
|
191
|
-
void* dPtr = dt + 1;
|
|
192
|
-
FSE_decode_t* const cell = (FSE_decode_t*)dPtr;
|
|
193
|
-
|
|
194
|
-
DTableH->tableLog = 0;
|
|
195
|
-
DTableH->fastMode = 0;
|
|
196
|
-
|
|
197
|
-
cell->newState = 0;
|
|
198
|
-
cell->symbol = symbolValue;
|
|
199
|
-
cell->nbBits = 0;
|
|
200
|
-
|
|
201
|
-
return 0;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
|
|
206
|
-
{
|
|
207
|
-
void* ptr = dt;
|
|
208
|
-
FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
|
|
209
|
-
void* dPtr = dt + 1;
|
|
210
|
-
FSE_decode_t* const dinfo = (FSE_decode_t*)dPtr;
|
|
211
|
-
const unsigned tableSize = 1 << nbBits;
|
|
212
|
-
const unsigned tableMask = tableSize - 1;
|
|
213
|
-
const unsigned maxSV1 = tableMask+1;
|
|
214
|
-
unsigned s;
|
|
215
|
-
|
|
216
|
-
/* Sanity checks */
|
|
217
|
-
if (nbBits < 1) return ERROR(GENERIC); /* min size */
|
|
218
|
-
|
|
219
|
-
/* Build Decoding Table */
|
|
220
|
-
DTableH->tableLog = (U16)nbBits;
|
|
221
|
-
DTableH->fastMode = 1;
|
|
222
|
-
for (s=0; s<maxSV1; s++) {
|
|
223
|
-
dinfo[s].newState = 0;
|
|
224
|
-
dinfo[s].symbol = (BYTE)s;
|
|
225
|
-
dinfo[s].nbBits = (BYTE)nbBits;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return 0;
|
|
229
|
-
}
|
|
230
172
|
|
|
231
173
|
FORCE_INLINE_TEMPLATE size_t FSE_decompress_usingDTable_generic(
|
|
232
174
|
void* dst, size_t maxDstSize,
|
|
@@ -287,29 +229,15 @@ FORCE_INLINE_TEMPLATE size_t FSE_decompress_usingDTable_generic(
|
|
|
287
229
|
break;
|
|
288
230
|
} }
|
|
289
231
|
|
|
290
|
-
|
|
232
|
+
assert(op >= ostart);
|
|
233
|
+
return (size_t)(op-ostart);
|
|
291
234
|
}
|
|
292
235
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
const FSE_DTable* dt)
|
|
297
|
-
{
|
|
298
|
-
const void* ptr = dt;
|
|
299
|
-
const FSE_DTableHeader* DTableH = (const FSE_DTableHeader*)ptr;
|
|
300
|
-
const U32 fastMode = DTableH->fastMode;
|
|
301
|
-
|
|
302
|
-
/* select fast mode (static) */
|
|
303
|
-
if (fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
|
|
304
|
-
return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
|
|
305
|
-
}
|
|
236
|
+
typedef struct {
|
|
237
|
+
short ncount[FSE_MAX_SYMBOL_VALUE + 1];
|
|
238
|
+
} FSE_DecompressWksp;
|
|
306
239
|
|
|
307
240
|
|
|
308
|
-
size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize)
|
|
309
|
-
{
|
|
310
|
-
return FSE_decompress_wksp_bmi2(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, /* bmi2 */ 0);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
241
|
FORCE_INLINE_TEMPLATE size_t FSE_decompress_wksp_body(
|
|
314
242
|
void* dst, size_t dstCapacity,
|
|
315
243
|
const void* cSrc, size_t cSrcSize,
|
|
@@ -318,24 +246,34 @@ FORCE_INLINE_TEMPLATE size_t FSE_decompress_wksp_body(
|
|
|
318
246
|
{
|
|
319
247
|
const BYTE* const istart = (const BYTE*)cSrc;
|
|
320
248
|
const BYTE* ip = istart;
|
|
321
|
-
short counting[FSE_MAX_SYMBOL_VALUE+1];
|
|
322
249
|
unsigned tableLog;
|
|
323
250
|
unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
|
|
324
|
-
|
|
251
|
+
FSE_DecompressWksp* const wksp = (FSE_DecompressWksp*)workSpace;
|
|
252
|
+
size_t const dtablePos = sizeof(FSE_DecompressWksp) / sizeof(FSE_DTable);
|
|
253
|
+
FSE_DTable* const dtable = (FSE_DTable*)workSpace + dtablePos;
|
|
254
|
+
|
|
255
|
+
FSE_STATIC_ASSERT((FSE_MAX_SYMBOL_VALUE + 1) % 2 == 0);
|
|
256
|
+
if (wkspSize < sizeof(*wksp)) return ERROR(GENERIC);
|
|
257
|
+
|
|
258
|
+
/* correct offset to dtable depends on this property */
|
|
259
|
+
FSE_STATIC_ASSERT(sizeof(FSE_DecompressWksp) % sizeof(FSE_DTable) == 0);
|
|
325
260
|
|
|
326
261
|
/* normal FSE decoding mode */
|
|
327
|
-
size_t const NCountLength =
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
262
|
+
{ size_t const NCountLength =
|
|
263
|
+
FSE_readNCount_bmi2(wksp->ncount, &maxSymbolValue, &tableLog, istart, cSrcSize, bmi2);
|
|
264
|
+
if (FSE_isError(NCountLength)) return NCountLength;
|
|
265
|
+
if (tableLog > maxLog) return ERROR(tableLog_tooLarge);
|
|
266
|
+
assert(NCountLength <= cSrcSize);
|
|
267
|
+
ip += NCountLength;
|
|
268
|
+
cSrcSize -= NCountLength;
|
|
269
|
+
}
|
|
333
270
|
|
|
334
271
|
if (FSE_DECOMPRESS_WKSP_SIZE(tableLog, maxSymbolValue) > wkspSize) return ERROR(tableLog_tooLarge);
|
|
335
|
-
|
|
336
|
-
|
|
272
|
+
assert(sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog) <= wkspSize);
|
|
273
|
+
workSpace = (BYTE*)workSpace + sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog);
|
|
274
|
+
wkspSize -= sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog);
|
|
337
275
|
|
|
338
|
-
CHECK_F( FSE_buildDTable_internal(dtable,
|
|
276
|
+
CHECK_F( FSE_buildDTable_internal(dtable, wksp->ncount, maxSymbolValue, tableLog, workSpace, wkspSize) );
|
|
339
277
|
|
|
340
278
|
{
|
|
341
279
|
const void* ptr = dtable;
|
|
@@ -355,7 +293,7 @@ static size_t FSE_decompress_wksp_body_default(void* dst, size_t dstCapacity, co
|
|
|
355
293
|
}
|
|
356
294
|
|
|
357
295
|
#if DYNAMIC_BMI2
|
|
358
|
-
|
|
296
|
+
BMI2_TARGET_ATTRIBUTE static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize)
|
|
359
297
|
{
|
|
360
298
|
return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 1);
|
|
361
299
|
}
|
|
@@ -372,22 +310,4 @@ size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc,
|
|
|
372
310
|
return FSE_decompress_wksp_body_default(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize);
|
|
373
311
|
}
|
|
374
312
|
|
|
375
|
-
|
|
376
|
-
typedef FSE_DTable DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
|
|
377
|
-
|
|
378
|
-
#ifndef ZSTD_NO_UNUSED_FUNCTIONS
|
|
379
|
-
size_t FSE_buildDTable(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog) {
|
|
380
|
-
U32 wksp[FSE_BUILD_DTABLE_WKSP_SIZE_U32(FSE_TABLELOG_ABSOLUTE_MAX, FSE_MAX_SYMBOL_VALUE)];
|
|
381
|
-
return FSE_buildDTable_wksp(dt, normalizedCounter, maxSymbolValue, tableLog, wksp, sizeof(wksp));
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
size_t FSE_decompress(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize)
|
|
385
|
-
{
|
|
386
|
-
/* Static analyzer seems unable to understand this table will be properly initialized later */
|
|
387
|
-
U32 wksp[FSE_DECOMPRESS_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)];
|
|
388
|
-
return FSE_decompress_wksp(dst, dstCapacity, cSrc, cSrcSize, FSE_MAX_TABLELOG, wksp, sizeof(wksp));
|
|
389
|
-
}
|
|
390
|
-
#endif
|
|
391
|
-
|
|
392
|
-
|
|
393
313
|
#endif /* FSE_COMMONDEFS_ONLY */
|