zstd-ruby 1.5.2.0 → 1.5.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/README.md +55 -2
  4. data/Rakefile +8 -2
  5. data/ext/zstdruby/{zstdruby.h → common.h} +2 -0
  6. data/ext/zstdruby/main.c +14 -0
  7. data/ext/zstdruby/streaming_compress.c +185 -0
  8. data/ext/zstdruby/streaming_compress.h +5 -0
  9. data/ext/zstdruby/streaming_decompress.c +125 -0
  10. data/ext/zstdruby/zstdruby.c +4 -6
  11. data/lib/zstd-ruby/version.rb +1 -1
  12. data/zstd-ruby.gemspec +1 -1
  13. metadata +7 -36
  14. data/.github/dependabot.yml +0 -8
  15. data/.github/workflows/ruby.yml +0 -35
  16. data/ext/zstdruby/libzstd/.gitignore +0 -3
  17. data/ext/zstdruby/libzstd/BUCK +0 -232
  18. data/ext/zstdruby/libzstd/Makefile +0 -357
  19. data/ext/zstdruby/libzstd/README.md +0 -217
  20. data/ext/zstdruby/libzstd/deprecated/zbuff.h +0 -214
  21. data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +0 -26
  22. data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +0 -167
  23. data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +0 -75
  24. data/ext/zstdruby/libzstd/dll/example/Makefile +0 -48
  25. data/ext/zstdruby/libzstd/dll/example/README.md +0 -63
  26. data/ext/zstdruby/libzstd/dll/example/build_package.bat +0 -20
  27. data/ext/zstdruby/libzstd/dll/example/fullbench-dll.sln +0 -25
  28. data/ext/zstdruby/libzstd/dll/example/fullbench-dll.vcxproj +0 -181
  29. data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +0 -415
  30. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +0 -2158
  31. data/ext/zstdruby/libzstd/legacy/zstd_v01.h +0 -94
  32. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +0 -3518
  33. data/ext/zstdruby/libzstd/legacy/zstd_v02.h +0 -93
  34. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +0 -3160
  35. data/ext/zstdruby/libzstd/legacy/zstd_v03.h +0 -93
  36. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +0 -3647
  37. data/ext/zstdruby/libzstd/legacy/zstd_v04.h +0 -142
  38. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +0 -4050
  39. data/ext/zstdruby/libzstd/legacy/zstd_v05.h +0 -162
  40. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +0 -4154
  41. data/ext/zstdruby/libzstd/legacy/zstd_v06.h +0 -172
  42. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +0 -4541
  43. data/ext/zstdruby/libzstd/legacy/zstd_v07.h +0 -187
  44. data/ext/zstdruby/libzstd/libzstd.mk +0 -203
  45. data/ext/zstdruby/libzstd/libzstd.pc.in +0 -16
  46. data/ext/zstdruby/libzstd/module.modulemap +0 -25
