/* 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 |