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