xref: /dflybsd-src/contrib/zstd/lib/decompress/zstd_decompress_internal.h (revision a28cd43d19e8b720a6c852a4bbc5ae147a26165a)
1a28cd43dSSascha Wildner /*
2a28cd43dSSascha Wildner  * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
3a28cd43dSSascha Wildner  * All rights reserved.
4a28cd43dSSascha Wildner  *
5a28cd43dSSascha Wildner  * This source code is licensed under both the BSD-style license (found in the
6a28cd43dSSascha Wildner  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7a28cd43dSSascha Wildner  * in the COPYING file in the root directory of this source tree).
8a28cd43dSSascha Wildner  * You may select, at your option, one of the above-listed licenses.
9a28cd43dSSascha Wildner  */
10a28cd43dSSascha Wildner 
11a28cd43dSSascha Wildner 
12a28cd43dSSascha Wildner /* zstd_decompress_internal:
13a28cd43dSSascha Wildner  * objects and definitions shared within lib/decompress modules */
14a28cd43dSSascha Wildner 
15a28cd43dSSascha Wildner  #ifndef ZSTD_DECOMPRESS_INTERNAL_H
16a28cd43dSSascha Wildner  #define ZSTD_DECOMPRESS_INTERNAL_H
17a28cd43dSSascha Wildner 
18a28cd43dSSascha Wildner 
19a28cd43dSSascha Wildner /*-*******************************************************
20a28cd43dSSascha Wildner  *  Dependencies
21a28cd43dSSascha Wildner  *********************************************************/
22a28cd43dSSascha Wildner #include "../common/mem.h"             /* BYTE, U16, U32 */
23a28cd43dSSascha Wildner #include "../common/zstd_internal.h"   /* ZSTD_seqSymbol */
24a28cd43dSSascha Wildner 
25a28cd43dSSascha Wildner 
26a28cd43dSSascha Wildner 
27a28cd43dSSascha Wildner /*-*******************************************************
28a28cd43dSSascha Wildner  *  Constants
29a28cd43dSSascha Wildner  *********************************************************/
30a28cd43dSSascha Wildner static UNUSED_ATTR const U32 LL_base[MaxLL+1] = {
31a28cd43dSSascha Wildner                  0,    1,    2,     3,     4,     5,     6,      7,
32a28cd43dSSascha Wildner                  8,    9,   10,    11,    12,    13,    14,     15,
33a28cd43dSSascha Wildner                 16,   18,   20,    22,    24,    28,    32,     40,
34a28cd43dSSascha Wildner                 48,   64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
35a28cd43dSSascha Wildner                 0x2000, 0x4000, 0x8000, 0x10000 };
36a28cd43dSSascha Wildner 
37a28cd43dSSascha Wildner static UNUSED_ATTR const U32 OF_base[MaxOff+1] = {
38a28cd43dSSascha Wildner                  0,        1,       1,       5,     0xD,     0x1D,     0x3D,     0x7D,
39a28cd43dSSascha Wildner                  0xFD,   0x1FD,   0x3FD,   0x7FD,   0xFFD,   0x1FFD,   0x3FFD,   0x7FFD,
40a28cd43dSSascha Wildner                  0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
41a28cd43dSSascha Wildner                  0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
42a28cd43dSSascha Wildner 
43a28cd43dSSascha Wildner static UNUSED_ATTR const U32 OF_bits[MaxOff+1] = {
44a28cd43dSSascha Wildner                      0,  1,  2,  3,  4,  5,  6,  7,
45a28cd43dSSascha Wildner                      8,  9, 10, 11, 12, 13, 14, 15,
46a28cd43dSSascha Wildner                     16, 17, 18, 19, 20, 21, 22, 23,
47a28cd43dSSascha Wildner                     24, 25, 26, 27, 28, 29, 30, 31 };
48a28cd43dSSascha Wildner 
49a28cd43dSSascha Wildner static UNUSED_ATTR const U32 ML_base[MaxML+1] = {
50a28cd43dSSascha Wildner                      3,  4,  5,    6,     7,     8,     9,    10,
51a28cd43dSSascha Wildner                     11, 12, 13,   14,    15,    16,    17,    18,
52a28cd43dSSascha Wildner                     19, 20, 21,   22,    23,    24,    25,    26,
53a28cd43dSSascha Wildner                     27, 28, 29,   30,    31,    32,    33,    34,
54a28cd43dSSascha Wildner                     35, 37, 39,   41,    43,    47,    51,    59,
55a28cd43dSSascha Wildner                     67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803,
56a28cd43dSSascha Wildner                     0x1003, 0x2003, 0x4003, 0x8003, 0x10003 };
57a28cd43dSSascha Wildner 
58a28cd43dSSascha Wildner 
59a28cd43dSSascha Wildner /*-*******************************************************
60a28cd43dSSascha Wildner  *  Decompression types
61a28cd43dSSascha Wildner  *********************************************************/
62a28cd43dSSascha Wildner  typedef struct {
63a28cd43dSSascha Wildner      U32 fastMode;
64a28cd43dSSascha Wildner      U32 tableLog;
65a28cd43dSSascha Wildner  } ZSTD_seqSymbol_header;
66a28cd43dSSascha Wildner 
67a28cd43dSSascha Wildner  typedef struct {
68a28cd43dSSascha Wildner      U16  nextState;
69a28cd43dSSascha Wildner      BYTE nbAdditionalBits;
70a28cd43dSSascha Wildner      BYTE nbBits;
71a28cd43dSSascha Wildner      U32  baseValue;
72a28cd43dSSascha Wildner  } ZSTD_seqSymbol;
73a28cd43dSSascha Wildner 
74a28cd43dSSascha Wildner  #define SEQSYMBOL_TABLE_SIZE(log)   (1 + (1 << (log)))
75a28cd43dSSascha Wildner 
76a28cd43dSSascha Wildner #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64))
77a28cd43dSSascha Wildner #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32))
78a28cd43dSSascha Wildner 
79a28cd43dSSascha Wildner typedef struct {
80a28cd43dSSascha Wildner     ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)];    /* Note : Space reserved for FSE Tables */
81a28cd43dSSascha Wildner     ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)];   /* is also used as temporary workspace while building hufTable during DDict creation */
82a28cd43dSSascha Wildner     ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)];    /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */
83a28cd43dSSascha Wildner     HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)];  /* can accommodate HUF_decompress4X */
84a28cd43dSSascha Wildner     U32 rep[ZSTD_REP_NUM];
85a28cd43dSSascha Wildner     U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32];
86a28cd43dSSascha Wildner } ZSTD_entropyDTables_t;
87a28cd43dSSascha Wildner 
88a28cd43dSSascha Wildner typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
89a28cd43dSSascha Wildner                ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock,
90a28cd43dSSascha Wildner                ZSTDds_decompressLastBlock, ZSTDds_checkChecksum,
91a28cd43dSSascha Wildner                ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage;
92a28cd43dSSascha Wildner 
93a28cd43dSSascha Wildner typedef enum { zdss_init=0, zdss_loadHeader,
94a28cd43dSSascha Wildner                zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
95a28cd43dSSascha Wildner 
96a28cd43dSSascha Wildner typedef enum {
97a28cd43dSSascha Wildner     ZSTD_use_indefinitely = -1,  /* Use the dictionary indefinitely */
98a28cd43dSSascha Wildner     ZSTD_dont_use = 0,           /* Do not use the dictionary (if one exists free it) */
99a28cd43dSSascha Wildner     ZSTD_use_once = 1            /* Use the dictionary once and set to ZSTD_dont_use */
100a28cd43dSSascha Wildner } ZSTD_dictUses_e;
101a28cd43dSSascha Wildner 
102a28cd43dSSascha Wildner struct ZSTD_DCtx_s
103a28cd43dSSascha Wildner {
104a28cd43dSSascha Wildner     const ZSTD_seqSymbol* LLTptr;
105a28cd43dSSascha Wildner     const ZSTD_seqSymbol* MLTptr;
106a28cd43dSSascha Wildner     const ZSTD_seqSymbol* OFTptr;
107a28cd43dSSascha Wildner     const HUF_DTable* HUFptr;
108a28cd43dSSascha Wildner     ZSTD_entropyDTables_t entropy;
109a28cd43dSSascha Wildner     U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];   /* space needed when building huffman tables */
110a28cd43dSSascha Wildner     const void* previousDstEnd;   /* detect continuity */
111a28cd43dSSascha Wildner     const void* prefixStart;      /* start of current segment */
112a28cd43dSSascha Wildner     const void* virtualStart;     /* virtual start of previous segment if it was just before current one */
113a28cd43dSSascha Wildner     const void* dictEnd;          /* end of previous segment */
114a28cd43dSSascha Wildner     size_t expected;
115a28cd43dSSascha Wildner     ZSTD_frameHeader fParams;
116a28cd43dSSascha Wildner     U64 decodedSize;
117a28cd43dSSascha Wildner     blockType_e bType;            /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */
118a28cd43dSSascha Wildner     ZSTD_dStage stage;
119a28cd43dSSascha Wildner     U32 litEntropy;
120a28cd43dSSascha Wildner     U32 fseEntropy;
121a28cd43dSSascha Wildner     XXH64_state_t xxhState;
122a28cd43dSSascha Wildner     size_t headerSize;
123a28cd43dSSascha Wildner     ZSTD_format_e format;
124a28cd43dSSascha Wildner     ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum;   /* User specified: if == 1, will ignore checksums in compressed frame. Default == 0 */
125a28cd43dSSascha Wildner     U32 validateChecksum;         /* if == 1, will validate checksum. Is == 1 if (fParams.checksumFlag == 1) and (forceIgnoreChecksum == 0). */
126a28cd43dSSascha Wildner     const BYTE* litPtr;
127a28cd43dSSascha Wildner     ZSTD_customMem customMem;
128a28cd43dSSascha Wildner     size_t litSize;
129a28cd43dSSascha Wildner     size_t rleSize;
130a28cd43dSSascha Wildner     size_t staticSize;
131a28cd43dSSascha Wildner     int bmi2;                     /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
132a28cd43dSSascha Wildner 
133a28cd43dSSascha Wildner     /* dictionary */
134a28cd43dSSascha Wildner     ZSTD_DDict* ddictLocal;
135a28cd43dSSascha Wildner     const ZSTD_DDict* ddict;     /* set by ZSTD_initDStream_usingDDict(), or ZSTD_DCtx_refDDict() */
136a28cd43dSSascha Wildner     U32 dictID;
137a28cd43dSSascha Wildner     int ddictIsCold;             /* if == 1 : dictionary is "new" for working context, and presumed "cold" (not in cpu cache) */
138a28cd43dSSascha Wildner     ZSTD_dictUses_e dictUses;
139a28cd43dSSascha Wildner 
140a28cd43dSSascha Wildner     /* streaming */
141a28cd43dSSascha Wildner     ZSTD_dStreamStage streamStage;
142a28cd43dSSascha Wildner     char*  inBuff;
143a28cd43dSSascha Wildner     size_t inBuffSize;
144a28cd43dSSascha Wildner     size_t inPos;
145a28cd43dSSascha Wildner     size_t maxWindowSize;
146a28cd43dSSascha Wildner     char*  outBuff;
147a28cd43dSSascha Wildner     size_t outBuffSize;
148a28cd43dSSascha Wildner     size_t outStart;
149a28cd43dSSascha Wildner     size_t outEnd;
150a28cd43dSSascha Wildner     size_t lhSize;
151a28cd43dSSascha Wildner     void* legacyContext;
152a28cd43dSSascha Wildner     U32 previousLegacyVersion;
153a28cd43dSSascha Wildner     U32 legacyVersion;
154a28cd43dSSascha Wildner     U32 hostageByte;
155a28cd43dSSascha Wildner     int noForwardProgress;
156a28cd43dSSascha Wildner     ZSTD_bufferMode_e outBufferMode;
157a28cd43dSSascha Wildner     ZSTD_outBuffer expectedOutBuffer;
158a28cd43dSSascha Wildner 
159a28cd43dSSascha Wildner     /* workspace */
160a28cd43dSSascha Wildner     BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
161a28cd43dSSascha Wildner     BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
162a28cd43dSSascha Wildner 
163a28cd43dSSascha Wildner     size_t oversizedDuration;
164a28cd43dSSascha Wildner 
165a28cd43dSSascha Wildner #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
166a28cd43dSSascha Wildner     void const* dictContentBeginForFuzzing;
167a28cd43dSSascha Wildner     void const* dictContentEndForFuzzing;
168a28cd43dSSascha Wildner #endif
169a28cd43dSSascha Wildner };  /* typedef'd to ZSTD_DCtx within "zstd.h" */
170a28cd43dSSascha Wildner 
171a28cd43dSSascha Wildner 
172a28cd43dSSascha Wildner /*-*******************************************************
173a28cd43dSSascha Wildner  *  Shared internal functions
174a28cd43dSSascha Wildner  *********************************************************/
175a28cd43dSSascha Wildner 
176a28cd43dSSascha Wildner /*! ZSTD_loadDEntropy() :
177a28cd43dSSascha Wildner  *  dict : must point at beginning of a valid zstd dictionary.
178a28cd43dSSascha Wildner  * @return : size of dictionary header (size of magic number + dict ID + entropy tables) */
179a28cd43dSSascha Wildner size_t ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy,
180a28cd43dSSascha Wildner                    const void* const dict, size_t const dictSize);
181a28cd43dSSascha Wildner 
182a28cd43dSSascha Wildner /*! ZSTD_checkContinuity() :
183a28cd43dSSascha Wildner  *  check if next `dst` follows previous position, where decompression ended.
184a28cd43dSSascha Wildner  *  If yes, do nothing (continue on current segment).
185a28cd43dSSascha Wildner  *  If not, classify previous segment as "external dictionary", and start a new segment.
186a28cd43dSSascha Wildner  *  This function cannot fail. */
187a28cd43dSSascha Wildner void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst);
188a28cd43dSSascha Wildner 
189a28cd43dSSascha Wildner 
190a28cd43dSSascha Wildner #endif /* ZSTD_DECOMPRESS_INTERNAL_H */
191