]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/zstd/lib/decompress/zstd_decompress.c
MFV r333789: libpcap 1.9.0 (pre-release)
[FreeBSD/FreeBSD.git] / sys / contrib / zstd / lib / decompress / zstd_decompress.c
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
12 /* ***************************************************************
13 *  Tuning parameters
14 *****************************************************************/
15 /*!
16  * HEAPMODE :
17  * Select how default decompression function ZSTD_decompress() allocates its context,
18  * on stack (0), or into heap (1, default; requires malloc()).
19  * Note that functions with explicit context such as ZSTD_decompressDCtx() are unaffected.
20  */
21 #ifndef ZSTD_HEAPMODE
22 #  define ZSTD_HEAPMODE 1
23 #endif
24
25 /*!
26 *  LEGACY_SUPPORT :
27 *  if set to 1+, ZSTD_decompress() can decode older formats (v0.1+)
28 */
29 #ifndef ZSTD_LEGACY_SUPPORT
30 #  define ZSTD_LEGACY_SUPPORT 0
31 #endif
32
33 /*!
34  *  MAXWINDOWSIZE_DEFAULT :
35  *  maximum window size accepted by DStream __by default__.
36  *  Frames requiring more memory will be rejected.
37  *  It's possible to set a different limit using ZSTD_DCtx_setMaxWindowSize().
38  */
39 #ifndef ZSTD_MAXWINDOWSIZE_DEFAULT
40 #  define ZSTD_MAXWINDOWSIZE_DEFAULT (((U32)1 << ZSTD_WINDOWLOG_DEFAULTMAX) + 1)
41 #endif
42
43
44 /*-*******************************************************
45 *  Dependencies
46 *********************************************************/
47 #include <string.h>      /* memcpy, memmove, memset */
48 #include "cpu.h"
49 #include "mem.h"         /* low level memory routines */
50 #define FSE_STATIC_LINKING_ONLY
51 #include "fse.h"
52 #define HUF_STATIC_LINKING_ONLY
53 #include "huf.h"
54 #include "zstd_internal.h"
55
56 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
57 #  include "zstd_legacy.h"
58 #endif
59
60
61 /*-*************************************
62 *  Errors
63 ***************************************/
64 #define ZSTD_isError ERR_isError   /* for inlining */
65 #define FSE_isError  ERR_isError
66 #define HUF_isError  ERR_isError
67
68
69 /*_*******************************************************
70 *  Memory operations
71 **********************************************************/
72 static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
73
74
75 /*-*************************************************************
76 *   Context management
77 ***************************************************************/
78 typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
79                ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock,
80                ZSTDds_decompressLastBlock, ZSTDds_checkChecksum,
81                ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage;
82
83 typedef enum { zdss_init=0, zdss_loadHeader,
84                zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
85
86
87 typedef struct {
88     U32 fastMode;
89     U32 tableLog;
90 } ZSTD_seqSymbol_header;
91
92 typedef struct {
93     U16  nextState;
94     BYTE nbAdditionalBits;
95     BYTE nbBits;
96     U32  baseValue;
97 } ZSTD_seqSymbol;
98
99 #define SEQSYMBOL_TABLE_SIZE(log)   (1 + (1 << (log)))
100
101 typedef struct {
102     ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)];
103     ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)];
104     ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)];
105     HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)];  /* can accommodate HUF_decompress4X */
106     U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
107     U32 rep[ZSTD_REP_NUM];
108 } ZSTD_entropyDTables_t;
109
110 struct ZSTD_DCtx_s
111 {
112     const ZSTD_seqSymbol* LLTptr;
113     const ZSTD_seqSymbol* MLTptr;
114     const ZSTD_seqSymbol* OFTptr;
115     const HUF_DTable* HUFptr;
116     ZSTD_entropyDTables_t entropy;
117     const void* previousDstEnd;   /* detect continuity */
118     const void* base;             /* start of current segment */
119     const void* vBase;            /* virtual start of previous segment if it was just before current one */
120     const void* dictEnd;          /* end of previous segment */
121     size_t expected;
122     ZSTD_frameHeader fParams;
123     U64 decodedSize;
124     blockType_e bType;            /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */
125     ZSTD_dStage stage;
126     U32 litEntropy;
127     U32 fseEntropy;
128     XXH64_state_t xxhState;
129     size_t headerSize;
130     U32 dictID;
131     ZSTD_format_e format;
132     const BYTE* litPtr;
133     ZSTD_customMem customMem;
134     size_t litSize;
135     size_t rleSize;
136     size_t staticSize;
137     int bmi2;                     /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
138
139     /* streaming */
140     ZSTD_DDict* ddictLocal;
141     const ZSTD_DDict* ddict;
142     ZSTD_dStreamStage streamStage;
143     char*  inBuff;
144     size_t inBuffSize;
145     size_t inPos;
146     size_t maxWindowSize;
147     char*  outBuff;
148     size_t outBuffSize;
149     size_t outStart;
150     size_t outEnd;
151     size_t lhSize;
152     void* legacyContext;
153     U32 previousLegacyVersion;
154     U32 legacyVersion;
155     U32 hostageByte;
156
157     /* workspace */
158     BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
159     BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
160 };  /* typedef'd to ZSTD_DCtx within "zstd.h" */
161
162 size_t ZSTD_sizeof_DCtx (const ZSTD_DCtx* dctx)
163 {
164     if (dctx==NULL) return 0;   /* support sizeof NULL */
165     return sizeof(*dctx)
166            + ZSTD_sizeof_DDict(dctx->ddictLocal)
167            + dctx->inBuffSize + dctx->outBuffSize;
168 }
169
170 size_t ZSTD_estimateDCtxSize(void) { return sizeof(ZSTD_DCtx); }
171
172
173 static size_t ZSTD_startingInputLength(ZSTD_format_e format)
174 {
175     size_t const startingInputLength = (format==ZSTD_f_zstd1_magicless) ?
176                     ZSTD_frameHeaderSize_prefix - ZSTD_frameIdSize :
177                     ZSTD_frameHeaderSize_prefix;
178     ZSTD_STATIC_ASSERT(ZSTD_FRAMEHEADERSIZE_PREFIX >= ZSTD_FRAMEIDSIZE);
179     /* only supports formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless */
180     assert( (format == ZSTD_f_zstd1) || (format == ZSTD_f_zstd1_magicless) );
181     return startingInputLength;
182 }
183
184 static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx)
185 {
186     dctx->format = ZSTD_f_zstd1;  /* ZSTD_decompressBegin() invokes ZSTD_startingInputLength() with argument dctx->format */
187     dctx->staticSize  = 0;
188     dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
189     dctx->ddict       = NULL;
190     dctx->ddictLocal  = NULL;
191     dctx->inBuff      = NULL;
192     dctx->inBuffSize  = 0;
193     dctx->outBuffSize = 0;
194     dctx->streamStage = zdss_init;
195     dctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
196 }
197
198 ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize)
199 {
200     ZSTD_DCtx* const dctx = (ZSTD_DCtx*) workspace;
201
202     if ((size_t)workspace & 7) return NULL;  /* 8-aligned */
203     if (workspaceSize < sizeof(ZSTD_DCtx)) return NULL;  /* minimum size */
204
205     ZSTD_initDCtx_internal(dctx);
206     dctx->staticSize = workspaceSize;
207     dctx->inBuff = (char*)(dctx+1);
208     return dctx;
209 }
210
211 ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
212 {
213     if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
214
215     {   ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_malloc(sizeof(*dctx), customMem);
216         if (!dctx) return NULL;
217         dctx->customMem = customMem;
218         dctx->legacyContext = NULL;
219         dctx->previousLegacyVersion = 0;
220         ZSTD_initDCtx_internal(dctx);
221         return dctx;
222     }
223 }
224
225 ZSTD_DCtx* ZSTD_createDCtx(void)
226 {
227     DEBUGLOG(3, "ZSTD_createDCtx");
228     return ZSTD_createDCtx_advanced(ZSTD_defaultCMem);
229 }
230
231 size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx)
232 {
233     if (dctx==NULL) return 0;   /* support free on NULL */
234     if (dctx->staticSize) return ERROR(memory_allocation);   /* not compatible with static DCtx */
235     {   ZSTD_customMem const cMem = dctx->customMem;
236         ZSTD_freeDDict(dctx->ddictLocal);
237         dctx->ddictLocal = NULL;
238         ZSTD_free(dctx->inBuff, cMem);
239         dctx->inBuff = NULL;
240 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
241         if (dctx->legacyContext)
242             ZSTD_freeLegacyStreamContext(dctx->legacyContext, dctx->previousLegacyVersion);
243 #endif
244         ZSTD_free(dctx, cMem);
245         return 0;
246     }
247 }
248
249 /* no longer useful */
250 void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx)
251 {
252     size_t const toCopy = (size_t)((char*)(&dstDCtx->inBuff) - (char*)dstDCtx);
253     memcpy(dstDCtx, srcDCtx, toCopy);  /* no need to copy workspace */
254 }
255
256
257 /*-*************************************************************
258  *   Frame header decoding
259  ***************************************************************/
260
261 /*! ZSTD_isFrame() :
262  *  Tells if the content of `buffer` starts with a valid Frame Identifier.
263  *  Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
264  *  Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.
265  *  Note 3 : Skippable Frame Identifiers are considered valid. */
266 unsigned ZSTD_isFrame(const void* buffer, size_t size)
267 {
268     if (size < ZSTD_frameIdSize) return 0;
269     {   U32 const magic = MEM_readLE32(buffer);
270         if (magic == ZSTD_MAGICNUMBER) return 1;
271         if ((magic & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) return 1;
272     }
273 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
274     if (ZSTD_isLegacy(buffer, size)) return 1;
275 #endif
276     return 0;
277 }
278
279 /** ZSTD_frameHeaderSize_internal() :
280  *  srcSize must be large enough to reach header size fields.
281  *  note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless.
282  * @return : size of the Frame Header
283  *           or an error code, which can be tested with ZSTD_isError() */
284 static size_t ZSTD_frameHeaderSize_internal(const void* src, size_t srcSize, ZSTD_format_e format)
285 {
286     size_t const minInputSize = ZSTD_startingInputLength(format);
287     if (srcSize < minInputSize) return ERROR(srcSize_wrong);
288
289     {   BYTE const fhd = ((const BYTE*)src)[minInputSize-1];
290         U32 const dictID= fhd & 3;
291         U32 const singleSegment = (fhd >> 5) & 1;
292         U32 const fcsId = fhd >> 6;
293         return minInputSize + !singleSegment
294              + ZSTD_did_fieldSize[dictID] + ZSTD_fcs_fieldSize[fcsId]
295              + (singleSegment && !fcsId);
296     }
297 }
298
299 /** ZSTD_frameHeaderSize() :
300  *  srcSize must be >= ZSTD_frameHeaderSize_prefix.
301  * @return : size of the Frame Header */
302 size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize)
303 {
304     return ZSTD_frameHeaderSize_internal(src, srcSize, ZSTD_f_zstd1);
305 }
306
307
308 /** ZSTD_getFrameHeader_internal() :
309  *  decode Frame Header, or require larger `srcSize`.
310  *  note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless
311  * @return : 0, `zfhPtr` is correctly filled,
312  *          >0, `srcSize` is too small, value is wanted `srcSize` amount,
313  *           or an error code, which can be tested using ZSTD_isError() */
314 static size_t ZSTD_getFrameHeader_internal(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format)
315 {
316     const BYTE* ip = (const BYTE*)src;
317     size_t const minInputSize = ZSTD_startingInputLength(format);
318
319     if (srcSize < minInputSize) return minInputSize;
320
321     if ( (format != ZSTD_f_zstd1_magicless)
322       && (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) {
323         if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
324             /* skippable frame */
325             if (srcSize < ZSTD_skippableHeaderSize)
326                 return ZSTD_skippableHeaderSize; /* magic number + frame length */
327             memset(zfhPtr, 0, sizeof(*zfhPtr));
328             zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_frameIdSize);
329             zfhPtr->frameType = ZSTD_skippableFrame;
330             return 0;
331         }
332         return ERROR(prefix_unknown);
333     }
334
335     /* ensure there is enough `srcSize` to fully read/decode frame header */
336     {   size_t const fhsize = ZSTD_frameHeaderSize_internal(src, srcSize, format);
337         if (srcSize < fhsize) return fhsize;
338         zfhPtr->headerSize = (U32)fhsize;
339     }
340
341     {   BYTE const fhdByte = ip[minInputSize-1];
342         size_t pos = minInputSize;
343         U32 const dictIDSizeCode = fhdByte&3;
344         U32 const checksumFlag = (fhdByte>>2)&1;
345         U32 const singleSegment = (fhdByte>>5)&1;
346         U32 const fcsID = fhdByte>>6;
347         U64 windowSize = 0;
348         U32 dictID = 0;
349         U64 frameContentSize = ZSTD_CONTENTSIZE_UNKNOWN;
350         if ((fhdByte & 0x08) != 0)
351             return ERROR(frameParameter_unsupported); /* reserved bits, must be zero */
352
353         if (!singleSegment) {
354             BYTE const wlByte = ip[pos++];
355             U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
356             if (windowLog > ZSTD_WINDOWLOG_MAX)
357                 return ERROR(frameParameter_windowTooLarge);
358             windowSize = (1ULL << windowLog);
359             windowSize += (windowSize >> 3) * (wlByte&7);
360         }
361         switch(dictIDSizeCode)
362         {
363             default: assert(0);  /* impossible */
364             case 0 : break;
365             case 1 : dictID = ip[pos]; pos++; break;
366             case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break;
367             case 3 : dictID = MEM_readLE32(ip+pos); pos+=4; break;
368         }
369         switch(fcsID)
370         {
371             default: assert(0);  /* impossible */
372             case 0 : if (singleSegment) frameContentSize = ip[pos]; break;
373             case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break;
374             case 2 : frameContentSize = MEM_readLE32(ip+pos); break;
375             case 3 : frameContentSize = MEM_readLE64(ip+pos); break;
376         }
377         if (singleSegment) windowSize = frameContentSize;
378
379         zfhPtr->frameType = ZSTD_frame;
380         zfhPtr->frameContentSize = frameContentSize;
381         zfhPtr->windowSize = windowSize;
382         zfhPtr->blockSizeMax = (unsigned) MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
383         zfhPtr->dictID = dictID;
384         zfhPtr->checksumFlag = checksumFlag;
385     }
386     return 0;
387 }
388
389 /** ZSTD_getFrameHeader() :
390  *  decode Frame Header, or require larger `srcSize`.
391  *  note : this function does not consume input, it only reads it.
392  * @return : 0, `zfhPtr` is correctly filled,
393  *          >0, `srcSize` is too small, value is wanted `srcSize` amount,
394  *           or an error code, which can be tested using ZSTD_isError() */
395 size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize)
396 {
397     return ZSTD_getFrameHeader_internal(zfhPtr, src, srcSize, ZSTD_f_zstd1);
398 }
399
400
401 /** ZSTD_getFrameContentSize() :
402  *  compatible with legacy mode
403  * @return : decompressed size of the single frame pointed to be `src` if known, otherwise
404  *         - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
405  *         - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) */
406 unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
407 {
408 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
409     if (ZSTD_isLegacy(src, srcSize)) {
410         unsigned long long const ret = ZSTD_getDecompressedSize_legacy(src, srcSize);
411         return ret == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : ret;
412     }
413 #endif
414     {   ZSTD_frameHeader zfh;
415         if (ZSTD_getFrameHeader(&zfh, src, srcSize) != 0)
416             return ZSTD_CONTENTSIZE_ERROR;
417         if (zfh.frameType == ZSTD_skippableFrame) {
418             return 0;
419         } else {
420             return zfh.frameContentSize;
421     }   }
422 }
423
424 /** ZSTD_findDecompressedSize() :
425  *  compatible with legacy mode
426  *  `srcSize` must be the exact length of some number of ZSTD compressed and/or
427  *      skippable frames
428  *  @return : decompressed size of the frames contained */
429 unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
430 {
431     unsigned long long totalDstSize = 0;
432
433     while (srcSize >= ZSTD_frameHeaderSize_prefix) {
434         U32 const magicNumber = MEM_readLE32(src);
435
436         if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
437             size_t skippableSize;
438             if (srcSize < ZSTD_skippableHeaderSize)
439                 return ERROR(srcSize_wrong);
440             skippableSize = MEM_readLE32((const BYTE *)src + ZSTD_frameIdSize)
441                           + ZSTD_skippableHeaderSize;
442             if (srcSize < skippableSize) {
443                 return ZSTD_CONTENTSIZE_ERROR;
444             }
445
446             src = (const BYTE *)src + skippableSize;
447             srcSize -= skippableSize;
448             continue;
449         }
450
451         {   unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
452             if (ret >= ZSTD_CONTENTSIZE_ERROR) return ret;
453
454             /* check for overflow */
455             if (totalDstSize + ret < totalDstSize) return ZSTD_CONTENTSIZE_ERROR;
456             totalDstSize += ret;
457         }
458         {   size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize);
459             if (ZSTD_isError(frameSrcSize)) {
460                 return ZSTD_CONTENTSIZE_ERROR;
461             }
462
463             src = (const BYTE *)src + frameSrcSize;
464             srcSize -= frameSrcSize;
465         }
466     }  /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */
467
468     if (srcSize) return ZSTD_CONTENTSIZE_ERROR;
469
470     return totalDstSize;
471 }
472
473 /** ZSTD_getDecompressedSize() :
474 *   compatible with legacy mode
475 *   @return : decompressed size if known, 0 otherwise
476               note : 0 can mean any of the following :
477                    - frame content is empty
478                    - decompressed size field is not present in frame header
479                    - frame header unknown / not supported
480                    - frame header not complete (`srcSize` too small) */
481 unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
482 {
483     unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
484     ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_ERROR < ZSTD_CONTENTSIZE_UNKNOWN);
485     return (ret >= ZSTD_CONTENTSIZE_ERROR) ? 0 : ret;
486 }
487
488
489 /** ZSTD_decodeFrameHeader() :
490 *   `headerSize` must be the size provided by ZSTD_frameHeaderSize().
491 *   @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
492 static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize)
493 {
494     size_t const result = ZSTD_getFrameHeader_internal(&(dctx->fParams), src, headerSize, dctx->format);
495     if (ZSTD_isError(result)) return result;    /* invalid header */
496     if (result>0) return ERROR(srcSize_wrong);  /* headerSize too small */
497     if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID))
498         return ERROR(dictionary_wrong);
499     if (dctx->fParams.checksumFlag) XXH64_reset(&dctx->xxhState, 0);
500     return 0;
501 }
502
503
504 /*-*************************************************************
505  *   Block decoding
506  ***************************************************************/
507
508 /*! ZSTD_getcBlockSize() :
509 *   Provides the size of compressed block from block header `src` */
510 size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
511                           blockProperties_t* bpPtr)
512 {
513     if (srcSize < ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
514     {   U32 const cBlockHeader = MEM_readLE24(src);
515         U32 const cSize = cBlockHeader >> 3;
516         bpPtr->lastBlock = cBlockHeader & 1;
517         bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
518         bpPtr->origSize = cSize;   /* only useful for RLE */
519         if (bpPtr->blockType == bt_rle) return 1;
520         if (bpPtr->blockType == bt_reserved) return ERROR(corruption_detected);
521         return cSize;
522     }
523 }
524
525
526 static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity,
527                           const void* src, size_t srcSize)
528 {
529     if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
530     memcpy(dst, src, srcSize);
531     return srcSize;
532 }
533
534
535 static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity,
536                          const void* src, size_t srcSize,
537                                size_t regenSize)
538 {
539     if (srcSize != 1) return ERROR(srcSize_wrong);
540     if (regenSize > dstCapacity) return ERROR(dstSize_tooSmall);
541     memset(dst, *(const BYTE*)src, regenSize);
542     return regenSize;
543 }
544
545 /*! ZSTD_decodeLiteralsBlock() :
546  * @return : nb of bytes read from src (< srcSize )
547  *  note : symbol not declared but exposed for fullbench */
548 size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
549                           const void* src, size_t srcSize)   /* note : srcSize < BLOCKSIZE */
550 {
551     if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
552
553     {   const BYTE* const istart = (const BYTE*) src;
554         symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
555
556         switch(litEncType)
557         {
558         case set_repeat:
559             if (dctx->litEntropy==0) return ERROR(dictionary_corrupted);
560             /* fall-through */
561         case set_compressed:
562             if (srcSize < 5) return ERROR(corruption_detected);   /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
563             {   size_t lhSize, litSize, litCSize;
564                 U32 singleStream=0;
565                 U32 const lhlCode = (istart[0] >> 2) & 3;
566                 U32 const lhc = MEM_readLE32(istart);
567                 switch(lhlCode)
568                 {
569                 case 0: case 1: default:   /* note : default is impossible, since lhlCode into [0..3] */
570                     /* 2 - 2 - 10 - 10 */
571                     singleStream = !lhlCode;
572                     lhSize = 3;
573                     litSize  = (lhc >> 4) & 0x3FF;
574                     litCSize = (lhc >> 14) & 0x3FF;
575                     break;
576                 case 2:
577                     /* 2 - 2 - 14 - 14 */
578                     lhSize = 4;
579                     litSize  = (lhc >> 4) & 0x3FFF;
580                     litCSize = lhc >> 18;
581                     break;
582                 case 3:
583                     /* 2 - 2 - 18 - 18 */
584                     lhSize = 5;
585                     litSize  = (lhc >> 4) & 0x3FFFF;
586                     litCSize = (lhc >> 22) + (istart[4] << 10);
587                     break;
588                 }
589                 if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
590                 if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
591
592                 if (HUF_isError((litEncType==set_repeat) ?
593                                     ( singleStream ?
594                                         HUF_decompress1X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) :
595                                         HUF_decompress4X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) ) :
596                                     ( singleStream ?
597                                         HUF_decompress1X2_DCtx_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
598                                                                          dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2) :
599                                         HUF_decompress4X_hufOnly_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
600                                                                            dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2))))
601                     return ERROR(corruption_detected);
602
603                 dctx->litPtr = dctx->litBuffer;
604                 dctx->litSize = litSize;
605                 dctx->litEntropy = 1;
606                 if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
607                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
608                 return litCSize + lhSize;
609             }
610
611         case set_basic:
612             {   size_t litSize, lhSize;
613                 U32 const lhlCode = ((istart[0]) >> 2) & 3;
614                 switch(lhlCode)
615                 {
616                 case 0: case 2: default:   /* note : default is impossible, since lhlCode into [0..3] */
617                     lhSize = 1;
618                     litSize = istart[0] >> 3;
619                     break;
620                 case 1:
621                     lhSize = 2;
622                     litSize = MEM_readLE16(istart) >> 4;
623                     break;
624                 case 3:
625                     lhSize = 3;
626                     litSize = MEM_readLE24(istart) >> 4;
627                     break;
628                 }
629
630                 if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) {  /* risk reading beyond src buffer with wildcopy */
631                     if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
632                     memcpy(dctx->litBuffer, istart+lhSize, litSize);
633                     dctx->litPtr = dctx->litBuffer;
634                     dctx->litSize = litSize;
635                     memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
636                     return lhSize+litSize;
637                 }
638                 /* direct reference into compressed stream */
639                 dctx->litPtr = istart+lhSize;
640                 dctx->litSize = litSize;
641                 return lhSize+litSize;
642             }
643
644         case set_rle:
645             {   U32 const lhlCode = ((istart[0]) >> 2) & 3;
646                 size_t litSize, lhSize;
647                 switch(lhlCode)
648                 {
649                 case 0: case 2: default:   /* note : default is impossible, since lhlCode into [0..3] */
650                     lhSize = 1;
651                     litSize = istart[0] >> 3;
652                     break;
653                 case 1:
654                     lhSize = 2;
655                     litSize = MEM_readLE16(istart) >> 4;
656                     break;
657                 case 3:
658                     lhSize = 3;
659                     litSize = MEM_readLE24(istart) >> 4;
660                     if (srcSize<4) return ERROR(corruption_detected);   /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
661                     break;
662                 }
663                 if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
664                 memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
665                 dctx->litPtr = dctx->litBuffer;
666                 dctx->litSize = litSize;
667                 return lhSize+1;
668             }
669         default:
670             return ERROR(corruption_detected);   /* impossible */
671         }
672     }
673 }
674
675 /* Default FSE distribution tables.
676  * These are pre-calculated FSE decoding tables using default distributions as defined in specification :
677  * https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#default-distributions
678  * They were generated programmatically with following method :
679  * - start from default distributions, present in /lib/common/zstd_internal.h
680  * - generate tables normally, using ZSTD_buildFSETable()
681  * - printout the content of tables
682  * - pretify output, report below, test with fuzzer to ensure it's correct */
683
684 /* Default FSE distribution table for Literal Lengths */
685 static const ZSTD_seqSymbol LL_defaultDTable[(1<<LL_DEFAULTNORMLOG)+1] = {
686      {  1,  1,  1, LL_DEFAULTNORMLOG},  /* header : fastMode, tableLog */
687      /* nextState, nbAddBits, nbBits, baseVal */
688      {  0,  0,  4,    0},  { 16,  0,  4,    0},
689      { 32,  0,  5,    1},  {  0,  0,  5,    3},
690      {  0,  0,  5,    4},  {  0,  0,  5,    6},
691      {  0,  0,  5,    7},  {  0,  0,  5,    9},
692      {  0,  0,  5,   10},  {  0,  0,  5,   12},
693      {  0,  0,  6,   14},  {  0,  1,  5,   16},
694      {  0,  1,  5,   20},  {  0,  1,  5,   22},
695      {  0,  2,  5,   28},  {  0,  3,  5,   32},
696      {  0,  4,  5,   48},  { 32,  6,  5,   64},
697      {  0,  7,  5,  128},  {  0,  8,  6,  256},
698      {  0, 10,  6, 1024},  {  0, 12,  6, 4096},
699      { 32,  0,  4,    0},  {  0,  0,  4,    1},
700      {  0,  0,  5,    2},  { 32,  0,  5,    4},
701      {  0,  0,  5,    5},  { 32,  0,  5,    7},
702      {  0,  0,  5,    8},  { 32,  0,  5,   10},
703      {  0,  0,  5,   11},  {  0,  0,  6,   13},
704      { 32,  1,  5,   16},  {  0,  1,  5,   18},
705      { 32,  1,  5,   22},  {  0,  2,  5,   24},
706      { 32,  3,  5,   32},  {  0,  3,  5,   40},
707      {  0,  6,  4,   64},  { 16,  6,  4,   64},
708      { 32,  7,  5,  128},  {  0,  9,  6,  512},
709      {  0, 11,  6, 2048},  { 48,  0,  4,    0},
710      { 16,  0,  4,    1},  { 32,  0,  5,    2},
711      { 32,  0,  5,    3},  { 32,  0,  5,    5},
712      { 32,  0,  5,    6},  { 32,  0,  5,    8},
713      { 32,  0,  5,    9},  { 32,  0,  5,   11},
714      { 32,  0,  5,   12},  {  0,  0,  6,   15},
715      { 32,  1,  5,   18},  { 32,  1,  5,   20},
716      { 32,  2,  5,   24},  { 32,  2,  5,   28},
717      { 32,  3,  5,   40},  { 32,  4,  5,   48},
718      {  0, 16,  6,65536},  {  0, 15,  6,32768},
719      {  0, 14,  6,16384},  {  0, 13,  6, 8192},
720 };   /* LL_defaultDTable */
721
722 /* Default FSE distribution table for Offset Codes */
723 static const ZSTD_seqSymbol OF_defaultDTable[(1<<OF_DEFAULTNORMLOG)+1] = {
724     {  1,  1,  1, OF_DEFAULTNORMLOG},  /* header : fastMode, tableLog */
725     /* nextState, nbAddBits, nbBits, baseVal */
726     {  0,  0,  5,    0},     {  0,  6,  4,   61},
727     {  0,  9,  5,  509},     {  0, 15,  5,32765},
728     {  0, 21,  5,2097149},   {  0,  3,  5,    5},
729     {  0,  7,  4,  125},     {  0, 12,  5, 4093},
730     {  0, 18,  5,262141},    {  0, 23,  5,8388605},
731     {  0,  5,  5,   29},     {  0,  8,  4,  253},
732     {  0, 14,  5,16381},     {  0, 20,  5,1048573},
733     {  0,  2,  5,    1},     { 16,  7,  4,  125},
734     {  0, 11,  5, 2045},     {  0, 17,  5,131069},
735     {  0, 22,  5,4194301},   {  0,  4,  5,   13},
736     { 16,  8,  4,  253},     {  0, 13,  5, 8189},
737     {  0, 19,  5,524285},    {  0,  1,  5,    1},
738     { 16,  6,  4,   61},     {  0, 10,  5, 1021},
739     {  0, 16,  5,65533},     {  0, 28,  5,268435453},
740     {  0, 27,  5,134217725}, {  0, 26,  5,67108861},
741     {  0, 25,  5,33554429},  {  0, 24,  5,16777213},
742 };   /* OF_defaultDTable */
743
744
745 /* Default FSE distribution table for Match Lengths */
746 static const ZSTD_seqSymbol ML_defaultDTable[(1<<ML_DEFAULTNORMLOG)+1] = {
747     {  1,  1,  1, ML_DEFAULTNORMLOG},  /* header : fastMode, tableLog */
748     /* nextState, nbAddBits, nbBits, baseVal */
749     {  0,  0,  6,    3},  {  0,  0,  4,    4},
750     { 32,  0,  5,    5},  {  0,  0,  5,    6},
751     {  0,  0,  5,    8},  {  0,  0,  5,    9},
752     {  0,  0,  5,   11},  {  0,  0,  6,   13},
753     {  0,  0,  6,   16},  {  0,  0,  6,   19},
754     {  0,  0,  6,   22},  {  0,  0,  6,   25},
755     {  0,  0,  6,   28},  {  0,  0,  6,   31},
756     {  0,  0,  6,   34},  {  0,  1,  6,   37},
757     {  0,  1,  6,   41},  {  0,  2,  6,   47},
758     {  0,  3,  6,   59},  {  0,  4,  6,   83},
759     {  0,  7,  6,  131},  {  0,  9,  6,  515},
760     { 16,  0,  4,    4},  {  0,  0,  4,    5},
761     { 32,  0,  5,    6},  {  0,  0,  5,    7},
762     { 32,  0,  5,    9},  {  0,  0,  5,   10},
763     {  0,  0,  6,   12},  {  0,  0,  6,   15},
764     {  0,  0,  6,   18},  {  0,  0,  6,   21},
765     {  0,  0,  6,   24},  {  0,  0,  6,   27},
766     {  0,  0,  6,   30},  {  0,  0,  6,   33},
767     {  0,  1,  6,   35},  {  0,  1,  6,   39},
768     {  0,  2,  6,   43},  {  0,  3,  6,   51},
769     {  0,  4,  6,   67},  {  0,  5,  6,   99},
770     {  0,  8,  6,  259},  { 32,  0,  4,    4},
771     { 48,  0,  4,    4},  { 16,  0,  4,    5},
772     { 32,  0,  5,    7},  { 32,  0,  5,    8},
773     { 32,  0,  5,   10},  { 32,  0,  5,   11},
774     {  0,  0,  6,   14},  {  0,  0,  6,   17},
775     {  0,  0,  6,   20},  {  0,  0,  6,   23},
776     {  0,  0,  6,   26},  {  0,  0,  6,   29},
777     {  0,  0,  6,   32},  {  0, 16,  6,65539},
778     {  0, 15,  6,32771},  {  0, 14,  6,16387},
779     {  0, 13,  6, 8195},  {  0, 12,  6, 4099},
780     {  0, 11,  6, 2051},  {  0, 10,  6, 1027},
781 };   /* ML_defaultDTable */
782
783
784 static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddBits)
785 {
786     void* ptr = dt;
787     ZSTD_seqSymbol_header* const DTableH = (ZSTD_seqSymbol_header*)ptr;
788     ZSTD_seqSymbol* const cell = dt + 1;
789
790     DTableH->tableLog = 0;
791     DTableH->fastMode = 0;
792
793     cell->nbBits = 0;
794     cell->nextState = 0;
795     assert(nbAddBits < 255);
796     cell->nbAdditionalBits = (BYTE)nbAddBits;
797     cell->baseValue = baseValue;
798 }
799
800
801 /* ZSTD_buildFSETable() :
802  * generate FSE decoding table for one symbol (ll, ml or off) */
803 static void
804 ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
805     const short* normalizedCounter, unsigned maxSymbolValue,
806     const U32* baseValue, const U32* nbAdditionalBits,
807     unsigned tableLog)
808 {
809     ZSTD_seqSymbol* const tableDecode = dt+1;
810     U16 symbolNext[MaxSeq+1];
811
812     U32 const maxSV1 = maxSymbolValue + 1;
813     U32 const tableSize = 1 << tableLog;
814     U32 highThreshold = tableSize-1;
815
816     /* Sanity Checks */
817     assert(maxSymbolValue <= MaxSeq);
818     assert(tableLog <= MaxFSELog);
819
820     /* Init, lay down lowprob symbols */
821     {   ZSTD_seqSymbol_header DTableH;
822         DTableH.tableLog = tableLog;
823         DTableH.fastMode = 1;
824         {   S16 const largeLimit= (S16)(1 << (tableLog-1));
825             U32 s;
826             for (s=0; s<maxSV1; s++) {
827                 if (normalizedCounter[s]==-1) {
828                     tableDecode[highThreshold--].baseValue = s;
829                     symbolNext[s] = 1;
830                 } else {
831                     if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
832                     symbolNext[s] = normalizedCounter[s];
833         }   }   }
834         memcpy(dt, &DTableH, sizeof(DTableH));
835     }
836
837     /* Spread symbols */
838     {   U32 const tableMask = tableSize-1;
839         U32 const step = FSE_TABLESTEP(tableSize);
840         U32 s, position = 0;
841         for (s=0; s<maxSV1; s++) {
842             int i;
843             for (i=0; i<normalizedCounter[s]; i++) {
844                 tableDecode[position].baseValue = s;
845                 position = (position + step) & tableMask;
846                 while (position > highThreshold) position = (position + step) & tableMask;   /* lowprob area */
847         }   }
848         assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
849     }
850
851     /* Build Decoding table */
852     {   U32 u;
853         for (u=0; u<tableSize; u++) {
854             U32 const symbol = tableDecode[u].baseValue;
855             U32 const nextState = symbolNext[symbol]++;
856             tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) );
857             tableDecode[u].nextState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
858             assert(nbAdditionalBits[symbol] < 255);
859             tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
860             tableDecode[u].baseValue = baseValue[symbol];
861     }   }
862 }
863
864
865 /*! ZSTD_buildSeqTable() :
866  * @return : nb bytes read from src,
867  *           or an error code if it fails */
868 static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymbol** DTablePtr,
869                                  symbolEncodingType_e type, U32 max, U32 maxLog,
870                                  const void* src, size_t srcSize,
871                                  const U32* baseValue, const U32* nbAdditionalBits,
872                                  const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable)
873 {
874     switch(type)
875     {
876     case set_rle :
877         if (!srcSize) return ERROR(srcSize_wrong);
878         if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
879         {   U32 const symbol = *(const BYTE*)src;
880             U32 const baseline = baseValue[symbol];
881             U32 const nbBits = nbAdditionalBits[symbol];
882             ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits);
883         }
884         *DTablePtr = DTableSpace;
885         return 1;
886     case set_basic :
887         *DTablePtr = defaultTable;
888         return 0;
889     case set_repeat:
890         if (!flagRepeatTable) return ERROR(corruption_detected);
891         return 0;
892     case set_compressed :
893         {   U32 tableLog;
894             S16 norm[MaxSeq+1];
895             size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
896             if (FSE_isError(headerSize)) return ERROR(corruption_detected);
897             if (tableLog > maxLog) return ERROR(corruption_detected);
898             ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
899             *DTablePtr = DTableSpace;
900             return headerSize;
901         }
902     default :   /* impossible */
903         assert(0);
904         return ERROR(GENERIC);
905     }
906 }
907
908 static const U32 LL_base[MaxLL+1] = {
909                  0,    1,    2,     3,     4,     5,     6,      7,
910                  8,    9,   10,    11,    12,    13,    14,     15,
911                 16,   18,   20,    22,    24,    28,    32,     40,
912                 48,   64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
913                 0x2000, 0x4000, 0x8000, 0x10000 };
914
915 static const U32 OF_base[MaxOff+1] = {
916                  0,        1,       1,       5,     0xD,     0x1D,     0x3D,     0x7D,
917                  0xFD,   0x1FD,   0x3FD,   0x7FD,   0xFFD,   0x1FFD,   0x3FFD,   0x7FFD,
918                  0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
919                  0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
920
921 static const U32 OF_bits[MaxOff+1] = {
922                      0,  1,  2,  3,  4,  5,  6,  7,
923                      8,  9, 10, 11, 12, 13, 14, 15,
924                     16, 17, 18, 19, 20, 21, 22, 23,
925                     24, 25, 26, 27, 28, 29, 30, 31 };
926
927 static const U32 ML_base[MaxML+1] = {
928                      3,  4,  5,    6,     7,     8,     9,    10,
929                     11, 12, 13,   14,    15,    16,    17,    18,
930                     19, 20, 21,   22,    23,    24,    25,    26,
931                     27, 28, 29,   30,    31,    32,    33,    34,
932                     35, 37, 39,   41,    43,    47,    51,    59,
933                     67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803,
934                     0x1003, 0x2003, 0x4003, 0x8003, 0x10003 };
935
936
937 size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
938                              const void* src, size_t srcSize)
939 {
940     const BYTE* const istart = (const BYTE* const)src;
941     const BYTE* const iend = istart + srcSize;
942     const BYTE* ip = istart;
943     DEBUGLOG(5, "ZSTD_decodeSeqHeaders");
944
945     /* check */
946     if (srcSize < MIN_SEQUENCES_SIZE) return ERROR(srcSize_wrong);
947
948     /* SeqHead */
949     {   int nbSeq = *ip++;
950         if (!nbSeq) { *nbSeqPtr=0; return 1; }
951         if (nbSeq > 0x7F) {
952             if (nbSeq == 0xFF) {
953                 if (ip+2 > iend) return ERROR(srcSize_wrong);
954                 nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
955             } else {
956                 if (ip >= iend) return ERROR(srcSize_wrong);
957                 nbSeq = ((nbSeq-0x80)<<8) + *ip++;
958             }
959         }
960         *nbSeqPtr = nbSeq;
961     }
962
963     /* FSE table descriptors */
964     if (ip+4 > iend) return ERROR(srcSize_wrong); /* minimum possible size */
965     {   symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
966         symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
967         symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
968         ip++;
969
970         /* Build DTables */
971         {   size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr,
972                                                       LLtype, MaxLL, LLFSELog,
973                                                       ip, iend-ip,
974                                                       LL_base, LL_bits,
975                                                       LL_defaultDTable, dctx->fseEntropy);
976             if (ZSTD_isError(llhSize)) return ERROR(corruption_detected);
977             ip += llhSize;
978         }
979
980         {   size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr,
981                                                       OFtype, MaxOff, OffFSELog,
982                                                       ip, iend-ip,
983                                                       OF_base, OF_bits,
984                                                       OF_defaultDTable, dctx->fseEntropy);
985             if (ZSTD_isError(ofhSize)) return ERROR(corruption_detected);
986             ip += ofhSize;
987         }
988
989         {   size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr,
990                                                       MLtype, MaxML, MLFSELog,
991                                                       ip, iend-ip,
992                                                       ML_base, ML_bits,
993                                                       ML_defaultDTable, dctx->fseEntropy);
994             if (ZSTD_isError(mlhSize)) return ERROR(corruption_detected);
995             ip += mlhSize;
996         }
997     }
998
999     return ip-istart;
1000 }
1001
1002
1003 typedef struct {
1004     size_t litLength;
1005     size_t matchLength;
1006     size_t offset;
1007     const BYTE* match;
1008 } seq_t;
1009
1010 typedef struct {
1011     size_t state;
1012     const ZSTD_seqSymbol* table;
1013 } ZSTD_fseState;
1014
1015 typedef struct {
1016     BIT_DStream_t DStream;
1017     ZSTD_fseState stateLL;
1018     ZSTD_fseState stateOffb;
1019     ZSTD_fseState stateML;
1020     size_t prevOffset[ZSTD_REP_NUM];
1021     const BYTE* prefixStart;
1022     const BYTE* dictEnd;
1023     size_t pos;
1024 } seqState_t;
1025
1026
1027 FORCE_NOINLINE
1028 size_t ZSTD_execSequenceLast7(BYTE* op,
1029                               BYTE* const oend, seq_t sequence,
1030                               const BYTE** litPtr, const BYTE* const litLimit,
1031                               const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
1032 {
1033     BYTE* const oLitEnd = op + sequence.litLength;
1034     size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1035     BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
1036     BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
1037     const BYTE* const iLitEnd = *litPtr + sequence.litLength;
1038     const BYTE* match = oLitEnd - sequence.offset;
1039
1040     /* check */
1041     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1042     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */
1043     if (oLitEnd <= oend_w) return ERROR(GENERIC);   /* Precondition */
1044
1045     /* copy literals */
1046     if (op < oend_w) {
1047         ZSTD_wildcopy(op, *litPtr, oend_w - op);
1048         *litPtr += oend_w - op;
1049         op = oend_w;
1050     }
1051     while (op < oLitEnd) *op++ = *(*litPtr)++;
1052
1053     /* copy Match */
1054     if (sequence.offset > (size_t)(oLitEnd - base)) {
1055         /* offset beyond prefix */
1056         if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
1057         match = dictEnd - (base-match);
1058         if (match + sequence.matchLength <= dictEnd) {
1059             memmove(oLitEnd, match, sequence.matchLength);
1060             return sequenceLength;
1061         }
1062         /* span extDict & currentPrefixSegment */
1063         {   size_t const length1 = dictEnd - match;
1064             memmove(oLitEnd, match, length1);
1065             op = oLitEnd + length1;
1066             sequence.matchLength -= length1;
1067             match = base;
1068     }   }
1069     while (op < oMatchEnd) *op++ = *match++;
1070     return sequenceLength;
1071 }
1072
1073
1074 HINT_INLINE
1075 size_t ZSTD_execSequence(BYTE* op,
1076                          BYTE* const oend, seq_t sequence,
1077                          const BYTE** litPtr, const BYTE* const litLimit,
1078                          const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
1079 {
1080     BYTE* const oLitEnd = op + sequence.litLength;
1081     size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1082     BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
1083     BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
1084     const BYTE* const iLitEnd = *litPtr + sequence.litLength;
1085     const BYTE* match = oLitEnd - sequence.offset;
1086
1087     /* check */
1088     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1089     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */
1090     if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
1091
1092     /* copy Literals */
1093     ZSTD_copy8(op, *litPtr);
1094     if (sequence.litLength > 8)
1095         ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
1096     op = oLitEnd;
1097     *litPtr = iLitEnd;   /* update for next sequence */
1098
1099     /* copy Match */
1100     if (sequence.offset > (size_t)(oLitEnd - base)) {
1101         /* offset beyond prefix -> go into extDict */
1102         if (sequence.offset > (size_t)(oLitEnd - vBase))
1103             return ERROR(corruption_detected);
1104         match = dictEnd + (match - base);
1105         if (match + sequence.matchLength <= dictEnd) {
1106             memmove(oLitEnd, match, sequence.matchLength);
1107             return sequenceLength;
1108         }
1109         /* span extDict & currentPrefixSegment */
1110         {   size_t const length1 = dictEnd - match;
1111             memmove(oLitEnd, match, length1);
1112             op = oLitEnd + length1;
1113             sequence.matchLength -= length1;
1114             match = base;
1115             if (op > oend_w || sequence.matchLength < MINMATCH) {
1116               U32 i;
1117               for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
1118               return sequenceLength;
1119             }
1120     }   }
1121     /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
1122
1123     /* match within prefix */
1124     if (sequence.offset < 8) {
1125         /* close range match, overlap */
1126         static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */
1127         static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 };   /* subtracted */
1128         int const sub2 = dec64table[sequence.offset];
1129         op[0] = match[0];
1130         op[1] = match[1];
1131         op[2] = match[2];
1132         op[3] = match[3];
1133         match += dec32table[sequence.offset];
1134         ZSTD_copy4(op+4, match);
1135         match -= sub2;
1136     } else {
1137         ZSTD_copy8(op, match);
1138     }
1139     op += 8; match += 8;
1140
1141     if (oMatchEnd > oend-(16-MINMATCH)) {
1142         if (op < oend_w) {
1143             ZSTD_wildcopy(op, match, oend_w - op);
1144             match += oend_w - op;
1145             op = oend_w;
1146         }
1147         while (op < oMatchEnd) *op++ = *match++;
1148     } else {
1149         ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8 */
1150     }
1151     return sequenceLength;
1152 }
1153
1154
1155 HINT_INLINE
1156 size_t ZSTD_execSequenceLong(BYTE* op,
1157                              BYTE* const oend, seq_t sequence,
1158                              const BYTE** litPtr, const BYTE* const litLimit,
1159                              const BYTE* const prefixStart, const BYTE* const dictStart, const BYTE* const dictEnd)
1160 {
1161     BYTE* const oLitEnd = op + sequence.litLength;
1162     size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1163     BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
1164     BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
1165     const BYTE* const iLitEnd = *litPtr + sequence.litLength;
1166     const BYTE* match = sequence.match;
1167
1168     /* check */
1169     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1170     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */
1171     if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd);
1172
1173     /* copy Literals */
1174     ZSTD_copy8(op, *litPtr);  /* note : op <= oLitEnd <= oend_w == oend - 8 */
1175     if (sequence.litLength > 8)
1176         ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
1177     op = oLitEnd;
1178     *litPtr = iLitEnd;   /* update for next sequence */
1179
1180     /* copy Match */
1181     if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
1182         /* offset beyond prefix */
1183         if (sequence.offset > (size_t)(oLitEnd - dictStart)) return ERROR(corruption_detected);
1184         if (match + sequence.matchLength <= dictEnd) {
1185             memmove(oLitEnd, match, sequence.matchLength);
1186             return sequenceLength;
1187         }
1188         /* span extDict & currentPrefixSegment */
1189         {   size_t const length1 = dictEnd - match;
1190             memmove(oLitEnd, match, length1);
1191             op = oLitEnd + length1;
1192             sequence.matchLength -= length1;
1193             match = prefixStart;
1194             if (op > oend_w || sequence.matchLength < MINMATCH) {
1195               U32 i;
1196               for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
1197               return sequenceLength;
1198             }
1199     }   }
1200     assert(op <= oend_w);
1201     assert(sequence.matchLength >= MINMATCH);
1202
1203     /* match within prefix */
1204     if (sequence.offset < 8) {
1205         /* close range match, overlap */
1206         static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */
1207         static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 };   /* subtracted */
1208         int const sub2 = dec64table[sequence.offset];
1209         op[0] = match[0];
1210         op[1] = match[1];
1211         op[2] = match[2];
1212         op[3] = match[3];
1213         match += dec32table[sequence.offset];
1214         ZSTD_copy4(op+4, match);
1215         match -= sub2;
1216     } else {
1217         ZSTD_copy8(op, match);
1218     }
1219     op += 8; match += 8;
1220
1221     if (oMatchEnd > oend-(16-MINMATCH)) {
1222         if (op < oend_w) {
1223             ZSTD_wildcopy(op, match, oend_w - op);
1224             match += oend_w - op;
1225             op = oend_w;
1226         }
1227         while (op < oMatchEnd) *op++ = *match++;
1228     } else {
1229         ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8 */
1230     }
1231     return sequenceLength;
1232 }
1233
1234 static void
1235 ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt)
1236 {
1237     const void* ptr = dt;
1238     const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr;
1239     DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
1240     DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits",
1241                 (U32)DStatePtr->state, DTableH->tableLog);
1242     BIT_reloadDStream(bitD);
1243     DStatePtr->table = dt + 1;
1244 }
1245
1246 FORCE_INLINE_TEMPLATE void
1247 ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD)
1248 {
1249     ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state];
1250     U32 const nbBits = DInfo.nbBits;
1251     size_t const lowBits = BIT_readBits(bitD, nbBits);
1252     DStatePtr->state = DInfo.nextState + lowBits;
1253 }
1254
1255 /* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum
1256  * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1)
1257  * bits before reloading. This value is the maximum number of bytes we read
1258  * after reloading when we are decoding long offets.
1259  */
1260 #define LONG_OFFSETS_MAX_EXTRA_BITS_32                       \
1261     (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32       \
1262         ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32  \
1263         : 0)
1264
1265 typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
1266
1267 FORCE_INLINE_TEMPLATE seq_t
1268 ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
1269 {
1270     seq_t seq;
1271     U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
1272     U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
1273     U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
1274     U32 const totalBits = llBits+mlBits+ofBits;
1275     U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
1276     U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
1277     U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
1278
1279     /* sequence */
1280     {   size_t offset;
1281         if (!ofBits)
1282             offset = 0;
1283         else {
1284             ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
1285             ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
1286             assert(ofBits <= MaxOff);
1287             if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) {
1288                 U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed);
1289                 offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
1290                 BIT_reloadDStream(&seqState->DStream);
1291                 if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
1292                 assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32);   /* to avoid another reload */
1293             } else {
1294                 offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/);   /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
1295                 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
1296             }
1297         }
1298
1299         if (ofBits <= 1) {
1300             offset += (llBase==0);
1301             if (offset) {
1302                 size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
1303                 temp += !temp;   /* 0 is not valid; input is corrupted; force offset to 1 */
1304                 if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
1305                 seqState->prevOffset[1] = seqState->prevOffset[0];
1306                 seqState->prevOffset[0] = offset = temp;
1307             } else {  /* offset == 0 */
1308                 offset = seqState->prevOffset[0];
1309             }
1310         } else {
1311             seqState->prevOffset[2] = seqState->prevOffset[1];
1312             seqState->prevOffset[1] = seqState->prevOffset[0];
1313             seqState->prevOffset[0] = offset;
1314         }
1315         seq.offset = offset;
1316     }
1317
1318     seq.matchLength = mlBase
1319                     + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/) : 0);  /* <=  16 bits */
1320     if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
1321         BIT_reloadDStream(&seqState->DStream);
1322     if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
1323         BIT_reloadDStream(&seqState->DStream);
1324     /* Ensure there are enough bits to read the rest of data in 64-bit mode. */
1325     ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
1326
1327     seq.litLength = llBase
1328                   + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits/*>0*/) : 0);    /* <=  16 bits */
1329     if (MEM_32bits())
1330         BIT_reloadDStream(&seqState->DStream);
1331
1332     DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u",
1333                 (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset);
1334
1335     /* ANS state update */
1336     ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream);    /* <=  9 bits */
1337     ZSTD_updateFseState(&seqState->stateML, &seqState->DStream);    /* <=  9 bits */
1338     if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);    /* <= 18 bits */
1339     ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream);  /* <=  8 bits */
1340
1341     return seq;
1342 }
1343
1344 FORCE_INLINE_TEMPLATE size_t
1345 ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
1346                                void* dst, size_t maxDstSize,
1347                          const void* seqStart, size_t seqSize, int nbSeq,
1348                          const ZSTD_longOffset_e isLongOffset)
1349 {
1350     const BYTE* ip = (const BYTE*)seqStart;
1351     const BYTE* const iend = ip + seqSize;
1352     BYTE* const ostart = (BYTE* const)dst;
1353     BYTE* const oend = ostart + maxDstSize;
1354     BYTE* op = ostart;
1355     const BYTE* litPtr = dctx->litPtr;
1356     const BYTE* const litEnd = litPtr + dctx->litSize;
1357     const BYTE* const base = (const BYTE*) (dctx->base);
1358     const BYTE* const vBase = (const BYTE*) (dctx->vBase);
1359     const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
1360     DEBUGLOG(5, "ZSTD_decompressSequences");
1361
1362     /* Regen sequences */
1363     if (nbSeq) {
1364         seqState_t seqState;
1365         dctx->fseEntropy = 1;
1366         { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
1367         CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
1368         ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
1369         ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
1370         ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
1371
1372         for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
1373             nbSeq--;
1374             {   seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
1375                 size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
1376                 DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
1377                 if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
1378                 op += oneSeqSize;
1379         }   }
1380
1381         /* check if reached exact end */
1382         DEBUGLOG(5, "ZSTD_decompressSequences: after decode loop, remaining nbSeq : %i", nbSeq);
1383         if (nbSeq) return ERROR(corruption_detected);
1384         /* save reps for next block */
1385         { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
1386     }
1387
1388     /* last literal segment */
1389     {   size_t const lastLLSize = litEnd - litPtr;
1390         if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
1391         memcpy(op, litPtr, lastLLSize);
1392         op += lastLLSize;
1393     }
1394
1395     return op-ostart;
1396 }
1397
1398 static size_t
1399 ZSTD_decompressSequences_default(ZSTD_DCtx* dctx,
1400                                  void* dst, size_t maxDstSize,
1401                            const void* seqStart, size_t seqSize, int nbSeq,
1402                            const ZSTD_longOffset_e isLongOffset)
1403 {
1404     return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1405 }
1406
1407
1408
1409 FORCE_INLINE_TEMPLATE seq_t
1410 ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
1411 {
1412     seq_t seq;
1413     U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
1414     U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
1415     U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
1416     U32 const totalBits = llBits+mlBits+ofBits;
1417     U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
1418     U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
1419     U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
1420
1421     /* sequence */
1422     {   size_t offset;
1423         if (!ofBits)
1424             offset = 0;
1425         else {
1426             ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
1427             ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
1428             assert(ofBits <= MaxOff);
1429             if (MEM_32bits() && longOffsets) {
1430                 U32 const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN_32-1);
1431                 offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
1432                 if (MEM_32bits() || extraBits) BIT_reloadDStream(&seqState->DStream);
1433                 if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
1434             } else {
1435                 offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits);   /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
1436                 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
1437             }
1438         }
1439
1440         if (ofBits <= 1) {
1441             offset += (llBase==0);
1442             if (offset) {
1443                 size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
1444                 temp += !temp;   /* 0 is not valid; input is corrupted; force offset to 1 */
1445                 if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
1446                 seqState->prevOffset[1] = seqState->prevOffset[0];
1447                 seqState->prevOffset[0] = offset = temp;
1448             } else {
1449                 offset = seqState->prevOffset[0];
1450             }
1451         } else {
1452             seqState->prevOffset[2] = seqState->prevOffset[1];
1453             seqState->prevOffset[1] = seqState->prevOffset[0];
1454             seqState->prevOffset[0] = offset;
1455         }
1456         seq.offset = offset;
1457     }
1458
1459     seq.matchLength = mlBase + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0);  /* <=  16 bits */
1460     if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
1461         BIT_reloadDStream(&seqState->DStream);
1462     if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
1463         BIT_reloadDStream(&seqState->DStream);
1464     /* Verify that there is enough bits to read the rest of the data in 64-bit mode. */
1465     ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
1466
1467     seq.litLength = llBase + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0);    /* <=  16 bits */
1468     if (MEM_32bits())
1469         BIT_reloadDStream(&seqState->DStream);
1470
1471     {   size_t const pos = seqState->pos + seq.litLength;
1472         const BYTE* const matchBase = (seq.offset > pos) ? seqState->dictEnd : seqState->prefixStart;
1473         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.
1474                                                     * No consequence though : no memory access will occur, overly large offset will be detected in ZSTD_execSequenceLong() */
1475         seqState->pos = pos + seq.matchLength;
1476     }
1477
1478     /* ANS state update */
1479     ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream);    /* <=  9 bits */
1480     ZSTD_updateFseState(&seqState->stateML, &seqState->DStream);    /* <=  9 bits */
1481     if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);    /* <= 18 bits */
1482     ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream);  /* <=  8 bits */
1483
1484     return seq;
1485 }
1486
1487 FORCE_INLINE_TEMPLATE size_t
1488 ZSTD_decompressSequencesLong_body(
1489                                ZSTD_DCtx* dctx,
1490                                void* dst, size_t maxDstSize,
1491                          const void* seqStart, size_t seqSize, int nbSeq,
1492                          const ZSTD_longOffset_e isLongOffset)
1493 {
1494     const BYTE* ip = (const BYTE*)seqStart;
1495     const BYTE* const iend = ip + seqSize;
1496     BYTE* const ostart = (BYTE* const)dst;
1497     BYTE* const oend = ostart + maxDstSize;
1498     BYTE* op = ostart;
1499     const BYTE* litPtr = dctx->litPtr;
1500     const BYTE* const litEnd = litPtr + dctx->litSize;
1501     const BYTE* const prefixStart = (const BYTE*) (dctx->base);
1502     const BYTE* const dictStart = (const BYTE*) (dctx->vBase);
1503     const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
1504
1505     /* Regen sequences */
1506     if (nbSeq) {
1507 #define STORED_SEQS 4
1508 #define STOSEQ_MASK (STORED_SEQS-1)
1509 #define ADVANCED_SEQS 4
1510         seq_t sequences[STORED_SEQS];
1511         int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
1512         seqState_t seqState;
1513         int seqNb;
1514         dctx->fseEntropy = 1;
1515         { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
1516         seqState.prefixStart = prefixStart;
1517         seqState.pos = (size_t)(op-prefixStart);
1518         seqState.dictEnd = dictEnd;
1519         CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
1520         ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
1521         ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
1522         ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
1523
1524         /* prepare in advance */
1525         for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNb<seqAdvance); seqNb++) {
1526             sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
1527         }
1528         if (seqNb<seqAdvance) return ERROR(corruption_detected);
1529
1530         /* decode and decompress */
1531         for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb<nbSeq) ; seqNb++) {
1532             seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
1533             size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
1534             if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
1535             PREFETCH(sequence.match);  /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
1536             sequences[seqNb&STOSEQ_MASK] = sequence;
1537             op += oneSeqSize;
1538         }
1539         if (seqNb<nbSeq) return ERROR(corruption_detected);
1540
1541         /* finish queue */
1542         seqNb -= seqAdvance;
1543         for ( ; seqNb<nbSeq ; seqNb++) {
1544             size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
1545             if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
1546             op += oneSeqSize;
1547         }
1548
1549         /* save reps for next block */
1550         { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
1551 #undef STORED_SEQS
1552 #undef STOSEQ_MASK
1553 #undef ADVANCED_SEQS
1554     }
1555
1556     /* last literal segment */
1557     {   size_t const lastLLSize = litEnd - litPtr;
1558         if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
1559         memcpy(op, litPtr, lastLLSize);
1560         op += lastLLSize;
1561     }
1562
1563     return op-ostart;
1564 }
1565
1566 static size_t
1567 ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx,
1568                                  void* dst, size_t maxDstSize,
1569                            const void* seqStart, size_t seqSize, int nbSeq,
1570                            const ZSTD_longOffset_e isLongOffset)
1571 {
1572     return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1573 }
1574
1575
1576
1577 #if DYNAMIC_BMI2
1578
1579 static TARGET_ATTRIBUTE("bmi2") size_t
1580 ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
1581                                  void* dst, size_t maxDstSize,
1582                            const void* seqStart, size_t seqSize, int nbSeq,
1583                            const ZSTD_longOffset_e isLongOffset)
1584 {
1585     return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1586 }
1587
1588 static TARGET_ATTRIBUTE("bmi2") size_t
1589 ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
1590                                  void* dst, size_t maxDstSize,
1591                            const void* seqStart, size_t seqSize, int nbSeq,
1592                            const ZSTD_longOffset_e isLongOffset)
1593 {
1594     return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1595 }
1596
1597 #endif
1598
1599 typedef size_t (*ZSTD_decompressSequences_t)(
1600     ZSTD_DCtx *dctx, void *dst, size_t maxDstSize,
1601     const void *seqStart, size_t seqSize, int nbSeq,
1602     const ZSTD_longOffset_e isLongOffset);
1603
1604 static size_t ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
1605                                 const void* seqStart, size_t seqSize, int nbSeq,
1606                                 const ZSTD_longOffset_e isLongOffset)
1607 {
1608     DEBUGLOG(5, "ZSTD_decompressSequences");
1609 #if DYNAMIC_BMI2
1610     if (dctx->bmi2) {
1611         return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1612     }
1613 #endif
1614   return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1615 }
1616
1617 static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx,
1618                                 void* dst, size_t maxDstSize,
1619                                 const void* seqStart, size_t seqSize, int nbSeq,
1620                                 const ZSTD_longOffset_e isLongOffset)
1621 {
1622     DEBUGLOG(5, "ZSTD_decompressSequencesLong");
1623 #if DYNAMIC_BMI2
1624     if (dctx->bmi2) {
1625         return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1626     }
1627 #endif
1628   return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1629 }
1630
1631 /* ZSTD_getLongOffsetsShare() :
1632  * condition : offTable must be valid
1633  * @return : "share" of long offsets (arbitrarily defined as > (1<<23))
1634  *           compared to maximum possible of (1<<OffFSELog) */
1635 static unsigned
1636 ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable)
1637 {
1638     const void* ptr = offTable;
1639     U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog;
1640     const ZSTD_seqSymbol* table = offTable + 1;
1641     U32 const max = 1 << tableLog;
1642     U32 u, total = 0;
1643     DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog);
1644
1645     assert(max <= (1 << OffFSELog));  /* max not too large */
1646     for (u=0; u<max; u++) {
1647         if (table[u].nbAdditionalBits > 22) total += 1;
1648     }
1649
1650     assert(tableLog <= OffFSELog);
1651     total <<= (OffFSELog - tableLog);  /* scale to OffFSELog */
1652
1653     return total;
1654 }
1655
1656
1657 static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
1658                             void* dst, size_t dstCapacity,
1659                       const void* src, size_t srcSize, const int frame)
1660 {   /* blockType == blockCompressed */
1661     const BYTE* ip = (const BYTE*)src;
1662     /* isLongOffset must be true if there are long offsets.
1663      * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN.
1664      * We don't expect that to be the case in 64-bit mode.
1665      * In block mode, window size is not known, so we have to be conservative. (note: but it could be evaluated from current-lowLimit)
1666      */
1667     ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN)));
1668     DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize);
1669
1670     if (srcSize >= ZSTD_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
1671
1672     /* Decode literals section */
1673     {   size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
1674         DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize);
1675         if (ZSTD_isError(litCSize)) return litCSize;
1676         ip += litCSize;
1677         srcSize -= litCSize;
1678     }
1679
1680     /* Build Decoding Tables */
1681     {   int nbSeq;
1682         size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
1683         if (ZSTD_isError(seqHSize)) return seqHSize;
1684         ip += seqHSize;
1685         srcSize -= seqHSize;
1686
1687         if ( (!frame || dctx->fParams.windowSize > (1<<24))
1688           && (nbSeq>0) ) {  /* could probably use a larger nbSeq limit */
1689             U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr);
1690             U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
1691             if (shareLongOffsets >= minShare)
1692                 return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
1693         }
1694
1695         return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
1696     }
1697 }
1698
1699
1700 static void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst)
1701 {
1702     if (dst != dctx->previousDstEnd) {   /* not contiguous */
1703         dctx->dictEnd = dctx->previousDstEnd;
1704         dctx->vBase = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
1705         dctx->base = dst;
1706         dctx->previousDstEnd = dst;
1707     }
1708 }
1709
1710 size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
1711                             void* dst, size_t dstCapacity,
1712                       const void* src, size_t srcSize)
1713 {
1714     size_t dSize;
1715     ZSTD_checkContinuity(dctx, dst);
1716     dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0);
1717     dctx->previousDstEnd = (char*)dst + dSize;
1718     return dSize;
1719 }
1720
1721
1722 /** ZSTD_insertBlock() :
1723     insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
1724 ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize)
1725 {
1726     ZSTD_checkContinuity(dctx, blockStart);
1727     dctx->previousDstEnd = (const char*)blockStart + blockSize;
1728     return blockSize;
1729 }
1730
1731
1732 static size_t ZSTD_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t length)
1733 {
1734     if (length > dstCapacity) return ERROR(dstSize_tooSmall);
1735     memset(dst, byte, length);
1736     return length;
1737 }
1738
1739 /** ZSTD_findFrameCompressedSize() :
1740  *  compatible with legacy mode
1741  *  `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame
1742  *  `srcSize` must be at least as large as the frame contained
1743  *  @return : the compressed size of the frame starting at `src` */
1744 size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
1745 {
1746 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
1747     if (ZSTD_isLegacy(src, srcSize))
1748         return ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
1749 #endif
1750     if ( (srcSize >= ZSTD_skippableHeaderSize)
1751       && (MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START ) {
1752         return ZSTD_skippableHeaderSize + MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize);
1753     } else {
1754         const BYTE* ip = (const BYTE*)src;
1755         const BYTE* const ipstart = ip;
1756         size_t remainingSize = srcSize;
1757         ZSTD_frameHeader zfh;
1758
1759         /* Extract Frame Header */
1760         {   size_t const ret = ZSTD_getFrameHeader(&zfh, src, srcSize);
1761             if (ZSTD_isError(ret)) return ret;
1762             if (ret > 0) return ERROR(srcSize_wrong);
1763         }
1764
1765         ip += zfh.headerSize;
1766         remainingSize -= zfh.headerSize;
1767
1768         /* Loop on each block */
1769         while (1) {
1770             blockProperties_t blockProperties;
1771             size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
1772             if (ZSTD_isError(cBlockSize)) return cBlockSize;
1773
1774             if (ZSTD_blockHeaderSize + cBlockSize > remainingSize)
1775                 return ERROR(srcSize_wrong);
1776
1777             ip += ZSTD_blockHeaderSize + cBlockSize;
1778             remainingSize -= ZSTD_blockHeaderSize + cBlockSize;
1779
1780             if (blockProperties.lastBlock) break;
1781         }
1782
1783         if (zfh.checksumFlag) {   /* Final frame content checksum */
1784             if (remainingSize < 4) return ERROR(srcSize_wrong);
1785             ip += 4;
1786             remainingSize -= 4;
1787         }
1788
1789         return ip - ipstart;
1790     }
1791 }
1792
1793 /*! ZSTD_decompressFrame() :
1794 *   @dctx must be properly initialized */
1795 static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
1796                                    void* dst, size_t dstCapacity,
1797                              const void** srcPtr, size_t *srcSizePtr)
1798 {
1799     const BYTE* ip = (const BYTE*)(*srcPtr);
1800     BYTE* const ostart = (BYTE* const)dst;
1801     BYTE* const oend = ostart + dstCapacity;
1802     BYTE* op = ostart;
1803     size_t remainingSize = *srcSizePtr;
1804
1805     /* check */
1806     if (remainingSize < ZSTD_frameHeaderSize_min+ZSTD_blockHeaderSize)
1807         return ERROR(srcSize_wrong);
1808
1809     /* Frame Header */
1810     {   size_t const frameHeaderSize = ZSTD_frameHeaderSize(ip, ZSTD_frameHeaderSize_prefix);
1811         if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
1812         if (remainingSize < frameHeaderSize+ZSTD_blockHeaderSize)
1813             return ERROR(srcSize_wrong);
1814         CHECK_F( ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize) );
1815         ip += frameHeaderSize; remainingSize -= frameHeaderSize;
1816     }
1817
1818     /* Loop on each block */
1819     while (1) {
1820         size_t decodedSize;
1821         blockProperties_t blockProperties;
1822         size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
1823         if (ZSTD_isError(cBlockSize)) return cBlockSize;
1824
1825         ip += ZSTD_blockHeaderSize;
1826         remainingSize -= ZSTD_blockHeaderSize;
1827         if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
1828
1829         switch(blockProperties.blockType)
1830         {
1831         case bt_compressed:
1832             decodedSize = ZSTD_decompressBlock_internal(dctx, op, oend-op, ip, cBlockSize, /* frame */ 1);
1833             break;
1834         case bt_raw :
1835             decodedSize = ZSTD_copyRawBlock(op, oend-op, ip, cBlockSize);
1836             break;
1837         case bt_rle :
1838             decodedSize = ZSTD_generateNxBytes(op, oend-op, *ip, blockProperties.origSize);
1839             break;
1840         case bt_reserved :
1841         default:
1842             return ERROR(corruption_detected);
1843         }
1844
1845         if (ZSTD_isError(decodedSize)) return decodedSize;
1846         if (dctx->fParams.checksumFlag)
1847             XXH64_update(&dctx->xxhState, op, decodedSize);
1848         op += decodedSize;
1849         ip += cBlockSize;
1850         remainingSize -= cBlockSize;
1851         if (blockProperties.lastBlock) break;
1852     }
1853
1854     if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) {
1855         if ((U64)(op-ostart) != dctx->fParams.frameContentSize) {
1856             return ERROR(corruption_detected);
1857     }   }
1858     if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */
1859         U32 const checkCalc = (U32)XXH64_digest(&dctx->xxhState);
1860         U32 checkRead;
1861         if (remainingSize<4) return ERROR(checksum_wrong);
1862         checkRead = MEM_readLE32(ip);
1863         if (checkRead != checkCalc) return ERROR(checksum_wrong);
1864         ip += 4;
1865         remainingSize -= 4;
1866     }
1867
1868     /* Allow caller to get size read */
1869     *srcPtr = ip;
1870     *srcSizePtr = remainingSize;
1871     return op-ostart;
1872 }
1873
1874 static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict);
1875 static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict);
1876
1877 static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
1878                                         void* dst, size_t dstCapacity,
1879                                   const void* src, size_t srcSize,
1880                                   const void* dict, size_t dictSize,
1881                                   const ZSTD_DDict* ddict)
1882 {
1883     void* const dststart = dst;
1884     assert(dict==NULL || ddict==NULL);  /* either dict or ddict set, not both */
1885
1886     if (ddict) {
1887         dict = ZSTD_DDictDictContent(ddict);
1888         dictSize = ZSTD_DDictDictSize(ddict);
1889     }
1890
1891     while (srcSize >= ZSTD_frameHeaderSize_prefix) {
1892         U32 magicNumber;
1893
1894 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
1895         if (ZSTD_isLegacy(src, srcSize)) {
1896             size_t decodedSize;
1897             size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
1898             if (ZSTD_isError(frameSize)) return frameSize;
1899             /* legacy support is not compatible with static dctx */
1900             if (dctx->staticSize) return ERROR(memory_allocation);
1901
1902             decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize);
1903
1904             dst = (BYTE*)dst + decodedSize;
1905             dstCapacity -= decodedSize;
1906
1907             src = (const BYTE*)src + frameSize;
1908             srcSize -= frameSize;
1909
1910             continue;
1911         }
1912 #endif
1913
1914         magicNumber = MEM_readLE32(src);
1915         DEBUGLOG(4, "reading magic number %08X (expecting %08X)",
1916                     (U32)magicNumber, (U32)ZSTD_MAGICNUMBER);
1917         if (magicNumber != ZSTD_MAGICNUMBER) {
1918             if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
1919                 size_t skippableSize;
1920                 if (srcSize < ZSTD_skippableHeaderSize)
1921                     return ERROR(srcSize_wrong);
1922                 skippableSize = MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize)
1923                               + ZSTD_skippableHeaderSize;
1924                 if (srcSize < skippableSize) return ERROR(srcSize_wrong);
1925
1926                 src = (const BYTE *)src + skippableSize;
1927                 srcSize -= skippableSize;
1928                 continue;
1929             }
1930             return ERROR(prefix_unknown);
1931         }
1932
1933         if (ddict) {
1934             /* we were called from ZSTD_decompress_usingDDict */
1935             CHECK_F(ZSTD_decompressBegin_usingDDict(dctx, ddict));
1936         } else {
1937             /* this will initialize correctly with no dict if dict == NULL, so
1938              * use this in all cases but ddict */
1939             CHECK_F(ZSTD_decompressBegin_usingDict(dctx, dict, dictSize));
1940         }
1941         ZSTD_checkContinuity(dctx, dst);
1942
1943         {   const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity,
1944                                                     &src, &srcSize);
1945             if (ZSTD_isError(res)) return res;
1946             /* no need to bound check, ZSTD_decompressFrame already has */
1947             dst = (BYTE*)dst + res;
1948             dstCapacity -= res;
1949         }
1950     }  /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */
1951
1952     if (srcSize) return ERROR(srcSize_wrong); /* input not entirely consumed */
1953
1954     return (BYTE*)dst - (BYTE*)dststart;
1955 }
1956
1957 size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
1958                                  void* dst, size_t dstCapacity,
1959                            const void* src, size_t srcSize,
1960                            const void* dict, size_t dictSize)
1961 {
1962     return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, dict, dictSize, NULL);
1963 }
1964
1965
1966 size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
1967 {
1968     return ZSTD_decompress_usingDict(dctx, dst, dstCapacity, src, srcSize, NULL, 0);
1969 }
1970
1971
1972 size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
1973 {
1974 #if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1)
1975     size_t regenSize;
1976     ZSTD_DCtx* const dctx = ZSTD_createDCtx();
1977     if (dctx==NULL) return ERROR(memory_allocation);
1978     regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize);
1979     ZSTD_freeDCtx(dctx);
1980     return regenSize;
1981 #else   /* stack mode */
1982     ZSTD_DCtx dctx;
1983     return ZSTD_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize);
1984 #endif
1985 }
1986
1987
1988 /*-**************************************
1989 *   Advanced Streaming Decompression API
1990 *   Bufferless and synchronous
1991 ****************************************/
1992 size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; }
1993
1994 ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) {
1995     switch(dctx->stage)
1996     {
1997     default:   /* should not happen */
1998         assert(0);
1999     case ZSTDds_getFrameHeaderSize:
2000     case ZSTDds_decodeFrameHeader:
2001         return ZSTDnit_frameHeader;
2002     case ZSTDds_decodeBlockHeader:
2003         return ZSTDnit_blockHeader;
2004     case ZSTDds_decompressBlock:
2005         return ZSTDnit_block;
2006     case ZSTDds_decompressLastBlock:
2007         return ZSTDnit_lastBlock;
2008     case ZSTDds_checkChecksum:
2009         return ZSTDnit_checksum;
2010     case ZSTDds_decodeSkippableHeader:
2011     case ZSTDds_skipFrame:
2012         return ZSTDnit_skippableFrame;
2013     }
2014 }
2015
2016 static int ZSTD_isSkipFrame(ZSTD_DCtx* dctx) { return dctx->stage == ZSTDds_skipFrame; }
2017
2018 /** ZSTD_decompressContinue() :
2019  *  srcSize : must be the exact nb of bytes expected (see ZSTD_nextSrcSizeToDecompress())
2020  *  @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity)
2021  *            or an error code, which can be tested using ZSTD_isError() */
2022 size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
2023 {
2024     DEBUGLOG(5, "ZSTD_decompressContinue (srcSize:%u)", (U32)srcSize);
2025     /* Sanity check */
2026     if (srcSize != dctx->expected) return ERROR(srcSize_wrong);  /* not allowed */
2027     if (dstCapacity) ZSTD_checkContinuity(dctx, dst);
2028
2029     switch (dctx->stage)
2030     {
2031     case ZSTDds_getFrameHeaderSize :
2032         assert(src != NULL);
2033         if (dctx->format == ZSTD_f_zstd1) {  /* allows header */
2034             assert(srcSize >= ZSTD_frameIdSize);  /* to read skippable magic number */
2035             if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {        /* skippable frame */
2036                 memcpy(dctx->headerBuffer, src, srcSize);
2037                 dctx->expected = ZSTD_skippableHeaderSize - srcSize;  /* remaining to load to get full skippable frame header */
2038                 dctx->stage = ZSTDds_decodeSkippableHeader;
2039                 return 0;
2040         }   }
2041         dctx->headerSize = ZSTD_frameHeaderSize_internal(src, srcSize, dctx->format);
2042         if (ZSTD_isError(dctx->headerSize)) return dctx->headerSize;
2043         memcpy(dctx->headerBuffer, src, srcSize);
2044         dctx->expected = dctx->headerSize - srcSize;
2045         dctx->stage = ZSTDds_decodeFrameHeader;
2046         return 0;
2047
2048     case ZSTDds_decodeFrameHeader:
2049         assert(src != NULL);
2050         memcpy(dctx->headerBuffer + (dctx->headerSize - srcSize), src, srcSize);
2051         CHECK_F(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize));
2052         dctx->expected = ZSTD_blockHeaderSize;
2053         dctx->stage = ZSTDds_decodeBlockHeader;
2054         return 0;
2055
2056     case ZSTDds_decodeBlockHeader:
2057         {   blockProperties_t bp;
2058             size_t const cBlockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
2059             if (ZSTD_isError(cBlockSize)) return cBlockSize;
2060             dctx->expected = cBlockSize;
2061             dctx->bType = bp.blockType;
2062             dctx->rleSize = bp.origSize;
2063             if (cBlockSize) {
2064                 dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock;
2065                 return 0;
2066             }
2067             /* empty block */
2068             if (bp.lastBlock) {
2069                 if (dctx->fParams.checksumFlag) {
2070                     dctx->expected = 4;
2071                     dctx->stage = ZSTDds_checkChecksum;
2072                 } else {
2073                     dctx->expected = 0; /* end of frame */
2074                     dctx->stage = ZSTDds_getFrameHeaderSize;
2075                 }
2076             } else {
2077                 dctx->expected = ZSTD_blockHeaderSize;  /* jump to next header */
2078                 dctx->stage = ZSTDds_decodeBlockHeader;
2079             }
2080             return 0;
2081         }
2082
2083     case ZSTDds_decompressLastBlock:
2084     case ZSTDds_decompressBlock:
2085         DEBUGLOG(5, "ZSTD_decompressContinue: case ZSTDds_decompressBlock");
2086         {   size_t rSize;
2087             switch(dctx->bType)
2088             {
2089             case bt_compressed:
2090                 DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed");
2091                 rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1);
2092                 break;
2093             case bt_raw :
2094                 rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize);
2095                 break;
2096             case bt_rle :
2097                 rSize = ZSTD_setRleBlock(dst, dstCapacity, src, srcSize, dctx->rleSize);
2098                 break;
2099             case bt_reserved :   /* should never happen */
2100             default:
2101                 return ERROR(corruption_detected);
2102             }
2103             if (ZSTD_isError(rSize)) return rSize;
2104             DEBUGLOG(5, "ZSTD_decompressContinue: decoded size from block : %u", (U32)rSize);
2105             dctx->decodedSize += rSize;
2106             if (dctx->fParams.checksumFlag) XXH64_update(&dctx->xxhState, dst, rSize);
2107
2108             if (dctx->stage == ZSTDds_decompressLastBlock) {   /* end of frame */
2109                 DEBUGLOG(4, "ZSTD_decompressContinue: decoded size from frame : %u", (U32)dctx->decodedSize);
2110                 if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) {
2111                     if (dctx->decodedSize != dctx->fParams.frameContentSize) {
2112                         return ERROR(corruption_detected);
2113                 }   }
2114                 if (dctx->fParams.checksumFlag) {  /* another round for frame checksum */
2115                     dctx->expected = 4;
2116                     dctx->stage = ZSTDds_checkChecksum;
2117                 } else {
2118                     dctx->expected = 0;   /* ends here */
2119                     dctx->stage = ZSTDds_getFrameHeaderSize;
2120                 }
2121             } else {
2122                 dctx->stage = ZSTDds_decodeBlockHeader;
2123                 dctx->expected = ZSTD_blockHeaderSize;
2124                 dctx->previousDstEnd = (char*)dst + rSize;
2125             }
2126             return rSize;
2127         }
2128
2129     case ZSTDds_checkChecksum:
2130         assert(srcSize == 4);  /* guaranteed by dctx->expected */
2131         {   U32 const h32 = (U32)XXH64_digest(&dctx->xxhState);
2132             U32 const check32 = MEM_readLE32(src);
2133             DEBUGLOG(4, "ZSTD_decompressContinue: checksum : calculated %08X :: %08X read", h32, check32);
2134             if (check32 != h32) return ERROR(checksum_wrong);
2135             dctx->expected = 0;
2136             dctx->stage = ZSTDds_getFrameHeaderSize;
2137             return 0;
2138         }
2139
2140     case ZSTDds_decodeSkippableHeader:
2141         assert(src != NULL);
2142         assert(srcSize <= ZSTD_skippableHeaderSize);
2143         memcpy(dctx->headerBuffer + (ZSTD_skippableHeaderSize - srcSize), src, srcSize);   /* complete skippable header */
2144         dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_frameIdSize);   /* note : dctx->expected can grow seriously large, beyond local buffer size */
2145         dctx->stage = ZSTDds_skipFrame;
2146         return 0;
2147
2148     case ZSTDds_skipFrame:
2149         dctx->expected = 0;
2150         dctx->stage = ZSTDds_getFrameHeaderSize;
2151         return 0;
2152
2153     default:
2154         return ERROR(GENERIC);   /* impossible */
2155     }
2156 }
2157
2158
2159 static size_t ZSTD_refDictContent(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2160 {
2161     dctx->dictEnd = dctx->previousDstEnd;
2162     dctx->vBase = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
2163     dctx->base = dict;
2164     dctx->previousDstEnd = (const char*)dict + dictSize;
2165     return 0;
2166 }
2167
2168 /* ZSTD_loadEntropy() :
2169  * dict : must point at beginning of a valid zstd dictionary
2170  * @return : size of entropy tables read */
2171 static size_t ZSTD_loadEntropy(ZSTD_entropyDTables_t* entropy, const void* const dict, size_t const dictSize)
2172 {
2173     const BYTE* dictPtr = (const BYTE*)dict;
2174     const BYTE* const dictEnd = dictPtr + dictSize;
2175
2176     if (dictSize <= 8) return ERROR(dictionary_corrupted);
2177     dictPtr += 8;   /* skip header = magic + dictID */
2178
2179
2180     {   size_t const hSize = HUF_readDTableX4_wksp(
2181             entropy->hufTable, dictPtr, dictEnd - dictPtr,
2182             entropy->workspace, sizeof(entropy->workspace));
2183         if (HUF_isError(hSize)) return ERROR(dictionary_corrupted);
2184         dictPtr += hSize;
2185     }
2186
2187     {   short offcodeNCount[MaxOff+1];
2188         U32 offcodeMaxValue = MaxOff, offcodeLog;
2189         size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd-dictPtr);
2190         if (FSE_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
2191         if (offcodeMaxValue > MaxOff) return ERROR(dictionary_corrupted);
2192         if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
2193         ZSTD_buildFSETable(entropy->OFTable,
2194                             offcodeNCount, offcodeMaxValue,
2195                             OF_base, OF_bits,
2196                             offcodeLog);
2197         dictPtr += offcodeHeaderSize;
2198     }
2199
2200     {   short matchlengthNCount[MaxML+1];
2201         unsigned matchlengthMaxValue = MaxML, matchlengthLog;
2202         size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd-dictPtr);
2203         if (FSE_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
2204         if (matchlengthMaxValue > MaxML) return ERROR(dictionary_corrupted);
2205         if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
2206         ZSTD_buildFSETable(entropy->MLTable,
2207                             matchlengthNCount, matchlengthMaxValue,
2208                             ML_base, ML_bits,
2209                             matchlengthLog);
2210         dictPtr += matchlengthHeaderSize;
2211     }
2212
2213     {   short litlengthNCount[MaxLL+1];
2214         unsigned litlengthMaxValue = MaxLL, litlengthLog;
2215         size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd-dictPtr);
2216         if (FSE_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
2217         if (litlengthMaxValue > MaxLL) return ERROR(dictionary_corrupted);
2218         if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
2219         ZSTD_buildFSETable(entropy->LLTable,
2220                             litlengthNCount, litlengthMaxValue,
2221                             LL_base, LL_bits,
2222                             litlengthLog);
2223         dictPtr += litlengthHeaderSize;
2224     }
2225
2226     if (dictPtr+12 > dictEnd) return ERROR(dictionary_corrupted);
2227     {   int i;
2228         size_t const dictContentSize = (size_t)(dictEnd - (dictPtr+12));
2229         for (i=0; i<3; i++) {
2230             U32 const rep = MEM_readLE32(dictPtr); dictPtr += 4;
2231             if (rep==0 || rep >= dictContentSize) return ERROR(dictionary_corrupted);
2232             entropy->rep[i] = rep;
2233     }   }
2234
2235     return dictPtr - (const BYTE*)dict;
2236 }
2237
2238 static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2239 {
2240     if (dictSize < 8) return ZSTD_refDictContent(dctx, dict, dictSize);
2241     {   U32 const magic = MEM_readLE32(dict);
2242         if (magic != ZSTD_MAGIC_DICTIONARY) {
2243             return ZSTD_refDictContent(dctx, dict, dictSize);   /* pure content mode */
2244     }   }
2245     dctx->dictID = MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
2246
2247     /* load entropy tables */
2248     {   size_t const eSize = ZSTD_loadEntropy(&dctx->entropy, dict, dictSize);
2249         if (ZSTD_isError(eSize)) return ERROR(dictionary_corrupted);
2250         dict = (const char*)dict + eSize;
2251         dictSize -= eSize;
2252     }
2253     dctx->litEntropy = dctx->fseEntropy = 1;
2254
2255     /* reference dictionary content */
2256     return ZSTD_refDictContent(dctx, dict, dictSize);
2257 }
2258
2259 /* Note : this function cannot fail */
2260 size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx)
2261 {
2262     assert(dctx != NULL);
2263     dctx->expected = ZSTD_startingInputLength(dctx->format);  /* dctx->format must be properly set */
2264     dctx->stage = ZSTDds_getFrameHeaderSize;
2265     dctx->decodedSize = 0;
2266     dctx->previousDstEnd = NULL;
2267     dctx->base = NULL;
2268     dctx->vBase = NULL;
2269     dctx->dictEnd = NULL;
2270     dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001);  /* cover both little and big endian */
2271     dctx->litEntropy = dctx->fseEntropy = 0;
2272     dctx->dictID = 0;
2273     ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue));
2274     memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue));  /* initial repcodes */
2275     dctx->LLTptr = dctx->entropy.LLTable;
2276     dctx->MLTptr = dctx->entropy.MLTable;
2277     dctx->OFTptr = dctx->entropy.OFTable;
2278     dctx->HUFptr = dctx->entropy.hufTable;
2279     return 0;
2280 }
2281
2282 size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2283 {
2284     CHECK_F( ZSTD_decompressBegin(dctx) );
2285     if (dict && dictSize)
2286         CHECK_E(ZSTD_decompress_insertDictionary(dctx, dict, dictSize), dictionary_corrupted);
2287     return 0;
2288 }
2289
2290
2291 /* ======   ZSTD_DDict   ====== */
2292
2293 struct ZSTD_DDict_s {
2294     void* dictBuffer;
2295     const void* dictContent;
2296     size_t dictSize;
2297     ZSTD_entropyDTables_t entropy;
2298     U32 dictID;
2299     U32 entropyPresent;
2300     ZSTD_customMem cMem;
2301 };  /* typedef'd to ZSTD_DDict within "zstd.h" */
2302
2303 static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict)
2304 {
2305     return ddict->dictContent;
2306 }
2307
2308 static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict)
2309 {
2310     return ddict->dictSize;
2311 }
2312
2313 size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dstDCtx, const ZSTD_DDict* ddict)
2314 {
2315     CHECK_F( ZSTD_decompressBegin(dstDCtx) );
2316     if (ddict) {   /* support begin on NULL */
2317         dstDCtx->dictID = ddict->dictID;
2318         dstDCtx->base = ddict->dictContent;
2319         dstDCtx->vBase = ddict->dictContent;
2320         dstDCtx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize;
2321         dstDCtx->previousDstEnd = dstDCtx->dictEnd;
2322         if (ddict->entropyPresent) {
2323             dstDCtx->litEntropy = 1;
2324             dstDCtx->fseEntropy = 1;
2325             dstDCtx->LLTptr = ddict->entropy.LLTable;
2326             dstDCtx->MLTptr = ddict->entropy.MLTable;
2327             dstDCtx->OFTptr = ddict->entropy.OFTable;
2328             dstDCtx->HUFptr = ddict->entropy.hufTable;
2329             dstDCtx->entropy.rep[0] = ddict->entropy.rep[0];
2330             dstDCtx->entropy.rep[1] = ddict->entropy.rep[1];
2331             dstDCtx->entropy.rep[2] = ddict->entropy.rep[2];
2332         } else {
2333             dstDCtx->litEntropy = 0;
2334             dstDCtx->fseEntropy = 0;
2335         }
2336     }
2337     return 0;
2338 }
2339
2340 static size_t ZSTD_loadEntropy_inDDict(ZSTD_DDict* ddict, ZSTD_dictContentType_e dictContentType)
2341 {
2342     ddict->dictID = 0;
2343     ddict->entropyPresent = 0;
2344     if (dictContentType == ZSTD_dct_rawContent) return 0;
2345
2346     if (ddict->dictSize < 8) {
2347         if (dictContentType == ZSTD_dct_fullDict)
2348             return ERROR(dictionary_corrupted);   /* only accept specified dictionaries */
2349         return 0;   /* pure content mode */
2350     }
2351     {   U32 const magic = MEM_readLE32(ddict->dictContent);
2352         if (magic != ZSTD_MAGIC_DICTIONARY) {
2353             if (dictContentType == ZSTD_dct_fullDict)
2354                 return ERROR(dictionary_corrupted);   /* only accept specified dictionaries */
2355             return 0;   /* pure content mode */
2356         }
2357     }
2358     ddict->dictID = MEM_readLE32((const char*)ddict->dictContent + ZSTD_frameIdSize);
2359
2360     /* load entropy tables */
2361     CHECK_E( ZSTD_loadEntropy(&ddict->entropy, ddict->dictContent, ddict->dictSize), dictionary_corrupted );
2362     ddict->entropyPresent = 1;
2363     return 0;
2364 }
2365
2366
2367 static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict,
2368                                       const void* dict, size_t dictSize,
2369                                       ZSTD_dictLoadMethod_e dictLoadMethod,
2370                                       ZSTD_dictContentType_e dictContentType)
2371 {
2372     if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dict) || (!dictSize)) {
2373         ddict->dictBuffer = NULL;
2374         ddict->dictContent = dict;
2375     } else {
2376         void* const internalBuffer = ZSTD_malloc(dictSize, ddict->cMem);
2377         ddict->dictBuffer = internalBuffer;
2378         ddict->dictContent = internalBuffer;
2379         if (!internalBuffer) return ERROR(memory_allocation);
2380         memcpy(internalBuffer, dict, dictSize);
2381     }
2382     ddict->dictSize = dictSize;
2383     ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001);  /* cover both little and big endian */
2384
2385     /* parse dictionary content */
2386     CHECK_F( ZSTD_loadEntropy_inDDict(ddict, dictContentType) );
2387
2388     return 0;
2389 }
2390
2391 ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize,
2392                                       ZSTD_dictLoadMethod_e dictLoadMethod,
2393                                       ZSTD_dictContentType_e dictContentType,
2394                                       ZSTD_customMem customMem)
2395 {
2396     if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
2397
2398     {   ZSTD_DDict* const ddict = (ZSTD_DDict*) ZSTD_malloc(sizeof(ZSTD_DDict), customMem);
2399         if (!ddict) return NULL;
2400         ddict->cMem = customMem;
2401
2402         if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, dictLoadMethod, dictContentType) )) {
2403             ZSTD_freeDDict(ddict);
2404             return NULL;
2405         }
2406
2407         return ddict;
2408     }
2409 }
2410
2411 /*! ZSTD_createDDict() :
2412 *   Create a digested dictionary, to start decompression without startup delay.
2413 *   `dict` content is copied inside DDict.
2414 *   Consequently, `dict` can be released after `ZSTD_DDict` creation */
2415 ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize)
2416 {
2417     ZSTD_customMem const allocator = { NULL, NULL, NULL };
2418     return ZSTD_createDDict_advanced(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, allocator);
2419 }
2420
2421 /*! ZSTD_createDDict_byReference() :
2422  *  Create a digested dictionary, to start decompression without startup delay.
2423  *  Dictionary content is simply referenced, it will be accessed during decompression.
2424  *  Warning : dictBuffer must outlive DDict (DDict must be freed before dictBuffer) */
2425 ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize)
2426 {
2427     ZSTD_customMem const allocator = { NULL, NULL, NULL };
2428     return ZSTD_createDDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, allocator);
2429 }
2430
2431
2432 const ZSTD_DDict* ZSTD_initStaticDDict(
2433                                 void* workspace, size_t workspaceSize,
2434                                 const void* dict, size_t dictSize,
2435                                 ZSTD_dictLoadMethod_e dictLoadMethod,
2436                                 ZSTD_dictContentType_e dictContentType)
2437 {
2438     size_t const neededSpace =
2439             sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
2440     ZSTD_DDict* const ddict = (ZSTD_DDict*)workspace;
2441     assert(workspace != NULL);
2442     assert(dict != NULL);
2443     if ((size_t)workspace & 7) return NULL;  /* 8-aligned */
2444     if (workspaceSize < neededSpace) return NULL;
2445     if (dictLoadMethod == ZSTD_dlm_byCopy) {
2446         memcpy(ddict+1, dict, dictSize);  /* local copy */
2447         dict = ddict+1;
2448     }
2449     if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, ZSTD_dlm_byRef, dictContentType) ))
2450         return NULL;
2451     return ddict;
2452 }
2453
2454
2455 size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
2456 {
2457     if (ddict==NULL) return 0;   /* support free on NULL */
2458     {   ZSTD_customMem const cMem = ddict->cMem;
2459         ZSTD_free(ddict->dictBuffer, cMem);
2460         ZSTD_free(ddict, cMem);
2461         return 0;
2462     }
2463 }
2464
2465 /*! ZSTD_estimateDDictSize() :
2466  *  Estimate amount of memory that will be needed to create a dictionary for decompression.
2467  *  Note : dictionary created by reference using ZSTD_dlm_byRef are smaller */
2468 size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod)
2469 {
2470     return sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
2471 }
2472
2473 size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict)
2474 {
2475     if (ddict==NULL) return 0;   /* support sizeof on NULL */
2476     return sizeof(*ddict) + (ddict->dictBuffer ? ddict->dictSize : 0) ;
2477 }
2478
2479 /*! ZSTD_getDictID_fromDict() :
2480  *  Provides the dictID stored within dictionary.
2481  *  if @return == 0, the dictionary is not conformant with Zstandard specification.
2482  *  It can still be loaded, but as a content-only dictionary. */
2483 unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize)
2484 {
2485     if (dictSize < 8) return 0;
2486     if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) return 0;
2487     return MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
2488 }
2489
2490 /*! ZSTD_getDictID_fromDDict() :
2491  *  Provides the dictID of the dictionary loaded into `ddict`.
2492  *  If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
2493  *  Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
2494 unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
2495 {
2496     if (ddict==NULL) return 0;
2497     return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize);
2498 }
2499
2500 /*! ZSTD_getDictID_fromFrame() :
2501  *  Provides the dictID required to decompresse frame stored within `src`.
2502  *  If @return == 0, the dictID could not be decoded.
2503  *  This could for one of the following reasons :
2504  *  - The frame does not require a dictionary (most common case).
2505  *  - The frame was built with dictID intentionally removed.
2506  *    Needed dictionary is a hidden information.
2507  *    Note : this use case also happens when using a non-conformant dictionary.
2508  *  - `srcSize` is too small, and as a result, frame header could not be decoded.
2509  *    Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`.
2510  *  - This is not a Zstandard frame.
2511  *  When identifying the exact failure cause, it's possible to use
2512  *  ZSTD_getFrameHeader(), which will provide a more precise error code. */
2513 unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize)
2514 {
2515     ZSTD_frameHeader zfp = { 0, 0, 0, ZSTD_frame, 0, 0, 0 };
2516     size_t const hError = ZSTD_getFrameHeader(&zfp, src, srcSize);
2517     if (ZSTD_isError(hError)) return 0;
2518     return zfp.dictID;
2519 }
2520
2521
2522 /*! ZSTD_decompress_usingDDict() :
2523 *   Decompression using a pre-digested Dictionary
2524 *   Use dictionary without significant overhead. */
2525 size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
2526                                   void* dst, size_t dstCapacity,
2527                             const void* src, size_t srcSize,
2528                             const ZSTD_DDict* ddict)
2529 {
2530     /* pass content and size in case legacy frames are encountered */
2531     return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize,
2532                                      NULL, 0,
2533                                      ddict);
2534 }
2535
2536
2537 /*=====================================
2538 *   Streaming decompression
2539 *====================================*/
2540
2541 ZSTD_DStream* ZSTD_createDStream(void)
2542 {
2543     DEBUGLOG(3, "ZSTD_createDStream");
2544     return ZSTD_createDStream_advanced(ZSTD_defaultCMem);
2545 }
2546
2547 ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize)
2548 {
2549     return ZSTD_initStaticDCtx(workspace, workspaceSize);
2550 }
2551
2552 ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem)
2553 {
2554     return ZSTD_createDCtx_advanced(customMem);
2555 }
2556
2557 size_t ZSTD_freeDStream(ZSTD_DStream* zds)
2558 {
2559     return ZSTD_freeDCtx(zds);
2560 }
2561
2562
2563 /* *** Initialization *** */
2564
2565 size_t ZSTD_DStreamInSize(void)  { return ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize; }
2566 size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_MAX; }
2567
2568 size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType)
2569 {
2570     if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2571     ZSTD_freeDDict(dctx->ddictLocal);
2572     if (dict && dictSize >= 8) {
2573         dctx->ddictLocal = ZSTD_createDDict_advanced(dict, dictSize, dictLoadMethod, dictContentType, dctx->customMem);
2574         if (dctx->ddictLocal == NULL) return ERROR(memory_allocation);
2575     } else {
2576         dctx->ddictLocal = NULL;
2577     }
2578     dctx->ddict = dctx->ddictLocal;
2579     return 0;
2580 }
2581
2582 size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2583 {
2584     return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto);
2585 }
2586
2587 size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2588 {
2589     return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto);
2590 }
2591
2592 size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType)
2593 {
2594     return ZSTD_DCtx_loadDictionary_advanced(dctx, prefix, prefixSize, ZSTD_dlm_byRef, dictContentType);
2595 }
2596
2597 size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize)
2598 {
2599     return ZSTD_DCtx_refPrefix_advanced(dctx, prefix, prefixSize, ZSTD_dct_rawContent);
2600 }
2601
2602
2603 /* ZSTD_initDStream_usingDict() :
2604  * return : expected size, aka ZSTD_frameHeaderSize_prefix.
2605  * this function cannot fail */
2606 size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize)
2607 {
2608     DEBUGLOG(4, "ZSTD_initDStream_usingDict");
2609     zds->streamStage = zdss_init;
2610     CHECK_F( ZSTD_DCtx_loadDictionary(zds, dict, dictSize) );
2611     return ZSTD_frameHeaderSize_prefix;
2612 }
2613
2614 /* note : this variant can't fail */
2615 size_t ZSTD_initDStream(ZSTD_DStream* zds)
2616 {
2617     DEBUGLOG(4, "ZSTD_initDStream");
2618     return ZSTD_initDStream_usingDict(zds, NULL, 0);
2619 }
2620
2621 size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
2622 {
2623     if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2624     dctx->ddict = ddict;
2625     return 0;
2626 }
2627
2628 /* ZSTD_initDStream_usingDDict() :
2629  * ddict will just be referenced, and must outlive decompression session
2630  * this function cannot fail */
2631 size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict)
2632 {
2633     size_t const initResult = ZSTD_initDStream(dctx);
2634     dctx->ddict = ddict;
2635     return initResult;
2636 }
2637
2638 /* ZSTD_resetDStream() :
2639  * return : expected size, aka ZSTD_frameHeaderSize_prefix.
2640  * this function cannot fail */
2641 size_t ZSTD_resetDStream(ZSTD_DStream* dctx)
2642 {
2643     DEBUGLOG(4, "ZSTD_resetDStream");
2644     dctx->streamStage = zdss_loadHeader;
2645     dctx->lhSize = dctx->inPos = dctx->outStart = dctx->outEnd = 0;
2646     dctx->legacyVersion = 0;
2647     dctx->hostageByte = 0;
2648     return ZSTD_frameHeaderSize_prefix;
2649 }
2650
2651 size_t ZSTD_setDStreamParameter(ZSTD_DStream* dctx,
2652                                 ZSTD_DStreamParameter_e paramType, unsigned paramValue)
2653 {
2654     if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2655     switch(paramType)
2656     {
2657         default : return ERROR(parameter_unsupported);
2658         case DStream_p_maxWindowSize :
2659             DEBUGLOG(4, "setting maxWindowSize = %u KB", paramValue >> 10);
2660             dctx->maxWindowSize = paramValue ? paramValue : (U32)(-1);
2661             break;
2662     }
2663     return 0;
2664 }
2665
2666 size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize)
2667 {
2668     if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2669     dctx->maxWindowSize = maxWindowSize;
2670     return 0;
2671 }
2672
2673 size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format)
2674 {
2675     DEBUGLOG(4, "ZSTD_DCtx_setFormat : %u", (unsigned)format);
2676     if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2677     dctx->format = format;
2678     return 0;
2679 }
2680
2681
2682 size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx)
2683 {
2684     return ZSTD_sizeof_DCtx(dctx);
2685 }
2686
2687 size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize)
2688 {
2689     size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
2690     unsigned long long const neededRBSize = windowSize + blockSize + (WILDCOPY_OVERLENGTH * 2);
2691     unsigned long long const neededSize = MIN(frameContentSize, neededRBSize);
2692     size_t const minRBSize = (size_t) neededSize;
2693     if ((unsigned long long)minRBSize != neededSize) return ERROR(frameParameter_windowTooLarge);
2694     return minRBSize;
2695 }
2696
2697 size_t ZSTD_estimateDStreamSize(size_t windowSize)
2698 {
2699     size_t const blockSize = MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
2700     size_t const inBuffSize = blockSize;  /* no block can be larger */
2701     size_t const outBuffSize = ZSTD_decodingBufferSize_min(windowSize, ZSTD_CONTENTSIZE_UNKNOWN);
2702     return ZSTD_estimateDCtxSize() + inBuffSize + outBuffSize;
2703 }
2704
2705 size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize)
2706 {
2707     U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX;   /* note : should be user-selectable */
2708     ZSTD_frameHeader zfh;
2709     size_t const err = ZSTD_getFrameHeader(&zfh, src, srcSize);
2710     if (ZSTD_isError(err)) return err;
2711     if (err>0) return ERROR(srcSize_wrong);
2712     if (zfh.windowSize > windowSizeMax)
2713         return ERROR(frameParameter_windowTooLarge);
2714     return ZSTD_estimateDStreamSize((size_t)zfh.windowSize);
2715 }
2716
2717
2718 /* *****   Decompression   ***** */
2719
2720 MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
2721 {
2722     size_t const length = MIN(dstCapacity, srcSize);
2723     memcpy(dst, src, length);
2724     return length;
2725 }
2726
2727
2728 size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
2729 {
2730     const char* const istart = (const char*)(input->src) + input->pos;
2731     const char* const iend = (const char*)(input->src) + input->size;
2732     const char* ip = istart;
2733     char* const ostart = (char*)(output->dst) + output->pos;
2734     char* const oend = (char*)(output->dst) + output->size;
2735     char* op = ostart;
2736     U32 someMoreWork = 1;
2737
2738     DEBUGLOG(5, "ZSTD_decompressStream");
2739     if (input->pos > input->size) {  /* forbidden */
2740         DEBUGLOG(5, "in: pos: %u   vs size: %u",
2741                     (U32)input->pos, (U32)input->size);
2742         return ERROR(srcSize_wrong);
2743     }
2744     if (output->pos > output->size) {  /* forbidden */
2745         DEBUGLOG(5, "out: pos: %u   vs size: %u",
2746                     (U32)output->pos, (U32)output->size);
2747         return ERROR(dstSize_tooSmall);
2748     }
2749     DEBUGLOG(5, "input size : %u", (U32)(input->size - input->pos));
2750
2751     while (someMoreWork) {
2752         switch(zds->streamStage)
2753         {
2754         case zdss_init :
2755             DEBUGLOG(5, "stage zdss_init => transparent reset ");
2756             ZSTD_resetDStream(zds);   /* transparent reset on starting decoding a new frame */
2757             /* fall-through */
2758
2759         case zdss_loadHeader :
2760             DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip));
2761 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
2762             if (zds->legacyVersion) {
2763                 /* legacy support is incompatible with static dctx */
2764                 if (zds->staticSize) return ERROR(memory_allocation);
2765                 {   size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input);
2766                     if (hint==0) zds->streamStage = zdss_init;
2767                     return hint;
2768             }   }
2769 #endif
2770             {   size_t const hSize = ZSTD_getFrameHeader_internal(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format);
2771                 DEBUGLOG(5, "header size : %u", (U32)hSize);
2772                 if (ZSTD_isError(hSize)) {
2773 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
2774                     U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart);
2775                     if (legacyVersion) {
2776                         const void* const dict = zds->ddict ? zds->ddict->dictContent : NULL;
2777                         size_t const dictSize = zds->ddict ? zds->ddict->dictSize : 0;
2778                         DEBUGLOG(5, "ZSTD_decompressStream: detected legacy version v0.%u", legacyVersion);
2779                         /* legacy support is incompatible with static dctx */
2780                         if (zds->staticSize) return ERROR(memory_allocation);
2781                         CHECK_F(ZSTD_initLegacyStream(&zds->legacyContext,
2782                                     zds->previousLegacyVersion, legacyVersion,
2783                                     dict, dictSize));
2784                         zds->legacyVersion = zds->previousLegacyVersion = legacyVersion;
2785                         {   size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, legacyVersion, output, input);
2786                             if (hint==0) zds->streamStage = zdss_init;   /* or stay in stage zdss_loadHeader */
2787                             return hint;
2788                     }   }
2789 #endif
2790                     return hSize;   /* error */
2791                 }
2792                 if (hSize != 0) {   /* need more input */
2793                     size_t const toLoad = hSize - zds->lhSize;   /* if hSize!=0, hSize > zds->lhSize */
2794                     size_t const remainingInput = (size_t)(iend-ip);
2795                     assert(iend >= ip);
2796                     if (toLoad > remainingInput) {   /* not enough input to load full header */
2797                         if (remainingInput > 0) {
2798                             memcpy(zds->headerBuffer + zds->lhSize, ip, remainingInput);
2799                             zds->lhSize += remainingInput;
2800                         }
2801                         input->pos = input->size;
2802                         return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) + ZSTD_blockHeaderSize;   /* remaining header bytes + next block header */
2803                     }
2804                     assert(ip != NULL);
2805                     memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad); zds->lhSize = hSize; ip += toLoad;
2806                     break;
2807             }   }
2808
2809             /* check for single-pass mode opportunity */
2810             if (zds->fParams.frameContentSize && zds->fParams.windowSize /* skippable frame if == 0 */
2811                 && (U64)(size_t)(oend-op) >= zds->fParams.frameContentSize) {
2812                 size_t const cSize = ZSTD_findFrameCompressedSize(istart, iend-istart);
2813                 if (cSize <= (size_t)(iend-istart)) {
2814                     /* shortcut : using single-pass mode */
2815                     size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, oend-op, istart, cSize, zds->ddict);
2816                     if (ZSTD_isError(decompressedSize)) return decompressedSize;
2817                     DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()")
2818                     ip = istart + cSize;
2819                     op += decompressedSize;
2820                     zds->expected = 0;
2821                     zds->streamStage = zdss_init;
2822                     someMoreWork = 0;
2823                     break;
2824             }   }
2825
2826             /* Consume header (see ZSTDds_decodeFrameHeader) */
2827             DEBUGLOG(4, "Consume header");
2828             CHECK_F(ZSTD_decompressBegin_usingDDict(zds, zds->ddict));
2829
2830             if ((MEM_readLE32(zds->headerBuffer) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {  /* skippable frame */
2831                 zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_frameIdSize);
2832                 zds->stage = ZSTDds_skipFrame;
2833             } else {
2834                 CHECK_F(ZSTD_decodeFrameHeader(zds, zds->headerBuffer, zds->lhSize));
2835                 zds->expected = ZSTD_blockHeaderSize;
2836                 zds->stage = ZSTDds_decodeBlockHeader;
2837             }
2838
2839             /* control buffer memory usage */
2840             DEBUGLOG(4, "Control max memory usage (%u KB <= max %u KB)",
2841                         (U32)(zds->fParams.windowSize >>10),
2842                         (U32)(zds->maxWindowSize >> 10) );
2843             zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
2844             if (zds->fParams.windowSize > zds->maxWindowSize) return ERROR(frameParameter_windowTooLarge);
2845
2846             /* Adapt buffer sizes to frame header instructions */
2847             {   size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */);
2848                 size_t const neededOutBuffSize = ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize);
2849                 if ((zds->inBuffSize < neededInBuffSize) || (zds->outBuffSize < neededOutBuffSize)) {
2850                     size_t const bufferSize = neededInBuffSize + neededOutBuffSize;
2851                     DEBUGLOG(4, "inBuff  : from %u to %u",
2852                                 (U32)zds->inBuffSize, (U32)neededInBuffSize);
2853                     DEBUGLOG(4, "outBuff : from %u to %u",
2854                                 (U32)zds->outBuffSize, (U32)neededOutBuffSize);
2855                     if (zds->staticSize) {  /* static DCtx */
2856                         DEBUGLOG(4, "staticSize : %u", (U32)zds->staticSize);
2857                         assert(zds->staticSize >= sizeof(ZSTD_DCtx));  /* controlled at init */
2858                         if (bufferSize > zds->staticSize - sizeof(ZSTD_DCtx))
2859                             return ERROR(memory_allocation);
2860                     } else {
2861                         ZSTD_free(zds->inBuff, zds->customMem);
2862                         zds->inBuffSize = 0;
2863                         zds->outBuffSize = 0;
2864                         zds->inBuff = (char*)ZSTD_malloc(bufferSize, zds->customMem);
2865                         if (zds->inBuff == NULL) return ERROR(memory_allocation);
2866                     }
2867                     zds->inBuffSize = neededInBuffSize;
2868                     zds->outBuff = zds->inBuff + zds->inBuffSize;
2869                     zds->outBuffSize = neededOutBuffSize;
2870             }   }
2871             zds->streamStage = zdss_read;
2872             /* fall-through */
2873
2874         case zdss_read:
2875             DEBUGLOG(5, "stage zdss_read");
2876             {   size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
2877                 DEBUGLOG(5, "neededInSize = %u", (U32)neededInSize);
2878                 if (neededInSize==0) {  /* end of frame */
2879                     zds->streamStage = zdss_init;
2880                     someMoreWork = 0;
2881                     break;
2882                 }
2883                 if ((size_t)(iend-ip) >= neededInSize) {  /* decode directly from src */
2884                     int const isSkipFrame = ZSTD_isSkipFrame(zds);
2885                     size_t const decodedSize = ZSTD_decompressContinue(zds,
2886                         zds->outBuff + zds->outStart, (isSkipFrame ? 0 : zds->outBuffSize - zds->outStart),
2887                         ip, neededInSize);
2888                     if (ZSTD_isError(decodedSize)) return decodedSize;
2889                     ip += neededInSize;
2890                     if (!decodedSize && !isSkipFrame) break;   /* this was just a header */
2891                     zds->outEnd = zds->outStart + decodedSize;
2892                     zds->streamStage = zdss_flush;
2893                     break;
2894             }   }
2895             if (ip==iend) { someMoreWork = 0; break; }   /* no more input */
2896             zds->streamStage = zdss_load;
2897             /* fall-through */
2898
2899         case zdss_load:
2900             {   size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
2901                 size_t const toLoad = neededInSize - zds->inPos;
2902                 int const isSkipFrame = ZSTD_isSkipFrame(zds);
2903                 size_t loadedSize;
2904                 if (isSkipFrame) {
2905                     loadedSize = MIN(toLoad, (size_t)(iend-ip));
2906                 } else {
2907                     if (toLoad > zds->inBuffSize - zds->inPos) return ERROR(corruption_detected);   /* should never happen */
2908                     loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, iend-ip);
2909                 }
2910                 ip += loadedSize;
2911                 zds->inPos += loadedSize;
2912                 if (loadedSize < toLoad) { someMoreWork = 0; break; }   /* not enough input, wait for more */
2913
2914                 /* decode loaded input */
2915                 {   size_t const decodedSize = ZSTD_decompressContinue(zds,
2916                         zds->outBuff + zds->outStart, zds->outBuffSize - zds->outStart,
2917                         zds->inBuff, neededInSize);
2918                     if (ZSTD_isError(decodedSize)) return decodedSize;
2919                     zds->inPos = 0;   /* input is consumed */
2920                     if (!decodedSize && !isSkipFrame) { zds->streamStage = zdss_read; break; }   /* this was just a header */
2921                     zds->outEnd = zds->outStart +  decodedSize;
2922             }   }
2923             zds->streamStage = zdss_flush;
2924             /* fall-through */
2925
2926         case zdss_flush:
2927             {   size_t const toFlushSize = zds->outEnd - zds->outStart;
2928                 size_t const flushedSize = ZSTD_limitCopy(op, oend-op, zds->outBuff + zds->outStart, toFlushSize);
2929                 op += flushedSize;
2930                 zds->outStart += flushedSize;
2931                 if (flushedSize == toFlushSize) {  /* flush completed */
2932                     zds->streamStage = zdss_read;
2933                     if ( (zds->outBuffSize < zds->fParams.frameContentSize)
2934                       && (zds->outStart + zds->fParams.blockSizeMax > zds->outBuffSize) ) {
2935                         DEBUGLOG(5, "restart filling outBuff from beginning (left:%i, needed:%u)",
2936                                 (int)(zds->outBuffSize - zds->outStart),
2937                                 (U32)zds->fParams.blockSizeMax);
2938                         zds->outStart = zds->outEnd = 0;
2939                     }
2940                     break;
2941             }   }
2942             /* cannot complete flush */
2943             someMoreWork = 0;
2944             break;
2945
2946         default: return ERROR(GENERIC);   /* impossible */
2947     }   }
2948
2949     /* result */
2950     input->pos += (size_t)(ip-istart);
2951     output->pos += (size_t)(op-ostart);
2952     {   size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds);
2953         if (!nextSrcSizeHint) {   /* frame fully decoded */
2954             if (zds->outEnd == zds->outStart) {  /* output fully flushed */
2955                 if (zds->hostageByte) {
2956                     if (input->pos >= input->size) {
2957                         /* can't release hostage (not present) */
2958                         zds->streamStage = zdss_read;
2959                         return 1;
2960                     }
2961                     input->pos++;  /* release hostage */
2962                 }   /* zds->hostageByte */
2963                 return 0;
2964             }  /* zds->outEnd == zds->outStart */
2965             if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released when all output is flushed */
2966                 input->pos--;   /* note : pos > 0, otherwise, impossible to finish reading last block */
2967                 zds->hostageByte=1;
2968             }
2969             return 1;
2970         }  /* nextSrcSizeHint==0 */
2971         nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds) == ZSTDnit_block);   /* preload header of next block */
2972         assert(zds->inPos <= nextSrcSizeHint);
2973         nextSrcSizeHint -= zds->inPos;   /* part already loaded*/
2974         return nextSrcSizeHint;
2975     }
2976 }
2977
2978
2979 size_t ZSTD_decompress_generic(ZSTD_DCtx* dctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
2980 {
2981     return ZSTD_decompressStream(dctx, output, input);
2982 }
2983
2984 size_t ZSTD_decompress_generic_simpleArgs (
2985                             ZSTD_DCtx* dctx,
2986                             void* dst, size_t dstCapacity, size_t* dstPos,
2987                       const void* src, size_t srcSize, size_t* srcPos)
2988 {
2989     ZSTD_outBuffer output = { dst, dstCapacity, *dstPos };
2990     ZSTD_inBuffer  input  = { src, srcSize, *srcPos };
2991     /* ZSTD_compress_generic() will check validity of dstPos and srcPos */
2992     size_t const cErr = ZSTD_decompress_generic(dctx, &output, &input);
2993     *dstPos = output.pos;
2994     *srcPos = input.pos;
2995     return cErr;
2996 }
2997
2998 void ZSTD_DCtx_reset(ZSTD_DCtx* dctx)
2999 {
3000     (void)ZSTD_initDStream(dctx);
3001     dctx->format = ZSTD_f_zstd1;
3002     dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
3003 }