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