- /* LzmaDec.h -- LZMA Decoder 
- 2008-10-04 : Igor Pavlov : Public domain */ 
-   
- #ifndef __LZMADEC_H 
- #define __LZMADEC_H 
-   
- #include "Types.h" 
-   
- /* #define _LZMA_PROB32 */ 
- /* _LZMA_PROB32 can increase the speed on some CPUs, 
-    but memory usage for CLzmaDec::probs will be doubled in that case */ 
-   
- #ifdef _LZMA_PROB32 
- #define CLzmaProb UInt32 
- #else 
- #define CLzmaProb UInt16 
- #endif 
-   
-   
- /* ---------- LZMA Properties ---------- */ 
-   
- #define LZMA_PROPS_SIZE 5 
-   
- typedef struct _CLzmaProps 
- { 
-   unsigned lc, lp, pb; 
-   UInt32 dicSize; 
- } CLzmaProps; 
-   
- /* LzmaProps_Decode - decodes properties 
- Returns: 
-   SZ_OK 
-   SZ_ERROR_UNSUPPORTED - Unsupported properties 
- */ 
-   
- SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); 
-   
-   
- /* ---------- LZMA Decoder state ---------- */ 
-   
- /* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. 
-    Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ 
-   
- #define LZMA_REQUIRED_INPUT_MAX 20 
-   
- typedef struct CLzmaDec 
- { 
-   CLzmaProps prop; 
-   CLzmaProb *probs; 
-   Byte *dic; 
-   const Byte *buf; 
-   UInt32 range, code; 
-   SizeT dicPos; 
-   SizeT dicBufSize; 
-   UInt32 processedPos; 
-   UInt32 checkDicSize; 
-   unsigned state; 
-   UInt32 reps[4]; 
-   unsigned remainLen; 
-   int needFlush; 
-   int needInitState; 
-   UInt32 numProbs; 
-   unsigned tempBufSize; 
-   Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; 
- } CLzmaDec; 
-   
- #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } 
-   
- void LzmaDec_Init(CLzmaDec *p); 
-   
- /* There are two types of LZMA streams: 
-      0) Stream with end mark. That end mark adds about 6 bytes to compressed size. 
-      1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ 
-   
- typedef enum ELzmaFinishMode 
- { 
-   LZMA_FINISH_ANY,   /* finish at any point */ 
-   LZMA_FINISH_END    /* block must be finished at the end */ 
- } ELzmaFinishMode; 
-   
- /* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! 
-   
-    You must use LZMA_FINISH_END, when you know that current output buffer 
-    covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. 
-   
-    If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, 
-    and output value of destLen will be less than output buffer size limit. 
-    You can check status result also. 
-   
-    You can use multiple checks to test data integrity after full decompression: 
-      1) Check Result and "status" variable. 
-      2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. 
-      3) Check that output(srcLen) = compressedSize, if you know real compressedSize. 
-         You must use correct finish mode in that case. */ 
-   
- typedef enum ELzmaStatus 
- { 
-   LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */ 
-   LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */ 
-   LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */ 
-   LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */ 
-   LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */ 
- } ELzmaStatus; 
-   
- /* ELzmaStatus is used only as output value for function call */ 
-   
-   
- /* ---------- Interfaces ---------- */ 
-   
- /* There are 3 levels of interfaces: 
-      1) Dictionary Interface 
-      2) Buffer Interface 
-      3) One Call Interface 
-    You can select any of these interfaces, but don't mix functions from different 
-    groups for same object. */ 
-   
-   
- /* There are two variants to allocate state for Dictionary Interface: 
-      1) LzmaDec_Allocate / LzmaDec_Free 
-      2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs 
-    You can use variant 2, if you set dictionary buffer manually. 
-    For Buffer Interface you must always use variant 1. 
-   
- LzmaDec_Allocate* can return: 
-   SZ_OK 
-   SZ_ERROR_MEM         - Memory allocation error 
-   SZ_ERROR_UNSUPPORTED - Unsupported properties 
- */ 
-     
- SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); 
- void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); 
-   
- SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); 
- void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); 
-   
- /* ---------- Dictionary Interface ---------- */ 
-   
- /* You can use it, if you want to eliminate the overhead for data copying from 
-    dictionary to some other external buffer. 
-    You must work with CLzmaDec variables directly in this interface. 
-   
-    STEPS: 
-      LzmaDec_Constr() 
-      LzmaDec_Allocate() 
-      for (each new stream) 
-      { 
-        LzmaDec_Init() 
-        while (it needs more decompression) 
-        { 
-          LzmaDec_DecodeToDic() 
-          use data from CLzmaDec::dic and update CLzmaDec::dicPos 
-        } 
-      } 
-      LzmaDec_Free() 
- */ 
-   
- /* LzmaDec_DecodeToDic 
-     
-    The decoding to internal dictionary buffer (CLzmaDec::dic). 
-    You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! 
-   
- finishMode: 
-   It has meaning only if the decoding reaches output limit (dicLimit). 
-   LZMA_FINISH_ANY - Decode just dicLimit bytes. 
-   LZMA_FINISH_END - Stream must be finished after dicLimit. 
-   
- Returns: 
-   SZ_OK 
-     status: 
-       LZMA_STATUS_FINISHED_WITH_MARK 
-       LZMA_STATUS_NOT_FINISHED 
-       LZMA_STATUS_NEEDS_MORE_INPUT 
-       LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK 
-   SZ_ERROR_DATA - Data error 
- */ 
-   
- SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, 
-     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); 
-   
-   
- /* ---------- Buffer Interface ---------- */ 
-   
- /* It's zlib-like interface. 
-    See LzmaDec_DecodeToDic description for information about STEPS and return results, 
-    but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need 
-    to work with CLzmaDec variables manually. 
-   
- finishMode: 
-   It has meaning only if the decoding reaches output limit (*destLen). 
-   LZMA_FINISH_ANY - Decode just destLen bytes. 
-   LZMA_FINISH_END - Stream must be finished after (*destLen). 
- */ 
-   
- SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, 
-     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); 
-   
-   
- /* ---------- One Call Interface ---------- */ 
-   
- /* LzmaDecode 
-   
- finishMode: 
-   It has meaning only if the decoding reaches output limit (*destLen). 
-   LZMA_FINISH_ANY - Decode just destLen bytes. 
-   LZMA_FINISH_END - Stream must be finished after (*destLen). 
-   
- Returns: 
-   SZ_OK 
-     status: 
-       LZMA_STATUS_FINISHED_WITH_MARK 
-       LZMA_STATUS_NOT_FINISHED 
-       LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK 
-   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 LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, 
-     const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, 
-     ELzmaStatus *status, ISzAlloc *alloc); 
-   
- #endif 
-