| /* Lzma2Dec.h -- LZMA2 Decoder |
| 2018-02-19 : Igor Pavlov : Public domain */ |
| |
| #ifndef __LZMA2_DEC_H |
| #define __LZMA2_DEC_H |
| |
| #include "LzmaDec.h" |
| |
| EXTERN_C_BEGIN |
| |
| /* ---------- State Interface ---------- */ |
| |
| typedef struct |
| { |
| unsigned state; |
| Byte control; |
| Byte needInitLevel; |
| Byte isExtraMode; |
| Byte _pad_; |
| UInt32 packSize; |
| UInt32 unpackSize; |
| CLzmaDec decoder; |
| } CLzma2Dec; |
| |
| #define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) |
| #define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc) |
| #define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc) |
| |
| SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); |
| SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); |
| void Lzma2Dec_Init(CLzma2Dec *p); |
| |
| /* |
| finishMode: |
| It has meaning only if the decoding reaches output limit (*destLen or dicLimit). |
| LZMA_FINISH_ANY - use smallest number of input bytes |
| LZMA_FINISH_END - read EndOfStream marker after decoding |
| |
| Returns: |
| SZ_OK |
| status: |
| LZMA_STATUS_FINISHED_WITH_MARK |
| LZMA_STATUS_NOT_FINISHED |
| LZMA_STATUS_NEEDS_MORE_INPUT |
| SZ_ERROR_DATA - Data error |
| */ |
| |
| SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, |
| const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); |
| |
| SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, |
| const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); |
| |
| |
| /* ---------- LZMA2 block and chunk parsing ---------- */ |
| |
| /* |
| Lzma2Dec_Parse() parses compressed data stream up to next independent block or next chunk data. |
| It can return LZMA_STATUS_* code or LZMA2_PARSE_STATUS_* code: |
| - LZMA2_PARSE_STATUS_NEW_BLOCK - there is new block, and 1 additional byte (control byte of next block header) was read from input. |
| - LZMA2_PARSE_STATUS_NEW_CHUNK - there is new chunk, and only lzma2 header of new chunk was read. |
| CLzma2Dec::unpackSize contains unpack size of that chunk |
| */ |
| |
| typedef enum |
| { |
| /* |
| LZMA_STATUS_NOT_SPECIFIED // data error |
| LZMA_STATUS_FINISHED_WITH_MARK |
| LZMA_STATUS_NOT_FINISHED // |
| LZMA_STATUS_NEEDS_MORE_INPUT |
| LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK // unused |
| */ |
| LZMA2_PARSE_STATUS_NEW_BLOCK = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + 1, |
| LZMA2_PARSE_STATUS_NEW_CHUNK |
| } ELzma2ParseStatus; |
| |
| ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, |
| SizeT outSize, // output size |
| const Byte *src, SizeT *srcLen, |
| int checkFinishBlock // set (checkFinishBlock = 1), if it must read full input data, if decoder.dicPos reaches blockMax position. |
| ); |
| |
| /* |
| LZMA2 parser doesn't decode LZMA chunks, so we must read |
| full input LZMA chunk to decode some part of LZMA chunk. |
| |
| Lzma2Dec_GetUnpackExtra() returns the value that shows |
| max possible number of output bytes that can be output by decoder |
| at current input positon. |
| */ |
| |
| #define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0); |
| |
| |
| /* ---------- One Call Interface ---------- */ |
| |
| /* |
| finishMode: |
| It has meaning only if the decoding reaches output limit (*destLen). |
| LZMA_FINISH_ANY - use smallest number of input bytes |
| LZMA_FINISH_END - read EndOfStream marker after decoding |
| |
| Returns: |
| SZ_OK |
| status: |
| LZMA_STATUS_FINISHED_WITH_MARK |
| LZMA_STATUS_NOT_FINISHED |
| SZ_ERROR_DATA - Data error |
| SZ_ERROR_MEM - Memory allocation error |
| SZ_ERROR_UNSUPPORTED - Unsupported properties |
| SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). |
| */ |
| |
| SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, |
| Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc); |
| |
| EXTERN_C_END |
| |
| #endif |