The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/zstd/lib/legacy/zstd_v04.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 87ce93d0448a115039e6c427ea195819


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.