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