@@ -1,3518 +0,0 @@
1
- /*
2
- * Copyright (c) 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
- #include <stddef.h> /* size_t, ptrdiff_t */
13
- #include "zstd_v02.h"
14
- #include "../common/error_private.h"
15
-
16
-
17
- /******************************************
18
- * Compiler-specific
19
- ******************************************/
20
- #if defined(_MSC_VER) /* Visual Studio */
21
- # include <stdlib.h> /* _byteswap_ulong */
22
- # include <intrin.h> /* _byteswap_* */
23
- #endif
24
-
25
-
26
- /* ******************************************************************
27
- mem.h
28
- low-level memory access routines
29
- Copyright (C) 2013-2015, Yann Collet.
30
-
31
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
32
-
33
- Redistribution and use in source and binary forms, with or without
34
- modification, are permitted provided that the following conditions are
35
- met:
36
-
37
- * Redistributions of source code must retain the above copyright
38
- notice, this list of conditions and the following disclaimer.
39
- * Redistributions in binary form must reproduce the above
40
- copyright notice, this list of conditions and the following disclaimer
41
- in the documentation and/or other materials provided with the
42
- distribution.
43
-
44
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
45
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
46
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
47
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
48
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
49
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
50
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
51
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
52
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
53
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
54
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
55
-
56
- You can contact the author at :
57
- - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
58
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
59
- ****************************************************************** */
60
- #ifndef MEM_H_MODULE
61
- #define MEM_H_MODULE
62
-
63
- #if defined (__cplusplus)
64
- extern "C" {
65
- #endif
66
-
67
- /******************************************
68
- * Includes
69
- ******************************************/
70
- #include <stddef.h> /* size_t, ptrdiff_t */
71
- #include <string.h> /* memcpy */
72
-
73
-
74
- /******************************************
75
- * Compiler-specific
76
- ******************************************/
77
- #if defined(__GNUC__)
78
- # define MEM_STATIC static __attribute__((unused))
79
- #elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
80
- # define MEM_STATIC static inline
81
- #elif defined(_MSC_VER)
82
- # define MEM_STATIC static __inline
83
- #else
84
- # define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
85
- #endif
86
-
87
-
88
- /****************************************************************
89
- * Basic Types
90
- *****************************************************************/
91
- #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
92
- # if defined(_AIX)
93
- # include <inttypes.h>
94
- # else
95
- # include <stdint.h> /* intptr_t */
96
- # endif
97
- typedef uint8_t BYTE;
98
- typedef uint16_t U16;
99
- typedef int16_t S16;
100
- typedef uint32_t U32;
101
- typedef int32_t S32;
102
- typedef uint64_t U64;
103
- typedef int64_t S64;
104
- #else
105
- typedef unsigned char BYTE;
106
- typedef unsigned short U16;
107
- typedef signed short S16;
108
- typedef unsigned int U32;
109
- typedef signed int S32;
110
- typedef unsigned long long U64;
111
- typedef signed long long S64;
112
- #endif
113
-
114
-
115
- /****************************************************************
116
- * Memory I/O
117
- *****************************************************************/
118
- /* MEM_FORCE_MEMORY_ACCESS
119
- * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.
120
- * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.
121
- * The below switch allow to select different access method for improved performance.
122
- * Method 0 (default) : use `memcpy()`. Safe and portable.
123
- * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).
124
- * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.
125
- * Method 2 : direct access. This method is portable but violate C standard.
126
- * It can generate buggy code on targets generating assembly depending on alignment.
127
- * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)
128
- * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.
129
- * Prefer these methods in priority order (0 > 1 > 2)
130
- */
131
- #ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
132
- # if defined(__INTEL_COMPILER) || defined(__GNUC__) || defined(__ICCARM__)
133
- # define MEM_FORCE_MEMORY_ACCESS 1
134
- # endif
135
- #endif
136
-
137
- MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }
138
- MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; }
139
-
140
- MEM_STATIC unsigned MEM_isLittleEndian(void)
141
- {
142
- const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
143
- return one.c[0];
144
- }
145
-
146
- #if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2)
147
-
148
- /* violates C standard on structure alignment.
149
- Only use if no other choice to achieve best performance on target platform */
150
- MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; }
151
- MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
152
- MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
153
-
154
- MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
155
-
156
- #elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
157
-
158
- /* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
159
- /* currently only defined for gcc and icc */
160
- typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign;
161
-
162
- MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
163
- MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
164
- MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
165
-
166
- MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
167
-
168
- #else
169
-
170
- /* default method, safe and standard.
171
- can sometimes prove slower */
172
-
173
- MEM_STATIC U16 MEM_read16(const void* memPtr)
174
- {
175
- U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
176
- }
177
-
178
- MEM_STATIC U32 MEM_read32(const void* memPtr)
179
- {
180
- U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
181
- }
182
-
183
- MEM_STATIC U64 MEM_read64(const void* memPtr)
184
- {
185
- U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
186
- }
187
-
188
- MEM_STATIC void MEM_write16(void* memPtr, U16 value)
189
- {
190
- memcpy(memPtr, &value, sizeof(value));
191
- }
192
-
193
- #endif /* MEM_FORCE_MEMORY_ACCESS */
194
-
195
-
196
- MEM_STATIC U16 MEM_readLE16(const void* memPtr)
197
- {
198
- if (MEM_isLittleEndian())
199
- return MEM_read16(memPtr);
200
- else
201
- {
202
- const BYTE* p = (const BYTE*)memPtr;
203
- return (U16)(p[0] + (p[1]<<8));
204
- }
205
- }
206
-
207
- MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
208
- {
209
- if (MEM_isLittleEndian())
210
- {
211
- MEM_write16(memPtr, val);
212
- }
213
- else
214
- {
215
- BYTE* p = (BYTE*)memPtr;
216
- p[0] = (BYTE)val;
217
- p[1] = (BYTE)(val>>8);
218
- }
219
- }
220
-
221
- MEM_STATIC U32 MEM_readLE24(const void* memPtr)
222
- {
223
- return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
224
- }
225
-
226
- MEM_STATIC U32 MEM_readLE32(const void* memPtr)
227
- {
228
- if (MEM_isLittleEndian())
229
- return MEM_read32(memPtr);
230
- else
231
- {
232
- const BYTE* p = (const BYTE*)memPtr;
233
- return (U32)((U32)p[0] + ((U32)p[1]<<8) + ((U32)p[2]<<16) + ((U32)p[3]<<24));
234
- }
235
- }
236
-
237
-
238
- MEM_STATIC U64 MEM_readLE64(const void* memPtr)
239
- {
240
- if (MEM_isLittleEndian())
241
- return MEM_read64(memPtr);
242
- else
243
- {
244
- const BYTE* p = (const BYTE*)memPtr;
245
- return (U64)((U64)p[0] + ((U64)p[1]<<8) + ((U64)p[2]<<16) + ((U64)p[3]<<24)
246
- + ((U64)p[4]<<32) + ((U64)p[5]<<40) + ((U64)p[6]<<48) + ((U64)p[7]<<56));
247
- }
248
- }
249
-
250
-
251
- MEM_STATIC size_t MEM_readLEST(const void* memPtr)
252
- {
253
- if (MEM_32bits())
254
- return (size_t)MEM_readLE32(memPtr);
255
- else
256
- return (size_t)MEM_readLE64(memPtr);
257
- }
258
-
259
- #if defined (__cplusplus)
260
- }
261
- #endif
262
-
263
- #endif /* MEM_H_MODULE */
264
-
265
-
266
- /* ******************************************************************
267
- bitstream
268
- Part of NewGen Entropy library
269
- header file (to include)
270
- Copyright (C) 2013-2015, Yann Collet.
271
-
272
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
273
-
274
- Redistribution and use in source and binary forms, with or without
275
- modification, are permitted provided that the following conditions are
276
- met:
277
-
278
- * Redistributions of source code must retain the above copyright
279
- notice, this list of conditions and the following disclaimer.
280
- * Redistributions in binary form must reproduce the above
281
- copyright notice, this list of conditions and the following disclaimer
282
- in the documentation and/or other materials provided with the
283
- distribution.
284
-
285
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
286
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
288
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
289
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
290
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
291
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
292
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
293
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
294
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
296
-
297
- You can contact the author at :
298
- - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
299
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
300
- ****************************************************************** */
301
- #ifndef BITSTREAM_H_MODULE
302
- #define BITSTREAM_H_MODULE
303
-
304
- #if defined (__cplusplus)
305
- extern "C" {
306
- #endif
307
-
308
-
309
- /*
310
- * This API consists of small unitary functions, which highly benefit from being inlined.
311
- * Since link-time-optimization is not available for all compilers,
312
- * these functions are defined into a .h to be included.
313
- */
314
-
315
-
316
- /**********************************************
317
- * bitStream decompression API (read backward)
318
- **********************************************/
319
- typedef struct
320
- {
321
- size_t bitContainer;
322
- unsigned bitsConsumed;
323
- const char* ptr;
324
- const char* start;
325
- } BIT_DStream_t;
326
-
327
- typedef enum { BIT_DStream_unfinished = 0,
328
- BIT_DStream_endOfBuffer = 1,
329
- BIT_DStream_completed = 2,
330
- BIT_DStream_overflow = 3 } BIT_DStream_status; /* result of BIT_reloadDStream() */
331
- /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
332
-
333
- MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize);
334
- MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits);
335
- MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
336
- MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
337
-
338
-
339
- /******************************************
340
- * unsafe API
341
- ******************************************/
342
- MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
343
- /* faster, but works only if nbBits >= 1 */
344
-
345
-
346
-
347
- /****************************************************************
348
- * Helper functions
349
- ****************************************************************/
350
- MEM_STATIC unsigned BIT_highbit32 (U32 val)
351
- {
352
- # if defined(_MSC_VER) /* Visual */
353
- unsigned long r;
354
- return _BitScanReverse(&r, val) ? (unsigned)r : 0;
355
- # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
356
- return __builtin_clz (val) ^ 31;
357
- # else /* Software version */
358
- 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 };
359
- U32 v = val;
360
- unsigned r;
361
- v |= v >> 1;
362
- v |= v >> 2;
363
- v |= v >> 4;
364
- v |= v >> 8;
365
- v |= v >> 16;
366
- r = DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27];
367
- return r;
368
- # endif
369
- }
370
-
371
-
372
-
373
- /**********************************************************
374
- * bitStream decoding
375
- **********************************************************/
376
-
377
- /*!BIT_initDStream
378
- * Initialize a BIT_DStream_t.
379
- * @bitD : a pointer to an already allocated BIT_DStream_t structure
380
- * @srcBuffer must point at the beginning of a bitStream
381
- * @srcSize must be the exact size of the bitStream
382
- * @result : size of stream (== srcSize) or an errorCode if a problem is detected
383
- */
384
- MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
385
- {
386
- if (srcSize < 1) { memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); }
387
-
388
- if (srcSize >= sizeof(size_t)) /* normal case */
389
- {
390
- U32 contain32;
391
- bitD->start = (const char*)srcBuffer;
392
- bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(size_t);
393
- bitD->bitContainer = MEM_readLEST(bitD->ptr);
394
- contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
395
- if (contain32 == 0) return ERROR(GENERIC); /* endMark not present */
396
- bitD->bitsConsumed = 8 - BIT_highbit32(contain32);
397
- }
398
- else
399
- {
400
- U32 contain32;
401
- bitD->start = (const char*)srcBuffer;
402
- bitD->ptr = bitD->start;
403
- bitD->bitContainer = *(const BYTE*)(bitD->start);
404
- switch(srcSize)
405
- {
406
- case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);
407
- /* fallthrough */
408
- case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);
409
- /* fallthrough */
410
- case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);
411
- /* fallthrough */
412
- case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
413
- /* fallthrough */
414
- case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
415
- /* fallthrough */
416
- case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
417
- /* fallthrough */
418
- default:;
419
- }
420
- contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
421
- if (contain32 == 0) return ERROR(GENERIC); /* endMark not present */
422
- bitD->bitsConsumed = 8 - BIT_highbit32(contain32);
423
- bitD->bitsConsumed += (U32)(sizeof(size_t) - srcSize)*8;
424
- }
425
-
426
- return srcSize;
427
- }
428
-
429
- MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
430
- {
431
- const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
432
- return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
433
- }
434
-
435
- /*! BIT_lookBitsFast :
436
- * unsafe version; only works only if nbBits >= 1 */
437
- MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)
438
- {
439
- const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
440
- return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
441
- }
442
-
443
- MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
444
- {
445
- bitD->bitsConsumed += nbBits;
446
- }
447
-
448
- MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
449
- {
450
- size_t value = BIT_lookBits(bitD, nbBits);
451
- BIT_skipBits(bitD, nbBits);
452
- return value;
453
- }
454
-
455
- /*!BIT_readBitsFast :
456
- * unsafe version; only works only if nbBits >= 1 */
457
- MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
458
- {
459
- size_t value = BIT_lookBitsFast(bitD, nbBits);
460
- BIT_skipBits(bitD, nbBits);
461
- return value;
462
- }
463
-
464
- MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
465
- {
466
- if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
467
- return BIT_DStream_overflow;
468
-
469
- if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
470
- {
471
- bitD->ptr -= bitD->bitsConsumed >> 3;
472
- bitD->bitsConsumed &= 7;
473
- bitD->bitContainer = MEM_readLEST(bitD->ptr);
474
- return BIT_DStream_unfinished;
475
- }
476
- if (bitD->ptr == bitD->start)
477
- {
478
- if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
479
- return BIT_DStream_completed;
480
- }
481
- {
482
- U32 nbBytes = bitD->bitsConsumed >> 3;
483
- BIT_DStream_status result = BIT_DStream_unfinished;
484
- if (bitD->ptr - nbBytes < bitD->start)
485
- {
486
- nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */
487
- result = BIT_DStream_endOfBuffer;
488
- }
489
- bitD->ptr -= nbBytes;
490
- bitD->bitsConsumed -= nbBytes*8;
491
- bitD->bitContainer = MEM_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD) */
492
- return result;
493
- }
494
- }
495
-
496
- /*! BIT_endOfDStream
497
- * @return Tells if DStream has reached its exact end
498
- */
499
- MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)
500
- {
501
- return ((DStream->ptr == DStream->start) && (DStream->bitsConsumed == sizeof(DStream->bitContainer)*8));
502
- }
503
-
504
- #if defined (__cplusplus)
505
- }
506
- #endif
507
-
508
- #endif /* BITSTREAM_H_MODULE */
509
- /* ******************************************************************
510
- Error codes and messages
511
- Copyright (C) 2013-2015, Yann Collet
512
-
513
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
514
-
515
- Redistribution and use in source and binary forms, with or without
516
- modification, are permitted provided that the following conditions are
517
- met:
518
-
519
- * Redistributions of source code must retain the above copyright
520
- notice, this list of conditions and the following disclaimer.
521
- * Redistributions in binary form must reproduce the above
522
- copyright notice, this list of conditions and the following disclaimer
523
- in the documentation and/or other materials provided with the
524
- distribution.
525
-
526
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
527
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
528
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
529
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
530
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
531
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
532
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
533
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
534
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
535
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
536
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
537
-
538
- You can contact the author at :
539
- - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
540
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
541
- ****************************************************************** */
542
- #ifndef ERROR_H_MODULE
543
- #define ERROR_H_MODULE
544
-
545
- #if defined (__cplusplus)
546
- extern "C" {
547
- #endif
548
-
549
-
550
- /******************************************
551
- * Compiler-specific
552
- ******************************************/
553
- #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
554
- # define ERR_STATIC static inline
555
- #elif defined(_MSC_VER)
556
- # define ERR_STATIC static __inline
557
- #elif defined(__GNUC__)
558
- # define ERR_STATIC static __attribute__((unused))
559
- #else
560
- # define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
561
- #endif
562
-
563
-
564
- /******************************************
565
- * Error Management
566
- ******************************************/
567
- #define PREFIX(name) ZSTD_error_##name
568
-
569
- #define ERROR(name) (size_t)-PREFIX(name)
570
-
571
- #define ERROR_LIST(ITEM) \
572
- ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \
573
- ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \
574
- ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(corruption_detected)) \
575
- ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \
576
- ITEM(PREFIX(maxCode))
577
-
578
- #define ERROR_GENERATE_ENUM(ENUM) ENUM,
579
- typedef enum { ERROR_LIST(ERROR_GENERATE_ENUM) } ERR_codes; /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */
580
-
581
- #define ERROR_CONVERTTOSTRING(STRING) #STRING,
582
- #define ERROR_GENERATE_STRING(EXPR) ERROR_CONVERTTOSTRING(EXPR)
583
- static const char* ERR_strings[] = { ERROR_LIST(ERROR_GENERATE_STRING) };
584
-
585
- ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
586
-
587
- ERR_STATIC const char* ERR_getErrorName(size_t code)
588
- {
589
- static const char* codeError = "Unspecified error code";
590
- if (ERR_isError(code)) return ERR_strings[-(int)(code)];
591
- return codeError;
592
- }
593
-
594
-
595
- #if defined (__cplusplus)
596
- }
597
- #endif
598
-
599
- #endif /* ERROR_H_MODULE */
600
- /*
601
- Constructor and Destructor of type FSE_CTable
602
- Note that its size depends on 'tableLog' and 'maxSymbolValue' */
603
- typedef unsigned FSE_CTable; /* don't allocate that. It's just a way to be more restrictive than void* */
604
- typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
605
-
606
-
607
- /* ******************************************************************
608
- FSE : Finite State Entropy coder
609
- header file for static linking (only)
610
- Copyright (C) 2013-2015, Yann Collet
611
-
612
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
613
-
614
- Redistribution and use in source and binary forms, with or without
615
- modification, are permitted provided that the following conditions are
616
- met:
617
-
618
- * Redistributions of source code must retain the above copyright
619
- notice, this list of conditions and the following disclaimer.
620
- * Redistributions in binary form must reproduce the above
621
- copyright notice, this list of conditions and the following disclaimer
622
- in the documentation and/or other materials provided with the
623
- distribution.
624
-
625
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
626
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
627
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
628
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
629
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
630
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
631
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
632
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
633
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
634
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
635
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
636
-
637
- You can contact the author at :
638
- - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
639
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
640
- ****************************************************************** */
641
- #if defined (__cplusplus)
642
- extern "C" {
643
- #endif
644
-
645
-
646
- /******************************************
647
- * Static allocation
648
- ******************************************/
649
- /* FSE buffer bounds */
650
- #define FSE_NCOUNTBOUND 512
651
- #define FSE_BLOCKBOUND(size) (size + (size>>7))
652
- #define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
653
-
654
- /* You can statically allocate FSE CTable/DTable as a table of unsigned using below macro */
655
- #define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))
656
- #define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<maxTableLog))
657
-
658
-
659
- /******************************************
660
- * FSE advanced API
661
- ******************************************/
662
- static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits);
663
- /* build a fake FSE_DTable, designed to read an uncompressed bitstream where each symbol uses nbBits */
664
-
665
- static size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue);
666
- /* build a fake FSE_DTable, designed to always generate the same symbolValue */
667
-
668
-
669
- /******************************************
670
- * FSE symbol decompression API
671
- ******************************************/
672
- typedef struct
673
- {
674
- size_t state;
675
- const void* table; /* precise table may vary, depending on U16 */
676
- } FSE_DState_t;
677
-
678
-
679
- static void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt);
680
-
681
- static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
682
-
683
- static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
684
-
685
-
686
- /******************************************
687
- * FSE unsafe API
688
- ******************************************/
689
- static unsigned char FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
690
- /* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */
691
-
692
-
693
- /******************************************
694
- * Implementation of inline functions
695
- ******************************************/
696
-
697
- /* decompression */
698
-
699
- typedef struct {
700
- U16 tableLog;
701
- U16 fastMode;
702
- } FSE_DTableHeader; /* sizeof U32 */
703
-
704
- typedef struct
705
- {
706
- unsigned short newState;
707
- unsigned char symbol;
708
- unsigned char nbBits;
709
- } FSE_decode_t; /* size == U32 */
710
-
711
- MEM_STATIC void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt)
712
- {
713
- FSE_DTableHeader DTableH;
714
- memcpy(&DTableH, dt, sizeof(DTableH));
715
- DStatePtr->state = BIT_readBits(bitD, DTableH.tableLog);
716
- BIT_reloadDStream(bitD);
717
- DStatePtr->table = dt + 1;
718
- }
719
-
720
- MEM_STATIC BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
721
- {
722
- const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
723
- const U32 nbBits = DInfo.nbBits;
724
- BYTE symbol = DInfo.symbol;
725
- size_t lowBits = BIT_readBits(bitD, nbBits);
726
-
727
- DStatePtr->state = DInfo.newState + lowBits;
728
- return symbol;
729
- }
730
-
731
- MEM_STATIC BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
732
- {
733
- const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
734
- const U32 nbBits = DInfo.nbBits;
735
- BYTE symbol = DInfo.symbol;
736
- size_t lowBits = BIT_readBitsFast(bitD, nbBits);
737
-
738
- DStatePtr->state = DInfo.newState + lowBits;
739
- return symbol;
740
- }
741
-
742
- MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
743
- {
744
- return DStatePtr->state == 0;
745
- }
746
-
747
-
748
- #if defined (__cplusplus)
749
- }
750
- #endif
751
- /* ******************************************************************
752
- Huff0 : Huffman coder, part of New Generation Entropy library
753
- header file for static linking (only)
754
- Copyright (C) 2013-2015, Yann Collet
755
-
756
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
757
-
758
- Redistribution and use in source and binary forms, with or without
759
- modification, are permitted provided that the following conditions are
760
- met:
761
-
762
- * Redistributions of source code must retain the above copyright
763
- notice, this list of conditions and the following disclaimer.
764
- * Redistributions in binary form must reproduce the above
765
- copyright notice, this list of conditions and the following disclaimer
766
- in the documentation and/or other materials provided with the
767
- distribution.
768
-
769
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
770
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
771
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
772
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
773
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
774
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
775
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
776
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
777
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
778
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
779
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
780
-
781
- You can contact the author at :
782
- - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
783
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
784
- ****************************************************************** */
785
-
786
- #if defined (__cplusplus)
787
- extern "C" {
788
- #endif
789
-
790
- /******************************************
791
- * Static allocation macros
792
- ******************************************/
793
- /* Huff0 buffer bounds */
794
- #define HUF_CTABLEBOUND 129
795
- #define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true if incompressible pre-filtered with fast heuristic */
796
- #define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
797
-
798
- /* static allocation of Huff0's DTable */
799
- #define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<maxTableLog)) /* nb Cells; use unsigned short for X2, unsigned int for X4 */
800
- #define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
801
- unsigned short DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
802
- #define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \
803
- unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
804
- #define HUF_CREATE_STATIC_DTABLEX6(DTable, maxTableLog) \
805
- unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog) * 3 / 2] = { maxTableLog }
806
-
807
-
808
- /******************************************
809
- * Advanced functions
810
- ******************************************/
811
- static size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
812
- static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbols decoder */
813
- static size_t HUF_decompress4X6 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* quad-symbols decoder */
814
-
815
-
816
- #if defined (__cplusplus)
817
- }
818
- #endif
819
-
820
- /*
821
- zstd - standard compression library
822
- Header File
823
- Copyright (C) 2014-2015, Yann Collet.
824
-
825
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
826
-
827
- Redistribution and use in source and binary forms, with or without
828
- modification, are permitted provided that the following conditions are
829
- met:
830
- * Redistributions of source code must retain the above copyright
831
- notice, this list of conditions and the following disclaimer.
832
- * Redistributions in binary form must reproduce the above
833
- copyright notice, this list of conditions and the following disclaimer
834
- in the documentation and/or other materials provided with the
835
- distribution.
836
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
837
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
838
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
839
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
840
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
841
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
842
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
843
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
844
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
845
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
846
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
847
-
848
- You can contact the author at :
849
- - zstd source repository : https://github.com/Cyan4973/zstd
850
- - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
851
- */
852
-
853
- #if defined (__cplusplus)
854
- extern "C" {
855
- #endif
856
-
857
- /* *************************************
858
- * Includes
859
- ***************************************/
860
- #include <stddef.h> /* size_t */
861
-
862
-
863
- /* *************************************
864
- * Version
865
- ***************************************/
866
- #define ZSTD_VERSION_MAJOR 0 /* for breaking interface changes */
867
- #define ZSTD_VERSION_MINOR 2 /* for new (non-breaking) interface capabilities */
868
- #define ZSTD_VERSION_RELEASE 2 /* for tweaks, bug-fixes, or development */
869
- #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
870
-
871
-
872
- /* *************************************
873
- * Advanced functions
874
- ***************************************/
875
- typedef struct ZSTD_CCtx_s ZSTD_CCtx; /* incomplete type */
876
-
877
- #if defined (__cplusplus)
878
- }
879
- #endif
880
- /*
881
- zstd - standard compression library
882
- Header File for static linking only
883
- Copyright (C) 2014-2015, Yann Collet.
884
-
885
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
886
-
887
- Redistribution and use in source and binary forms, with or without
888
- modification, are permitted provided that the following conditions are
889
- met:
890
- * Redistributions of source code must retain the above copyright
891
- notice, this list of conditions and the following disclaimer.
892
- * Redistributions in binary form must reproduce the above
893
- copyright notice, this list of conditions and the following disclaimer
894
- in the documentation and/or other materials provided with the
895
- distribution.
896
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
897
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
898
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
899
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
900
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
901
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
902
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
903
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
904
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
905
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
906
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
907
-
908
- You can contact the author at :
909
- - zstd source repository : https://github.com/Cyan4973/zstd
910
- - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
911
- */
912
-
913
- /* The objects defined into this file should be considered experimental.
914
- * They are not labelled stable, as their prototype may change in the future.
915
- * You can use them for tests, provide feedback, or if you can endure risk of future changes.
916
- */
917
-
918
- #if defined (__cplusplus)
919
- extern "C" {
920
- #endif
921
-
922
- /* *************************************
923
- * Streaming functions
924
- ***************************************/
925
-
926
- typedef struct ZSTD_DCtx_s ZSTD_DCtx;
927
-
928
- /*
929
- Use above functions alternatively.
930
- ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue().
931
- ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block.
932
- Result is the number of bytes regenerated within 'dst'.
933
- It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header.
934
- */
935
-
936
- /* *************************************
937
- * Prefix - version detection
938
- ***************************************/
939
- #define ZSTD_magicNumber 0xFD2FB522 /* v0.2 (current)*/
940
-
941
-
942
- #if defined (__cplusplus)
943
- }
944
- #endif
945
- /* ******************************************************************
946
- FSE : Finite State Entropy coder
947
- Copyright (C) 2013-2015, Yann Collet.
948
-
949
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
950
-
951
- Redistribution and use in source and binary forms, with or without
952
- modification, are permitted provided that the following conditions are
953
- met:
954
-
955
- * Redistributions of source code must retain the above copyright
956
- notice, this list of conditions and the following disclaimer.
957
- * Redistributions in binary form must reproduce the above
958
- copyright notice, this list of conditions and the following disclaimer
959
- in the documentation and/or other materials provided with the
960
- distribution.
961
-
962
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
963
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
964
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
965
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
966
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
967
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
968
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
969
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
970
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
971
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
972
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
973
-
974
- You can contact the author at :
975
- - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
976
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
977
- ****************************************************************** */
978
-
979
- #ifndef FSE_COMMONDEFS_ONLY
980
-
981
- /****************************************************************
982
- * Tuning parameters
983
- ****************************************************************/
984
- /* MEMORY_USAGE :
985
- * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
986
- * Increasing memory usage improves compression ratio
987
- * Reduced memory usage can improve speed, due to cache effect
988
- * Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
989
- #define FSE_MAX_MEMORY_USAGE 14
990
- #define FSE_DEFAULT_MEMORY_USAGE 13
991
-
992
- /* FSE_MAX_SYMBOL_VALUE :
993
- * Maximum symbol value authorized.
994
- * Required for proper stack allocation */
995
- #define FSE_MAX_SYMBOL_VALUE 255
996
-
997
-
998
- /****************************************************************
999
- * template functions type & suffix
1000
- ****************************************************************/
1001
- #define FSE_FUNCTION_TYPE BYTE
1002
- #define FSE_FUNCTION_EXTENSION
1003
-
1004
-
1005
- /****************************************************************
1006
- * Byte symbol type
1007
- ****************************************************************/
1008
- #endif /* !FSE_COMMONDEFS_ONLY */
1009
-
1010
-
1011
- /****************************************************************
1012
- * Compiler specifics
1013
- ****************************************************************/
1014
- #ifdef _MSC_VER /* Visual Studio */
1015
- # define FORCE_INLINE static __forceinline
1016
- # include <intrin.h> /* For Visual 2005 */
1017
- # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
1018
- # pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
1019
- #else
1020
- # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
1021
- # ifdef __GNUC__
1022
- # define FORCE_INLINE static inline __attribute__((always_inline))
1023
- # else
1024
- # define FORCE_INLINE static inline
1025
- # endif
1026
- # else
1027
- # define FORCE_INLINE static
1028
- # endif /* __STDC_VERSION__ */
1029
- #endif
1030
-
1031
-
1032
- /****************************************************************
1033
- * Includes
1034
- ****************************************************************/
1035
- #include <stdlib.h> /* malloc, free, qsort */
1036
- #include <string.h> /* memcpy, memset */
1037
- #include <stdio.h> /* printf (debug) */
1038
-
1039
- /****************************************************************
1040
- * Constants
1041
- *****************************************************************/
1042
- #define FSE_MAX_TABLELOG (FSE_MAX_MEMORY_USAGE-2)
1043
- #define FSE_MAX_TABLESIZE (1U<<FSE_MAX_TABLELOG)
1044
- #define FSE_MAXTABLESIZE_MASK (FSE_MAX_TABLESIZE-1)
1045
- #define FSE_DEFAULT_TABLELOG (FSE_DEFAULT_MEMORY_USAGE-2)
1046
- #define FSE_MIN_TABLELOG 5
1047
-
1048
- #define FSE_TABLELOG_ABSOLUTE_MAX 15
1049
- #if FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX
1050
- #error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
1051
- #endif
1052
-
1053
-
1054
- /****************************************************************
1055
- * Error Management
1056
- ****************************************************************/
1057
- #define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
1058
-
1059
-
1060
- /****************************************************************
1061
- * Complex types
1062
- ****************************************************************/
1063
- typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
1064
-
1065
-
1066
- /****************************************************************
1067
- * Templates
1068
- ****************************************************************/
1069
- /*
1070
- designed to be included
1071
- for type-specific functions (template emulation in C)
1072
- Objective is to write these functions only once, for improved maintenance
1073
- */
1074
-
1075
- /* safety checks */
1076
- #ifndef FSE_FUNCTION_EXTENSION
1077
- # error "FSE_FUNCTION_EXTENSION must be defined"
1078
- #endif
1079
- #ifndef FSE_FUNCTION_TYPE
1080
- # error "FSE_FUNCTION_TYPE must be defined"
1081
- #endif
1082
-
1083
- /* Function names */
1084
- #define FSE_CAT(X,Y) X##Y
1085
- #define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
1086
- #define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
1087
-
1088
-
1089
- /* Function templates */
1090
-
1091
- #define FSE_DECODE_TYPE FSE_decode_t
1092
-
1093
- static U32 FSE_tableStep(U32 tableSize) { return (tableSize>>1) + (tableSize>>3) + 3; }
1094
-
1095
- static size_t FSE_buildDTable
1096
- (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
1097
- {
1098
- void* ptr = dt+1;
1099
- FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*)ptr;
1100
- FSE_DTableHeader DTableH;
1101
- const U32 tableSize = 1 << tableLog;
1102
- const U32 tableMask = tableSize-1;
1103
- const U32 step = FSE_tableStep(tableSize);
1104
- U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
1105
- U32 position = 0;
1106
- U32 highThreshold = tableSize-1;
1107
- const S16 largeLimit= (S16)(1 << (tableLog-1));
1108
- U32 noLarge = 1;
1109
- U32 s;
1110
-
1111
- /* Sanity Checks */
1112
- if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return ERROR(maxSymbolValue_tooLarge);
1113
- if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
1114
-
1115
- /* Init, lay down lowprob symbols */
1116
- DTableH.tableLog = (U16)tableLog;
1117
- for (s=0; s<=maxSymbolValue; s++)
1118
- {
1119
- if (normalizedCounter[s]==-1)
1120
- {
1121
- tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
1122
- symbolNext[s] = 1;
1123
- }
1124
- else
1125
- {
1126
- if (normalizedCounter[s] >= largeLimit) noLarge=0;
1127
- symbolNext[s] = normalizedCounter[s];
1128
- }
1129
- }
1130
-
1131
- /* Spread symbols */
1132
- for (s=0; s<=maxSymbolValue; s++)
1133
- {
1134
- int i;
1135
- for (i=0; i<normalizedCounter[s]; i++)
1136
- {
1137
- tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
1138
- position = (position + step) & tableMask;
1139
- while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
1140
- }
1141
- }
1142
-
1143
- if (position!=0) return ERROR(GENERIC); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
1144
-
1145
- /* Build Decoding table */
1146
- {
1147
- U32 i;
1148
- for (i=0; i<tableSize; i++)
1149
- {
1150
- FSE_FUNCTION_TYPE symbol = (FSE_FUNCTION_TYPE)(tableDecode[i].symbol);
1151
- U16 nextState = symbolNext[symbol]++;
1152
- tableDecode[i].nbBits = (BYTE) (tableLog - BIT_highbit32 ((U32)nextState) );
1153
- tableDecode[i].newState = (U16) ( (nextState << tableDecode[i].nbBits) - tableSize);
1154
- }
1155
- }
1156
-
1157
- DTableH.fastMode = (U16)noLarge;
1158
- memcpy(dt, &DTableH, sizeof(DTableH)); /* memcpy(), to avoid strict aliasing warnings */
1159
- return 0;
1160
- }
1161
-
1162
-
1163
- #ifndef FSE_COMMONDEFS_ONLY
1164
- /******************************************
1165
- * FSE helper functions
1166
- ******************************************/
1167
- static unsigned FSE_isError(size_t code) { return ERR_isError(code); }
1168
-
1169
-
1170
- /****************************************************************
1171
- * FSE NCount encoding-decoding
1172
- ****************************************************************/
1173
- static short FSE_abs(short a)
1174
- {
1175
- return (short)(a<0 ? -a : a);
1176
- }
1177
-
1178
- static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
1179
- const void* headerBuffer, size_t hbSize)
1180
- {
1181
- const BYTE* const istart = (const BYTE*) headerBuffer;
1182
- const BYTE* const iend = istart + hbSize;
1183
- const BYTE* ip = istart;
1184
- int nbBits;
1185
- int remaining;
1186
- int threshold;
1187
- U32 bitStream;
1188
- int bitCount;
1189
- unsigned charnum = 0;
1190
- int previous0 = 0;
1191
-
1192
- if (hbSize < 4) return ERROR(srcSize_wrong);
1193
- bitStream = MEM_readLE32(ip);
1194
- nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
1195
- if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge);
1196
- bitStream >>= 4;
1197
- bitCount = 4;
1198
- *tableLogPtr = nbBits;
1199
- remaining = (1<<nbBits)+1;
1200
- threshold = 1<<nbBits;
1201
- nbBits++;
1202
-
1203
- while ((remaining>1) && (charnum<=*maxSVPtr))
1204
- {
1205
- if (previous0)
1206
- {
1207
- unsigned n0 = charnum;
1208
- while ((bitStream & 0xFFFF) == 0xFFFF)
1209
- {
1210
- n0+=24;
1211
- if (ip < iend-5)
1212
- {
1213
- ip+=2;
1214
- bitStream = MEM_readLE32(ip) >> bitCount;
1215
- }
1216
- else
1217
- {
1218
- bitStream >>= 16;
1219
- bitCount+=16;
1220
- }
1221
- }
1222
- while ((bitStream & 3) == 3)
1223
- {
1224
- n0+=3;
1225
- bitStream>>=2;
1226
- bitCount+=2;
1227
- }
1228
- n0 += bitStream & 3;
1229
- bitCount += 2;
1230
- if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall);
1231
- while (charnum < n0) normalizedCounter[charnum++] = 0;
1232
- if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
1233
- {
1234
- ip += bitCount>>3;
1235
- bitCount &= 7;
1236
- bitStream = MEM_readLE32(ip) >> bitCount;
1237
- }
1238
- else
1239
- bitStream >>= 2;
1240
- }
1241
- {
1242
- const short max = (short)((2*threshold-1)-remaining);
1243
- short count;
1244
-
1245
- if ((bitStream & (threshold-1)) < (U32)max)
1246
- {
1247
- count = (short)(bitStream & (threshold-1));
1248
- bitCount += nbBits-1;
1249
- }
1250
- else
1251
- {
1252
- count = (short)(bitStream & (2*threshold-1));
1253
- if (count >= threshold) count -= max;
1254
- bitCount += nbBits;
1255
- }
1256
-
1257
- count--; /* extra accuracy */
1258
- remaining -= FSE_abs(count);
1259
- normalizedCounter[charnum++] = count;
1260
- previous0 = !count;
1261
- while (remaining < threshold)
1262
- {
1263
- nbBits--;
1264
- threshold >>= 1;
1265
- }
1266
-
1267
- {
1268
- if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
1269
- {
1270
- ip += bitCount>>3;
1271
- bitCount &= 7;
1272
- }
1273
- else
1274
- {
1275
- bitCount -= (int)(8 * (iend - 4 - ip));
1276
- ip = iend - 4;
1277
- }
1278
- bitStream = MEM_readLE32(ip) >> (bitCount & 31);
1279
- }
1280
- }
1281
- }
1282
- if (remaining != 1) return ERROR(GENERIC);
1283
- *maxSVPtr = charnum-1;
1284
-
1285
- ip += (bitCount+7)>>3;
1286
- if ((size_t)(ip-istart) > hbSize) return ERROR(srcSize_wrong);
1287
- return ip-istart;
1288
- }
1289
-
1290
-
1291
- /*********************************************************
1292
- * Decompression (Byte symbols)
1293
- *********************************************************/
1294
- static size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
1295
- {
1296
- void* ptr = dt;
1297
- FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
1298
- FSE_decode_t* const cell = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
1299
-
1300
- DTableH->tableLog = 0;
1301
- DTableH->fastMode = 0;
1302
-
1303
- cell->newState = 0;
1304
- cell->symbol = symbolValue;
1305
- cell->nbBits = 0;
1306
-
1307
- return 0;
1308
- }
1309
-
1310
-
1311
- static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
1312
- {
1313
- void* ptr = dt;
1314
- FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
1315
- FSE_decode_t* const dinfo = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
1316
- const unsigned tableSize = 1 << nbBits;
1317
- const unsigned tableMask = tableSize - 1;
1318
- const unsigned maxSymbolValue = tableMask;
1319
- unsigned s;
1320
-
1321
- /* Sanity checks */
1322
- if (nbBits < 1) return ERROR(GENERIC); /* min size */
1323
-
1324
- /* Build Decoding Table */
1325
- DTableH->tableLog = (U16)nbBits;
1326
- DTableH->fastMode = 1;
1327
- for (s=0; s<=maxSymbolValue; s++)
1328
- {
1329
- dinfo[s].newState = 0;
1330
- dinfo[s].symbol = (BYTE)s;
1331
- dinfo[s].nbBits = (BYTE)nbBits;
1332
- }
1333
-
1334
- return 0;
1335
- }
1336
-
1337
- FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
1338
- void* dst, size_t maxDstSize,
1339
- const void* cSrc, size_t cSrcSize,
1340
- const FSE_DTable* dt, const unsigned fast)
1341
- {
1342
- BYTE* const ostart = (BYTE*) dst;
1343
- BYTE* op = ostart;
1344
- BYTE* const omax = op + maxDstSize;
1345
- BYTE* const olimit = omax-3;
1346
-
1347
- BIT_DStream_t bitD;
1348
- FSE_DState_t state1;
1349
- FSE_DState_t state2;
1350
- size_t errorCode;
1351
-
1352
- /* Init */
1353
- errorCode = BIT_initDStream(&bitD, cSrc, cSrcSize); /* replaced last arg by maxCompressed Size */
1354
- if (FSE_isError(errorCode)) return errorCode;
1355
-
1356
- FSE_initDState(&state1, &bitD, dt);
1357
- FSE_initDState(&state2, &bitD, dt);
1358
-
1359
- #define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
1360
-
1361
- /* 4 symbols per loop */
1362
- for ( ; (BIT_reloadDStream(&bitD)==BIT_DStream_unfinished) && (op<olimit) ; op+=4)
1363
- {
1364
- op[0] = FSE_GETSYMBOL(&state1);
1365
-
1366
- if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
1367
- BIT_reloadDStream(&bitD);
1368
-
1369
- op[1] = FSE_GETSYMBOL(&state2);
1370
-
1371
- if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
1372
- { if (BIT_reloadDStream(&bitD) > BIT_DStream_unfinished) { op+=2; break; } }
1373
-
1374
- op[2] = FSE_GETSYMBOL(&state1);
1375
-
1376
- if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
1377
- BIT_reloadDStream(&bitD);
1378
-
1379
- op[3] = FSE_GETSYMBOL(&state2);
1380
- }
1381
-
1382
- /* tail */
1383
- /* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */
1384
- while (1)
1385
- {
1386
- if ( (BIT_reloadDStream(&bitD)>BIT_DStream_completed) || (op==omax) || (BIT_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state1))) )
1387
- break;
1388
-
1389
- *op++ = FSE_GETSYMBOL(&state1);
1390
-
1391
- if ( (BIT_reloadDStream(&bitD)>BIT_DStream_completed) || (op==omax) || (BIT_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state2))) )
1392
- break;
1393
-
1394
- *op++ = FSE_GETSYMBOL(&state2);
1395
- }
1396
-
1397
- /* end ? */
1398
- if (BIT_endOfDStream(&bitD) && FSE_endOfDState(&state1) && FSE_endOfDState(&state2))
1399
- return op-ostart;
1400
-
1401
- if (op==omax) return ERROR(dstSize_tooSmall); /* dst buffer is full, but cSrc unfinished */
1402
-
1403
- return ERROR(corruption_detected);
1404
- }
1405
-
1406
-
1407
- static size_t FSE_decompress_usingDTable(void* dst, size_t originalSize,
1408
- const void* cSrc, size_t cSrcSize,
1409
- const FSE_DTable* dt)
1410
- {
1411
- FSE_DTableHeader DTableH;
1412
- memcpy(&DTableH, dt, sizeof(DTableH));
1413
-
1414
- /* select fast mode (static) */
1415
- if (DTableH.fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
1416
- return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
1417
- }
1418
-
1419
-
1420
- static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1421
- {
1422
- const BYTE* const istart = (const BYTE*)cSrc;
1423
- const BYTE* ip = istart;
1424
- short counting[FSE_MAX_SYMBOL_VALUE+1];
1425
- DTable_max_t dt; /* Static analyzer seems unable to understand this table will be properly initialized later */
1426
- unsigned tableLog;
1427
- unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
1428
- size_t errorCode;
1429
-
1430
- if (cSrcSize<2) return ERROR(srcSize_wrong); /* too small input size */
1431
-
1432
- /* normal FSE decoding mode */
1433
- errorCode = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
1434
- if (FSE_isError(errorCode)) return errorCode;
1435
- if (errorCode >= cSrcSize) return ERROR(srcSize_wrong); /* too small input size */
1436
- ip += errorCode;
1437
- cSrcSize -= errorCode;
1438
-
1439
- errorCode = FSE_buildDTable (dt, counting, maxSymbolValue, tableLog);
1440
- if (FSE_isError(errorCode)) return errorCode;
1441
-
1442
- /* always return, even if it is an error code */
1443
- return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);
1444
- }
1445
-
1446
-
1447
-
1448
- #endif /* FSE_COMMONDEFS_ONLY */
1449
- /* ******************************************************************
1450
- Huff0 : Huffman coder, part of New Generation Entropy library
1451
- Copyright (C) 2013-2015, Yann Collet.
1452
-
1453
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1454
-
1455
- Redistribution and use in source and binary forms, with or without
1456
- modification, are permitted provided that the following conditions are
1457
- met:
1458
-
1459
- * Redistributions of source code must retain the above copyright
1460
- notice, this list of conditions and the following disclaimer.
1461
- * Redistributions in binary form must reproduce the above
1462
- copyright notice, this list of conditions and the following disclaimer
1463
- in the documentation and/or other materials provided with the
1464
- distribution.
1465
-
1466
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1467
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1468
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1469
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1470
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1471
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1472
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1473
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1474
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1475
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1476
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1477
-
1478
- You can contact the author at :
1479
- - FSE+Huff0 source repository : https://github.com/Cyan4973/FiniteStateEntropy
1480
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
1481
- ****************************************************************** */
1482
-
1483
- /****************************************************************
1484
- * Compiler specifics
1485
- ****************************************************************/
1486
- #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
1487
- /* inline is defined */
1488
- #elif defined(_MSC_VER)
1489
- # define inline __inline
1490
- #else
1491
- # define inline /* disable inline */
1492
- #endif
1493
-
1494
-
1495
- #ifdef _MSC_VER /* Visual Studio */
1496
- # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
1497
- #endif
1498
-
1499
-
1500
- /****************************************************************
1501
- * Includes
1502
- ****************************************************************/
1503
- #include <stdlib.h> /* malloc, free, qsort */
1504
- #include <string.h> /* memcpy, memset */
1505
- #include <stdio.h> /* printf (debug) */
1506
-
1507
- /****************************************************************
1508
- * Error Management
1509
- ****************************************************************/
1510
- #define HUF_STATIC_ASSERT(c) { enum { HUF_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
1511
-
1512
-
1513
- /******************************************
1514
- * Helper functions
1515
- ******************************************/
1516
- static unsigned HUF_isError(size_t code) { return ERR_isError(code); }
1517
-
1518
- #define HUF_ABSOLUTEMAX_TABLELOG 16 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
1519
- #define HUF_MAX_TABLELOG 12 /* max configured tableLog (for static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */
1520
- #define HUF_DEFAULT_TABLELOG HUF_MAX_TABLELOG /* tableLog by default, when not specified */
1521
- #define HUF_MAX_SYMBOL_VALUE 255
1522
- #if (HUF_MAX_TABLELOG > HUF_ABSOLUTEMAX_TABLELOG)
1523
- # error "HUF_MAX_TABLELOG is too large !"
1524
- #endif
1525
-
1526
-
1527
-
1528
- /*********************************************************
1529
- * Huff0 : Huffman block decompression
1530
- *********************************************************/
1531
- typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX2; /* single-symbol decoding */
1532
-
1533
- typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX4; /* double-symbols decoding */
1534
-
1535
- typedef struct { BYTE symbol; BYTE weight; } sortedSymbol_t;
1536
-
1537
- /*! HUF_readStats
1538
- Read compact Huffman tree, saved by HUF_writeCTable
1539
- @huffWeight : destination buffer
1540
- @return : size read from `src`
1541
- */
1542
- static size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
1543
- U32* nbSymbolsPtr, U32* tableLogPtr,
1544
- const void* src, size_t srcSize)
1545
- {
1546
- U32 weightTotal;
1547
- U32 tableLog;
1548
- const BYTE* ip = (const BYTE*) src;
1549
- size_t iSize;
1550
- size_t oSize;
1551
- U32 n;
1552
-
1553
- if (!srcSize) return ERROR(srcSize_wrong);
1554
- iSize = ip[0];
1555
- //memset(huffWeight, 0, hwSize); /* is not necessary, even though some analyzer complain ... */
1556
-
1557
- if (iSize >= 128) /* special header */
1558
- {
1559
- if (iSize >= (242)) /* RLE */
1560
- {
1561
- static int l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
1562
- oSize = l[iSize-242];
1563
- memset(huffWeight, 1, hwSize);
1564
- iSize = 0;
1565
- }
1566
- else /* Incompressible */
1567
- {
1568
- oSize = iSize - 127;
1569
- iSize = ((oSize+1)/2);
1570
- if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1571
- if (oSize >= hwSize) return ERROR(corruption_detected);
1572
- ip += 1;
1573
- for (n=0; n<oSize; n+=2)
1574
- {
1575
- huffWeight[n] = ip[n/2] >> 4;
1576
- huffWeight[n+1] = ip[n/2] & 15;
1577
- }
1578
- }
1579
- }
1580
- else /* header compressed with FSE (normal case) */
1581
- {
1582
- if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1583
- oSize = FSE_decompress(huffWeight, hwSize-1, ip+1, iSize); /* max (hwSize-1) values decoded, as last one is implied */
1584
- if (FSE_isError(oSize)) return oSize;
1585
- }
1586
-
1587
- /* collect weight stats */
1588
- memset(rankStats, 0, (HUF_ABSOLUTEMAX_TABLELOG + 1) * sizeof(U32));
1589
- weightTotal = 0;
1590
- for (n=0; n<oSize; n++)
1591
- {
1592
- if (huffWeight[n] >= HUF_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1593
- rankStats[huffWeight[n]]++;
1594
- weightTotal += (1 << huffWeight[n]) >> 1;
1595
- }
1596
- if (weightTotal == 0) return ERROR(corruption_detected);
1597
-
1598
- /* get last non-null symbol weight (implied, total must be 2^n) */
1599
- tableLog = BIT_highbit32(weightTotal) + 1;
1600
- if (tableLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1601
- {
1602
- U32 total = 1 << tableLog;
1603
- U32 rest = total - weightTotal;
1604
- U32 verif = 1 << BIT_highbit32(rest);
1605
- U32 lastWeight = BIT_highbit32(rest) + 1;
1606
- if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */
1607
- huffWeight[oSize] = (BYTE)lastWeight;
1608
- rankStats[lastWeight]++;
1609
- }
1610
-
1611
- /* check tree construction validity */
1612
- if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected); /* by construction : at least 2 elts of rank 1, must be even */
1613
-
1614
- /* results */
1615
- *nbSymbolsPtr = (U32)(oSize+1);
1616
- *tableLogPtr = tableLog;
1617
- return iSize+1;
1618
- }
1619
-
1620
-
1621
- /**************************/
1622
- /* single-symbol decoding */
1623
- /**************************/
1624
-
1625
- static size_t HUF_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
1626
- {
1627
- BYTE huffWeight[HUF_MAX_SYMBOL_VALUE + 1];
1628
- U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1]; /* large enough for values from 0 to 16 */
1629
- U32 tableLog = 0;
1630
- const BYTE* ip = (const BYTE*) src;
1631
- size_t iSize = ip[0];
1632
- U32 nbSymbols = 0;
1633
- U32 n;
1634
- U32 nextRankStart;
1635
- void* ptr = DTable+1;
1636
- HUF_DEltX2* const dt = (HUF_DEltX2*)ptr;
1637
-
1638
- HUF_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(U16)); /* if compilation fails here, assertion is false */
1639
- //memset(huffWeight, 0, sizeof(huffWeight)); /* is not necessary, even though some analyzer complain ... */
1640
-
1641
- iSize = HUF_readStats(huffWeight, HUF_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
1642
- if (HUF_isError(iSize)) return iSize;
1643
-
1644
- /* check result */
1645
- if (tableLog > DTable[0]) return ERROR(tableLog_tooLarge); /* DTable is too small */
1646
- DTable[0] = (U16)tableLog; /* maybe should separate sizeof DTable, as allocated, from used size of DTable, in case of DTable re-use */
1647
-
1648
- /* Prepare ranks */
1649
- nextRankStart = 0;
1650
- for (n=1; n<=tableLog; n++)
1651
- {
1652
- U32 current = nextRankStart;
1653
- nextRankStart += (rankVal[n] << (n-1));
1654
- rankVal[n] = current;
1655
- }
1656
-
1657
- /* fill DTable */
1658
- for (n=0; n<nbSymbols; n++)
1659
- {
1660
- const U32 w = huffWeight[n];
1661
- const U32 length = (1 << w) >> 1;
1662
- U32 i;
1663
- HUF_DEltX2 D;
1664
- D.byte = (BYTE)n; D.nbBits = (BYTE)(tableLog + 1 - w);
1665
- for (i = rankVal[w]; i < rankVal[w] + length; i++)
1666
- dt[i] = D;
1667
- rankVal[w] += length;
1668
- }
1669
-
1670
- return iSize;
1671
- }
1672
-
1673
- static BYTE HUF_decodeSymbolX2(BIT_DStream_t* Dstream, const HUF_DEltX2* dt, const U32 dtLog)
1674
- {
1675
- const size_t val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
1676
- const BYTE c = dt[val].byte;
1677
- BIT_skipBits(Dstream, dt[val].nbBits);
1678
- return c;
1679
- }
1680
-
1681
- #define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \
1682
- *ptr++ = HUF_decodeSymbolX2(DStreamPtr, dt, dtLog)
1683
-
1684
- #define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \
1685
- if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
1686
- HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
1687
-
1688
- #define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \
1689
- if (MEM_64bits()) \
1690
- HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
1691
-
1692
- static inline size_t HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX2* const dt, const U32 dtLog)
1693
- {
1694
- BYTE* const pStart = p;
1695
-
1696
- /* up to 4 symbols at a time */
1697
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-4))
1698
- {
1699
- HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
1700
- HUF_DECODE_SYMBOLX2_1(p, bitDPtr);
1701
- HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
1702
- HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1703
- }
1704
-
1705
- /* closer to the end */
1706
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p < pEnd))
1707
- HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1708
-
1709
- /* no more data to retrieve from bitstream, hence no need to reload */
1710
- while (p < pEnd)
1711
- HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1712
-
1713
- return pEnd-pStart;
1714
- }
1715
-
1716
-
1717
- static size_t HUF_decompress4X2_usingDTable(
1718
- void* dst, size_t dstSize,
1719
- const void* cSrc, size_t cSrcSize,
1720
- const U16* DTable)
1721
- {
1722
- if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
1723
-
1724
- {
1725
- const BYTE* const istart = (const BYTE*) cSrc;
1726
- BYTE* const ostart = (BYTE*) dst;
1727
- BYTE* const oend = ostart + dstSize;
1728
-
1729
- const void* ptr = DTable;
1730
- const HUF_DEltX2* const dt = ((const HUF_DEltX2*)ptr) +1;
1731
- const U32 dtLog = DTable[0];
1732
- size_t errorCode;
1733
-
1734
- /* Init */
1735
- BIT_DStream_t bitD1;
1736
- BIT_DStream_t bitD2;
1737
- BIT_DStream_t bitD3;
1738
- BIT_DStream_t bitD4;
1739
- const size_t length1 = MEM_readLE16(istart);
1740
- const size_t length2 = MEM_readLE16(istart+2);
1741
- const size_t length3 = MEM_readLE16(istart+4);
1742
- size_t length4;
1743
- const BYTE* const istart1 = istart + 6; /* jumpTable */
1744
- const BYTE* const istart2 = istart1 + length1;
1745
- const BYTE* const istart3 = istart2 + length2;
1746
- const BYTE* const istart4 = istart3 + length3;
1747
- const size_t segmentSize = (dstSize+3) / 4;
1748
- BYTE* const opStart2 = ostart + segmentSize;
1749
- BYTE* const opStart3 = opStart2 + segmentSize;
1750
- BYTE* const opStart4 = opStart3 + segmentSize;
1751
- BYTE* op1 = ostart;
1752
- BYTE* op2 = opStart2;
1753
- BYTE* op3 = opStart3;
1754
- BYTE* op4 = opStart4;
1755
- U32 endSignal;
1756
-
1757
- length4 = cSrcSize - (length1 + length2 + length3 + 6);
1758
- if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
1759
- errorCode = BIT_initDStream(&bitD1, istart1, length1);
1760
- if (HUF_isError(errorCode)) return errorCode;
1761
- errorCode = BIT_initDStream(&bitD2, istart2, length2);
1762
- if (HUF_isError(errorCode)) return errorCode;
1763
- errorCode = BIT_initDStream(&bitD3, istart3, length3);
1764
- if (HUF_isError(errorCode)) return errorCode;
1765
- errorCode = BIT_initDStream(&bitD4, istart4, length4);
1766
- if (HUF_isError(errorCode)) return errorCode;
1767
-
1768
- /* 16-32 symbols per loop (4-8 symbols per stream) */
1769
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
1770
- for ( ; (endSignal==BIT_DStream_unfinished) && (op4<(oend-7)) ; )
1771
- {
1772
- HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
1773
- HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
1774
- HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
1775
- HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
1776
- HUF_DECODE_SYMBOLX2_1(op1, &bitD1);
1777
- HUF_DECODE_SYMBOLX2_1(op2, &bitD2);
1778
- HUF_DECODE_SYMBOLX2_1(op3, &bitD3);
1779
- HUF_DECODE_SYMBOLX2_1(op4, &bitD4);
1780
- HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
1781
- HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
1782
- HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
1783
- HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
1784
- HUF_DECODE_SYMBOLX2_0(op1, &bitD1);
1785
- HUF_DECODE_SYMBOLX2_0(op2, &bitD2);
1786
- HUF_DECODE_SYMBOLX2_0(op3, &bitD3);
1787
- HUF_DECODE_SYMBOLX2_0(op4, &bitD4);
1788
-
1789
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
1790
- }
1791
-
1792
- /* check corruption */
1793
- if (op1 > opStart2) return ERROR(corruption_detected);
1794
- if (op2 > opStart3) return ERROR(corruption_detected);
1795
- if (op3 > opStart4) return ERROR(corruption_detected);
1796
- /* note : op4 supposed already verified within main loop */
1797
-
1798
- /* finish bitStreams one by one */
1799
- HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
1800
- HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
1801
- HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
1802
- HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);
1803
-
1804
- /* check */
1805
- endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
1806
- if (!endSignal) return ERROR(corruption_detected);
1807
-
1808
- /* decoded size */
1809
- return dstSize;
1810
- }
1811
- }
1812
-
1813
-
1814
- static size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
1815
- {
1816
- HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_MAX_TABLELOG);
1817
- const BYTE* ip = (const BYTE*) cSrc;
1818
- size_t errorCode;
1819
-
1820
- errorCode = HUF_readDTableX2 (DTable, cSrc, cSrcSize);
1821
- if (HUF_isError(errorCode)) return errorCode;
1822
- if (errorCode >= cSrcSize) return ERROR(srcSize_wrong);
1823
- ip += errorCode;
1824
- cSrcSize -= errorCode;
1825
-
1826
- return HUF_decompress4X2_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
1827
- }
1828
-
1829
-
1830
- /***************************/
1831
- /* double-symbols decoding */
1832
- /***************************/
1833
-
1834
- static void HUF_fillDTableX4Level2(HUF_DEltX4* DTable, U32 sizeLog, const U32 consumed,
1835
- const U32* rankValOrigin, const int minWeight,
1836
- const sortedSymbol_t* sortedSymbols, const U32 sortedListSize,
1837
- U32 nbBitsBaseline, U16 baseSeq)
1838
- {
1839
- HUF_DEltX4 DElt;
1840
- U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
1841
- U32 s;
1842
-
1843
- /* get pre-calculated rankVal */
1844
- memcpy(rankVal, rankValOrigin, sizeof(rankVal));
1845
-
1846
- /* fill skipped values */
1847
- if (minWeight>1)
1848
- {
1849
- U32 i, skipSize = rankVal[minWeight];
1850
- MEM_writeLE16(&(DElt.sequence), baseSeq);
1851
- DElt.nbBits = (BYTE)(consumed);
1852
- DElt.length = 1;
1853
- for (i = 0; i < skipSize; i++)
1854
- DTable[i] = DElt;
1855
- }
1856
-
1857
- /* fill DTable */
1858
- for (s=0; s<sortedListSize; s++) /* note : sortedSymbols already skipped */
1859
- {
1860
- const U32 symbol = sortedSymbols[s].symbol;
1861
- const U32 weight = sortedSymbols[s].weight;
1862
- const U32 nbBits = nbBitsBaseline - weight;
1863
- const U32 length = 1 << (sizeLog-nbBits);
1864
- const U32 start = rankVal[weight];
1865
- U32 i = start;
1866
- const U32 end = start + length;
1867
-
1868
- MEM_writeLE16(&(DElt.sequence), (U16)(baseSeq + (symbol << 8)));
1869
- DElt.nbBits = (BYTE)(nbBits + consumed);
1870
- DElt.length = 2;
1871
- do { DTable[i++] = DElt; } while (i<end); /* since length >= 1 */
1872
-
1873
- rankVal[weight] += length;
1874
- }
1875
- }
1876
-
1877
- typedef U32 rankVal_t[HUF_ABSOLUTEMAX_TABLELOG][HUF_ABSOLUTEMAX_TABLELOG + 1];
1878
-
1879
- static void HUF_fillDTableX4(HUF_DEltX4* DTable, const U32 targetLog,
1880
- const sortedSymbol_t* sortedList, const U32 sortedListSize,
1881
- const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight,
1882
- const U32 nbBitsBaseline)
1883
- {
1884
- U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
1885
- const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */
1886
- const U32 minBits = nbBitsBaseline - maxWeight;
1887
- U32 s;
1888
-
1889
- memcpy(rankVal, rankValOrigin, sizeof(rankVal));
1890
-
1891
- /* fill DTable */
1892
- for (s=0; s<sortedListSize; s++)
1893
- {
1894
- const U16 symbol = sortedList[s].symbol;
1895
- const U32 weight = sortedList[s].weight;
1896
- const U32 nbBits = nbBitsBaseline - weight;
1897
- const U32 start = rankVal[weight];
1898
- const U32 length = 1 << (targetLog-nbBits);
1899
-
1900
- if (targetLog-nbBits >= minBits) /* enough room for a second symbol */
1901
- {
1902
- U32 sortedRank;
1903
- int minWeight = nbBits + scaleLog;
1904
- if (minWeight < 1) minWeight = 1;
1905
- sortedRank = rankStart[minWeight];
1906
- HUF_fillDTableX4Level2(DTable+start, targetLog-nbBits, nbBits,
1907
- rankValOrigin[nbBits], minWeight,
1908
- sortedList+sortedRank, sortedListSize-sortedRank,
1909
- nbBitsBaseline, symbol);
1910
- }
1911
- else
1912
- {
1913
- U32 i;
1914
- const U32 end = start + length;
1915
- HUF_DEltX4 DElt;
1916
-
1917
- MEM_writeLE16(&(DElt.sequence), symbol);
1918
- DElt.nbBits = (BYTE)(nbBits);
1919
- DElt.length = 1;
1920
- for (i = start; i < end; i++)
1921
- DTable[i] = DElt;
1922
- }
1923
- rankVal[weight] += length;
1924
- }
1925
- }
1926
-
1927
- static size_t HUF_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
1928
- {
1929
- BYTE weightList[HUF_MAX_SYMBOL_VALUE + 1];
1930
- sortedSymbol_t sortedSymbol[HUF_MAX_SYMBOL_VALUE + 1];
1931
- U32 rankStats[HUF_ABSOLUTEMAX_TABLELOG + 1] = { 0 };
1932
- U32 rankStart0[HUF_ABSOLUTEMAX_TABLELOG + 2] = { 0 };
1933
- U32* const rankStart = rankStart0+1;
1934
- rankVal_t rankVal;
1935
- U32 tableLog, maxW, sizeOfSort, nbSymbols;
1936
- const U32 memLog = DTable[0];
1937
- const BYTE* ip = (const BYTE*) src;
1938
- size_t iSize = ip[0];
1939
- void* ptr = DTable;
1940
- HUF_DEltX4* const dt = ((HUF_DEltX4*)ptr) + 1;
1941
-
1942
- HUF_STATIC_ASSERT(sizeof(HUF_DEltX4) == sizeof(U32)); /* if compilation fails here, assertion is false */
1943
- if (memLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
1944
- //memset(weightList, 0, sizeof(weightList)); /* is not necessary, even though some analyzer complain ... */
1945
-
1946
- iSize = HUF_readStats(weightList, HUF_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
1947
- if (HUF_isError(iSize)) return iSize;
1948
-
1949
- /* check result */
1950
- if (tableLog > memLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */
1951
-
1952
- /* find maxWeight */
1953
- for (maxW = tableLog; rankStats[maxW]==0; maxW--)
1954
- {if (!maxW) return ERROR(GENERIC); } /* necessarily finds a solution before maxW==0 */
1955
-
1956
- /* Get start index of each weight */
1957
- {
1958
- U32 w, nextRankStart = 0;
1959
- for (w=1; w<=maxW; w++)
1960
- {
1961
- U32 current = nextRankStart;
1962
- nextRankStart += rankStats[w];
1963
- rankStart[w] = current;
1964
- }
1965
- rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/
1966
- sizeOfSort = nextRankStart;
1967
- }
1968
-
1969
- /* sort symbols by weight */
1970
- {
1971
- U32 s;
1972
- for (s=0; s<nbSymbols; s++)
1973
- {
1974
- U32 w = weightList[s];
1975
- U32 r = rankStart[w]++;
1976
- sortedSymbol[r].symbol = (BYTE)s;
1977
- sortedSymbol[r].weight = (BYTE)w;
1978
- }
1979
- rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
1980
- }
1981
-
1982
- /* Build rankVal */
1983
- {
1984
- const U32 minBits = tableLog+1 - maxW;
1985
- U32 nextRankVal = 0;
1986
- U32 w, consumed;
1987
- const int rescale = (memLog-tableLog) - 1; /* tableLog <= memLog */
1988
- U32* rankVal0 = rankVal[0];
1989
- for (w=1; w<=maxW; w++)
1990
- {
1991
- U32 current = nextRankVal;
1992
- nextRankVal += rankStats[w] << (w+rescale);
1993
- rankVal0[w] = current;
1994
- }
1995
- for (consumed = minBits; consumed <= memLog - minBits; consumed++)
1996
- {
1997
- U32* rankValPtr = rankVal[consumed];
1998
- for (w = 1; w <= maxW; w++)
1999
- {
2000
- rankValPtr[w] = rankVal0[w] >> consumed;
2001
- }
2002
- }
2003
- }
2004
-
2005
- HUF_fillDTableX4(dt, memLog,
2006
- sortedSymbol, sizeOfSort,
2007
- rankStart0, rankVal, maxW,
2008
- tableLog+1);
2009
-
2010
- return iSize;
2011
- }
2012
-
2013
-
2014
- static U32 HUF_decodeSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
2015
- {
2016
- const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2017
- memcpy(op, dt+val, 2);
2018
- BIT_skipBits(DStream, dt[val].nbBits);
2019
- return dt[val].length;
2020
- }
2021
-
2022
- static U32 HUF_decodeLastSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
2023
- {
2024
- const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2025
- memcpy(op, dt+val, 1);
2026
- if (dt[val].length==1) BIT_skipBits(DStream, dt[val].nbBits);
2027
- else
2028
- {
2029
- if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8))
2030
- {
2031
- BIT_skipBits(DStream, dt[val].nbBits);
2032
- if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
2033
- DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8); /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
2034
- }
2035
- }
2036
- return 1;
2037
- }
2038
-
2039
-
2040
- #define HUF_DECODE_SYMBOLX4_0(ptr, DStreamPtr) \
2041
- ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2042
-
2043
- #define HUF_DECODE_SYMBOLX4_1(ptr, DStreamPtr) \
2044
- if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
2045
- ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2046
-
2047
- #define HUF_DECODE_SYMBOLX4_2(ptr, DStreamPtr) \
2048
- if (MEM_64bits()) \
2049
- ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2050
-
2051
- static inline size_t HUF_decodeStreamX4(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, const HUF_DEltX4* const dt, const U32 dtLog)
2052
- {
2053
- BYTE* const pStart = p;
2054
-
2055
- /* up to 8 symbols at a time */
2056
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p < pEnd-7))
2057
- {
2058
- HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
2059
- HUF_DECODE_SYMBOLX4_1(p, bitDPtr);
2060
- HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
2061
- HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
2062
- }
2063
-
2064
- /* closer to the end */
2065
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-2))
2066
- HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
2067
-
2068
- while (p <= pEnd-2)
2069
- HUF_DECODE_SYMBOLX4_0(p, bitDPtr); /* no need to reload : reached the end of DStream */
2070
-
2071
- if (p < pEnd)
2072
- p += HUF_decodeLastSymbolX4(p, bitDPtr, dt, dtLog);
2073
-
2074
- return p-pStart;
2075
- }
2076
-
2077
-
2078
-
2079
- static size_t HUF_decompress4X4_usingDTable(
2080
- void* dst, size_t dstSize,
2081
- const void* cSrc, size_t cSrcSize,
2082
- const U32* DTable)
2083
- {
2084
- if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
2085
-
2086
- {
2087
- const BYTE* const istart = (const BYTE*) cSrc;
2088
- BYTE* const ostart = (BYTE*) dst;
2089
- BYTE* const oend = ostart + dstSize;
2090
-
2091
- const void* ptr = DTable;
2092
- const HUF_DEltX4* const dt = ((const HUF_DEltX4*)ptr) +1;
2093
- const U32 dtLog = DTable[0];
2094
- size_t errorCode;
2095
-
2096
- /* Init */
2097
- BIT_DStream_t bitD1;
2098
- BIT_DStream_t bitD2;
2099
- BIT_DStream_t bitD3;
2100
- BIT_DStream_t bitD4;
2101
- const size_t length1 = MEM_readLE16(istart);
2102
- const size_t length2 = MEM_readLE16(istart+2);
2103
- const size_t length3 = MEM_readLE16(istart+4);
2104
- size_t length4;
2105
- const BYTE* const istart1 = istart + 6; /* jumpTable */
2106
- const BYTE* const istart2 = istart1 + length1;
2107
- const BYTE* const istart3 = istart2 + length2;
2108
- const BYTE* const istart4 = istart3 + length3;
2109
- const size_t segmentSize = (dstSize+3) / 4;
2110
- BYTE* const opStart2 = ostart + segmentSize;
2111
- BYTE* const opStart3 = opStart2 + segmentSize;
2112
- BYTE* const opStart4 = opStart3 + segmentSize;
2113
- BYTE* op1 = ostart;
2114
- BYTE* op2 = opStart2;
2115
- BYTE* op3 = opStart3;
2116
- BYTE* op4 = opStart4;
2117
- U32 endSignal;
2118
-
2119
- length4 = cSrcSize - (length1 + length2 + length3 + 6);
2120
- if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
2121
- errorCode = BIT_initDStream(&bitD1, istart1, length1);
2122
- if (HUF_isError(errorCode)) return errorCode;
2123
- errorCode = BIT_initDStream(&bitD2, istart2, length2);
2124
- if (HUF_isError(errorCode)) return errorCode;
2125
- errorCode = BIT_initDStream(&bitD3, istart3, length3);
2126
- if (HUF_isError(errorCode)) return errorCode;
2127
- errorCode = BIT_initDStream(&bitD4, istart4, length4);
2128
- if (HUF_isError(errorCode)) return errorCode;
2129
-
2130
- /* 16-32 symbols per loop (4-8 symbols per stream) */
2131
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2132
- for ( ; (endSignal==BIT_DStream_unfinished) && (op4<(oend-7)) ; )
2133
- {
2134
- HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
2135
- HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
2136
- HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
2137
- HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
2138
- HUF_DECODE_SYMBOLX4_1(op1, &bitD1);
2139
- HUF_DECODE_SYMBOLX4_1(op2, &bitD2);
2140
- HUF_DECODE_SYMBOLX4_1(op3, &bitD3);
2141
- HUF_DECODE_SYMBOLX4_1(op4, &bitD4);
2142
- HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
2143
- HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
2144
- HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
2145
- HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
2146
- HUF_DECODE_SYMBOLX4_0(op1, &bitD1);
2147
- HUF_DECODE_SYMBOLX4_0(op2, &bitD2);
2148
- HUF_DECODE_SYMBOLX4_0(op3, &bitD3);
2149
- HUF_DECODE_SYMBOLX4_0(op4, &bitD4);
2150
-
2151
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2152
- }
2153
-
2154
- /* check corruption */
2155
- if (op1 > opStart2) return ERROR(corruption_detected);
2156
- if (op2 > opStart3) return ERROR(corruption_detected);
2157
- if (op3 > opStart4) return ERROR(corruption_detected);
2158
- /* note : op4 supposed already verified within main loop */
2159
-
2160
- /* finish bitStreams one by one */
2161
- HUF_decodeStreamX4(op1, &bitD1, opStart2, dt, dtLog);
2162
- HUF_decodeStreamX4(op2, &bitD2, opStart3, dt, dtLog);
2163
- HUF_decodeStreamX4(op3, &bitD3, opStart4, dt, dtLog);
2164
- HUF_decodeStreamX4(op4, &bitD4, oend, dt, dtLog);
2165
-
2166
- /* check */
2167
- endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
2168
- if (!endSignal) return ERROR(corruption_detected);
2169
-
2170
- /* decoded size */
2171
- return dstSize;
2172
- }
2173
- }
2174
-
2175
-
2176
- static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2177
- {
2178
- HUF_CREATE_STATIC_DTABLEX4(DTable, HUF_MAX_TABLELOG);
2179
- const BYTE* ip = (const BYTE*) cSrc;
2180
-
2181
- size_t hSize = HUF_readDTableX4 (DTable, cSrc, cSrcSize);
2182
- if (HUF_isError(hSize)) return hSize;
2183
- if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
2184
- ip += hSize;
2185
- cSrcSize -= hSize;
2186
-
2187
- return HUF_decompress4X4_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2188
- }
2189
-
2190
-
2191
- /**********************************/
2192
- /* quad-symbol decoding */
2193
- /**********************************/
2194
- typedef struct { BYTE nbBits; BYTE nbBytes; } HUF_DDescX6;
2195
- typedef union { BYTE byte[4]; U32 sequence; } HUF_DSeqX6;
2196
-
2197
- /* recursive, up to level 3; may benefit from <template>-like strategy to nest each level inline */
2198
- static void HUF_fillDTableX6LevelN(HUF_DDescX6* DDescription, HUF_DSeqX6* DSequence, int sizeLog,
2199
- const rankVal_t rankValOrigin, const U32 consumed, const int minWeight, const U32 maxWeight,
2200
- const sortedSymbol_t* sortedSymbols, const U32 sortedListSize, const U32* rankStart,
2201
- const U32 nbBitsBaseline, HUF_DSeqX6 baseSeq, HUF_DDescX6 DDesc)
2202
- {
2203
- const int scaleLog = nbBitsBaseline - sizeLog; /* note : targetLog >= (nbBitsBaseline-1), hence scaleLog <= 1 */
2204
- const int minBits = nbBitsBaseline - maxWeight;
2205
- const U32 level = DDesc.nbBytes;
2206
- U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
2207
- U32 symbolStartPos, s;
2208
-
2209
- /* local rankVal, will be modified */
2210
- memcpy(rankVal, rankValOrigin[consumed], sizeof(rankVal));
2211
-
2212
- /* fill skipped values */
2213
- if (minWeight>1)
2214
- {
2215
- U32 i;
2216
- const U32 skipSize = rankVal[minWeight];
2217
- for (i = 0; i < skipSize; i++)
2218
- {
2219
- DSequence[i] = baseSeq;
2220
- DDescription[i] = DDesc;
2221
- }
2222
- }
2223
-
2224
- /* fill DTable */
2225
- DDesc.nbBytes++;
2226
- symbolStartPos = rankStart[minWeight];
2227
- for (s=symbolStartPos; s<sortedListSize; s++)
2228
- {
2229
- const BYTE symbol = sortedSymbols[s].symbol;
2230
- const U32 weight = sortedSymbols[s].weight; /* >= 1 (sorted) */
2231
- const int nbBits = nbBitsBaseline - weight; /* >= 1 (by construction) */
2232
- const int totalBits = consumed+nbBits;
2233
- const U32 start = rankVal[weight];
2234
- const U32 length = 1 << (sizeLog-nbBits);
2235
- baseSeq.byte[level] = symbol;
2236
- DDesc.nbBits = (BYTE)totalBits;
2237
-
2238
- if ((level<3) && (sizeLog-totalBits >= minBits)) /* enough room for another symbol */
2239
- {
2240
- int nextMinWeight = totalBits + scaleLog;
2241
- if (nextMinWeight < 1) nextMinWeight = 1;
2242
- HUF_fillDTableX6LevelN(DDescription+start, DSequence+start, sizeLog-nbBits,
2243
- rankValOrigin, totalBits, nextMinWeight, maxWeight,
2244
- sortedSymbols, sortedListSize, rankStart,
2245
- nbBitsBaseline, baseSeq, DDesc); /* recursive (max : level 3) */
2246
- }
2247
- else
2248
- {
2249
- U32 i;
2250
- const U32 end = start + length;
2251
- for (i = start; i < end; i++)
2252
- {
2253
- DDescription[i] = DDesc;
2254
- DSequence[i] = baseSeq;
2255
- }
2256
- }
2257
- rankVal[weight] += length;
2258
- }
2259
- }
2260
-
2261
-
2262
- /* note : same preparation as X4 */
2263
- static size_t HUF_readDTableX6 (U32* DTable, const void* src, size_t srcSize)
2264
- {
2265
- BYTE weightList[HUF_MAX_SYMBOL_VALUE + 1];
2266
- sortedSymbol_t sortedSymbol[HUF_MAX_SYMBOL_VALUE + 1];
2267
- U32 rankStats[HUF_ABSOLUTEMAX_TABLELOG + 1] = { 0 };
2268
- U32 rankStart0[HUF_ABSOLUTEMAX_TABLELOG + 2] = { 0 };
2269
- U32* const rankStart = rankStart0+1;
2270
- U32 tableLog, maxW, sizeOfSort, nbSymbols;
2271
- rankVal_t rankVal;
2272
- const U32 memLog = DTable[0];
2273
- const BYTE* ip = (const BYTE*) src;
2274
- size_t iSize = ip[0];
2275
-
2276
- if (memLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
2277
- //memset(weightList, 0, sizeof(weightList)); /* is not necessary, even though some analyzer complain ... */
2278
-
2279
- iSize = HUF_readStats(weightList, HUF_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
2280
- if (HUF_isError(iSize)) return iSize;
2281
-
2282
- /* check result */
2283
- if (tableLog > memLog) return ERROR(tableLog_tooLarge); /* DTable is too small */
2284
-
2285
- /* find maxWeight */
2286
- for (maxW = tableLog; rankStats[maxW]==0; maxW--)
2287
- { if (!maxW) return ERROR(GENERIC); } /* necessarily finds a solution before maxW==0 */
2288
-
2289
-
2290
- /* Get start index of each weight */
2291
- {
2292
- U32 w, nextRankStart = 0;
2293
- for (w=1; w<=maxW; w++)
2294
- {
2295
- U32 current = nextRankStart;
2296
- nextRankStart += rankStats[w];
2297
- rankStart[w] = current;
2298
- }
2299
- rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/
2300
- sizeOfSort = nextRankStart;
2301
- }
2302
-
2303
- /* sort symbols by weight */
2304
- {
2305
- U32 s;
2306
- for (s=0; s<nbSymbols; s++)
2307
- {
2308
- U32 w = weightList[s];
2309
- U32 r = rankStart[w]++;
2310
- sortedSymbol[r].symbol = (BYTE)s;
2311
- sortedSymbol[r].weight = (BYTE)w;
2312
- }
2313
- rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
2314
- }
2315
-
2316
- /* Build rankVal */
2317
- {
2318
- const U32 minBits = tableLog+1 - maxW;
2319
- U32 nextRankVal = 0;
2320
- U32 w, consumed;
2321
- const int rescale = (memLog-tableLog) - 1; /* tableLog <= memLog */
2322
- U32* rankVal0 = rankVal[0];
2323
- for (w=1; w<=maxW; w++)
2324
- {
2325
- U32 current = nextRankVal;
2326
- nextRankVal += rankStats[w] << (w+rescale);
2327
- rankVal0[w] = current;
2328
- }
2329
- for (consumed = minBits; consumed <= memLog - minBits; consumed++)
2330
- {
2331
- U32* rankValPtr = rankVal[consumed];
2332
- for (w = 1; w <= maxW; w++)
2333
- {
2334
- rankValPtr[w] = rankVal0[w] >> consumed;
2335
- }
2336
- }
2337
- }
2338
-
2339
-
2340
- /* fill tables */
2341
- {
2342
- void* ptr = DTable+1;
2343
- HUF_DDescX6* DDescription = (HUF_DDescX6*)(ptr);
2344
- void* dSeqStart = DTable + 1 + ((size_t)1<<(memLog-1));
2345
- HUF_DSeqX6* DSequence = (HUF_DSeqX6*)(dSeqStart);
2346
- HUF_DSeqX6 DSeq;
2347
- HUF_DDescX6 DDesc;
2348
- DSeq.sequence = 0;
2349
- DDesc.nbBits = 0;
2350
- DDesc.nbBytes = 0;
2351
- HUF_fillDTableX6LevelN(DDescription, DSequence, memLog,
2352
- (const U32 (*)[HUF_ABSOLUTEMAX_TABLELOG + 1])rankVal, 0, 1, maxW,
2353
- sortedSymbol, sizeOfSort, rankStart0,
2354
- tableLog+1, DSeq, DDesc);
2355
- }
2356
-
2357
- return iSize;
2358
- }
2359
-
2360
-
2361
- static U32 HUF_decodeSymbolX6(void* op, BIT_DStream_t* DStream, const HUF_DDescX6* dd, const HUF_DSeqX6* ds, const U32 dtLog)
2362
- {
2363
- const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2364
- memcpy(op, ds+val, sizeof(HUF_DSeqX6));
2365
- BIT_skipBits(DStream, dd[val].nbBits);
2366
- return dd[val].nbBytes;
2367
- }
2368
-
2369
- static U32 HUF_decodeLastSymbolsX6(void* op, const U32 maxL, BIT_DStream_t* DStream,
2370
- const HUF_DDescX6* dd, const HUF_DSeqX6* ds, const U32 dtLog)
2371
- {
2372
- const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2373
- U32 length = dd[val].nbBytes;
2374
- if (length <= maxL)
2375
- {
2376
- memcpy(op, ds+val, length);
2377
- BIT_skipBits(DStream, dd[val].nbBits);
2378
- return length;
2379
- }
2380
- memcpy(op, ds+val, maxL);
2381
- if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8))
2382
- {
2383
- BIT_skipBits(DStream, dd[val].nbBits);
2384
- if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
2385
- DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8); /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
2386
- }
2387
- return maxL;
2388
- }
2389
-
2390
-
2391
- #define HUF_DECODE_SYMBOLX6_0(ptr, DStreamPtr) \
2392
- ptr += HUF_decodeSymbolX6(ptr, DStreamPtr, dd, ds, dtLog)
2393
-
2394
- #define HUF_DECODE_SYMBOLX6_1(ptr, DStreamPtr) \
2395
- if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
2396
- HUF_DECODE_SYMBOLX6_0(ptr, DStreamPtr)
2397
-
2398
- #define HUF_DECODE_SYMBOLX6_2(ptr, DStreamPtr) \
2399
- if (MEM_64bits()) \
2400
- HUF_DECODE_SYMBOLX6_0(ptr, DStreamPtr)
2401
-
2402
- static inline size_t HUF_decodeStreamX6(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, const U32* DTable, const U32 dtLog)
2403
- {
2404
- const void* ddPtr = DTable+1;
2405
- const HUF_DDescX6* dd = (const HUF_DDescX6*)(ddPtr);
2406
- const void* dsPtr = DTable + 1 + ((size_t)1<<(dtLog-1));
2407
- const HUF_DSeqX6* ds = (const HUF_DSeqX6*)(dsPtr);
2408
- BYTE* const pStart = p;
2409
-
2410
- /* up to 16 symbols at a time */
2411
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-16))
2412
- {
2413
- HUF_DECODE_SYMBOLX6_2(p, bitDPtr);
2414
- HUF_DECODE_SYMBOLX6_1(p, bitDPtr);
2415
- HUF_DECODE_SYMBOLX6_2(p, bitDPtr);
2416
- HUF_DECODE_SYMBOLX6_0(p, bitDPtr);
2417
- }
2418
-
2419
- /* closer to the end, up to 4 symbols at a time */
2420
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-4))
2421
- HUF_DECODE_SYMBOLX6_0(p, bitDPtr);
2422
-
2423
- while (p <= pEnd-4)
2424
- HUF_DECODE_SYMBOLX6_0(p, bitDPtr); /* no need to reload : reached the end of DStream */
2425
-
2426
- while (p < pEnd)
2427
- p += HUF_decodeLastSymbolsX6(p, (U32)(pEnd-p), bitDPtr, dd, ds, dtLog);
2428
-
2429
- return p-pStart;
2430
- }
2431
-
2432
-
2433
-
2434
- static size_t HUF_decompress4X6_usingDTable(
2435
- void* dst, size_t dstSize,
2436
- const void* cSrc, size_t cSrcSize,
2437
- const U32* DTable)
2438
- {
2439
- if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
2440
-
2441
- {
2442
- const BYTE* const istart = (const BYTE*) cSrc;
2443
- BYTE* const ostart = (BYTE*) dst;
2444
- BYTE* const oend = ostart + dstSize;
2445
-
2446
- const U32 dtLog = DTable[0];
2447
- const void* ddPtr = DTable+1;
2448
- const HUF_DDescX6* dd = (const HUF_DDescX6*)(ddPtr);
2449
- const void* dsPtr = DTable + 1 + ((size_t)1<<(dtLog-1));
2450
- const HUF_DSeqX6* ds = (const HUF_DSeqX6*)(dsPtr);
2451
- size_t errorCode;
2452
-
2453
- /* Init */
2454
- BIT_DStream_t bitD1;
2455
- BIT_DStream_t bitD2;
2456
- BIT_DStream_t bitD3;
2457
- BIT_DStream_t bitD4;
2458
- const size_t length1 = MEM_readLE16(istart);
2459
- const size_t length2 = MEM_readLE16(istart+2);
2460
- const size_t length3 = MEM_readLE16(istart+4);
2461
- size_t length4;
2462
- const BYTE* const istart1 = istart + 6; /* jumpTable */
2463
- const BYTE* const istart2 = istart1 + length1;
2464
- const BYTE* const istart3 = istart2 + length2;
2465
- const BYTE* const istart4 = istart3 + length3;
2466
- const size_t segmentSize = (dstSize+3) / 4;
2467
- BYTE* const opStart2 = ostart + segmentSize;
2468
- BYTE* const opStart3 = opStart2 + segmentSize;
2469
- BYTE* const opStart4 = opStart3 + segmentSize;
2470
- BYTE* op1 = ostart;
2471
- BYTE* op2 = opStart2;
2472
- BYTE* op3 = opStart3;
2473
- BYTE* op4 = opStart4;
2474
- U32 endSignal;
2475
-
2476
- length4 = cSrcSize - (length1 + length2 + length3 + 6);
2477
- if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
2478
- errorCode = BIT_initDStream(&bitD1, istart1, length1);
2479
- if (HUF_isError(errorCode)) return errorCode;
2480
- errorCode = BIT_initDStream(&bitD2, istart2, length2);
2481
- if (HUF_isError(errorCode)) return errorCode;
2482
- errorCode = BIT_initDStream(&bitD3, istart3, length3);
2483
- if (HUF_isError(errorCode)) return errorCode;
2484
- errorCode = BIT_initDStream(&bitD4, istart4, length4);
2485
- if (HUF_isError(errorCode)) return errorCode;
2486
-
2487
- /* 16-64 symbols per loop (4-16 symbols per stream) */
2488
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2489
- for ( ; (op3 <= opStart4) && (endSignal==BIT_DStream_unfinished) && (op4<=(oend-16)) ; )
2490
- {
2491
- HUF_DECODE_SYMBOLX6_2(op1, &bitD1);
2492
- HUF_DECODE_SYMBOLX6_2(op2, &bitD2);
2493
- HUF_DECODE_SYMBOLX6_2(op3, &bitD3);
2494
- HUF_DECODE_SYMBOLX6_2(op4, &bitD4);
2495
- HUF_DECODE_SYMBOLX6_1(op1, &bitD1);
2496
- HUF_DECODE_SYMBOLX6_1(op2, &bitD2);
2497
- HUF_DECODE_SYMBOLX6_1(op3, &bitD3);
2498
- HUF_DECODE_SYMBOLX6_1(op4, &bitD4);
2499
- HUF_DECODE_SYMBOLX6_2(op1, &bitD1);
2500
- HUF_DECODE_SYMBOLX6_2(op2, &bitD2);
2501
- HUF_DECODE_SYMBOLX6_2(op3, &bitD3);
2502
- HUF_DECODE_SYMBOLX6_2(op4, &bitD4);
2503
- HUF_DECODE_SYMBOLX6_0(op1, &bitD1);
2504
- HUF_DECODE_SYMBOLX6_0(op2, &bitD2);
2505
- HUF_DECODE_SYMBOLX6_0(op3, &bitD3);
2506
- HUF_DECODE_SYMBOLX6_0(op4, &bitD4);
2507
-
2508
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2509
- }
2510
-
2511
- /* check corruption */
2512
- if (op1 > opStart2) return ERROR(corruption_detected);
2513
- if (op2 > opStart3) return ERROR(corruption_detected);
2514
- if (op3 > opStart4) return ERROR(corruption_detected);
2515
- /* note : op4 supposed already verified within main loop */
2516
-
2517
- /* finish bitStreams one by one */
2518
- HUF_decodeStreamX6(op1, &bitD1, opStart2, DTable, dtLog);
2519
- HUF_decodeStreamX6(op2, &bitD2, opStart3, DTable, dtLog);
2520
- HUF_decodeStreamX6(op3, &bitD3, opStart4, DTable, dtLog);
2521
- HUF_decodeStreamX6(op4, &bitD4, oend, DTable, dtLog);
2522
-
2523
- /* check */
2524
- endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
2525
- if (!endSignal) return ERROR(corruption_detected);
2526
-
2527
- /* decoded size */
2528
- return dstSize;
2529
- }
2530
- }
2531
-
2532
-
2533
- static size_t HUF_decompress4X6 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2534
- {
2535
- HUF_CREATE_STATIC_DTABLEX6(DTable, HUF_MAX_TABLELOG);
2536
- const BYTE* ip = (const BYTE*) cSrc;
2537
-
2538
- size_t hSize = HUF_readDTableX6 (DTable, cSrc, cSrcSize);
2539
- if (HUF_isError(hSize)) return hSize;
2540
- if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
2541
- ip += hSize;
2542
- cSrcSize -= hSize;
2543
-
2544
- return HUF_decompress4X6_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2545
- }
2546
-
2547
-
2548
- /**********************************/
2549
- /* Generic decompression selector */
2550
- /**********************************/
2551
-
2552
- typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t;
2553
- static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] =
2554
- {
2555
- /* single, double, quad */
2556
- {{0,0}, {1,1}, {2,2}}, /* Q==0 : impossible */
2557
- {{0,0}, {1,1}, {2,2}}, /* Q==1 : impossible */
2558
- {{ 38,130}, {1313, 74}, {2151, 38}}, /* Q == 2 : 12-18% */
2559
- {{ 448,128}, {1353, 74}, {2238, 41}}, /* Q == 3 : 18-25% */
2560
- {{ 556,128}, {1353, 74}, {2238, 47}}, /* Q == 4 : 25-32% */
2561
- {{ 714,128}, {1418, 74}, {2436, 53}}, /* Q == 5 : 32-38% */
2562
- {{ 883,128}, {1437, 74}, {2464, 61}}, /* Q == 6 : 38-44% */
2563
- {{ 897,128}, {1515, 75}, {2622, 68}}, /* Q == 7 : 44-50% */
2564
- {{ 926,128}, {1613, 75}, {2730, 75}}, /* Q == 8 : 50-56% */
2565
- {{ 947,128}, {1729, 77}, {3359, 77}}, /* Q == 9 : 56-62% */
2566
- {{1107,128}, {2083, 81}, {4006, 84}}, /* Q ==10 : 62-69% */
2567
- {{1177,128}, {2379, 87}, {4785, 88}}, /* Q ==11 : 69-75% */
2568
- {{1242,128}, {2415, 93}, {5155, 84}}, /* Q ==12 : 75-81% */
2569
- {{1349,128}, {2644,106}, {5260,106}}, /* Q ==13 : 81-87% */
2570
- {{1455,128}, {2422,124}, {4174,124}}, /* Q ==14 : 87-93% */
2571
- {{ 722,128}, {1891,145}, {1936,146}}, /* Q ==15 : 93-99% */
2572
- };
2573
-
2574
- typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
2575
-
2576
- static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2577
- {
2578
- static const decompressionAlgo decompress[3] = { HUF_decompress4X2, HUF_decompress4X4, HUF_decompress4X6 };
2579
- /* estimate decompression time */
2580
- U32 Q;
2581
- const U32 D256 = (U32)(dstSize >> 8);
2582
- U32 Dtime[3];
2583
- U32 algoNb = 0;
2584
- int n;
2585
-
2586
- /* validation checks */
2587
- if (dstSize == 0) return ERROR(dstSize_tooSmall);
2588
- if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */
2589
- if (cSrcSize == dstSize) { memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */
2590
- if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
2591
-
2592
- /* decoder timing evaluation */
2593
- Q = (U32)(cSrcSize * 16 / dstSize); /* Q < 16 since dstSize > cSrcSize */
2594
- for (n=0; n<3; n++)
2595
- Dtime[n] = algoTime[Q][n].tableTime + (algoTime[Q][n].decode256Time * D256);
2596
-
2597
- Dtime[1] += Dtime[1] >> 4; Dtime[2] += Dtime[2] >> 3; /* advantage to algorithms using less memory, for cache eviction */
2598
-
2599
- if (Dtime[1] < Dtime[0]) algoNb = 1;
2600
- if (Dtime[2] < Dtime[algoNb]) algoNb = 2;
2601
-
2602
- return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
2603
-
2604
- //return HUF_decompress4X2(dst, dstSize, cSrc, cSrcSize); /* multi-streams single-symbol decoding */
2605
- //return HUF_decompress4X4(dst, dstSize, cSrc, cSrcSize); /* multi-streams double-symbols decoding */
2606
- //return HUF_decompress4X6(dst, dstSize, cSrc, cSrcSize); /* multi-streams quad-symbols decoding */
2607
- }
2608
- /*
2609
- zstd - standard compression library
2610
- Copyright (C) 2014-2015, Yann Collet.
2611
-
2612
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
2613
-
2614
- Redistribution and use in source and binary forms, with or without
2615
- modification, are permitted provided that the following conditions are
2616
- met:
2617
- * Redistributions of source code must retain the above copyright
2618
- notice, this list of conditions and the following disclaimer.
2619
- * Redistributions in binary form must reproduce the above
2620
- copyright notice, this list of conditions and the following disclaimer
2621
- in the documentation and/or other materials provided with the
2622
- distribution.
2623
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2624
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2625
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2626
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2627
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2628
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2629
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2630
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2631
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2632
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2633
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2634
-
2635
- You can contact the author at :
2636
- - zstd source repository : https://github.com/Cyan4973/zstd
2637
- - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
2638
- */
2639
-
2640
- /* ***************************************************************
2641
- * Tuning parameters
2642
- *****************************************************************/
2643
- /*!
2644
- * MEMORY_USAGE :
2645
- * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
2646
- * Increasing memory usage improves compression ratio
2647
- * Reduced memory usage can improve speed, due to cache effect
2648
- */
2649
- #define ZSTD_MEMORY_USAGE 17
2650
-
2651
- /*!
2652
- * HEAPMODE :
2653
- * Select how default compression functions will allocate memory for their hash table,
2654
- * in memory stack (0, fastest), or in memory heap (1, requires malloc())
2655
- * Note that compression context is fairly large, as a consequence heap memory is recommended.
2656
- */
2657
- #ifndef ZSTD_HEAPMODE
2658
- # define ZSTD_HEAPMODE 1
2659
- #endif /* ZSTD_HEAPMODE */
2660
-
2661
- /*!
2662
- * LEGACY_SUPPORT :
2663
- * decompressor can decode older formats (starting from Zstd 0.1+)
2664
- */
2665
- #ifndef ZSTD_LEGACY_SUPPORT
2666
- # define ZSTD_LEGACY_SUPPORT 1
2667
- #endif
2668
-
2669
-
2670
- /* *******************************************************
2671
- * Includes
2672
- *********************************************************/
2673
- #include <stdlib.h> /* calloc */
2674
- #include <string.h> /* memcpy, memmove */
2675
- #include <stdio.h> /* debug : printf */
2676
-
2677
-
2678
- /* *******************************************************
2679
- * Compiler specifics
2680
- *********************************************************/
2681
- #ifdef __AVX2__
2682
- # include <immintrin.h> /* AVX2 intrinsics */
2683
- #endif
2684
-
2685
- #ifdef _MSC_VER /* Visual Studio */
2686
- # include <intrin.h> /* For Visual 2005 */
2687
- # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
2688
- # pragma warning(disable : 4324) /* disable: C4324: padded structure */
2689
- #endif
2690
-
2691
-
2692
- /* *******************************************************
2693
- * Constants
2694
- *********************************************************/
2695
- #define HASH_LOG (ZSTD_MEMORY_USAGE - 2)
2696
- #define HASH_TABLESIZE (1 << HASH_LOG)
2697
- #define HASH_MASK (HASH_TABLESIZE - 1)
2698
-
2699
- #define KNUTH 2654435761
2700
-
2701
- #define BIT7 128
2702
- #define BIT6 64
2703
- #define BIT5 32
2704
- #define BIT4 16
2705
- #define BIT1 2
2706
- #define BIT0 1
2707
-
2708
- #define KB *(1 <<10)
2709
- #define MB *(1 <<20)
2710
- #define GB *(1U<<30)
2711
-
2712
- #define BLOCKSIZE (128 KB) /* define, for static allocation */
2713
- #define MIN_SEQUENCES_SIZE (2 /*seqNb*/ + 2 /*dumps*/ + 3 /*seqTables*/ + 1 /*bitStream*/)
2714
- #define MIN_CBLOCK_SIZE (3 /*litCSize*/ + MIN_SEQUENCES_SIZE)
2715
- #define IS_RAW BIT0
2716
- #define IS_RLE BIT1
2717
-
2718
- #define WORKPLACESIZE (BLOCKSIZE*3)
2719
- #define MINMATCH 4
2720
- #define MLbits 7
2721
- #define LLbits 6
2722
- #define Offbits 5
2723
- #define MaxML ((1<<MLbits )-1)
2724
- #define MaxLL ((1<<LLbits )-1)
2725
- #define MaxOff 31
2726
- #define LitFSELog 11
2727
- #define MLFSELog 10
2728
- #define LLFSELog 10
2729
- #define OffFSELog 9
2730
- #define MAX(a,b) ((a)<(b)?(b):(a))
2731
- #define MaxSeq MAX(MaxLL, MaxML)
2732
-
2733
- #define LITERAL_NOENTROPY 63
2734
- #define COMMAND_NOENTROPY 7 /* to remove */
2735
-
2736
- #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
2737
-
2738
- static const size_t ZSTD_blockHeaderSize = 3;
2739
- static const size_t ZSTD_frameHeaderSize = 4;
2740
-
2741
-
2742
- /* *******************************************************
2743
- * Memory operations
2744
- **********************************************************/
2745
- static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
2746
-
2747
- static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
2748
-
2749
- #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
2750
-
2751
- /*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
2752
- static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
2753
- {
2754
- const BYTE* ip = (const BYTE*)src;
2755
- BYTE* op = (BYTE*)dst;
2756
- BYTE* const oend = op + length;
2757
- do COPY8(op, ip) while (op < oend);
2758
- }
2759
-
2760
-
2761
- /* **************************************
2762
- * Local structures
2763
- ****************************************/
2764
- typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
2765
-
2766
- typedef struct
2767
- {
2768
- blockType_t blockType;
2769
- U32 origSize;
2770
- } blockProperties_t;
2771
-
2772
- typedef struct {
2773
- void* buffer;
2774
- U32* offsetStart;
2775
- U32* offset;
2776
- BYTE* offCodeStart;
2777
- BYTE* offCode;
2778
- BYTE* litStart;
2779
- BYTE* lit;
2780
- BYTE* litLengthStart;
2781
- BYTE* litLength;
2782
- BYTE* matchLengthStart;
2783
- BYTE* matchLength;
2784
- BYTE* dumpsStart;
2785
- BYTE* dumps;
2786
- } seqStore_t;
2787
-
2788
-
2789
- /* *************************************
2790
- * Error Management
2791
- ***************************************/
2792
- /*! ZSTD_isError
2793
- * tells if a return value is an error code */
2794
- static unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
2795
-
2796
-
2797
-
2798
- /* *************************************************************
2799
- * Decompression section
2800
- ***************************************************************/
2801
- struct ZSTD_DCtx_s
2802
- {
2803
- U32 LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
2804
- U32 OffTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
2805
- U32 MLTable[FSE_DTABLE_SIZE_U32(MLFSELog)];
2806
- void* previousDstEnd;
2807
- void* base;
2808
- size_t expected;
2809
- blockType_t bType;
2810
- U32 phase;
2811
- const BYTE* litPtr;
2812
- size_t litSize;
2813
- BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */];
2814
- }; /* typedef'd to ZSTD_Dctx within "zstd_static.h" */
2815
-
2816
-
2817
- static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
2818
- {
2819
- const BYTE* const in = (const BYTE* const)src;
2820
- BYTE headerFlags;
2821
- U32 cSize;
2822
-
2823
- if (srcSize < 3) return ERROR(srcSize_wrong);
2824
-
2825
- headerFlags = *in;
2826
- cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
2827
-
2828
- bpPtr->blockType = (blockType_t)(headerFlags >> 6);
2829
- bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
2830
-
2831
- if (bpPtr->blockType == bt_end) return 0;
2832
- if (bpPtr->blockType == bt_rle) return 1;
2833
- return cSize;
2834
- }
2835
-
2836
- static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
2837
- {
2838
- if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
2839
- if (srcSize > 0) {
2840
- memcpy(dst, src, srcSize);
2841
- }
2842
- return srcSize;
2843
- }
2844
-
2845
-
2846
- /** ZSTD_decompressLiterals
2847
- @return : nb of bytes read from src, or an error code*/
2848
- static size_t ZSTD_decompressLiterals(void* dst, size_t* maxDstSizePtr,
2849
- const void* src, size_t srcSize)
2850
- {
2851
- const BYTE* ip = (const BYTE*)src;
2852
-
2853
- const size_t litSize = (MEM_readLE32(src) & 0x1FFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2854
- const size_t litCSize = (MEM_readLE32(ip+2) & 0xFFFFFF) >> 5; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2855
-
2856
- if (litSize > *maxDstSizePtr) return ERROR(corruption_detected);
2857
- if (litCSize + 5 > srcSize) return ERROR(corruption_detected);
2858
-
2859
- if (HUF_isError(HUF_decompress(dst, litSize, ip+5, litCSize))) return ERROR(corruption_detected);
2860
-
2861
- *maxDstSizePtr = litSize;
2862
- return litCSize + 5;
2863
- }
2864
-
2865
-
2866
- /** ZSTD_decodeLiteralsBlock
2867
- @return : nb of bytes read from src (< srcSize )*/
2868
- static size_t ZSTD_decodeLiteralsBlock(void* ctx,
2869
- const void* src, size_t srcSize)
2870
- {
2871
- ZSTD_DCtx* dctx = (ZSTD_DCtx*)ctx;
2872
- const BYTE* const istart = (const BYTE* const)src;
2873
-
2874
- /* any compressed block with literals segment must be at least this size */
2875
- if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
2876
-
2877
- switch(*istart & 3)
2878
- {
2879
- default:
2880
- case 0:
2881
- {
2882
- size_t litSize = BLOCKSIZE;
2883
- const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize);
2884
- dctx->litPtr = dctx->litBuffer;
2885
- dctx->litSize = litSize;
2886
- memset(dctx->litBuffer + dctx->litSize, 0, 8);
2887
- return readSize; /* works if it's an error too */
2888
- }
2889
- case IS_RAW:
2890
- {
2891
- const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2892
- if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
2893
- {
2894
- if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
2895
- if (litSize > srcSize-3) return ERROR(corruption_detected);
2896
- memcpy(dctx->litBuffer, istart, litSize);
2897
- dctx->litPtr = dctx->litBuffer;
2898
- dctx->litSize = litSize;
2899
- memset(dctx->litBuffer + dctx->litSize, 0, 8);
2900
- return litSize+3;
2901
- }
2902
- /* direct reference into compressed stream */
2903
- dctx->litPtr = istart+3;
2904
- dctx->litSize = litSize;
2905
- return litSize+3;
2906
- }
2907
- case IS_RLE:
2908
- {
2909
- const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2910
- if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
2911
- memset(dctx->litBuffer, istart[3], litSize + 8);
2912
- dctx->litPtr = dctx->litBuffer;
2913
- dctx->litSize = litSize;
2914
- return 4;
2915
- }
2916
- }
2917
- }
2918
-
2919
-
2920
- static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
2921
- FSE_DTable* DTableLL, FSE_DTable* DTableML, FSE_DTable* DTableOffb,
2922
- const void* src, size_t srcSize)
2923
- {
2924
- const BYTE* const istart = (const BYTE* const)src;
2925
- const BYTE* ip = istart;
2926
- const BYTE* const iend = istart + srcSize;
2927
- U32 LLtype, Offtype, MLtype;
2928
- U32 LLlog, Offlog, MLlog;
2929
- size_t dumpsLength;
2930
-
2931
- /* check */
2932
- if (srcSize < 5) return ERROR(srcSize_wrong);
2933
-
2934
- /* SeqHead */
2935
- *nbSeq = MEM_readLE16(ip); ip+=2;
2936
- LLtype = *ip >> 6;
2937
- Offtype = (*ip >> 4) & 3;
2938
- MLtype = (*ip >> 2) & 3;
2939
- if (*ip & 2)
2940
- {
2941
- dumpsLength = ip[2];
2942
- dumpsLength += ip[1] << 8;
2943
- ip += 3;
2944
- }
2945
- else
2946
- {
2947
- dumpsLength = ip[1];
2948
- dumpsLength += (ip[0] & 1) << 8;
2949
- ip += 2;
2950
- }
2951
- *dumpsPtr = ip;
2952
- ip += dumpsLength;
2953
- *dumpsLengthPtr = dumpsLength;
2954
-
2955
- /* check */
2956
- if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
2957
-
2958
- /* sequences */
2959
- {
2960
- S16 norm[MaxML+1]; /* assumption : MaxML >= MaxLL and MaxOff */
2961
- size_t headerSize;
2962
-
2963
- /* Build DTables */
2964
- switch(LLtype)
2965
- {
2966
- case bt_rle :
2967
- LLlog = 0;
2968
- FSE_buildDTable_rle(DTableLL, *ip++); break;
2969
- case bt_raw :
2970
- LLlog = LLbits;
2971
- FSE_buildDTable_raw(DTableLL, LLbits); break;
2972
- default :
2973
- { U32 max = MaxLL;
2974
- headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
2975
- if (FSE_isError(headerSize)) return ERROR(GENERIC);
2976
- if (LLlog > LLFSELog) return ERROR(corruption_detected);
2977
- ip += headerSize;
2978
- FSE_buildDTable(DTableLL, norm, max, LLlog);
2979
- } }
2980
-
2981
- switch(Offtype)
2982
- {
2983
- case bt_rle :
2984
- Offlog = 0;
2985
- if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
2986
- FSE_buildDTable_rle(DTableOffb, *ip++ & MaxOff); /* if *ip > MaxOff, data is corrupted */
2987
- break;
2988
- case bt_raw :
2989
- Offlog = Offbits;
2990
- FSE_buildDTable_raw(DTableOffb, Offbits); break;
2991
- default :
2992
- { U32 max = MaxOff;
2993
- headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
2994
- if (FSE_isError(headerSize)) return ERROR(GENERIC);
2995
- if (Offlog > OffFSELog) return ERROR(corruption_detected);
2996
- ip += headerSize;
2997
- FSE_buildDTable(DTableOffb, norm, max, Offlog);
2998
- } }
2999
-
3000
- switch(MLtype)
3001
- {
3002
- case bt_rle :
3003
- MLlog = 0;
3004
- if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
3005
- FSE_buildDTable_rle(DTableML, *ip++); break;
3006
- case bt_raw :
3007
- MLlog = MLbits;
3008
- FSE_buildDTable_raw(DTableML, MLbits); break;
3009
- default :
3010
- { U32 max = MaxML;
3011
- headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
3012
- if (FSE_isError(headerSize)) return ERROR(GENERIC);
3013
- if (MLlog > MLFSELog) return ERROR(corruption_detected);
3014
- ip += headerSize;
3015
- FSE_buildDTable(DTableML, norm, max, MLlog);
3016
- } } }
3017
-
3018
- return ip-istart;
3019
- }
3020
-
3021
-
3022
- typedef struct {
3023
- size_t litLength;
3024
- size_t offset;
3025
- size_t matchLength;
3026
- } seq_t;
3027
-
3028
- typedef struct {
3029
- BIT_DStream_t DStream;
3030
- FSE_DState_t stateLL;
3031
- FSE_DState_t stateOffb;
3032
- FSE_DState_t stateML;
3033
- size_t prevOffset;
3034
- const BYTE* dumps;
3035
- const BYTE* dumpsEnd;
3036
- } seqState_t;
3037
-
3038
-
3039
- static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
3040
- {
3041
- size_t litLength;
3042
- size_t prevOffset;
3043
- size_t offset;
3044
- size_t matchLength;
3045
- const BYTE* dumps = seqState->dumps;
3046
- const BYTE* const de = seqState->dumpsEnd;
3047
-
3048
- /* Literal length */
3049
- litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
3050
- prevOffset = litLength ? seq->offset : seqState->prevOffset;
3051
- seqState->prevOffset = seq->offset;
3052
- if (litLength == MaxLL)
3053
- {
3054
- const U32 add = dumps<de ? *dumps++ : 0;
3055
- if (add < 255) litLength += add;
3056
- else if (dumps + 3 <= de)
3057
- {
3058
- litLength = MEM_readLE24(dumps);
3059
- dumps += 3;
3060
- }
3061
- if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
3062
- }
3063
-
3064
- /* Offset */
3065
- {
3066
- static const size_t offsetPrefix[MaxOff+1] = { /* note : size_t faster than U32 */
3067
- 1 /*fake*/, 1, 2, 4, 8, 16, 32, 64, 128, 256,
3068
- 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144,
3069
- 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, /*fake*/ 1, 1, 1, 1, 1 };
3070
- U32 offsetCode, nbBits;
3071
- offsetCode = FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream)); /* <= maxOff, by table construction */
3072
- if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
3073
- nbBits = offsetCode - 1;
3074
- if (offsetCode==0) nbBits = 0; /* cmove */
3075
- offset = offsetPrefix[offsetCode] + BIT_readBits(&(seqState->DStream), nbBits);
3076
- if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
3077
- if (offsetCode==0) offset = prevOffset; /* cmove */
3078
- }
3079
-
3080
- /* MatchLength */
3081
- matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
3082
- if (matchLength == MaxML)
3083
- {
3084
- const U32 add = dumps<de ? *dumps++ : 0;
3085
- if (add < 255) matchLength += add;
3086
- else if (dumps + 3 <= de)
3087
- {
3088
- matchLength = MEM_readLE24(dumps);
3089
- dumps += 3;
3090
- }
3091
- if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
3092
- }
3093
- matchLength += MINMATCH;
3094
-
3095
- /* save result */
3096
- seq->litLength = litLength;
3097
- seq->offset = offset;
3098
- seq->matchLength = matchLength;
3099
- seqState->dumps = dumps;
3100
- }
3101
-
3102
-
3103
- static size_t ZSTD_execSequence(BYTE* op,
3104
- seq_t sequence,
3105
- const BYTE** litPtr, const BYTE* const litLimit,
3106
- BYTE* const base, BYTE* const oend)
3107
- {
3108
- static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
3109
- static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
3110
- const BYTE* const ostart = op;
3111
- BYTE* const oLitEnd = op + sequence.litLength;
3112
- BYTE* const oMatchEnd = op + sequence.litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
3113
- BYTE* const oend_8 = oend-8;
3114
- const BYTE* const litEnd = *litPtr + sequence.litLength;
3115
-
3116
- /* checks */
3117
- if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
3118
- if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
3119
- if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */
3120
-
3121
- /* copy Literals */
3122
- ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
3123
- op = oLitEnd;
3124
- *litPtr = litEnd; /* update for next sequence */
3125
-
3126
- /* copy Match */
3127
- {
3128
- const BYTE* match = op - sequence.offset;
3129
-
3130
- /* check */
3131
- if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */
3132
- //if (match > op) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer removing this test ?) */
3133
- if (match < base) return ERROR(corruption_detected);
3134
-
3135
- /* close range match, overlap */
3136
- if (sequence.offset < 8)
3137
- {
3138
- const int dec64 = dec64table[sequence.offset];
3139
- op[0] = match[0];
3140
- op[1] = match[1];
3141
- op[2] = match[2];
3142
- op[3] = match[3];
3143
- match += dec32table[sequence.offset];
3144
- ZSTD_copy4(op+4, match);
3145
- match -= dec64;
3146
- }
3147
- else
3148
- {
3149
- ZSTD_copy8(op, match);
3150
- }
3151
- op += 8; match += 8;
3152
-
3153
- if (oMatchEnd > oend-(16-MINMATCH))
3154
- {
3155
- if (op < oend_8)
3156
- {
3157
- ZSTD_wildcopy(op, match, oend_8 - op);
3158
- match += oend_8 - op;
3159
- op = oend_8;
3160
- }
3161
- while (op < oMatchEnd) *op++ = *match++;
3162
- }
3163
- else
3164
- {
3165
- ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
3166
- }
3167
- }
3168
-
3169
- return oMatchEnd - ostart;
3170
- }
3171
-
3172
- static size_t ZSTD_decompressSequences(
3173
- void* ctx,
3174
- void* dst, size_t maxDstSize,
3175
- const void* seqStart, size_t seqSize)
3176
- {
3177
- ZSTD_DCtx* dctx = (ZSTD_DCtx*)ctx;
3178
- const BYTE* ip = (const BYTE*)seqStart;
3179
- const BYTE* const iend = ip + seqSize;
3180
- BYTE* const ostart = (BYTE* const)dst;
3181
- BYTE* op = ostart;
3182
- BYTE* const oend = ostart + maxDstSize;
3183
- size_t errorCode, dumpsLength;
3184
- const BYTE* litPtr = dctx->litPtr;
3185
- const BYTE* const litEnd = litPtr + dctx->litSize;
3186
- int nbSeq;
3187
- const BYTE* dumps;
3188
- U32* DTableLL = dctx->LLTable;
3189
- U32* DTableML = dctx->MLTable;
3190
- U32* DTableOffb = dctx->OffTable;
3191
- BYTE* const base = (BYTE*) (dctx->base);
3192
-
3193
- /* Build Decoding Tables */
3194
- errorCode = ZSTD_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
3195
- DTableLL, DTableML, DTableOffb,
3196
- ip, iend-ip);
3197
- if (ZSTD_isError(errorCode)) return errorCode;
3198
- ip += errorCode;
3199
-
3200
- /* Regen sequences */
3201
- {
3202
- seq_t sequence;
3203
- seqState_t seqState;
3204
-
3205
- memset(&sequence, 0, sizeof(sequence));
3206
- seqState.dumps = dumps;
3207
- seqState.dumpsEnd = dumps + dumpsLength;
3208
- seqState.prevOffset = 1;
3209
- errorCode = BIT_initDStream(&(seqState.DStream), ip, iend-ip);
3210
- if (ERR_isError(errorCode)) return ERROR(corruption_detected);
3211
- FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
3212
- FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
3213
- FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
3214
-
3215
- for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (nbSeq>0) ; )
3216
- {
3217
- size_t oneSeqSize;
3218
- nbSeq--;
3219
- ZSTD_decodeSequence(&sequence, &seqState);
3220
- oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend);
3221
- if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
3222
- op += oneSeqSize;
3223
- }
3224
-
3225
- /* check if reached exact end */
3226
- if ( !BIT_endOfDStream(&(seqState.DStream)) ) return ERROR(corruption_detected); /* requested too much : data is corrupted */
3227
- if (nbSeq<0) return ERROR(corruption_detected); /* requested too many sequences : data is corrupted */
3228
-
3229
- /* last literal segment */
3230
- {
3231
- size_t lastLLSize = litEnd - litPtr;
3232
- if (litPtr > litEnd) return ERROR(corruption_detected);
3233
- if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
3234
- if (lastLLSize > 0) {
3235
- if (op != litPtr) memmove(op, litPtr, lastLLSize);
3236
- op += lastLLSize;
3237
- }
3238
- }
3239
- }
3240
-
3241
- return op-ostart;
3242
- }
3243
-
3244
-
3245
- static size_t ZSTD_decompressBlock(
3246
- void* ctx,
3247
- void* dst, size_t maxDstSize,
3248
- const void* src, size_t srcSize)
3249
- {
3250
- /* blockType == blockCompressed */
3251
- const BYTE* ip = (const BYTE*)src;
3252
-
3253
- /* Decode literals sub-block */
3254
- size_t litCSize = ZSTD_decodeLiteralsBlock(ctx, src, srcSize);
3255
- if (ZSTD_isError(litCSize)) return litCSize;
3256
- ip += litCSize;
3257
- srcSize -= litCSize;
3258
-
3259
- return ZSTD_decompressSequences(ctx, dst, maxDstSize, ip, srcSize);
3260
- }
3261
-
3262
-
3263
- static size_t ZSTD_decompressDCtx(void* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3264
- {
3265
- const BYTE* ip = (const BYTE*)src;
3266
- const BYTE* iend = ip + srcSize;
3267
- BYTE* const ostart = (BYTE* const)dst;
3268
- BYTE* op = ostart;
3269
- BYTE* const oend = ostart + maxDstSize;
3270
- size_t remainingSize = srcSize;
3271
- U32 magicNumber;
3272
- blockProperties_t blockProperties;
3273
-
3274
- /* Frame Header */
3275
- if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
3276
- magicNumber = MEM_readLE32(src);
3277
- if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
3278
- ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
3279
-
3280
- /* Loop on each block */
3281
- while (1)
3282
- {
3283
- size_t decodedSize=0;
3284
- size_t cBlockSize = ZSTD_getcBlockSize(ip, iend-ip, &blockProperties);
3285
- if (ZSTD_isError(cBlockSize)) return cBlockSize;
3286
-
3287
- ip += ZSTD_blockHeaderSize;
3288
- remainingSize -= ZSTD_blockHeaderSize;
3289
- if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3290
-
3291
- switch(blockProperties.blockType)
3292
- {
3293
- case bt_compressed:
3294
- decodedSize = ZSTD_decompressBlock(ctx, op, oend-op, ip, cBlockSize);
3295
- break;
3296
- case bt_raw :
3297
- decodedSize = ZSTD_copyUncompressedBlock(op, oend-op, ip, cBlockSize);
3298
- break;
3299
- case bt_rle :
3300
- return ERROR(GENERIC); /* not yet supported */
3301
- break;
3302
- case bt_end :
3303
- /* end of frame */
3304
- if (remainingSize) return ERROR(srcSize_wrong);
3305
- break;
3306
- default:
3307
- return ERROR(GENERIC); /* impossible */
3308
- }
3309
- if (cBlockSize == 0) break; /* bt_end */
3310
-
3311
- if (ZSTD_isError(decodedSize)) return decodedSize;
3312
- op += decodedSize;
3313
- ip += cBlockSize;
3314
- remainingSize -= cBlockSize;
3315
- }
3316
-
3317
- return op-ostart;
3318
- }
3319
-
3320
- static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3321
- {
3322
- ZSTD_DCtx ctx;
3323
- ctx.base = dst;
3324
- return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
3325
- }
3326
-
3327
- /* ZSTD_errorFrameSizeInfoLegacy() :
3328
- assumes `cSize` and `dBound` are _not_ NULL */
3329
- static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
3330
- {
3331
- *cSize = ret;
3332
- *dBound = ZSTD_CONTENTSIZE_ERROR;
3333
- }
3334
-
3335
- void ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
3336
- {
3337
- const BYTE* ip = (const BYTE*)src;
3338
- size_t remainingSize = srcSize;
3339
- size_t nbBlocks = 0;
3340
- U32 magicNumber;
3341
- blockProperties_t blockProperties;
3342
-
3343
- /* Frame Header */
3344
- if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
3345
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3346
- return;
3347
- }
3348
- magicNumber = MEM_readLE32(src);
3349
- if (magicNumber != ZSTD_magicNumber) {
3350
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
3351
- return;
3352
- }
3353
- ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
3354
-
3355
- /* Loop on each block */
3356
- while (1)
3357
- {
3358
- size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
3359
- if (ZSTD_isError(cBlockSize)) {
3360
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
3361
- return;
3362
- }
3363
-
3364
- ip += ZSTD_blockHeaderSize;
3365
- remainingSize -= ZSTD_blockHeaderSize;
3366
- if (cBlockSize > remainingSize) {
3367
- ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3368
- return;
3369
- }
3370
-
3371
- if (cBlockSize == 0) break; /* bt_end */
3372
-
3373
- ip += cBlockSize;
3374
- remainingSize -= cBlockSize;
3375
- nbBlocks++;
3376
- }
3377
-
3378
- *cSize = ip - (const BYTE*)src;
3379
- *dBound = nbBlocks * BLOCKSIZE;
3380
- }
3381
-
3382
- /*******************************
3383
- * Streaming Decompression API
3384
- *******************************/
3385
-
3386
- static size_t ZSTD_resetDCtx(ZSTD_DCtx* dctx)
3387
- {
3388
- dctx->expected = ZSTD_frameHeaderSize;
3389
- dctx->phase = 0;
3390
- dctx->previousDstEnd = NULL;
3391
- dctx->base = NULL;
3392
- return 0;
3393
- }
3394
-
3395
- static ZSTD_DCtx* ZSTD_createDCtx(void)
3396
- {
3397
- ZSTD_DCtx* dctx = (ZSTD_DCtx*)malloc(sizeof(ZSTD_DCtx));
3398
- if (dctx==NULL) return NULL;
3399
- ZSTD_resetDCtx(dctx);
3400
- return dctx;
3401
- }
3402
-
3403
- static size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx)
3404
- {
3405
- free(dctx);
3406
- return 0;
3407
- }
3408
-
3409
- static size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx)
3410
- {
3411
- return dctx->expected;
3412
- }
3413
-
3414
- static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3415
- {
3416
- /* Sanity check */
3417
- if (srcSize != ctx->expected) return ERROR(srcSize_wrong);
3418
- if (dst != ctx->previousDstEnd) /* not contiguous */
3419
- ctx->base = dst;
3420
-
3421
- /* Decompress : frame header */
3422
- if (ctx->phase == 0)
3423
- {
3424
- /* Check frame magic header */
3425
- U32 magicNumber = MEM_readLE32(src);
3426
- if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
3427
- ctx->phase = 1;
3428
- ctx->expected = ZSTD_blockHeaderSize;
3429
- return 0;
3430
- }
3431
-
3432
- /* Decompress : block header */
3433
- if (ctx->phase == 1)
3434
- {
3435
- blockProperties_t bp;
3436
- size_t blockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
3437
- if (ZSTD_isError(blockSize)) return blockSize;
3438
- if (bp.blockType == bt_end)
3439
- {
3440
- ctx->expected = 0;
3441
- ctx->phase = 0;
3442
- }
3443
- else
3444
- {
3445
- ctx->expected = blockSize;
3446
- ctx->bType = bp.blockType;
3447
- ctx->phase = 2;
3448
- }
3449
-
3450
- return 0;
3451
- }
3452
-
3453
- /* Decompress : block content */
3454
- {
3455
- size_t rSize;
3456
- switch(ctx->bType)
3457
- {
3458
- case bt_compressed:
3459
- rSize = ZSTD_decompressBlock(ctx, dst, maxDstSize, src, srcSize);
3460
- break;
3461
- case bt_raw :
3462
- rSize = ZSTD_copyUncompressedBlock(dst, maxDstSize, src, srcSize);
3463
- break;
3464
- case bt_rle :
3465
- return ERROR(GENERIC); /* not yet handled */
3466
- break;
3467
- case bt_end : /* should never happen (filtered at phase 1) */
3468
- rSize = 0;
3469
- break;
3470
- default:
3471
- return ERROR(GENERIC);
3472
- }
3473
- ctx->phase = 1;
3474
- ctx->expected = ZSTD_blockHeaderSize;
3475
- ctx->previousDstEnd = (void*)( ((char*)dst) + rSize);
3476
- return rSize;
3477
- }
3478
-
3479
- }
3480
-
3481
-
3482
- /* wrapper layer */
3483
-
3484
- unsigned ZSTDv02_isError(size_t code)
3485
- {
3486
- return ZSTD_isError(code);
3487
- }
3488
-
3489
- size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize,
3490
- const void* src, size_t compressedSize)
3491
- {
3492
- return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
3493
- }
3494
-
3495
- ZSTDv02_Dctx* ZSTDv02_createDCtx(void)
3496
- {
3497
- return (ZSTDv02_Dctx*)ZSTD_createDCtx();
3498
- }
3499
-
3500
- size_t ZSTDv02_freeDCtx(ZSTDv02_Dctx* dctx)
3501
- {
3502
- return ZSTD_freeDCtx((ZSTD_DCtx*)dctx);
3503
- }
3504
-
3505
- size_t ZSTDv02_resetDCtx(ZSTDv02_Dctx* dctx)
3506
- {
3507
- return ZSTD_resetDCtx((ZSTD_DCtx*)dctx);
3508
- }
3509
-
3510
- size_t ZSTDv02_nextSrcSizeToDecompress(ZSTDv02_Dctx* dctx)
3511
- {
3512
- return ZSTD_nextSrcSizeToDecompress((ZSTD_DCtx*)dctx);
3513
- }
3514
-
3515
- size_t ZSTDv02_decompressContinue(ZSTDv02_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3516
- {
3517
- return ZSTD_decompressContinue((ZSTD_DCtx*)dctx, dst, maxDstSize, src, srcSize);
3518
- }