OLD | NEW |
| (Empty) |
1 /* LzmaDec.h -- LZMA Decoder | |
2 2009-02-07 : Igor Pavlov : Public domain | |
3 in the public domain */ | |
4 | |
5 #ifndef __LZMA_DEC_H | |
6 #define __LZMA_DEC_H | |
7 | |
8 #include "Types.h" | |
9 | |
10 #ifdef __cplusplus | |
11 extern "C" { | |
12 #endif | |
13 | |
14 /* #define _LZMA_PROB32 */ | |
15 /* _LZMA_PROB32 can increase the speed on some CPUs, | |
16 but memory usage for CLzmaDec::probs will be doubled in that case */ | |
17 | |
18 #ifdef _LZMA_PROB32 | |
19 #define CLzmaProb UInt32 | |
20 #else | |
21 #define CLzmaProb UInt16 | |
22 #endif | |
23 | |
24 | |
25 /* ---------- LZMA Properties ---------- */ | |
26 | |
27 #define LZMA_PROPS_SIZE 5 | |
28 | |
29 typedef struct _CLzmaProps | |
30 { | |
31 unsigned lc, lp, pb; | |
32 UInt32 dicSize; | |
33 } CLzmaProps; | |
34 | |
35 /* LzmaProps_Decode - decodes properties | |
36 Returns: | |
37 SZ_OK | |
38 SZ_ERROR_UNSUPPORTED - Unsupported properties | |
39 */ | |
40 | |
41 SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); | |
42 | |
43 | |
44 /* ---------- LZMA Decoder state ---------- */ | |
45 | |
46 /* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. | |
47 Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ | |
48 | |
49 #define LZMA_REQUIRED_INPUT_MAX 20 | |
50 | |
51 typedef struct | |
52 { | |
53 CLzmaProps prop; | |
54 CLzmaProb *probs; | |
55 Byte *dic; | |
56 const Byte *buf; | |
57 UInt32 range, code; | |
58 SizeT dicPos; | |
59 SizeT dicBufSize; | |
60 UInt32 processedPos; | |
61 UInt32 checkDicSize; | |
62 unsigned state; | |
63 UInt32 reps[4]; | |
64 unsigned remainLen; | |
65 int needFlush; | |
66 int needInitState; | |
67 UInt32 numProbs; | |
68 unsigned tempBufSize; | |
69 Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; | |
70 } CLzmaDec; | |
71 | |
72 #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } | |
73 | |
74 void LzmaDec_Init(CLzmaDec *p); | |
75 | |
76 /* There are two types of LZMA streams: | |
77 0) Stream with end mark. That end mark adds about 6 bytes to compressed siz
e. | |
78 1) Stream without end mark. You must know exact uncompressed size to decomp
ress such stream. */ | |
79 | |
80 typedef enum | |
81 { | |
82 LZMA_FINISH_ANY, /* finish at any point */ | |
83 LZMA_FINISH_END /* block must be finished at the end */ | |
84 } ELzmaFinishMode; | |
85 | |
86 /* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! | |
87 | |
88 You must use LZMA_FINISH_END, when you know that current output buffer | |
89 covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. | |
90 | |
91 If LZMA decoder sees end marker before reaching output limit, it returns SZ_O
K, | |
92 and output value of destLen will be less than output buffer size limit. | |
93 You can check status result also. | |
94 | |
95 You can use multiple checks to test data integrity after full decompression: | |
96 1) Check Result and "status" variable. | |
97 2) Check that output(destLen) = uncompressedSize, if you know real uncompre
ssedSize. | |
98 3) Check that output(srcLen) = compressedSize, if you know real compressedS
ize. | |
99 You must use correct finish mode in that case. */ | |
100 | |
101 typedef enum | |
102 { | |
103 LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ | |
104 LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark.
*/ | |
105 LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ | |
106 LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes
*/ | |
107 LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream w
as finished without end mark */ | |
108 } ELzmaStatus; | |
109 | |
110 /* ELzmaStatus is used only as output value for function call */ | |
111 | |
112 | |
113 /* ---------- Interfaces ---------- */ | |
114 | |
115 /* There are 3 levels of interfaces: | |
116 1) Dictionary Interface | |
117 2) Buffer Interface | |
118 3) One Call Interface | |
119 You can select any of these interfaces, but don't mix functions from differen
t | |
120 groups for same object. */ | |
121 | |
122 | |
123 /* There are two variants to allocate state for Dictionary Interface: | |
124 1) LzmaDec_Allocate / LzmaDec_Free | |
125 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs | |
126 You can use variant 2, if you set dictionary buffer manually. | |
127 For Buffer Interface you must always use variant 1. | |
128 | |
129 LzmaDec_Allocate* can return: | |
130 SZ_OK | |
131 SZ_ERROR_MEM - Memory allocation error | |
132 SZ_ERROR_UNSUPPORTED - Unsupported properties | |
133 */ | |
134 | |
135 SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, I
SzAlloc *alloc); | |
136 void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); | |
137 | |
138 SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISz
Alloc *alloc); | |
139 void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); | |
140 | |
141 /* ---------- Dictionary Interface ---------- */ | |
142 | |
143 /* You can use it, if you want to eliminate the overhead for data copying from | |
144 dictionary to some other external buffer. | |
145 You must work with CLzmaDec variables directly in this interface. | |
146 | |
147 STEPS: | |
148 LzmaDec_Constr() | |
149 LzmaDec_Allocate() | |
150 for (each new stream) | |
151 { | |
152 LzmaDec_Init() | |
153 while (it needs more decompression) | |
154 { | |
155 LzmaDec_DecodeToDic() | |
156 use data from CLzmaDec::dic and update CLzmaDec::dicPos | |
157 } | |
158 } | |
159 LzmaDec_Free() | |
160 */ | |
161 | |
162 /* LzmaDec_DecodeToDic | |
163 | |
164 The decoding to internal dictionary buffer (CLzmaDec::dic). | |
165 You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize
!!! | |
166 | |
167 finishMode: | |
168 It has meaning only if the decoding reaches output limit (dicLimit). | |
169 LZMA_FINISH_ANY - Decode just dicLimit bytes. | |
170 LZMA_FINISH_END - Stream must be finished after dicLimit. | |
171 | |
172 Returns: | |
173 SZ_OK | |
174 status: | |
175 LZMA_STATUS_FINISHED_WITH_MARK | |
176 LZMA_STATUS_NOT_FINISHED | |
177 LZMA_STATUS_NEEDS_MORE_INPUT | |
178 LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK | |
179 SZ_ERROR_DATA - Data error | |
180 */ | |
181 | |
182 SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, | |
183 const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *sta
tus); | |
184 | |
185 | |
186 /* ---------- Buffer Interface ---------- */ | |
187 | |
188 /* It's zlib-like interface. | |
189 See LzmaDec_DecodeToDic description for information about STEPS and return re
sults, | |
190 but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you d
on't need | |
191 to work with CLzmaDec variables manually. | |
192 | |
193 finishMode: | |
194 It has meaning only if the decoding reaches output limit (*destLen). | |
195 LZMA_FINISH_ANY - Decode just destLen bytes. | |
196 LZMA_FINISH_END - Stream must be finished after (*destLen). | |
197 */ | |
198 | |
199 SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, | |
200 const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *sta
tus); | |
201 | |
202 | |
203 /* ---------- One Call Interface ---------- */ | |
204 | |
205 /* LzmaDecode | |
206 | |
207 finishMode: | |
208 It has meaning only if the decoding reaches output limit (*destLen). | |
209 LZMA_FINISH_ANY - Decode just destLen bytes. | |
210 LZMA_FINISH_END - Stream must be finished after (*destLen). | |
211 | |
212 Returns: | |
213 SZ_OK | |
214 status: | |
215 LZMA_STATUS_FINISHED_WITH_MARK | |
216 LZMA_STATUS_NOT_FINISHED | |
217 LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK | |
218 SZ_ERROR_DATA - Data error | |
219 SZ_ERROR_MEM - Memory allocation error | |
220 SZ_ERROR_UNSUPPORTED - Unsupported properties | |
221 SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). | |
222 */ | |
223 | |
224 SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, | |
225 const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, | |
226 ELzmaStatus *status, ISzAlloc *alloc); | |
227 | |
228 #ifdef __cplusplus | |
229 } | |
230 #endif | |
231 | |
232 #endif | |
OLD | NEW |