178acc472SPeter Tyser /* LzmaDec.h -- LZMA Decoder 2*5fe8380dSStefan Reinauer 2009-02-07 : Igor Pavlov : Public domain */ 378acc472SPeter Tyser 4*5fe8380dSStefan Reinauer #ifndef __LZMA_DEC_H 5*5fe8380dSStefan Reinauer #define __LZMA_DEC_H 678acc472SPeter Tyser 778acc472SPeter Tyser #include "Types.h" 878acc472SPeter Tyser 978acc472SPeter Tyser /* #define _LZMA_PROB32 */ 1078acc472SPeter Tyser /* _LZMA_PROB32 can increase the speed on some CPUs, 1178acc472SPeter Tyser but memory usage for CLzmaDec::probs will be doubled in that case */ 1278acc472SPeter Tyser 1378acc472SPeter Tyser #ifdef _LZMA_PROB32 1478acc472SPeter Tyser #define CLzmaProb UInt32 1578acc472SPeter Tyser #else 1678acc472SPeter Tyser #define CLzmaProb UInt16 1778acc472SPeter Tyser #endif 1878acc472SPeter Tyser 1978acc472SPeter Tyser 2078acc472SPeter Tyser /* ---------- LZMA Properties ---------- */ 2178acc472SPeter Tyser 2278acc472SPeter Tyser #define LZMA_PROPS_SIZE 5 2378acc472SPeter Tyser 2478acc472SPeter Tyser typedef struct _CLzmaProps 2578acc472SPeter Tyser { 2678acc472SPeter Tyser unsigned lc, lp, pb; 2778acc472SPeter Tyser UInt32 dicSize; 2878acc472SPeter Tyser } CLzmaProps; 2978acc472SPeter Tyser 3078acc472SPeter Tyser /* LzmaProps_Decode - decodes properties 3178acc472SPeter Tyser Returns: 3278acc472SPeter Tyser SZ_OK 3378acc472SPeter Tyser SZ_ERROR_UNSUPPORTED - Unsupported properties 3478acc472SPeter Tyser */ 3578acc472SPeter Tyser 3678acc472SPeter Tyser SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); 3778acc472SPeter Tyser 3878acc472SPeter Tyser 3978acc472SPeter Tyser /* ---------- LZMA Decoder state ---------- */ 4078acc472SPeter Tyser 4178acc472SPeter Tyser /* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. 4278acc472SPeter Tyser Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ 4378acc472SPeter Tyser 4478acc472SPeter Tyser #define LZMA_REQUIRED_INPUT_MAX 20 4578acc472SPeter Tyser 4678acc472SPeter Tyser typedef struct 4778acc472SPeter Tyser { 4878acc472SPeter Tyser CLzmaProps prop; 4978acc472SPeter Tyser CLzmaProb *probs; 5078acc472SPeter Tyser Byte *dic; 5178acc472SPeter Tyser const Byte *buf; 5278acc472SPeter Tyser UInt32 range, code; 5378acc472SPeter Tyser SizeT dicPos; 5478acc472SPeter Tyser SizeT dicBufSize; 5578acc472SPeter Tyser UInt32 processedPos; 5678acc472SPeter Tyser UInt32 checkDicSize; 5778acc472SPeter Tyser unsigned state; 5878acc472SPeter Tyser UInt32 reps[4]; 5978acc472SPeter Tyser unsigned remainLen; 6078acc472SPeter Tyser int needFlush; 6178acc472SPeter Tyser int needInitState; 6278acc472SPeter Tyser UInt32 numProbs; 6378acc472SPeter Tyser unsigned tempBufSize; 6478acc472SPeter Tyser Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; 6578acc472SPeter Tyser } CLzmaDec; 6678acc472SPeter Tyser 6778acc472SPeter Tyser #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } 6878acc472SPeter Tyser 6978acc472SPeter Tyser void LzmaDec_Init(CLzmaDec *p); 7078acc472SPeter Tyser 7178acc472SPeter Tyser /* There are two types of LZMA streams: 7278acc472SPeter Tyser 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. 7378acc472SPeter Tyser 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ 7478acc472SPeter Tyser 7578acc472SPeter Tyser typedef enum 7678acc472SPeter Tyser { 7778acc472SPeter Tyser LZMA_FINISH_ANY, /* finish at any point */ 7878acc472SPeter Tyser LZMA_FINISH_END /* block must be finished at the end */ 7978acc472SPeter Tyser } ELzmaFinishMode; 8078acc472SPeter Tyser 8178acc472SPeter Tyser /* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! 8278acc472SPeter Tyser 8378acc472SPeter Tyser You must use LZMA_FINISH_END, when you know that current output buffer 8478acc472SPeter Tyser covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. 8578acc472SPeter Tyser 8678acc472SPeter Tyser If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, 8778acc472SPeter Tyser and output value of destLen will be less than output buffer size limit. 8878acc472SPeter Tyser You can check status result also. 8978acc472SPeter Tyser 9078acc472SPeter Tyser You can use multiple checks to test data integrity after full decompression: 9178acc472SPeter Tyser 1) Check Result and "status" variable. 9278acc472SPeter Tyser 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. 9378acc472SPeter Tyser 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. 9478acc472SPeter Tyser You must use correct finish mode in that case. */ 9578acc472SPeter Tyser 9678acc472SPeter Tyser typedef enum 9778acc472SPeter Tyser { 9878acc472SPeter Tyser LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ 9978acc472SPeter Tyser LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ 10078acc472SPeter Tyser LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ 10178acc472SPeter Tyser LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ 10278acc472SPeter Tyser LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ 10378acc472SPeter Tyser } ELzmaStatus; 10478acc472SPeter Tyser 10578acc472SPeter Tyser /* ELzmaStatus is used only as output value for function call */ 10678acc472SPeter Tyser 10778acc472SPeter Tyser 10878acc472SPeter Tyser /* ---------- Interfaces ---------- */ 10978acc472SPeter Tyser 11078acc472SPeter Tyser /* There are 3 levels of interfaces: 11178acc472SPeter Tyser 1) Dictionary Interface 11278acc472SPeter Tyser 2) Buffer Interface 11378acc472SPeter Tyser 3) One Call Interface 11478acc472SPeter Tyser You can select any of these interfaces, but don't mix functions from different 11578acc472SPeter Tyser groups for same object. */ 11678acc472SPeter Tyser 11778acc472SPeter Tyser 11878acc472SPeter Tyser /* There are two variants to allocate state for Dictionary Interface: 11978acc472SPeter Tyser 1) LzmaDec_Allocate / LzmaDec_Free 12078acc472SPeter Tyser 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs 12178acc472SPeter Tyser You can use variant 2, if you set dictionary buffer manually. 12278acc472SPeter Tyser For Buffer Interface you must always use variant 1. 12378acc472SPeter Tyser 12478acc472SPeter Tyser LzmaDec_Allocate* can return: 12578acc472SPeter Tyser SZ_OK 12678acc472SPeter Tyser SZ_ERROR_MEM - Memory allocation error 12778acc472SPeter Tyser SZ_ERROR_UNSUPPORTED - Unsupported properties 12878acc472SPeter Tyser */ 12978acc472SPeter Tyser 13078acc472SPeter Tyser SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); 13178acc472SPeter Tyser void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); 13278acc472SPeter Tyser 13378acc472SPeter Tyser SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); 13478acc472SPeter Tyser void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); 13578acc472SPeter Tyser 13678acc472SPeter Tyser /* ---------- Dictionary Interface ---------- */ 13778acc472SPeter Tyser 13878acc472SPeter Tyser /* You can use it, if you want to eliminate the overhead for data copying from 13978acc472SPeter Tyser dictionary to some other external buffer. 14078acc472SPeter Tyser You must work with CLzmaDec variables directly in this interface. 14178acc472SPeter Tyser 14278acc472SPeter Tyser STEPS: 14378acc472SPeter Tyser LzmaDec_Constr() 14478acc472SPeter Tyser LzmaDec_Allocate() 14578acc472SPeter Tyser for (each new stream) 14678acc472SPeter Tyser { 14778acc472SPeter Tyser LzmaDec_Init() 14878acc472SPeter Tyser while (it needs more decompression) 14978acc472SPeter Tyser { 15078acc472SPeter Tyser LzmaDec_DecodeToDic() 15178acc472SPeter Tyser use data from CLzmaDec::dic and update CLzmaDec::dicPos 15278acc472SPeter Tyser } 15378acc472SPeter Tyser } 15478acc472SPeter Tyser LzmaDec_Free() 15578acc472SPeter Tyser */ 15678acc472SPeter Tyser 15778acc472SPeter Tyser /* LzmaDec_DecodeToDic 15878acc472SPeter Tyser 15978acc472SPeter Tyser The decoding to internal dictionary buffer (CLzmaDec::dic). 16078acc472SPeter Tyser You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! 16178acc472SPeter Tyser 16278acc472SPeter Tyser finishMode: 16378acc472SPeter Tyser It has meaning only if the decoding reaches output limit (dicLimit). 16478acc472SPeter Tyser LZMA_FINISH_ANY - Decode just dicLimit bytes. 16578acc472SPeter Tyser LZMA_FINISH_END - Stream must be finished after dicLimit. 16678acc472SPeter Tyser 16778acc472SPeter Tyser Returns: 16878acc472SPeter Tyser SZ_OK 16978acc472SPeter Tyser status: 17078acc472SPeter Tyser LZMA_STATUS_FINISHED_WITH_MARK 17178acc472SPeter Tyser LZMA_STATUS_NOT_FINISHED 17278acc472SPeter Tyser LZMA_STATUS_NEEDS_MORE_INPUT 17378acc472SPeter Tyser LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK 17478acc472SPeter Tyser SZ_ERROR_DATA - Data error 17578acc472SPeter Tyser */ 17678acc472SPeter Tyser 17778acc472SPeter Tyser SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, 17878acc472SPeter Tyser const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); 17978acc472SPeter Tyser 18078acc472SPeter Tyser 18178acc472SPeter Tyser /* ---------- Buffer Interface ---------- */ 18278acc472SPeter Tyser 18378acc472SPeter Tyser /* It's zlib-like interface. 18478acc472SPeter Tyser See LzmaDec_DecodeToDic description for information about STEPS and return results, 18578acc472SPeter Tyser but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need 18678acc472SPeter Tyser to work with CLzmaDec variables manually. 18778acc472SPeter Tyser 18878acc472SPeter Tyser finishMode: 18978acc472SPeter Tyser It has meaning only if the decoding reaches output limit (*destLen). 19078acc472SPeter Tyser LZMA_FINISH_ANY - Decode just destLen bytes. 19178acc472SPeter Tyser LZMA_FINISH_END - Stream must be finished after (*destLen). 19278acc472SPeter Tyser */ 19378acc472SPeter Tyser 19478acc472SPeter Tyser SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, 19578acc472SPeter Tyser const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); 19678acc472SPeter Tyser 19778acc472SPeter Tyser 19878acc472SPeter Tyser /* ---------- One Call Interface ---------- */ 19978acc472SPeter Tyser 20078acc472SPeter Tyser /* LzmaDecode 20178acc472SPeter Tyser 20278acc472SPeter Tyser finishMode: 20378acc472SPeter Tyser It has meaning only if the decoding reaches output limit (*destLen). 20478acc472SPeter Tyser LZMA_FINISH_ANY - Decode just destLen bytes. 20578acc472SPeter Tyser LZMA_FINISH_END - Stream must be finished after (*destLen). 20678acc472SPeter Tyser 20778acc472SPeter Tyser Returns: 20878acc472SPeter Tyser SZ_OK 20978acc472SPeter Tyser status: 21078acc472SPeter Tyser LZMA_STATUS_FINISHED_WITH_MARK 21178acc472SPeter Tyser LZMA_STATUS_NOT_FINISHED 21278acc472SPeter Tyser LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK 21378acc472SPeter Tyser SZ_ERROR_DATA - Data error 21478acc472SPeter Tyser SZ_ERROR_MEM - Memory allocation error 21578acc472SPeter Tyser SZ_ERROR_UNSUPPORTED - Unsupported properties 21678acc472SPeter Tyser SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). 21778acc472SPeter Tyser */ 21878acc472SPeter Tyser 21978acc472SPeter Tyser SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, 22078acc472SPeter Tyser const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, 22178acc472SPeter Tyser ELzmaStatus *status, ISzAlloc *alloc); 22278acc472SPeter Tyser 22378acc472SPeter Tyser #endif 224