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

Cache object: eb9bc03ca22d86a6d9f609fe12d0e3f9


[ 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.