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