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