aboutsummaryrefslogtreecommitdiff
path: root/C/ZstdDec.h
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-14 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-15 23:55:04 +0500
commitfc662341e6f85da78ada0e443f6116b978f79f22 (patch)
tree1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /C/ZstdDec.h
parent5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff)
download7zip-24.05.tar.gz
7zip-24.05.tar.bz2
7zip-24.05.zip
24.0524.05
Diffstat (limited to 'C/ZstdDec.h')
-rw-r--r--C/ZstdDec.h173
1 files changed, 173 insertions, 0 deletions
diff --git a/C/ZstdDec.h b/C/ZstdDec.h
new file mode 100644
index 0000000..cd26131
--- /dev/null
+++ b/C/ZstdDec.h
@@ -0,0 +1,173 @@
1/* ZstdDec.h -- Zstd Decoder interfaces
22024-01-21 : Igor Pavlov : Public domain */
3
4#ifndef ZIP7_INC_ZSTD_DEC_H
5#define ZIP7_INC_ZSTD_DEC_H
6
7EXTERN_C_BEGIN
8
9typedef struct CZstdDec CZstdDec;
10typedef CZstdDec * CZstdDecHandle;
11
12CZstdDecHandle ZstdDec_Create(ISzAllocPtr alloc_Small, ISzAllocPtr alloc_Big);
13void ZstdDec_Destroy(CZstdDecHandle p);
14
15typedef enum
16{
17 ZSTD_STATUS_NOT_SPECIFIED, /* use main error code instead */
18 ZSTD_STATUS_FINISHED_FRAME, /* data frame or skip frame was finished */
19 ZSTD_STATUS_NOT_FINISHED, /* just finished non-empty block or unfinished RAW/RLE block */
20 ZSTD_STATUS_NEEDS_MORE_INPUT, /* the callee needs more input bytes. It has more priority over ZSTD_STATUS_NOT_FINISHED */
21 ZSTD_STATUS_OUT_REACHED /* is not finihed frame and ((outProcessed > outSize) || (outProcessed == outSize && unfinished RAW/RLE block) */
22} enum_ZstdStatus_Dummy;
23
24#define ZstdDecState_DOES_NEED_MORE_INPUT_OR_FINISHED_FRAME(p) \
25 ((p)->status & ZSTD_STATUS_FINISHED_FRAME)
26/*
27 ((p)->status == ZSTD_STATUS_NEEDS_MORE_INPUT || \
28 (p)->status == ZSTD_STATUS_FINISHED_FRAME)
29*/
30
31typedef Byte enum_ZstdStatus;
32
33
34void ZstdDec_Init(CZstdDecHandle p);
35
36typedef struct
37{
38 UInt64 num_Blocks;
39 Byte descriptor_OR;
40 Byte descriptor_NOT_OR;
41 Byte are_ContentSize_Unknown;
42 Byte windowDescriptor_MAX;
43
44 // Byte are_ContentSize_Known;
45 // Byte are_SingleSegments;
46 // Byte are_WindowDescriptors;
47 Byte checksum_Defined;
48 // Byte are_Checksums;
49 // Byte are_Non_Checksums;
50
51 // Byte are_DictionaryId;
52 Byte are_DictionaryId_Different;
53
54 // Byte reserved[3];
55
56 UInt32 checksum; // checksum of last data frame
57 /// UInt32 dictionaryId_Cur;
58 UInt32 dictionaryId; // if there are non-zero dictionary IDs, then it's first dictionaryId
59
60 UInt64 num_DataFrames;
61 UInt64 num_SkipFrames;
62 UInt64 skipFrames_Size;
63 UInt64 contentSize_Total;
64 UInt64 contentSize_MAX;
65 // UInt64 num_Checksums;
66 // UInt64 num_Non_Checksums; // frames without checksum
67 // UInt64 num_WindowDescriptors;
68 // UInt64 num_SingleSegments;
69 // UInt64 num_Frames_with_ContentSize;
70 // UInt64 num_Frames_without_ContentSize;
71 UInt64 windowSize_MAX;
72 UInt64 windowSize_Allocate_MAX;
73 // UInt64 num_DictionaryIds;
74 // UInt64 num_Blocks_forType[4];
75 // UInt64 num_BlockBytes_forType[4];
76 // UInt64 num_SingleSegments;
77 // UInt64 singleSegment_ContentSize_MAX;
78} CZstdDecInfo;
79
80#define ZstdDecInfo_CLEAR(p) { memset(p, 0, sizeof(*(p))); }
81
82#define ZstdDecInfo_GET_NUM_FRAMES(p) ((p)->num_DataFrames + (p)->num_SkipFrames)
83
84
85typedef struct CZstdDecState
86{
87 enum_ZstdStatus status; // out
88 Byte disableHash;
89 // Byte mustBeFinished;
90 Byte outSize_Defined;
91 // Byte isAfterSizeMode;
92 // UInt64 inProcessed;
93 // SRes codeRes;
94 // Byte needWrite_IsStrong;
95
96 const Byte *inBuf;
97 size_t inPos; // in/out
98 size_t inLim;
99
100 const Byte *win; // out
101 size_t winPos; // out
102 size_t wrPos; // in/out
103 // size_t cycSize; // out : if (!outBuf_fromCaller)
104 size_t needWrite_Size; // out
105
106 Byte *outBuf_fromCaller;
107 size_t outBufSize_fromCaller;
108 /* (outBufSize_fromCaller >= full_uncompressed_size_of_all_frames) is required
109 for success decoding.
110 If outBufSize_fromCaller < full_uncompressed_size_of_all_frames),
111 decoding can give error message, because we decode per block basis.
112 */
113
114 // size_t outStep;
115 UInt64 outSize; // total in all frames
116 UInt64 outProcessed; // out decoded in all frames (it can be >= outSize)
117
118 CZstdDecInfo info;
119} CZstdDecState;
120
121void ZstdDecState_Clear(CZstdDecState *p);
122
123/*
124ZstdDec_Decode()
125return:
126 SZ_OK - no error
127 SZ_ERROR_DATA - Data Error
128 SZ_ERROR_MEM - Memory allocation error
129 SZ_ERROR_UNSUPPORTED - Unsupported method or method properties
130 SZ_ERROR_CRC - XXH hash Error
131 // SZ_ERROR_ARCHIVE - Headers error (not used now)
132*/
133SRes ZstdDec_Decode(CZstdDecHandle dec, CZstdDecState *p);
134
135/*
136ZstdDec_ReadUnusedFromInBuf():
137returns: the number of bytes that were read from InBuf
138(*afterDecoding_tempPos) must be set to zero before first call of ZstdDec_ReadUnusedFromInBuf()
139*/
140size_t ZstdDec_ReadUnusedFromInBuf(
141 CZstdDecHandle dec,
142 size_t afterDecoding_tempPos, // in/out
143 void *data, size_t size);
144
145typedef struct
146{
147 SRes decode_SRes; // error code of data decoding
148 Byte is_NonFinishedFrame; // there is unfinished decoding for data frame or skip frame
149 Byte extraSize;
150} CZstdDecResInfo;
151
152/*
153#define ZstdDecResInfo_CLEAR(p) \
154{ (p)->decode_SRes = 0; \
155 (p)->is_NonFinishedFrame; \
156 (p)->extraSize = 0; \
157}
158// memset(p, 0, sizeof(*p));
159*/
160
161/*
162additional error codes for CZstdDecResInfo::decode_SRes:
163 SZ_ERROR_NO_ARCHIVE - is not zstd stream (no frames)
164 SZ_ERROR_INPUT_EOF - need more data in input stream
165*/
166void ZstdDec_GetResInfo(const CZstdDec *dec,
167 const CZstdDecState *p,
168 SRes res, // it's result from ZstdDec_Decode()
169 CZstdDecResInfo *info);
170
171EXTERN_C_END
172
173#endif