contrib/python-zstandard/zstd/decompress/zstd_decompress_block.c
changeset 42070 675775c33ab6
child 42941 69de49c4e39c
equal deleted inserted replaced
42069:668eff08387f 42070:675775c33ab6
       
     1 /*
       
     2  * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
       
     3  * All rights reserved.
       
     4  *
       
     5  * This source code is licensed under both the BSD-style license (found in the
       
     6  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
       
     7  * in the COPYING file in the root directory of this source tree).
       
     8  * You may select, at your option, one of the above-listed licenses.
       
     9  */
       
    10 
       
    11 /* zstd_decompress_block :
       
    12  * this module takes care of decompressing _compressed_ block */
       
    13 
       
    14 /*-*******************************************************
       
    15 *  Dependencies
       
    16 *********************************************************/
       
    17 #include <string.h>      /* memcpy, memmove, memset */
       
    18 #include "compiler.h"    /* prefetch */
       
    19 #include "cpu.h"         /* bmi2 */
       
    20 #include "mem.h"         /* low level memory routines */
       
    21 #define FSE_STATIC_LINKING_ONLY
       
    22 #include "fse.h"
       
    23 #define HUF_STATIC_LINKING_ONLY
       
    24 #include "huf.h"
       
    25 #include "zstd_internal.h"
       
    26 #include "zstd_decompress_internal.h"   /* ZSTD_DCtx */
       
    27 #include "zstd_ddict.h"  /* ZSTD_DDictDictContent */
       
    28 #include "zstd_decompress_block.h"
       
    29 
       
    30 /*_*******************************************************
       
    31 *  Macros
       
    32 **********************************************************/
       
    33 
       
    34 /* These two optional macros force the use one way or another of the two
       
    35  * ZSTD_decompressSequences implementations. You can't force in both directions
       
    36  * at the same time.
       
    37  */
       
    38 #if defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
       
    39     defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
       
    40 #error "Cannot force the use of the short and the long ZSTD_decompressSequences variants!"
       
    41 #endif
       
    42 
       
    43 
       
    44 /*_*******************************************************
       
    45 *  Memory operations
       
    46 **********************************************************/
       
    47 static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
       
    48 
       
    49 
       
    50 /*-*************************************************************
       
    51  *   Block decoding
       
    52  ***************************************************************/
       
    53 
       
    54 /*! ZSTD_getcBlockSize() :
       
    55  *  Provides the size of compressed block from block header `src` */
       
    56 size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
       
    57                           blockProperties_t* bpPtr)
       
    58 {
       
    59     if (srcSize < ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
       
    60     {   U32 const cBlockHeader = MEM_readLE24(src);
       
    61         U32 const cSize = cBlockHeader >> 3;
       
    62         bpPtr->lastBlock = cBlockHeader & 1;
       
    63         bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
       
    64         bpPtr->origSize = cSize;   /* only useful for RLE */
       
    65         if (bpPtr->blockType == bt_rle) return 1;
       
    66         if (bpPtr->blockType == bt_reserved) return ERROR(corruption_detected);
       
    67         return cSize;
       
    68     }
       
    69 }
       
    70 
       
    71 
       
    72 /* Hidden declaration for fullbench */
       
    73 size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
       
    74                           const void* src, size_t srcSize);
       
    75 /*! ZSTD_decodeLiteralsBlock() :
       
    76  * @return : nb of bytes read from src (< srcSize )
       
    77  *  note : symbol not declared but exposed for fullbench */
       
    78 size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
       
    79                           const void* src, size_t srcSize)   /* note : srcSize < BLOCKSIZE */
       
    80 {
       
    81     if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
       
    82 
       
    83     {   const BYTE* const istart = (const BYTE*) src;
       
    84         symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
       
    85 
       
    86         switch(litEncType)
       
    87         {
       
    88         case set_repeat:
       
    89             if (dctx->litEntropy==0) return ERROR(dictionary_corrupted);
       
    90             /* fall-through */
       
    91 
       
    92         case set_compressed:
       
    93             if (srcSize < 5) return ERROR(corruption_detected);   /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
       
    94             {   size_t lhSize, litSize, litCSize;
       
    95                 U32 singleStream=0;
       
    96                 U32 const lhlCode = (istart[0] >> 2) & 3;
       
    97                 U32 const lhc = MEM_readLE32(istart);
       
    98                 size_t hufSuccess;
       
    99                 switch(lhlCode)
       
   100                 {
       
   101                 case 0: case 1: default:   /* note : default is impossible, since lhlCode into [0..3] */
       
   102                     /* 2 - 2 - 10 - 10 */
       
   103                     singleStream = !lhlCode;
       
   104                     lhSize = 3;
       
   105                     litSize  = (lhc >> 4) & 0x3FF;
       
   106                     litCSize = (lhc >> 14) & 0x3FF;
       
   107                     break;
       
   108                 case 2:
       
   109                     /* 2 - 2 - 14 - 14 */
       
   110                     lhSize = 4;
       
   111                     litSize  = (lhc >> 4) & 0x3FFF;
       
   112                     litCSize = lhc >> 18;
       
   113                     break;
       
   114                 case 3:
       
   115                     /* 2 - 2 - 18 - 18 */
       
   116                     lhSize = 5;
       
   117                     litSize  = (lhc >> 4) & 0x3FFFF;
       
   118                     litCSize = (lhc >> 22) + (istart[4] << 10);
       
   119                     break;
       
   120                 }
       
   121                 if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
       
   122                 if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
       
   123 
       
   124                 /* prefetch huffman table if cold */
       
   125                 if (dctx->ddictIsCold && (litSize > 768 /* heuristic */)) {
       
   126                     PREFETCH_AREA(dctx->HUFptr, sizeof(dctx->entropy.hufTable));
       
   127                 }
       
   128 
       
   129                 if (litEncType==set_repeat) {
       
   130                     if (singleStream) {
       
   131                         hufSuccess = HUF_decompress1X_usingDTable_bmi2(
       
   132                             dctx->litBuffer, litSize, istart+lhSize, litCSize,
       
   133                             dctx->HUFptr, dctx->bmi2);
       
   134                     } else {
       
   135                         hufSuccess = HUF_decompress4X_usingDTable_bmi2(
       
   136                             dctx->litBuffer, litSize, istart+lhSize, litCSize,
       
   137                             dctx->HUFptr, dctx->bmi2);
       
   138                     }
       
   139                 } else {
       
   140                     if (singleStream) {
       
   141 #if defined(HUF_FORCE_DECOMPRESS_X2)
       
   142                         hufSuccess = HUF_decompress1X_DCtx_wksp(
       
   143                             dctx->entropy.hufTable, dctx->litBuffer, litSize,
       
   144                             istart+lhSize, litCSize, dctx->workspace,
       
   145                             sizeof(dctx->workspace));
       
   146 #else
       
   147                         hufSuccess = HUF_decompress1X1_DCtx_wksp_bmi2(
       
   148                             dctx->entropy.hufTable, dctx->litBuffer, litSize,
       
   149                             istart+lhSize, litCSize, dctx->workspace,
       
   150                             sizeof(dctx->workspace), dctx->bmi2);
       
   151 #endif
       
   152                     } else {
       
   153                         hufSuccess = HUF_decompress4X_hufOnly_wksp_bmi2(
       
   154                             dctx->entropy.hufTable, dctx->litBuffer, litSize,
       
   155                             istart+lhSize, litCSize, dctx->workspace,
       
   156                             sizeof(dctx->workspace), dctx->bmi2);
       
   157                     }
       
   158                 }
       
   159 
       
   160                 if (HUF_isError(hufSuccess)) return ERROR(corruption_detected);
       
   161 
       
   162                 dctx->litPtr = dctx->litBuffer;
       
   163                 dctx->litSize = litSize;
       
   164                 dctx->litEntropy = 1;
       
   165                 if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
       
   166                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
       
   167                 return litCSize + lhSize;
       
   168             }
       
   169 
       
   170         case set_basic:
       
   171             {   size_t litSize, lhSize;
       
   172                 U32 const lhlCode = ((istart[0]) >> 2) & 3;
       
   173                 switch(lhlCode)
       
   174                 {
       
   175                 case 0: case 2: default:   /* note : default is impossible, since lhlCode into [0..3] */
       
   176                     lhSize = 1;
       
   177                     litSize = istart[0] >> 3;
       
   178                     break;
       
   179                 case 1:
       
   180                     lhSize = 2;
       
   181                     litSize = MEM_readLE16(istart) >> 4;
       
   182                     break;
       
   183                 case 3:
       
   184                     lhSize = 3;
       
   185                     litSize = MEM_readLE24(istart) >> 4;
       
   186                     break;
       
   187                 }
       
   188 
       
   189                 if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) {  /* risk reading beyond src buffer with wildcopy */
       
   190                     if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
       
   191                     memcpy(dctx->litBuffer, istart+lhSize, litSize);
       
   192                     dctx->litPtr = dctx->litBuffer;
       
   193                     dctx->litSize = litSize;
       
   194                     memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
       
   195                     return lhSize+litSize;
       
   196                 }
       
   197                 /* direct reference into compressed stream */
       
   198                 dctx->litPtr = istart+lhSize;
       
   199                 dctx->litSize = litSize;
       
   200                 return lhSize+litSize;
       
   201             }
       
   202 
       
   203         case set_rle:
       
   204             {   U32 const lhlCode = ((istart[0]) >> 2) & 3;
       
   205                 size_t litSize, lhSize;
       
   206                 switch(lhlCode)
       
   207                 {
       
   208                 case 0: case 2: default:   /* note : default is impossible, since lhlCode into [0..3] */
       
   209                     lhSize = 1;
       
   210                     litSize = istart[0] >> 3;
       
   211                     break;
       
   212                 case 1:
       
   213                     lhSize = 2;
       
   214                     litSize = MEM_readLE16(istart) >> 4;
       
   215                     break;
       
   216                 case 3:
       
   217                     lhSize = 3;
       
   218                     litSize = MEM_readLE24(istart) >> 4;
       
   219                     if (srcSize<4) return ERROR(corruption_detected);   /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
       
   220                     break;
       
   221                 }
       
   222                 if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
       
   223                 memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
       
   224                 dctx->litPtr = dctx->litBuffer;
       
   225                 dctx->litSize = litSize;
       
   226                 return lhSize+1;
       
   227             }
       
   228         default:
       
   229             return ERROR(corruption_detected);   /* impossible */
       
   230         }
       
   231     }
       
   232 }
       
   233 
       
   234 /* Default FSE distribution tables.
       
   235  * These are pre-calculated FSE decoding tables using default distributions as defined in specification :
       
   236  * https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#default-distributions
       
   237  * They were generated programmatically with following method :
       
   238  * - start from default distributions, present in /lib/common/zstd_internal.h
       
   239  * - generate tables normally, using ZSTD_buildFSETable()
       
   240  * - printout the content of tables
       
   241  * - pretify output, report below, test with fuzzer to ensure it's correct */
       
   242 
       
   243 /* Default FSE distribution table for Literal Lengths */
       
   244 static const ZSTD_seqSymbol LL_defaultDTable[(1<<LL_DEFAULTNORMLOG)+1] = {
       
   245      {  1,  1,  1, LL_DEFAULTNORMLOG},  /* header : fastMode, tableLog */
       
   246      /* nextState, nbAddBits, nbBits, baseVal */
       
   247      {  0,  0,  4,    0},  { 16,  0,  4,    0},
       
   248      { 32,  0,  5,    1},  {  0,  0,  5,    3},
       
   249      {  0,  0,  5,    4},  {  0,  0,  5,    6},
       
   250      {  0,  0,  5,    7},  {  0,  0,  5,    9},
       
   251      {  0,  0,  5,   10},  {  0,  0,  5,   12},
       
   252      {  0,  0,  6,   14},  {  0,  1,  5,   16},
       
   253      {  0,  1,  5,   20},  {  0,  1,  5,   22},
       
   254      {  0,  2,  5,   28},  {  0,  3,  5,   32},
       
   255      {  0,  4,  5,   48},  { 32,  6,  5,   64},
       
   256      {  0,  7,  5,  128},  {  0,  8,  6,  256},
       
   257      {  0, 10,  6, 1024},  {  0, 12,  6, 4096},
       
   258      { 32,  0,  4,    0},  {  0,  0,  4,    1},
       
   259      {  0,  0,  5,    2},  { 32,  0,  5,    4},
       
   260      {  0,  0,  5,    5},  { 32,  0,  5,    7},
       
   261      {  0,  0,  5,    8},  { 32,  0,  5,   10},
       
   262      {  0,  0,  5,   11},  {  0,  0,  6,   13},
       
   263      { 32,  1,  5,   16},  {  0,  1,  5,   18},
       
   264      { 32,  1,  5,   22},  {  0,  2,  5,   24},
       
   265      { 32,  3,  5,   32},  {  0,  3,  5,   40},
       
   266      {  0,  6,  4,   64},  { 16,  6,  4,   64},
       
   267      { 32,  7,  5,  128},  {  0,  9,  6,  512},
       
   268      {  0, 11,  6, 2048},  { 48,  0,  4,    0},
       
   269      { 16,  0,  4,    1},  { 32,  0,  5,    2},
       
   270      { 32,  0,  5,    3},  { 32,  0,  5,    5},
       
   271      { 32,  0,  5,    6},  { 32,  0,  5,    8},
       
   272      { 32,  0,  5,    9},  { 32,  0,  5,   11},
       
   273      { 32,  0,  5,   12},  {  0,  0,  6,   15},
       
   274      { 32,  1,  5,   18},  { 32,  1,  5,   20},
       
   275      { 32,  2,  5,   24},  { 32,  2,  5,   28},
       
   276      { 32,  3,  5,   40},  { 32,  4,  5,   48},
       
   277      {  0, 16,  6,65536},  {  0, 15,  6,32768},
       
   278      {  0, 14,  6,16384},  {  0, 13,  6, 8192},
       
   279 };   /* LL_defaultDTable */
       
   280 
       
   281 /* Default FSE distribution table for Offset Codes */
       
   282 static const ZSTD_seqSymbol OF_defaultDTable[(1<<OF_DEFAULTNORMLOG)+1] = {
       
   283     {  1,  1,  1, OF_DEFAULTNORMLOG},  /* header : fastMode, tableLog */
       
   284     /* nextState, nbAddBits, nbBits, baseVal */
       
   285     {  0,  0,  5,    0},     {  0,  6,  4,   61},
       
   286     {  0,  9,  5,  509},     {  0, 15,  5,32765},
       
   287     {  0, 21,  5,2097149},   {  0,  3,  5,    5},
       
   288     {  0,  7,  4,  125},     {  0, 12,  5, 4093},
       
   289     {  0, 18,  5,262141},    {  0, 23,  5,8388605},
       
   290     {  0,  5,  5,   29},     {  0,  8,  4,  253},
       
   291     {  0, 14,  5,16381},     {  0, 20,  5,1048573},
       
   292     {  0,  2,  5,    1},     { 16,  7,  4,  125},
       
   293     {  0, 11,  5, 2045},     {  0, 17,  5,131069},
       
   294     {  0, 22,  5,4194301},   {  0,  4,  5,   13},
       
   295     { 16,  8,  4,  253},     {  0, 13,  5, 8189},
       
   296     {  0, 19,  5,524285},    {  0,  1,  5,    1},
       
   297     { 16,  6,  4,   61},     {  0, 10,  5, 1021},
       
   298     {  0, 16,  5,65533},     {  0, 28,  5,268435453},
       
   299     {  0, 27,  5,134217725}, {  0, 26,  5,67108861},
       
   300     {  0, 25,  5,33554429},  {  0, 24,  5,16777213},
       
   301 };   /* OF_defaultDTable */
       
   302 
       
   303 
       
   304 /* Default FSE distribution table for Match Lengths */
       
   305 static const ZSTD_seqSymbol ML_defaultDTable[(1<<ML_DEFAULTNORMLOG)+1] = {
       
   306     {  1,  1,  1, ML_DEFAULTNORMLOG},  /* header : fastMode, tableLog */
       
   307     /* nextState, nbAddBits, nbBits, baseVal */
       
   308     {  0,  0,  6,    3},  {  0,  0,  4,    4},
       
   309     { 32,  0,  5,    5},  {  0,  0,  5,    6},
       
   310     {  0,  0,  5,    8},  {  0,  0,  5,    9},
       
   311     {  0,  0,  5,   11},  {  0,  0,  6,   13},
       
   312     {  0,  0,  6,   16},  {  0,  0,  6,   19},
       
   313     {  0,  0,  6,   22},  {  0,  0,  6,   25},
       
   314     {  0,  0,  6,   28},  {  0,  0,  6,   31},
       
   315     {  0,  0,  6,   34},  {  0,  1,  6,   37},
       
   316     {  0,  1,  6,   41},  {  0,  2,  6,   47},
       
   317     {  0,  3,  6,   59},  {  0,  4,  6,   83},
       
   318     {  0,  7,  6,  131},  {  0,  9,  6,  515},
       
   319     { 16,  0,  4,    4},  {  0,  0,  4,    5},
       
   320     { 32,  0,  5,    6},  {  0,  0,  5,    7},
       
   321     { 32,  0,  5,    9},  {  0,  0,  5,   10},
       
   322     {  0,  0,  6,   12},  {  0,  0,  6,   15},
       
   323     {  0,  0,  6,   18},  {  0,  0,  6,   21},
       
   324     {  0,  0,  6,   24},  {  0,  0,  6,   27},
       
   325     {  0,  0,  6,   30},  {  0,  0,  6,   33},
       
   326     {  0,  1,  6,   35},  {  0,  1,  6,   39},
       
   327     {  0,  2,  6,   43},  {  0,  3,  6,   51},
       
   328     {  0,  4,  6,   67},  {  0,  5,  6,   99},
       
   329     {  0,  8,  6,  259},  { 32,  0,  4,    4},
       
   330     { 48,  0,  4,    4},  { 16,  0,  4,    5},
       
   331     { 32,  0,  5,    7},  { 32,  0,  5,    8},
       
   332     { 32,  0,  5,   10},  { 32,  0,  5,   11},
       
   333     {  0,  0,  6,   14},  {  0,  0,  6,   17},
       
   334     {  0,  0,  6,   20},  {  0,  0,  6,   23},
       
   335     {  0,  0,  6,   26},  {  0,  0,  6,   29},
       
   336     {  0,  0,  6,   32},  {  0, 16,  6,65539},
       
   337     {  0, 15,  6,32771},  {  0, 14,  6,16387},
       
   338     {  0, 13,  6, 8195},  {  0, 12,  6, 4099},
       
   339     {  0, 11,  6, 2051},  {  0, 10,  6, 1027},
       
   340 };   /* ML_defaultDTable */
       
   341 
       
   342 
       
   343 static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddBits)
       
   344 {
       
   345     void* ptr = dt;
       
   346     ZSTD_seqSymbol_header* const DTableH = (ZSTD_seqSymbol_header*)ptr;
       
   347     ZSTD_seqSymbol* const cell = dt + 1;
       
   348 
       
   349     DTableH->tableLog = 0;
       
   350     DTableH->fastMode = 0;
       
   351 
       
   352     cell->nbBits = 0;
       
   353     cell->nextState = 0;
       
   354     assert(nbAddBits < 255);
       
   355     cell->nbAdditionalBits = (BYTE)nbAddBits;
       
   356     cell->baseValue = baseValue;
       
   357 }
       
   358 
       
   359 
       
   360 /* ZSTD_buildFSETable() :
       
   361  * generate FSE decoding table for one symbol (ll, ml or off)
       
   362  * cannot fail if input is valid =>
       
   363  * all inputs are presumed validated at this stage */
       
   364 void
       
   365 ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
       
   366             const short* normalizedCounter, unsigned maxSymbolValue,
       
   367             const U32* baseValue, const U32* nbAdditionalBits,
       
   368             unsigned tableLog)
       
   369 {
       
   370     ZSTD_seqSymbol* const tableDecode = dt+1;
       
   371     U16 symbolNext[MaxSeq+1];
       
   372 
       
   373     U32 const maxSV1 = maxSymbolValue + 1;
       
   374     U32 const tableSize = 1 << tableLog;
       
   375     U32 highThreshold = tableSize-1;
       
   376 
       
   377     /* Sanity Checks */
       
   378     assert(maxSymbolValue <= MaxSeq);
       
   379     assert(tableLog <= MaxFSELog);
       
   380 
       
   381     /* Init, lay down lowprob symbols */
       
   382     {   ZSTD_seqSymbol_header DTableH;
       
   383         DTableH.tableLog = tableLog;
       
   384         DTableH.fastMode = 1;
       
   385         {   S16 const largeLimit= (S16)(1 << (tableLog-1));
       
   386             U32 s;
       
   387             for (s=0; s<maxSV1; s++) {
       
   388                 if (normalizedCounter[s]==-1) {
       
   389                     tableDecode[highThreshold--].baseValue = s;
       
   390                     symbolNext[s] = 1;
       
   391                 } else {
       
   392                     if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
       
   393                     symbolNext[s] = normalizedCounter[s];
       
   394         }   }   }
       
   395         memcpy(dt, &DTableH, sizeof(DTableH));
       
   396     }
       
   397 
       
   398     /* Spread symbols */
       
   399     {   U32 const tableMask = tableSize-1;
       
   400         U32 const step = FSE_TABLESTEP(tableSize);
       
   401         U32 s, position = 0;
       
   402         for (s=0; s<maxSV1; s++) {
       
   403             int i;
       
   404             for (i=0; i<normalizedCounter[s]; i++) {
       
   405                 tableDecode[position].baseValue = s;
       
   406                 position = (position + step) & tableMask;
       
   407                 while (position > highThreshold) position = (position + step) & tableMask;   /* lowprob area */
       
   408         }   }
       
   409         assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
       
   410     }
       
   411 
       
   412     /* Build Decoding table */
       
   413     {   U32 u;
       
   414         for (u=0; u<tableSize; u++) {
       
   415             U32 const symbol = tableDecode[u].baseValue;
       
   416             U32 const nextState = symbolNext[symbol]++;
       
   417             tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) );
       
   418             tableDecode[u].nextState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
       
   419             assert(nbAdditionalBits[symbol] < 255);
       
   420             tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
       
   421             tableDecode[u].baseValue = baseValue[symbol];
       
   422     }   }
       
   423 }
       
   424 
       
   425 
       
   426 /*! ZSTD_buildSeqTable() :
       
   427  * @return : nb bytes read from src,
       
   428  *           or an error code if it fails */
       
   429 static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymbol** DTablePtr,
       
   430                                  symbolEncodingType_e type, unsigned max, U32 maxLog,
       
   431                                  const void* src, size_t srcSize,
       
   432                                  const U32* baseValue, const U32* nbAdditionalBits,
       
   433                                  const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable,
       
   434                                  int ddictIsCold, int nbSeq)
       
   435 {
       
   436     switch(type)
       
   437     {
       
   438     case set_rle :
       
   439         if (!srcSize) return ERROR(srcSize_wrong);
       
   440         if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
       
   441         {   U32 const symbol = *(const BYTE*)src;
       
   442             U32 const baseline = baseValue[symbol];
       
   443             U32 const nbBits = nbAdditionalBits[symbol];
       
   444             ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits);
       
   445         }
       
   446         *DTablePtr = DTableSpace;
       
   447         return 1;
       
   448     case set_basic :
       
   449         *DTablePtr = defaultTable;
       
   450         return 0;
       
   451     case set_repeat:
       
   452         if (!flagRepeatTable) return ERROR(corruption_detected);
       
   453         /* prefetch FSE table if used */
       
   454         if (ddictIsCold && (nbSeq > 24 /* heuristic */)) {
       
   455             const void* const pStart = *DTablePtr;
       
   456             size_t const pSize = sizeof(ZSTD_seqSymbol) * (SEQSYMBOL_TABLE_SIZE(maxLog));
       
   457             PREFETCH_AREA(pStart, pSize);
       
   458         }
       
   459         return 0;
       
   460     case set_compressed :
       
   461         {   unsigned tableLog;
       
   462             S16 norm[MaxSeq+1];
       
   463             size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
       
   464             if (FSE_isError(headerSize)) return ERROR(corruption_detected);
       
   465             if (tableLog > maxLog) return ERROR(corruption_detected);
       
   466             ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
       
   467             *DTablePtr = DTableSpace;
       
   468             return headerSize;
       
   469         }
       
   470     default :   /* impossible */
       
   471         assert(0);
       
   472         return ERROR(GENERIC);
       
   473     }
       
   474 }
       
   475 
       
   476 size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
       
   477                              const void* src, size_t srcSize)
       
   478 {
       
   479     const BYTE* const istart = (const BYTE* const)src;
       
   480     const BYTE* const iend = istart + srcSize;
       
   481     const BYTE* ip = istart;
       
   482     int nbSeq;
       
   483     DEBUGLOG(5, "ZSTD_decodeSeqHeaders");
       
   484 
       
   485     /* check */
       
   486     if (srcSize < MIN_SEQUENCES_SIZE) return ERROR(srcSize_wrong);
       
   487 
       
   488     /* SeqHead */
       
   489     nbSeq = *ip++;
       
   490     if (!nbSeq) {
       
   491         *nbSeqPtr=0;
       
   492         if (srcSize != 1) return ERROR(srcSize_wrong);
       
   493         return 1;
       
   494     }
       
   495     if (nbSeq > 0x7F) {
       
   496         if (nbSeq == 0xFF) {
       
   497             if (ip+2 > iend) return ERROR(srcSize_wrong);
       
   498             nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
       
   499         } else {
       
   500             if (ip >= iend) return ERROR(srcSize_wrong);
       
   501             nbSeq = ((nbSeq-0x80)<<8) + *ip++;
       
   502         }
       
   503     }
       
   504     *nbSeqPtr = nbSeq;
       
   505 
       
   506     /* FSE table descriptors */
       
   507     if (ip+4 > iend) return ERROR(srcSize_wrong); /* minimum possible size */
       
   508     {   symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
       
   509         symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
       
   510         symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
       
   511         ip++;
       
   512 
       
   513         /* Build DTables */
       
   514         {   size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr,
       
   515                                                       LLtype, MaxLL, LLFSELog,
       
   516                                                       ip, iend-ip,
       
   517                                                       LL_base, LL_bits,
       
   518                                                       LL_defaultDTable, dctx->fseEntropy,
       
   519                                                       dctx->ddictIsCold, nbSeq);
       
   520             if (ZSTD_isError(llhSize)) return ERROR(corruption_detected);
       
   521             ip += llhSize;
       
   522         }
       
   523 
       
   524         {   size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr,
       
   525                                                       OFtype, MaxOff, OffFSELog,
       
   526                                                       ip, iend-ip,
       
   527                                                       OF_base, OF_bits,
       
   528                                                       OF_defaultDTable, dctx->fseEntropy,
       
   529                                                       dctx->ddictIsCold, nbSeq);
       
   530             if (ZSTD_isError(ofhSize)) return ERROR(corruption_detected);
       
   531             ip += ofhSize;
       
   532         }
       
   533 
       
   534         {   size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr,
       
   535                                                       MLtype, MaxML, MLFSELog,
       
   536                                                       ip, iend-ip,
       
   537                                                       ML_base, ML_bits,
       
   538                                                       ML_defaultDTable, dctx->fseEntropy,
       
   539                                                       dctx->ddictIsCold, nbSeq);
       
   540             if (ZSTD_isError(mlhSize)) return ERROR(corruption_detected);
       
   541             ip += mlhSize;
       
   542         }
       
   543     }
       
   544 
       
   545     return ip-istart;
       
   546 }
       
   547 
       
   548 
       
   549 typedef struct {
       
   550     size_t litLength;
       
   551     size_t matchLength;
       
   552     size_t offset;
       
   553     const BYTE* match;
       
   554 } seq_t;
       
   555 
       
   556 typedef struct {
       
   557     size_t state;
       
   558     const ZSTD_seqSymbol* table;
       
   559 } ZSTD_fseState;
       
   560 
       
   561 typedef struct {
       
   562     BIT_DStream_t DStream;
       
   563     ZSTD_fseState stateLL;
       
   564     ZSTD_fseState stateOffb;
       
   565     ZSTD_fseState stateML;
       
   566     size_t prevOffset[ZSTD_REP_NUM];
       
   567     const BYTE* prefixStart;
       
   568     const BYTE* dictEnd;
       
   569     size_t pos;
       
   570 } seqState_t;
       
   571 
       
   572 
       
   573 /* ZSTD_execSequenceLast7():
       
   574  * exceptional case : decompress a match starting within last 7 bytes of output buffer.
       
   575  * requires more careful checks, to ensure there is no overflow.
       
   576  * performance does not matter though.
       
   577  * note : this case is supposed to be never generated "naturally" by reference encoder,
       
   578  *        since in most cases it needs at least 8 bytes to look for a match.
       
   579  *        but it's allowed by the specification. */
       
   580 FORCE_NOINLINE
       
   581 size_t ZSTD_execSequenceLast7(BYTE* op,
       
   582                               BYTE* const oend, seq_t sequence,
       
   583                               const BYTE** litPtr, const BYTE* const litLimit,
       
   584                               const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
       
   585 {
       
   586     BYTE* const oLitEnd = op + sequence.litLength;
       
   587     size_t const sequenceLength = sequence.litLength + sequence.matchLength;
       
   588     BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
       
   589     const BYTE* const iLitEnd = *litPtr + sequence.litLength;
       
   590     const BYTE* match = oLitEnd - sequence.offset;
       
   591 
       
   592     /* check */
       
   593     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall);   /* last match must fit within dstBuffer */
       
   594     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* try to read beyond literal buffer */
       
   595 
       
   596     /* copy literals */
       
   597     while (op < oLitEnd) *op++ = *(*litPtr)++;
       
   598 
       
   599     /* copy Match */
       
   600     if (sequence.offset > (size_t)(oLitEnd - base)) {
       
   601         /* offset beyond prefix */
       
   602         if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
       
   603         match = dictEnd - (base-match);
       
   604         if (match + sequence.matchLength <= dictEnd) {
       
   605             memmove(oLitEnd, match, sequence.matchLength);
       
   606             return sequenceLength;
       
   607         }
       
   608         /* span extDict & currentPrefixSegment */
       
   609         {   size_t const length1 = dictEnd - match;
       
   610             memmove(oLitEnd, match, length1);
       
   611             op = oLitEnd + length1;
       
   612             sequence.matchLength -= length1;
       
   613             match = base;
       
   614     }   }
       
   615     while (op < oMatchEnd) *op++ = *match++;
       
   616     return sequenceLength;
       
   617 }
       
   618 
       
   619 
       
   620 HINT_INLINE
       
   621 size_t ZSTD_execSequence(BYTE* op,
       
   622                          BYTE* const oend, seq_t sequence,
       
   623                          const BYTE** litPtr, const BYTE* const litLimit,
       
   624                          const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd)
       
   625 {
       
   626     BYTE* const oLitEnd = op + sequence.litLength;
       
   627     size_t const sequenceLength = sequence.litLength + sequence.matchLength;
       
   628     BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
       
   629     BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
       
   630     const BYTE* const iLitEnd = *litPtr + sequence.litLength;
       
   631     const BYTE* match = oLitEnd - sequence.offset;
       
   632 
       
   633     /* check */
       
   634     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
       
   635     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */
       
   636     if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd);
       
   637 
       
   638     /* copy Literals */
       
   639     ZSTD_copy8(op, *litPtr);
       
   640     if (sequence.litLength > 8)
       
   641         ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
       
   642     op = oLitEnd;
       
   643     *litPtr = iLitEnd;   /* update for next sequence */
       
   644 
       
   645     /* copy Match */
       
   646     if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
       
   647         /* offset beyond prefix -> go into extDict */
       
   648         if (sequence.offset > (size_t)(oLitEnd - virtualStart))
       
   649             return ERROR(corruption_detected);
       
   650         match = dictEnd + (match - prefixStart);
       
   651         if (match + sequence.matchLength <= dictEnd) {
       
   652             memmove(oLitEnd, match, sequence.matchLength);
       
   653             return sequenceLength;
       
   654         }
       
   655         /* span extDict & currentPrefixSegment */
       
   656         {   size_t const length1 = dictEnd - match;
       
   657             memmove(oLitEnd, match, length1);
       
   658             op = oLitEnd + length1;
       
   659             sequence.matchLength -= length1;
       
   660             match = prefixStart;
       
   661             if (op > oend_w || sequence.matchLength < MINMATCH) {
       
   662               U32 i;
       
   663               for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
       
   664               return sequenceLength;
       
   665             }
       
   666     }   }
       
   667     /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
       
   668 
       
   669     /* match within prefix */
       
   670     if (sequence.offset < 8) {
       
   671         /* close range match, overlap */
       
   672         static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */
       
   673         static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 };   /* subtracted */
       
   674         int const sub2 = dec64table[sequence.offset];
       
   675         op[0] = match[0];
       
   676         op[1] = match[1];
       
   677         op[2] = match[2];
       
   678         op[3] = match[3];
       
   679         match += dec32table[sequence.offset];
       
   680         ZSTD_copy4(op+4, match);
       
   681         match -= sub2;
       
   682     } else {
       
   683         ZSTD_copy8(op, match);
       
   684     }
       
   685     op += 8; match += 8;
       
   686 
       
   687     if (oMatchEnd > oend-(16-MINMATCH)) {
       
   688         if (op < oend_w) {
       
   689             ZSTD_wildcopy(op, match, oend_w - op);
       
   690             match += oend_w - op;
       
   691             op = oend_w;
       
   692         }
       
   693         while (op < oMatchEnd) *op++ = *match++;
       
   694     } else {
       
   695         ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8 */
       
   696     }
       
   697     return sequenceLength;
       
   698 }
       
   699 
       
   700 
       
   701 HINT_INLINE
       
   702 size_t ZSTD_execSequenceLong(BYTE* op,
       
   703                              BYTE* const oend, seq_t sequence,
       
   704                              const BYTE** litPtr, const BYTE* const litLimit,
       
   705                              const BYTE* const prefixStart, const BYTE* const dictStart, const BYTE* const dictEnd)
       
   706 {
       
   707     BYTE* const oLitEnd = op + sequence.litLength;
       
   708     size_t const sequenceLength = sequence.litLength + sequence.matchLength;
       
   709     BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
       
   710     BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
       
   711     const BYTE* const iLitEnd = *litPtr + sequence.litLength;
       
   712     const BYTE* match = sequence.match;
       
   713 
       
   714     /* check */
       
   715     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
       
   716     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */
       
   717     if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd);
       
   718 
       
   719     /* copy Literals */
       
   720     ZSTD_copy8(op, *litPtr);  /* note : op <= oLitEnd <= oend_w == oend - 8 */
       
   721     if (sequence.litLength > 8)
       
   722         ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
       
   723     op = oLitEnd;
       
   724     *litPtr = iLitEnd;   /* update for next sequence */
       
   725 
       
   726     /* copy Match */
       
   727     if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
       
   728         /* offset beyond prefix */
       
   729         if (sequence.offset > (size_t)(oLitEnd - dictStart)) return ERROR(corruption_detected);
       
   730         if (match + sequence.matchLength <= dictEnd) {
       
   731             memmove(oLitEnd, match, sequence.matchLength);
       
   732             return sequenceLength;
       
   733         }
       
   734         /* span extDict & currentPrefixSegment */
       
   735         {   size_t const length1 = dictEnd - match;
       
   736             memmove(oLitEnd, match, length1);
       
   737             op = oLitEnd + length1;
       
   738             sequence.matchLength -= length1;
       
   739             match = prefixStart;
       
   740             if (op > oend_w || sequence.matchLength < MINMATCH) {
       
   741               U32 i;
       
   742               for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
       
   743               return sequenceLength;
       
   744             }
       
   745     }   }
       
   746     assert(op <= oend_w);
       
   747     assert(sequence.matchLength >= MINMATCH);
       
   748 
       
   749     /* match within prefix */
       
   750     if (sequence.offset < 8) {
       
   751         /* close range match, overlap */
       
   752         static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */
       
   753         static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 };   /* subtracted */
       
   754         int const sub2 = dec64table[sequence.offset];
       
   755         op[0] = match[0];
       
   756         op[1] = match[1];
       
   757         op[2] = match[2];
       
   758         op[3] = match[3];
       
   759         match += dec32table[sequence.offset];
       
   760         ZSTD_copy4(op+4, match);
       
   761         match -= sub2;
       
   762     } else {
       
   763         ZSTD_copy8(op, match);
       
   764     }
       
   765     op += 8; match += 8;
       
   766 
       
   767     if (oMatchEnd > oend-(16-MINMATCH)) {
       
   768         if (op < oend_w) {
       
   769             ZSTD_wildcopy(op, match, oend_w - op);
       
   770             match += oend_w - op;
       
   771             op = oend_w;
       
   772         }
       
   773         while (op < oMatchEnd) *op++ = *match++;
       
   774     } else {
       
   775         ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8 */
       
   776     }
       
   777     return sequenceLength;
       
   778 }
       
   779 
       
   780 static void
       
   781 ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt)
       
   782 {
       
   783     const void* ptr = dt;
       
   784     const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr;
       
   785     DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
       
   786     DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits",
       
   787                 (U32)DStatePtr->state, DTableH->tableLog);
       
   788     BIT_reloadDStream(bitD);
       
   789     DStatePtr->table = dt + 1;
       
   790 }
       
   791 
       
   792 FORCE_INLINE_TEMPLATE void
       
   793 ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD)
       
   794 {
       
   795     ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state];
       
   796     U32 const nbBits = DInfo.nbBits;
       
   797     size_t const lowBits = BIT_readBits(bitD, nbBits);
       
   798     DStatePtr->state = DInfo.nextState + lowBits;
       
   799 }
       
   800 
       
   801 /* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum
       
   802  * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1)
       
   803  * bits before reloading. This value is the maximum number of bytes we read
       
   804  * after reloading when we are decoding long offets.
       
   805  */
       
   806 #define LONG_OFFSETS_MAX_EXTRA_BITS_32                       \
       
   807     (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32       \
       
   808         ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32  \
       
   809         : 0)
       
   810 
       
   811 typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
       
   812 
       
   813 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
       
   814 FORCE_INLINE_TEMPLATE seq_t
       
   815 ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
       
   816 {
       
   817     seq_t seq;
       
   818     U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
       
   819     U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
       
   820     U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
       
   821     U32 const totalBits = llBits+mlBits+ofBits;
       
   822     U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
       
   823     U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
       
   824     U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
       
   825 
       
   826     /* sequence */
       
   827     {   size_t offset;
       
   828         if (!ofBits)
       
   829             offset = 0;
       
   830         else {
       
   831             ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
       
   832             ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
       
   833             assert(ofBits <= MaxOff);
       
   834             if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) {
       
   835                 U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed);
       
   836                 offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
       
   837                 BIT_reloadDStream(&seqState->DStream);
       
   838                 if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
       
   839                 assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32);   /* to avoid another reload */
       
   840             } else {
       
   841                 offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/);   /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
       
   842                 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
       
   843             }
       
   844         }
       
   845 
       
   846         if (ofBits <= 1) {
       
   847             offset += (llBase==0);
       
   848             if (offset) {
       
   849                 size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
       
   850                 temp += !temp;   /* 0 is not valid; input is corrupted; force offset to 1 */
       
   851                 if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
       
   852                 seqState->prevOffset[1] = seqState->prevOffset[0];
       
   853                 seqState->prevOffset[0] = offset = temp;
       
   854             } else {  /* offset == 0 */
       
   855                 offset = seqState->prevOffset[0];
       
   856             }
       
   857         } else {
       
   858             seqState->prevOffset[2] = seqState->prevOffset[1];
       
   859             seqState->prevOffset[1] = seqState->prevOffset[0];
       
   860             seqState->prevOffset[0] = offset;
       
   861         }
       
   862         seq.offset = offset;
       
   863     }
       
   864 
       
   865     seq.matchLength = mlBase
       
   866                     + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/) : 0);  /* <=  16 bits */
       
   867     if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
       
   868         BIT_reloadDStream(&seqState->DStream);
       
   869     if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
       
   870         BIT_reloadDStream(&seqState->DStream);
       
   871     /* Ensure there are enough bits to read the rest of data in 64-bit mode. */
       
   872     ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
       
   873 
       
   874     seq.litLength = llBase
       
   875                   + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits/*>0*/) : 0);    /* <=  16 bits */
       
   876     if (MEM_32bits())
       
   877         BIT_reloadDStream(&seqState->DStream);
       
   878 
       
   879     DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u",
       
   880                 (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset);
       
   881 
       
   882     /* ANS state update */
       
   883     ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream);    /* <=  9 bits */
       
   884     ZSTD_updateFseState(&seqState->stateML, &seqState->DStream);    /* <=  9 bits */
       
   885     if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);    /* <= 18 bits */
       
   886     ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream);  /* <=  8 bits */
       
   887 
       
   888     return seq;
       
   889 }
       
   890 
       
   891 FORCE_INLINE_TEMPLATE size_t
       
   892 ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
       
   893                                void* dst, size_t maxDstSize,
       
   894                          const void* seqStart, size_t seqSize, int nbSeq,
       
   895                          const ZSTD_longOffset_e isLongOffset)
       
   896 {
       
   897     const BYTE* ip = (const BYTE*)seqStart;
       
   898     const BYTE* const iend = ip + seqSize;
       
   899     BYTE* const ostart = (BYTE* const)dst;
       
   900     BYTE* const oend = ostart + maxDstSize;
       
   901     BYTE* op = ostart;
       
   902     const BYTE* litPtr = dctx->litPtr;
       
   903     const BYTE* const litEnd = litPtr + dctx->litSize;
       
   904     const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart);
       
   905     const BYTE* const vBase = (const BYTE*) (dctx->virtualStart);
       
   906     const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
       
   907     DEBUGLOG(5, "ZSTD_decompressSequences_body");
       
   908 
       
   909     /* Regen sequences */
       
   910     if (nbSeq) {
       
   911         seqState_t seqState;
       
   912         dctx->fseEntropy = 1;
       
   913         { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
       
   914         CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
       
   915         ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
       
   916         ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
       
   917         ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
       
   918 
       
   919         for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
       
   920             nbSeq--;
       
   921             {   seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
       
   922                 size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd);
       
   923                 DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
       
   924                 if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
       
   925                 op += oneSeqSize;
       
   926         }   }
       
   927 
       
   928         /* check if reached exact end */
       
   929         DEBUGLOG(5, "ZSTD_decompressSequences_body: after decode loop, remaining nbSeq : %i", nbSeq);
       
   930         if (nbSeq) return ERROR(corruption_detected);
       
   931         /* save reps for next block */
       
   932         { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
       
   933     }
       
   934 
       
   935     /* last literal segment */
       
   936     {   size_t const lastLLSize = litEnd - litPtr;
       
   937         if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
       
   938         memcpy(op, litPtr, lastLLSize);
       
   939         op += lastLLSize;
       
   940     }
       
   941 
       
   942     return op-ostart;
       
   943 }
       
   944 
       
   945 static size_t
       
   946 ZSTD_decompressSequences_default(ZSTD_DCtx* dctx,
       
   947                                  void* dst, size_t maxDstSize,
       
   948                            const void* seqStart, size_t seqSize, int nbSeq,
       
   949                            const ZSTD_longOffset_e isLongOffset)
       
   950 {
       
   951     return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
   952 }
       
   953 #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
       
   954 
       
   955 
       
   956 
       
   957 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
       
   958 FORCE_INLINE_TEMPLATE seq_t
       
   959 ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
       
   960 {
       
   961     seq_t seq;
       
   962     U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
       
   963     U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
       
   964     U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
       
   965     U32 const totalBits = llBits+mlBits+ofBits;
       
   966     U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
       
   967     U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
       
   968     U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
       
   969 
       
   970     /* sequence */
       
   971     {   size_t offset;
       
   972         if (!ofBits)
       
   973             offset = 0;
       
   974         else {
       
   975             ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
       
   976             ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
       
   977             assert(ofBits <= MaxOff);
       
   978             if (MEM_32bits() && longOffsets) {
       
   979                 U32 const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN_32-1);
       
   980                 offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
       
   981                 if (MEM_32bits() || extraBits) BIT_reloadDStream(&seqState->DStream);
       
   982                 if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
       
   983             } else {
       
   984                 offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits);   /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
       
   985                 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
       
   986             }
       
   987         }
       
   988 
       
   989         if (ofBits <= 1) {
       
   990             offset += (llBase==0);
       
   991             if (offset) {
       
   992                 size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
       
   993                 temp += !temp;   /* 0 is not valid; input is corrupted; force offset to 1 */
       
   994                 if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
       
   995                 seqState->prevOffset[1] = seqState->prevOffset[0];
       
   996                 seqState->prevOffset[0] = offset = temp;
       
   997             } else {
       
   998                 offset = seqState->prevOffset[0];
       
   999             }
       
  1000         } else {
       
  1001             seqState->prevOffset[2] = seqState->prevOffset[1];
       
  1002             seqState->prevOffset[1] = seqState->prevOffset[0];
       
  1003             seqState->prevOffset[0] = offset;
       
  1004         }
       
  1005         seq.offset = offset;
       
  1006     }
       
  1007 
       
  1008     seq.matchLength = mlBase + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0);  /* <=  16 bits */
       
  1009     if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
       
  1010         BIT_reloadDStream(&seqState->DStream);
       
  1011     if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
       
  1012         BIT_reloadDStream(&seqState->DStream);
       
  1013     /* Verify that there is enough bits to read the rest of the data in 64-bit mode. */
       
  1014     ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
       
  1015 
       
  1016     seq.litLength = llBase + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0);    /* <=  16 bits */
       
  1017     if (MEM_32bits())
       
  1018         BIT_reloadDStream(&seqState->DStream);
       
  1019 
       
  1020     {   size_t const pos = seqState->pos + seq.litLength;
       
  1021         const BYTE* const matchBase = (seq.offset > pos) ? seqState->dictEnd : seqState->prefixStart;
       
  1022         seq.match = matchBase + pos - seq.offset;  /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted.
       
  1023                                                     * No consequence though : no memory access will occur, overly large offset will be detected in ZSTD_execSequenceLong() */
       
  1024         seqState->pos = pos + seq.matchLength;
       
  1025     }
       
  1026 
       
  1027     /* ANS state update */
       
  1028     ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream);    /* <=  9 bits */
       
  1029     ZSTD_updateFseState(&seqState->stateML, &seqState->DStream);    /* <=  9 bits */
       
  1030     if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);    /* <= 18 bits */
       
  1031     ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream);  /* <=  8 bits */
       
  1032 
       
  1033     return seq;
       
  1034 }
       
  1035 
       
  1036 FORCE_INLINE_TEMPLATE size_t
       
  1037 ZSTD_decompressSequencesLong_body(
       
  1038                                ZSTD_DCtx* dctx,
       
  1039                                void* dst, size_t maxDstSize,
       
  1040                          const void* seqStart, size_t seqSize, int nbSeq,
       
  1041                          const ZSTD_longOffset_e isLongOffset)
       
  1042 {
       
  1043     const BYTE* ip = (const BYTE*)seqStart;
       
  1044     const BYTE* const iend = ip + seqSize;
       
  1045     BYTE* const ostart = (BYTE* const)dst;
       
  1046     BYTE* const oend = ostart + maxDstSize;
       
  1047     BYTE* op = ostart;
       
  1048     const BYTE* litPtr = dctx->litPtr;
       
  1049     const BYTE* const litEnd = litPtr + dctx->litSize;
       
  1050     const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart);
       
  1051     const BYTE* const dictStart = (const BYTE*) (dctx->virtualStart);
       
  1052     const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
       
  1053 
       
  1054     /* Regen sequences */
       
  1055     if (nbSeq) {
       
  1056 #define STORED_SEQS 4
       
  1057 #define STORED_SEQS_MASK (STORED_SEQS-1)
       
  1058 #define ADVANCED_SEQS 4
       
  1059         seq_t sequences[STORED_SEQS];
       
  1060         int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
       
  1061         seqState_t seqState;
       
  1062         int seqNb;
       
  1063         dctx->fseEntropy = 1;
       
  1064         { int i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
       
  1065         seqState.prefixStart = prefixStart;
       
  1066         seqState.pos = (size_t)(op-prefixStart);
       
  1067         seqState.dictEnd = dictEnd;
       
  1068         assert(iend >= ip);
       
  1069         CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
       
  1070         ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
       
  1071         ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
       
  1072         ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
       
  1073 
       
  1074         /* prepare in advance */
       
  1075         for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNb<seqAdvance); seqNb++) {
       
  1076             sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
       
  1077             PREFETCH_L1(sequences[seqNb].match); PREFETCH_L1(sequences[seqNb].match + sequences[seqNb].matchLength - 1); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
       
  1078         }
       
  1079         if (seqNb<seqAdvance) return ERROR(corruption_detected);
       
  1080 
       
  1081         /* decode and decompress */
       
  1082         for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb<nbSeq) ; seqNb++) {
       
  1083             seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
       
  1084             size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
       
  1085             if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
       
  1086             PREFETCH_L1(sequence.match); PREFETCH_L1(sequence.match + sequence.matchLength - 1); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
       
  1087             sequences[seqNb & STORED_SEQS_MASK] = sequence;
       
  1088             op += oneSeqSize;
       
  1089         }
       
  1090         if (seqNb<nbSeq) return ERROR(corruption_detected);
       
  1091 
       
  1092         /* finish queue */
       
  1093         seqNb -= seqAdvance;
       
  1094         for ( ; seqNb<nbSeq ; seqNb++) {
       
  1095             size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
       
  1096             if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
       
  1097             op += oneSeqSize;
       
  1098         }
       
  1099 
       
  1100         /* save reps for next block */
       
  1101         { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
       
  1102     }
       
  1103 
       
  1104     /* last literal segment */
       
  1105     {   size_t const lastLLSize = litEnd - litPtr;
       
  1106         if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
       
  1107         memcpy(op, litPtr, lastLLSize);
       
  1108         op += lastLLSize;
       
  1109     }
       
  1110 
       
  1111     return op-ostart;
       
  1112 }
       
  1113 
       
  1114 static size_t
       
  1115 ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx,
       
  1116                                  void* dst, size_t maxDstSize,
       
  1117                            const void* seqStart, size_t seqSize, int nbSeq,
       
  1118                            const ZSTD_longOffset_e isLongOffset)
       
  1119 {
       
  1120     return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
  1121 }
       
  1122 #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
       
  1123 
       
  1124 
       
  1125 
       
  1126 #if DYNAMIC_BMI2
       
  1127 
       
  1128 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
       
  1129 static TARGET_ATTRIBUTE("bmi2") size_t
       
  1130 ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
       
  1131                                  void* dst, size_t maxDstSize,
       
  1132                            const void* seqStart, size_t seqSize, int nbSeq,
       
  1133                            const ZSTD_longOffset_e isLongOffset)
       
  1134 {
       
  1135     return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
  1136 }
       
  1137 #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
       
  1138 
       
  1139 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
       
  1140 static TARGET_ATTRIBUTE("bmi2") size_t
       
  1141 ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
       
  1142                                  void* dst, size_t maxDstSize,
       
  1143                            const void* seqStart, size_t seqSize, int nbSeq,
       
  1144                            const ZSTD_longOffset_e isLongOffset)
       
  1145 {
       
  1146     return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
  1147 }
       
  1148 #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
       
  1149 
       
  1150 #endif /* DYNAMIC_BMI2 */
       
  1151 
       
  1152 typedef size_t (*ZSTD_decompressSequences_t)(
       
  1153                             ZSTD_DCtx* dctx,
       
  1154                             void* dst, size_t maxDstSize,
       
  1155                             const void* seqStart, size_t seqSize, int nbSeq,
       
  1156                             const ZSTD_longOffset_e isLongOffset);
       
  1157 
       
  1158 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
       
  1159 static size_t
       
  1160 ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
       
  1161                    const void* seqStart, size_t seqSize, int nbSeq,
       
  1162                    const ZSTD_longOffset_e isLongOffset)
       
  1163 {
       
  1164     DEBUGLOG(5, "ZSTD_decompressSequences");
       
  1165 #if DYNAMIC_BMI2
       
  1166     if (dctx->bmi2) {
       
  1167         return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
  1168     }
       
  1169 #endif
       
  1170   return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
  1171 }
       
  1172 #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
       
  1173 
       
  1174 
       
  1175 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
       
  1176 /* ZSTD_decompressSequencesLong() :
       
  1177  * decompression function triggered when a minimum share of offsets is considered "long",
       
  1178  * aka out of cache.
       
  1179  * note : "long" definition seems overloaded here, sometimes meaning "wider than bitstream register", and sometimes mearning "farther than memory cache distance".
       
  1180  * This function will try to mitigate main memory latency through the use of prefetching */
       
  1181 static size_t
       
  1182 ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx,
       
  1183                              void* dst, size_t maxDstSize,
       
  1184                              const void* seqStart, size_t seqSize, int nbSeq,
       
  1185                              const ZSTD_longOffset_e isLongOffset)
       
  1186 {
       
  1187     DEBUGLOG(5, "ZSTD_decompressSequencesLong");
       
  1188 #if DYNAMIC_BMI2
       
  1189     if (dctx->bmi2) {
       
  1190         return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
  1191     }
       
  1192 #endif
       
  1193   return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
       
  1194 }
       
  1195 #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
       
  1196 
       
  1197 
       
  1198 
       
  1199 #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
       
  1200     !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
       
  1201 /* ZSTD_getLongOffsetsShare() :
       
  1202  * condition : offTable must be valid
       
  1203  * @return : "share" of long offsets (arbitrarily defined as > (1<<23))
       
  1204  *           compared to maximum possible of (1<<OffFSELog) */
       
  1205 static unsigned
       
  1206 ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable)
       
  1207 {
       
  1208     const void* ptr = offTable;
       
  1209     U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog;
       
  1210     const ZSTD_seqSymbol* table = offTable + 1;
       
  1211     U32 const max = 1 << tableLog;
       
  1212     U32 u, total = 0;
       
  1213     DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog);
       
  1214 
       
  1215     assert(max <= (1 << OffFSELog));  /* max not too large */
       
  1216     for (u=0; u<max; u++) {
       
  1217         if (table[u].nbAdditionalBits > 22) total += 1;
       
  1218     }
       
  1219 
       
  1220     assert(tableLog <= OffFSELog);
       
  1221     total <<= (OffFSELog - tableLog);  /* scale to OffFSELog */
       
  1222 
       
  1223     return total;
       
  1224 }
       
  1225 #endif
       
  1226 
       
  1227 
       
  1228 size_t
       
  1229 ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
       
  1230                               void* dst, size_t dstCapacity,
       
  1231                         const void* src, size_t srcSize, const int frame)
       
  1232 {   /* blockType == blockCompressed */
       
  1233     const BYTE* ip = (const BYTE*)src;
       
  1234     /* isLongOffset must be true if there are long offsets.
       
  1235      * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN.
       
  1236      * We don't expect that to be the case in 64-bit mode.
       
  1237      * In block mode, window size is not known, so we have to be conservative.
       
  1238      * (note: but it could be evaluated from current-lowLimit)
       
  1239      */
       
  1240     ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || (dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN))));
       
  1241     DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize);
       
  1242 
       
  1243     if (srcSize >= ZSTD_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
       
  1244 
       
  1245     /* Decode literals section */
       
  1246     {   size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
       
  1247         DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize);
       
  1248         if (ZSTD_isError(litCSize)) return litCSize;
       
  1249         ip += litCSize;
       
  1250         srcSize -= litCSize;
       
  1251     }
       
  1252 
       
  1253     /* Build Decoding Tables */
       
  1254     {
       
  1255         /* These macros control at build-time which decompressor implementation
       
  1256          * we use. If neither is defined, we do some inspection and dispatch at
       
  1257          * runtime.
       
  1258          */
       
  1259 #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
       
  1260     !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
       
  1261         int usePrefetchDecoder = dctx->ddictIsCold;
       
  1262 #endif
       
  1263         int nbSeq;
       
  1264         size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
       
  1265         if (ZSTD_isError(seqHSize)) return seqHSize;
       
  1266         ip += seqHSize;
       
  1267         srcSize -= seqHSize;
       
  1268 
       
  1269 #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
       
  1270     !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
       
  1271         if ( !usePrefetchDecoder
       
  1272           && (!frame || (dctx->fParams.windowSize > (1<<24)))
       
  1273           && (nbSeq>ADVANCED_SEQS) ) {  /* could probably use a larger nbSeq limit */
       
  1274             U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr);
       
  1275             U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
       
  1276             usePrefetchDecoder = (shareLongOffsets >= minShare);
       
  1277         }
       
  1278 #endif
       
  1279 
       
  1280         dctx->ddictIsCold = 0;
       
  1281 
       
  1282 #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
       
  1283     !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
       
  1284         if (usePrefetchDecoder)
       
  1285 #endif
       
  1286 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
       
  1287             return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
       
  1288 #endif
       
  1289 
       
  1290 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
       
  1291         /* else */
       
  1292         return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
       
  1293 #endif
       
  1294     }
       
  1295 }
       
  1296 
       
  1297 
       
  1298 size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
       
  1299                             void* dst, size_t dstCapacity,
       
  1300                       const void* src, size_t srcSize)
       
  1301 {
       
  1302     size_t dSize;
       
  1303     ZSTD_checkContinuity(dctx, dst);
       
  1304     dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0);
       
  1305     dctx->previousDstEnd = (char*)dst + dSize;
       
  1306     return dSize;
       
  1307 }