Source code
Revision control
Copy as Markdown
Other Tools
/* 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↩