zstd-ruby 1.4.5.0 → 1.5.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/README.md +78 -5
  4. data/Rakefile +8 -2
  5. data/ext/zstdruby/common.h +15 -0
  6. data/ext/zstdruby/extconf.rb +3 -2
  7. data/ext/zstdruby/libzstd/common/allocations.h +55 -0
  8. data/ext/zstdruby/libzstd/common/bits.h +200 -0
  9. data/ext/zstdruby/libzstd/common/bitstream.h +45 -62
  10. data/ext/zstdruby/libzstd/common/compiler.h +205 -22
  11. data/ext/zstdruby/libzstd/common/cpu.h +1 -3
  12. data/ext/zstdruby/libzstd/common/debug.c +1 -1
  13. data/ext/zstdruby/libzstd/common/debug.h +12 -19
  14. data/ext/zstdruby/libzstd/common/entropy_common.c +172 -48
  15. data/ext/zstdruby/libzstd/common/error_private.c +10 -2
  16. data/ext/zstdruby/libzstd/common/error_private.h +82 -3
  17. data/ext/zstdruby/libzstd/common/fse.h +37 -86
  18. data/ext/zstdruby/libzstd/common/fse_decompress.c +117 -92
  19. data/ext/zstdruby/libzstd/common/huf.h +99 -166
  20. data/ext/zstdruby/libzstd/common/mem.h +124 -142
  21. data/ext/zstdruby/libzstd/common/pool.c +54 -27
  22. data/ext/zstdruby/libzstd/common/pool.h +10 -4
  23. data/ext/zstdruby/libzstd/common/portability_macros.h +156 -0
  24. data/ext/zstdruby/libzstd/common/threading.c +74 -19
  25. data/ext/zstdruby/libzstd/common/threading.h +5 -10
  26. data/ext/zstdruby/libzstd/common/xxhash.c +7 -847
  27. data/ext/zstdruby/libzstd/common/xxhash.h +5568 -167
  28. data/ext/zstdruby/libzstd/common/zstd_common.c +2 -37
  29. data/ext/zstdruby/libzstd/common/zstd_deps.h +111 -0
  30. data/ext/zstdruby/libzstd/common/zstd_internal.h +132 -187
  31. data/ext/zstdruby/libzstd/common/zstd_trace.h +163 -0
  32. data/ext/zstdruby/libzstd/compress/clevels.h +134 -0
  33. data/ext/zstdruby/libzstd/compress/fse_compress.c +83 -157
  34. data/ext/zstdruby/libzstd/compress/hist.c +27 -29
  35. data/ext/zstdruby/libzstd/compress/hist.h +2 -2
  36. data/ext/zstdruby/libzstd/compress/huf_compress.c +916 -279
  37. data/ext/zstdruby/libzstd/compress/zstd_compress.c +3773 -1019
  38. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +610 -203
  39. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +119 -42
  40. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +16 -6
  41. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +42 -19
  42. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +1 -1
  43. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +49 -317
  44. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +1 -1
  45. data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +320 -103
  46. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +388 -151
  47. data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +3 -2
  48. data/ext/zstdruby/libzstd/compress/zstd_fast.c +729 -265
  49. data/ext/zstdruby/libzstd/compress/zstd_fast.h +3 -2
  50. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +1270 -251
  51. data/ext/zstdruby/libzstd/compress/zstd_lazy.h +61 -1
  52. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +324 -219
  53. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +9 -2
  54. data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +106 -0
  55. data/ext/zstdruby/libzstd/compress/zstd_opt.c +481 -209
  56. data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
  57. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +181 -457
  58. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +34 -113
  59. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +1199 -565
  60. data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +576 -0
  61. data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +12 -12
  62. data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +2 -2
  63. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +627 -157
  64. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +1086 -326
  65. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +19 -5
  66. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +62 -13
  67. data/ext/zstdruby/libzstd/dictBuilder/cover.c +73 -52
  68. data/ext/zstdruby/libzstd/dictBuilder/cover.h +7 -6
  69. data/ext/zstdruby/libzstd/dictBuilder/divsufsort.c +1 -1
  70. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +44 -35
  71. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +103 -111
  72. data/ext/zstdruby/libzstd/{dictBuilder/zdict.h → zdict.h} +203 -34
  73. data/ext/zstdruby/libzstd/zstd.h +1217 -287
  74. data/ext/zstdruby/libzstd/{common/zstd_errors.h → zstd_errors.h} +28 -8
  75. data/ext/zstdruby/main.c +20 -0
  76. data/ext/zstdruby/skippable_frame.c +63 -0
  77. data/ext/zstdruby/streaming_compress.c +177 -0
  78. data/ext/zstdruby/streaming_compress.h +5 -0
  79. data/ext/zstdruby/streaming_decompress.c +123 -0
  80. data/ext/zstdruby/zstdruby.c +114 -32
  81. data/lib/zstd-ruby/version.rb +1 -1
  82. data/lib/zstd-ruby.rb +0 -1
  83. data/zstd-ruby.gemspec +1 -1
  84. metadata +19 -36
  85. data/.travis.yml +0 -14
  86. data/ext/zstdruby/libzstd/.gitignore +0 -3
  87. data/ext/zstdruby/libzstd/BUCK +0 -234
  88. data/ext/zstdruby/libzstd/Makefile +0 -354
  89. data/ext/zstdruby/libzstd/README.md +0 -179
  90. data/ext/zstdruby/libzstd/deprecated/zbuff.h +0 -214
  91. data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +0 -26
  92. data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +0 -147
  93. data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +0 -75
  94. data/ext/zstdruby/libzstd/dll/example/Makefile +0 -48
  95. data/ext/zstdruby/libzstd/dll/example/README.md +0 -69
  96. data/ext/zstdruby/libzstd/dll/example/build_package.bat +0 -20
  97. data/ext/zstdruby/libzstd/dll/example/fullbench-dll.sln +0 -25
  98. data/ext/zstdruby/libzstd/dll/example/fullbench-dll.vcxproj +0 -181
  99. data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +0 -415
  100. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +0 -2158
  101. data/ext/zstdruby/libzstd/legacy/zstd_v01.h +0 -94
  102. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +0 -3518
  103. data/ext/zstdruby/libzstd/legacy/zstd_v02.h +0 -93
  104. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +0 -3160
  105. data/ext/zstdruby/libzstd/legacy/zstd_v03.h +0 -93
  106. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +0 -3647
  107. data/ext/zstdruby/libzstd/legacy/zstd_v04.h +0 -142
  108. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +0 -4050
  109. data/ext/zstdruby/libzstd/legacy/zstd_v05.h +0 -162
  110. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +0 -4154
  111. data/ext/zstdruby/libzstd/legacy/zstd_v06.h +0 -172
  112. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +0 -4541
  113. data/ext/zstdruby/libzstd/legacy/zstd_v07.h +0 -187
  114. data/ext/zstdruby/libzstd/libzstd.pc.in +0 -15
  115. data/ext/zstdruby/zstdruby.h +0 -6
