2 * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
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.
12 #include <stddef.h> /* size_t, ptrdiff_t */
14 #include "../common/error_private.h"
17 /******************************************
19 ******************************************/
20 #if defined(_MSC_VER) /* Visual Studio */
21 # include <stdlib.h> /* _byteswap_ulong */
22 # include <intrin.h> /* _byteswap_* */
26 /* ******************************************************************
28 low-level memory access routines
29 Copyright (C) 2013-2015, Yann Collet.
31 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
33 Redistribution and use in source and binary forms, with or without
34 modification, are permitted provided that the following conditions are
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
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.
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 ****************************************************************** */
63 #if defined (__cplusplus)
67 /******************************************
69 ******************************************/
70 #include <stddef.h> /* size_t, ptrdiff_t */
71 #include <string.h> /* memcpy */
74 /******************************************
76 ******************************************/
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
84 # define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
88 /****************************************************************
90 *****************************************************************/
91 #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
93 # include <inttypes.h>
95 # include <stdint.h> /* intptr_t */
100 typedef uint32_t U32;
102 typedef uint64_t U64;
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;
115 /****************************************************************
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)
131 #ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
132 # if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
133 # define MEM_FORCE_MEMORY_ACCESS 2
134 # elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
135 (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
136 # define MEM_FORCE_MEMORY_ACCESS 1
140 MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }
141 MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; }
143 MEM_STATIC unsigned MEM_isLittleEndian(void)
145 const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
149 #if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2)
151 /* violates C standard on structure alignment.
152 Only use if no other choice to achieve best performance on target platform */
153 MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; }
154 MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
155 MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
157 MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
159 #elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
161 /* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
162 /* currently only defined for gcc and icc */
163 typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign;
165 MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
166 MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
167 MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
169 MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
173 /* default method, safe and standard.
174 can sometimes prove slower */
176 MEM_STATIC U16 MEM_read16(const void* memPtr)
178 U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
181 MEM_STATIC U32 MEM_read32(const void* memPtr)
183 U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
186 MEM_STATIC U64 MEM_read64(const void* memPtr)
188 U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
191 MEM_STATIC void MEM_write16(void* memPtr, U16 value)
193 memcpy(memPtr, &value, sizeof(value));
196 #endif /* MEM_FORCE_MEMORY_ACCESS */
199 MEM_STATIC U16 MEM_readLE16(const void* memPtr)
201 if (MEM_isLittleEndian())
202 return MEM_read16(memPtr);
205 const BYTE* p = (const BYTE*)memPtr;
206 return (U16)(p[0] + (p[1]<<8));
210 MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
212 if (MEM_isLittleEndian())
214 MEM_write16(memPtr, val);
218 BYTE* p = (BYTE*)memPtr;
220 p[1] = (BYTE)(val>>8);
224 MEM_STATIC U32 MEM_readLE24(const void* memPtr)
226 return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
229 MEM_STATIC U32 MEM_readLE32(const void* memPtr)
231 if (MEM_isLittleEndian())
232 return MEM_read32(memPtr);
235 const BYTE* p = (const BYTE*)memPtr;
236 return (U32)((U32)p[0] + ((U32)p[1]<<8) + ((U32)p[2]<<16) + ((U32)p[3]<<24));
241 MEM_STATIC U64 MEM_readLE64(const void* memPtr)
243 if (MEM_isLittleEndian())
244 return MEM_read64(memPtr);
247 const BYTE* p = (const BYTE*)memPtr;
248 return (U64)((U64)p[0] + ((U64)p[1]<<8) + ((U64)p[2]<<16) + ((U64)p[3]<<24)
249 + ((U64)p[4]<<32) + ((U64)p[5]<<40) + ((U64)p[6]<<48) + ((U64)p[7]<<56));
254 MEM_STATIC size_t MEM_readLEST(const void* memPtr)
257 return (size_t)MEM_readLE32(memPtr);
259 return (size_t)MEM_readLE64(memPtr);
262 #if defined (__cplusplus)
266 #endif /* MEM_H_MODULE */
269 /* ******************************************************************
271 Part of NewGen Entropy library
272 header file (to include)
273 Copyright (C) 2013-2015, Yann Collet.
275 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
277 Redistribution and use in source and binary forms, with or without
278 modification, are permitted provided that the following conditions are
281 * Redistributions of source code must retain the above copyright
282 notice, this list of conditions and the following disclaimer.
283 * Redistributions in binary form must reproduce the above
284 copyright notice, this list of conditions and the following disclaimer
285 in the documentation and/or other materials provided with the
288 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
289 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
290 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
291 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
292 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
293 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
294 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
295 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
296 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
297 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
298 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
300 You can contact the author at :
301 - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
302 - Public forum : https://groups.google.com/forum/#!forum/lz4c
303 ****************************************************************** */
304 #ifndef BITSTREAM_H_MODULE
305 #define BITSTREAM_H_MODULE
307 #if defined (__cplusplus)
313 * This API consists of small unitary functions, which highly benefit from being inlined.
314 * Since link-time-optimization is not available for all compilers,
315 * these functions are defined into a .h to be included.
319 /**********************************************
320 * bitStream decompression API (read backward)
321 **********************************************/
325 unsigned bitsConsumed;
330 typedef enum { BIT_DStream_unfinished = 0,
331 BIT_DStream_endOfBuffer = 1,
332 BIT_DStream_completed = 2,
333 BIT_DStream_overflow = 3 } BIT_DStream_status; /* result of BIT_reloadDStream() */
334 /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
336 MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize);
337 MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits);
338 MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
339 MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
342 /******************************************
344 ******************************************/
345 MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
346 /* faster, but works only if nbBits >= 1 */
350 /****************************************************************
352 ****************************************************************/
353 MEM_STATIC unsigned BIT_highbit32 (U32 val)
355 # if defined(_MSC_VER) /* Visual */
357 _BitScanReverse ( &r, val );
359 # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
360 return __builtin_clz (val) ^ 31;
361 # else /* Software version */
362 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 };
370 r = DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27];
377 /**********************************************************
379 **********************************************************/
382 * Initialize a BIT_DStream_t.
383 * @bitD : a pointer to an already allocated BIT_DStream_t structure
384 * @srcBuffer must point at the beginning of a bitStream
385 * @srcSize must be the exact size of the bitStream
386 * @result : size of stream (== srcSize) or an errorCode if a problem is detected
388 MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
390 if (srcSize < 1) { memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); }
392 if (srcSize >= sizeof(size_t)) /* normal case */
395 bitD->start = (const char*)srcBuffer;
396 bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(size_t);
397 bitD->bitContainer = MEM_readLEST(bitD->ptr);
398 contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
399 if (contain32 == 0) return ERROR(GENERIC); /* endMark not present */
400 bitD->bitsConsumed = 8 - BIT_highbit32(contain32);
405 bitD->start = (const char*)srcBuffer;
406 bitD->ptr = bitD->start;
407 bitD->bitContainer = *(const BYTE*)(bitD->start);
410 case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);
412 case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);
414 case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);
416 case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
418 case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
420 case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
424 contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
425 if (contain32 == 0) return ERROR(GENERIC); /* endMark not present */
426 bitD->bitsConsumed = 8 - BIT_highbit32(contain32);
427 bitD->bitsConsumed += (U32)(sizeof(size_t) - srcSize)*8;
433 MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
435 const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
436 return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
439 /*! BIT_lookBitsFast :
440 * unsafe version; only works only if nbBits >= 1 */
441 MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)
443 const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
444 return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
447 MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
449 bitD->bitsConsumed += nbBits;
452 MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
454 size_t value = BIT_lookBits(bitD, nbBits);
455 BIT_skipBits(bitD, nbBits);
459 /*!BIT_readBitsFast :
460 * unsafe version; only works only if nbBits >= 1 */
461 MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
463 size_t value = BIT_lookBitsFast(bitD, nbBits);
464 BIT_skipBits(bitD, nbBits);
468 MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
470 if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
471 return BIT_DStream_overflow;
473 if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
475 bitD->ptr -= bitD->bitsConsumed >> 3;
476 bitD->bitsConsumed &= 7;
477 bitD->bitContainer = MEM_readLEST(bitD->ptr);
478 return BIT_DStream_unfinished;
480 if (bitD->ptr == bitD->start)
482 if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
483 return BIT_DStream_completed;
486 U32 nbBytes = bitD->bitsConsumed >> 3;
487 BIT_DStream_status result = BIT_DStream_unfinished;
488 if (bitD->ptr - nbBytes < bitD->start)
490 nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */
491 result = BIT_DStream_endOfBuffer;
493 bitD->ptr -= nbBytes;
494 bitD->bitsConsumed -= nbBytes*8;
495 bitD->bitContainer = MEM_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD) */
501 * @return Tells if DStream has reached its exact end
503 MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)
505 return ((DStream->ptr == DStream->start) && (DStream->bitsConsumed == sizeof(DStream->bitContainer)*8));
508 #if defined (__cplusplus)
512 #endif /* BITSTREAM_H_MODULE */
513 /* ******************************************************************
514 Error codes and messages
515 Copyright (C) 2013-2015, Yann Collet
517 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
519 Redistribution and use in source and binary forms, with or without
520 modification, are permitted provided that the following conditions are
523 * Redistributions of source code must retain the above copyright
524 notice, this list of conditions and the following disclaimer.
525 * Redistributions in binary form must reproduce the above
526 copyright notice, this list of conditions and the following disclaimer
527 in the documentation and/or other materials provided with the
530 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
531 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
532 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
533 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
534 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
535 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
536 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
537 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
538 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
539 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
540 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
542 You can contact the author at :
543 - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
544 - Public forum : https://groups.google.com/forum/#!forum/lz4c
545 ****************************************************************** */
546 #ifndef ERROR_H_MODULE
547 #define ERROR_H_MODULE
549 #if defined (__cplusplus)
554 /******************************************
556 ******************************************/
557 #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
558 # define ERR_STATIC static inline
559 #elif defined(_MSC_VER)
560 # define ERR_STATIC static __inline
561 #elif defined(__GNUC__)
562 # define ERR_STATIC static __attribute__((unused))
564 # define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
568 /******************************************
570 ******************************************/
571 #define PREFIX(name) ZSTD_error_##name
573 #define ERROR(name) (size_t)-PREFIX(name)
575 #define ERROR_LIST(ITEM) \
576 ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \
577 ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \
578 ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(corruption_detected)) \
579 ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \
580 ITEM(PREFIX(maxCode))
582 #define ERROR_GENERATE_ENUM(ENUM) ENUM,
583 typedef enum { ERROR_LIST(ERROR_GENERATE_ENUM) } ERR_codes; /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */
585 #define ERROR_CONVERTTOSTRING(STRING) #STRING,
586 #define ERROR_GENERATE_STRING(EXPR) ERROR_CONVERTTOSTRING(EXPR)
587 static const char* ERR_strings[] = { ERROR_LIST(ERROR_GENERATE_STRING) };
589 ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
591 ERR_STATIC const char* ERR_getErrorName(size_t code)
593 static const char* codeError = "Unspecified error code";
594 if (ERR_isError(code)) return ERR_strings[-(int)(code)];
599 #if defined (__cplusplus)
603 #endif /* ERROR_H_MODULE */
605 Constructor and Destructor of type FSE_CTable
606 Note that its size depends on 'tableLog' and 'maxSymbolValue' */
607 typedef unsigned FSE_CTable; /* don't allocate that. It's just a way to be more restrictive than void* */
608 typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
611 /* ******************************************************************
612 FSE : Finite State Entropy coder
613 header file for static linking (only)
614 Copyright (C) 2013-2015, Yann Collet
616 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
618 Redistribution and use in source and binary forms, with or without
619 modification, are permitted provided that the following conditions are
622 * Redistributions of source code must retain the above copyright
623 notice, this list of conditions and the following disclaimer.
624 * Redistributions in binary form must reproduce the above
625 copyright notice, this list of conditions and the following disclaimer
626 in the documentation and/or other materials provided with the
629 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
630 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
631 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
632 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
633 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
634 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
635 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
636 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
637 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
638 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
639 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
641 You can contact the author at :
642 - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
643 - Public forum : https://groups.google.com/forum/#!forum/lz4c
644 ****************************************************************** */
645 #if defined (__cplusplus)
650 /******************************************
652 ******************************************/
653 /* FSE buffer bounds */
654 #define FSE_NCOUNTBOUND 512
655 #define FSE_BLOCKBOUND(size) (size + (size>>7))
656 #define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
658 /* You can statically allocate FSE CTable/DTable as a table of unsigned using below macro */
659 #define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))
660 #define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<maxTableLog))
663 /******************************************
665 ******************************************/
666 static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits);
667 /* build a fake FSE_DTable, designed to read an uncompressed bitstream where each symbol uses nbBits */
669 static size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue);
670 /* build a fake FSE_DTable, designed to always generate the same symbolValue */
673 /******************************************
674 * FSE symbol decompression API
675 ******************************************/
679 const void* table; /* precise table may vary, depending on U16 */
683 static void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt);
685 static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
687 static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
690 /******************************************
692 ******************************************/
693 static unsigned char FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
694 /* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */
697 /******************************************
698 * Implementation of inline functions
699 ******************************************/
706 } FSE_DTableHeader; /* sizeof U32 */
710 unsigned short newState;
711 unsigned char symbol;
712 unsigned char nbBits;
713 } FSE_decode_t; /* size == U32 */
715 MEM_STATIC void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt)
717 FSE_DTableHeader DTableH;
718 memcpy(&DTableH, dt, sizeof(DTableH));
719 DStatePtr->state = BIT_readBits(bitD, DTableH.tableLog);
720 BIT_reloadDStream(bitD);
721 DStatePtr->table = dt + 1;
724 MEM_STATIC BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
726 const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
727 const U32 nbBits = DInfo.nbBits;
728 BYTE symbol = DInfo.symbol;
729 size_t lowBits = BIT_readBits(bitD, nbBits);
731 DStatePtr->state = DInfo.newState + lowBits;
735 MEM_STATIC BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
737 const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
738 const U32 nbBits = DInfo.nbBits;
739 BYTE symbol = DInfo.symbol;
740 size_t lowBits = BIT_readBitsFast(bitD, nbBits);
742 DStatePtr->state = DInfo.newState + lowBits;
746 MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
748 return DStatePtr->state == 0;
752 #if defined (__cplusplus)
755 /* ******************************************************************
756 Huff0 : Huffman coder, part of New Generation Entropy library
757 header file for static linking (only)
758 Copyright (C) 2013-2015, Yann Collet
760 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
762 Redistribution and use in source and binary forms, with or without
763 modification, are permitted provided that the following conditions are
766 * Redistributions of source code must retain the above copyright
767 notice, this list of conditions and the following disclaimer.
768 * Redistributions in binary form must reproduce the above
769 copyright notice, this list of conditions and the following disclaimer
770 in the documentation and/or other materials provided with the
773 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
774 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
775 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
776 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
777 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
778 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
779 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
780 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
781 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
782 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
783 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
785 You can contact the author at :
786 - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
787 - Public forum : https://groups.google.com/forum/#!forum/lz4c
788 ****************************************************************** */
790 #if defined (__cplusplus)
794 /******************************************
795 * Static allocation macros
796 ******************************************/
797 /* Huff0 buffer bounds */
798 #define HUF_CTABLEBOUND 129
799 #define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true if incompressible pre-filtered with fast heuristic */
800 #define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
802 /* static allocation of Huff0's DTable */
803 #define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<maxTableLog)) /* nb Cells; use unsigned short for X2, unsigned int for X4 */
804 #define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
805 unsigned short DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
806 #define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \
807 unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
808 #define HUF_CREATE_STATIC_DTABLEX6(DTable, maxTableLog) \
809 unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog) * 3 / 2] = { maxTableLog }
812 /******************************************
814 ******************************************/
815 static size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
816 static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbols decoder */
817 static size_t HUF_decompress4X6 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* quad-symbols decoder */
820 #if defined (__cplusplus)
825 zstd - standard compression library
827 Copyright (C) 2014-2015, Yann Collet.
829 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
831 Redistribution and use in source and binary forms, with or without
832 modification, are permitted provided that the following conditions are
834 * Redistributions of source code must retain the above copyright
835 notice, this list of conditions and the following disclaimer.
836 * Redistributions in binary form must reproduce the above
837 copyright notice, this list of conditions and the following disclaimer
838 in the documentation and/or other materials provided with the
840 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
841 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
842 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
843 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
844 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
845 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
846 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
847 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
848 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
849 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
850 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
852 You can contact the author at :
853 - zstd source repository : https://github.com/Cyan4973/zstd
854 - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
857 #if defined (__cplusplus)
861 /* *************************************
863 ***************************************/
864 #include <stddef.h> /* size_t */
867 /* *************************************
869 ***************************************/
870 #define ZSTD_VERSION_MAJOR 0 /* for breaking interface changes */
871 #define ZSTD_VERSION_MINOR 2 /* for new (non-breaking) interface capabilities */
872 #define ZSTD_VERSION_RELEASE 2 /* for tweaks, bug-fixes, or development */
873 #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
876 /* *************************************
878 ***************************************/
879 typedef struct ZSTD_CCtx_s ZSTD_CCtx; /* incomplete type */
881 #if defined (__cplusplus)
885 zstd - standard compression library
886 Header File for static linking only
887 Copyright (C) 2014-2015, Yann Collet.
889 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
891 Redistribution and use in source and binary forms, with or without
892 modification, are permitted provided that the following conditions are
894 * Redistributions of source code must retain the above copyright
895 notice, this list of conditions and the following disclaimer.
896 * Redistributions in binary form must reproduce the above
897 copyright notice, this list of conditions and the following disclaimer
898 in the documentation and/or other materials provided with the
900 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
901 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
902 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
903 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
904 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
905 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
906 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
907 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
908 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
909 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
910 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
912 You can contact the author at :
913 - zstd source repository : https://github.com/Cyan4973/zstd
914 - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
917 /* The objects defined into this file should be considered experimental.
918 * They are not labelled stable, as their prototype may change in the future.
919 * You can use them for tests, provide feedback, or if you can endure risk of future changes.
922 #if defined (__cplusplus)
926 /* *************************************
927 * Streaming functions
928 ***************************************/
930 typedef struct ZSTD_DCtx_s ZSTD_DCtx;
933 Use above functions alternatively.
934 ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue().
935 ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block.
936 Result is the number of bytes regenerated within 'dst'.
937 It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header.
940 /* *************************************
941 * Prefix - version detection
942 ***************************************/
943 #define ZSTD_magicNumber 0xFD2FB522 /* v0.2 (current)*/
946 #if defined (__cplusplus)
949 /* ******************************************************************
950 FSE : Finite State Entropy coder
951 Copyright (C) 2013-2015, Yann Collet.
953 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
955 Redistribution and use in source and binary forms, with or without
956 modification, are permitted provided that the following conditions are
959 * Redistributions of source code must retain the above copyright
960 notice, this list of conditions and the following disclaimer.
961 * Redistributions in binary form must reproduce the above
962 copyright notice, this list of conditions and the following disclaimer
963 in the documentation and/or other materials provided with the
966 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
967 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
968 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
969 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
970 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
971 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
972 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
973 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
974 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
975 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
976 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
978 You can contact the author at :
979 - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
980 - Public forum : https://groups.google.com/forum/#!forum/lz4c
981 ****************************************************************** */
983 #ifndef FSE_COMMONDEFS_ONLY
985 /****************************************************************
987 ****************************************************************/
989 * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
990 * Increasing memory usage improves compression ratio
991 * Reduced memory usage can improve speed, due to cache effect
992 * Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
993 #define FSE_MAX_MEMORY_USAGE 14
994 #define FSE_DEFAULT_MEMORY_USAGE 13
996 /* FSE_MAX_SYMBOL_VALUE :
997 * Maximum symbol value authorized.
998 * Required for proper stack allocation */
999 #define FSE_MAX_SYMBOL_VALUE 255
1002 /****************************************************************
1003 * template functions type & suffix
1004 ****************************************************************/
1005 #define FSE_FUNCTION_TYPE BYTE
1006 #define FSE_FUNCTION_EXTENSION
1009 /****************************************************************
1011 ****************************************************************/
1012 #endif /* !FSE_COMMONDEFS_ONLY */
1015 /****************************************************************
1016 * Compiler specifics
1017 ****************************************************************/
1018 #ifdef _MSC_VER /* Visual Studio */
1019 # define FORCE_INLINE static __forceinline
1020 # include <intrin.h> /* For Visual 2005 */
1021 # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
1022 # pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
1024 # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
1026 # define FORCE_INLINE static inline __attribute__((always_inline))
1028 # define FORCE_INLINE static inline
1031 # define FORCE_INLINE static
1032 # endif /* __STDC_VERSION__ */
1036 /****************************************************************
1038 ****************************************************************/
1039 #include <stdlib.h> /* malloc, free, qsort */
1040 #include <string.h> /* memcpy, memset */
1041 #include <stdio.h> /* printf (debug) */
1043 /****************************************************************
1045 *****************************************************************/
1046 #define FSE_MAX_TABLELOG (FSE_MAX_MEMORY_USAGE-2)
1047 #define FSE_MAX_TABLESIZE (1U<<FSE_MAX_TABLELOG)
1048 #define FSE_MAXTABLESIZE_MASK (FSE_MAX_TABLESIZE-1)
1049 #define FSE_DEFAULT_TABLELOG (FSE_DEFAULT_MEMORY_USAGE-2)
1050 #define FSE_MIN_TABLELOG 5
1052 #define FSE_TABLELOG_ABSOLUTE_MAX 15
1053 #if FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX
1054 #error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
1058 /****************************************************************
1060 ****************************************************************/
1061 #define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
1064 /****************************************************************
1066 ****************************************************************/
1067 typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
1070 /****************************************************************
1072 ****************************************************************/
1074 designed to be included
1075 for type-specific functions (template emulation in C)
1076 Objective is to write these functions only once, for improved maintenance
1080 #ifndef FSE_FUNCTION_EXTENSION
1081 # error "FSE_FUNCTION_EXTENSION must be defined"
1083 #ifndef FSE_FUNCTION_TYPE
1084 # error "FSE_FUNCTION_TYPE must be defined"
1087 /* Function names */
1088 #define FSE_CAT(X,Y) X##Y
1089 #define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
1090 #define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
1093 /* Function templates */
1095 #define FSE_DECODE_TYPE FSE_decode_t
1097 static U32 FSE_tableStep(U32 tableSize) { return (tableSize>>1) + (tableSize>>3) + 3; }
1099 static size_t FSE_buildDTable
1100 (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
1103 FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*)ptr;
1104 FSE_DTableHeader DTableH;
1105 const U32 tableSize = 1 << tableLog;
1106 const U32 tableMask = tableSize-1;
1107 const U32 step = FSE_tableStep(tableSize);
1108 U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
1110 U32 highThreshold = tableSize-1;
1111 const S16 largeLimit= (S16)(1 << (tableLog-1));
1116 if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return ERROR(maxSymbolValue_tooLarge);
1117 if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
1119 /* Init, lay down lowprob symbols */
1120 DTableH.tableLog = (U16)tableLog;
1121 for (s=0; s<=maxSymbolValue; s++)
1123 if (normalizedCounter[s]==-1)
1125 tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
1130 if (normalizedCounter[s] >= largeLimit) noLarge=0;
1131 symbolNext[s] = normalizedCounter[s];
1135 /* Spread symbols */
1136 for (s=0; s<=maxSymbolValue; s++)
1139 for (i=0; i<normalizedCounter[s]; i++)
1141 tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
1142 position = (position + step) & tableMask;
1143 while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
1147 if (position!=0) return ERROR(GENERIC); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
1149 /* Build Decoding table */
1152 for (i=0; i<tableSize; i++)
1154 FSE_FUNCTION_TYPE symbol = (FSE_FUNCTION_TYPE)(tableDecode[i].symbol);
1155 U16 nextState = symbolNext[symbol]++;
1156 tableDecode[i].nbBits = (BYTE) (tableLog - BIT_highbit32 ((U32)nextState) );
1157 tableDecode[i].newState = (U16) ( (nextState << tableDecode[i].nbBits) - tableSize);
1161 DTableH.fastMode = (U16)noLarge;
1162 memcpy(dt, &DTableH, sizeof(DTableH)); /* memcpy(), to avoid strict aliasing warnings */
1167 #ifndef FSE_COMMONDEFS_ONLY
1168 /******************************************
1169 * FSE helper functions
1170 ******************************************/
1171 static unsigned FSE_isError(size_t code) { return ERR_isError(code); }
1174 /****************************************************************
1175 * FSE NCount encoding-decoding
1176 ****************************************************************/
1177 static short FSE_abs(short a)
1179 return (short)(a<0 ? -a : a);
1182 static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
1183 const void* headerBuffer, size_t hbSize)
1185 const BYTE* const istart = (const BYTE*) headerBuffer;
1186 const BYTE* const iend = istart + hbSize;
1187 const BYTE* ip = istart;
1193 unsigned charnum = 0;
1196 if (hbSize < 4) return ERROR(srcSize_wrong);
1197 bitStream = MEM_readLE32(ip);
1198 nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
1199 if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge);
1202 *tableLogPtr = nbBits;
1203 remaining = (1<<nbBits)+1;
1204 threshold = 1<<nbBits;
1207 while ((remaining>1) && (charnum<=*maxSVPtr))
1211 unsigned n0 = charnum;
1212 while ((bitStream & 0xFFFF) == 0xFFFF)
1218 bitStream = MEM_readLE32(ip) >> bitCount;
1226 while ((bitStream & 3) == 3)
1232 n0 += bitStream & 3;
1234 if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall);
1235 while (charnum < n0) normalizedCounter[charnum++] = 0;
1236 if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
1240 bitStream = MEM_readLE32(ip) >> bitCount;
1246 const short max = (short)((2*threshold-1)-remaining);
1249 if ((bitStream & (threshold-1)) < (U32)max)
1251 count = (short)(bitStream & (threshold-1));
1252 bitCount += nbBits-1;
1256 count = (short)(bitStream & (2*threshold-1));
1257 if (count >= threshold) count -= max;
1261 count--; /* extra accuracy */
1262 remaining -= FSE_abs(count);
1263 normalizedCounter[charnum++] = count;
1265 while (remaining < threshold)
1272 if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
1279 bitCount -= (int)(8 * (iend - 4 - ip));
1282 bitStream = MEM_readLE32(ip) >> (bitCount & 31);
1286 if (remaining != 1) return ERROR(GENERIC);
1287 *maxSVPtr = charnum-1;
1289 ip += (bitCount+7)>>3;
1290 if ((size_t)(ip-istart) > hbSize) return ERROR(srcSize_wrong);
1295 /*********************************************************
1296 * Decompression (Byte symbols)
1297 *********************************************************/
1298 static size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
1301 FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
1302 FSE_decode_t* const cell = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
1304 DTableH->tableLog = 0;
1305 DTableH->fastMode = 0;
1308 cell->symbol = symbolValue;
1315 static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
1318 FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
1319 FSE_decode_t* const dinfo = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
1320 const unsigned tableSize = 1 << nbBits;
1321 const unsigned tableMask = tableSize - 1;
1322 const unsigned maxSymbolValue = tableMask;
1326 if (nbBits < 1) return ERROR(GENERIC); /* min size */
1328 /* Build Decoding Table */
1329 DTableH->tableLog = (U16)nbBits;
1330 DTableH->fastMode = 1;
1331 for (s=0; s<=maxSymbolValue; s++)
1333 dinfo[s].newState = 0;
1334 dinfo[s].symbol = (BYTE)s;
1335 dinfo[s].nbBits = (BYTE)nbBits;
1341 FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
1342 void* dst, size_t maxDstSize,
1343 const void* cSrc, size_t cSrcSize,
1344 const FSE_DTable* dt, const unsigned fast)
1346 BYTE* const ostart = (BYTE*) dst;
1348 BYTE* const omax = op + maxDstSize;
1349 BYTE* const olimit = omax-3;
1352 FSE_DState_t state1;
1353 FSE_DState_t state2;
1357 errorCode = BIT_initDStream(&bitD, cSrc, cSrcSize); /* replaced last arg by maxCompressed Size */
1358 if (FSE_isError(errorCode)) return errorCode;
1360 FSE_initDState(&state1, &bitD, dt);
1361 FSE_initDState(&state2, &bitD, dt);
1363 #define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
1365 /* 4 symbols per loop */
1366 for ( ; (BIT_reloadDStream(&bitD)==BIT_DStream_unfinished) && (op<olimit) ; op+=4)
1368 op[0] = FSE_GETSYMBOL(&state1);
1370 if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
1371 BIT_reloadDStream(&bitD);
1373 op[1] = FSE_GETSYMBOL(&state2);
1375 if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
1376 { if (BIT_reloadDStream(&bitD) > BIT_DStream_unfinished) { op+=2; break; } }
1378 op[2] = FSE_GETSYMBOL(&state1);
1380 if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
1381 BIT_reloadDStream(&bitD);
1383 op[3] = FSE_GETSYMBOL(&state2);
1387 /* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */
1390 if ( (BIT_reloadDStream(&bitD)>BIT_DStream_completed) || (op==omax) || (BIT_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state1))) )
1393 *op++ = FSE_GETSYMBOL(&state1);
1395 if ( (BIT_reloadDStream(&bitD)>BIT_DStream_completed) || (op==omax) || (BIT_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state2))) )
1398 *op++ = FSE_GETSYMBOL(&state2);
1402 if (BIT_endOfDStream(&bitD) && FSE_endOfDState(&state1) && FSE_endOfDState(&state2))
1405 if (op==omax) return ERROR(dstSize_tooSmall); /* dst buffer is full, but cSrc unfinished */
1407 return ERROR(corruption_detected);
1411 static size_t FSE_decompress_usingDTable(void* dst, size_t originalSize,
1412 const void* cSrc, size_t cSrcSize,
1413 const FSE_DTable* dt)
1415 FSE_DTableHeader DTableH;
1416 memcpy(&DTableH, dt, sizeof(DTableH));
1418 /* select fast mode (static) */
1419 if (DTableH.fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
1420 return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
1424 static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1426 const BYTE* const istart = (const BYTE*)cSrc;
1427 const BYTE* ip = istart;
1428 short counting[FSE_MAX_SYMBOL_VALUE+1];
1429 DTable_max_t dt; /* Static analyzer seems unable to understand this table will be properly initialized later */
1431 unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
1434 if (cSrcSize<2) return ERROR(srcSize_wrong); /* too small input size */
1436 /* normal FSE decoding mode */
1437 errorCode = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
1438 if (FSE_isError(errorCode)) return errorCode;
1439 if (errorCode >= cSrcSize) return ERROR(srcSize_wrong); /* too small input size */
1441 cSrcSize -= errorCode;
1443 errorCode = FSE_buildDTable (dt, counting, maxSymbolValue, tableLog);
1444 if (FSE_isError(errorCode)) return errorCode;
1446 /* always return, even if it is an error code */
1447 return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);
1452 #endif /* FSE_COMMONDEFS_ONLY */
1453 /* ******************************************************************
1454 Huff0 : Huffman coder, part of New Generation Entropy library
1455 Copyright (C) 2013-2015, Yann Collet.
1457 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1459 Redistribution and use in source and binary forms, with or without
1460 modification, are permitted provided that the following conditions are
1463 * Redistributions of source code must retain the above copyright
1464 notice, this list of conditions and the following disclaimer.
1465 * Redistributions in binary form must reproduce the above
1466 copyright notice, this list of conditions and the following disclaimer
1467 in the documentation and/or other materials provided with the
1470 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1471 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1472 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1473 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1474 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1475 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1476 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1477 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1478 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1479 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1480 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1482 You can contact the author at :
1483 - FSE+Huff0 source repository : https://github.com/Cyan4973/FiniteStateEntropy
1484 - Public forum : https://groups.google.com/forum/#!forum/lz4c
1485 ****************************************************************** */
1487 /****************************************************************
1488 * Compiler specifics
1489 ****************************************************************/
1490 #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
1491 /* inline is defined */
1492 #elif defined(_MSC_VER)
1493 # define inline __inline
1495 # define inline /* disable inline */
1499 #ifdef _MSC_VER /* Visual Studio */
1500 # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
1504 /****************************************************************
1506 ****************************************************************/
1507 #include <stdlib.h> /* malloc, free, qsort */
1508 #include <string.h> /* memcpy, memset */
1509 #include <stdio.h> /* printf (debug) */
1511 /****************************************************************
1513 ****************************************************************/
1514 #define HUF_STATIC_ASSERT(c) { enum { HUF_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
1517 /******************************************
1519 ******************************************/
1520 static unsigned HUF_isError(size_t code) { return ERR_isError(code); }
1522 #define HUF_ABSOLUTEMAX_TABLELOG 16 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
1523 #define HUF_MAX_TABLELOG 12 /* max configured tableLog (for static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */
1524 #define HUF_DEFAULT_TABLELOG HUF_MAX_TABLELOG /* tableLog by default, when not specified */
1525 #define HUF_MAX_SYMBOL_VALUE 255
1526 #if (HUF_MAX_TABLELOG > HUF_ABSOLUTEMAX_TABLELOG)
1527 # error "HUF_MAX_TABLELOG is too large !"
1532 /*********************************************************
1533 * Huff0 : Huffman block decompression
1534 *********************************************************/
1535 typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX2; /* single-symbol decoding */
1537 typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX4; /* double-symbols decoding */
1539 typedef struct { BYTE symbol; BYTE weight; } sortedSymbol_t;
1542 Read compact Huffman tree, saved by HUF_writeCTable
1543 @huffWeight : destination buffer
1544 @return : size read from `src`
1546 static size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
1547 U32* nbSymbolsPtr, U32* tableLogPtr,
1548 const void* src, size_t srcSize)
1552 const BYTE* ip = (const BYTE*) src;
1557 if (!srcSize) return ERROR(srcSize_wrong);
1559 //memset(huffWeight, 0, hwSize); /* is not necessary, even though some analyzer complain ... */
1561 if (iSize >= 128) /* special header */
1563 if (iSize >= (242)) /* RLE */
1565 static int l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
1566 oSize = l[iSize-242];
1567 memset(huffWeight, 1, hwSize);
1570 else /* Incompressible */
1572 oSize = iSize - 127;
1573 iSize = ((oSize+1)/2);
1574 if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1575 if (oSize >= hwSize) return ERROR(corruption_detected);
1577 for (n=0; n<oSize; n+=2)
1579 huffWeight[n] = ip[n/2] >> 4;
1580 huffWeight[n+1] = ip[n/2] & 15;
1584 else /* header compressed with FSE (normal case) */
1586 if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1587 oSize = FSE_decompress(huffWeight, hwSize-1, ip+1, iSize); /* max (hwSize-1) values decoded, as last one is implied */
1588 if (FSE_isError(oSize)) return oSize;
1591 /* collect weight stats */
1592 memset(rankStats, 0, (HUF_ABSOLUTEMAX_TABLELOG + 1) * sizeof(U32));
1594 for (n=0; n<oSize; n++)
1596 if (huffWeight[n] >= HUF_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1597 rankStats[huffWeight[n]]++;
1598 weightTotal += (1 << huffWeight[n]) >> 1;
1600 if (weightTotal == 0) return ERROR(corruption_detected);
1602 /* get last non-null symbol weight (implied, total must be 2^n) */
1603 tableLog = BIT_highbit32(weightTotal) + 1;
1604 if (tableLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1606 U32 total = 1 << tableLog;
1607 U32 rest = total - weightTotal;
1608 U32 verif = 1 << BIT_highbit32(rest);
1609 U32 lastWeight = BIT_highbit32(rest) + 1;
1610 if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */
1611 huffWeight[oSize] = (BYTE)lastWeight;
1612 rankStats[lastWeight]++;
1615 /* check tree construction validity */
1616 if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected); /* by construction : at least 2 elts of rank 1, must be even */
1619 *nbSymbolsPtr = (U32)(oSize+1);
1620 *tableLogPtr = tableLog;
1625 /**************************/
1626 /* single-symbol decoding */
1627 /**************************/
1629 static size_t HUF_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
1631 BYTE huffWeight[HUF_MAX_SYMBOL_VALUE + 1];
1632 U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1]; /* large enough for values from 0 to 16 */
1634 const BYTE* ip = (const BYTE*) src;
1635 size_t iSize = ip[0];
1639 void* ptr = DTable+1;
1640 HUF_DEltX2* const dt = (HUF_DEltX2*)ptr;
1642 HUF_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(U16)); /* if compilation fails here, assertion is false */
1643 //memset(huffWeight, 0, sizeof(huffWeight)); /* is not necessary, even though some analyzer complain ... */
1645 iSize = HUF_readStats(huffWeight, HUF_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
1646 if (HUF_isError(iSize)) return iSize;
1649 if (tableLog > DTable[0]) return ERROR(tableLog_tooLarge); /* DTable is too small */
1650 DTable[0] = (U16)tableLog; /* maybe should separate sizeof DTable, as allocated, from used size of DTable, in case of DTable re-use */
1654 for (n=1; n<=tableLog; n++)
1656 U32 current = nextRankStart;
1657 nextRankStart += (rankVal[n] << (n-1));
1658 rankVal[n] = current;
1662 for (n=0; n<nbSymbols; n++)
1664 const U32 w = huffWeight[n];
1665 const U32 length = (1 << w) >> 1;
1668 D.byte = (BYTE)n; D.nbBits = (BYTE)(tableLog + 1 - w);
1669 for (i = rankVal[w]; i < rankVal[w] + length; i++)
1671 rankVal[w] += length;
1677 static BYTE HUF_decodeSymbolX2(BIT_DStream_t* Dstream, const HUF_DEltX2* dt, const U32 dtLog)
1679 const size_t val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
1680 const BYTE c = dt[val].byte;
1681 BIT_skipBits(Dstream, dt[val].nbBits);
1685 #define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \
1686 *ptr++ = HUF_decodeSymbolX2(DStreamPtr, dt, dtLog)
1688 #define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \
1689 if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
1690 HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
1692 #define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \
1694 HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
1696 static inline size_t HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX2* const dt, const U32 dtLog)
1698 BYTE* const pStart = p;
1700 /* up to 4 symbols at a time */
1701 while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-4))
1703 HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
1704 HUF_DECODE_SYMBOLX2_1(p, bitDPtr);
1705 HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
1706 HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1709 /* closer to the end */
1710 while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p < pEnd))
1711 HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1713 /* no more data to retrieve from bitstream, hence no need to reload */
1715 HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1721 static size_t HUF_decompress4X2_usingDTable(
1722 void* dst, size_t dstSize,
1723 const void* cSrc, size_t cSrcSize,
1726 if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
1729 const BYTE* const istart = (const BYTE*) cSrc;
1730 BYTE* const ostart = (BYTE*) dst;
1731 BYTE* const oend = ostart + dstSize;
1733 const void* ptr = DTable;
1734 const HUF_DEltX2* const dt = ((const HUF_DEltX2*)ptr) +1;
1735 const U32 dtLog = DTable[0];
1739 BIT_DStream_t bitD1;
1740 BIT_DStream_t bitD2;
1741 BIT_DStream_t bitD3;
1742 BIT_DStream_t bitD4;
1743 const size_t length1 = MEM_readLE16(istart);
1744 const size_t length2 = MEM_readLE16(istart+2);
1745 const size_t length3 = MEM_readLE16(istart+4);
1747 const BYTE* const istart1 = istart + 6; /* jumpTable */
1748 const BYTE* const istart2 = istart1 + length1;
1749 const BYTE* const istart3 = istart2 + length2;
1750 const BYTE* const istart4 = istart3 + length3;
1751 const size_t segmentSize = (dstSize+3) / 4;
1752 BYTE* const opStart2 = ostart + segmentSize;
1753 BYTE* const opStart3 = opStart2 + segmentSize;
1754 BYTE* const opStart4 = opStart3 + segmentSize;
1756 BYTE* op2 = opStart2;
1757 BYTE* op3 = opStart3;
1758 BYTE* op4 = opStart4;
1761 length4 = cSrcSize - (length1 + length2 + length3 + 6);
1762 if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
1763 errorCode = BIT_initDStream(&bitD1, istart1, length1);
1764 if (HUF_isError(errorCode)) return errorCode;
1765 errorCode = BIT_initDStream(&bitD2, istart2, length2);
1766 if (HUF_isError(errorCode)) return errorCode;
1767 errorCode = BIT_initDStream(&bitD3, istart3, length3);
1768 if (HUF_isError(errorCode)) return errorCode;
1769 errorCode = BIT_initDStream(&bitD4, istart4, length4);
1770 if (HUF_isError(errorCode)) return errorCode;
1772 /* 16-32 symbols per loop (4-8 symbols per stream) */
1773 endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
1774 for ( ; (endSignal==BIT_DStream_unfinished) && (op4<(oend-7)) ; )
1776 HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
1777 HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
1778 HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
1779 HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
1780 HUF_DECODE_SYMBOLX2_1(op1, &bitD1);
1781 HUF_DECODE_SYMBOLX2_1(op2, &bitD2);
1782 HUF_DECODE_SYMBOLX2_1(op3, &bitD3);
1783 HUF_DECODE_SYMBOLX2_1(op4, &bitD4);
1784 HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
1785 HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
1786 HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
1787 HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
1788 HUF_DECODE_SYMBOLX2_0(op1, &bitD1);
1789 HUF_DECODE_SYMBOLX2_0(op2, &bitD2);
1790 HUF_DECODE_SYMBOLX2_0(op3, &bitD3);
1791 HUF_DECODE_SYMBOLX2_0(op4, &bitD4);
1793 endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
1796 /* check corruption */
1797 if (op1 > opStart2) return ERROR(corruption_detected);
1798 if (op2 > opStart3) return ERROR(corruption_detected);
1799 if (op3 > opStart4) return ERROR(corruption_detected);
1800 /* note : op4 supposed already verified within main loop */
1802 /* finish bitStreams one by one */
1803 HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
1804 HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
1805 HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
1806 HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);
1809 endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
1810 if (!endSignal) return ERROR(corruption_detected);
1818 static size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
1820 HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_MAX_TABLELOG);
1821 const BYTE* ip = (const BYTE*) cSrc;
1824 errorCode = HUF_readDTableX2 (DTable, cSrc, cSrcSize);
1825 if (HUF_isError(errorCode)) return errorCode;
1826 if (errorCode >= cSrcSize) return ERROR(srcSize_wrong);
1828 cSrcSize -= errorCode;
1830 return HUF_decompress4X2_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
1834 /***************************/
1835 /* double-symbols decoding */
1836 /***************************/
1838 static void HUF_fillDTableX4Level2(HUF_DEltX4* DTable, U32 sizeLog, const U32 consumed,
1839 const U32* rankValOrigin, const int minWeight,
1840 const sortedSymbol_t* sortedSymbols, const U32 sortedListSize,
1841 U32 nbBitsBaseline, U16 baseSeq)
1844 U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
1847 /* get pre-calculated rankVal */
1848 memcpy(rankVal, rankValOrigin, sizeof(rankVal));
1850 /* fill skipped values */
1853 U32 i, skipSize = rankVal[minWeight];
1854 MEM_writeLE16(&(DElt.sequence), baseSeq);
1855 DElt.nbBits = (BYTE)(consumed);
1857 for (i = 0; i < skipSize; i++)
1862 for (s=0; s<sortedListSize; s++) /* note : sortedSymbols already skipped */
1864 const U32 symbol = sortedSymbols[s].symbol;
1865 const U32 weight = sortedSymbols[s].weight;
1866 const U32 nbBits = nbBitsBaseline - weight;
1867 const U32 length = 1 << (sizeLog-nbBits);
1868 const U32 start = rankVal[weight];
1870 const U32 end = start + length;
1872 MEM_writeLE16(&(DElt.sequence), (U16)(baseSeq + (symbol << 8)));
1873 DElt.nbBits = (BYTE)(nbBits + consumed);
1875 do { DTable[i++] = DElt; } while (i<end); /* since length >= 1 */
1877 rankVal[weight] += length;
1881 typedef U32 rankVal_t[HUF_ABSOLUTEMAX_TABLELOG][HUF_ABSOLUTEMAX_TABLELOG + 1];
1883 static void HUF_fillDTableX4(HUF_DEltX4* DTable, const U32 targetLog,
1884 const sortedSymbol_t* sortedList, const U32 sortedListSize,
1885 const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight,
1886 const U32 nbBitsBaseline)
1888 U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
1889 const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */
1890 const U32 minBits = nbBitsBaseline - maxWeight;
1893 memcpy(rankVal, rankValOrigin, sizeof(rankVal));
1896 for (s=0; s<sortedListSize; s++)
1898 const U16 symbol = sortedList[s].symbol;
1899 const U32 weight = sortedList[s].weight;
1900 const U32 nbBits = nbBitsBaseline - weight;
1901 const U32 start = rankVal[weight];
1902 const U32 length = 1 << (targetLog-nbBits);
1904 if (targetLog-nbBits >= minBits) /* enough room for a second symbol */
1907 int minWeight = nbBits + scaleLog;
1908 if (minWeight < 1) minWeight = 1;
1909 sortedRank = rankStart[minWeight];
1910 HUF_fillDTableX4Level2(DTable+start, targetLog-nbBits, nbBits,
1911 rankValOrigin[nbBits], minWeight,
1912 sortedList+sortedRank, sortedListSize-sortedRank,
1913 nbBitsBaseline, symbol);
1918 const U32 end = start + length;
1921 MEM_writeLE16(&(DElt.sequence), symbol);
1922 DElt.nbBits = (BYTE)(nbBits);
1924 for (i = start; i < end; i++)
1927 rankVal[weight] += length;
1931 static size_t HUF_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
1933 BYTE weightList[HUF_MAX_SYMBOL_VALUE + 1];
1934 sortedSymbol_t sortedSymbol[HUF_MAX_SYMBOL_VALUE + 1];
1935 U32 rankStats[HUF_ABSOLUTEMAX_TABLELOG + 1] = { 0 };
1936 U32 rankStart0[HUF_ABSOLUTEMAX_TABLELOG + 2] = { 0 };
1937 U32* const rankStart = rankStart0+1;
1939 U32 tableLog, maxW, sizeOfSort, nbSymbols;
1940 const U32 memLog = DTable[0];
1941 const BYTE* ip = (const BYTE*) src;
1942 size_t iSize = ip[0];
1944 HUF_DEltX4* const dt = ((HUF_DEltX4*)ptr) + 1;
1946 HUF_STATIC_ASSERT(sizeof(HUF_DEltX4) == sizeof(U32)); /* if compilation fails here, assertion is false */
1947 if (memLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
1948 //memset(weightList, 0, sizeof(weightList)); /* is not necessary, even though some analyzer complain ... */
1950 iSize = HUF_readStats(weightList, HUF_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
1951 if (HUF_isError(iSize)) return iSize;
1954 if (tableLog > memLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */
1956 /* find maxWeight */
1957 for (maxW = tableLog; rankStats[maxW]==0; maxW--)
1958 {if (!maxW) return ERROR(GENERIC); } /* necessarily finds a solution before maxW==0 */
1960 /* Get start index of each weight */
1962 U32 w, nextRankStart = 0;
1963 for (w=1; w<=maxW; w++)
1965 U32 current = nextRankStart;
1966 nextRankStart += rankStats[w];
1967 rankStart[w] = current;
1969 rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/
1970 sizeOfSort = nextRankStart;
1973 /* sort symbols by weight */
1976 for (s=0; s<nbSymbols; s++)
1978 U32 w = weightList[s];
1979 U32 r = rankStart[w]++;
1980 sortedSymbol[r].symbol = (BYTE)s;
1981 sortedSymbol[r].weight = (BYTE)w;
1983 rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
1988 const U32 minBits = tableLog+1 - maxW;
1989 U32 nextRankVal = 0;
1991 const int rescale = (memLog-tableLog) - 1; /* tableLog <= memLog */
1992 U32* rankVal0 = rankVal[0];
1993 for (w=1; w<=maxW; w++)
1995 U32 current = nextRankVal;
1996 nextRankVal += rankStats[w] << (w+rescale);
1997 rankVal0[w] = current;
1999 for (consumed = minBits; consumed <= memLog - minBits; consumed++)
2001 U32* rankValPtr = rankVal[consumed];
2002 for (w = 1; w <= maxW; w++)
2004 rankValPtr[w] = rankVal0[w] >> consumed;
2009 HUF_fillDTableX4(dt, memLog,
2010 sortedSymbol, sizeOfSort,
2011 rankStart0, rankVal, maxW,
2018 static U32 HUF_decodeSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
2020 const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2021 memcpy(op, dt+val, 2);
2022 BIT_skipBits(DStream, dt[val].nbBits);
2023 return dt[val].length;
2026 static U32 HUF_decodeLastSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
2028 const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2029 memcpy(op, dt+val, 1);
2030 if (dt[val].length==1) BIT_skipBits(DStream, dt[val].nbBits);
2033 if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8))
2035 BIT_skipBits(DStream, dt[val].nbBits);
2036 if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
2037 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 */
2044 #define HUF_DECODE_SYMBOLX4_0(ptr, DStreamPtr) \
2045 ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2047 #define HUF_DECODE_SYMBOLX4_1(ptr, DStreamPtr) \
2048 if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
2049 ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2051 #define HUF_DECODE_SYMBOLX4_2(ptr, DStreamPtr) \
2053 ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2055 static inline size_t HUF_decodeStreamX4(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, const HUF_DEltX4* const dt, const U32 dtLog)
2057 BYTE* const pStart = p;
2059 /* up to 8 symbols at a time */
2060 while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p < pEnd-7))
2062 HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
2063 HUF_DECODE_SYMBOLX4_1(p, bitDPtr);
2064 HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
2065 HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
2068 /* closer to the end */
2069 while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-2))
2070 HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
2073 HUF_DECODE_SYMBOLX4_0(p, bitDPtr); /* no need to reload : reached the end of DStream */
2076 p += HUF_decodeLastSymbolX4(p, bitDPtr, dt, dtLog);
2083 static size_t HUF_decompress4X4_usingDTable(
2084 void* dst, size_t dstSize,
2085 const void* cSrc, size_t cSrcSize,
2088 if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
2091 const BYTE* const istart = (const BYTE*) cSrc;
2092 BYTE* const ostart = (BYTE*) dst;
2093 BYTE* const oend = ostart + dstSize;
2095 const void* ptr = DTable;
2096 const HUF_DEltX4* const dt = ((const HUF_DEltX4*)ptr) +1;
2097 const U32 dtLog = DTable[0];
2101 BIT_DStream_t bitD1;
2102 BIT_DStream_t bitD2;
2103 BIT_DStream_t bitD3;
2104 BIT_DStream_t bitD4;
2105 const size_t length1 = MEM_readLE16(istart);
2106 const size_t length2 = MEM_readLE16(istart+2);
2107 const size_t length3 = MEM_readLE16(istart+4);
2109 const BYTE* const istart1 = istart + 6; /* jumpTable */
2110 const BYTE* const istart2 = istart1 + length1;
2111 const BYTE* const istart3 = istart2 + length2;
2112 const BYTE* const istart4 = istart3 + length3;
2113 const size_t segmentSize = (dstSize+3) / 4;
2114 BYTE* const opStart2 = ostart + segmentSize;
2115 BYTE* const opStart3 = opStart2 + segmentSize;
2116 BYTE* const opStart4 = opStart3 + segmentSize;
2118 BYTE* op2 = opStart2;
2119 BYTE* op3 = opStart3;
2120 BYTE* op4 = opStart4;
2123 length4 = cSrcSize - (length1 + length2 + length3 + 6);
2124 if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
2125 errorCode = BIT_initDStream(&bitD1, istart1, length1);
2126 if (HUF_isError(errorCode)) return errorCode;
2127 errorCode = BIT_initDStream(&bitD2, istart2, length2);
2128 if (HUF_isError(errorCode)) return errorCode;
2129 errorCode = BIT_initDStream(&bitD3, istart3, length3);
2130 if (HUF_isError(errorCode)) return errorCode;
2131 errorCode = BIT_initDStream(&bitD4, istart4, length4);
2132 if (HUF_isError(errorCode)) return errorCode;
2134 /* 16-32 symbols per loop (4-8 symbols per stream) */
2135 endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2136 for ( ; (endSignal==BIT_DStream_unfinished) && (op4<(oend-7)) ; )
2138 HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
2139 HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
2140 HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
2141 HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
2142 HUF_DECODE_SYMBOLX4_1(op1, &bitD1);
2143 HUF_DECODE_SYMBOLX4_1(op2, &bitD2);
2144 HUF_DECODE_SYMBOLX4_1(op3, &bitD3);
2145 HUF_DECODE_SYMBOLX4_1(op4, &bitD4);
2146 HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
2147 HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
2148 HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
2149 HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
2150 HUF_DECODE_SYMBOLX4_0(op1, &bitD1);
2151 HUF_DECODE_SYMBOLX4_0(op2, &bitD2);
2152 HUF_DECODE_SYMBOLX4_0(op3, &bitD3);
2153 HUF_DECODE_SYMBOLX4_0(op4, &bitD4);
2155 endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2158 /* check corruption */
2159 if (op1 > opStart2) return ERROR(corruption_detected);
2160 if (op2 > opStart3) return ERROR(corruption_detected);
2161 if (op3 > opStart4) return ERROR(corruption_detected);
2162 /* note : op4 supposed already verified within main loop */
2164 /* finish bitStreams one by one */
2165 HUF_decodeStreamX4(op1, &bitD1, opStart2, dt, dtLog);
2166 HUF_decodeStreamX4(op2, &bitD2, opStart3, dt, dtLog);
2167 HUF_decodeStreamX4(op3, &bitD3, opStart4, dt, dtLog);
2168 HUF_decodeStreamX4(op4, &bitD4, oend, dt, dtLog);
2171 endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
2172 if (!endSignal) return ERROR(corruption_detected);
2180 static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2182 HUF_CREATE_STATIC_DTABLEX4(DTable, HUF_MAX_TABLELOG);
2183 const BYTE* ip = (const BYTE*) cSrc;
2185 size_t hSize = HUF_readDTableX4 (DTable, cSrc, cSrcSize);
2186 if (HUF_isError(hSize)) return hSize;
2187 if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
2191 return HUF_decompress4X4_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2195 /**********************************/
2196 /* quad-symbol decoding */
2197 /**********************************/
2198 typedef struct { BYTE nbBits; BYTE nbBytes; } HUF_DDescX6;
2199 typedef union { BYTE byte[4]; U32 sequence; } HUF_DSeqX6;
2201 /* recursive, up to level 3; may benefit from <template>-like strategy to nest each level inline */
2202 static void HUF_fillDTableX6LevelN(HUF_DDescX6* DDescription, HUF_DSeqX6* DSequence, int sizeLog,
2203 const rankVal_t rankValOrigin, const U32 consumed, const int minWeight, const U32 maxWeight,
2204 const sortedSymbol_t* sortedSymbols, const U32 sortedListSize, const U32* rankStart,
2205 const U32 nbBitsBaseline, HUF_DSeqX6 baseSeq, HUF_DDescX6 DDesc)
2207 const int scaleLog = nbBitsBaseline - sizeLog; /* note : targetLog >= (nbBitsBaseline-1), hence scaleLog <= 1 */
2208 const int minBits = nbBitsBaseline - maxWeight;
2209 const U32 level = DDesc.nbBytes;
2210 U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
2211 U32 symbolStartPos, s;
2213 /* local rankVal, will be modified */
2214 memcpy(rankVal, rankValOrigin[consumed], sizeof(rankVal));
2216 /* fill skipped values */
2220 const U32 skipSize = rankVal[minWeight];
2221 for (i = 0; i < skipSize; i++)
2223 DSequence[i] = baseSeq;
2224 DDescription[i] = DDesc;
2230 symbolStartPos = rankStart[minWeight];
2231 for (s=symbolStartPos; s<sortedListSize; s++)
2233 const BYTE symbol = sortedSymbols[s].symbol;
2234 const U32 weight = sortedSymbols[s].weight; /* >= 1 (sorted) */
2235 const int nbBits = nbBitsBaseline - weight; /* >= 1 (by construction) */
2236 const int totalBits = consumed+nbBits;
2237 const U32 start = rankVal[weight];
2238 const U32 length = 1 << (sizeLog-nbBits);
2239 baseSeq.byte[level] = symbol;
2240 DDesc.nbBits = (BYTE)totalBits;
2242 if ((level<3) && (sizeLog-totalBits >= minBits)) /* enough room for another symbol */
2244 int nextMinWeight = totalBits + scaleLog;
2245 if (nextMinWeight < 1) nextMinWeight = 1;
2246 HUF_fillDTableX6LevelN(DDescription+start, DSequence+start, sizeLog-nbBits,
2247 rankValOrigin, totalBits, nextMinWeight, maxWeight,
2248 sortedSymbols, sortedListSize, rankStart,
2249 nbBitsBaseline, baseSeq, DDesc); /* recursive (max : level 3) */
2254 const U32 end = start + length;
2255 for (i = start; i < end; i++)
2257 DDescription[i] = DDesc;
2258 DSequence[i] = baseSeq;
2261 rankVal[weight] += length;
2266 /* note : same preparation as X4 */
2267 static size_t HUF_readDTableX6 (U32* DTable, const void* src, size_t srcSize)
2269 BYTE weightList[HUF_MAX_SYMBOL_VALUE + 1];
2270 sortedSymbol_t sortedSymbol[HUF_MAX_SYMBOL_VALUE + 1];
2271 U32 rankStats[HUF_ABSOLUTEMAX_TABLELOG + 1] = { 0 };
2272 U32 rankStart0[HUF_ABSOLUTEMAX_TABLELOG + 2] = { 0 };
2273 U32* const rankStart = rankStart0+1;
2274 U32 tableLog, maxW, sizeOfSort, nbSymbols;
2276 const U32 memLog = DTable[0];
2277 const BYTE* ip = (const BYTE*) src;
2278 size_t iSize = ip[0];
2280 if (memLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
2281 //memset(weightList, 0, sizeof(weightList)); /* is not necessary, even though some analyzer complain ... */
2283 iSize = HUF_readStats(weightList, HUF_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
2284 if (HUF_isError(iSize)) return iSize;
2287 if (tableLog > memLog) return ERROR(tableLog_tooLarge); /* DTable is too small */
2289 /* find maxWeight */
2290 for (maxW = tableLog; rankStats[maxW]==0; maxW--)
2291 { if (!maxW) return ERROR(GENERIC); } /* necessarily finds a solution before maxW==0 */
2294 /* Get start index of each weight */
2296 U32 w, nextRankStart = 0;
2297 for (w=1; w<=maxW; w++)
2299 U32 current = nextRankStart;
2300 nextRankStart += rankStats[w];
2301 rankStart[w] = current;
2303 rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/
2304 sizeOfSort = nextRankStart;
2307 /* sort symbols by weight */
2310 for (s=0; s<nbSymbols; s++)
2312 U32 w = weightList[s];
2313 U32 r = rankStart[w]++;
2314 sortedSymbol[r].symbol = (BYTE)s;
2315 sortedSymbol[r].weight = (BYTE)w;
2317 rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
2322 const U32 minBits = tableLog+1 - maxW;
2323 U32 nextRankVal = 0;
2325 const int rescale = (memLog-tableLog) - 1; /* tableLog <= memLog */
2326 U32* rankVal0 = rankVal[0];
2327 for (w=1; w<=maxW; w++)
2329 U32 current = nextRankVal;
2330 nextRankVal += rankStats[w] << (w+rescale);
2331 rankVal0[w] = current;
2333 for (consumed = minBits; consumed <= memLog - minBits; consumed++)
2335 U32* rankValPtr = rankVal[consumed];
2336 for (w = 1; w <= maxW; w++)
2338 rankValPtr[w] = rankVal0[w] >> consumed;
2346 void* ptr = DTable+1;
2347 HUF_DDescX6* DDescription = (HUF_DDescX6*)(ptr);
2348 void* dSeqStart = DTable + 1 + ((size_t)1<<(memLog-1));
2349 HUF_DSeqX6* DSequence = (HUF_DSeqX6*)(dSeqStart);
2355 HUF_fillDTableX6LevelN(DDescription, DSequence, memLog,
2356 (const U32 (*)[HUF_ABSOLUTEMAX_TABLELOG + 1])rankVal, 0, 1, maxW,
2357 sortedSymbol, sizeOfSort, rankStart0,
2358 tableLog+1, DSeq, DDesc);
2365 static U32 HUF_decodeSymbolX6(void* op, BIT_DStream_t* DStream, const HUF_DDescX6* dd, const HUF_DSeqX6* ds, const U32 dtLog)
2367 const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2368 memcpy(op, ds+val, sizeof(HUF_DSeqX6));
2369 BIT_skipBits(DStream, dd[val].nbBits);
2370 return dd[val].nbBytes;
2373 static U32 HUF_decodeLastSymbolsX6(void* op, const U32 maxL, BIT_DStream_t* DStream,
2374 const HUF_DDescX6* dd, const HUF_DSeqX6* ds, const U32 dtLog)
2376 const size_t val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
2377 U32 length = dd[val].nbBytes;
2380 memcpy(op, ds+val, length);
2381 BIT_skipBits(DStream, dd[val].nbBits);
2384 memcpy(op, ds+val, maxL);
2385 if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8))
2387 BIT_skipBits(DStream, dd[val].nbBits);
2388 if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
2389 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 */
2395 #define HUF_DECODE_SYMBOLX6_0(ptr, DStreamPtr) \
2396 ptr += HUF_decodeSymbolX6(ptr, DStreamPtr, dd, ds, dtLog)
2398 #define HUF_DECODE_SYMBOLX6_1(ptr, DStreamPtr) \
2399 if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
2400 HUF_DECODE_SYMBOLX6_0(ptr, DStreamPtr)
2402 #define HUF_DECODE_SYMBOLX6_2(ptr, DStreamPtr) \
2404 HUF_DECODE_SYMBOLX6_0(ptr, DStreamPtr)
2406 static inline size_t HUF_decodeStreamX6(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, const U32* DTable, const U32 dtLog)
2408 const void* ddPtr = DTable+1;
2409 const HUF_DDescX6* dd = (const HUF_DDescX6*)(ddPtr);
2410 const void* dsPtr = DTable + 1 + ((size_t)1<<(dtLog-1));
2411 const HUF_DSeqX6* ds = (const HUF_DSeqX6*)(dsPtr);
2412 BYTE* const pStart = p;
2414 /* up to 16 symbols at a time */
2415 while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-16))
2417 HUF_DECODE_SYMBOLX6_2(p, bitDPtr);
2418 HUF_DECODE_SYMBOLX6_1(p, bitDPtr);
2419 HUF_DECODE_SYMBOLX6_2(p, bitDPtr);
2420 HUF_DECODE_SYMBOLX6_0(p, bitDPtr);
2423 /* closer to the end, up to 4 symbols at a time */
2424 while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-4))
2425 HUF_DECODE_SYMBOLX6_0(p, bitDPtr);
2428 HUF_DECODE_SYMBOLX6_0(p, bitDPtr); /* no need to reload : reached the end of DStream */
2431 p += HUF_decodeLastSymbolsX6(p, (U32)(pEnd-p), bitDPtr, dd, ds, dtLog);
2438 static size_t HUF_decompress4X6_usingDTable(
2439 void* dst, size_t dstSize,
2440 const void* cSrc, size_t cSrcSize,
2443 if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
2446 const BYTE* const istart = (const BYTE*) cSrc;
2447 BYTE* const ostart = (BYTE*) dst;
2448 BYTE* const oend = ostart + dstSize;
2450 const U32 dtLog = DTable[0];
2451 const void* ddPtr = DTable+1;
2452 const HUF_DDescX6* dd = (const HUF_DDescX6*)(ddPtr);
2453 const void* dsPtr = DTable + 1 + ((size_t)1<<(dtLog-1));
2454 const HUF_DSeqX6* ds = (const HUF_DSeqX6*)(dsPtr);
2458 BIT_DStream_t bitD1;
2459 BIT_DStream_t bitD2;
2460 BIT_DStream_t bitD3;
2461 BIT_DStream_t bitD4;
2462 const size_t length1 = MEM_readLE16(istart);
2463 const size_t length2 = MEM_readLE16(istart+2);
2464 const size_t length3 = MEM_readLE16(istart+4);
2466 const BYTE* const istart1 = istart + 6; /* jumpTable */
2467 const BYTE* const istart2 = istart1 + length1;
2468 const BYTE* const istart3 = istart2 + length2;
2469 const BYTE* const istart4 = istart3 + length3;
2470 const size_t segmentSize = (dstSize+3) / 4;
2471 BYTE* const opStart2 = ostart + segmentSize;
2472 BYTE* const opStart3 = opStart2 + segmentSize;
2473 BYTE* const opStart4 = opStart3 + segmentSize;
2475 BYTE* op2 = opStart2;
2476 BYTE* op3 = opStart3;
2477 BYTE* op4 = opStart4;
2480 length4 = cSrcSize - (length1 + length2 + length3 + 6);
2481 if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
2482 errorCode = BIT_initDStream(&bitD1, istart1, length1);
2483 if (HUF_isError(errorCode)) return errorCode;
2484 errorCode = BIT_initDStream(&bitD2, istart2, length2);
2485 if (HUF_isError(errorCode)) return errorCode;
2486 errorCode = BIT_initDStream(&bitD3, istart3, length3);
2487 if (HUF_isError(errorCode)) return errorCode;
2488 errorCode = BIT_initDStream(&bitD4, istart4, length4);
2489 if (HUF_isError(errorCode)) return errorCode;
2491 /* 16-64 symbols per loop (4-16 symbols per stream) */
2492 endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2493 for ( ; (op3 <= opStart4) && (endSignal==BIT_DStream_unfinished) && (op4<=(oend-16)) ; )
2495 HUF_DECODE_SYMBOLX6_2(op1, &bitD1);
2496 HUF_DECODE_SYMBOLX6_2(op2, &bitD2);
2497 HUF_DECODE_SYMBOLX6_2(op3, &bitD3);
2498 HUF_DECODE_SYMBOLX6_2(op4, &bitD4);
2499 HUF_DECODE_SYMBOLX6_1(op1, &bitD1);
2500 HUF_DECODE_SYMBOLX6_1(op2, &bitD2);
2501 HUF_DECODE_SYMBOLX6_1(op3, &bitD3);
2502 HUF_DECODE_SYMBOLX6_1(op4, &bitD4);
2503 HUF_DECODE_SYMBOLX6_2(op1, &bitD1);
2504 HUF_DECODE_SYMBOLX6_2(op2, &bitD2);
2505 HUF_DECODE_SYMBOLX6_2(op3, &bitD3);
2506 HUF_DECODE_SYMBOLX6_2(op4, &bitD4);
2507 HUF_DECODE_SYMBOLX6_0(op1, &bitD1);
2508 HUF_DECODE_SYMBOLX6_0(op2, &bitD2);
2509 HUF_DECODE_SYMBOLX6_0(op3, &bitD3);
2510 HUF_DECODE_SYMBOLX6_0(op4, &bitD4);
2512 endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2515 /* check corruption */
2516 if (op1 > opStart2) return ERROR(corruption_detected);
2517 if (op2 > opStart3) return ERROR(corruption_detected);
2518 if (op3 > opStart4) return ERROR(corruption_detected);
2519 /* note : op4 supposed already verified within main loop */
2521 /* finish bitStreams one by one */
2522 HUF_decodeStreamX6(op1, &bitD1, opStart2, DTable, dtLog);
2523 HUF_decodeStreamX6(op2, &bitD2, opStart3, DTable, dtLog);
2524 HUF_decodeStreamX6(op3, &bitD3, opStart4, DTable, dtLog);
2525 HUF_decodeStreamX6(op4, &bitD4, oend, DTable, dtLog);
2528 endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
2529 if (!endSignal) return ERROR(corruption_detected);
2537 static size_t HUF_decompress4X6 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2539 HUF_CREATE_STATIC_DTABLEX6(DTable, HUF_MAX_TABLELOG);
2540 const BYTE* ip = (const BYTE*) cSrc;
2542 size_t hSize = HUF_readDTableX6 (DTable, cSrc, cSrcSize);
2543 if (HUF_isError(hSize)) return hSize;
2544 if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
2548 return HUF_decompress4X6_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2552 /**********************************/
2553 /* Generic decompression selector */
2554 /**********************************/
2556 typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t;
2557 static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] =
2559 /* single, double, quad */
2560 {{0,0}, {1,1}, {2,2}}, /* Q==0 : impossible */
2561 {{0,0}, {1,1}, {2,2}}, /* Q==1 : impossible */
2562 {{ 38,130}, {1313, 74}, {2151, 38}}, /* Q == 2 : 12-18% */
2563 {{ 448,128}, {1353, 74}, {2238, 41}}, /* Q == 3 : 18-25% */
2564 {{ 556,128}, {1353, 74}, {2238, 47}}, /* Q == 4 : 25-32% */
2565 {{ 714,128}, {1418, 74}, {2436, 53}}, /* Q == 5 : 32-38% */
2566 {{ 883,128}, {1437, 74}, {2464, 61}}, /* Q == 6 : 38-44% */
2567 {{ 897,128}, {1515, 75}, {2622, 68}}, /* Q == 7 : 44-50% */
2568 {{ 926,128}, {1613, 75}, {2730, 75}}, /* Q == 8 : 50-56% */
2569 {{ 947,128}, {1729, 77}, {3359, 77}}, /* Q == 9 : 56-62% */
2570 {{1107,128}, {2083, 81}, {4006, 84}}, /* Q ==10 : 62-69% */
2571 {{1177,128}, {2379, 87}, {4785, 88}}, /* Q ==11 : 69-75% */
2572 {{1242,128}, {2415, 93}, {5155, 84}}, /* Q ==12 : 75-81% */
2573 {{1349,128}, {2644,106}, {5260,106}}, /* Q ==13 : 81-87% */
2574 {{1455,128}, {2422,124}, {4174,124}}, /* Q ==14 : 87-93% */
2575 {{ 722,128}, {1891,145}, {1936,146}}, /* Q ==15 : 93-99% */
2578 typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
2580 static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2582 static const decompressionAlgo decompress[3] = { HUF_decompress4X2, HUF_decompress4X4, HUF_decompress4X6 };
2583 /* estimate decompression time */
2585 const U32 D256 = (U32)(dstSize >> 8);
2590 /* validation checks */
2591 if (dstSize == 0) return ERROR(dstSize_tooSmall);
2592 if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */
2593 if (cSrcSize == dstSize) { memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */
2594 if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
2596 /* decoder timing evaluation */
2597 Q = (U32)(cSrcSize * 16 / dstSize); /* Q < 16 since dstSize > cSrcSize */
2599 Dtime[n] = algoTime[Q][n].tableTime + (algoTime[Q][n].decode256Time * D256);
2601 Dtime[1] += Dtime[1] >> 4; Dtime[2] += Dtime[2] >> 3; /* advantage to algorithms using less memory, for cache eviction */
2603 if (Dtime[1] < Dtime[0]) algoNb = 1;
2604 if (Dtime[2] < Dtime[algoNb]) algoNb = 2;
2606 return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
2608 //return HUF_decompress4X2(dst, dstSize, cSrc, cSrcSize); /* multi-streams single-symbol decoding */
2609 //return HUF_decompress4X4(dst, dstSize, cSrc, cSrcSize); /* multi-streams double-symbols decoding */
2610 //return HUF_decompress4X6(dst, dstSize, cSrc, cSrcSize); /* multi-streams quad-symbols decoding */
2613 zstd - standard compression library
2614 Copyright (C) 2014-2015, Yann Collet.
2616 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
2618 Redistribution and use in source and binary forms, with or without
2619 modification, are permitted provided that the following conditions are
2621 * Redistributions of source code must retain the above copyright
2622 notice, this list of conditions and the following disclaimer.
2623 * Redistributions in binary form must reproduce the above
2624 copyright notice, this list of conditions and the following disclaimer
2625 in the documentation and/or other materials provided with the
2627 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2628 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2629 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2630 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2631 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2632 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2633 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2634 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2635 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2636 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2637 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2639 You can contact the author at :
2640 - zstd source repository : https://github.com/Cyan4973/zstd
2641 - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
2644 /* ***************************************************************
2646 *****************************************************************/
2649 * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
2650 * Increasing memory usage improves compression ratio
2651 * Reduced memory usage can improve speed, due to cache effect
2653 #define ZSTD_MEMORY_USAGE 17
2657 * Select how default compression functions will allocate memory for their hash table,
2658 * in memory stack (0, fastest), or in memory heap (1, requires malloc())
2659 * Note that compression context is fairly large, as a consequence heap memory is recommended.
2661 #ifndef ZSTD_HEAPMODE
2662 # define ZSTD_HEAPMODE 1
2663 #endif /* ZSTD_HEAPMODE */
2667 * decompressor can decode older formats (starting from Zstd 0.1+)
2669 #ifndef ZSTD_LEGACY_SUPPORT
2670 # define ZSTD_LEGACY_SUPPORT 1
2674 /* *******************************************************
2676 *********************************************************/
2677 #include <stdlib.h> /* calloc */
2678 #include <string.h> /* memcpy, memmove */
2679 #include <stdio.h> /* debug : printf */
2682 /* *******************************************************
2683 * Compiler specifics
2684 *********************************************************/
2686 # include <immintrin.h> /* AVX2 intrinsics */
2689 #ifdef _MSC_VER /* Visual Studio */
2690 # include <intrin.h> /* For Visual 2005 */
2691 # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
2692 # pragma warning(disable : 4324) /* disable: C4324: padded structure */
2696 /* *******************************************************
2698 *********************************************************/
2699 #define HASH_LOG (ZSTD_MEMORY_USAGE - 2)
2700 #define HASH_TABLESIZE (1 << HASH_LOG)
2701 #define HASH_MASK (HASH_TABLESIZE - 1)
2703 #define KNUTH 2654435761
2712 #define KB *(1 <<10)
2713 #define MB *(1 <<20)
2714 #define GB *(1U<<30)
2716 #define BLOCKSIZE (128 KB) /* define, for static allocation */
2717 #define MIN_SEQUENCES_SIZE (2 /*seqNb*/ + 2 /*dumps*/ + 3 /*seqTables*/ + 1 /*bitStream*/)
2718 #define MIN_CBLOCK_SIZE (3 /*litCSize*/ + MIN_SEQUENCES_SIZE)
2722 #define WORKPLACESIZE (BLOCKSIZE*3)
2727 #define MaxML ((1<<MLbits )-1)
2728 #define MaxLL ((1<<LLbits )-1)
2730 #define LitFSELog 11
2734 #define MAX(a,b) ((a)<(b)?(b):(a))
2735 #define MaxSeq MAX(MaxLL, MaxML)
2737 #define LITERAL_NOENTROPY 63
2738 #define COMMAND_NOENTROPY 7 /* to remove */
2740 #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
2742 static const size_t ZSTD_blockHeaderSize = 3;
2743 static const size_t ZSTD_frameHeaderSize = 4;
2746 /* *******************************************************
2748 **********************************************************/
2749 static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
2751 static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
2753 #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
2755 /*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
2756 static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
2758 const BYTE* ip = (const BYTE*)src;
2759 BYTE* op = (BYTE*)dst;
2760 BYTE* const oend = op + length;
2761 do COPY8(op, ip) while (op < oend);
2765 /* **************************************
2767 ****************************************/
2768 typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
2772 blockType_t blockType;
2774 } blockProperties_t;
2784 BYTE* litLengthStart;
2786 BYTE* matchLengthStart;
2793 /* *************************************
2795 ***************************************/
2797 * tells if a return value is an error code */
2798 static unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
2802 /* *************************************************************
2803 * Decompression section
2804 ***************************************************************/
2807 U32 LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
2808 U32 OffTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
2809 U32 MLTable[FSE_DTABLE_SIZE_U32(MLFSELog)];
2810 void* previousDstEnd;
2817 BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */];
2818 }; /* typedef'd to ZSTD_Dctx within "zstd_static.h" */
2821 static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
2823 const BYTE* const in = (const BYTE* const)src;
2827 if (srcSize < 3) return ERROR(srcSize_wrong);
2830 cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
2832 bpPtr->blockType = (blockType_t)(headerFlags >> 6);
2833 bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
2835 if (bpPtr->blockType == bt_end) return 0;
2836 if (bpPtr->blockType == bt_rle) return 1;
2840 static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
2842 if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
2844 memcpy(dst, src, srcSize);
2850 /** ZSTD_decompressLiterals
2851 @return : nb of bytes read from src, or an error code*/
2852 static size_t ZSTD_decompressLiterals(void* dst, size_t* maxDstSizePtr,
2853 const void* src, size_t srcSize)
2855 const BYTE* ip = (const BYTE*)src;
2857 const size_t litSize = (MEM_readLE32(src) & 0x1FFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2858 const size_t litCSize = (MEM_readLE32(ip+2) & 0xFFFFFF) >> 5; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2860 if (litSize > *maxDstSizePtr) return ERROR(corruption_detected);
2861 if (litCSize + 5 > srcSize) return ERROR(corruption_detected);
2863 if (HUF_isError(HUF_decompress(dst, litSize, ip+5, litCSize))) return ERROR(corruption_detected);
2865 *maxDstSizePtr = litSize;
2866 return litCSize + 5;
2870 /** ZSTD_decodeLiteralsBlock
2871 @return : nb of bytes read from src (< srcSize )*/
2872 static size_t ZSTD_decodeLiteralsBlock(void* ctx,
2873 const void* src, size_t srcSize)
2875 ZSTD_DCtx* dctx = (ZSTD_DCtx*)ctx;
2876 const BYTE* const istart = (const BYTE* const)src;
2878 /* any compressed block with literals segment must be at least this size */
2879 if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
2886 size_t litSize = BLOCKSIZE;
2887 const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize);
2888 dctx->litPtr = dctx->litBuffer;
2889 dctx->litSize = litSize;
2890 memset(dctx->litBuffer + dctx->litSize, 0, 8);
2891 return readSize; /* works if it's an error too */
2895 const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2896 if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
2898 if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
2899 if (litSize > srcSize-3) return ERROR(corruption_detected);
2900 memcpy(dctx->litBuffer, istart, litSize);
2901 dctx->litPtr = dctx->litBuffer;
2902 dctx->litSize = litSize;
2903 memset(dctx->litBuffer + dctx->litSize, 0, 8);
2906 /* direct reference into compressed stream */
2907 dctx->litPtr = istart+3;
2908 dctx->litSize = litSize;
2913 const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2914 if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
2915 memset(dctx->litBuffer, istart[3], litSize + 8);
2916 dctx->litPtr = dctx->litBuffer;
2917 dctx->litSize = litSize;
2924 static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
2925 FSE_DTable* DTableLL, FSE_DTable* DTableML, FSE_DTable* DTableOffb,
2926 const void* src, size_t srcSize)
2928 const BYTE* const istart = (const BYTE* const)src;
2929 const BYTE* ip = istart;
2930 const BYTE* const iend = istart + srcSize;
2931 U32 LLtype, Offtype, MLtype;
2932 U32 LLlog, Offlog, MLlog;
2936 if (srcSize < 5) return ERROR(srcSize_wrong);
2939 *nbSeq = MEM_readLE16(ip); ip+=2;
2941 Offtype = (*ip >> 4) & 3;
2942 MLtype = (*ip >> 2) & 3;
2945 dumpsLength = ip[2];
2946 dumpsLength += ip[1] << 8;
2951 dumpsLength = ip[1];
2952 dumpsLength += (ip[0] & 1) << 8;
2957 *dumpsLengthPtr = dumpsLength;
2960 if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
2964 S16 norm[MaxML+1]; /* assumption : MaxML >= MaxLL and MaxOff */
2972 FSE_buildDTable_rle(DTableLL, *ip++); break;
2975 FSE_buildDTable_raw(DTableLL, LLbits); break;
2978 headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
2979 if (FSE_isError(headerSize)) return ERROR(GENERIC);
2980 if (LLlog > LLFSELog) return ERROR(corruption_detected);
2982 FSE_buildDTable(DTableLL, norm, max, LLlog);
2989 if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
2990 FSE_buildDTable_rle(DTableOffb, *ip++ & MaxOff); /* if *ip > MaxOff, data is corrupted */
2994 FSE_buildDTable_raw(DTableOffb, Offbits); break;
2997 headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
2998 if (FSE_isError(headerSize)) return ERROR(GENERIC);
2999 if (Offlog > OffFSELog) return ERROR(corruption_detected);
3001 FSE_buildDTable(DTableOffb, norm, max, Offlog);
3008 if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
3009 FSE_buildDTable_rle(DTableML, *ip++); break;
3012 FSE_buildDTable_raw(DTableML, MLbits); break;
3015 headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
3016 if (FSE_isError(headerSize)) return ERROR(GENERIC);
3017 if (MLlog > MLFSELog) return ERROR(corruption_detected);
3019 FSE_buildDTable(DTableML, norm, max, MLlog);
3033 BIT_DStream_t DStream;
3034 FSE_DState_t stateLL;
3035 FSE_DState_t stateOffb;
3036 FSE_DState_t stateML;
3039 const BYTE* dumpsEnd;
3043 static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
3049 const BYTE* dumps = seqState->dumps;
3050 const BYTE* const de = seqState->dumpsEnd;
3052 /* Literal length */
3053 litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
3054 prevOffset = litLength ? seq->offset : seqState->prevOffset;
3055 seqState->prevOffset = seq->offset;
3056 if (litLength == MaxLL)
3058 const U32 add = dumps<de ? *dumps++ : 0;
3059 if (add < 255) litLength += add;
3060 else if (dumps + 3 <= de)
3062 litLength = MEM_readLE24(dumps);
3065 if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
3070 static const size_t offsetPrefix[MaxOff+1] = { /* note : size_t faster than U32 */
3071 1 /*fake*/, 1, 2, 4, 8, 16, 32, 64, 128, 256,
3072 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144,
3073 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, /*fake*/ 1, 1, 1, 1, 1 };
3074 U32 offsetCode, nbBits;
3075 offsetCode = FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream)); /* <= maxOff, by table construction */
3076 if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
3077 nbBits = offsetCode - 1;
3078 if (offsetCode==0) nbBits = 0; /* cmove */
3079 offset = offsetPrefix[offsetCode] + BIT_readBits(&(seqState->DStream), nbBits);
3080 if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
3081 if (offsetCode==0) offset = prevOffset; /* cmove */
3085 matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
3086 if (matchLength == MaxML)
3088 const U32 add = dumps<de ? *dumps++ : 0;
3089 if (add < 255) matchLength += add;
3090 else if (dumps + 3 <= de)
3092 matchLength = MEM_readLE24(dumps);
3095 if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
3097 matchLength += MINMATCH;
3100 seq->litLength = litLength;
3101 seq->offset = offset;
3102 seq->matchLength = matchLength;
3103 seqState->dumps = dumps;
3107 static size_t ZSTD_execSequence(BYTE* op,
3109 const BYTE** litPtr, const BYTE* const litLimit,
3110 BYTE* const base, BYTE* const oend)
3112 static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
3113 static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
3114 const BYTE* const ostart = op;
3115 BYTE* const oLitEnd = op + sequence.litLength;
3116 BYTE* const oMatchEnd = op + sequence.litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
3117 BYTE* const oend_8 = oend-8;
3118 const BYTE* const litEnd = *litPtr + sequence.litLength;
3121 if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
3122 if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
3123 if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */
3126 ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
3128 *litPtr = litEnd; /* update for next sequence */
3132 const BYTE* match = op - sequence.offset;
3135 if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */
3136 //if (match > op) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer removing this test ?) */
3137 if (match < base) return ERROR(corruption_detected);
3139 /* close range match, overlap */
3140 if (sequence.offset < 8)
3142 const int dec64 = dec64table[sequence.offset];
3147 match += dec32table[sequence.offset];
3148 ZSTD_copy4(op+4, match);
3153 ZSTD_copy8(op, match);
3155 op += 8; match += 8;
3157 if (oMatchEnd > oend-(16-MINMATCH))
3161 ZSTD_wildcopy(op, match, oend_8 - op);
3162 match += oend_8 - op;
3165 while (op < oMatchEnd) *op++ = *match++;
3169 ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
3173 return oMatchEnd - ostart;
3176 static size_t ZSTD_decompressSequences(
3178 void* dst, size_t maxDstSize,
3179 const void* seqStart, size_t seqSize)
3181 ZSTD_DCtx* dctx = (ZSTD_DCtx*)ctx;
3182 const BYTE* ip = (const BYTE*)seqStart;
3183 const BYTE* const iend = ip + seqSize;
3184 BYTE* const ostart = (BYTE* const)dst;
3186 BYTE* const oend = ostart + maxDstSize;
3187 size_t errorCode, dumpsLength;
3188 const BYTE* litPtr = dctx->litPtr;
3189 const BYTE* const litEnd = litPtr + dctx->litSize;
3192 U32* DTableLL = dctx->LLTable;
3193 U32* DTableML = dctx->MLTable;
3194 U32* DTableOffb = dctx->OffTable;
3195 BYTE* const base = (BYTE*) (dctx->base);
3197 /* Build Decoding Tables */
3198 errorCode = ZSTD_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
3199 DTableLL, DTableML, DTableOffb,
3201 if (ZSTD_isError(errorCode)) return errorCode;
3204 /* Regen sequences */
3207 seqState_t seqState;
3209 memset(&sequence, 0, sizeof(sequence));
3210 seqState.dumps = dumps;
3211 seqState.dumpsEnd = dumps + dumpsLength;
3212 seqState.prevOffset = 1;
3213 errorCode = BIT_initDStream(&(seqState.DStream), ip, iend-ip);
3214 if (ERR_isError(errorCode)) return ERROR(corruption_detected);
3215 FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
3216 FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
3217 FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
3219 for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (nbSeq>0) ; )
3223 ZSTD_decodeSequence(&sequence, &seqState);
3224 oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend);
3225 if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
3229 /* check if reached exact end */
3230 if ( !BIT_endOfDStream(&(seqState.DStream)) ) return ERROR(corruption_detected); /* requested too much : data is corrupted */
3231 if (nbSeq<0) return ERROR(corruption_detected); /* requested too many sequences : data is corrupted */
3233 /* last literal segment */
3235 size_t lastLLSize = litEnd - litPtr;
3236 if (litPtr > litEnd) return ERROR(corruption_detected);
3237 if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
3238 if (lastLLSize > 0) {
3239 if (op != litPtr) memmove(op, litPtr, lastLLSize);
3249 static size_t ZSTD_decompressBlock(
3251 void* dst, size_t maxDstSize,
3252 const void* src, size_t srcSize)
3254 /* blockType == blockCompressed */
3255 const BYTE* ip = (const BYTE*)src;
3257 /* Decode literals sub-block */
3258 size_t litCSize = ZSTD_decodeLiteralsBlock(ctx, src, srcSize);
3259 if (ZSTD_isError(litCSize)) return litCSize;
3261 srcSize -= litCSize;
3263 return ZSTD_decompressSequences(ctx, dst, maxDstSize, ip, srcSize);
3267 static size_t ZSTD_decompressDCtx(void* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3269 const BYTE* ip = (const BYTE*)src;
3270 const BYTE* iend = ip + srcSize;
3271 BYTE* const ostart = (BYTE* const)dst;
3273 BYTE* const oend = ostart + maxDstSize;
3274 size_t remainingSize = srcSize;
3276 blockProperties_t blockProperties;
3279 if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
3280 magicNumber = MEM_readLE32(src);
3281 if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
3282 ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
3284 /* Loop on each block */
3287 size_t decodedSize=0;
3288 size_t cBlockSize = ZSTD_getcBlockSize(ip, iend-ip, &blockProperties);
3289 if (ZSTD_isError(cBlockSize)) return cBlockSize;
3291 ip += ZSTD_blockHeaderSize;
3292 remainingSize -= ZSTD_blockHeaderSize;
3293 if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3295 switch(blockProperties.blockType)
3298 decodedSize = ZSTD_decompressBlock(ctx, op, oend-op, ip, cBlockSize);
3301 decodedSize = ZSTD_copyUncompressedBlock(op, oend-op, ip, cBlockSize);
3304 return ERROR(GENERIC); /* not yet supported */
3308 if (remainingSize) return ERROR(srcSize_wrong);
3311 return ERROR(GENERIC); /* impossible */
3313 if (cBlockSize == 0) break; /* bt_end */
3315 if (ZSTD_isError(decodedSize)) return decodedSize;
3318 remainingSize -= cBlockSize;
3324 static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3328 return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
3331 /* ZSTD_errorFrameSizeInfoLegacy() :
3332 assumes `cSize` and `dBound` are _not_ NULL */
3333 static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
3336 *dBound = ZSTD_CONTENTSIZE_ERROR;
3339 void ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
3341 const BYTE* ip = (const BYTE*)src;
3342 size_t remainingSize = srcSize;
3343 size_t nbBlocks = 0;
3345 blockProperties_t blockProperties;
3348 if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
3349 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3352 magicNumber = MEM_readLE32(src);
3353 if (magicNumber != ZSTD_magicNumber) {
3354 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
3357 ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
3359 /* Loop on each block */
3362 size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
3363 if (ZSTD_isError(cBlockSize)) {
3364 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
3368 ip += ZSTD_blockHeaderSize;
3369 remainingSize -= ZSTD_blockHeaderSize;
3370 if (cBlockSize > remainingSize) {
3371 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3375 if (cBlockSize == 0) break; /* bt_end */
3378 remainingSize -= cBlockSize;
3382 *cSize = ip - (const BYTE*)src;
3383 *dBound = nbBlocks * BLOCKSIZE;
3386 /*******************************
3387 * Streaming Decompression API
3388 *******************************/
3390 static size_t ZSTD_resetDCtx(ZSTD_DCtx* dctx)
3392 dctx->expected = ZSTD_frameHeaderSize;
3394 dctx->previousDstEnd = NULL;
3399 static ZSTD_DCtx* ZSTD_createDCtx(void)
3401 ZSTD_DCtx* dctx = (ZSTD_DCtx*)malloc(sizeof(ZSTD_DCtx));
3402 if (dctx==NULL) return NULL;
3403 ZSTD_resetDCtx(dctx);
3407 static size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx)
3413 static size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx)
3415 return dctx->expected;
3418 static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3421 if (srcSize != ctx->expected) return ERROR(srcSize_wrong);
3422 if (dst != ctx->previousDstEnd) /* not contiguous */
3425 /* Decompress : frame header */
3426 if (ctx->phase == 0)
3428 /* Check frame magic header */
3429 U32 magicNumber = MEM_readLE32(src);
3430 if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
3432 ctx->expected = ZSTD_blockHeaderSize;
3436 /* Decompress : block header */
3437 if (ctx->phase == 1)
3439 blockProperties_t bp;
3440 size_t blockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
3441 if (ZSTD_isError(blockSize)) return blockSize;
3442 if (bp.blockType == bt_end)
3449 ctx->expected = blockSize;
3450 ctx->bType = bp.blockType;
3457 /* Decompress : block content */
3463 rSize = ZSTD_decompressBlock(ctx, dst, maxDstSize, src, srcSize);
3466 rSize = ZSTD_copyUncompressedBlock(dst, maxDstSize, src, srcSize);
3469 return ERROR(GENERIC); /* not yet handled */
3471 case bt_end : /* should never happen (filtered at phase 1) */
3475 return ERROR(GENERIC);
3478 ctx->expected = ZSTD_blockHeaderSize;
3479 ctx->previousDstEnd = (void*)( ((char*)dst) + rSize);
3488 unsigned ZSTDv02_isError(size_t code)
3490 return ZSTD_isError(code);
3493 size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize,
3494 const void* src, size_t compressedSize)
3496 return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
3499 ZSTDv02_Dctx* ZSTDv02_createDCtx(void)
3501 return (ZSTDv02_Dctx*)ZSTD_createDCtx();
3504 size_t ZSTDv02_freeDCtx(ZSTDv02_Dctx* dctx)
3506 return ZSTD_freeDCtx((ZSTD_DCtx*)dctx);
3509 size_t ZSTDv02_resetDCtx(ZSTDv02_Dctx* dctx)
3511 return ZSTD_resetDCtx((ZSTD_DCtx*)dctx);
3514 size_t ZSTDv02_nextSrcSizeToDecompress(ZSTDv02_Dctx* dctx)
3516 return ZSTD_nextSrcSizeToDecompress((ZSTD_DCtx*)dctx);
3519 size_t ZSTDv02_decompressContinue(ZSTDv02_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3521 return ZSTD_decompressContinue((ZSTD_DCtx*)dctx, dst, maxDstSize, src, srcSize);