xref: /freebsd/sys/contrib/zstd/lib/legacy/zstd_v06.c (revision 0dbdecfd4f23486da21345fe446a28a1c27db3f2)
1 /*
2  * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under both the BSD-style license (found in the
6  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7  * in the COPYING file in the root directory of this source tree).
8  * You may select, at your option, one of the above-listed licenses.
9  */
10 
11 
12 /*- Dependencies -*/
13 #include "zstd_v06.h"
14 #include <stddef.h>    /* size_t, ptrdiff_t */
15 #include <string.h>    /* memcpy */
16 #include <stdlib.h>    /* malloc, free, qsort */
17 #include "error_private.h"
18 
19 
20 
21 /* ******************************************************************
22    mem.h
23    low-level memory access routines
24    Copyright (C) 2013-2015, Yann Collet.
25 
26    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
27 
28    Redistribution and use in source and binary forms, with or without
29    modification, are permitted provided that the following conditions are
30    met:
31 
32        * Redistributions of source code must retain the above copyright
33    notice, this list of conditions and the following disclaimer.
34        * Redistributions in binary form must reproduce the above
35    copyright notice, this list of conditions and the following disclaimer
36    in the documentation and/or other materials provided with the
37    distribution.
38 
39    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
40    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
41    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
42    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
43    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
45    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
46    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
47    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
48    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
49    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 
51     You can contact the author at :
52     - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
53     - Public forum : https://groups.google.com/forum/#!forum/lz4c
54 ****************************************************************** */
55 #ifndef MEM_H_MODULE
56 #define MEM_H_MODULE
57 
58 #if defined (__cplusplus)
59 extern "C" {
60 #endif
61 
62 
63 /*-****************************************
64 *  Compiler specifics
65 ******************************************/
66 #if defined(_MSC_VER)   /* Visual Studio */
67 #   include <stdlib.h>  /* _byteswap_ulong */
68 #   include <intrin.h>  /* _byteswap_* */
69 #endif
70 #if defined(__GNUC__)
71 #  define MEM_STATIC static __attribute__((unused))
72 #elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
73 #  define MEM_STATIC static inline
74 #elif defined(_MSC_VER)
75 #  define MEM_STATIC static __inline
76 #else
77 #  define MEM_STATIC static  /* this version may generate warnings for unused static functions; disable the relevant warning */
78 #endif
79 
80 
81 /*-**************************************************************
82 *  Basic Types
83 *****************************************************************/
84 #if  !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
85 # include <stdint.h>
86   typedef  uint8_t BYTE;
87   typedef uint16_t U16;
88   typedef  int16_t S16;
89   typedef uint32_t U32;
90   typedef  int32_t S32;
91   typedef uint64_t U64;
92   typedef  int64_t S64;
93 #else
94   typedef unsigned char       BYTE;
95   typedef unsigned short      U16;
96   typedef   signed short      S16;
97   typedef unsigned int        U32;
98   typedef   signed int        S32;
99   typedef unsigned long long  U64;
100   typedef   signed long long  S64;
101 #endif
102 
103 
104 /*-**************************************************************
105 *  Memory I/O
106 *****************************************************************/
107 /* MEM_FORCE_MEMORY_ACCESS :
108  * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.
109  * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.
110  * The below switch allow to select different access method for improved performance.
111  * Method 0 (default) : use `memcpy()`. Safe and portable.
112  * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).
113  *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.
114  * Method 2 : direct access. This method is portable but violate C standard.
115  *            It can generate buggy code on targets depending on alignment.
116  *            In some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)
117  * See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.
118  * Prefer these methods in priority order (0 > 1 > 2)
119  */
120 #ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */
121 #  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__) )
122 #    define MEM_FORCE_MEMORY_ACCESS 2
123 #  elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
124   (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
125 #    define MEM_FORCE_MEMORY_ACCESS 1
126 #  endif
127 #endif
128 
129 MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; }
130 MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; }
131 
132 MEM_STATIC unsigned MEM_isLittleEndian(void)
133 {
134     const union { U32 u; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */
135     return one.c[0];
136 }
137 
138 #if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2)
139 
140 /* violates C standard, by lying on structure alignment.
141 Only use if no other choice to achieve best performance on target platform */
142 MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; }
143 MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
144 MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
145 
146 MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
147 
148 #elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
149 
150 /* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
151 /* currently only defined for gcc and icc */
152 typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign;
153 
154 MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
155 MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
156 MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
157 
158 MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
159 
160 #else
161 
162 /* default method, safe and standard.
163    can sometimes prove slower */
164 
165 MEM_STATIC U16 MEM_read16(const void* memPtr)
166 {
167     U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
168 }
169 
170 MEM_STATIC U32 MEM_read32(const void* memPtr)
171 {
172     U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
173 }
174 
175 MEM_STATIC U64 MEM_read64(const void* memPtr)
176 {
177     U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
178 }
179 
180 MEM_STATIC void MEM_write16(void* memPtr, U16 value)
181 {
182     memcpy(memPtr, &value, sizeof(value));
183 }
184 
185 
186 #endif /* MEM_FORCE_MEMORY_ACCESS */
187 
188 MEM_STATIC U32 MEM_swap32(U32 in)
189 {
190 #if defined(_MSC_VER)     /* Visual Studio */
191     return _byteswap_ulong(in);
192 #elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
193     return __builtin_bswap32(in);
194 #else
195     return  ((in << 24) & 0xff000000 ) |
196             ((in <<  8) & 0x00ff0000 ) |
197             ((in >>  8) & 0x0000ff00 ) |
198             ((in >> 24) & 0x000000ff );
199 #endif
200 }
201 
202 MEM_STATIC U64 MEM_swap64(U64 in)
203 {
204 #if defined(_MSC_VER)     /* Visual Studio */
205     return _byteswap_uint64(in);
206 #elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
207     return __builtin_bswap64(in);
208 #else
209     return  ((in << 56) & 0xff00000000000000ULL) |
210             ((in << 40) & 0x00ff000000000000ULL) |
211             ((in << 24) & 0x0000ff0000000000ULL) |
212             ((in << 8)  & 0x000000ff00000000ULL) |
213             ((in >> 8)  & 0x00000000ff000000ULL) |
214             ((in >> 24) & 0x0000000000ff0000ULL) |
215             ((in >> 40) & 0x000000000000ff00ULL) |
216             ((in >> 56) & 0x00000000000000ffULL);
217 #endif
218 }
219 
220 
221 /*=== Little endian r/w ===*/
222 
223 MEM_STATIC U16 MEM_readLE16(const void* memPtr)
224 {
225     if (MEM_isLittleEndian())
226         return MEM_read16(memPtr);
227     else {
228         const BYTE* p = (const BYTE*)memPtr;
229         return (U16)(p[0] + (p[1]<<8));
230     }
231 }
232 
233 MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
234 {
235     if (MEM_isLittleEndian()) {
236         MEM_write16(memPtr, val);
237     } else {
238         BYTE* p = (BYTE*)memPtr;
239         p[0] = (BYTE)val;
240         p[1] = (BYTE)(val>>8);
241     }
242 }
243 
244 MEM_STATIC U32 MEM_readLE32(const void* memPtr)
245 {
246     if (MEM_isLittleEndian())
247         return MEM_read32(memPtr);
248     else
249         return MEM_swap32(MEM_read32(memPtr));
250 }
251 
252 
253 MEM_STATIC U64 MEM_readLE64(const void* memPtr)
254 {
255     if (MEM_isLittleEndian())
256         return MEM_read64(memPtr);
257     else
258         return MEM_swap64(MEM_read64(memPtr));
259 }
260 
261 
262 MEM_STATIC size_t MEM_readLEST(const void* memPtr)
263 {
264     if (MEM_32bits())
265         return (size_t)MEM_readLE32(memPtr);
266     else
267         return (size_t)MEM_readLE64(memPtr);
268 }
269 
270 
271 
272 #if defined (__cplusplus)
273 }
274 #endif
275 
276 #endif /* MEM_H_MODULE */
277 
278 /*
279     zstd - standard compression library
280     Header File for static linking only
281     Copyright (C) 2014-2016, Yann Collet.
282 
283     BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
284 
285     Redistribution and use in source and binary forms, with or without
286     modification, are permitted provided that the following conditions are
287     met:
288     * Redistributions of source code must retain the above copyright
289     notice, this list of conditions and the following disclaimer.
290     * Redistributions in binary form must reproduce the above
291     copyright notice, this list of conditions and the following disclaimer
292     in the documentation and/or other materials provided with the
293     distribution.
294     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
295     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
296     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
298     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
299     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
300     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
301     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
302     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
303     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
304     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305 
306     You can contact the author at :
307     - zstd homepage : http://www.zstd.net
308 */
309 #ifndef ZSTDv06_STATIC_H
310 #define ZSTDv06_STATIC_H
311 
312 /* The prototypes defined within this file are considered experimental.
313  * They should not be used in the context DLL as they may change in the future.
314  * Prefer static linking if you need them, to control breaking version changes issues.
315  */
316 
317 #if defined (__cplusplus)
318 extern "C" {
319 #endif
320 
321 
322 
323 /*- Advanced Decompression functions -*/
324 
325 /*! ZSTDv06_decompress_usingPreparedDCtx() :
326 *   Same as ZSTDv06_decompress_usingDict, but using a reference context `preparedDCtx`, where dictionary has been loaded.
327 *   It avoids reloading the dictionary each time.
328 *   `preparedDCtx` must have been properly initialized using ZSTDv06_decompressBegin_usingDict().
329 *   Requires 2 contexts : 1 for reference (preparedDCtx), which will not be modified, and 1 to run the decompression operation (dctx) */
330 ZSTDLIBv06_API size_t ZSTDv06_decompress_usingPreparedDCtx(
331                                            ZSTDv06_DCtx* dctx, const ZSTDv06_DCtx* preparedDCtx,
332                                            void* dst, size_t dstCapacity,
333                                      const void* src, size_t srcSize);
334 
335 
336 
337 #define ZSTDv06_FRAMEHEADERSIZE_MAX 13    /* for static allocation */
338 static const size_t ZSTDv06_frameHeaderSize_min = 5;
339 static const size_t ZSTDv06_frameHeaderSize_max = ZSTDv06_FRAMEHEADERSIZE_MAX;
340 
341 ZSTDLIBv06_API size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx);
342 
343 /*
344   Streaming decompression, direct mode (bufferless)
345 
346   A ZSTDv06_DCtx object is required to track streaming operations.
347   Use ZSTDv06_createDCtx() / ZSTDv06_freeDCtx() to manage it.
348   A ZSTDv06_DCtx object can be re-used multiple times.
349 
350   First optional operation is to retrieve frame parameters, using ZSTDv06_getFrameParams(), which doesn't consume the input.
351   It can provide the minimum size of rolling buffer required to properly decompress data,
352   and optionally the final size of uncompressed content.
353   (Note : content size is an optional info that may not be present. 0 means : content size unknown)
354   Frame parameters are extracted from the beginning of compressed frame.
355   The amount of data to read is variable, from ZSTDv06_frameHeaderSize_min to ZSTDv06_frameHeaderSize_max (so if `srcSize` >= ZSTDv06_frameHeaderSize_max, it will always work)
356   If `srcSize` is too small for operation to succeed, function will return the minimum size it requires to produce a result.
357   Result : 0 when successful, it means the ZSTDv06_frameParams structure has been filled.
358           >0 : means there is not enough data into `src`. Provides the expected size to successfully decode header.
359            errorCode, which can be tested using ZSTDv06_isError()
360 
361   Start decompression, with ZSTDv06_decompressBegin() or ZSTDv06_decompressBegin_usingDict().
362   Alternatively, you can copy a prepared context, using ZSTDv06_copyDCtx().
363 
364   Then use ZSTDv06_nextSrcSizeToDecompress() and ZSTDv06_decompressContinue() alternatively.
365   ZSTDv06_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTDv06_decompressContinue().
366   ZSTDv06_decompressContinue() requires this exact amount of bytes, or it will fail.
367   ZSTDv06_decompressContinue() needs previous data blocks during decompression, up to (1 << windowlog).
368   They should preferably be located contiguously, prior to current block. Alternatively, a round buffer is also possible.
369 
370   @result of ZSTDv06_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity)
371   It can be zero, which is not an error; it just means ZSTDv06_decompressContinue() has decoded some header.
372 
373   A frame is fully decoded when ZSTDv06_nextSrcSizeToDecompress() returns zero.
374   Context can then be reset to start a new decompression.
375 */
376 
377 
378 /* **************************************
379 *  Block functions
380 ****************************************/
381 /*! Block functions produce and decode raw zstd blocks, without frame metadata.
382     User will have to take in charge required information to regenerate data, such as compressed and content sizes.
383 
384     A few rules to respect :
385     - Uncompressed block size must be <= ZSTDv06_BLOCKSIZE_MAX (128 KB)
386     - Compressing or decompressing requires a context structure
387       + Use ZSTDv06_createCCtx() and ZSTDv06_createDCtx()
388     - It is necessary to init context before starting
389       + compression : ZSTDv06_compressBegin()
390       + decompression : ZSTDv06_decompressBegin()
391       + variants _usingDict() are also allowed
392       + copyCCtx() and copyDCtx() work too
393     - When a block is considered not compressible enough, ZSTDv06_compressBlock() result will be zero.
394       In which case, nothing is produced into `dst`.
395       + User must test for such outcome and deal directly with uncompressed data
396       + ZSTDv06_decompressBlock() doesn't accept uncompressed data as input !!
397 */
398 
399 #define ZSTDv06_BLOCKSIZE_MAX (128 * 1024)   /* define, for static allocation */
400 ZSTDLIBv06_API size_t ZSTDv06_decompressBlock(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
401 
402 
403 
404 #if defined (__cplusplus)
405 }
406 #endif
407 
408 #endif  /* ZSTDv06_STATIC_H */
409 /*
410     zstd_internal - common functions to include
411     Header File for include
412     Copyright (C) 2014-2016, Yann Collet.
413 
414     BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
415 
416     Redistribution and use in source and binary forms, with or without
417     modification, are permitted provided that the following conditions are
418     met:
419     * Redistributions of source code must retain the above copyright
420     notice, this list of conditions and the following disclaimer.
421     * Redistributions in binary form must reproduce the above
422     copyright notice, this list of conditions and the following disclaimer
423     in the documentation and/or other materials provided with the
424     distribution.
425     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
426     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
427     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
428     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
429     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
430     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
431     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
432     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
433     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
434     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
435     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
436 
437     You can contact the author at :
438     - zstd homepage : https://www.zstd.net
439 */
440 #ifndef ZSTDv06_CCOMMON_H_MODULE
441 #define ZSTDv06_CCOMMON_H_MODULE
442 
443 
444 /*-*************************************
445 *  Common macros
446 ***************************************/
447 #define MIN(a,b) ((a)<(b) ? (a) : (b))
448 #define MAX(a,b) ((a)>(b) ? (a) : (b))
449 
450 
451 /*-*************************************
452 *  Common constants
453 ***************************************/
454 #define ZSTDv06_DICT_MAGIC  0xEC30A436
455 
456 #define ZSTDv06_REP_NUM    3
457 #define ZSTDv06_REP_INIT   ZSTDv06_REP_NUM
458 #define ZSTDv06_REP_MOVE   (ZSTDv06_REP_NUM-1)
459 
460 #define KB *(1 <<10)
461 #define MB *(1 <<20)
462 #define GB *(1U<<30)
463 
464 #define BIT7 128
465 #define BIT6  64
466 #define BIT5  32
467 #define BIT4  16
468 #define BIT1   2
469 #define BIT0   1
470 
471 #define ZSTDv06_WINDOWLOG_ABSOLUTEMIN 12
472 static const size_t ZSTDv06_fcs_fieldSize[4] = { 0, 1, 2, 8 };
473 
474 #define ZSTDv06_BLOCKHEADERSIZE 3   /* because C standard does not allow a static const value to be defined using another static const value .... :( */
475 static const size_t ZSTDv06_blockHeaderSize = ZSTDv06_BLOCKHEADERSIZE;
476 typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
477 
478 #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
479 #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */)   /* for a non-null block */
480 
481 #define HufLog 12
482 
483 #define IS_HUF 0
484 #define IS_PCH 1
485 #define IS_RAW 2
486 #define IS_RLE 3
487 
488 #define LONGNBSEQ 0x7F00
489 
490 #define MINMATCH 3
491 #define EQUAL_READ32 4
492 #define REPCODE_STARTVALUE 1
493 
494 #define Litbits  8
495 #define MaxLit ((1<<Litbits) - 1)
496 #define MaxML  52
497 #define MaxLL  35
498 #define MaxOff 28
499 #define MaxSeq MAX(MaxLL, MaxML)   /* Assumption : MaxOff < MaxLL,MaxML */
500 #define MLFSELog    9
501 #define LLFSELog    9
502 #define OffFSELog   8
503 
504 #define FSEv06_ENCODING_RAW     0
505 #define FSEv06_ENCODING_RLE     1
506 #define FSEv06_ENCODING_STATIC  2
507 #define FSEv06_ENCODING_DYNAMIC 3
508 
509 static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
510                                       1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9,10,11,12,
511                                      13,14,15,16 };
512 static const S16 LL_defaultNorm[MaxLL+1] = { 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
513                                              2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1,
514                                             -1,-1,-1,-1 };
515 static const U32 LL_defaultNormLog = 6;
516 
517 static const U32 ML_bits[MaxML+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
518                                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
519                                       1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9,10,11,
520                                      12,13,14,15,16 };
521 static const S16 ML_defaultNorm[MaxML+1] = { 1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
522                                              1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
523                                              1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,-1,-1,
524                                             -1,-1,-1,-1,-1 };
525 static const U32 ML_defaultNormLog = 6;
526 
527 static const S16 OF_defaultNorm[MaxOff+1] = { 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
528                                               1, 1, 1, 1, 1, 1, 1, 1,-1,-1,-1,-1,-1 };
529 static const U32 OF_defaultNormLog = 5;
530 
531 
532 /*-*******************************************
533 *  Shared functions to include for inlining
534 *********************************************/
535 static void ZSTDv06_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
536 #define COPY8(d,s) { ZSTDv06_copy8(d,s); d+=8; s+=8; }
537 
538 /*! ZSTDv06_wildcopy() :
539 *   custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
540 #define WILDCOPY_OVERLENGTH 8
541 MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src, ptrdiff_t length)
542 {
543     const BYTE* ip = (const BYTE*)src;
544     BYTE* op = (BYTE*)dst;
545     BYTE* const oend = op + length;
546     do
547         COPY8(op, ip)
548     while (op < oend);
549 }
550 
551 
552 
553 /*-*******************************************
554 *  Private interfaces
555 *********************************************/
556 typedef struct {
557     U32 off;
558     U32 len;
559 } ZSTDv06_match_t;
560 
561 typedef struct {
562     U32 price;
563     U32 off;
564     U32 mlen;
565     U32 litlen;
566     U32 rep[ZSTDv06_REP_INIT];
567 } ZSTDv06_optimal_t;
568 
569 typedef struct { U32  unused; } ZSTDv06_stats_t;
570 
571 typedef struct {
572     void* buffer;
573     U32*  offsetStart;
574     U32*  offset;
575     BYTE* offCodeStart;
576     BYTE* litStart;
577     BYTE* lit;
578     U16*  litLengthStart;
579     U16*  litLength;
580     BYTE* llCodeStart;
581     U16*  matchLengthStart;
582     U16*  matchLength;
583     BYTE* mlCodeStart;
584     U32   longLengthID;   /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
585     U32   longLengthPos;
586     /* opt */
587     ZSTDv06_optimal_t* priceTable;
588     ZSTDv06_match_t* matchTable;
589     U32* matchLengthFreq;
590     U32* litLengthFreq;
591     U32* litFreq;
592     U32* offCodeFreq;
593     U32  matchLengthSum;
594     U32  matchSum;
595     U32  litLengthSum;
596     U32  litSum;
597     U32  offCodeSum;
598     U32  log2matchLengthSum;
599     U32  log2matchSum;
600     U32  log2litLengthSum;
601     U32  log2litSum;
602     U32  log2offCodeSum;
603     U32  factor;
604     U32  cachedPrice;
605     U32  cachedLitLength;
606     const BYTE* cachedLiterals;
607     ZSTDv06_stats_t stats;
608 } seqStore_t;
609 
610 void ZSTDv06_seqToCodes(const seqStore_t* seqStorePtr, size_t const nbSeq);
611 
612 
613 #endif   /* ZSTDv06_CCOMMON_H_MODULE */
614 /* ******************************************************************
615    FSE : Finite State Entropy codec
616    Public Prototypes declaration
617    Copyright (C) 2013-2016, Yann Collet.
618 
619    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
620 
621    Redistribution and use in source and binary forms, with or without
622    modification, are permitted provided that the following conditions are
623    met:
624 
625        * Redistributions of source code must retain the above copyright
626    notice, this list of conditions and the following disclaimer.
627        * Redistributions in binary form must reproduce the above
628    copyright notice, this list of conditions and the following disclaimer
629    in the documentation and/or other materials provided with the
630    distribution.
631 
632    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
633    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
634    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
635    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
636    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
637    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
638    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
639    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
640    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
641    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
642    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
643 
644    You can contact the author at :
645    - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
646 ****************************************************************** */
647 #ifndef FSEv06_H
648 #define FSEv06_H
649 
650 #if defined (__cplusplus)
651 extern "C" {
652 #endif
653 
654 
655 
656 /*-****************************************
657 *  FSE simple functions
658 ******************************************/
659 /*! FSEv06_decompress():
660     Decompress FSE data from buffer 'cSrc', of size 'cSrcSize',
661     into already allocated destination buffer 'dst', of size 'dstCapacity'.
662     @return : size of regenerated data (<= maxDstSize),
663               or an error code, which can be tested using FSEv06_isError() .
664 
665     ** Important ** : FSEv06_decompress() does not decompress non-compressible nor RLE data !!!
666     Why ? : making this distinction requires a header.
667     Header management is intentionally delegated to the user layer, which can better manage special cases.
668 */
669 size_t FSEv06_decompress(void* dst,  size_t dstCapacity,
670                 const void* cSrc, size_t cSrcSize);
671 
672 
673 /*-*****************************************
674 *  Tool functions
675 ******************************************/
676 size_t FSEv06_compressBound(size_t size);       /* maximum compressed size */
677 
678 /* Error Management */
679 unsigned    FSEv06_isError(size_t code);        /* tells if a return value is an error code */
680 const char* FSEv06_getErrorName(size_t code);   /* provides error code string (useful for debugging) */
681 
682 
683 
684 /*-*****************************************
685 *  FSE detailed API
686 ******************************************/
687 /*!
688 
689 FSEv06_decompress() does the following:
690 1. read normalized counters with readNCount()
691 2. build decoding table 'DTable' from normalized counters
692 3. decode the data stream using decoding table 'DTable'
693 
694 The following API allows targeting specific sub-functions for advanced tasks.
695 For example, it's possible to compress several blocks using the same 'CTable',
696 or to save and provide normalized distribution using external method.
697 */
698 
699 
700 /* *** DECOMPRESSION *** */
701 
702 /*! FSEv06_readNCount():
703     Read compactly saved 'normalizedCounter' from 'rBuffer'.
704     @return : size read from 'rBuffer',
705               or an errorCode, which can be tested using FSEv06_isError().
706               maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */
707 size_t FSEv06_readNCount (short* normalizedCounter, unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, const void* rBuffer, size_t rBuffSize);
708 
709 /*! Constructor and Destructor of FSEv06_DTable.
710     Note that its size depends on 'tableLog' */
711 typedef unsigned FSEv06_DTable;   /* don't allocate that. It's just a way to be more restrictive than void* */
712 FSEv06_DTable* FSEv06_createDTable(unsigned tableLog);
713 void        FSEv06_freeDTable(FSEv06_DTable* dt);
714 
715 /*! FSEv06_buildDTable():
716     Builds 'dt', which must be already allocated, using FSEv06_createDTable().
717     return : 0, or an errorCode, which can be tested using FSEv06_isError() */
718 size_t FSEv06_buildDTable (FSEv06_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
719 
720 /*! FSEv06_decompress_usingDTable():
721     Decompress compressed source `cSrc` of size `cSrcSize` using `dt`
722     into `dst` which must be already allocated.
723     @return : size of regenerated data (necessarily <= `dstCapacity`),
724               or an errorCode, which can be tested using FSEv06_isError() */
725 size_t FSEv06_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSEv06_DTable* dt);
726 
727 /*!
728 Tutorial :
729 ----------
730 (Note : these functions only decompress FSE-compressed blocks.
731  If block is uncompressed, use memcpy() instead
732  If block is a single repeated byte, use memset() instead )
733 
734 The first step is to obtain the normalized frequencies of symbols.
735 This can be performed by FSEv06_readNCount() if it was saved using FSEv06_writeNCount().
736 'normalizedCounter' must be already allocated, and have at least 'maxSymbolValuePtr[0]+1' cells of signed short.
737 In practice, that means it's necessary to know 'maxSymbolValue' beforehand,
738 or size the table to handle worst case situations (typically 256).
739 FSEv06_readNCount() will provide 'tableLog' and 'maxSymbolValue'.
740 The result of FSEv06_readNCount() is the number of bytes read from 'rBuffer'.
741 Note that 'rBufferSize' must be at least 4 bytes, even if useful information is less than that.
742 If there is an error, the function will return an error code, which can be tested using FSEv06_isError().
743 
744 The next step is to build the decompression tables 'FSEv06_DTable' from 'normalizedCounter'.
745 This is performed by the function FSEv06_buildDTable().
746 The space required by 'FSEv06_DTable' must be already allocated using FSEv06_createDTable().
747 If there is an error, the function will return an error code, which can be tested using FSEv06_isError().
748 
749 `FSEv06_DTable` can then be used to decompress `cSrc`, with FSEv06_decompress_usingDTable().
750 `cSrcSize` must be strictly correct, otherwise decompression will fail.
751 FSEv06_decompress_usingDTable() result will tell how many bytes were regenerated (<=`dstCapacity`).
752 If there is an error, the function will return an error code, which can be tested using FSEv06_isError(). (ex: dst buffer too small)
753 */
754 
755 
756 #if defined (__cplusplus)
757 }
758 #endif
759 
760 #endif  /* FSEv06_H */
761 /* ******************************************************************
762    bitstream
763    Part of FSE library
764    header file (to include)
765    Copyright (C) 2013-2016, Yann Collet.
766 
767    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
768 
769    Redistribution and use in source and binary forms, with or without
770    modification, are permitted provided that the following conditions are
771    met:
772 
773        * Redistributions of source code must retain the above copyright
774    notice, this list of conditions and the following disclaimer.
775        * Redistributions in binary form must reproduce the above
776    copyright notice, this list of conditions and the following disclaimer
777    in the documentation and/or other materials provided with the
778    distribution.
779 
780    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
781    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
782    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
783    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
784    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
785    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
786    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
787    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
788    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
789    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
790    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
791 
792    You can contact the author at :
793    - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
794 ****************************************************************** */
795 #ifndef BITSTREAM_H_MODULE
796 #define BITSTREAM_H_MODULE
797 
798 #if defined (__cplusplus)
799 extern "C" {
800 #endif
801 
802 
803 /*
804 *  This API consists of small unitary functions, which must be inlined for best performance.
805 *  Since link-time-optimization is not available for all compilers,
806 *  these functions are defined into a .h to be included.
807 */
808 
809 
810 /*=========================================
811 *  Target specific
812 =========================================*/
813 #if defined(__BMI__) && defined(__GNUC__)
814 #  include <immintrin.h>   /* support for bextr (experimental) */
815 #endif
816 
817 
818 
819 /*-********************************************
820 *  bitStream decoding API (read backward)
821 **********************************************/
822 typedef struct
823 {
824     size_t   bitContainer;
825     unsigned bitsConsumed;
826     const char* ptr;
827     const char* start;
828 } BITv06_DStream_t;
829 
830 typedef enum { BITv06_DStream_unfinished = 0,
831                BITv06_DStream_endOfBuffer = 1,
832                BITv06_DStream_completed = 2,
833                BITv06_DStream_overflow = 3 } BITv06_DStream_status;  /* result of BITv06_reloadDStream() */
834                /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
835 
836 MEM_STATIC size_t   BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuffer, size_t srcSize);
837 MEM_STATIC size_t   BITv06_readBits(BITv06_DStream_t* bitD, unsigned nbBits);
838 MEM_STATIC BITv06_DStream_status BITv06_reloadDStream(BITv06_DStream_t* bitD);
839 MEM_STATIC unsigned BITv06_endOfDStream(const BITv06_DStream_t* bitD);
840 
841 
842 
843 /*-****************************************
844 *  unsafe API
845 ******************************************/
846 MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, unsigned nbBits);
847 /* faster, but works only if nbBits >= 1 */
848 
849 
850 
851 /*-**************************************************************
852 *  Internal functions
853 ****************************************************************/
854 MEM_STATIC unsigned BITv06_highbit32 ( U32 val)
855 {
856 #   if defined(_MSC_VER)   /* Visual */
857     unsigned long r=0;
858     _BitScanReverse ( &r, val );
859     return (unsigned) r;
860 #   elif defined(__GNUC__) && (__GNUC__ >= 3)   /* Use GCC Intrinsic */
861     return 31 - __builtin_clz (val);
862 #   else   /* Software version */
863     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 };
864     U32 v = val;
865     unsigned r;
866     v |= v >> 1;
867     v |= v >> 2;
868     v |= v >> 4;
869     v |= v >> 8;
870     v |= v >> 16;
871     r = DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27];
872     return r;
873 #   endif
874 }
875 
876 
877 
878 /*-********************************************************
879 * bitStream decoding
880 **********************************************************/
881 /*! BITv06_initDStream() :
882 *   Initialize a BITv06_DStream_t.
883 *   `bitD` : a pointer to an already allocated BITv06_DStream_t structure.
884 *   `srcSize` must be the *exact* size of the bitStream, in bytes.
885 *   @return : size of stream (== srcSize) or an errorCode if a problem is detected
886 */
887 MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
888 {
889     if (srcSize < 1) { memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); }
890 
891     if (srcSize >=  sizeof(bitD->bitContainer)) {  /* normal case */
892         bitD->start = (const char*)srcBuffer;
893         bitD->ptr   = (const char*)srcBuffer + srcSize - sizeof(bitD->bitContainer);
894         bitD->bitContainer = MEM_readLEST(bitD->ptr);
895         { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1];
896           if (lastByte == 0) return ERROR(GENERIC);   /* endMark not present */
897           bitD->bitsConsumed = 8 - BITv06_highbit32(lastByte); }
898     } else {
899         bitD->start = (const char*)srcBuffer;
900         bitD->ptr   = bitD->start;
901         bitD->bitContainer = *(const BYTE*)(bitD->start);
902         switch(srcSize)
903         {
904             case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);/* fall-through */
905             case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);/* fall-through */
906             case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);/* fall-through */
907             case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; /* fall-through */
908             case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; /* fall-through */
909             case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) <<  8; /* fall-through */
910             default: break;
911         }
912         { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1];
913           if (lastByte == 0) return ERROR(GENERIC);   /* endMark not present */
914           bitD->bitsConsumed = 8 - BITv06_highbit32(lastByte); }
915         bitD->bitsConsumed += (U32)(sizeof(bitD->bitContainer) - srcSize)*8;
916     }
917 
918     return srcSize;
919 }
920 
921 
922  MEM_STATIC size_t BITv06_lookBits(const BITv06_DStream_t* bitD, U32 nbBits)
923 {
924     U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1;
925     return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
926 }
927 
928 /*! BITv06_lookBitsFast() :
929 *   unsafe version; only works only if nbBits >= 1 */
930 MEM_STATIC size_t BITv06_lookBitsFast(const BITv06_DStream_t* bitD, U32 nbBits)
931 {
932     U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1;
933     return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
934 }
935 
936 MEM_STATIC void BITv06_skipBits(BITv06_DStream_t* bitD, U32 nbBits)
937 {
938     bitD->bitsConsumed += nbBits;
939 }
940 
941 MEM_STATIC size_t BITv06_readBits(BITv06_DStream_t* bitD, U32 nbBits)
942 {
943     size_t const value = BITv06_lookBits(bitD, nbBits);
944     BITv06_skipBits(bitD, nbBits);
945     return value;
946 }
947 
948 /*! BITv06_readBitsFast() :
949 *   unsafe version; only works only if nbBits >= 1 */
950 MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, U32 nbBits)
951 {
952     size_t const value = BITv06_lookBitsFast(bitD, nbBits);
953     BITv06_skipBits(bitD, nbBits);
954     return value;
955 }
956 
957 MEM_STATIC BITv06_DStream_status BITv06_reloadDStream(BITv06_DStream_t* bitD)
958 {
959     if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8))  /* should never happen */
960         return BITv06_DStream_overflow;
961 
962     if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) {
963         bitD->ptr -= bitD->bitsConsumed >> 3;
964         bitD->bitsConsumed &= 7;
965         bitD->bitContainer = MEM_readLEST(bitD->ptr);
966         return BITv06_DStream_unfinished;
967     }
968     if (bitD->ptr == bitD->start) {
969         if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BITv06_DStream_endOfBuffer;
970         return BITv06_DStream_completed;
971     }
972     {   U32 nbBytes = bitD->bitsConsumed >> 3;
973         BITv06_DStream_status result = BITv06_DStream_unfinished;
974         if (bitD->ptr - nbBytes < bitD->start) {
975             nbBytes = (U32)(bitD->ptr - bitD->start);  /* ptr > start */
976             result = BITv06_DStream_endOfBuffer;
977         }
978         bitD->ptr -= nbBytes;
979         bitD->bitsConsumed -= nbBytes*8;
980         bitD->bitContainer = MEM_readLEST(bitD->ptr);   /* reminder : srcSize > sizeof(bitD) */
981         return result;
982     }
983 }
984 
985 /*! BITv06_endOfDStream() :
986 *   @return Tells if DStream has exactly reached its end (all bits consumed).
987 */
988 MEM_STATIC unsigned BITv06_endOfDStream(const BITv06_DStream_t* DStream)
989 {
990     return ((DStream->ptr == DStream->start) && (DStream->bitsConsumed == sizeof(DStream->bitContainer)*8));
991 }
992 
993 #if defined (__cplusplus)
994 }
995 #endif
996 
997 #endif /* BITSTREAM_H_MODULE */
998 /* ******************************************************************
999    FSE : Finite State Entropy coder
1000    header file for static linking (only)
1001    Copyright (C) 2013-2015, Yann Collet
1002 
1003    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1004 
1005    Redistribution and use in source and binary forms, with or without
1006    modification, are permitted provided that the following conditions are
1007    met:
1008 
1009        * Redistributions of source code must retain the above copyright
1010    notice, this list of conditions and the following disclaimer.
1011        * Redistributions in binary form must reproduce the above
1012    copyright notice, this list of conditions and the following disclaimer
1013    in the documentation and/or other materials provided with the
1014    distribution.
1015 
1016    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1017    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1018    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1019    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1020    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1021    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1022    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1023    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1024    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1025    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1026    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1027 
1028    You can contact the author at :
1029    - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
1030    - Public forum : https://groups.google.com/forum/#!forum/lz4c
1031 ****************************************************************** */
1032 #ifndef FSEv06_STATIC_H
1033 #define FSEv06_STATIC_H
1034 
1035 #if defined (__cplusplus)
1036 extern "C" {
1037 #endif
1038 
1039 
1040 /* *****************************************
1041 *  Static allocation
1042 *******************************************/
1043 /* FSE buffer bounds */
1044 #define FSEv06_NCOUNTBOUND 512
1045 #define FSEv06_BLOCKBOUND(size) (size + (size>>7))
1046 #define FSEv06_COMPRESSBOUND(size) (FSEv06_NCOUNTBOUND + FSEv06_BLOCKBOUND(size))   /* Macro version, useful for static allocation */
1047 
1048 /* It is possible to statically allocate FSE CTable/DTable as a table of unsigned using below macros */
1049 #define FSEv06_DTABLE_SIZE_U32(maxTableLog)                   (1 + (1<<maxTableLog))
1050 
1051 
1052 /* *****************************************
1053 *  FSE advanced API
1054 *******************************************/
1055 size_t FSEv06_countFast(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
1056 /* same as FSEv06_count(), but blindly trusts that all byte values within src are <= *maxSymbolValuePtr  */
1057 
1058 size_t FSEv06_buildDTable_raw (FSEv06_DTable* dt, unsigned nbBits);
1059 /* build a fake FSEv06_DTable, designed to read an uncompressed bitstream where each symbol uses nbBits */
1060 
1061 size_t FSEv06_buildDTable_rle (FSEv06_DTable* dt, unsigned char symbolValue);
1062 /* build a fake FSEv06_DTable, designed to always generate the same symbolValue */
1063 
1064 
1065 /* *****************************************
1066 *  FSE symbol decompression API
1067 *******************************************/
1068 typedef struct
1069 {
1070     size_t      state;
1071     const void* table;   /* precise table may vary, depending on U16 */
1072 } FSEv06_DState_t;
1073 
1074 
1075 static void     FSEv06_initDState(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD, const FSEv06_DTable* dt);
1076 
1077 static unsigned char FSEv06_decodeSymbol(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD);
1078 
1079 
1080 /* *****************************************
1081 *  FSE unsafe API
1082 *******************************************/
1083 static unsigned char FSEv06_decodeSymbolFast(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD);
1084 /* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */
1085 
1086 
1087 /* *****************************************
1088 *  Implementation of inlined functions
1089 *******************************************/
1090 
1091 
1092 /* ======    Decompression    ====== */
1093 
1094 typedef struct {
1095     U16 tableLog;
1096     U16 fastMode;
1097 } FSEv06_DTableHeader;   /* sizeof U32 */
1098 
1099 typedef struct
1100 {
1101     unsigned short newState;
1102     unsigned char  symbol;
1103     unsigned char  nbBits;
1104 } FSEv06_decode_t;   /* size == U32 */
1105 
1106 MEM_STATIC void FSEv06_initDState(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD, const FSEv06_DTable* dt)
1107 {
1108     const void* ptr = dt;
1109     const FSEv06_DTableHeader* const DTableH = (const FSEv06_DTableHeader*)ptr;
1110     DStatePtr->state = BITv06_readBits(bitD, DTableH->tableLog);
1111     BITv06_reloadDStream(bitD);
1112     DStatePtr->table = dt + 1;
1113 }
1114 
1115 MEM_STATIC BYTE FSEv06_peekSymbol(const FSEv06_DState_t* DStatePtr)
1116 {
1117     FSEv06_decode_t const DInfo = ((const FSEv06_decode_t*)(DStatePtr->table))[DStatePtr->state];
1118     return DInfo.symbol;
1119 }
1120 
1121 MEM_STATIC void FSEv06_updateState(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD)
1122 {
1123     FSEv06_decode_t const DInfo = ((const FSEv06_decode_t*)(DStatePtr->table))[DStatePtr->state];
1124     U32 const nbBits = DInfo.nbBits;
1125     size_t const lowBits = BITv06_readBits(bitD, nbBits);
1126     DStatePtr->state = DInfo.newState + lowBits;
1127 }
1128 
1129 MEM_STATIC BYTE FSEv06_decodeSymbol(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD)
1130 {
1131     FSEv06_decode_t const DInfo = ((const FSEv06_decode_t*)(DStatePtr->table))[DStatePtr->state];
1132     U32 const nbBits = DInfo.nbBits;
1133     BYTE const symbol = DInfo.symbol;
1134     size_t const lowBits = BITv06_readBits(bitD, nbBits);
1135 
1136     DStatePtr->state = DInfo.newState + lowBits;
1137     return symbol;
1138 }
1139 
1140 /*! FSEv06_decodeSymbolFast() :
1141     unsafe, only works if no symbol has a probability > 50% */
1142 MEM_STATIC BYTE FSEv06_decodeSymbolFast(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD)
1143 {
1144     FSEv06_decode_t const DInfo = ((const FSEv06_decode_t*)(DStatePtr->table))[DStatePtr->state];
1145     U32 const nbBits = DInfo.nbBits;
1146     BYTE const symbol = DInfo.symbol;
1147     size_t const lowBits = BITv06_readBitsFast(bitD, nbBits);
1148 
1149     DStatePtr->state = DInfo.newState + lowBits;
1150     return symbol;
1151 }
1152 
1153 
1154 
1155 #ifndef FSEv06_COMMONDEFS_ONLY
1156 
1157 /* **************************************************************
1158 *  Tuning parameters
1159 ****************************************************************/
1160 /*!MEMORY_USAGE :
1161 *  Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
1162 *  Increasing memory usage improves compression ratio
1163 *  Reduced memory usage can improve speed, due to cache effect
1164 *  Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
1165 #define FSEv06_MAX_MEMORY_USAGE 14
1166 #define FSEv06_DEFAULT_MEMORY_USAGE 13
1167 
1168 /*!FSEv06_MAX_SYMBOL_VALUE :
1169 *  Maximum symbol value authorized.
1170 *  Required for proper stack allocation */
1171 #define FSEv06_MAX_SYMBOL_VALUE 255
1172 
1173 
1174 /* **************************************************************
1175 *  template functions type & suffix
1176 ****************************************************************/
1177 #define FSEv06_FUNCTION_TYPE BYTE
1178 #define FSEv06_FUNCTION_EXTENSION
1179 #define FSEv06_DECODE_TYPE FSEv06_decode_t
1180 
1181 
1182 #endif   /* !FSEv06_COMMONDEFS_ONLY */
1183 
1184 
1185 /* ***************************************************************
1186 *  Constants
1187 *****************************************************************/
1188 #define FSEv06_MAX_TABLELOG  (FSEv06_MAX_MEMORY_USAGE-2)
1189 #define FSEv06_MAX_TABLESIZE (1U<<FSEv06_MAX_TABLELOG)
1190 #define FSEv06_MAXTABLESIZE_MASK (FSEv06_MAX_TABLESIZE-1)
1191 #define FSEv06_DEFAULT_TABLELOG (FSEv06_DEFAULT_MEMORY_USAGE-2)
1192 #define FSEv06_MIN_TABLELOG 5
1193 
1194 #define FSEv06_TABLELOG_ABSOLUTE_MAX 15
1195 #if FSEv06_MAX_TABLELOG > FSEv06_TABLELOG_ABSOLUTE_MAX
1196 #error "FSEv06_MAX_TABLELOG > FSEv06_TABLELOG_ABSOLUTE_MAX is not supported"
1197 #endif
1198 
1199 #define FSEv06_TABLESTEP(tableSize) ((tableSize>>1) + (tableSize>>3) + 3)
1200 
1201 
1202 #if defined (__cplusplus)
1203 }
1204 #endif
1205 
1206 #endif  /* FSEv06_STATIC_H */
1207 /*
1208    Common functions of New Generation Entropy library
1209    Copyright (C) 2016, Yann Collet.
1210 
1211    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1212 
1213    Redistribution and use in source and binary forms, with or without
1214    modification, are permitted provided that the following conditions are
1215    met:
1216 
1217        * Redistributions of source code must retain the above copyright
1218    notice, this list of conditions and the following disclaimer.
1219        * Redistributions in binary form must reproduce the above
1220    copyright notice, this list of conditions and the following disclaimer
1221    in the documentation and/or other materials provided with the
1222    distribution.
1223 
1224    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1225    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1226    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1227    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1228    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1229    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1230    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1231    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1232    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1233    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1234    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1235 
1236     You can contact the author at :
1237     - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy
1238     - Public forum : https://groups.google.com/forum/#!forum/lz4c
1239 *************************************************************************** */
1240 
1241 
1242 /*-****************************************
1243 *  FSE Error Management
1244 ******************************************/
1245 unsigned FSEv06_isError(size_t code) { return ERR_isError(code); }
1246 
1247 const char* FSEv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
1248 
1249 
1250 /* **************************************************************
1251 *  HUF Error Management
1252 ****************************************************************/
1253 unsigned HUFv06_isError(size_t code) { return ERR_isError(code); }
1254 
1255 const char* HUFv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
1256 
1257 
1258 /*-**************************************************************
1259 *  FSE NCount encoding-decoding
1260 ****************************************************************/
1261 static short FSEv06_abs(short a) { return a<0 ? -a : a; }
1262 
1263 size_t FSEv06_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
1264                  const void* headerBuffer, size_t hbSize)
1265 {
1266     const BYTE* const istart = (const BYTE*) headerBuffer;
1267     const BYTE* const iend = istart + hbSize;
1268     const BYTE* ip = istart;
1269     int nbBits;
1270     int remaining;
1271     int threshold;
1272     U32 bitStream;
1273     int bitCount;
1274     unsigned charnum = 0;
1275     int previous0 = 0;
1276 
1277     if (hbSize < 4) return ERROR(srcSize_wrong);
1278     bitStream = MEM_readLE32(ip);
1279     nbBits = (bitStream & 0xF) + FSEv06_MIN_TABLELOG;   /* extract tableLog */
1280     if (nbBits > FSEv06_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge);
1281     bitStream >>= 4;
1282     bitCount = 4;
1283     *tableLogPtr = nbBits;
1284     remaining = (1<<nbBits)+1;
1285     threshold = 1<<nbBits;
1286     nbBits++;
1287 
1288     while ((remaining>1) && (charnum<=*maxSVPtr)) {
1289         if (previous0) {
1290             unsigned n0 = charnum;
1291             while ((bitStream & 0xFFFF) == 0xFFFF) {
1292                 n0+=24;
1293                 if (ip < iend-5) {
1294                     ip+=2;
1295                     bitStream = MEM_readLE32(ip) >> bitCount;
1296                 } else {
1297                     bitStream >>= 16;
1298                     bitCount+=16;
1299             }   }
1300             while ((bitStream & 3) == 3) {
1301                 n0+=3;
1302                 bitStream>>=2;
1303                 bitCount+=2;
1304             }
1305             n0 += bitStream & 3;
1306             bitCount += 2;
1307             if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall);
1308             while (charnum < n0) normalizedCounter[charnum++] = 0;
1309             if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) {
1310                 ip += bitCount>>3;
1311                 bitCount &= 7;
1312                 bitStream = MEM_readLE32(ip) >> bitCount;
1313             }
1314             else
1315                 bitStream >>= 2;
1316         }
1317         {   short const max = (short)((2*threshold-1)-remaining);
1318             short count;
1319 
1320             if ((bitStream & (threshold-1)) < (U32)max) {
1321                 count = (short)(bitStream & (threshold-1));
1322                 bitCount   += nbBits-1;
1323             } else {
1324                 count = (short)(bitStream & (2*threshold-1));
1325                 if (count >= threshold) count -= max;
1326                 bitCount   += nbBits;
1327             }
1328 
1329             count--;   /* extra accuracy */
1330             remaining -= FSEv06_abs(count);
1331             normalizedCounter[charnum++] = count;
1332             previous0 = !count;
1333             while (remaining < threshold) {
1334                 nbBits--;
1335                 threshold >>= 1;
1336             }
1337 
1338             if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) {
1339                 ip += bitCount>>3;
1340                 bitCount &= 7;
1341             } else {
1342                 bitCount -= (int)(8 * (iend - 4 - ip));
1343                 ip = iend - 4;
1344             }
1345             bitStream = MEM_readLE32(ip) >> (bitCount & 31);
1346     }   }   /* while ((remaining>1) && (charnum<=*maxSVPtr)) */
1347     if (remaining != 1) return ERROR(GENERIC);
1348     *maxSVPtr = charnum-1;
1349 
1350     ip += (bitCount+7)>>3;
1351     if ((size_t)(ip-istart) > hbSize) return ERROR(srcSize_wrong);
1352     return ip-istart;
1353 }
1354 /* ******************************************************************
1355    FSE : Finite State Entropy decoder
1356    Copyright (C) 2013-2015, Yann Collet.
1357 
1358    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1359 
1360    Redistribution and use in source and binary forms, with or without
1361    modification, are permitted provided that the following conditions are
1362    met:
1363 
1364        * Redistributions of source code must retain the above copyright
1365    notice, this list of conditions and the following disclaimer.
1366        * Redistributions in binary form must reproduce the above
1367    copyright notice, this list of conditions and the following disclaimer
1368    in the documentation and/or other materials provided with the
1369    distribution.
1370 
1371    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1372    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1373    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1374    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1375    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1376    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1377    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1378    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1379    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1380    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1381    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1382 
1383     You can contact the author at :
1384     - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
1385     - Public forum : https://groups.google.com/forum/#!forum/lz4c
1386 ****************************************************************** */
1387 
1388 
1389 /* **************************************************************
1390 *  Compiler specifics
1391 ****************************************************************/
1392 #ifdef _MSC_VER    /* Visual Studio */
1393 #  define FORCE_INLINE static __forceinline
1394 #  include <intrin.h>                    /* For Visual 2005 */
1395 #  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
1396 #  pragma warning(disable : 4214)        /* disable: C4214: non-int bitfields */
1397 #else
1398 #  if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */
1399 #    ifdef __GNUC__
1400 #      define FORCE_INLINE static inline __attribute__((always_inline))
1401 #    else
1402 #      define FORCE_INLINE static inline
1403 #    endif
1404 #  else
1405 #    define FORCE_INLINE static
1406 #  endif /* __STDC_VERSION__ */
1407 #endif
1408 
1409 
1410 /* **************************************************************
1411 *  Error Management
1412 ****************************************************************/
1413 #define FSEv06_isError ERR_isError
1414 #define FSEv06_STATIC_ASSERT(c) { enum { FSEv06_static_assert = 1/(int)(!!(c)) }; }   /* use only *after* variable declarations */
1415 
1416 
1417 /* **************************************************************
1418 *  Complex types
1419 ****************************************************************/
1420 typedef U32 DTable_max_t[FSEv06_DTABLE_SIZE_U32(FSEv06_MAX_TABLELOG)];
1421 
1422 
1423 /* **************************************************************
1424 *  Templates
1425 ****************************************************************/
1426 /*
1427   designed to be included
1428   for type-specific functions (template emulation in C)
1429   Objective is to write these functions only once, for improved maintenance
1430 */
1431 
1432 /* safety checks */
1433 #ifndef FSEv06_FUNCTION_EXTENSION
1434 #  error "FSEv06_FUNCTION_EXTENSION must be defined"
1435 #endif
1436 #ifndef FSEv06_FUNCTION_TYPE
1437 #  error "FSEv06_FUNCTION_TYPE must be defined"
1438 #endif
1439 
1440 /* Function names */
1441 #define FSEv06_CAT(X,Y) X##Y
1442 #define FSEv06_FUNCTION_NAME(X,Y) FSEv06_CAT(X,Y)
1443 #define FSEv06_TYPE_NAME(X,Y) FSEv06_CAT(X,Y)
1444 
1445 
1446 /* Function templates */
1447 FSEv06_DTable* FSEv06_createDTable (unsigned tableLog)
1448 {
1449     if (tableLog > FSEv06_TABLELOG_ABSOLUTE_MAX) tableLog = FSEv06_TABLELOG_ABSOLUTE_MAX;
1450     return (FSEv06_DTable*)malloc( FSEv06_DTABLE_SIZE_U32(tableLog) * sizeof (U32) );
1451 }
1452 
1453 void FSEv06_freeDTable (FSEv06_DTable* dt)
1454 {
1455     free(dt);
1456 }
1457 
1458 size_t FSEv06_buildDTable(FSEv06_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
1459 {
1460     void* const tdPtr = dt+1;   /* because *dt is unsigned, 32-bits aligned on 32-bits */
1461     FSEv06_DECODE_TYPE* const tableDecode = (FSEv06_DECODE_TYPE*) (tdPtr);
1462     U16 symbolNext[FSEv06_MAX_SYMBOL_VALUE+1];
1463 
1464     U32 const maxSV1 = maxSymbolValue + 1;
1465     U32 const tableSize = 1 << tableLog;
1466     U32 highThreshold = tableSize-1;
1467 
1468     /* Sanity Checks */
1469     if (maxSymbolValue > FSEv06_MAX_SYMBOL_VALUE) return ERROR(maxSymbolValue_tooLarge);
1470     if (tableLog > FSEv06_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
1471 
1472     /* Init, lay down lowprob symbols */
1473     {   FSEv06_DTableHeader DTableH;
1474         DTableH.tableLog = (U16)tableLog;
1475         DTableH.fastMode = 1;
1476         {   S16 const largeLimit= (S16)(1 << (tableLog-1));
1477             U32 s;
1478             for (s=0; s<maxSV1; s++) {
1479                 if (normalizedCounter[s]==-1) {
1480                     tableDecode[highThreshold--].symbol = (FSEv06_FUNCTION_TYPE)s;
1481                     symbolNext[s] = 1;
1482                 } else {
1483                     if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
1484                     symbolNext[s] = normalizedCounter[s];
1485         }   }   }
1486         memcpy(dt, &DTableH, sizeof(DTableH));
1487     }
1488 
1489     /* Spread symbols */
1490     {   U32 const tableMask = tableSize-1;
1491         U32 const step = FSEv06_TABLESTEP(tableSize);
1492         U32 s, position = 0;
1493         for (s=0; s<maxSV1; s++) {
1494             int i;
1495             for (i=0; i<normalizedCounter[s]; i++) {
1496                 tableDecode[position].symbol = (FSEv06_FUNCTION_TYPE)s;
1497                 position = (position + step) & tableMask;
1498                 while (position > highThreshold) position = (position + step) & tableMask;   /* lowprob area */
1499         }   }
1500 
1501         if (position!=0) return ERROR(GENERIC);   /* position must reach all cells once, otherwise normalizedCounter is incorrect */
1502     }
1503 
1504     /* Build Decoding table */
1505     {   U32 u;
1506         for (u=0; u<tableSize; u++) {
1507             FSEv06_FUNCTION_TYPE const symbol = (FSEv06_FUNCTION_TYPE)(tableDecode[u].symbol);
1508             U16 nextState = symbolNext[symbol]++;
1509             tableDecode[u].nbBits = (BYTE) (tableLog - BITv06_highbit32 ((U32)nextState) );
1510             tableDecode[u].newState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
1511     }   }
1512 
1513     return 0;
1514 }
1515 
1516 
1517 
1518 #ifndef FSEv06_COMMONDEFS_ONLY
1519 
1520 /*-*******************************************************
1521 *  Decompression (Byte symbols)
1522 *********************************************************/
1523 size_t FSEv06_buildDTable_rle (FSEv06_DTable* dt, BYTE symbolValue)
1524 {
1525     void* ptr = dt;
1526     FSEv06_DTableHeader* const DTableH = (FSEv06_DTableHeader*)ptr;
1527     void* dPtr = dt + 1;
1528     FSEv06_decode_t* const cell = (FSEv06_decode_t*)dPtr;
1529 
1530     DTableH->tableLog = 0;
1531     DTableH->fastMode = 0;
1532 
1533     cell->newState = 0;
1534     cell->symbol = symbolValue;
1535     cell->nbBits = 0;
1536 
1537     return 0;
1538 }
1539 
1540 
1541 size_t FSEv06_buildDTable_raw (FSEv06_DTable* dt, unsigned nbBits)
1542 {
1543     void* ptr = dt;
1544     FSEv06_DTableHeader* const DTableH = (FSEv06_DTableHeader*)ptr;
1545     void* dPtr = dt + 1;
1546     FSEv06_decode_t* const dinfo = (FSEv06_decode_t*)dPtr;
1547     const unsigned tableSize = 1 << nbBits;
1548     const unsigned tableMask = tableSize - 1;
1549     const unsigned maxSV1 = tableMask+1;
1550     unsigned s;
1551 
1552     /* Sanity checks */
1553     if (nbBits < 1) return ERROR(GENERIC);         /* min size */
1554 
1555     /* Build Decoding Table */
1556     DTableH->tableLog = (U16)nbBits;
1557     DTableH->fastMode = 1;
1558     for (s=0; s<maxSV1; s++) {
1559         dinfo[s].newState = 0;
1560         dinfo[s].symbol = (BYTE)s;
1561         dinfo[s].nbBits = (BYTE)nbBits;
1562     }
1563 
1564     return 0;
1565 }
1566 
1567 FORCE_INLINE size_t FSEv06_decompress_usingDTable_generic(
1568           void* dst, size_t maxDstSize,
1569     const void* cSrc, size_t cSrcSize,
1570     const FSEv06_DTable* dt, const unsigned fast)
1571 {
1572     BYTE* const ostart = (BYTE*) dst;
1573     BYTE* op = ostart;
1574     BYTE* const omax = op + maxDstSize;
1575     BYTE* const olimit = omax-3;
1576 
1577     BITv06_DStream_t bitD;
1578     FSEv06_DState_t state1;
1579     FSEv06_DState_t state2;
1580 
1581     /* Init */
1582     { size_t const errorCode = BITv06_initDStream(&bitD, cSrc, cSrcSize);   /* replaced last arg by maxCompressed Size */
1583       if (FSEv06_isError(errorCode)) return errorCode; }
1584 
1585     FSEv06_initDState(&state1, &bitD, dt);
1586     FSEv06_initDState(&state2, &bitD, dt);
1587 
1588 #define FSEv06_GETSYMBOL(statePtr) fast ? FSEv06_decodeSymbolFast(statePtr, &bitD) : FSEv06_decodeSymbol(statePtr, &bitD)
1589 
1590     /* 4 symbols per loop */
1591     for ( ; (BITv06_reloadDStream(&bitD)==BITv06_DStream_unfinished) && (op<olimit) ; op+=4) {
1592         op[0] = FSEv06_GETSYMBOL(&state1);
1593 
1594         if (FSEv06_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
1595             BITv06_reloadDStream(&bitD);
1596 
1597         op[1] = FSEv06_GETSYMBOL(&state2);
1598 
1599         if (FSEv06_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
1600             { if (BITv06_reloadDStream(&bitD) > BITv06_DStream_unfinished) { op+=2; break; } }
1601 
1602         op[2] = FSEv06_GETSYMBOL(&state1);
1603 
1604         if (FSEv06_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
1605             BITv06_reloadDStream(&bitD);
1606 
1607         op[3] = FSEv06_GETSYMBOL(&state2);
1608     }
1609 
1610     /* tail */
1611     /* note : BITv06_reloadDStream(&bitD) >= FSEv06_DStream_partiallyFilled; Ends at exactly BITv06_DStream_completed */
1612     while (1) {
1613         if (op>(omax-2)) return ERROR(dstSize_tooSmall);
1614 
1615         *op++ = FSEv06_GETSYMBOL(&state1);
1616 
1617         if (BITv06_reloadDStream(&bitD)==BITv06_DStream_overflow) {
1618             *op++ = FSEv06_GETSYMBOL(&state2);
1619             break;
1620         }
1621 
1622         if (op>(omax-2)) return ERROR(dstSize_tooSmall);
1623 
1624         *op++ = FSEv06_GETSYMBOL(&state2);
1625 
1626         if (BITv06_reloadDStream(&bitD)==BITv06_DStream_overflow) {
1627             *op++ = FSEv06_GETSYMBOL(&state1);
1628             break;
1629     }   }
1630 
1631     return op-ostart;
1632 }
1633 
1634 
1635 size_t FSEv06_decompress_usingDTable(void* dst, size_t originalSize,
1636                             const void* cSrc, size_t cSrcSize,
1637                             const FSEv06_DTable* dt)
1638 {
1639     const void* ptr = dt;
1640     const FSEv06_DTableHeader* DTableH = (const FSEv06_DTableHeader*)ptr;
1641     const U32 fastMode = DTableH->fastMode;
1642 
1643     /* select fast mode (static) */
1644     if (fastMode) return FSEv06_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
1645     return FSEv06_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
1646 }
1647 
1648 
1649 size_t FSEv06_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1650 {
1651     const BYTE* const istart = (const BYTE*)cSrc;
1652     const BYTE* ip = istart;
1653     short counting[FSEv06_MAX_SYMBOL_VALUE+1];
1654     DTable_max_t dt;   /* Static analyzer seems unable to understand this table will be properly initialized later */
1655     unsigned tableLog;
1656     unsigned maxSymbolValue = FSEv06_MAX_SYMBOL_VALUE;
1657 
1658     if (cSrcSize<2) return ERROR(srcSize_wrong);   /* too small input size */
1659 
1660     /* normal FSE decoding mode */
1661     {   size_t const NCountLength = FSEv06_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
1662         if (FSEv06_isError(NCountLength)) return NCountLength;
1663         if (NCountLength >= cSrcSize) return ERROR(srcSize_wrong);   /* too small input size */
1664         ip += NCountLength;
1665         cSrcSize -= NCountLength;
1666     }
1667 
1668     { size_t const errorCode = FSEv06_buildDTable (dt, counting, maxSymbolValue, tableLog);
1669       if (FSEv06_isError(errorCode)) return errorCode; }
1670 
1671     return FSEv06_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);   /* always return, even if it is an error code */
1672 }
1673 
1674 
1675 
1676 #endif   /* FSEv06_COMMONDEFS_ONLY */
1677 /* ******************************************************************
1678    Huffman coder, part of New Generation Entropy library
1679    header file
1680    Copyright (C) 2013-2016, Yann Collet.
1681 
1682    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1683 
1684    Redistribution and use in source and binary forms, with or without
1685    modification, are permitted provided that the following conditions are
1686    met:
1687 
1688        * Redistributions of source code must retain the above copyright
1689    notice, this list of conditions and the following disclaimer.
1690        * Redistributions in binary form must reproduce the above
1691    copyright notice, this list of conditions and the following disclaimer
1692    in the documentation and/or other materials provided with the
1693    distribution.
1694 
1695    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1696    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1697    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1698    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1699    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1700    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1701    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1702    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1703    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1704    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1705    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1706 
1707    You can contact the author at :
1708    - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
1709 ****************************************************************** */
1710 #ifndef HUFv06_H
1711 #define HUFv06_H
1712 
1713 #if defined (__cplusplus)
1714 extern "C" {
1715 #endif
1716 
1717 
1718 /* ****************************************
1719 *  HUF simple functions
1720 ******************************************/
1721 size_t HUFv06_decompress(void* dst,  size_t dstSize,
1722                 const void* cSrc, size_t cSrcSize);
1723 /*
1724 HUFv06_decompress() :
1725     Decompress HUF data from buffer 'cSrc', of size 'cSrcSize',
1726     into already allocated destination buffer 'dst', of size 'dstSize'.
1727     `dstSize` : must be the **exact** size of original (uncompressed) data.
1728     Note : in contrast with FSE, HUFv06_decompress can regenerate
1729            RLE (cSrcSize==1) and uncompressed (cSrcSize==dstSize) data,
1730            because it knows size to regenerate.
1731     @return : size of regenerated data (== dstSize)
1732               or an error code, which can be tested using HUFv06_isError()
1733 */
1734 
1735 
1736 /* ****************************************
1737 *  Tool functions
1738 ******************************************/
1739 size_t HUFv06_compressBound(size_t size);       /**< maximum compressed size */
1740 
1741 
1742 #if defined (__cplusplus)
1743 }
1744 #endif
1745 
1746 #endif   /* HUFv06_H */
1747 /* ******************************************************************
1748    Huffman codec, part of New Generation Entropy library
1749    header file, for static linking only
1750    Copyright (C) 2013-2016, Yann Collet
1751 
1752    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1753 
1754    Redistribution and use in source and binary forms, with or without
1755    modification, are permitted provided that the following conditions are
1756    met:
1757 
1758        * Redistributions of source code must retain the above copyright
1759    notice, this list of conditions and the following disclaimer.
1760        * Redistributions in binary form must reproduce the above
1761    copyright notice, this list of conditions and the following disclaimer
1762    in the documentation and/or other materials provided with the
1763    distribution.
1764 
1765    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1766    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1767    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1768    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1769    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1770    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1771    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1772    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1773    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1774    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1775    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1776 
1777    You can contact the author at :
1778    - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
1779 ****************************************************************** */
1780 #ifndef HUFv06_STATIC_H
1781 #define HUFv06_STATIC_H
1782 
1783 #if defined (__cplusplus)
1784 extern "C" {
1785 #endif
1786 
1787 
1788 /* ****************************************
1789 *  Static allocation
1790 ******************************************/
1791 /* HUF buffer bounds */
1792 #define HUFv06_CTABLEBOUND 129
1793 #define HUFv06_BLOCKBOUND(size) (size + (size>>8) + 8)   /* only true if incompressible pre-filtered with fast heuristic */
1794 #define HUFv06_COMPRESSBOUND(size) (HUFv06_CTABLEBOUND + HUFv06_BLOCKBOUND(size))   /* Macro version, useful for static allocation */
1795 
1796 /* static allocation of HUF's DTable */
1797 #define HUFv06_DTABLE_SIZE(maxTableLog)   (1 + (1<<maxTableLog))
1798 #define HUFv06_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
1799         unsigned short DTable[HUFv06_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
1800 #define HUFv06_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \
1801         unsigned int DTable[HUFv06_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
1802 #define HUFv06_CREATE_STATIC_DTABLEX6(DTable, maxTableLog) \
1803         unsigned int DTable[HUFv06_DTABLE_SIZE(maxTableLog) * 3 / 2] = { maxTableLog }
1804 
1805 
1806 /* ****************************************
1807 *  Advanced decompression functions
1808 ******************************************/
1809 size_t HUFv06_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);   /* single-symbol decoder */
1810 size_t HUFv06_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);   /* double-symbols decoder */
1811 
1812 
1813 
1814 /*!
1815 HUFv06_decompress() does the following:
1816 1. select the decompression algorithm (X2, X4, X6) based on pre-computed heuristics
1817 2. build Huffman table from save, using HUFv06_readDTableXn()
1818 3. decode 1 or 4 segments in parallel using HUFv06_decompressSXn_usingDTable
1819 */
1820 size_t HUFv06_readDTableX2 (unsigned short* DTable, const void* src, size_t srcSize);
1821 size_t HUFv06_readDTableX4 (unsigned* DTable, const void* src, size_t srcSize);
1822 
1823 size_t HUFv06_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned short* DTable);
1824 size_t HUFv06_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned* DTable);
1825 
1826 
1827 /* single stream variants */
1828 size_t HUFv06_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);   /* single-symbol decoder */
1829 size_t HUFv06_decompress1X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);   /* double-symbol decoder */
1830 
1831 size_t HUFv06_decompress1X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned short* DTable);
1832 size_t HUFv06_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned* DTable);
1833 
1834 
1835 
1836 /* **************************************************************
1837 *  Constants
1838 ****************************************************************/
1839 #define HUFv06_ABSOLUTEMAX_TABLELOG  16   /* absolute limit of HUFv06_MAX_TABLELOG. Beyond that value, code does not work */
1840 #define HUFv06_MAX_TABLELOG  12           /* max configured tableLog (for static allocation); can be modified up to HUFv06_ABSOLUTEMAX_TABLELOG */
1841 #define HUFv06_DEFAULT_TABLELOG  HUFv06_MAX_TABLELOG   /* tableLog by default, when not specified */
1842 #define HUFv06_MAX_SYMBOL_VALUE 255
1843 #if (HUFv06_MAX_TABLELOG > HUFv06_ABSOLUTEMAX_TABLELOG)
1844 #  error "HUFv06_MAX_TABLELOG is too large !"
1845 #endif
1846 
1847 
1848 
1849 /*! HUFv06_readStats() :
1850     Read compact Huffman tree, saved by HUFv06_writeCTable().
1851     `huffWeight` is destination buffer.
1852     @return : size read from `src`
1853 */
1854 MEM_STATIC size_t HUFv06_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
1855                             U32* nbSymbolsPtr, U32* tableLogPtr,
1856                             const void* src, size_t srcSize)
1857 {
1858     U32 weightTotal;
1859     const BYTE* ip = (const BYTE*) src;
1860     size_t iSize;
1861     size_t oSize;
1862 
1863     if (!srcSize) return ERROR(srcSize_wrong);
1864     iSize = ip[0];
1865     //memset(huffWeight, 0, hwSize);   /* is not necessary, even though some analyzer complain ... */
1866 
1867     if (iSize >= 128)  { /* special header */
1868         if (iSize >= (242)) {  /* RLE */
1869             static U32 l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
1870             oSize = l[iSize-242];
1871             memset(huffWeight, 1, hwSize);
1872             iSize = 0;
1873         }
1874         else {   /* Incompressible */
1875             oSize = iSize - 127;
1876             iSize = ((oSize+1)/2);
1877             if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1878             if (oSize >= hwSize) return ERROR(corruption_detected);
1879             ip += 1;
1880             {   U32 n;
1881                 for (n=0; n<oSize; n+=2) {
1882                     huffWeight[n]   = ip[n/2] >> 4;
1883                     huffWeight[n+1] = ip[n/2] & 15;
1884     }   }   }   }
1885     else  {   /* header compressed with FSE (normal case) */
1886         if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1887         oSize = FSEv06_decompress(huffWeight, hwSize-1, ip+1, iSize);   /* max (hwSize-1) values decoded, as last one is implied */
1888         if (FSEv06_isError(oSize)) return oSize;
1889     }
1890 
1891     /* collect weight stats */
1892     memset(rankStats, 0, (HUFv06_ABSOLUTEMAX_TABLELOG + 1) * sizeof(U32));
1893     weightTotal = 0;
1894     {   U32 n; for (n=0; n<oSize; n++) {
1895             if (huffWeight[n] >= HUFv06_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1896             rankStats[huffWeight[n]]++;
1897             weightTotal += (1 << huffWeight[n]) >> 1;
1898     }   }
1899     if (weightTotal == 0) return ERROR(corruption_detected);
1900 
1901     /* get last non-null symbol weight (implied, total must be 2^n) */
1902     {   U32 const tableLog = BITv06_highbit32(weightTotal) + 1;
1903         if (tableLog > HUFv06_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1904         *tableLogPtr = tableLog;
1905         /* determine last weight */
1906         {   U32 const total = 1 << tableLog;
1907             U32 const rest = total - weightTotal;
1908             U32 const verif = 1 << BITv06_highbit32(rest);
1909             U32 const lastWeight = BITv06_highbit32(rest) + 1;
1910             if (verif != rest) return ERROR(corruption_detected);    /* last value must be a clean power of 2 */
1911             huffWeight[oSize] = (BYTE)lastWeight;
1912             rankStats[lastWeight]++;
1913     }   }
1914 
1915     /* check tree construction validity */
1916     if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected);   /* by construction : at least 2 elts of rank 1, must be even */
1917 
1918     /* results */
1919     *nbSymbolsPtr = (U32)(oSize+1);
1920     return iSize+1;
1921 }
1922 
1923 
1924 
1925 #if defined (__cplusplus)
1926 }
1927 #endif
1928 
1929 #endif /* HUFv06_STATIC_H */
1930 /* ******************************************************************
1931    Huffman decoder, part of New Generation Entropy library
1932    Copyright (C) 2013-2016, Yann Collet.
1933 
1934    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
1935 
1936    Redistribution and use in source and binary forms, with or without
1937    modification, are permitted provided that the following conditions are
1938    met:
1939 
1940        * Redistributions of source code must retain the above copyright
1941    notice, this list of conditions and the following disclaimer.
1942        * Redistributions in binary form must reproduce the above
1943    copyright notice, this list of conditions and the following disclaimer
1944    in the documentation and/or other materials provided with the
1945    distribution.
1946 
1947    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1948    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1949    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1950    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1951    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1952    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1953    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1954    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1955    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1956    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1957    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1958 
1959     You can contact the author at :
1960     - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy
1961     - Public forum : https://groups.google.com/forum/#!forum/lz4c
1962 ****************************************************************** */
1963 
1964 /* **************************************************************
1965 *  Compiler specifics
1966 ****************************************************************/
1967 #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
1968 /* inline is defined */
1969 #elif defined(_MSC_VER)
1970 #  define inline __inline
1971 #else
1972 #  define inline /* disable inline */
1973 #endif
1974 
1975 
1976 #ifdef _MSC_VER    /* Visual Studio */
1977 #  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
1978 #endif
1979 
1980 
1981 
1982 /* **************************************************************
1983 *  Error Management
1984 ****************************************************************/
1985 #define HUFv06_STATIC_ASSERT(c) { enum { HUFv06_static_assert = 1/(int)(!!(c)) }; }   /* use only *after* variable declarations */
1986 
1987 
1988 
1989 /* *******************************************************
1990 *  HUF : Huffman block decompression
1991 *********************************************************/
1992 typedef struct { BYTE byte; BYTE nbBits; } HUFv06_DEltX2;   /* single-symbol decoding */
1993 
1994 typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUFv06_DEltX4;  /* double-symbols decoding */
1995 
1996 typedef struct { BYTE symbol; BYTE weight; } sortedSymbol_t;
1997 
1998 
1999 
2000 /*-***************************/
2001 /*  single-symbol decoding   */
2002 /*-***************************/
2003 
2004 size_t HUFv06_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
2005 {
2006     BYTE huffWeight[HUFv06_MAX_SYMBOL_VALUE + 1];
2007     U32 rankVal[HUFv06_ABSOLUTEMAX_TABLELOG + 1];   /* large enough for values from 0 to 16 */
2008     U32 tableLog = 0;
2009     size_t iSize;
2010     U32 nbSymbols = 0;
2011     U32 n;
2012     U32 nextRankStart;
2013     void* const dtPtr = DTable + 1;
2014     HUFv06_DEltX2* const dt = (HUFv06_DEltX2*)dtPtr;
2015 
2016     HUFv06_STATIC_ASSERT(sizeof(HUFv06_DEltX2) == sizeof(U16));   /* if compilation fails here, assertion is false */
2017     //memset(huffWeight, 0, sizeof(huffWeight));   /* is not necessary, even though some analyzer complain ... */
2018 
2019     iSize = HUFv06_readStats(huffWeight, HUFv06_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
2020     if (HUFv06_isError(iSize)) return iSize;
2021 
2022     /* check result */
2023     if (tableLog > DTable[0]) return ERROR(tableLog_tooLarge);   /* DTable is too small */
2024     DTable[0] = (U16)tableLog;   /* maybe should separate sizeof allocated DTable, from used size of DTable, in case of re-use */
2025 
2026     /* Prepare ranks */
2027     nextRankStart = 0;
2028     for (n=1; n<tableLog+1; n++) {
2029         U32 current = nextRankStart;
2030         nextRankStart += (rankVal[n] << (n-1));
2031         rankVal[n] = current;
2032     }
2033 
2034     /* fill DTable */
2035     for (n=0; n<nbSymbols; n++) {
2036         const U32 w = huffWeight[n];
2037         const U32 length = (1 << w) >> 1;
2038         U32 i;
2039         HUFv06_DEltX2 D;
2040         D.byte = (BYTE)n; D.nbBits = (BYTE)(tableLog + 1 - w);
2041         for (i = rankVal[w]; i < rankVal[w] + length; i++)
2042             dt[i] = D;
2043         rankVal[w] += length;
2044     }
2045 
2046     return iSize;
2047 }
2048 
2049 
2050 static BYTE HUFv06_decodeSymbolX2(BITv06_DStream_t* Dstream, const HUFv06_DEltX2* dt, const U32 dtLog)
2051 {
2052     const size_t val = BITv06_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
2053     const BYTE c = dt[val].byte;
2054     BITv06_skipBits(Dstream, dt[val].nbBits);
2055     return c;
2056 }
2057 
2058 #define HUFv06_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \
2059     *ptr++ = HUFv06_decodeSymbolX2(DStreamPtr, dt, dtLog)
2060 
2061 #define HUFv06_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \
2062     if (MEM_64bits() || (HUFv06_MAX_TABLELOG<=12)) \
2063         HUFv06_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
2064 
2065 #define HUFv06_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \
2066     if (MEM_64bits()) \
2067         HUFv06_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
2068 
2069 static inline size_t HUFv06_decodeStreamX2(BYTE* p, BITv06_DStream_t* const bitDPtr, BYTE* const pEnd, const HUFv06_DEltX2* const dt, const U32 dtLog)
2070 {
2071     BYTE* const pStart = p;
2072 
2073     /* up to 4 symbols at a time */
2074     while ((BITv06_reloadDStream(bitDPtr) == BITv06_DStream_unfinished) && (p <= pEnd-4)) {
2075         HUFv06_DECODE_SYMBOLX2_2(p, bitDPtr);
2076         HUFv06_DECODE_SYMBOLX2_1(p, bitDPtr);
2077         HUFv06_DECODE_SYMBOLX2_2(p, bitDPtr);
2078         HUFv06_DECODE_SYMBOLX2_0(p, bitDPtr);
2079     }
2080 
2081     /* closer to the end */
2082     while ((BITv06_reloadDStream(bitDPtr) == BITv06_DStream_unfinished) && (p < pEnd))
2083         HUFv06_DECODE_SYMBOLX2_0(p, bitDPtr);
2084 
2085     /* no more data to retrieve from bitstream, hence no need to reload */
2086     while (p < pEnd)
2087         HUFv06_DECODE_SYMBOLX2_0(p, bitDPtr);
2088 
2089     return pEnd-pStart;
2090 }
2091 
2092 size_t HUFv06_decompress1X2_usingDTable(
2093           void* dst,  size_t dstSize,
2094     const void* cSrc, size_t cSrcSize,
2095     const U16* DTable)
2096 {
2097     BYTE* op = (BYTE*)dst;
2098     BYTE* const oend = op + dstSize;
2099     const U32 dtLog = DTable[0];
2100     const void* dtPtr = DTable;
2101     const HUFv06_DEltX2* const dt = ((const HUFv06_DEltX2*)dtPtr)+1;
2102     BITv06_DStream_t bitD;
2103 
2104     { size_t const errorCode = BITv06_initDStream(&bitD, cSrc, cSrcSize);
2105       if (HUFv06_isError(errorCode)) return errorCode; }
2106 
2107     HUFv06_decodeStreamX2(op, &bitD, oend, dt, dtLog);
2108 
2109     /* check */
2110     if (!BITv06_endOfDStream(&bitD)) return ERROR(corruption_detected);
2111 
2112     return dstSize;
2113 }
2114 
2115 size_t HUFv06_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2116 {
2117     HUFv06_CREATE_STATIC_DTABLEX2(DTable, HUFv06_MAX_TABLELOG);
2118     const BYTE* ip = (const BYTE*) cSrc;
2119 
2120     size_t const errorCode = HUFv06_readDTableX2 (DTable, cSrc, cSrcSize);
2121     if (HUFv06_isError(errorCode)) return errorCode;
2122     if (errorCode >= cSrcSize) return ERROR(srcSize_wrong);
2123     ip += errorCode;
2124     cSrcSize -= errorCode;
2125 
2126     return HUFv06_decompress1X2_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2127 }
2128 
2129 
2130 size_t HUFv06_decompress4X2_usingDTable(
2131           void* dst,  size_t dstSize,
2132     const void* cSrc, size_t cSrcSize,
2133     const U16* DTable)
2134 {
2135     /* Check */
2136     if (cSrcSize < 10) return ERROR(corruption_detected);  /* strict minimum : jump table + 1 byte per stream */
2137 
2138     {   const BYTE* const istart = (const BYTE*) cSrc;
2139         BYTE* const ostart = (BYTE*) dst;
2140         BYTE* const oend = ostart + dstSize;
2141         const void* const dtPtr = DTable;
2142         const HUFv06_DEltX2* const dt = ((const HUFv06_DEltX2*)dtPtr) +1;
2143         const U32 dtLog = DTable[0];
2144         size_t errorCode;
2145 
2146         /* Init */
2147         BITv06_DStream_t bitD1;
2148         BITv06_DStream_t bitD2;
2149         BITv06_DStream_t bitD3;
2150         BITv06_DStream_t bitD4;
2151         const size_t length1 = MEM_readLE16(istart);
2152         const size_t length2 = MEM_readLE16(istart+2);
2153         const size_t length3 = MEM_readLE16(istart+4);
2154         size_t length4;
2155         const BYTE* const istart1 = istart + 6;  /* jumpTable */
2156         const BYTE* const istart2 = istart1 + length1;
2157         const BYTE* const istart3 = istart2 + length2;
2158         const BYTE* const istart4 = istart3 + length3;
2159         const size_t segmentSize = (dstSize+3) / 4;
2160         BYTE* const opStart2 = ostart + segmentSize;
2161         BYTE* const opStart3 = opStart2 + segmentSize;
2162         BYTE* const opStart4 = opStart3 + segmentSize;
2163         BYTE* op1 = ostart;
2164         BYTE* op2 = opStart2;
2165         BYTE* op3 = opStart3;
2166         BYTE* op4 = opStart4;
2167         U32 endSignal;
2168 
2169         length4 = cSrcSize - (length1 + length2 + length3 + 6);
2170         if (length4 > cSrcSize) return ERROR(corruption_detected);   /* overflow */
2171         errorCode = BITv06_initDStream(&bitD1, istart1, length1);
2172         if (HUFv06_isError(errorCode)) return errorCode;
2173         errorCode = BITv06_initDStream(&bitD2, istart2, length2);
2174         if (HUFv06_isError(errorCode)) return errorCode;
2175         errorCode = BITv06_initDStream(&bitD3, istart3, length3);
2176         if (HUFv06_isError(errorCode)) return errorCode;
2177         errorCode = BITv06_initDStream(&bitD4, istart4, length4);
2178         if (HUFv06_isError(errorCode)) return errorCode;
2179 
2180         /* 16-32 symbols per loop (4-8 symbols per stream) */
2181         endSignal = BITv06_reloadDStream(&bitD1) | BITv06_reloadDStream(&bitD2) | BITv06_reloadDStream(&bitD3) | BITv06_reloadDStream(&bitD4);
2182         for ( ; (endSignal==BITv06_DStream_unfinished) && (op4<(oend-7)) ; ) {
2183             HUFv06_DECODE_SYMBOLX2_2(op1, &bitD1);
2184             HUFv06_DECODE_SYMBOLX2_2(op2, &bitD2);
2185             HUFv06_DECODE_SYMBOLX2_2(op3, &bitD3);
2186             HUFv06_DECODE_SYMBOLX2_2(op4, &bitD4);
2187             HUFv06_DECODE_SYMBOLX2_1(op1, &bitD1);
2188             HUFv06_DECODE_SYMBOLX2_1(op2, &bitD2);
2189             HUFv06_DECODE_SYMBOLX2_1(op3, &bitD3);
2190             HUFv06_DECODE_SYMBOLX2_1(op4, &bitD4);
2191             HUFv06_DECODE_SYMBOLX2_2(op1, &bitD1);
2192             HUFv06_DECODE_SYMBOLX2_2(op2, &bitD2);
2193             HUFv06_DECODE_SYMBOLX2_2(op3, &bitD3);
2194             HUFv06_DECODE_SYMBOLX2_2(op4, &bitD4);
2195             HUFv06_DECODE_SYMBOLX2_0(op1, &bitD1);
2196             HUFv06_DECODE_SYMBOLX2_0(op2, &bitD2);
2197             HUFv06_DECODE_SYMBOLX2_0(op3, &bitD3);
2198             HUFv06_DECODE_SYMBOLX2_0(op4, &bitD4);
2199             endSignal = BITv06_reloadDStream(&bitD1) | BITv06_reloadDStream(&bitD2) | BITv06_reloadDStream(&bitD3) | BITv06_reloadDStream(&bitD4);
2200         }
2201 
2202         /* check corruption */
2203         if (op1 > opStart2) return ERROR(corruption_detected);
2204         if (op2 > opStart3) return ERROR(corruption_detected);
2205         if (op3 > opStart4) return ERROR(corruption_detected);
2206         /* note : op4 supposed already verified within main loop */
2207 
2208         /* finish bitStreams one by one */
2209         HUFv06_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
2210         HUFv06_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
2211         HUFv06_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
2212         HUFv06_decodeStreamX2(op4, &bitD4, oend,     dt, dtLog);
2213 
2214         /* check */
2215         endSignal = BITv06_endOfDStream(&bitD1) & BITv06_endOfDStream(&bitD2) & BITv06_endOfDStream(&bitD3) & BITv06_endOfDStream(&bitD4);
2216         if (!endSignal) return ERROR(corruption_detected);
2217 
2218         /* decoded size */
2219         return dstSize;
2220     }
2221 }
2222 
2223 
2224 size_t HUFv06_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2225 {
2226     HUFv06_CREATE_STATIC_DTABLEX2(DTable, HUFv06_MAX_TABLELOG);
2227     const BYTE* ip = (const BYTE*) cSrc;
2228 
2229     size_t const errorCode = HUFv06_readDTableX2 (DTable, cSrc, cSrcSize);
2230     if (HUFv06_isError(errorCode)) return errorCode;
2231     if (errorCode >= cSrcSize) return ERROR(srcSize_wrong);
2232     ip += errorCode;
2233     cSrcSize -= errorCode;
2234 
2235     return HUFv06_decompress4X2_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2236 }
2237 
2238 
2239 /* *************************/
2240 /* double-symbols decoding */
2241 /* *************************/
2242 
2243 static void HUFv06_fillDTableX4Level2(HUFv06_DEltX4* DTable, U32 sizeLog, const U32 consumed,
2244                            const U32* rankValOrigin, const int minWeight,
2245                            const sortedSymbol_t* sortedSymbols, const U32 sortedListSize,
2246                            U32 nbBitsBaseline, U16 baseSeq)
2247 {
2248     HUFv06_DEltX4 DElt;
2249     U32 rankVal[HUFv06_ABSOLUTEMAX_TABLELOG + 1];
2250 
2251     /* get pre-calculated rankVal */
2252     memcpy(rankVal, rankValOrigin, sizeof(rankVal));
2253 
2254     /* fill skipped values */
2255     if (minWeight>1) {
2256         U32 i, skipSize = rankVal[minWeight];
2257         MEM_writeLE16(&(DElt.sequence), baseSeq);
2258         DElt.nbBits   = (BYTE)(consumed);
2259         DElt.length   = 1;
2260         for (i = 0; i < skipSize; i++)
2261             DTable[i] = DElt;
2262     }
2263 
2264     /* fill DTable */
2265     { U32 s; for (s=0; s<sortedListSize; s++) {   /* note : sortedSymbols already skipped */
2266         const U32 symbol = sortedSymbols[s].symbol;
2267         const U32 weight = sortedSymbols[s].weight;
2268         const U32 nbBits = nbBitsBaseline - weight;
2269         const U32 length = 1 << (sizeLog-nbBits);
2270         const U32 start = rankVal[weight];
2271         U32 i = start;
2272         const U32 end = start + length;
2273 
2274         MEM_writeLE16(&(DElt.sequence), (U16)(baseSeq + (symbol << 8)));
2275         DElt.nbBits = (BYTE)(nbBits + consumed);
2276         DElt.length = 2;
2277         do { DTable[i++] = DElt; } while (i<end);   /* since length >= 1 */
2278 
2279         rankVal[weight] += length;
2280     }}
2281 }
2282 
2283 typedef U32 rankVal_t[HUFv06_ABSOLUTEMAX_TABLELOG][HUFv06_ABSOLUTEMAX_TABLELOG + 1];
2284 
2285 static void HUFv06_fillDTableX4(HUFv06_DEltX4* DTable, const U32 targetLog,
2286                            const sortedSymbol_t* sortedList, const U32 sortedListSize,
2287                            const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight,
2288                            const U32 nbBitsBaseline)
2289 {
2290     U32 rankVal[HUFv06_ABSOLUTEMAX_TABLELOG + 1];
2291     const int scaleLog = nbBitsBaseline - targetLog;   /* note : targetLog >= srcLog, hence scaleLog <= 1 */
2292     const U32 minBits  = nbBitsBaseline - maxWeight;
2293     U32 s;
2294 
2295     memcpy(rankVal, rankValOrigin, sizeof(rankVal));
2296 
2297     /* fill DTable */
2298     for (s=0; s<sortedListSize; s++) {
2299         const U16 symbol = sortedList[s].symbol;
2300         const U32 weight = sortedList[s].weight;
2301         const U32 nbBits = nbBitsBaseline - weight;
2302         const U32 start = rankVal[weight];
2303         const U32 length = 1 << (targetLog-nbBits);
2304 
2305         if (targetLog-nbBits >= minBits) {   /* enough room for a second symbol */
2306             U32 sortedRank;
2307             int minWeight = nbBits + scaleLog;
2308             if (minWeight < 1) minWeight = 1;
2309             sortedRank = rankStart[minWeight];
2310             HUFv06_fillDTableX4Level2(DTable+start, targetLog-nbBits, nbBits,
2311                            rankValOrigin[nbBits], minWeight,
2312                            sortedList+sortedRank, sortedListSize-sortedRank,
2313                            nbBitsBaseline, symbol);
2314         } else {
2315             HUFv06_DEltX4 DElt;
2316             MEM_writeLE16(&(DElt.sequence), symbol);
2317             DElt.nbBits = (BYTE)(nbBits);
2318             DElt.length = 1;
2319             {   U32 u;
2320                 const U32 end = start + length;
2321                 for (u = start; u < end; u++) DTable[u] = DElt;
2322         }   }
2323         rankVal[weight] += length;
2324     }
2325 }
2326 
2327 size_t HUFv06_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
2328 {
2329     BYTE weightList[HUFv06_MAX_SYMBOL_VALUE + 1];
2330     sortedSymbol_t sortedSymbol[HUFv06_MAX_SYMBOL_VALUE + 1];
2331     U32 rankStats[HUFv06_ABSOLUTEMAX_TABLELOG + 1] = { 0 };
2332     U32 rankStart0[HUFv06_ABSOLUTEMAX_TABLELOG + 2] = { 0 };
2333     U32* const rankStart = rankStart0+1;
2334     rankVal_t rankVal;
2335     U32 tableLog, maxW, sizeOfSort, nbSymbols;
2336     const U32 memLog = DTable[0];
2337     size_t iSize;
2338     void* dtPtr = DTable;
2339     HUFv06_DEltX4* const dt = ((HUFv06_DEltX4*)dtPtr) + 1;
2340 
2341     HUFv06_STATIC_ASSERT(sizeof(HUFv06_DEltX4) == sizeof(U32));   /* if compilation fails here, assertion is false */
2342     if (memLog > HUFv06_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
2343     //memset(weightList, 0, sizeof(weightList));   /* is not necessary, even though some analyzer complain ... */
2344 
2345     iSize = HUFv06_readStats(weightList, HUFv06_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
2346     if (HUFv06_isError(iSize)) return iSize;
2347 
2348     /* check result */
2349     if (tableLog > memLog) return ERROR(tableLog_tooLarge);   /* DTable can't fit code depth */
2350 
2351     /* find maxWeight */
2352     for (maxW = tableLog; rankStats[maxW]==0; maxW--) {}  /* necessarily finds a solution before 0 */
2353 
2354     /* Get start index of each weight */
2355     {   U32 w, nextRankStart = 0;
2356         for (w=1; w<maxW+1; w++) {
2357             U32 current = nextRankStart;
2358             nextRankStart += rankStats[w];
2359             rankStart[w] = current;
2360         }
2361         rankStart[0] = nextRankStart;   /* put all 0w symbols at the end of sorted list*/
2362         sizeOfSort = nextRankStart;
2363     }
2364 
2365     /* sort symbols by weight */
2366     {   U32 s;
2367         for (s=0; s<nbSymbols; s++) {
2368             U32 const w = weightList[s];
2369             U32 const r = rankStart[w]++;
2370             sortedSymbol[r].symbol = (BYTE)s;
2371             sortedSymbol[r].weight = (BYTE)w;
2372         }
2373         rankStart[0] = 0;   /* forget 0w symbols; this is beginning of weight(1) */
2374     }
2375 
2376     /* Build rankVal */
2377     {   U32* const rankVal0 = rankVal[0];
2378         {   int const rescale = (memLog-tableLog) - 1;   /* tableLog <= memLog */
2379             U32 nextRankVal = 0;
2380             U32 w;
2381             for (w=1; w<maxW+1; w++) {
2382                 U32 current = nextRankVal;
2383                 nextRankVal += rankStats[w] << (w+rescale);
2384                 rankVal0[w] = current;
2385         }   }
2386         {   U32 const minBits = tableLog+1 - maxW;
2387             U32 consumed;
2388             for (consumed = minBits; consumed < memLog - minBits + 1; consumed++) {
2389                 U32* const rankValPtr = rankVal[consumed];
2390                 U32 w;
2391                 for (w = 1; w < maxW+1; w++) {
2392                     rankValPtr[w] = rankVal0[w] >> consumed;
2393     }   }   }   }
2394 
2395     HUFv06_fillDTableX4(dt, memLog,
2396                    sortedSymbol, sizeOfSort,
2397                    rankStart0, rankVal, maxW,
2398                    tableLog+1);
2399 
2400     return iSize;
2401 }
2402 
2403 
2404 static U32 HUFv06_decodeSymbolX4(void* op, BITv06_DStream_t* DStream, const HUFv06_DEltX4* dt, const U32 dtLog)
2405 {
2406     const size_t val = BITv06_lookBitsFast(DStream, dtLog);   /* note : dtLog >= 1 */
2407     memcpy(op, dt+val, 2);
2408     BITv06_skipBits(DStream, dt[val].nbBits);
2409     return dt[val].length;
2410 }
2411 
2412 static U32 HUFv06_decodeLastSymbolX4(void* op, BITv06_DStream_t* DStream, const HUFv06_DEltX4* dt, const U32 dtLog)
2413 {
2414     const size_t val = BITv06_lookBitsFast(DStream, dtLog);   /* note : dtLog >= 1 */
2415     memcpy(op, dt+val, 1);
2416     if (dt[val].length==1) BITv06_skipBits(DStream, dt[val].nbBits);
2417     else {
2418         if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) {
2419             BITv06_skipBits(DStream, dt[val].nbBits);
2420             if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
2421                 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 */
2422     }   }
2423     return 1;
2424 }
2425 
2426 
2427 #define HUFv06_DECODE_SYMBOLX4_0(ptr, DStreamPtr) \
2428     ptr += HUFv06_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2429 
2430 #define HUFv06_DECODE_SYMBOLX4_1(ptr, DStreamPtr) \
2431     if (MEM_64bits() || (HUFv06_MAX_TABLELOG<=12)) \
2432         ptr += HUFv06_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2433 
2434 #define HUFv06_DECODE_SYMBOLX4_2(ptr, DStreamPtr) \
2435     if (MEM_64bits()) \
2436         ptr += HUFv06_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2437 
2438 static inline size_t HUFv06_decodeStreamX4(BYTE* p, BITv06_DStream_t* bitDPtr, BYTE* const pEnd, const HUFv06_DEltX4* const dt, const U32 dtLog)
2439 {
2440     BYTE* const pStart = p;
2441 
2442     /* up to 8 symbols at a time */
2443     while ((BITv06_reloadDStream(bitDPtr) == BITv06_DStream_unfinished) && (p < pEnd-7)) {
2444         HUFv06_DECODE_SYMBOLX4_2(p, bitDPtr);
2445         HUFv06_DECODE_SYMBOLX4_1(p, bitDPtr);
2446         HUFv06_DECODE_SYMBOLX4_2(p, bitDPtr);
2447         HUFv06_DECODE_SYMBOLX4_0(p, bitDPtr);
2448     }
2449 
2450     /* closer to the end */
2451     while ((BITv06_reloadDStream(bitDPtr) == BITv06_DStream_unfinished) && (p <= pEnd-2))
2452         HUFv06_DECODE_SYMBOLX4_0(p, bitDPtr);
2453 
2454     while (p <= pEnd-2)
2455         HUFv06_DECODE_SYMBOLX4_0(p, bitDPtr);   /* no need to reload : reached the end of DStream */
2456 
2457     if (p < pEnd)
2458         p += HUFv06_decodeLastSymbolX4(p, bitDPtr, dt, dtLog);
2459 
2460     return p-pStart;
2461 }
2462 
2463 
2464 size_t HUFv06_decompress1X4_usingDTable(
2465           void* dst,  size_t dstSize,
2466     const void* cSrc, size_t cSrcSize,
2467     const U32* DTable)
2468 {
2469     const BYTE* const istart = (const BYTE*) cSrc;
2470     BYTE* const ostart = (BYTE*) dst;
2471     BYTE* const oend = ostart + dstSize;
2472 
2473     const U32 dtLog = DTable[0];
2474     const void* const dtPtr = DTable;
2475     const HUFv06_DEltX4* const dt = ((const HUFv06_DEltX4*)dtPtr) +1;
2476 
2477     /* Init */
2478     BITv06_DStream_t bitD;
2479     { size_t const errorCode = BITv06_initDStream(&bitD, istart, cSrcSize);
2480       if (HUFv06_isError(errorCode)) return errorCode; }
2481 
2482     /* decode */
2483     HUFv06_decodeStreamX4(ostart, &bitD, oend, dt, dtLog);
2484 
2485     /* check */
2486     if (!BITv06_endOfDStream(&bitD)) return ERROR(corruption_detected);
2487 
2488     /* decoded size */
2489     return dstSize;
2490 }
2491 
2492 size_t HUFv06_decompress1X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2493 {
2494     HUFv06_CREATE_STATIC_DTABLEX4(DTable, HUFv06_MAX_TABLELOG);
2495     const BYTE* ip = (const BYTE*) cSrc;
2496 
2497     size_t const hSize = HUFv06_readDTableX4 (DTable, cSrc, cSrcSize);
2498     if (HUFv06_isError(hSize)) return hSize;
2499     if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
2500     ip += hSize;
2501     cSrcSize -= hSize;
2502 
2503     return HUFv06_decompress1X4_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2504 }
2505 
2506 size_t HUFv06_decompress4X4_usingDTable(
2507           void* dst,  size_t dstSize,
2508     const void* cSrc, size_t cSrcSize,
2509     const U32* DTable)
2510 {
2511     if (cSrcSize < 10) return ERROR(corruption_detected);   /* strict minimum : jump table + 1 byte per stream */
2512 
2513     {   const BYTE* const istart = (const BYTE*) cSrc;
2514         BYTE* const ostart = (BYTE*) dst;
2515         BYTE* const oend = ostart + dstSize;
2516         const void* const dtPtr = DTable;
2517         const HUFv06_DEltX4* const dt = ((const HUFv06_DEltX4*)dtPtr) +1;
2518         const U32 dtLog = DTable[0];
2519         size_t errorCode;
2520 
2521         /* Init */
2522         BITv06_DStream_t bitD1;
2523         BITv06_DStream_t bitD2;
2524         BITv06_DStream_t bitD3;
2525         BITv06_DStream_t bitD4;
2526         const size_t length1 = MEM_readLE16(istart);
2527         const size_t length2 = MEM_readLE16(istart+2);
2528         const size_t length3 = MEM_readLE16(istart+4);
2529         size_t length4;
2530         const BYTE* const istart1 = istart + 6;  /* jumpTable */
2531         const BYTE* const istart2 = istart1 + length1;
2532         const BYTE* const istart3 = istart2 + length2;
2533         const BYTE* const istart4 = istart3 + length3;
2534         const size_t segmentSize = (dstSize+3) / 4;
2535         BYTE* const opStart2 = ostart + segmentSize;
2536         BYTE* const opStart3 = opStart2 + segmentSize;
2537         BYTE* const opStart4 = opStart3 + segmentSize;
2538         BYTE* op1 = ostart;
2539         BYTE* op2 = opStart2;
2540         BYTE* op3 = opStart3;
2541         BYTE* op4 = opStart4;
2542         U32 endSignal;
2543 
2544         length4 = cSrcSize - (length1 + length2 + length3 + 6);
2545         if (length4 > cSrcSize) return ERROR(corruption_detected);   /* overflow */
2546         errorCode = BITv06_initDStream(&bitD1, istart1, length1);
2547         if (HUFv06_isError(errorCode)) return errorCode;
2548         errorCode = BITv06_initDStream(&bitD2, istart2, length2);
2549         if (HUFv06_isError(errorCode)) return errorCode;
2550         errorCode = BITv06_initDStream(&bitD3, istart3, length3);
2551         if (HUFv06_isError(errorCode)) return errorCode;
2552         errorCode = BITv06_initDStream(&bitD4, istart4, length4);
2553         if (HUFv06_isError(errorCode)) return errorCode;
2554 
2555         /* 16-32 symbols per loop (4-8 symbols per stream) */
2556         endSignal = BITv06_reloadDStream(&bitD1) | BITv06_reloadDStream(&bitD2) | BITv06_reloadDStream(&bitD3) | BITv06_reloadDStream(&bitD4);
2557         for ( ; (endSignal==BITv06_DStream_unfinished) && (op4<(oend-7)) ; ) {
2558             HUFv06_DECODE_SYMBOLX4_2(op1, &bitD1);
2559             HUFv06_DECODE_SYMBOLX4_2(op2, &bitD2);
2560             HUFv06_DECODE_SYMBOLX4_2(op3, &bitD3);
2561             HUFv06_DECODE_SYMBOLX4_2(op4, &bitD4);
2562             HUFv06_DECODE_SYMBOLX4_1(op1, &bitD1);
2563             HUFv06_DECODE_SYMBOLX4_1(op2, &bitD2);
2564             HUFv06_DECODE_SYMBOLX4_1(op3, &bitD3);
2565             HUFv06_DECODE_SYMBOLX4_1(op4, &bitD4);
2566             HUFv06_DECODE_SYMBOLX4_2(op1, &bitD1);
2567             HUFv06_DECODE_SYMBOLX4_2(op2, &bitD2);
2568             HUFv06_DECODE_SYMBOLX4_2(op3, &bitD3);
2569             HUFv06_DECODE_SYMBOLX4_2(op4, &bitD4);
2570             HUFv06_DECODE_SYMBOLX4_0(op1, &bitD1);
2571             HUFv06_DECODE_SYMBOLX4_0(op2, &bitD2);
2572             HUFv06_DECODE_SYMBOLX4_0(op3, &bitD3);
2573             HUFv06_DECODE_SYMBOLX4_0(op4, &bitD4);
2574 
2575             endSignal = BITv06_reloadDStream(&bitD1) | BITv06_reloadDStream(&bitD2) | BITv06_reloadDStream(&bitD3) | BITv06_reloadDStream(&bitD4);
2576         }
2577 
2578         /* check corruption */
2579         if (op1 > opStart2) return ERROR(corruption_detected);
2580         if (op2 > opStart3) return ERROR(corruption_detected);
2581         if (op3 > opStart4) return ERROR(corruption_detected);
2582         /* note : op4 supposed already verified within main loop */
2583 
2584         /* finish bitStreams one by one */
2585         HUFv06_decodeStreamX4(op1, &bitD1, opStart2, dt, dtLog);
2586         HUFv06_decodeStreamX4(op2, &bitD2, opStart3, dt, dtLog);
2587         HUFv06_decodeStreamX4(op3, &bitD3, opStart4, dt, dtLog);
2588         HUFv06_decodeStreamX4(op4, &bitD4, oend,     dt, dtLog);
2589 
2590         /* check */
2591         endSignal = BITv06_endOfDStream(&bitD1) & BITv06_endOfDStream(&bitD2) & BITv06_endOfDStream(&bitD3) & BITv06_endOfDStream(&bitD4);
2592         if (!endSignal) return ERROR(corruption_detected);
2593 
2594         /* decoded size */
2595         return dstSize;
2596     }
2597 }
2598 
2599 
2600 size_t HUFv06_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2601 {
2602     HUFv06_CREATE_STATIC_DTABLEX4(DTable, HUFv06_MAX_TABLELOG);
2603     const BYTE* ip = (const BYTE*) cSrc;
2604 
2605     size_t hSize = HUFv06_readDTableX4 (DTable, cSrc, cSrcSize);
2606     if (HUFv06_isError(hSize)) return hSize;
2607     if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
2608     ip += hSize;
2609     cSrcSize -= hSize;
2610 
2611     return HUFv06_decompress4X4_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2612 }
2613 
2614 
2615 
2616 
2617 /* ********************************/
2618 /* Generic decompression selector */
2619 /* ********************************/
2620 
2621 typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t;
2622 static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] =
2623 {
2624     /* single, double, quad */
2625     {{0,0}, {1,1}, {2,2}},  /* Q==0 : impossible */
2626     {{0,0}, {1,1}, {2,2}},  /* Q==1 : impossible */
2627     {{  38,130}, {1313, 74}, {2151, 38}},   /* Q == 2 : 12-18% */
2628     {{ 448,128}, {1353, 74}, {2238, 41}},   /* Q == 3 : 18-25% */
2629     {{ 556,128}, {1353, 74}, {2238, 47}},   /* Q == 4 : 25-32% */
2630     {{ 714,128}, {1418, 74}, {2436, 53}},   /* Q == 5 : 32-38% */
2631     {{ 883,128}, {1437, 74}, {2464, 61}},   /* Q == 6 : 38-44% */
2632     {{ 897,128}, {1515, 75}, {2622, 68}},   /* Q == 7 : 44-50% */
2633     {{ 926,128}, {1613, 75}, {2730, 75}},   /* Q == 8 : 50-56% */
2634     {{ 947,128}, {1729, 77}, {3359, 77}},   /* Q == 9 : 56-62% */
2635     {{1107,128}, {2083, 81}, {4006, 84}},   /* Q ==10 : 62-69% */
2636     {{1177,128}, {2379, 87}, {4785, 88}},   /* Q ==11 : 69-75% */
2637     {{1242,128}, {2415, 93}, {5155, 84}},   /* Q ==12 : 75-81% */
2638     {{1349,128}, {2644,106}, {5260,106}},   /* Q ==13 : 81-87% */
2639     {{1455,128}, {2422,124}, {4174,124}},   /* Q ==14 : 87-93% */
2640     {{ 722,128}, {1891,145}, {1936,146}},   /* Q ==15 : 93-99% */
2641 };
2642 
2643 typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
2644 
2645 size_t HUFv06_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2646 {
2647     static const decompressionAlgo decompress[3] = { HUFv06_decompress4X2, HUFv06_decompress4X4, NULL };
2648     U32 Dtime[3];   /* decompression time estimation */
2649 
2650     /* validation checks */
2651     if (dstSize == 0) return ERROR(dstSize_tooSmall);
2652     if (cSrcSize > dstSize) return ERROR(corruption_detected);   /* invalid */
2653     if (cSrcSize == dstSize) { memcpy(dst, cSrc, dstSize); return dstSize; }   /* not compressed */
2654     if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; }   /* RLE */
2655 
2656     /* decoder timing evaluation */
2657     {   U32 const Q = (U32)(cSrcSize * 16 / dstSize);   /* Q < 16 since dstSize > cSrcSize */
2658         U32 const D256 = (U32)(dstSize >> 8);
2659         U32 n; for (n=0; n<3; n++)
2660             Dtime[n] = algoTime[Q][n].tableTime + (algoTime[Q][n].decode256Time * D256);
2661     }
2662 
2663     Dtime[1] += Dtime[1] >> 4; Dtime[2] += Dtime[2] >> 3; /* advantage to algorithms using less memory, for cache eviction */
2664 
2665     {   U32 algoNb = 0;
2666         if (Dtime[1] < Dtime[0]) algoNb = 1;
2667         // if (Dtime[2] < Dtime[algoNb]) algoNb = 2;   /* current speed of HUFv06_decompress4X6 is not good */
2668         return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
2669     }
2670 
2671     //return HUFv06_decompress4X2(dst, dstSize, cSrc, cSrcSize);   /* multi-streams single-symbol decoding */
2672     //return HUFv06_decompress4X4(dst, dstSize, cSrc, cSrcSize);   /* multi-streams double-symbols decoding */
2673     //return HUFv06_decompress4X6(dst, dstSize, cSrc, cSrcSize);   /* multi-streams quad-symbols decoding */
2674 }
2675 /*
2676     Common functions of Zstd compression library
2677     Copyright (C) 2015-2016, Yann Collet.
2678 
2679     BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
2680 
2681     Redistribution and use in source and binary forms, with or without
2682     modification, are permitted provided that the following conditions are
2683     met:
2684     * Redistributions of source code must retain the above copyright
2685     notice, this list of conditions and the following disclaimer.
2686     * Redistributions in binary form must reproduce the above
2687     copyright notice, this list of conditions and the following disclaimer
2688     in the documentation and/or other materials provided with the
2689     distribution.
2690     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2691     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2692     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2693     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2694     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2695     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2696     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2697     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2698     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2699     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2700     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2701 
2702     You can contact the author at :
2703     - zstd homepage : http://www.zstd.net/
2704 */
2705 
2706 
2707 /*-****************************************
2708 *  Version
2709 ******************************************/
2710 
2711 /*-****************************************
2712 *  ZSTD Error Management
2713 ******************************************/
2714 /*! ZSTDv06_isError() :
2715 *   tells if a return value is an error code */
2716 unsigned ZSTDv06_isError(size_t code) { return ERR_isError(code); }
2717 
2718 /*! ZSTDv06_getErrorName() :
2719 *   provides error code string from function result (useful for debugging) */
2720 const char* ZSTDv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
2721 
2722 
2723 /* **************************************************************
2724 *  ZBUFF Error Management
2725 ****************************************************************/
2726 unsigned ZBUFFv06_isError(size_t errorCode) { return ERR_isError(errorCode); }
2727 
2728 const char* ZBUFFv06_getErrorName(size_t errorCode) { return ERR_getErrorName(errorCode); }
2729 /*
2730     zstd - standard compression library
2731     Copyright (C) 2014-2016, Yann Collet.
2732 
2733     BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
2734 
2735     Redistribution and use in source and binary forms, with or without
2736     modification, are permitted provided that the following conditions are
2737     met:
2738     * Redistributions of source code must retain the above copyright
2739     notice, this list of conditions and the following disclaimer.
2740     * Redistributions in binary form must reproduce the above
2741     copyright notice, this list of conditions and the following disclaimer
2742     in the documentation and/or other materials provided with the
2743     distribution.
2744     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2745     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2746     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2747     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2748     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2749     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2750     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2751     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2752     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2753     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2754     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2755 
2756     You can contact the author at :
2757     - zstd homepage : http://www.zstd.net
2758 */
2759 
2760 /* ***************************************************************
2761 *  Tuning parameters
2762 *****************************************************************/
2763 /*!
2764  * HEAPMODE :
2765  * Select how default decompression function ZSTDv06_decompress() will allocate memory,
2766  * in memory stack (0), or in memory heap (1, requires malloc())
2767  */
2768 #ifndef ZSTDv06_HEAPMODE
2769 #  define ZSTDv06_HEAPMODE 1
2770 #endif
2771 
2772 
2773 
2774 /*-*******************************************************
2775 *  Compiler specifics
2776 *********************************************************/
2777 #ifdef _MSC_VER    /* Visual Studio */
2778 #  include <intrin.h>                    /* For Visual 2005 */
2779 #  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
2780 #  pragma warning(disable : 4324)        /* disable: C4324: padded structure */
2781 #endif
2782 
2783 
2784 /*-*************************************
2785 *  Macros
2786 ***************************************/
2787 #define ZSTDv06_isError ERR_isError   /* for inlining */
2788 #define FSEv06_isError  ERR_isError
2789 #define HUFv06_isError  ERR_isError
2790 
2791 
2792 /*_*******************************************************
2793 *  Memory operations
2794 **********************************************************/
2795 static void ZSTDv06_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
2796 
2797 
2798 /*-*************************************************************
2799 *   Context management
2800 ***************************************************************/
2801 typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
2802                ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock } ZSTDv06_dStage;
2803 
2804 struct ZSTDv06_DCtx_s
2805 {
2806     FSEv06_DTable LLTable[FSEv06_DTABLE_SIZE_U32(LLFSELog)];
2807     FSEv06_DTable OffTable[FSEv06_DTABLE_SIZE_U32(OffFSELog)];
2808     FSEv06_DTable MLTable[FSEv06_DTABLE_SIZE_U32(MLFSELog)];
2809     unsigned   hufTableX4[HUFv06_DTABLE_SIZE(HufLog)];
2810     const void* previousDstEnd;
2811     const void* base;
2812     const void* vBase;
2813     const void* dictEnd;
2814     size_t expected;
2815     size_t headerSize;
2816     ZSTDv06_frameParams fParams;
2817     blockType_t bType;   /* used in ZSTDv06_decompressContinue(), to transfer blockType between header decoding and block decoding stages */
2818     ZSTDv06_dStage stage;
2819     U32 flagRepeatTable;
2820     const BYTE* litPtr;
2821     size_t litSize;
2822     BYTE litBuffer[ZSTDv06_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
2823     BYTE headerBuffer[ZSTDv06_FRAMEHEADERSIZE_MAX];
2824 };  /* typedef'd to ZSTDv06_DCtx within "zstd_static.h" */
2825 
2826 size_t ZSTDv06_sizeofDCtx (void) { return sizeof(ZSTDv06_DCtx); }   /* non published interface */
2827 
2828 size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx)
2829 {
2830     dctx->expected = ZSTDv06_frameHeaderSize_min;
2831     dctx->stage = ZSTDds_getFrameHeaderSize;
2832     dctx->previousDstEnd = NULL;
2833     dctx->base = NULL;
2834     dctx->vBase = NULL;
2835     dctx->dictEnd = NULL;
2836     dctx->hufTableX4[0] = HufLog;
2837     dctx->flagRepeatTable = 0;
2838     return 0;
2839 }
2840 
2841 ZSTDv06_DCtx* ZSTDv06_createDCtx(void)
2842 {
2843     ZSTDv06_DCtx* dctx = (ZSTDv06_DCtx*)malloc(sizeof(ZSTDv06_DCtx));
2844     if (dctx==NULL) return NULL;
2845     ZSTDv06_decompressBegin(dctx);
2846     return dctx;
2847 }
2848 
2849 size_t ZSTDv06_freeDCtx(ZSTDv06_DCtx* dctx)
2850 {
2851     free(dctx);
2852     return 0;   /* reserved as a potential error code in the future */
2853 }
2854 
2855 void ZSTDv06_copyDCtx(ZSTDv06_DCtx* dstDCtx, const ZSTDv06_DCtx* srcDCtx)
2856 {
2857     memcpy(dstDCtx, srcDCtx,
2858            sizeof(ZSTDv06_DCtx) - (ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH + ZSTDv06_frameHeaderSize_max));  /* no need to copy workspace */
2859 }
2860 
2861 
2862 /*-*************************************************************
2863 *   Decompression section
2864 ***************************************************************/
2865 
2866 /* Frame format description
2867    Frame Header -  [ Block Header - Block ] - Frame End
2868    1) Frame Header
2869       - 4 bytes - Magic Number : ZSTDv06_MAGICNUMBER (defined within zstd_static.h)
2870       - 1 byte  - Frame Descriptor
2871    2) Block Header
2872       - 3 bytes, starting with a 2-bits descriptor
2873                  Uncompressed, Compressed, Frame End, unused
2874    3) Block
2875       See Block Format Description
2876    4) Frame End
2877       - 3 bytes, compatible with Block Header
2878 */
2879 
2880 
2881 /* Frame descriptor
2882 
2883    1 byte, using :
2884    bit 0-3 : windowLog - ZSTDv06_WINDOWLOG_ABSOLUTEMIN   (see zstd_internal.h)
2885    bit 4   : minmatch 4(0) or 3(1)
2886    bit 5   : reserved (must be zero)
2887    bit 6-7 : Frame content size : unknown, 1 byte, 2 bytes, 8 bytes
2888 
2889    Optional : content size (0, 1, 2 or 8 bytes)
2890    0 : unknown
2891    1 : 0-255 bytes
2892    2 : 256 - 65535+256
2893    8 : up to 16 exa
2894 */
2895 
2896 
2897 /* Compressed Block, format description
2898 
2899    Block = Literal Section - Sequences Section
2900    Prerequisite : size of (compressed) block, maximum size of regenerated data
2901 
2902    1) Literal Section
2903 
2904    1.1) Header : 1-5 bytes
2905         flags: 2 bits
2906             00 compressed by Huff0
2907             01 unused
2908             10 is Raw (uncompressed)
2909             11 is Rle
2910             Note : using 01 => Huff0 with precomputed table ?
2911             Note : delta map ? => compressed ?
2912 
2913    1.1.1) Huff0-compressed literal block : 3-5 bytes
2914             srcSize < 1 KB => 3 bytes (2-2-10-10) => single stream
2915             srcSize < 1 KB => 3 bytes (2-2-10-10)
2916             srcSize < 16KB => 4 bytes (2-2-14-14)
2917             else           => 5 bytes (2-2-18-18)
2918             big endian convention
2919 
2920    1.1.2) Raw (uncompressed) literal block header : 1-3 bytes
2921         size :  5 bits: (IS_RAW<<6) + (0<<4) + size
2922                12 bits: (IS_RAW<<6) + (2<<4) + (size>>8)
2923                         size&255
2924                20 bits: (IS_RAW<<6) + (3<<4) + (size>>16)
2925                         size>>8&255
2926                         size&255
2927 
2928    1.1.3) Rle (repeated single byte) literal block header : 1-3 bytes
2929         size :  5 bits: (IS_RLE<<6) + (0<<4) + size
2930                12 bits: (IS_RLE<<6) + (2<<4) + (size>>8)
2931                         size&255
2932                20 bits: (IS_RLE<<6) + (3<<4) + (size>>16)
2933                         size>>8&255
2934                         size&255
2935 
2936    1.1.4) Huff0-compressed literal block, using precomputed CTables : 3-5 bytes
2937             srcSize < 1 KB => 3 bytes (2-2-10-10) => single stream
2938             srcSize < 1 KB => 3 bytes (2-2-10-10)
2939             srcSize < 16KB => 4 bytes (2-2-14-14)
2940             else           => 5 bytes (2-2-18-18)
2941             big endian convention
2942 
2943         1- CTable available (stored into workspace ?)
2944         2- Small input (fast heuristic ? Full comparison ? depend on clevel ?)
2945 
2946 
2947    1.2) Literal block content
2948 
2949    1.2.1) Huff0 block, using sizes from header
2950         See Huff0 format
2951 
2952    1.2.2) Huff0 block, using prepared table
2953 
2954    1.2.3) Raw content
2955 
2956    1.2.4) single byte
2957 
2958 
2959    2) Sequences section
2960       TO DO
2961 */
2962 
2963 /** ZSTDv06_frameHeaderSize() :
2964 *   srcSize must be >= ZSTDv06_frameHeaderSize_min.
2965 *   @return : size of the Frame Header */
2966 static size_t ZSTDv06_frameHeaderSize(const void* src, size_t srcSize)
2967 {
2968     if (srcSize < ZSTDv06_frameHeaderSize_min) return ERROR(srcSize_wrong);
2969     { U32 const fcsId = (((const BYTE*)src)[4]) >> 6;
2970       return ZSTDv06_frameHeaderSize_min + ZSTDv06_fcs_fieldSize[fcsId]; }
2971 }
2972 
2973 
2974 /** ZSTDv06_getFrameParams() :
2975 *   decode Frame Header, or provide expected `srcSize`.
2976 *   @return : 0, `fparamsPtr` is correctly filled,
2977 *            >0, `srcSize` is too small, result is expected `srcSize`,
2978 *             or an error code, which can be tested using ZSTDv06_isError() */
2979 size_t ZSTDv06_getFrameParams(ZSTDv06_frameParams* fparamsPtr, const void* src, size_t srcSize)
2980 {
2981     const BYTE* ip = (const BYTE*)src;
2982 
2983     if (srcSize < ZSTDv06_frameHeaderSize_min) return ZSTDv06_frameHeaderSize_min;
2984     if (MEM_readLE32(src) != ZSTDv06_MAGICNUMBER) return ERROR(prefix_unknown);
2985 
2986     /* ensure there is enough `srcSize` to fully read/decode frame header */
2987     { size_t const fhsize = ZSTDv06_frameHeaderSize(src, srcSize);
2988       if (srcSize < fhsize) return fhsize; }
2989 
2990     memset(fparamsPtr, 0, sizeof(*fparamsPtr));
2991     {   BYTE const frameDesc = ip[4];
2992         fparamsPtr->windowLog = (frameDesc & 0xF) + ZSTDv06_WINDOWLOG_ABSOLUTEMIN;
2993         if ((frameDesc & 0x20) != 0) return ERROR(frameParameter_unsupported);   /* reserved 1 bit */
2994         switch(frameDesc >> 6)  /* fcsId */
2995         {
2996             default:   /* impossible */
2997             case 0 : fparamsPtr->frameContentSize = 0; break;
2998             case 1 : fparamsPtr->frameContentSize = ip[5]; break;
2999             case 2 : fparamsPtr->frameContentSize = MEM_readLE16(ip+5)+256; break;
3000             case 3 : fparamsPtr->frameContentSize = MEM_readLE64(ip+5); break;
3001     }   }
3002     return 0;
3003 }
3004 
3005 
3006 /** ZSTDv06_decodeFrameHeader() :
3007 *   `srcSize` must be the size provided by ZSTDv06_frameHeaderSize().
3008 *   @return : 0 if success, or an error code, which can be tested using ZSTDv06_isError() */
3009 static size_t ZSTDv06_decodeFrameHeader(ZSTDv06_DCtx* zc, const void* src, size_t srcSize)
3010 {
3011     size_t const result = ZSTDv06_getFrameParams(&(zc->fParams), src, srcSize);
3012     if ((MEM_32bits()) && (zc->fParams.windowLog > 25)) return ERROR(frameParameter_unsupported);
3013     return result;
3014 }
3015 
3016 
3017 typedef struct
3018 {
3019     blockType_t blockType;
3020     U32 origSize;
3021 } blockProperties_t;
3022 
3023 /*! ZSTDv06_getcBlockSize() :
3024 *   Provides the size of compressed block from block header `src` */
3025 size_t ZSTDv06_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
3026 {
3027     const BYTE* const in = (const BYTE* const)src;
3028     U32 cSize;
3029 
3030     if (srcSize < ZSTDv06_blockHeaderSize) return ERROR(srcSize_wrong);
3031 
3032     bpPtr->blockType = (blockType_t)((*in) >> 6);
3033     cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
3034     bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
3035 
3036     if (bpPtr->blockType == bt_end) return 0;
3037     if (bpPtr->blockType == bt_rle) return 1;
3038     return cSize;
3039 }
3040 
3041 
3042 static size_t ZSTDv06_copyRawBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
3043 {
3044     if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
3045     memcpy(dst, src, srcSize);
3046     return srcSize;
3047 }
3048 
3049 
3050 /*! ZSTDv06_decodeLiteralsBlock() :
3051     @return : nb of bytes read from src (< srcSize ) */
3052 size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
3053                           const void* src, size_t srcSize)   /* note : srcSize < BLOCKSIZE */
3054 {
3055     const BYTE* const istart = (const BYTE*) src;
3056 
3057     /* any compressed block with literals segment must be at least this size */
3058     if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
3059 
3060     switch(istart[0]>> 6)
3061     {
3062     case IS_HUF:
3063         {   size_t litSize, litCSize, singleStream=0;
3064             U32 lhSize = ((istart[0]) >> 4) & 3;
3065             if (srcSize < 5) return ERROR(corruption_detected);   /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for lhSize, + cSize (+nbSeq) */
3066             switch(lhSize)
3067             {
3068             case 0: case 1: default:   /* note : default is impossible, since lhSize into [0..3] */
3069                 /* 2 - 2 - 10 - 10 */
3070                 lhSize=3;
3071                 singleStream = istart[0] & 16;
3072                 litSize  = ((istart[0] & 15) << 6) + (istart[1] >> 2);
3073                 litCSize = ((istart[1] &  3) << 8) + istart[2];
3074                 break;
3075             case 2:
3076                 /* 2 - 2 - 14 - 14 */
3077                 lhSize=4;
3078                 litSize  = ((istart[0] & 15) << 10) + (istart[1] << 2) + (istart[2] >> 6);
3079                 litCSize = ((istart[2] & 63) <<  8) + istart[3];
3080                 break;
3081             case 3:
3082                 /* 2 - 2 - 18 - 18 */
3083                 lhSize=5;
3084                 litSize  = ((istart[0] & 15) << 14) + (istart[1] << 6) + (istart[2] >> 2);
3085                 litCSize = ((istart[2] &  3) << 16) + (istart[3] << 8) + istart[4];
3086                 break;
3087             }
3088             if (litSize > ZSTDv06_BLOCKSIZE_MAX) return ERROR(corruption_detected);
3089             if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
3090 
3091             if (HUFv06_isError(singleStream ?
3092                             HUFv06_decompress1X2(dctx->litBuffer, litSize, istart+lhSize, litCSize) :
3093                             HUFv06_decompress   (dctx->litBuffer, litSize, istart+lhSize, litCSize) ))
3094                 return ERROR(corruption_detected);
3095 
3096             dctx->litPtr = dctx->litBuffer;
3097             dctx->litSize = litSize;
3098             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
3099             return litCSize + lhSize;
3100         }
3101     case IS_PCH:
3102         {   size_t litSize, litCSize;
3103             U32 lhSize = ((istart[0]) >> 4) & 3;
3104             if (lhSize != 1)  /* only case supported for now : small litSize, single stream */
3105                 return ERROR(corruption_detected);
3106             if (!dctx->flagRepeatTable)
3107                 return ERROR(dictionary_corrupted);
3108 
3109             /* 2 - 2 - 10 - 10 */
3110             lhSize=3;
3111             litSize  = ((istart[0] & 15) << 6) + (istart[1] >> 2);
3112             litCSize = ((istart[1] &  3) << 8) + istart[2];
3113             if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
3114 
3115             {   size_t const errorCode = HUFv06_decompress1X4_usingDTable(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->hufTableX4);
3116                 if (HUFv06_isError(errorCode)) return ERROR(corruption_detected);
3117             }
3118             dctx->litPtr = dctx->litBuffer;
3119             dctx->litSize = litSize;
3120             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
3121             return litCSize + lhSize;
3122         }
3123     case IS_RAW:
3124         {   size_t litSize;
3125             U32 lhSize = ((istart[0]) >> 4) & 3;
3126             switch(lhSize)
3127             {
3128             case 0: case 1: default:   /* note : default is impossible, since lhSize into [0..3] */
3129                 lhSize=1;
3130                 litSize = istart[0] & 31;
3131                 break;
3132             case 2:
3133                 litSize = ((istart[0] & 15) << 8) + istart[1];
3134                 break;
3135             case 3:
3136                 litSize = ((istart[0] & 15) << 16) + (istart[1] << 8) + istart[2];
3137                 break;
3138             }
3139 
3140             if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) {  /* risk reading beyond src buffer with wildcopy */
3141                 if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
3142                 memcpy(dctx->litBuffer, istart+lhSize, litSize);
3143                 dctx->litPtr = dctx->litBuffer;
3144                 dctx->litSize = litSize;
3145                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
3146                 return lhSize+litSize;
3147             }
3148             /* direct reference into compressed stream */
3149             dctx->litPtr = istart+lhSize;
3150             dctx->litSize = litSize;
3151             return lhSize+litSize;
3152         }
3153     case IS_RLE:
3154         {   size_t litSize;
3155             U32 lhSize = ((istart[0]) >> 4) & 3;
3156             switch(lhSize)
3157             {
3158             case 0: case 1: default:   /* note : default is impossible, since lhSize into [0..3] */
3159                 lhSize = 1;
3160                 litSize = istart[0] & 31;
3161                 break;
3162             case 2:
3163                 litSize = ((istart[0] & 15) << 8) + istart[1];
3164                 break;
3165             case 3:
3166                 litSize = ((istart[0] & 15) << 16) + (istart[1] << 8) + istart[2];
3167                 if (srcSize<4) return ERROR(corruption_detected);   /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
3168                 break;
3169             }
3170             if (litSize > ZSTDv06_BLOCKSIZE_MAX) return ERROR(corruption_detected);
3171             memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
3172             dctx->litPtr = dctx->litBuffer;
3173             dctx->litSize = litSize;
3174             return lhSize+1;
3175         }
3176     default:
3177         return ERROR(corruption_detected);   /* impossible */
3178     }
3179 }
3180 
3181 
3182 /*! ZSTDv06_buildSeqTable() :
3183     @return : nb bytes read from src,
3184               or an error code if it fails, testable with ZSTDv06_isError()
3185 */
3186 size_t ZSTDv06_buildSeqTable(FSEv06_DTable* DTable, U32 type, U32 max, U32 maxLog,
3187                                  const void* src, size_t srcSize,
3188                                  const S16* defaultNorm, U32 defaultLog, U32 flagRepeatTable)
3189 {
3190     switch(type)
3191     {
3192     case FSEv06_ENCODING_RLE :
3193         if (!srcSize) return ERROR(srcSize_wrong);
3194         if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
3195         FSEv06_buildDTable_rle(DTable, *(const BYTE*)src);   /* if *src > max, data is corrupted */
3196         return 1;
3197     case FSEv06_ENCODING_RAW :
3198         FSEv06_buildDTable(DTable, defaultNorm, max, defaultLog);
3199         return 0;
3200     case FSEv06_ENCODING_STATIC:
3201         if (!flagRepeatTable) return ERROR(corruption_detected);
3202         return 0;
3203     default :   /* impossible */
3204     case FSEv06_ENCODING_DYNAMIC :
3205         {   U32 tableLog;
3206             S16 norm[MaxSeq+1];
3207             size_t const headerSize = FSEv06_readNCount(norm, &max, &tableLog, src, srcSize);
3208             if (FSEv06_isError(headerSize)) return ERROR(corruption_detected);
3209             if (tableLog > maxLog) return ERROR(corruption_detected);
3210             FSEv06_buildDTable(DTable, norm, max, tableLog);
3211             return headerSize;
3212     }   }
3213 }
3214 
3215 
3216 size_t ZSTDv06_decodeSeqHeaders(int* nbSeqPtr,
3217                              FSEv06_DTable* DTableLL, FSEv06_DTable* DTableML, FSEv06_DTable* DTableOffb, U32 flagRepeatTable,
3218                              const void* src, size_t srcSize)
3219 {
3220     const BYTE* const istart = (const BYTE* const)src;
3221     const BYTE* const iend = istart + srcSize;
3222     const BYTE* ip = istart;
3223 
3224     /* check */
3225     if (srcSize < MIN_SEQUENCES_SIZE) return ERROR(srcSize_wrong);
3226 
3227     /* SeqHead */
3228     {   int nbSeq = *ip++;
3229         if (!nbSeq) { *nbSeqPtr=0; return 1; }
3230         if (nbSeq > 0x7F) {
3231             if (nbSeq == 0xFF) {
3232                 if (ip+2 > iend) return ERROR(srcSize_wrong);
3233                 nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
3234             } else {
3235                 if (ip >= iend) return ERROR(srcSize_wrong);
3236                 nbSeq = ((nbSeq-0x80)<<8) + *ip++;
3237             }
3238         }
3239         *nbSeqPtr = nbSeq;
3240     }
3241 
3242     /* FSE table descriptors */
3243     {   U32 const LLtype  = *ip >> 6;
3244         U32 const Offtype = (*ip >> 4) & 3;
3245         U32 const MLtype  = (*ip >> 2) & 3;
3246         ip++;
3247 
3248         /* check */
3249         if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
3250 
3251         /* Build DTables */
3252         {   size_t const bhSize = ZSTDv06_buildSeqTable(DTableLL, LLtype, MaxLL, LLFSELog, ip, iend-ip, LL_defaultNorm, LL_defaultNormLog, flagRepeatTable);
3253             if (ZSTDv06_isError(bhSize)) return ERROR(corruption_detected);
3254             ip += bhSize;
3255         }
3256         {   size_t const bhSize = ZSTDv06_buildSeqTable(DTableOffb, Offtype, MaxOff, OffFSELog, ip, iend-ip, OF_defaultNorm, OF_defaultNormLog, flagRepeatTable);
3257             if (ZSTDv06_isError(bhSize)) return ERROR(corruption_detected);
3258             ip += bhSize;
3259         }
3260         {   size_t const bhSize = ZSTDv06_buildSeqTable(DTableML, MLtype, MaxML, MLFSELog, ip, iend-ip, ML_defaultNorm, ML_defaultNormLog, flagRepeatTable);
3261             if (ZSTDv06_isError(bhSize)) return ERROR(corruption_detected);
3262             ip += bhSize;
3263     }   }
3264 
3265     return ip-istart;
3266 }
3267 
3268 
3269 typedef struct {
3270     size_t litLength;
3271     size_t matchLength;
3272     size_t offset;
3273 } seq_t;
3274 
3275 typedef struct {
3276     BITv06_DStream_t DStream;
3277     FSEv06_DState_t stateLL;
3278     FSEv06_DState_t stateOffb;
3279     FSEv06_DState_t stateML;
3280     size_t prevOffset[ZSTDv06_REP_INIT];
3281 } seqState_t;
3282 
3283 
3284 
3285 static void ZSTDv06_decodeSequence(seq_t* seq, seqState_t* seqState)
3286 {
3287     /* Literal length */
3288     U32 const llCode = FSEv06_peekSymbol(&(seqState->stateLL));
3289     U32 const mlCode = FSEv06_peekSymbol(&(seqState->stateML));
3290     U32 const ofCode = FSEv06_peekSymbol(&(seqState->stateOffb));   /* <= maxOff, by table construction */
3291 
3292     U32 const llBits = LL_bits[llCode];
3293     U32 const mlBits = ML_bits[mlCode];
3294     U32 const ofBits = ofCode;
3295     U32 const totalBits = llBits+mlBits+ofBits;
3296 
3297     static const U32 LL_base[MaxLL+1] = {
3298                              0,  1,  2,  3,  4,  5,  6,  7,  8,  9,   10,    11,    12,    13,    14,     15,
3299                             16, 18, 20, 22, 24, 28, 32, 40, 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
3300                             0x2000, 0x4000, 0x8000, 0x10000 };
3301 
3302     static const U32 ML_base[MaxML+1] = {
3303                              0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,   11,    12,    13,    14,    15,
3304                             16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,   27,    28,    29,    30,    31,
3305                             32, 34, 36, 38, 40, 44, 48, 56, 64, 80, 96, 0x80, 0x100, 0x200, 0x400, 0x800,
3306                             0x1000, 0x2000, 0x4000, 0x8000, 0x10000 };
3307 
3308     static const U32 OF_base[MaxOff+1] = {
3309                  0,        1,       3,       7,     0xF,     0x1F,     0x3F,     0x7F,
3310                  0xFF,   0x1FF,   0x3FF,   0x7FF,   0xFFF,   0x1FFF,   0x3FFF,   0x7FFF,
3311                  0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF,
3312                  0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, /*fake*/ 1, 1 };
3313 
3314     /* sequence */
3315     {   size_t offset;
3316         if (!ofCode)
3317             offset = 0;
3318         else {
3319             offset = OF_base[ofCode] + BITv06_readBits(&(seqState->DStream), ofBits);   /* <=  26 bits */
3320             if (MEM_32bits()) BITv06_reloadDStream(&(seqState->DStream));
3321         }
3322 
3323         if (offset < ZSTDv06_REP_NUM) {
3324             if (llCode == 0 && offset <= 1) offset = 1-offset;
3325 
3326             if (offset != 0) {
3327                 size_t temp = seqState->prevOffset[offset];
3328                 if (offset != 1) {
3329                     seqState->prevOffset[2] = seqState->prevOffset[1];
3330                 }
3331                 seqState->prevOffset[1] = seqState->prevOffset[0];
3332                 seqState->prevOffset[0] = offset = temp;
3333 
3334             } else {
3335                 offset = seqState->prevOffset[0];
3336             }
3337         } else {
3338             offset -= ZSTDv06_REP_MOVE;
3339             seqState->prevOffset[2] = seqState->prevOffset[1];
3340             seqState->prevOffset[1] = seqState->prevOffset[0];
3341             seqState->prevOffset[0] = offset;
3342         }
3343         seq->offset = offset;
3344     }
3345 
3346     seq->matchLength = ML_base[mlCode] + MINMATCH + ((mlCode>31) ? BITv06_readBits(&(seqState->DStream), mlBits) : 0);   /* <=  16 bits */
3347     if (MEM_32bits() && (mlBits+llBits>24)) BITv06_reloadDStream(&(seqState->DStream));
3348 
3349     seq->litLength = LL_base[llCode] + ((llCode>15) ? BITv06_readBits(&(seqState->DStream), llBits) : 0);   /* <=  16 bits */
3350     if (MEM_32bits() ||
3351        (totalBits > 64 - 7 - (LLFSELog+MLFSELog+OffFSELog)) ) BITv06_reloadDStream(&(seqState->DStream));
3352 
3353     /* ANS state update */
3354     FSEv06_updateState(&(seqState->stateLL), &(seqState->DStream));   /* <=  9 bits */
3355     FSEv06_updateState(&(seqState->stateML), &(seqState->DStream));   /* <=  9 bits */
3356     if (MEM_32bits()) BITv06_reloadDStream(&(seqState->DStream));     /* <= 18 bits */
3357     FSEv06_updateState(&(seqState->stateOffb), &(seqState->DStream)); /* <=  8 bits */
3358 }
3359 
3360 
3361 size_t ZSTDv06_execSequence(BYTE* op,
3362                                 BYTE* const oend, seq_t sequence,
3363                                 const BYTE** litPtr, const BYTE* const litLimit,
3364                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
3365 {
3366     BYTE* const oLitEnd = op + sequence.litLength;
3367     size_t const sequenceLength = sequence.litLength + sequence.matchLength;
3368     BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
3369     BYTE* const oend_8 = oend-8;
3370     const BYTE* const iLitEnd = *litPtr + sequence.litLength;
3371     const BYTE* match = oLitEnd - sequence.offset;
3372 
3373     /* check */
3374     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */
3375     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */
3376     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */
3377 
3378     /* copy Literals */
3379     ZSTDv06_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
3380     op = oLitEnd;
3381     *litPtr = iLitEnd;   /* update for next sequence */
3382 
3383     /* copy Match */
3384     if (sequence.offset > (size_t)(oLitEnd - base)) {
3385         /* offset beyond prefix */
3386         if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
3387         match = dictEnd - (base-match);
3388         if (match + sequence.matchLength <= dictEnd) {
3389             memmove(oLitEnd, match, sequence.matchLength);
3390             return sequenceLength;
3391         }
3392         /* span extDict & currentPrefixSegment */
3393         {   size_t const length1 = dictEnd - match;
3394             memmove(oLitEnd, match, length1);
3395             op = oLitEnd + length1;
3396             sequence.matchLength -= length1;
3397             match = base;
3398             if (op > oend_8 || sequence.matchLength < MINMATCH) {
3399               while (op < oMatchEnd) *op++ = *match++;
3400               return sequenceLength;
3401             }
3402     }   }
3403     /* Requirement: op <= oend_8 */
3404 
3405     /* match within prefix */
3406     if (sequence.offset < 8) {
3407         /* close range match, overlap */
3408         static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */
3409         static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 };   /* substracted */
3410         int const sub2 = dec64table[sequence.offset];
3411         op[0] = match[0];
3412         op[1] = match[1];
3413         op[2] = match[2];
3414         op[3] = match[3];
3415         match += dec32table[sequence.offset];
3416         ZSTDv06_copy4(op+4, match);
3417         match -= sub2;
3418     } else {
3419         ZSTDv06_copy8(op, match);
3420     }
3421     op += 8; match += 8;
3422 
3423     if (oMatchEnd > oend-(16-MINMATCH)) {
3424         if (op < oend_8) {
3425             ZSTDv06_wildcopy(op, match, oend_8 - op);
3426             match += oend_8 - op;
3427             op = oend_8;
3428         }
3429         while (op < oMatchEnd) *op++ = *match++;
3430     } else {
3431         ZSTDv06_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8 */
3432     }
3433     return sequenceLength;
3434 }
3435 
3436 
3437 static size_t ZSTDv06_decompressSequences(
3438                                ZSTDv06_DCtx* dctx,
3439                                void* dst, size_t maxDstSize,
3440                          const void* seqStart, size_t seqSize)
3441 {
3442     const BYTE* ip = (const BYTE*)seqStart;
3443     const BYTE* const iend = ip + seqSize;
3444     BYTE* const ostart = (BYTE* const)dst;
3445     BYTE* const oend = ostart + maxDstSize;
3446     BYTE* op = ostart;
3447     const BYTE* litPtr = dctx->litPtr;
3448     const BYTE* const litEnd = litPtr + dctx->litSize;
3449     FSEv06_DTable* DTableLL = dctx->LLTable;
3450     FSEv06_DTable* DTableML = dctx->MLTable;
3451     FSEv06_DTable* DTableOffb = dctx->OffTable;
3452     const BYTE* const base = (const BYTE*) (dctx->base);
3453     const BYTE* const vBase = (const BYTE*) (dctx->vBase);
3454     const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
3455     int nbSeq;
3456 
3457     /* Build Decoding Tables */
3458     {   size_t const seqHSize = ZSTDv06_decodeSeqHeaders(&nbSeq, DTableLL, DTableML, DTableOffb, dctx->flagRepeatTable, ip, seqSize);
3459         if (ZSTDv06_isError(seqHSize)) return seqHSize;
3460         ip += seqHSize;
3461         dctx->flagRepeatTable = 0;
3462     }
3463 
3464     /* Regen sequences */
3465     if (nbSeq) {
3466         seq_t sequence;
3467         seqState_t seqState;
3468 
3469         memset(&sequence, 0, sizeof(sequence));
3470         sequence.offset = REPCODE_STARTVALUE;
3471         { U32 i; for (i=0; i<ZSTDv06_REP_INIT; i++) seqState.prevOffset[i] = REPCODE_STARTVALUE; }
3472         { size_t const errorCode = BITv06_initDStream(&(seqState.DStream), ip, iend-ip);
3473           if (ERR_isError(errorCode)) return ERROR(corruption_detected); }
3474         FSEv06_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
3475         FSEv06_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
3476         FSEv06_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
3477 
3478         for ( ; (BITv06_reloadDStream(&(seqState.DStream)) <= BITv06_DStream_completed) && nbSeq ; ) {
3479             nbSeq--;
3480             ZSTDv06_decodeSequence(&sequence, &seqState);
3481 
3482 #if 0  /* debug */
3483             static BYTE* start = NULL;
3484             if (start==NULL) start = op;
3485             size_t pos = (size_t)(op-start);
3486             if ((pos >= 5810037) && (pos < 5810400))
3487                 printf("Dpos %6u :%5u literals & match %3u bytes at distance %6u \n",
3488                        pos, (U32)sequence.litLength, (U32)sequence.matchLength, (U32)sequence.offset);
3489 #endif
3490 
3491             {   size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
3492                 if (ZSTDv06_isError(oneSeqSize)) return oneSeqSize;
3493                 op += oneSeqSize;
3494         }   }
3495 
3496         /* check if reached exact end */
3497         if (nbSeq) return ERROR(corruption_detected);
3498     }
3499 
3500     /* last literal segment */
3501     {   size_t const lastLLSize = litEnd - litPtr;
3502         if (litPtr > litEnd) return ERROR(corruption_detected);   /* too many literals already used */
3503         if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
3504         memcpy(op, litPtr, lastLLSize);
3505         op += lastLLSize;
3506     }
3507 
3508     return op-ostart;
3509 }
3510 
3511 
3512 static void ZSTDv06_checkContinuity(ZSTDv06_DCtx* dctx, const void* dst)
3513 {
3514     if (dst != dctx->previousDstEnd) {   /* not contiguous */
3515         dctx->dictEnd = dctx->previousDstEnd;
3516         dctx->vBase = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
3517         dctx->base = dst;
3518         dctx->previousDstEnd = dst;
3519     }
3520 }
3521 
3522 
3523 static size_t ZSTDv06_decompressBlock_internal(ZSTDv06_DCtx* dctx,
3524                             void* dst, size_t dstCapacity,
3525                       const void* src, size_t srcSize)
3526 {   /* blockType == blockCompressed */
3527     const BYTE* ip = (const BYTE*)src;
3528 
3529     if (srcSize >= ZSTDv06_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
3530 
3531     /* Decode literals sub-block */
3532     {   size_t const litCSize = ZSTDv06_decodeLiteralsBlock(dctx, src, srcSize);
3533         if (ZSTDv06_isError(litCSize)) return litCSize;
3534         ip += litCSize;
3535         srcSize -= litCSize;
3536     }
3537     return ZSTDv06_decompressSequences(dctx, dst, dstCapacity, ip, srcSize);
3538 }
3539 
3540 
3541 size_t ZSTDv06_decompressBlock(ZSTDv06_DCtx* dctx,
3542                             void* dst, size_t dstCapacity,
3543                       const void* src, size_t srcSize)
3544 {
3545     ZSTDv06_checkContinuity(dctx, dst);
3546     return ZSTDv06_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize);
3547 }
3548 
3549 
3550 /*! ZSTDv06_decompressFrame() :
3551 *   `dctx` must be properly initialized */
3552 static size_t ZSTDv06_decompressFrame(ZSTDv06_DCtx* dctx,
3553                                  void* dst, size_t dstCapacity,
3554                                  const void* src, size_t srcSize)
3555 {
3556     const BYTE* ip = (const BYTE*)src;
3557     const BYTE* const iend = ip + srcSize;
3558     BYTE* const ostart = (BYTE* const)dst;
3559     BYTE* op = ostart;
3560     BYTE* const oend = ostart + dstCapacity;
3561     size_t remainingSize = srcSize;
3562     blockProperties_t blockProperties = { bt_compressed, 0 };
3563 
3564     /* check */
3565     if (srcSize < ZSTDv06_frameHeaderSize_min+ZSTDv06_blockHeaderSize) return ERROR(srcSize_wrong);
3566 
3567     /* Frame Header */
3568     {   size_t const frameHeaderSize = ZSTDv06_frameHeaderSize(src, ZSTDv06_frameHeaderSize_min);
3569         if (ZSTDv06_isError(frameHeaderSize)) return frameHeaderSize;
3570         if (srcSize < frameHeaderSize+ZSTDv06_blockHeaderSize) return ERROR(srcSize_wrong);
3571         if (ZSTDv06_decodeFrameHeader(dctx, src, frameHeaderSize)) return ERROR(corruption_detected);
3572         ip += frameHeaderSize; remainingSize -= frameHeaderSize;
3573     }
3574 
3575     /* Loop on each block */
3576     while (1) {
3577         size_t decodedSize=0;
3578         size_t const cBlockSize = ZSTDv06_getcBlockSize(ip, iend-ip, &blockProperties);
3579         if (ZSTDv06_isError(cBlockSize)) return cBlockSize;
3580 
3581         ip += ZSTDv06_blockHeaderSize;
3582         remainingSize -= ZSTDv06_blockHeaderSize;
3583         if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3584 
3585         switch(blockProperties.blockType)
3586         {
3587         case bt_compressed:
3588             decodedSize = ZSTDv06_decompressBlock_internal(dctx, op, oend-op, ip, cBlockSize);
3589             break;
3590         case bt_raw :
3591             decodedSize = ZSTDv06_copyRawBlock(op, oend-op, ip, cBlockSize);
3592             break;
3593         case bt_rle :
3594             return ERROR(GENERIC);   /* not yet supported */
3595             break;
3596         case bt_end :
3597             /* end of frame */
3598             if (remainingSize) return ERROR(srcSize_wrong);
3599             break;
3600         default:
3601             return ERROR(GENERIC);   /* impossible */
3602         }
3603         if (cBlockSize == 0) break;   /* bt_end */
3604 
3605         if (ZSTDv06_isError(decodedSize)) return decodedSize;
3606         op += decodedSize;
3607         ip += cBlockSize;
3608         remainingSize -= cBlockSize;
3609     }
3610 
3611     return op-ostart;
3612 }
3613 
3614 
3615 size_t ZSTDv06_decompress_usingPreparedDCtx(ZSTDv06_DCtx* dctx, const ZSTDv06_DCtx* refDCtx,
3616                                          void* dst, size_t dstCapacity,
3617                                    const void* src, size_t srcSize)
3618 {
3619     ZSTDv06_copyDCtx(dctx, refDCtx);
3620     ZSTDv06_checkContinuity(dctx, dst);
3621     return ZSTDv06_decompressFrame(dctx, dst, dstCapacity, src, srcSize);
3622 }
3623 
3624 
3625 size_t ZSTDv06_decompress_usingDict(ZSTDv06_DCtx* dctx,
3626                                  void* dst, size_t dstCapacity,
3627                                  const void* src, size_t srcSize,
3628                                  const void* dict, size_t dictSize)
3629 {
3630     ZSTDv06_decompressBegin_usingDict(dctx, dict, dictSize);
3631     ZSTDv06_checkContinuity(dctx, dst);
3632     return ZSTDv06_decompressFrame(dctx, dst, dstCapacity, src, srcSize);
3633 }
3634 
3635 
3636 size_t ZSTDv06_decompressDCtx(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
3637 {
3638     return ZSTDv06_decompress_usingDict(dctx, dst, dstCapacity, src, srcSize, NULL, 0);
3639 }
3640 
3641 
3642 size_t ZSTDv06_decompress(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
3643 {
3644 #if defined(ZSTDv06_HEAPMODE) && (ZSTDv06_HEAPMODE==1)
3645     size_t regenSize;
3646     ZSTDv06_DCtx* dctx = ZSTDv06_createDCtx();
3647     if (dctx==NULL) return ERROR(memory_allocation);
3648     regenSize = ZSTDv06_decompressDCtx(dctx, dst, dstCapacity, src, srcSize);
3649     ZSTDv06_freeDCtx(dctx);
3650     return regenSize;
3651 #else   /* stack mode */
3652     ZSTDv06_DCtx dctx;
3653     return ZSTDv06_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize);
3654 #endif
3655 }
3656 
3657 size_t ZSTDv06_findFrameCompressedSize(const void* src, size_t srcSize)
3658 {
3659     const BYTE* ip = (const BYTE*)src;
3660     size_t remainingSize = srcSize;
3661     blockProperties_t blockProperties = { bt_compressed, 0 };
3662 
3663     /* Frame Header */
3664     {   size_t const frameHeaderSize = ZSTDv06_frameHeaderSize(src, ZSTDv06_frameHeaderSize_min);
3665         if (ZSTDv06_isError(frameHeaderSize)) return frameHeaderSize;
3666         if (MEM_readLE32(src) != ZSTDv06_MAGICNUMBER) return ERROR(prefix_unknown);
3667         if (srcSize < frameHeaderSize+ZSTDv06_blockHeaderSize) return ERROR(srcSize_wrong);
3668         ip += frameHeaderSize; remainingSize -= frameHeaderSize;
3669     }
3670 
3671     /* Loop on each block */
3672     while (1) {
3673         size_t const cBlockSize = ZSTDv06_getcBlockSize(ip, remainingSize, &blockProperties);
3674         if (ZSTDv06_isError(cBlockSize)) return cBlockSize;
3675 
3676         ip += ZSTDv06_blockHeaderSize;
3677         remainingSize -= ZSTDv06_blockHeaderSize;
3678         if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3679 
3680         if (cBlockSize == 0) break;   /* bt_end */
3681 
3682         ip += cBlockSize;
3683         remainingSize -= cBlockSize;
3684     }
3685 
3686     return ip - (const BYTE*)src;
3687 }
3688 
3689 /*_******************************
3690 *  Streaming Decompression API
3691 ********************************/
3692 size_t ZSTDv06_nextSrcSizeToDecompress(ZSTDv06_DCtx* dctx)
3693 {
3694     return dctx->expected;
3695 }
3696 
3697 size_t ZSTDv06_decompressContinue(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
3698 {
3699     /* Sanity check */
3700     if (srcSize != dctx->expected) return ERROR(srcSize_wrong);
3701     if (dstCapacity) ZSTDv06_checkContinuity(dctx, dst);
3702 
3703     /* Decompress : frame header; part 1 */
3704     switch (dctx->stage)
3705     {
3706     case ZSTDds_getFrameHeaderSize :
3707         if (srcSize != ZSTDv06_frameHeaderSize_min) return ERROR(srcSize_wrong);   /* impossible */
3708         dctx->headerSize = ZSTDv06_frameHeaderSize(src, ZSTDv06_frameHeaderSize_min);
3709         if (ZSTDv06_isError(dctx->headerSize)) return dctx->headerSize;
3710         memcpy(dctx->headerBuffer, src, ZSTDv06_frameHeaderSize_min);
3711         if (dctx->headerSize > ZSTDv06_frameHeaderSize_min) {
3712             dctx->expected = dctx->headerSize - ZSTDv06_frameHeaderSize_min;
3713             dctx->stage = ZSTDds_decodeFrameHeader;
3714             return 0;
3715         }
3716         dctx->expected = 0;   /* not necessary to copy more */
3717 	/* fall-through */
3718     case ZSTDds_decodeFrameHeader:
3719         {   size_t result;
3720             memcpy(dctx->headerBuffer + ZSTDv06_frameHeaderSize_min, src, dctx->expected);
3721             result = ZSTDv06_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize);
3722             if (ZSTDv06_isError(result)) return result;
3723             dctx->expected = ZSTDv06_blockHeaderSize;
3724             dctx->stage = ZSTDds_decodeBlockHeader;
3725             return 0;
3726         }
3727     case ZSTDds_decodeBlockHeader:
3728         {   blockProperties_t bp;
3729             size_t const cBlockSize = ZSTDv06_getcBlockSize(src, ZSTDv06_blockHeaderSize, &bp);
3730             if (ZSTDv06_isError(cBlockSize)) return cBlockSize;
3731             if (bp.blockType == bt_end) {
3732                 dctx->expected = 0;
3733                 dctx->stage = ZSTDds_getFrameHeaderSize;
3734             } else {
3735                 dctx->expected = cBlockSize;
3736                 dctx->bType = bp.blockType;
3737                 dctx->stage = ZSTDds_decompressBlock;
3738             }
3739             return 0;
3740         }
3741     case ZSTDds_decompressBlock:
3742         {   size_t rSize;
3743             switch(dctx->bType)
3744             {
3745             case bt_compressed:
3746                 rSize = ZSTDv06_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize);
3747                 break;
3748             case bt_raw :
3749                 rSize = ZSTDv06_copyRawBlock(dst, dstCapacity, src, srcSize);
3750                 break;
3751             case bt_rle :
3752                 return ERROR(GENERIC);   /* not yet handled */
3753                 break;
3754             case bt_end :   /* should never happen (filtered at phase 1) */
3755                 rSize = 0;
3756                 break;
3757             default:
3758                 return ERROR(GENERIC);   /* impossible */
3759             }
3760             dctx->stage = ZSTDds_decodeBlockHeader;
3761             dctx->expected = ZSTDv06_blockHeaderSize;
3762             dctx->previousDstEnd = (char*)dst + rSize;
3763             return rSize;
3764         }
3765     default:
3766         return ERROR(GENERIC);   /* impossible */
3767     }
3768 }
3769 
3770 
3771 static void ZSTDv06_refDictContent(ZSTDv06_DCtx* dctx, const void* dict, size_t dictSize)
3772 {
3773     dctx->dictEnd = dctx->previousDstEnd;
3774     dctx->vBase = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
3775     dctx->base = dict;
3776     dctx->previousDstEnd = (const char*)dict + dictSize;
3777 }
3778 
3779 static size_t ZSTDv06_loadEntropy(ZSTDv06_DCtx* dctx, const void* dict, size_t dictSize)
3780 {
3781     size_t hSize, offcodeHeaderSize, matchlengthHeaderSize, litlengthHeaderSize;
3782 
3783     hSize = HUFv06_readDTableX4(dctx->hufTableX4, dict, dictSize);
3784     if (HUFv06_isError(hSize)) return ERROR(dictionary_corrupted);
3785     dict = (const char*)dict + hSize;
3786     dictSize -= hSize;
3787 
3788     {   short offcodeNCount[MaxOff+1];
3789         U32 offcodeMaxValue=MaxOff, offcodeLog;
3790         offcodeHeaderSize = FSEv06_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dict, dictSize);
3791         if (FSEv06_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
3792         if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
3793         { size_t const errorCode = FSEv06_buildDTable(dctx->OffTable, offcodeNCount, offcodeMaxValue, offcodeLog);
3794           if (FSEv06_isError(errorCode)) return ERROR(dictionary_corrupted); }
3795         dict = (const char*)dict + offcodeHeaderSize;
3796         dictSize -= offcodeHeaderSize;
3797     }
3798 
3799     {   short matchlengthNCount[MaxML+1];
3800         unsigned matchlengthMaxValue = MaxML, matchlengthLog;
3801         matchlengthHeaderSize = FSEv06_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dict, dictSize);
3802         if (FSEv06_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
3803         if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
3804         { size_t const errorCode = FSEv06_buildDTable(dctx->MLTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog);
3805           if (FSEv06_isError(errorCode)) return ERROR(dictionary_corrupted); }
3806         dict = (const char*)dict + matchlengthHeaderSize;
3807         dictSize -= matchlengthHeaderSize;
3808     }
3809 
3810     {   short litlengthNCount[MaxLL+1];
3811         unsigned litlengthMaxValue = MaxLL, litlengthLog;
3812         litlengthHeaderSize = FSEv06_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dict, dictSize);
3813         if (FSEv06_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
3814         if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
3815         { size_t const errorCode = FSEv06_buildDTable(dctx->LLTable, litlengthNCount, litlengthMaxValue, litlengthLog);
3816           if (FSEv06_isError(errorCode)) return ERROR(dictionary_corrupted); }
3817     }
3818 
3819     dctx->flagRepeatTable = 1;
3820     return hSize + offcodeHeaderSize + matchlengthHeaderSize + litlengthHeaderSize;
3821 }
3822 
3823 static size_t ZSTDv06_decompress_insertDictionary(ZSTDv06_DCtx* dctx, const void* dict, size_t dictSize)
3824 {
3825     size_t eSize;
3826     U32 const magic = MEM_readLE32(dict);
3827     if (magic != ZSTDv06_DICT_MAGIC) {
3828         /* pure content mode */
3829         ZSTDv06_refDictContent(dctx, dict, dictSize);
3830         return 0;
3831     }
3832     /* load entropy tables */
3833     dict = (const char*)dict + 4;
3834     dictSize -= 4;
3835     eSize = ZSTDv06_loadEntropy(dctx, dict, dictSize);
3836     if (ZSTDv06_isError(eSize)) return ERROR(dictionary_corrupted);
3837 
3838     /* reference dictionary content */
3839     dict = (const char*)dict + eSize;
3840     dictSize -= eSize;
3841     ZSTDv06_refDictContent(dctx, dict, dictSize);
3842 
3843     return 0;
3844 }
3845 
3846 
3847 size_t ZSTDv06_decompressBegin_usingDict(ZSTDv06_DCtx* dctx, const void* dict, size_t dictSize)
3848 {
3849     { size_t const errorCode = ZSTDv06_decompressBegin(dctx);
3850       if (ZSTDv06_isError(errorCode)) return errorCode; }
3851 
3852     if (dict && dictSize) {
3853         size_t const errorCode = ZSTDv06_decompress_insertDictionary(dctx, dict, dictSize);
3854         if (ZSTDv06_isError(errorCode)) return ERROR(dictionary_corrupted);
3855     }
3856 
3857     return 0;
3858 }
3859 
3860 /*
3861     Buffered version of Zstd compression library
3862     Copyright (C) 2015-2016, Yann Collet.
3863 
3864     BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
3865 
3866     Redistribution and use in source and binary forms, with or without
3867     modification, are permitted provided that the following conditions are
3868     met:
3869     * Redistributions of source code must retain the above copyright
3870     notice, this list of conditions and the following disclaimer.
3871     * Redistributions in binary form must reproduce the above
3872     copyright notice, this list of conditions and the following disclaimer
3873     in the documentation and/or other materials provided with the
3874     distribution.
3875     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3876     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3877     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3878     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3879     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3880     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3881     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3882     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3883     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3884     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3885     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3886 
3887     You can contact the author at :
3888     - zstd homepage : http://www.zstd.net/
3889 */
3890 
3891 
3892 /*-***************************************************************************
3893 *  Streaming decompression howto
3894 *
3895 *  A ZBUFFv06_DCtx object is required to track streaming operations.
3896 *  Use ZBUFFv06_createDCtx() and ZBUFFv06_freeDCtx() to create/release resources.
3897 *  Use ZBUFFv06_decompressInit() to start a new decompression operation,
3898 *   or ZBUFFv06_decompressInitDictionary() if decompression requires a dictionary.
3899 *  Note that ZBUFFv06_DCtx objects can be re-init multiple times.
3900 *
3901 *  Use ZBUFFv06_decompressContinue() repetitively to consume your input.
3902 *  *srcSizePtr and *dstCapacityPtr can be any size.
3903 *  The function will report how many bytes were read or written by modifying *srcSizePtr and *dstCapacityPtr.
3904 *  Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again.
3905 *  The content of @dst will be overwritten (up to *dstCapacityPtr) at each function call, so save its content if it matters, or change @dst.
3906 *  @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to help latency),
3907 *            or 0 when a frame is completely decoded,
3908 *            or an error code, which can be tested using ZBUFFv06_isError().
3909 *
3910 *  Hint : recommended buffer sizes (not compulsory) : ZBUFFv06_recommendedDInSize() and ZBUFFv06_recommendedDOutSize()
3911 *  output : ZBUFFv06_recommendedDOutSize==128 KB block size is the internal unit, it ensures it's always possible to write a full block when decoded.
3912 *  input  : ZBUFFv06_recommendedDInSize == 128KB + 3;
3913 *           just follow indications from ZBUFFv06_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 .
3914 * *******************************************************************************/
3915 
3916 typedef enum { ZBUFFds_init, ZBUFFds_loadHeader,
3917                ZBUFFds_read, ZBUFFds_load, ZBUFFds_flush } ZBUFFv06_dStage;
3918 
3919 /* *** Resource management *** */
3920 struct ZBUFFv06_DCtx_s {
3921     ZSTDv06_DCtx* zd;
3922     ZSTDv06_frameParams fParams;
3923     ZBUFFv06_dStage stage;
3924     char*  inBuff;
3925     size_t inBuffSize;
3926     size_t inPos;
3927     char*  outBuff;
3928     size_t outBuffSize;
3929     size_t outStart;
3930     size_t outEnd;
3931     size_t blockSize;
3932     BYTE headerBuffer[ZSTDv06_FRAMEHEADERSIZE_MAX];
3933     size_t lhSize;
3934 };   /* typedef'd to ZBUFFv06_DCtx within "zstd_buffered.h" */
3935 
3936 
3937 ZBUFFv06_DCtx* ZBUFFv06_createDCtx(void)
3938 {
3939     ZBUFFv06_DCtx* zbd = (ZBUFFv06_DCtx*)malloc(sizeof(ZBUFFv06_DCtx));
3940     if (zbd==NULL) return NULL;
3941     memset(zbd, 0, sizeof(*zbd));
3942     zbd->zd = ZSTDv06_createDCtx();
3943     zbd->stage = ZBUFFds_init;
3944     return zbd;
3945 }
3946 
3947 size_t ZBUFFv06_freeDCtx(ZBUFFv06_DCtx* zbd)
3948 {
3949     if (zbd==NULL) return 0;   /* support free on null */
3950     ZSTDv06_freeDCtx(zbd->zd);
3951     free(zbd->inBuff);
3952     free(zbd->outBuff);
3953     free(zbd);
3954     return 0;
3955 }
3956 
3957 
3958 /* *** Initialization *** */
3959 
3960 size_t ZBUFFv06_decompressInitDictionary(ZBUFFv06_DCtx* zbd, const void* dict, size_t dictSize)
3961 {
3962     zbd->stage = ZBUFFds_loadHeader;
3963     zbd->lhSize = zbd->inPos = zbd->outStart = zbd->outEnd = 0;
3964     return ZSTDv06_decompressBegin_usingDict(zbd->zd, dict, dictSize);
3965 }
3966 
3967 size_t ZBUFFv06_decompressInit(ZBUFFv06_DCtx* zbd)
3968 {
3969     return ZBUFFv06_decompressInitDictionary(zbd, NULL, 0);
3970 }
3971 
3972 
3973 
3974 MEM_STATIC size_t ZBUFFv06_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
3975 {
3976     size_t length = MIN(dstCapacity, srcSize);
3977     memcpy(dst, src, length);
3978     return length;
3979 }
3980 
3981 
3982 /* *** Decompression *** */
3983 
3984 size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
3985                                 void* dst, size_t* dstCapacityPtr,
3986                           const void* src, size_t* srcSizePtr)
3987 {
3988     const char* const istart = (const char*)src;
3989     const char* const iend = istart + *srcSizePtr;
3990     const char* ip = istart;
3991     char* const ostart = (char*)dst;
3992     char* const oend = ostart + *dstCapacityPtr;
3993     char* op = ostart;
3994     U32 notDone = 1;
3995 
3996     while (notDone) {
3997         switch(zbd->stage)
3998         {
3999         case ZBUFFds_init :
4000             return ERROR(init_missing);
4001 
4002         case ZBUFFds_loadHeader :
4003             {   size_t const hSize = ZSTDv06_getFrameParams(&(zbd->fParams), zbd->headerBuffer, zbd->lhSize);
4004                 if (hSize != 0) {
4005                     size_t const toLoad = hSize - zbd->lhSize;   /* if hSize!=0, hSize > zbd->lhSize */
4006                     if (ZSTDv06_isError(hSize)) return hSize;
4007                     if (toLoad > (size_t)(iend-ip)) {   /* not enough input to load full header */
4008                         memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);
4009                         zbd->lhSize += iend-ip; ip = iend; notDone = 0;
4010                         *dstCapacityPtr = 0;
4011                         return (hSize - zbd->lhSize) + ZSTDv06_blockHeaderSize;   /* remaining header bytes + next block header */
4012                     }
4013                     memcpy(zbd->headerBuffer + zbd->lhSize, ip, toLoad); zbd->lhSize = hSize; ip += toLoad;
4014                     break;
4015             }   }
4016 
4017             /* Consume header */
4018             {   size_t const h1Size = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);  /* == ZSTDv06_frameHeaderSize_min */
4019                 size_t const h1Result = ZSTDv06_decompressContinue(zbd->zd, NULL, 0, zbd->headerBuffer, h1Size);
4020                 if (ZSTDv06_isError(h1Result)) return h1Result;
4021                 if (h1Size < zbd->lhSize) {   /* long header */
4022                     size_t const h2Size = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
4023                     size_t const h2Result = ZSTDv06_decompressContinue(zbd->zd, NULL, 0, zbd->headerBuffer+h1Size, h2Size);
4024                     if (ZSTDv06_isError(h2Result)) return h2Result;
4025             }   }
4026 
4027             /* Frame header instruct buffer sizes */
4028             {   size_t const blockSize = MIN(1 << zbd->fParams.windowLog, ZSTDv06_BLOCKSIZE_MAX);
4029                 zbd->blockSize = blockSize;
4030                 if (zbd->inBuffSize < blockSize) {
4031                     free(zbd->inBuff);
4032                     zbd->inBuffSize = blockSize;
4033                     zbd->inBuff = (char*)malloc(blockSize);
4034                     if (zbd->inBuff == NULL) return ERROR(memory_allocation);
4035                 }
4036                 {   size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize + WILDCOPY_OVERLENGTH * 2;
4037                     if (zbd->outBuffSize < neededOutSize) {
4038                         free(zbd->outBuff);
4039                         zbd->outBuffSize = neededOutSize;
4040                         zbd->outBuff = (char*)malloc(neededOutSize);
4041                         if (zbd->outBuff == NULL) return ERROR(memory_allocation);
4042             }   }   }
4043             zbd->stage = ZBUFFds_read;
4044 	    /* fall-through */
4045         case ZBUFFds_read:
4046             {   size_t const neededInSize = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
4047                 if (neededInSize==0) {  /* end of frame */
4048                     zbd->stage = ZBUFFds_init;
4049                     notDone = 0;
4050                     break;
4051                 }
4052                 if ((size_t)(iend-ip) >= neededInSize) {  /* decode directly from src */
4053                     size_t const decodedSize = ZSTDv06_decompressContinue(zbd->zd,
4054                         zbd->outBuff + zbd->outStart, zbd->outBuffSize - zbd->outStart,
4055                         ip, neededInSize);
4056                     if (ZSTDv06_isError(decodedSize)) return decodedSize;
4057                     ip += neededInSize;
4058                     if (!decodedSize) break;   /* this was just a header */
4059                     zbd->outEnd = zbd->outStart +  decodedSize;
4060                     zbd->stage = ZBUFFds_flush;
4061                     break;
4062                 }
4063                 if (ip==iend) { notDone = 0; break; }   /* no more input */
4064                 zbd->stage = ZBUFFds_load;
4065             }
4066 	    /* fall-through */
4067         case ZBUFFds_load:
4068             {   size_t const neededInSize = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
4069                 size_t const toLoad = neededInSize - zbd->inPos;   /* should always be <= remaining space within inBuff */
4070                 size_t loadedSize;
4071                 if (toLoad > zbd->inBuffSize - zbd->inPos) return ERROR(corruption_detected);   /* should never happen */
4072                 loadedSize = ZBUFFv06_limitCopy(zbd->inBuff + zbd->inPos, toLoad, ip, iend-ip);
4073                 ip += loadedSize;
4074                 zbd->inPos += loadedSize;
4075                 if (loadedSize < toLoad) { notDone = 0; break; }   /* not enough input, wait for more */
4076 
4077                 /* decode loaded input */
4078                 {   size_t const decodedSize = ZSTDv06_decompressContinue(zbd->zd,
4079                         zbd->outBuff + zbd->outStart, zbd->outBuffSize - zbd->outStart,
4080                         zbd->inBuff, neededInSize);
4081                     if (ZSTDv06_isError(decodedSize)) return decodedSize;
4082                     zbd->inPos = 0;   /* input is consumed */
4083                     if (!decodedSize) { zbd->stage = ZBUFFds_read; break; }   /* this was just a header */
4084                     zbd->outEnd = zbd->outStart +  decodedSize;
4085                     zbd->stage = ZBUFFds_flush;
4086                     // break; /* ZBUFFds_flush follows */
4087                 }
4088 	    }
4089 	    /* fall-through */
4090         case ZBUFFds_flush:
4091             {   size_t const toFlushSize = zbd->outEnd - zbd->outStart;
4092                 size_t const flushedSize = ZBUFFv06_limitCopy(op, oend-op, zbd->outBuff + zbd->outStart, toFlushSize);
4093                 op += flushedSize;
4094                 zbd->outStart += flushedSize;
4095                 if (flushedSize == toFlushSize) {
4096                     zbd->stage = ZBUFFds_read;
4097                     if (zbd->outStart + zbd->blockSize > zbd->outBuffSize)
4098                         zbd->outStart = zbd->outEnd = 0;
4099                     break;
4100                 }
4101                 /* cannot flush everything */
4102                 notDone = 0;
4103                 break;
4104             }
4105         default: return ERROR(GENERIC);   /* impossible */
4106     }   }
4107 
4108     /* result */
4109     *srcSizePtr = ip-istart;
4110     *dstCapacityPtr = op-ostart;
4111     {   size_t nextSrcSizeHint = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
4112         if (nextSrcSizeHint > ZSTDv06_blockHeaderSize) nextSrcSizeHint+= ZSTDv06_blockHeaderSize;   /* get following block header too */
4113         nextSrcSizeHint -= zbd->inPos;   /* already loaded*/
4114         return nextSrcSizeHint;
4115     }
4116 }
4117 
4118 
4119 
4120 /* *************************************
4121 *  Tool functions
4122 ***************************************/
4123 size_t ZBUFFv06_recommendedDInSize(void)  { return ZSTDv06_BLOCKSIZE_MAX + ZSTDv06_blockHeaderSize /* block header size*/ ; }
4124 size_t ZBUFFv06_recommendedDOutSize(void) { return ZSTDv06_BLOCKSIZE_MAX; }
4125