xref: /aosp_15_r20/external/lzma/C/Lzma2Dec.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* Lzma2Dec.h -- LZMA2 Decoder
2*f6dc9357SAndroid Build Coastguard Worker 2023-03-03 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LZMA2_DEC_H
5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LZMA2_DEC_H
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "LzmaDec.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker /* ---------- State Interface ---------- */
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker typedef struct
14*f6dc9357SAndroid Build Coastguard Worker {
15*f6dc9357SAndroid Build Coastguard Worker   unsigned state;
16*f6dc9357SAndroid Build Coastguard Worker   Byte control;
17*f6dc9357SAndroid Build Coastguard Worker   Byte needInitLevel;
18*f6dc9357SAndroid Build Coastguard Worker   Byte isExtraMode;
19*f6dc9357SAndroid Build Coastguard Worker   Byte _pad_;
20*f6dc9357SAndroid Build Coastguard Worker   UInt32 packSize;
21*f6dc9357SAndroid Build Coastguard Worker   UInt32 unpackSize;
22*f6dc9357SAndroid Build Coastguard Worker   CLzmaDec decoder;
23*f6dc9357SAndroid Build Coastguard Worker } CLzma2Dec;
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker #define Lzma2Dec_CONSTRUCT(p)  LzmaDec_CONSTRUCT(&(p)->decoder)
26*f6dc9357SAndroid Build Coastguard Worker #define Lzma2Dec_Construct(p)  Lzma2Dec_CONSTRUCT(p)
27*f6dc9357SAndroid Build Coastguard Worker #define Lzma2Dec_FreeProbs(p, alloc)  LzmaDec_FreeProbs(&(p)->decoder, alloc)
28*f6dc9357SAndroid Build Coastguard Worker #define Lzma2Dec_Free(p, alloc)  LzmaDec_Free(&(p)->decoder, alloc)
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc);
31*f6dc9357SAndroid Build Coastguard Worker SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc);
32*f6dc9357SAndroid Build Coastguard Worker void Lzma2Dec_Init(CLzma2Dec *p);
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker /*
35*f6dc9357SAndroid Build Coastguard Worker finishMode:
36*f6dc9357SAndroid Build Coastguard Worker   It has meaning only if the decoding reaches output limit (*destLen or dicLimit).
37*f6dc9357SAndroid Build Coastguard Worker   LZMA_FINISH_ANY - use smallest number of input bytes
38*f6dc9357SAndroid Build Coastguard Worker   LZMA_FINISH_END - read EndOfStream marker after decoding
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker Returns:
41*f6dc9357SAndroid Build Coastguard Worker   SZ_OK
42*f6dc9357SAndroid Build Coastguard Worker     status:
43*f6dc9357SAndroid Build Coastguard Worker       LZMA_STATUS_FINISHED_WITH_MARK
44*f6dc9357SAndroid Build Coastguard Worker       LZMA_STATUS_NOT_FINISHED
45*f6dc9357SAndroid Build Coastguard Worker       LZMA_STATUS_NEEDS_MORE_INPUT
46*f6dc9357SAndroid Build Coastguard Worker   SZ_ERROR_DATA - Data error
47*f6dc9357SAndroid Build Coastguard Worker */
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,
50*f6dc9357SAndroid Build Coastguard Worker     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen,
53*f6dc9357SAndroid Build Coastguard Worker     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker /* ---------- LZMA2 block and chunk parsing ---------- */
57*f6dc9357SAndroid Build Coastguard Worker 
58*f6dc9357SAndroid Build Coastguard Worker /*
59*f6dc9357SAndroid Build Coastguard Worker Lzma2Dec_Parse() parses compressed data stream up to next independent block or next chunk data.
60*f6dc9357SAndroid Build Coastguard Worker It can return LZMA_STATUS_* code or LZMA2_PARSE_STATUS_* code:
61*f6dc9357SAndroid Build Coastguard Worker   - LZMA2_PARSE_STATUS_NEW_BLOCK - there is new block, and 1 additional byte (control byte of next block header) was read from input.
62*f6dc9357SAndroid Build Coastguard Worker   - LZMA2_PARSE_STATUS_NEW_CHUNK - there is new chunk, and only lzma2 header of new chunk was read.
63*f6dc9357SAndroid Build Coastguard Worker                                    CLzma2Dec::unpackSize contains unpack size of that chunk
64*f6dc9357SAndroid Build Coastguard Worker */
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker typedef enum
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker /*
69*f6dc9357SAndroid Build Coastguard Worker   LZMA_STATUS_NOT_SPECIFIED                 // data error
70*f6dc9357SAndroid Build Coastguard Worker   LZMA_STATUS_FINISHED_WITH_MARK
71*f6dc9357SAndroid Build Coastguard Worker   LZMA_STATUS_NOT_FINISHED                  //
72*f6dc9357SAndroid Build Coastguard Worker   LZMA_STATUS_NEEDS_MORE_INPUT
73*f6dc9357SAndroid Build Coastguard Worker   LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK   // unused
74*f6dc9357SAndroid Build Coastguard Worker */
75*f6dc9357SAndroid Build Coastguard Worker   LZMA2_PARSE_STATUS_NEW_BLOCK = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + 1,
76*f6dc9357SAndroid Build Coastguard Worker   LZMA2_PARSE_STATUS_NEW_CHUNK
77*f6dc9357SAndroid Build Coastguard Worker } ELzma2ParseStatus;
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
80*f6dc9357SAndroid Build Coastguard Worker     SizeT outSize,   // output size
81*f6dc9357SAndroid Build Coastguard Worker     const Byte *src, SizeT *srcLen,
82*f6dc9357SAndroid Build Coastguard Worker     int checkFinishBlock   // set (checkFinishBlock = 1), if it must read full input data, if decoder.dicPos reaches blockMax position.
83*f6dc9357SAndroid Build Coastguard Worker     );
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker /*
86*f6dc9357SAndroid Build Coastguard Worker LZMA2 parser doesn't decode LZMA chunks, so we must read
87*f6dc9357SAndroid Build Coastguard Worker   full input LZMA chunk to decode some part of LZMA chunk.
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker Lzma2Dec_GetUnpackExtra() returns the value that shows
90*f6dc9357SAndroid Build Coastguard Worker     max possible number of output bytes that can be output by decoder
91*f6dc9357SAndroid Build Coastguard Worker     at current input positon.
92*f6dc9357SAndroid Build Coastguard Worker */
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker #define Lzma2Dec_GetUnpackExtra(p)  ((p)->isExtraMode ? (p)->unpackSize : 0)
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker /* ---------- One Call Interface ---------- */
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker /*
100*f6dc9357SAndroid Build Coastguard Worker finishMode:
101*f6dc9357SAndroid Build Coastguard Worker   It has meaning only if the decoding reaches output limit (*destLen).
102*f6dc9357SAndroid Build Coastguard Worker   LZMA_FINISH_ANY - use smallest number of input bytes
103*f6dc9357SAndroid Build Coastguard Worker   LZMA_FINISH_END - read EndOfStream marker after decoding
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker Returns:
106*f6dc9357SAndroid Build Coastguard Worker   SZ_OK
107*f6dc9357SAndroid Build Coastguard Worker     status:
108*f6dc9357SAndroid Build Coastguard Worker       LZMA_STATUS_FINISHED_WITH_MARK
109*f6dc9357SAndroid Build Coastguard Worker       LZMA_STATUS_NOT_FINISHED
110*f6dc9357SAndroid Build Coastguard Worker   SZ_ERROR_DATA - Data error
111*f6dc9357SAndroid Build Coastguard Worker   SZ_ERROR_MEM  - Memory allocation error
112*f6dc9357SAndroid Build Coastguard Worker   SZ_ERROR_UNSUPPORTED - Unsupported properties
113*f6dc9357SAndroid Build Coastguard Worker   SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
114*f6dc9357SAndroid Build Coastguard Worker */
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
117*f6dc9357SAndroid Build Coastguard Worker     Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc);
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker #endif
122