@@ -1,2158 +0,0 @@
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
-
12
- /******************************************
13
- * Includes
14
- ******************************************/
15
- #include <stddef.h> /* size_t, ptrdiff_t */
16
- #include "zstd_v01.h"
17
- #include "../common/error_private.h"
18
-
19
-
20
- /******************************************
21
- * Static allocation
22
- ******************************************/
23
- /* You can statically allocate FSE CTable/DTable as a table of unsigned using below macro */
24
- #define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<maxTableLog))
25
-
26
- /* You can statically allocate Huff0 DTable as a table of unsigned short using below macro */
27
- #define HUF_DTABLE_SIZE_U16(maxTableLog) (1 + (1<<maxTableLog))
28
- #define HUF_CREATE_STATIC_DTABLE(DTable, maxTableLog) \
29
- unsigned short DTable[HUF_DTABLE_SIZE_U16(maxTableLog)] = { maxTableLog }
30
-
31
-
32
- /******************************************
33
- * Error Management
34
- ******************************************/
35
- #define FSE_LIST_ERRORS(ITEM) \
36
- ITEM(FSE_OK_NoError) ITEM(FSE_ERROR_GENERIC) \
37
- ITEM(FSE_ERROR_tableLog_tooLarge) ITEM(FSE_ERROR_maxSymbolValue_tooLarge) ITEM(FSE_ERROR_maxSymbolValue_tooSmall) \
38
- ITEM(FSE_ERROR_dstSize_tooSmall) ITEM(FSE_ERROR_srcSize_wrong)\
39
- ITEM(FSE_ERROR_corruptionDetected) \
40
- ITEM(FSE_ERROR_maxCode)
41
-
42
- #define FSE_GENERATE_ENUM(ENUM) ENUM,
43
- typedef enum { FSE_LIST_ERRORS(FSE_GENERATE_ENUM) } FSE_errorCodes; /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */
44
-
45
-
46
- /******************************************
47
- * FSE symbol compression API
48
- ******************************************/
49
- /*
50
- This API consists of small unitary functions, which highly benefit from being inlined.
51
- You will want to enable link-time-optimization to ensure these functions are properly inlined in your binary.
52
- Visual seems to do it automatically.
53
- For gcc or clang, you'll need to add -flto flag at compilation and linking stages.
54
- If none of these solutions is applicable, include "fse.c" directly.
55
- */
56
-
57
- typedef unsigned FSE_CTable; /* don't allocate that. It's just a way to be more restrictive than void* */
58
- typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
59
-
60
- typedef struct
61
- {
62
- size_t bitContainer;
63
- int bitPos;
64
- char* startPtr;
65
- char* ptr;
66
- char* endPtr;
67
- } FSE_CStream_t;
68
-
69
- typedef struct
70
- {
71
- ptrdiff_t value;
72
- const void* stateTable;
73
- const void* symbolTT;
74
- unsigned stateLog;
75
- } FSE_CState_t;
76
-
77
- typedef struct
78
- {
79
- size_t bitContainer;
80
- unsigned bitsConsumed;
81
- const char* ptr;
82
- const char* start;
83
- } FSE_DStream_t;
84
-
85
- typedef struct
86
- {
87
- size_t state;
88
- const void* table; /* precise table may vary, depending on U16 */
89
- } FSE_DState_t;
90
-
91
- typedef enum { FSE_DStream_unfinished = 0,
92
- FSE_DStream_endOfBuffer = 1,
93
- FSE_DStream_completed = 2,
94
- FSE_DStream_tooFar = 3 } FSE_DStream_status; /* result of FSE_reloadDStream() */
95
- /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... ?! */
96
-
97
-
98
- /****************************************************************
99
- * Tuning parameters
100
- ****************************************************************/
101
- /* MEMORY_USAGE :
102
- * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
103
- * Increasing memory usage improves compression ratio
104
- * Reduced memory usage can improve speed, due to cache effect
105
- * Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
106
- #define FSE_MAX_MEMORY_USAGE 14
107
- #define FSE_DEFAULT_MEMORY_USAGE 13
108
-
109
- /* FSE_MAX_SYMBOL_VALUE :
110
- * Maximum symbol value authorized.
111
- * Required for proper stack allocation */
112
- #define FSE_MAX_SYMBOL_VALUE 255
113
-
114
-
115
- /****************************************************************
116
- * template functions type & suffix
117
- ****************************************************************/
118
- #define FSE_FUNCTION_TYPE BYTE
119
- #define FSE_FUNCTION_EXTENSION
120
-
121
-
122
- /****************************************************************
123
- * Byte symbol type
124
- ****************************************************************/
125
- typedef struct
126
- {
127
- unsigned short newState;
128
- unsigned char symbol;
129
- unsigned char nbBits;
130
- } FSE_decode_t; /* size == U32 */
131
-
132
-
133
-
134
- /****************************************************************
135
- * Compiler specifics
136
- ****************************************************************/
137
- #ifdef _MSC_VER /* Visual Studio */
138
- # define FORCE_INLINE static __forceinline
139
- # include <intrin.h> /* For Visual 2005 */
140
- # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
141
- # pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
142
- #else
143
- # define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
144
- # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
145
- # ifdef __GNUC__
146
- # define FORCE_INLINE static inline __attribute__((always_inline))
147
- # else
148
- # define FORCE_INLINE static inline
149
- # endif
150
- # else
151
- # define FORCE_INLINE static
152
- # endif /* __STDC_VERSION__ */
153
- #endif
154
-
155
-
156
- /****************************************************************
157
- * Includes
158
- ****************************************************************/
159
- #include <stdlib.h> /* malloc, free, qsort */
160
- #include <string.h> /* memcpy, memset */
161
- #include <stdio.h> /* printf (debug) */
162
-
163
-
164
- #ifndef MEM_ACCESS_MODULE
165
- #define MEM_ACCESS_MODULE
166
- /****************************************************************
167
- * Basic Types
168
- *****************************************************************/
169
- #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
170
- # include <stdint.h>
171
- typedef uint8_t BYTE;
172
- typedef uint16_t U16;
173
- typedef int16_t S16;
174
- typedef uint32_t U32;
175
- typedef int32_t S32;
176
- typedef uint64_t U64;
177
- typedef int64_t S64;
178
- #else
179
- typedef unsigned char BYTE;
180
- typedef unsigned short U16;
181
- typedef signed short S16;
182
- typedef unsigned int U32;
183
- typedef signed int S32;
184
- typedef unsigned long long U64;
185
- typedef signed long long S64;
186
- #endif
187
-
188
- #endif /* MEM_ACCESS_MODULE */
189
-
190
- /****************************************************************
191
- * Memory I/O
192
- *****************************************************************/
193
- /* FSE_FORCE_MEMORY_ACCESS
194
- * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.
195
- * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.
196
- * The below switch allow to select different access method for improved performance.
197
- * Method 0 (default) : use `memcpy()`. Safe and portable.
198
- * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).
199
- * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.
200
- * Method 2 : direct access. This method is portable but violate C standard.
201
- * It can generate buggy code on targets generating assembly depending on alignment.
202
- * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)
203
- * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.
204
- * Prefer these methods in priority order (0 > 1 > 2)
205
- */
206
- #ifndef FSE_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
207
- # if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
208
- # define FSE_FORCE_MEMORY_ACCESS 2
209
- # elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
210
- (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
211
- # define FSE_FORCE_MEMORY_ACCESS 1
212
- # endif
213
- #endif
214
-
215
-
216
- static unsigned FSE_32bits(void)
217
- {
218
- return sizeof(void*)==4;
219
- }
220
-
221
- static unsigned FSE_isLittleEndian(void)
222
- {
223
- const union { U32 i; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
224
- return one.c[0];
225
- }
226
-
227
- #if defined(FSE_FORCE_MEMORY_ACCESS) && (FSE_FORCE_MEMORY_ACCESS==2)
228
-
229
- static U16 FSE_read16(const void* memPtr) { return *(const U16*) memPtr; }
230
- static U32 FSE_read32(const void* memPtr) { return *(const U32*) memPtr; }
231
- static U64 FSE_read64(const void* memPtr) { return *(const U64*) memPtr; }
232
-
233
- #elif defined(FSE_FORCE_MEMORY_ACCESS) && (FSE_FORCE_MEMORY_ACCESS==1)
234
-
235
- /* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
236
- /* currently only defined for gcc and icc */
237
- typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign;
238
-
239
- static U16 FSE_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
240
- static U32 FSE_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
241
- static U64 FSE_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
242
-
243
- #else
244
-
245
- static U16 FSE_read16(const void* memPtr)
246
- {
247
- U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
248
- }
249
-
250
- static U32 FSE_read32(const void* memPtr)
251
- {
252
- U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
253
- }
254
-
255
- static U64 FSE_read64(const void* memPtr)
256
- {
257
- U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
258
- }
259
-
260
- #endif /* FSE_FORCE_MEMORY_ACCESS */
261
-
262
- static U16 FSE_readLE16(const void* memPtr)
263
- {
264
- if (FSE_isLittleEndian())
265
- return FSE_read16(memPtr);
266
- else
267
- {
268
- const BYTE* p = (const BYTE*)memPtr;
269
- return (U16)(p[0] + (p[1]<<8));
270
- }
271
- }
272
-
273
- static U32 FSE_readLE32(const void* memPtr)
274
- {
275
- if (FSE_isLittleEndian())
276
- return FSE_read32(memPtr);
277
- else
278
- {
279
- const BYTE* p = (const BYTE*)memPtr;
280
- return (U32)((U32)p[0] + ((U32)p[1]<<8) + ((U32)p[2]<<16) + ((U32)p[3]<<24));
281
- }
282
- }
283
-
284
-
285
- static U64 FSE_readLE64(const void* memPtr)
286
- {
287
- if (FSE_isLittleEndian())
288
- return FSE_read64(memPtr);
289
- else
290
- {
291
- const BYTE* p = (const BYTE*)memPtr;
292
- return (U64)((U64)p[0] + ((U64)p[1]<<8) + ((U64)p[2]<<16) + ((U64)p[3]<<24)
293
- + ((U64)p[4]<<32) + ((U64)p[5]<<40) + ((U64)p[6]<<48) + ((U64)p[7]<<56));
294
- }
295
- }
296
-
297
- static size_t FSE_readLEST(const void* memPtr)
298
- {
299
- if (FSE_32bits())
300
- return (size_t)FSE_readLE32(memPtr);
301
- else
302
- return (size_t)FSE_readLE64(memPtr);
303
- }
304
-
305
-
306
-
307
- /****************************************************************
308
- * Constants
309
- *****************************************************************/
310
- #define FSE_MAX_TABLELOG (FSE_MAX_MEMORY_USAGE-2)
311
- #define FSE_MAX_TABLESIZE (1U<<FSE_MAX_TABLELOG)
312
- #define FSE_MAXTABLESIZE_MASK (FSE_MAX_TABLESIZE-1)
313
- #define FSE_DEFAULT_TABLELOG (FSE_DEFAULT_MEMORY_USAGE-2)
314
- #define FSE_MIN_TABLELOG 5
315
-
316
- #define FSE_TABLELOG_ABSOLUTE_MAX 15
317
- #if FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX
318
- #error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
319
- #endif
320
-
321
-
322
- /****************************************************************
323
- * Error Management
324
- ****************************************************************/
325
- #define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
326
-
327
-
328
- /****************************************************************
329
- * Complex types
330
- ****************************************************************/
331
- typedef struct
332
- {
333
- int deltaFindState;
334
- U32 deltaNbBits;
335
- } FSE_symbolCompressionTransform; /* total 8 bytes */
336
-
337
- typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
338
-
339
- /****************************************************************
340
- * Internal functions
341
- ****************************************************************/
342
- FORCE_INLINE unsigned FSE_highbit32 (U32 val)
343
- {
344
- # if defined(_MSC_VER) /* Visual */
345
- unsigned long r;
346
- _BitScanReverse ( &r, val );
347
- return (unsigned) r;
348
- # elif defined(__GNUC__) && (GCC_VERSION >= 304) /* GCC Intrinsic */
349
- return __builtin_clz (val) ^ 31;
350
- # else /* Software version */
351
- static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
352
- U32 v = val;
353
- unsigned r;
354
- v |= v >> 1;
355
- v |= v >> 2;
356
- v |= v >> 4;
357
- v |= v >> 8;
358
- v |= v >> 16;
359
- r = DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27];
360
- return r;
361
- # endif
362
- }
363
-
364
-
365
- /****************************************************************
366
- * Templates
367
- ****************************************************************/
368
- /*
369
- designed to be included
370
- for type-specific functions (template emulation in C)
371
- Objective is to write these functions only once, for improved maintenance
372
- */
373
-
374
- /* safety checks */
375
- #ifndef FSE_FUNCTION_EXTENSION
376
- # error "FSE_FUNCTION_EXTENSION must be defined"
377
- #endif
378
- #ifndef FSE_FUNCTION_TYPE
379
- # error "FSE_FUNCTION_TYPE must be defined"
380
- #endif
381
-
382
- /* Function names */
383
- #define FSE_CAT(X,Y) X##Y
384
- #define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
385
- #define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
386
-
387
-
388
-
389
- static U32 FSE_tableStep(U32 tableSize) { return (tableSize>>1) + (tableSize>>3) + 3; }
390
-
391
- #define FSE_DECODE_TYPE FSE_decode_t
392
-
393
-
394
- typedef struct {
395
- U16 tableLog;
396
- U16 fastMode;
397
- } FSE_DTableHeader; /* sizeof U32 */
398
-
399
- static size_t FSE_buildDTable
400
- (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
401
- {
402
- void* ptr = dt;
403
- FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
404
- FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*)(ptr) + 1; /* because dt is unsigned, 32-bits aligned on 32-bits */
405
- const U32 tableSize = 1 << tableLog;
406
- const U32 tableMask = tableSize-1;
407
- const U32 step = FSE_tableStep(tableSize);
408
- U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
409
- U32 position = 0;
410
- U32 highThreshold = tableSize-1;
411
- const S16 largeLimit= (S16)(1 << (tableLog-1));
412
- U32 noLarge = 1;
413
- U32 s;
414
-
415
- /* Sanity Checks */
416
- if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return (size_t)-FSE_ERROR_maxSymbolValue_tooLarge;
417
- if (tableLog > FSE_MAX_TABLELOG) return (size_t)-FSE_ERROR_tableLog_tooLarge;
418
-
419
- /* Init, lay down lowprob symbols */
420
- DTableH[0].tableLog = (U16)tableLog;
421
- for (s=0; s<=maxSymbolValue; s++)
422
- {
423
- if (normalizedCounter[s]==-1)
424
- {
425
- tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
426
- symbolNext[s] = 1;
427
- }
428
- else
429
- {
430
- if (normalizedCounter[s] >= largeLimit) noLarge=0;
431
- symbolNext[s] = normalizedCounter[s];
432
- }
433
- }
434
-
435
- /* Spread symbols */
436
- for (s=0; s<=maxSymbolValue; s++)
437
- {
438
- int i;
439
- for (i=0; i<normalizedCounter[s]; i++)
440
- {
441
- tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
442
- position = (position + step) & tableMask;
443
- while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
444
- }
445
- }
446
-
447
- if (position!=0) return (size_t)-FSE_ERROR_GENERIC; /* position must reach all cells once, otherwise normalizedCounter is incorrect */
448
-
449
- /* Build Decoding table */
450
- {
451
- U32 i;
452
- for (i=0; i<tableSize; i++)
453
- {
454
- FSE_FUNCTION_TYPE symbol = (FSE_FUNCTION_TYPE)(tableDecode[i].symbol);
455
- U16 nextState = symbolNext[symbol]++;
456
- tableDecode[i].nbBits = (BYTE) (tableLog - FSE_highbit32 ((U32)nextState) );
457
- tableDecode[i].newState = (U16) ( (nextState << tableDecode[i].nbBits) - tableSize);
458
- }
459
- }
460
-
461
- DTableH->fastMode = (U16)noLarge;
462
- return 0;
463
- }
464
-
465
-
466
- /******************************************
467
- * FSE byte symbol
468
- ******************************************/
469
- #ifndef FSE_COMMONDEFS_ONLY
470
-
471
- static unsigned FSE_isError(size_t code) { return (code > (size_t)(-FSE_ERROR_maxCode)); }
472
-
473
- static short FSE_abs(short a)
474
- {
475
- return a<0? -a : a;
476
- }
477
-
478
-
479
- /****************************************************************
480
- * Header bitstream management
481
- ****************************************************************/
482
- static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
483
- const void* headerBuffer, size_t hbSize)
484
- {
485
- const BYTE* const istart = (const BYTE*) headerBuffer;
486
- const BYTE* const iend = istart + hbSize;
487
- const BYTE* ip = istart;
488
- int nbBits;
489
- int remaining;
490
- int threshold;
491
- U32 bitStream;
492
- int bitCount;
493
- unsigned charnum = 0;
494
- int previous0 = 0;
495
-
496
- if (hbSize < 4) return (size_t)-FSE_ERROR_srcSize_wrong;
497
- bitStream = FSE_readLE32(ip);
498
- nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
499
- if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return (size_t)-FSE_ERROR_tableLog_tooLarge;
500
- bitStream >>= 4;
501
- bitCount = 4;
502
- *tableLogPtr = nbBits;
503
- remaining = (1<<nbBits)+1;
504
- threshold = 1<<nbBits;
505
- nbBits++;
506
-
507
- while ((remaining>1) && (charnum<=*maxSVPtr))
508
- {
509
- if (previous0)
510
- {
511
- unsigned n0 = charnum;
512
- while ((bitStream & 0xFFFF) == 0xFFFF)
513
- {
514
- n0+=24;
515
- if (ip < iend-5)
516
- {
517
- ip+=2;
518
- bitStream = FSE_readLE32(ip) >> bitCount;
519
- }
520
- else
521
- {
522
- bitStream >>= 16;
523
- bitCount+=16;
524
- }
525
- }
526
- while ((bitStream & 3) == 3)
527
- {
528
- n0+=3;
529
- bitStream>>=2;
530
- bitCount+=2;
531
- }
532
- n0 += bitStream & 3;
533
- bitCount += 2;
534
- if (n0 > *maxSVPtr) return (size_t)-FSE_ERROR_maxSymbolValue_tooSmall;
535
- while (charnum < n0) normalizedCounter[charnum++] = 0;
536
- if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
537
- {
538
- ip += bitCount>>3;
539
- bitCount &= 7;
540
- bitStream = FSE_readLE32(ip) >> bitCount;
541
- }
542
- else
543
- bitStream >>= 2;
544
- }
545
- {
546
- const short max = (short)((2*threshold-1)-remaining);
547
- short count;
548
-
549
- if ((bitStream & (threshold-1)) < (U32)max)
550
- {
551
- count = (short)(bitStream & (threshold-1));
552
- bitCount += nbBits-1;
553
- }
554
- else
555
- {
556
- count = (short)(bitStream & (2*threshold-1));
557
- if (count >= threshold) count -= max;
558
- bitCount += nbBits;
559
- }
560
-
561
- count--; /* extra accuracy */
562
- remaining -= FSE_abs(count);
563
- normalizedCounter[charnum++] = count;
564
- previous0 = !count;
565
- while (remaining < threshold)
566
- {
567
- nbBits--;
568
- threshold >>= 1;
569
- }
570
-
571
- {
572
- if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
573
- {
574
- ip += bitCount>>3;
575
- bitCount &= 7;
576
- }
577
- else
578
- {
579
- bitCount -= (int)(8 * (iend - 4 - ip));
580
- ip = iend - 4;
581
- }
582
- bitStream = FSE_readLE32(ip) >> (bitCount & 31);
583
- }
584
- }
585
- }
586
- if (remaining != 1) return (size_t)-FSE_ERROR_GENERIC;
587
- *maxSVPtr = charnum-1;
588
-
589
- ip += (bitCount+7)>>3;
590
- if ((size_t)(ip-istart) > hbSize) return (size_t)-FSE_ERROR_srcSize_wrong;
591
- return ip-istart;
592
- }
593
-
594
-
595
- /*********************************************************
596
- * Decompression (Byte symbols)
597
- *********************************************************/
598
- static size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
599
- {
600
- void* ptr = dt;
601
- FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
602
- FSE_decode_t* const cell = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
603
-
604
- DTableH->tableLog = 0;
605
- DTableH->fastMode = 0;
606
-
607
- cell->newState = 0;
608
- cell->symbol = symbolValue;
609
- cell->nbBits = 0;
610
-
611
- return 0;
612
- }
613
-
614
-
615
- static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
616
- {
617
- void* ptr = dt;
618
- FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
619
- FSE_decode_t* const dinfo = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
620
- const unsigned tableSize = 1 << nbBits;
621
- const unsigned tableMask = tableSize - 1;
622
- const unsigned maxSymbolValue = tableMask;
623
- unsigned s;
624
-
625
- /* Sanity checks */
626
- if (nbBits < 1) return (size_t)-FSE_ERROR_GENERIC; /* min size */
627
-
628
- /* Build Decoding Table */
629
- DTableH->tableLog = (U16)nbBits;
630
- DTableH->fastMode = 1;
631
- for (s=0; s<=maxSymbolValue; s++)
632
- {
633
- dinfo[s].newState = 0;
634
- dinfo[s].symbol = (BYTE)s;
635
- dinfo[s].nbBits = (BYTE)nbBits;
636
- }
637
-
638
- return 0;
639
- }
640
-
641
-
642
- /* FSE_initDStream
643
- * Initialize a FSE_DStream_t.
644
- * srcBuffer must point at the beginning of an FSE block.
645
- * The function result is the size of the FSE_block (== srcSize).
646
- * If srcSize is too small, the function will return an errorCode;
647
- */
648
- static size_t FSE_initDStream(FSE_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
649
- {
650
- if (srcSize < 1) return (size_t)-FSE_ERROR_srcSize_wrong;
651
-
652
- if (srcSize >= sizeof(size_t))
653
- {
654
- U32 contain32;
655
- bitD->start = (const char*)srcBuffer;
656
- bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(size_t);
657
- bitD->bitContainer = FSE_readLEST(bitD->ptr);
658
- contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
659
- if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC; /* stop bit not present */
660
- bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
661
- }
662
- else
663
- {
664
- U32 contain32;
665
- bitD->start = (const char*)srcBuffer;
666
- bitD->ptr = bitD->start;
667
- bitD->bitContainer = *(const BYTE*)(bitD->start);
668
- switch(srcSize)
669
- {
670
- case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);
671
- /* fallthrough */
672
- case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);
673
- /* fallthrough */
674
- case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);
675
- /* fallthrough */
676
- case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
677
- /* fallthrough */
678
- case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
679
- /* fallthrough */
680
- case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
681
- /* fallthrough */
682
- default:;
683
- }
684
- contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
685
- if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC; /* stop bit not present */
686
- bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
687
- bitD->bitsConsumed += (U32)(sizeof(size_t) - srcSize)*8;
688
- }
689
-
690
- return srcSize;
691
- }
692
-
693
-
694
- /*!FSE_lookBits
695
- * Provides next n bits from the bitContainer.
696
- * bitContainer is not modified (bits are still present for next read/look)
697
- * On 32-bits, maxNbBits==25
698
- * On 64-bits, maxNbBits==57
699
- * return : value extracted.
700
- */
701
- static size_t FSE_lookBits(FSE_DStream_t* bitD, U32 nbBits)
702
- {
703
- const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
704
- return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
705
- }
706
-
707
- static size_t FSE_lookBitsFast(FSE_DStream_t* bitD, U32 nbBits) /* only if nbBits >= 1 !! */
708
- {
709
- const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
710
- return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
711
- }
712
-
713
- static void FSE_skipBits(FSE_DStream_t* bitD, U32 nbBits)
714
- {
715
- bitD->bitsConsumed += nbBits;
716
- }
717
-
718
-
719
- /*!FSE_readBits
720
- * Read next n bits from the bitContainer.
721
- * On 32-bits, don't read more than maxNbBits==25
722
- * On 64-bits, don't read more than maxNbBits==57
723
- * Use the fast variant *only* if n >= 1.
724
- * return : value extracted.
725
- */
726
- static size_t FSE_readBits(FSE_DStream_t* bitD, U32 nbBits)
727
- {
728
- size_t value = FSE_lookBits(bitD, nbBits);
729
- FSE_skipBits(bitD, nbBits);
730
- return value;
731
- }
732
-
733
- static size_t FSE_readBitsFast(FSE_DStream_t* bitD, U32 nbBits) /* only if nbBits >= 1 !! */
734
- {
735
- size_t value = FSE_lookBitsFast(bitD, nbBits);
736
- FSE_skipBits(bitD, nbBits);
737
- return value;
738
- }
739
-
740
- static unsigned FSE_reloadDStream(FSE_DStream_t* bitD)
741
- {
742
- if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
743
- return FSE_DStream_tooFar;
744
-
745
- if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
746
- {
747
- bitD->ptr -= bitD->bitsConsumed >> 3;
748
- bitD->bitsConsumed &= 7;
749
- bitD->bitContainer = FSE_readLEST(bitD->ptr);
750
- return FSE_DStream_unfinished;
751
- }
752
- if (bitD->ptr == bitD->start)
753
- {
754
- if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return FSE_DStream_endOfBuffer;
755
- return FSE_DStream_completed;
756
- }
757
- {
758
- U32 nbBytes = bitD->bitsConsumed >> 3;
759
- U32 result = FSE_DStream_unfinished;
760
- if (bitD->ptr - nbBytes < bitD->start)
761
- {
762
- nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */
763
- result = FSE_DStream_endOfBuffer;
764
- }
765
- bitD->ptr -= nbBytes;
766
- bitD->bitsConsumed -= nbBytes*8;
767
- bitD->bitContainer = FSE_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD) */
768
- return result;
769
- }
770
- }
771
-
772
-
773
- static void FSE_initDState(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD, const FSE_DTable* dt)
774
- {
775
- const void* ptr = dt;
776
- const FSE_DTableHeader* const DTableH = (const FSE_DTableHeader*)ptr;
777
- DStatePtr->state = FSE_readBits(bitD, DTableH->tableLog);
778
- FSE_reloadDStream(bitD);
779
- DStatePtr->table = dt + 1;
780
- }
781
-
782
- static BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
783
- {
784
- const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
785
- const U32 nbBits = DInfo.nbBits;
786
- BYTE symbol = DInfo.symbol;
787
- size_t lowBits = FSE_readBits(bitD, nbBits);
788
-
789
- DStatePtr->state = DInfo.newState + lowBits;
790
- return symbol;
791
- }
792
-
793
- static BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
794
- {
795
- const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
796
- const U32 nbBits = DInfo.nbBits;
797
- BYTE symbol = DInfo.symbol;
798
- size_t lowBits = FSE_readBitsFast(bitD, nbBits);
799
-
800
- DStatePtr->state = DInfo.newState + lowBits;
801
- return symbol;
802
- }
803
-
804
- /* FSE_endOfDStream
805
- Tells if bitD has reached end of bitStream or not */
806
-
807
- static unsigned FSE_endOfDStream(const FSE_DStream_t* bitD)
808
- {
809
- return ((bitD->ptr == bitD->start) && (bitD->bitsConsumed == sizeof(bitD->bitContainer)*8));
810
- }
811
-
812
- static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
813
- {
814
- return DStatePtr->state == 0;
815
- }
816
-
817
-
818
- FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
819
- void* dst, size_t maxDstSize,
820
- const void* cSrc, size_t cSrcSize,
821
- const FSE_DTable* dt, const unsigned fast)
822
- {
823
- BYTE* const ostart = (BYTE*) dst;
824
- BYTE* op = ostart;
825
- BYTE* const omax = op + maxDstSize;
826
- BYTE* const olimit = omax-3;
827
-
828
- FSE_DStream_t bitD;
829
- FSE_DState_t state1;
830
- FSE_DState_t state2;
831
- size_t errorCode;
832
-
833
- /* Init */
834
- errorCode = FSE_initDStream(&bitD, cSrc, cSrcSize); /* replaced last arg by maxCompressed Size */
835
- if (FSE_isError(errorCode)) return errorCode;
836
-
837
- FSE_initDState(&state1, &bitD, dt);
838
- FSE_initDState(&state2, &bitD, dt);
839
-
840
- #define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
841
-
842
- /* 4 symbols per loop */
843
- for ( ; (FSE_reloadDStream(&bitD)==FSE_DStream_unfinished) && (op<olimit) ; op+=4)
844
- {
845
- op[0] = FSE_GETSYMBOL(&state1);
846
-
847
- if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
848
- FSE_reloadDStream(&bitD);
849
-
850
- op[1] = FSE_GETSYMBOL(&state2);
851
-
852
- if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
853
- { if (FSE_reloadDStream(&bitD) > FSE_DStream_unfinished) { op+=2; break; } }
854
-
855
- op[2] = FSE_GETSYMBOL(&state1);
856
-
857
- if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
858
- FSE_reloadDStream(&bitD);
859
-
860
- op[3] = FSE_GETSYMBOL(&state2);
861
- }
862
-
863
- /* tail */
864
- /* note : FSE_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly FSE_DStream_completed */
865
- while (1)
866
- {
867
- if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state1))) )
868
- break;
869
-
870
- *op++ = FSE_GETSYMBOL(&state1);
871
-
872
- if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state2))) )
873
- break;
874
-
875
- *op++ = FSE_GETSYMBOL(&state2);
876
- }
877
-
878
- /* end ? */
879
- if (FSE_endOfDStream(&bitD) && FSE_endOfDState(&state1) && FSE_endOfDState(&state2))
880
- return op-ostart;
881
-
882
- if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall; /* dst buffer is full, but cSrc unfinished */
883
-
884
- return (size_t)-FSE_ERROR_corruptionDetected;
885
- }
886
-
887
-
888
- static size_t FSE_decompress_usingDTable(void* dst, size_t originalSize,
889
- const void* cSrc, size_t cSrcSize,
890
- const FSE_DTable* dt)
891
- {
892
- FSE_DTableHeader DTableH;
893
- memcpy(&DTableH, dt, sizeof(DTableH)); /* memcpy() into local variable, to avoid strict aliasing warning */
894
-
895
- /* select fast mode (static) */
896
- if (DTableH.fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
897
- return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
898
- }
899
-
900
-
901
- static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
902
- {
903
- const BYTE* const istart = (const BYTE*)cSrc;
904
- const BYTE* ip = istart;
905
- short counting[FSE_MAX_SYMBOL_VALUE+1];
906
- DTable_max_t dt; /* Static analyzer seems unable to understand this table will be properly initialized later */
907
- unsigned tableLog;
908
- unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
909
- size_t errorCode;
910
-
911
- if (cSrcSize<2) return (size_t)-FSE_ERROR_srcSize_wrong; /* too small input size */
912
-
913
- /* normal FSE decoding mode */
914
- errorCode = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
915
- if (FSE_isError(errorCode)) return errorCode;
916
- if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong; /* too small input size */
917
- ip += errorCode;
918
- cSrcSize -= errorCode;
919
-
920
- errorCode = FSE_buildDTable (dt, counting, maxSymbolValue, tableLog);
921
- if (FSE_isError(errorCode)) return errorCode;
922
-
923
- /* always return, even if it is an error code */
924
- return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);
925
- }
926
-
927
-
928
-
929
- /* *******************************************************
930
- * Huff0 : Huffman block compression
931
- *********************************************************/
932
- #define HUF_MAX_SYMBOL_VALUE 255
933
- #define HUF_DEFAULT_TABLELOG 12 /* used by default, when not specified */
934
- #define HUF_MAX_TABLELOG 12 /* max possible tableLog; for allocation purpose; can be modified */
935
- #define HUF_ABSOLUTEMAX_TABLELOG 16 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
936
- #if (HUF_MAX_TABLELOG > HUF_ABSOLUTEMAX_TABLELOG)
937
- # error "HUF_MAX_TABLELOG is too large !"
938
- #endif
939
-
940
- typedef struct HUF_CElt_s {
941
- U16 val;
942
- BYTE nbBits;
943
- } HUF_CElt ;
944
-
945
- typedef struct nodeElt_s {
946
- U32 count;
947
- U16 parent;
948
- BYTE byte;
949
- BYTE nbBits;
950
- } nodeElt;
951
-
952
-
953
- /* *******************************************************
954
- * Huff0 : Huffman block decompression
955
- *********************************************************/
956
- typedef struct {
957
- BYTE byte;
958
- BYTE nbBits;
959
- } HUF_DElt;
960
-
961
- static size_t HUF_readDTable (U16* DTable, const void* src, size_t srcSize)
962
- {
963
- BYTE huffWeight[HUF_MAX_SYMBOL_VALUE + 1];
964
- U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1]; /* large enough for values from 0 to 16 */
965
- U32 weightTotal;
966
- U32 maxBits;
967
- const BYTE* ip = (const BYTE*) src;
968
- size_t iSize;
969
- size_t oSize;
970
- U32 n;
971
- U32 nextRankStart;
972
- void* ptr = DTable+1;
973
- HUF_DElt* const dt = (HUF_DElt*)ptr;
974
-
975
- if (!srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
976
- iSize = ip[0];
977
-
978
- FSE_STATIC_ASSERT(sizeof(HUF_DElt) == sizeof(U16)); /* if compilation fails here, assertion is false */
979
- //memset(huffWeight, 0, sizeof(huffWeight)); /* should not be necessary, but some analyzer complain ... */
980
- if (iSize >= 128) /* special header */
981
- {
982
- if (iSize >= (242)) /* RLE */
983
- {
984
- static int l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
985
- oSize = l[iSize-242];
986
- memset(huffWeight, 1, sizeof(huffWeight));
987
- iSize = 0;
988
- }
989
- else /* Incompressible */
990
- {
991
- oSize = iSize - 127;
992
- iSize = ((oSize+1)/2);
993
- if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
994
- ip += 1;
995
- for (n=0; n<oSize; n+=2)
996
- {
997
- huffWeight[n] = ip[n/2] >> 4;
998
- huffWeight[n+1] = ip[n/2] & 15;
999
- }
1000
- }
1001
- }
1002
- else /* header compressed with FSE (normal case) */
1003
- {
1004
- if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1005
- oSize = FSE_decompress(huffWeight, HUF_MAX_SYMBOL_VALUE, ip+1, iSize); /* max 255 values decoded, last one is implied */
1006
- if (FSE_isError(oSize)) return oSize;
1007
- }
1008
-
1009
- /* collect weight stats */
1010
- memset(rankVal, 0, sizeof(rankVal));
1011
- weightTotal = 0;
1012
- for (n=0; n<oSize; n++)
1013
- {
1014
- if (huffWeight[n] >= HUF_ABSOLUTEMAX_TABLELOG) return (size_t)-FSE_ERROR_corruptionDetected;
1015
- rankVal[huffWeight[n]]++;
1016
- weightTotal += (1 << huffWeight[n]) >> 1;
1017
- }
1018
- if (weightTotal == 0) return (size_t)-FSE_ERROR_corruptionDetected;
1019
-
1020
- /* get last non-null symbol weight (implied, total must be 2^n) */
1021
- maxBits = FSE_highbit32(weightTotal) + 1;
1022
- if (maxBits > DTable[0]) return (size_t)-FSE_ERROR_tableLog_tooLarge; /* DTable is too small */
1023
- DTable[0] = (U16)maxBits;
1024
- {
1025
- U32 total = 1 << maxBits;
1026
- U32 rest = total - weightTotal;
1027
- U32 verif = 1 << FSE_highbit32(rest);
1028
- U32 lastWeight = FSE_highbit32(rest) + 1;
1029
- if (verif != rest) return (size_t)-FSE_ERROR_corruptionDetected; /* last value must be a clean power of 2 */
1030
- huffWeight[oSize] = (BYTE)lastWeight;
1031
- rankVal[lastWeight]++;
1032
- }
1033
-
1034
- /* check tree construction validity */
1035
- if ((rankVal[1] < 2) || (rankVal[1] & 1)) return (size_t)-FSE_ERROR_corruptionDetected; /* by construction : at least 2 elts of rank 1, must be even */
1036
-
1037
- /* Prepare ranks */
1038
- nextRankStart = 0;
1039
- for (n=1; n<=maxBits; n++)
1040
- {
1041
- U32 current = nextRankStart;
1042
- nextRankStart += (rankVal[n] << (n-1));
1043
- rankVal[n] = current;
1044
- }
1045
-
1046
- /* fill DTable */
1047
- for (n=0; n<=oSize; n++)
1048
- {
1049
- const U32 w = huffWeight[n];
1050
- const U32 length = (1 << w) >> 1;
1051
- U32 i;
1052
- HUF_DElt D;
1053
- D.byte = (BYTE)n; D.nbBits = (BYTE)(maxBits + 1 - w);
1054
- for (i = rankVal[w]; i < rankVal[w] + length; i++)
1055
- dt[i] = D;
1056
- rankVal[w] += length;
1057
- }
1058
-
1059
- return iSize+1;
1060
- }
1061
-
1062
-
1063
- static BYTE HUF_decodeSymbol(FSE_DStream_t* Dstream, const HUF_DElt* dt, const U32 dtLog)
1064
- {
1065
- const size_t val = FSE_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
1066
- const BYTE c = dt[val].byte;
1067
- FSE_skipBits(Dstream, dt[val].nbBits);
1068
- return c;
1069
- }
1070
-
1071
- static size_t HUF_decompress_usingDTable( /* -3% slower when non static */
1072
- void* dst, size_t maxDstSize,
1073
- const void* cSrc, size_t cSrcSize,
1074
- const U16* DTable)
1075
- {
1076
- if (cSrcSize < 6) return (size_t)-FSE_ERROR_srcSize_wrong;
1077
- {
1078
- BYTE* const ostart = (BYTE*) dst;
1079
- BYTE* op = ostart;
1080
- BYTE* const omax = op + maxDstSize;
1081
- BYTE* const olimit = maxDstSize < 15 ? op : omax-15;
1082
-
1083
- const void* ptr = DTable;
1084
- const HUF_DElt* const dt = (const HUF_DElt*)(ptr)+1;
1085
- const U32 dtLog = DTable[0];
1086
- size_t errorCode;
1087
- U32 reloadStatus;
1088
-
1089
- /* Init */
1090
-
1091
- const U16* jumpTable = (const U16*)cSrc;
1092
- const size_t length1 = FSE_readLE16(jumpTable);
1093
- const size_t length2 = FSE_readLE16(jumpTable+1);
1094
- const size_t length3 = FSE_readLE16(jumpTable+2);
1095
- const size_t length4 = cSrcSize - 6 - length1 - length2 - length3; /* check coherency !! */
1096
- const char* const start1 = (const char*)(cSrc) + 6;
1097
- const char* const start2 = start1 + length1;
1098
- const char* const start3 = start2 + length2;
1099
- const char* const start4 = start3 + length3;
1100
- FSE_DStream_t bitD1, bitD2, bitD3, bitD4;
1101
-
1102
- if (length1+length2+length3+6 >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1103
-
1104
- errorCode = FSE_initDStream(&bitD1, start1, length1);
1105
- if (FSE_isError(errorCode)) return errorCode;
1106
- errorCode = FSE_initDStream(&bitD2, start2, length2);
1107
- if (FSE_isError(errorCode)) return errorCode;
1108
- errorCode = FSE_initDStream(&bitD3, start3, length3);
1109
- if (FSE_isError(errorCode)) return errorCode;
1110
- errorCode = FSE_initDStream(&bitD4, start4, length4);
1111
- if (FSE_isError(errorCode)) return errorCode;
1112
-
1113
- reloadStatus=FSE_reloadDStream(&bitD2);
1114
-
1115
- /* 16 symbols per loop */
1116
- for ( ; (reloadStatus<FSE_DStream_completed) && (op<olimit); /* D2-3-4 are supposed to be synchronized and finish together */
1117
- op+=16, reloadStatus = FSE_reloadDStream(&bitD2) | FSE_reloadDStream(&bitD3) | FSE_reloadDStream(&bitD4), FSE_reloadDStream(&bitD1))
1118
- {
1119
- #define HUF_DECODE_SYMBOL_0(n, Dstream) \
1120
- op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog);
1121
-
1122
- #define HUF_DECODE_SYMBOL_1(n, Dstream) \
1123
- op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1124
- if (FSE_32bits() && (HUF_MAX_TABLELOG>12)) FSE_reloadDStream(&Dstream)
1125
-
1126
- #define HUF_DECODE_SYMBOL_2(n, Dstream) \
1127
- op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1128
- if (FSE_32bits()) FSE_reloadDStream(&Dstream)
1129
-
1130
- HUF_DECODE_SYMBOL_1( 0, bitD1);
1131
- HUF_DECODE_SYMBOL_1( 1, bitD2);
1132
- HUF_DECODE_SYMBOL_1( 2, bitD3);
1133
- HUF_DECODE_SYMBOL_1( 3, bitD4);
1134
- HUF_DECODE_SYMBOL_2( 4, bitD1);
1135
- HUF_DECODE_SYMBOL_2( 5, bitD2);
1136
- HUF_DECODE_SYMBOL_2( 6, bitD3);
1137
- HUF_DECODE_SYMBOL_2( 7, bitD4);
1138
- HUF_DECODE_SYMBOL_1( 8, bitD1);
1139
- HUF_DECODE_SYMBOL_1( 9, bitD2);
1140
- HUF_DECODE_SYMBOL_1(10, bitD3);
1141
- HUF_DECODE_SYMBOL_1(11, bitD4);
1142
- HUF_DECODE_SYMBOL_0(12, bitD1);
1143
- HUF_DECODE_SYMBOL_0(13, bitD2);
1144
- HUF_DECODE_SYMBOL_0(14, bitD3);
1145
- HUF_DECODE_SYMBOL_0(15, bitD4);
1146
- }
1147
-
1148
- if (reloadStatus!=FSE_DStream_completed) /* not complete : some bitStream might be FSE_DStream_unfinished */
1149
- return (size_t)-FSE_ERROR_corruptionDetected;
1150
-
1151
- /* tail */
1152
- {
1153
- /* bitTail = bitD1; */ /* *much* slower : -20% !??! */
1154
- FSE_DStream_t bitTail;
1155
- bitTail.ptr = bitD1.ptr;
1156
- bitTail.bitsConsumed = bitD1.bitsConsumed;
1157
- bitTail.bitContainer = bitD1.bitContainer; /* required in case of FSE_DStream_endOfBuffer */
1158
- bitTail.start = start1;
1159
- for ( ; (FSE_reloadDStream(&bitTail) < FSE_DStream_completed) && (op<omax) ; op++)
1160
- {
1161
- HUF_DECODE_SYMBOL_0(0, bitTail);
1162
- }
1163
-
1164
- if (FSE_endOfDStream(&bitTail))
1165
- return op-ostart;
1166
- }
1167
-
1168
- if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall; /* dst buffer is full, but cSrc unfinished */
1169
-
1170
- return (size_t)-FSE_ERROR_corruptionDetected;
1171
- }
1172
- }
1173
-
1174
-
1175
- static size_t HUF_decompress (void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1176
- {
1177
- HUF_CREATE_STATIC_DTABLE(DTable, HUF_MAX_TABLELOG);
1178
- const BYTE* ip = (const BYTE*) cSrc;
1179
- size_t errorCode;
1180
-
1181
- errorCode = HUF_readDTable (DTable, cSrc, cSrcSize);
1182
- if (FSE_isError(errorCode)) return errorCode;
1183
- if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1184
- ip += errorCode;
1185
- cSrcSize -= errorCode;
1186
-
1187
- return HUF_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, DTable);
1188
- }
1189
-
1190
-
1191
- #endif /* FSE_COMMONDEFS_ONLY */
1192
-
1193
- /*
1194
- zstd - standard compression library
1195
- Copyright (C) 2014-2015, Yann Collet.
1196
-
1197
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1198
-
1199
- Redistribution and use in source and binary forms, with or without
1200
- modification, are permitted provided that the following conditions are
1201
- met:
1202
- * Redistributions of source code must retain the above copyright
1203
- notice, this list of conditions and the following disclaimer.
1204
- * Redistributions in binary form must reproduce the above
1205
- copyright notice, this list of conditions and the following disclaimer
1206
- in the documentation and/or other materials provided with the
1207
- distribution.
1208
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1209
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1210
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1211
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1212
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1213
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1214
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1215
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1216
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1217
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1218
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1219
-
1220
- You can contact the author at :
1221
- - zstd source repository : https://github.com/Cyan4973/zstd
1222
- - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
1223
- */
1224
-
1225
- /****************************************************************
1226
- * Tuning parameters
1227
- *****************************************************************/
1228
- /* MEMORY_USAGE :
1229
- * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
1230
- * Increasing memory usage improves compression ratio
1231
- * Reduced memory usage can improve speed, due to cache effect */
1232
- #define ZSTD_MEMORY_USAGE 17
1233
-
1234
-
1235
- /**************************************
1236
- CPU Feature Detection
1237
- **************************************/
1238
- /*
1239
- * Automated efficient unaligned memory access detection
1240
- * Based on known hardware architectures
1241
- * This list will be updated thanks to feedbacks
1242
- */
1243
- #if defined(CPU_HAS_EFFICIENT_UNALIGNED_MEMORY_ACCESS) \
1244
- || defined(__ARM_FEATURE_UNALIGNED) \
1245
- || defined(__i386__) || defined(__x86_64__) \
1246
- || defined(_M_IX86) || defined(_M_X64) \
1247
- || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__) \
1248
- || (defined(_M_ARM) && (_M_ARM >= 7))
1249
- # define ZSTD_UNALIGNED_ACCESS 1
1250
- #else
1251
- # define ZSTD_UNALIGNED_ACCESS 0
1252
- #endif
1253
-
1254
-
1255
- /********************************************************
1256
- * Includes
1257
- *********************************************************/
1258
- #include <stdlib.h> /* calloc */
1259
- #include <string.h> /* memcpy, memmove */
1260
- #include <stdio.h> /* debug : printf */
1261
-
1262
-
1263
- /********************************************************
1264
- * Compiler specifics
1265
- *********************************************************/
1266
- #ifdef __AVX2__
1267
- # include <immintrin.h> /* AVX2 intrinsics */
1268
- #endif
1269
-
1270
- #ifdef _MSC_VER /* Visual Studio */
1271
- # include <intrin.h> /* For Visual 2005 */
1272
- # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
1273
- # pragma warning(disable : 4324) /* disable: C4324: padded structure */
1274
- #endif
1275
-
1276
-
1277
- #ifndef MEM_ACCESS_MODULE
1278
- #define MEM_ACCESS_MODULE
1279
- /********************************************************
1280
- * Basic Types
1281
- *********************************************************/
1282
- #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
1283
- # include <stdint.h>
1284
- typedef uint8_t BYTE;
1285
- typedef uint16_t U16;
1286
- typedef int16_t S16;
1287
- typedef uint32_t U32;
1288
- typedef int32_t S32;
1289
- typedef uint64_t U64;
1290
- #else
1291
- typedef unsigned char BYTE;
1292
- typedef unsigned short U16;
1293
- typedef signed short S16;
1294
- typedef unsigned int U32;
1295
- typedef signed int S32;
1296
- typedef unsigned long long U64;
1297
- #endif
1298
-
1299
- #endif /* MEM_ACCESS_MODULE */
1300
-
1301
-
1302
- /********************************************************
1303
- * Constants
1304
- *********************************************************/
1305
- static const U32 ZSTD_magicNumber = 0xFD2FB51E; /* 3rd version : seqNb header */
1306
-
1307
- #define HASH_LOG (ZSTD_MEMORY_USAGE - 2)
1308
- #define HASH_TABLESIZE (1 << HASH_LOG)
1309
- #define HASH_MASK (HASH_TABLESIZE - 1)
1310
-
1311
- #define KNUTH 2654435761
1312
-
1313
- #define BIT7 128
1314
- #define BIT6 64
1315
- #define BIT5 32
1316
- #define BIT4 16
1317
-
1318
- #define KB *(1 <<10)
1319
- #define MB *(1 <<20)
1320
- #define GB *(1U<<30)
1321
-
1322
- #define BLOCKSIZE (128 KB) /* define, for static allocation */
1323
-
1324
- #define WORKPLACESIZE (BLOCKSIZE*3)
1325
- #define MINMATCH 4
1326
- #define MLbits 7
1327
- #define LLbits 6
1328
- #define Offbits 5
1329
- #define MaxML ((1<<MLbits )-1)
1330
- #define MaxLL ((1<<LLbits )-1)
1331
- #define MaxOff ((1<<Offbits)-1)
1332
- #define LitFSELog 11
1333
- #define MLFSELog 10
1334
- #define LLFSELog 10
1335
- #define OffFSELog 9
1336
- #define MAX(a,b) ((a)<(b)?(b):(a))
1337
- #define MaxSeq MAX(MaxLL, MaxML)
1338
-
1339
- #define LITERAL_NOENTROPY 63
1340
- #define COMMAND_NOENTROPY 7 /* to remove */
1341
-
1342
- #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
1343
-
1344
- static const size_t ZSTD_blockHeaderSize = 3;
1345
- static const size_t ZSTD_frameHeaderSize = 4;
1346
-
1347
-
1348
- /********************************************************
1349
- * Memory operations
1350
- *********************************************************/
1351
- static unsigned ZSTD_32bits(void) { return sizeof(void*)==4; }
1352
-
1353
- static unsigned ZSTD_isLittleEndian(void)
1354
- {
1355
- const union { U32 i; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
1356
- return one.c[0];
1357
- }
1358
-
1359
- static U16 ZSTD_read16(const void* p) { U16 r; memcpy(&r, p, sizeof(r)); return r; }
1360
-
1361
- static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
1362
-
1363
- static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
1364
-
1365
- #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
1366
-
1367
- static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
1368
- {
1369
- const BYTE* ip = (const BYTE*)src;
1370
- BYTE* op = (BYTE*)dst;
1371
- BYTE* const oend = op + length;
1372
- while (op < oend) COPY8(op, ip);
1373
- }
1374
-
1375
- static U16 ZSTD_readLE16(const void* memPtr)
1376
- {
1377
- if (ZSTD_isLittleEndian()) return ZSTD_read16(memPtr);
1378
- else
1379
- {
1380
- const BYTE* p = (const BYTE*)memPtr;
1381
- return (U16)((U16)p[0] + ((U16)p[1]<<8));
1382
- }
1383
- }
1384
-
1385
- static U32 ZSTD_readLE24(const void* memPtr)
1386
- {
1387
- return ZSTD_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
1388
- }
1389
-
1390
- static U32 ZSTD_readBE32(const void* memPtr)
1391
- {
1392
- const BYTE* p = (const BYTE*)memPtr;
1393
- return (U32)(((U32)p[0]<<24) + ((U32)p[1]<<16) + ((U32)p[2]<<8) + ((U32)p[3]<<0));
1394
- }
1395
-
1396
-
1397
- /**************************************
1398
- * Local structures
1399
- ***************************************/
1400
- typedef struct ZSTD_Cctx_s ZSTD_Cctx;
1401
-
1402
- typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
1403
-
1404
- typedef struct
1405
- {
1406
- blockType_t blockType;
1407
- U32 origSize;
1408
- } blockProperties_t;
1409
-
1410
- typedef struct {
1411
- void* buffer;
1412
- U32* offsetStart;
1413
- U32* offset;
1414
- BYTE* offCodeStart;
1415
- BYTE* offCode;
1416
- BYTE* litStart;
1417
- BYTE* lit;
1418
- BYTE* litLengthStart;
1419
- BYTE* litLength;
1420
- BYTE* matchLengthStart;
1421
- BYTE* matchLength;
1422
- BYTE* dumpsStart;
1423
- BYTE* dumps;
1424
- } seqStore_t;
1425
-
1426
-
1427
- typedef struct ZSTD_Cctx_s
1428
- {
1429
- const BYTE* base;
1430
- U32 current;
1431
- U32 nextUpdate;
1432
- seqStore_t seqStore;
1433
- #ifdef __AVX2__
1434
- __m256i hashTable[HASH_TABLESIZE>>3];
1435
- #else
1436
- U32 hashTable[HASH_TABLESIZE];
1437
- #endif
1438
- BYTE buffer[WORKPLACESIZE];
1439
- } cctxi_t;
1440
-
1441
-
1442
-
1443
-
1444
- /**************************************
1445
- * Error Management
1446
- **************************************/
1447
- /* published entry point */
1448
- unsigned ZSTDv01_isError(size_t code) { return ERR_isError(code); }
1449
-
1450
-
1451
- /**************************************
1452
- * Tool functions
1453
- **************************************/
1454
- #define ZSTD_VERSION_MAJOR 0 /* for breaking interface changes */
1455
- #define ZSTD_VERSION_MINOR 1 /* for new (non-breaking) interface capabilities */
1456
- #define ZSTD_VERSION_RELEASE 3 /* for tweaks, bug-fixes, or development */
1457
- #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
1458
-
1459
- /**************************************************************
1460
- * Decompression code
1461
- **************************************************************/
1462
-
1463
- static size_t ZSTDv01_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
1464
- {
1465
- const BYTE* const in = (const BYTE* const)src;
1466
- BYTE headerFlags;
1467
- U32 cSize;
1468
-
1469
- if (srcSize < 3) return ERROR(srcSize_wrong);
1470
-
1471
- headerFlags = *in;
1472
- cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
1473
-
1474
- bpPtr->blockType = (blockType_t)(headerFlags >> 6);
1475
- bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
1476
-
1477
- if (bpPtr->blockType == bt_end) return 0;
1478
- if (bpPtr->blockType == bt_rle) return 1;
1479
- return cSize;
1480
- }
1481
-
1482
-
1483
- static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1484
- {
1485
- if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
1486
- if (srcSize > 0) {
1487
- memcpy(dst, src, srcSize);
1488
- }
1489
- return srcSize;
1490
- }
1491
-
1492
-
1493
- static size_t ZSTD_decompressLiterals(void* ctx,
1494
- void* dst, size_t maxDstSize,
1495
- const void* src, size_t srcSize)
1496
- {
1497
- BYTE* op = (BYTE*)dst;
1498
- BYTE* const oend = op + maxDstSize;
1499
- const BYTE* ip = (const BYTE*)src;
1500
- size_t errorCode;
1501
- size_t litSize;
1502
-
1503
- /* check : minimum 2, for litSize, +1, for content */
1504
- if (srcSize <= 3) return ERROR(corruption_detected);
1505
-
1506
- litSize = ip[1] + (ip[0]<<8);
1507
- litSize += ((ip[-3] >> 3) & 7) << 16; /* mmmmh.... */
1508
- op = oend - litSize;
1509
-
1510
- (void)ctx;
1511
- if (litSize > maxDstSize) return ERROR(dstSize_tooSmall);
1512
- errorCode = HUF_decompress(op, litSize, ip+2, srcSize-2);
1513
- if (FSE_isError(errorCode)) return ERROR(GENERIC);
1514
- return litSize;
1515
- }
1516
-
1517
-
1518
- static size_t ZSTDv01_decodeLiteralsBlock(void* ctx,
1519
- void* dst, size_t maxDstSize,
1520
- const BYTE** litStart, size_t* litSize,
1521
- const void* src, size_t srcSize)
1522
- {
1523
- const BYTE* const istart = (const BYTE* const)src;
1524
- const BYTE* ip = istart;
1525
- BYTE* const ostart = (BYTE* const)dst;
1526
- BYTE* const oend = ostart + maxDstSize;
1527
- blockProperties_t litbp;
1528
-
1529
- size_t litcSize = ZSTDv01_getcBlockSize(src, srcSize, &litbp);
1530
- if (ZSTDv01_isError(litcSize)) return litcSize;
1531
- if (litcSize > srcSize - ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1532
- ip += ZSTD_blockHeaderSize;
1533
-
1534
- switch(litbp.blockType)
1535
- {
1536
- case bt_raw:
1537
- *litStart = ip;
1538
- ip += litcSize;
1539
- *litSize = litcSize;
1540
- break;
1541
- case bt_rle:
1542
- {
1543
- size_t rleSize = litbp.origSize;
1544
- if (rleSize>maxDstSize) return ERROR(dstSize_tooSmall);
1545
- if (!srcSize) return ERROR(srcSize_wrong);
1546
- if (rleSize > 0) {
1547
- memset(oend - rleSize, *ip, rleSize);
1548
- }
1549
- *litStart = oend - rleSize;
1550
- *litSize = rleSize;
1551
- ip++;
1552
- break;
1553
- }
1554
- case bt_compressed:
1555
- {
1556
- size_t decodedLitSize = ZSTD_decompressLiterals(ctx, dst, maxDstSize, ip, litcSize);
1557
- if (ZSTDv01_isError(decodedLitSize)) return decodedLitSize;
1558
- *litStart = oend - decodedLitSize;
1559
- *litSize = decodedLitSize;
1560
- ip += litcSize;
1561
- break;
1562
- }
1563
- case bt_end:
1564
- default:
1565
- return ERROR(GENERIC);
1566
- }
1567
-
1568
- return ip-istart;
1569
- }
1570
-
1571
-
1572
- static size_t ZSTDv01_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
1573
- FSE_DTable* DTableLL, FSE_DTable* DTableML, FSE_DTable* DTableOffb,
1574
- const void* src, size_t srcSize)
1575
- {
1576
- const BYTE* const istart = (const BYTE* const)src;
1577
- const BYTE* ip = istart;
1578
- const BYTE* const iend = istart + srcSize;
1579
- U32 LLtype, Offtype, MLtype;
1580
- U32 LLlog, Offlog, MLlog;
1581
- size_t dumpsLength;
1582
-
1583
- /* check */
1584
- if (srcSize < 5) return ERROR(srcSize_wrong);
1585
-
1586
- /* SeqHead */
1587
- *nbSeq = ZSTD_readLE16(ip); ip+=2;
1588
- LLtype = *ip >> 6;
1589
- Offtype = (*ip >> 4) & 3;
1590
- MLtype = (*ip >> 2) & 3;
1591
- if (*ip & 2)
1592
- {
1593
- dumpsLength = ip[2];
1594
- dumpsLength += ip[1] << 8;
1595
- ip += 3;
1596
- }
1597
- else
1598
- {
1599
- dumpsLength = ip[1];
1600
- dumpsLength += (ip[0] & 1) << 8;
1601
- ip += 2;
1602
- }
1603
- *dumpsPtr = ip;
1604
- ip += dumpsLength;
1605
- *dumpsLengthPtr = dumpsLength;
1606
-
1607
- /* check */
1608
- if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
1609
-
1610
- /* sequences */
1611
- {
1612
- S16 norm[MaxML+1]; /* assumption : MaxML >= MaxLL and MaxOff */
1613
- size_t headerSize;
1614
-
1615
- /* Build DTables */
1616
- switch(LLtype)
1617
- {
1618
- case bt_rle :
1619
- LLlog = 0;
1620
- FSE_buildDTable_rle(DTableLL, *ip++); break;
1621
- case bt_raw :
1622
- LLlog = LLbits;
1623
- FSE_buildDTable_raw(DTableLL, LLbits); break;
1624
- default :
1625
- { U32 max = MaxLL;
1626
- headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
1627
- if (FSE_isError(headerSize)) return ERROR(GENERIC);
1628
- if (LLlog > LLFSELog) return ERROR(corruption_detected);
1629
- ip += headerSize;
1630
- FSE_buildDTable(DTableLL, norm, max, LLlog);
1631
- } }
1632
-
1633
- switch(Offtype)
1634
- {
1635
- case bt_rle :
1636
- Offlog = 0;
1637
- if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1638
- FSE_buildDTable_rle(DTableOffb, *ip++); break;
1639
- case bt_raw :
1640
- Offlog = Offbits;
1641
- FSE_buildDTable_raw(DTableOffb, Offbits); break;
1642
- default :
1643
- { U32 max = MaxOff;
1644
- headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
1645
- if (FSE_isError(headerSize)) return ERROR(GENERIC);
1646
- if (Offlog > OffFSELog) return ERROR(corruption_detected);
1647
- ip += headerSize;
1648
- FSE_buildDTable(DTableOffb, norm, max, Offlog);
1649
- } }
1650
-
1651
- switch(MLtype)
1652
- {
1653
- case bt_rle :
1654
- MLlog = 0;
1655
- if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1656
- FSE_buildDTable_rle(DTableML, *ip++); break;
1657
- case bt_raw :
1658
- MLlog = MLbits;
1659
- FSE_buildDTable_raw(DTableML, MLbits); break;
1660
- default :
1661
- { U32 max = MaxML;
1662
- headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
1663
- if (FSE_isError(headerSize)) return ERROR(GENERIC);
1664
- if (MLlog > MLFSELog) return ERROR(corruption_detected);
1665
- ip += headerSize;
1666
- FSE_buildDTable(DTableML, norm, max, MLlog);
1667
- } } }
1668
-
1669
- return ip-istart;
1670
- }
1671
-
1672
-
1673
- typedef struct {
1674
- size_t litLength;
1675
- size_t offset;
1676
- size_t matchLength;
1677
- } seq_t;
1678
-
1679
- typedef struct {
1680
- FSE_DStream_t DStream;
1681
- FSE_DState_t stateLL;
1682
- FSE_DState_t stateOffb;
1683
- FSE_DState_t stateML;
1684
- size_t prevOffset;
1685
- const BYTE* dumps;
1686
- const BYTE* dumpsEnd;
1687
- } seqState_t;
1688
-
1689
-
1690
- static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
1691
- {
1692
- size_t litLength;
1693
- size_t prevOffset;
1694
- size_t offset;
1695
- size_t matchLength;
1696
- const BYTE* dumps = seqState->dumps;
1697
- const BYTE* const de = seqState->dumpsEnd;
1698
-
1699
- /* Literal length */
1700
- litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
1701
- prevOffset = litLength ? seq->offset : seqState->prevOffset;
1702
- seqState->prevOffset = seq->offset;
1703
- if (litLength == MaxLL)
1704
- {
1705
- const U32 add = dumps<de ? *dumps++ : 0;
1706
- if (add < 255) litLength += add;
1707
- else
1708
- {
1709
- if (dumps<=(de-3))
1710
- {
1711
- litLength = ZSTD_readLE24(dumps);
1712
- dumps += 3;
1713
- }
1714
- }
1715
- }
1716
-
1717
- /* Offset */
1718
- {
1719
- U32 offsetCode, nbBits;
1720
- offsetCode = FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream));
1721
- if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1722
- nbBits = offsetCode - 1;
1723
- if (offsetCode==0) nbBits = 0; /* cmove */
1724
- offset = ((size_t)1 << (nbBits & ((sizeof(offset)*8)-1))) + FSE_readBits(&(seqState->DStream), nbBits);
1725
- if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1726
- if (offsetCode==0) offset = prevOffset;
1727
- }
1728
-
1729
- /* MatchLength */
1730
- matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
1731
- if (matchLength == MaxML)
1732
- {
1733
- const U32 add = dumps<de ? *dumps++ : 0;
1734
- if (add < 255) matchLength += add;
1735
- else
1736
- {
1737
- if (dumps<=(de-3))
1738
- {
1739
- matchLength = ZSTD_readLE24(dumps);
1740
- dumps += 3;
1741
- }
1742
- }
1743
- }
1744
- matchLength += MINMATCH;
1745
-
1746
- /* save result */
1747
- seq->litLength = litLength;
1748
- seq->offset = offset;
1749
- seq->matchLength = matchLength;
1750
- seqState->dumps = dumps;
1751
- }
1752
-
1753
-
1754
- static size_t ZSTD_execSequence(BYTE* op,
1755
- seq_t sequence,
1756
- const BYTE** litPtr, const BYTE* const litLimit,
1757
- BYTE* const base, BYTE* const oend)
1758
- {
1759
- static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
1760
- static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
1761
- const BYTE* const ostart = op;
1762
- const size_t litLength = sequence.litLength;
1763
- BYTE* const endMatch = op + litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
1764
- const BYTE* const litEnd = *litPtr + litLength;
1765
-
1766
- /* check */
1767
- if (endMatch > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
1768
- if (litEnd > litLimit) return ERROR(corruption_detected);
1769
- if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall); /* overwrite literal segment */
1770
-
1771
- /* copy Literals */
1772
- if (((size_t)(*litPtr - op) < 8) || ((size_t)(oend-litEnd) < 8) || (op+litLength > oend-8))
1773
- memmove(op, *litPtr, litLength); /* overwrite risk */
1774
- else
1775
- ZSTD_wildcopy(op, *litPtr, litLength);
1776
- op += litLength;
1777
- *litPtr = litEnd; /* update for next sequence */
1778
-
1779
- /* check : last match must be at a minimum distance of 8 from end of dest buffer */
1780
- if (oend-op < 8) return ERROR(dstSize_tooSmall);
1781
-
1782
- /* copy Match */
1783
- {
1784
- const U32 overlapRisk = (((size_t)(litEnd - endMatch)) < 12);
1785
- const BYTE* match = op - sequence.offset; /* possible underflow at op - offset ? */
1786
- size_t qutt = 12;
1787
- U64 saved[2];
1788
-
1789
- /* check */
1790
- if (match < base) return ERROR(corruption_detected);
1791
- if (sequence.offset > (size_t)base) return ERROR(corruption_detected);
1792
-
1793
- /* save beginning of literal sequence, in case of write overlap */
1794
- if (overlapRisk)
1795
- {
1796
- if ((endMatch + qutt) > oend) qutt = oend-endMatch;
1797
- memcpy(saved, endMatch, qutt);
1798
- }
1799
-
1800
- if (sequence.offset < 8)
1801
- {
1802
- const int dec64 = dec64table[sequence.offset];
1803
- op[0] = match[0];
1804
- op[1] = match[1];
1805
- op[2] = match[2];
1806
- op[3] = match[3];
1807
- match += dec32table[sequence.offset];
1808
- ZSTD_copy4(op+4, match);
1809
- match -= dec64;
1810
- } else { ZSTD_copy8(op, match); }
1811
- op += 8; match += 8;
1812
-
1813
- if (endMatch > oend-(16-MINMATCH))
1814
- {
1815
- if (op < oend-8)
1816
- {
1817
- ZSTD_wildcopy(op, match, (oend-8) - op);
1818
- match += (oend-8) - op;
1819
- op = oend-8;
1820
- }
1821
- while (op<endMatch) *op++ = *match++;
1822
- }
1823
- else
1824
- ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
1825
-
1826
- /* restore, in case of overlap */
1827
- if (overlapRisk) memcpy(endMatch, saved, qutt);
1828
- }
1829
-
1830
- return endMatch-ostart;
1831
- }
1832
-
1833
- typedef struct ZSTDv01_Dctx_s
1834
- {
1835
- U32 LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
1836
- U32 OffTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
1837
- U32 MLTable[FSE_DTABLE_SIZE_U32(MLFSELog)];
1838
- void* previousDstEnd;
1839
- void* base;
1840
- size_t expected;
1841
- blockType_t bType;
1842
- U32 phase;
1843
- } dctx_t;
1844
-
1845
-
1846
- static size_t ZSTD_decompressSequences(
1847
- void* ctx,
1848
- void* dst, size_t maxDstSize,
1849
- const void* seqStart, size_t seqSize,
1850
- const BYTE* litStart, size_t litSize)
1851
- {
1852
- dctx_t* dctx = (dctx_t*)ctx;
1853
- const BYTE* ip = (const BYTE*)seqStart;
1854
- const BYTE* const iend = ip + seqSize;
1855
- BYTE* const ostart = (BYTE* const)dst;
1856
- BYTE* op = ostart;
1857
- BYTE* const oend = ostart + maxDstSize;
1858
- size_t errorCode, dumpsLength;
1859
- const BYTE* litPtr = litStart;
1860
- const BYTE* const litEnd = litStart + litSize;
1861
- int nbSeq;
1862
- const BYTE* dumps;
1863
- U32* DTableLL = dctx->LLTable;
1864
- U32* DTableML = dctx->MLTable;
1865
- U32* DTableOffb = dctx->OffTable;
1866
- BYTE* const base = (BYTE*) (dctx->base);
1867
-
1868
- /* Build Decoding Tables */
1869
- errorCode = ZSTDv01_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
1870
- DTableLL, DTableML, DTableOffb,
1871
- ip, iend-ip);
1872
- if (ZSTDv01_isError(errorCode)) return errorCode;
1873
- ip += errorCode;
1874
-
1875
- /* Regen sequences */
1876
- {
1877
- seq_t sequence;
1878
- seqState_t seqState;
1879
-
1880
- memset(&sequence, 0, sizeof(sequence));
1881
- seqState.dumps = dumps;
1882
- seqState.dumpsEnd = dumps + dumpsLength;
1883
- seqState.prevOffset = 1;
1884
- errorCode = FSE_initDStream(&(seqState.DStream), ip, iend-ip);
1885
- if (FSE_isError(errorCode)) return ERROR(corruption_detected);
1886
- FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
1887
- FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
1888
- FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
1889
-
1890
- for ( ; (FSE_reloadDStream(&(seqState.DStream)) <= FSE_DStream_completed) && (nbSeq>0) ; )
1891
- {
1892
- size_t oneSeqSize;
1893
- nbSeq--;
1894
- ZSTD_decodeSequence(&sequence, &seqState);
1895
- oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend);
1896
- if (ZSTDv01_isError(oneSeqSize)) return oneSeqSize;
1897
- op += oneSeqSize;
1898
- }
1899
-
1900
- /* check if reached exact end */
1901
- if ( !FSE_endOfDStream(&(seqState.DStream)) ) return ERROR(corruption_detected); /* requested too much : data is corrupted */
1902
- if (nbSeq<0) return ERROR(corruption_detected); /* requested too many sequences : data is corrupted */
1903
-
1904
- /* last literal segment */
1905
- {
1906
- size_t lastLLSize = litEnd - litPtr;
1907
- if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
1908
- if (lastLLSize > 0) {
1909
- if (op != litPtr) memmove(op, litPtr, lastLLSize);
1910
- op += lastLLSize;
1911
- }
1912
- }
1913
- }
1914
-
1915
- return op-ostart;
1916
- }
1917
-
1918
-
1919
- static size_t ZSTD_decompressBlock(
1920
- void* ctx,
1921
- void* dst, size_t maxDstSize,
1922
- const void* src, size_t srcSize)
1923
- {
1924
- /* blockType == blockCompressed, srcSize is trusted */
1925
- const BYTE* ip = (const BYTE*)src;
1926
- const BYTE* litPtr = NULL;
1927
- size_t litSize = 0;
1928
- size_t errorCode;
1929
-
1930
- /* Decode literals sub-block */
1931
- errorCode = ZSTDv01_decodeLiteralsBlock(ctx, dst, maxDstSize, &litPtr, &litSize, src, srcSize);
1932
- if (ZSTDv01_isError(errorCode)) return errorCode;
1933
- ip += errorCode;
1934
- srcSize -= errorCode;
1935
-
1936
- return ZSTD_decompressSequences(ctx, dst, maxDstSize, ip, srcSize, litPtr, litSize);
1937
- }
1938
-
1939
-
1940
- size_t ZSTDv01_decompressDCtx(void* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1941
- {
1942
- const BYTE* ip = (const BYTE*)src;
1943
- const BYTE* iend = ip + srcSize;
1944
- BYTE* const ostart = (BYTE* const)dst;
1945
- BYTE* op = ostart;
1946
- BYTE* const oend = ostart + maxDstSize;
1947
- size_t remainingSize = srcSize;
1948
- U32 magicNumber;
1949
- size_t errorCode=0;
1950
- blockProperties_t blockProperties;
1951
-
1952
- /* Frame Header */
1953
- if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1954
- magicNumber = ZSTD_readBE32(src);
1955
- if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
1956
- ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
1957
-
1958
- /* Loop on each block */
1959
- while (1)
1960
- {
1961
- size_t blockSize = ZSTDv01_getcBlockSize(ip, iend-ip, &blockProperties);
1962
- if (ZSTDv01_isError(blockSize)) return blockSize;
1963
-
1964
- ip += ZSTD_blockHeaderSize;
1965
- remainingSize -= ZSTD_blockHeaderSize;
1966
- if (blockSize > remainingSize) return ERROR(srcSize_wrong);
1967
-
1968
- switch(blockProperties.blockType)
1969
- {
1970
- case bt_compressed:
1971
- errorCode = ZSTD_decompressBlock(ctx, op, oend-op, ip, blockSize);
1972
- break;
1973
- case bt_raw :
1974
- errorCode = ZSTD_copyUncompressedBlock(op, oend-op, ip, blockSize);
1975
- break;
1976
- case bt_rle :
1977
- return ERROR(GENERIC); /* not yet supported */
1978
- break;
1979
- case bt_end :
1980
- /* end of frame */
1981
- if (remainingSize) return ERROR(srcSize_wrong);
1982
- break;
1983
- default:
1984
- return ERROR(GENERIC);
1985
- }
1986
- if (blockSize == 0) break; /* bt_end */
1987
-
1988
- if (ZSTDv01_isError(errorCode)) return errorCode;
1989
- op += errorCode;
1990
- ip += blockSize;
1991
- remainingSize -= blockSize;
1992
- }
1993
-
1994
- return op-ostart;
1995
- }
1996
-
1997
- size_t ZSTDv01_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1998
- {
1999
- dctx_t ctx;
2000
- ctx.base = dst;
2001
- return ZSTDv01_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
2002
- }
2003
-
2004
- /* ZSTD_errorFrameSizeInfoLegacy() :
2005
- assumes `cSize` and `dBound` are _not_ NULL */
2006
- static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
2007
- {
2008
- *cSize = ret;
2009
- *dBound = ZSTD_CONTENTSIZE_ERROR;
2010
- }
2011
-
2012
- void ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
2013
- {
2014
- const BYTE* ip = (const BYTE*)src;
2015
- size_t remainingSize = srcSize;
2016
- size_t nbBlocks = 0;
2017
- U32 magicNumber;
2018
- blockProperties_t blockProperties;
2019
-
2020
- /* Frame Header */
2021
- if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
2022
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
2023
- return;
2024
- }
2025
- magicNumber = ZSTD_readBE32(src);
2026
- if (magicNumber != ZSTD_magicNumber) {
2027
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
2028
- return;
2029
- }
2030
- ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
2031
-
2032
- /* Loop on each block */
2033
- while (1)
2034
- {
2035
- size_t blockSize = ZSTDv01_getcBlockSize(ip, remainingSize, &blockProperties);
2036
- if (ZSTDv01_isError(blockSize)) {
2037
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, blockSize);
2038
- return;
2039
- }
2040
-
2041
- ip += ZSTD_blockHeaderSize;
2042
- remainingSize -= ZSTD_blockHeaderSize;
2043
- if (blockSize > remainingSize) {
2044
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
2045
- return;
2046
- }
2047
-
2048
- if (blockSize == 0) break; /* bt_end */
2049
-
2050
- ip += blockSize;
2051
- remainingSize -= blockSize;
2052
- nbBlocks++;
2053
- }
2054
-
2055
- *cSize = ip - (const BYTE*)src;
2056
- *dBound = nbBlocks * BLOCKSIZE;
2057
- }
2058
-
2059
- /*******************************
2060
- * Streaming Decompression API
2061
- *******************************/
2062
-
2063
- size_t ZSTDv01_resetDCtx(ZSTDv01_Dctx* dctx)
2064
- {
2065
- dctx->expected = ZSTD_frameHeaderSize;
2066
- dctx->phase = 0;
2067
- dctx->previousDstEnd = NULL;
2068
- dctx->base = NULL;
2069
- return 0;
2070
- }
2071
-
2072
- ZSTDv01_Dctx* ZSTDv01_createDCtx(void)
2073
- {
2074
- ZSTDv01_Dctx* dctx = (ZSTDv01_Dctx*)malloc(sizeof(ZSTDv01_Dctx));
2075
- if (dctx==NULL) return NULL;
2076
- ZSTDv01_resetDCtx(dctx);
2077
- return dctx;
2078
- }
2079
-
2080
- size_t ZSTDv01_freeDCtx(ZSTDv01_Dctx* dctx)
2081
- {
2082
- free(dctx);
2083
- return 0;
2084
- }
2085
-
2086
- size_t ZSTDv01_nextSrcSizeToDecompress(ZSTDv01_Dctx* dctx)
2087
- {
2088
- return ((dctx_t*)dctx)->expected;
2089
- }
2090
-
2091
- size_t ZSTDv01_decompressContinue(ZSTDv01_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
2092
- {
2093
- dctx_t* ctx = (dctx_t*)dctx;
2094
-
2095
- /* Sanity check */
2096
- if (srcSize != ctx->expected) return ERROR(srcSize_wrong);
2097
- if (dst != ctx->previousDstEnd) /* not contiguous */
2098
- ctx->base = dst;
2099
-
2100
- /* Decompress : frame header */
2101
- if (ctx->phase == 0)
2102
- {
2103
- /* Check frame magic header */
2104
- U32 magicNumber = ZSTD_readBE32(src);
2105
- if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
2106
- ctx->phase = 1;
2107
- ctx->expected = ZSTD_blockHeaderSize;
2108
- return 0;
2109
- }
2110
-
2111
- /* Decompress : block header */
2112
- if (ctx->phase == 1)
2113
- {
2114
- blockProperties_t bp;
2115
- size_t blockSize = ZSTDv01_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
2116
- if (ZSTDv01_isError(blockSize)) return blockSize;
2117
- if (bp.blockType == bt_end)
2118
- {
2119
- ctx->expected = 0;
2120
- ctx->phase = 0;
2121
- }
2122
- else
2123
- {
2124
- ctx->expected = blockSize;
2125
- ctx->bType = bp.blockType;
2126
- ctx->phase = 2;
2127
- }
2128
-
2129
- return 0;
2130
- }
2131
-
2132
- /* Decompress : block content */
2133
- {
2134
- size_t rSize;
2135
- switch(ctx->bType)
2136
- {
2137
- case bt_compressed:
2138
- rSize = ZSTD_decompressBlock(ctx, dst, maxDstSize, src, srcSize);
2139
- break;
2140
- case bt_raw :
2141
- rSize = ZSTD_copyUncompressedBlock(dst, maxDstSize, src, srcSize);
2142
- break;
2143
- case bt_rle :
2144
- return ERROR(GENERIC); /* not yet handled */
2145
- break;
2146
- case bt_end : /* should never happen (filtered at phase 1) */
2147
- rSize = 0;
2148
- break;
2149
- default:
2150
- return ERROR(GENERIC);
2151
- }
2152
- ctx->phase = 1;
2153
- ctx->expected = ZSTD_blockHeaderSize;
2154
- ctx->previousDstEnd = (void*)( ((char*)dst) + rSize);
2155
- return rSize;
2156
- }
2157
-
2158
- }