Home | History | Annotate | Download | only in C
      1 /* Lzma2Dec.h -- LZMA2 Decoder
      2 2018-02-19 : Igor Pavlov : Public domain */
      3 
      4 #ifndef __LZMA2_DEC_H
      5 #define __LZMA2_DEC_H
      6 
      7 #include "LzmaDec.h"
      8 
      9 EXTERN_C_BEGIN
     10 
     11 /* ---------- State Interface ---------- */
     12 
     13 typedef struct
     14 {
     15   unsigned state;
     16   Byte control;
     17   Byte needInitLevel;
     18   Byte isExtraMode;
     19   Byte _pad_;
     20   UInt32 packSize;
     21   UInt32 unpackSize;
     22   CLzmaDec decoder;
     23 } CLzma2Dec;
     24 
     25 #define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder)
     26 #define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc)
     27 #define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc)
     28 
     29 SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc);
     30 SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc);
     31 void Lzma2Dec_Init(CLzma2Dec *p);
     32 
     33 /*
     34 finishMode:
     35   It has meaning only if the decoding reaches output limit (*destLen or dicLimit).
     36   LZMA_FINISH_ANY - use smallest number of input bytes
     37   LZMA_FINISH_END - read EndOfStream marker after decoding
     38 
     39 Returns:
     40   SZ_OK
     41     status:
     42       LZMA_STATUS_FINISHED_WITH_MARK
     43       LZMA_STATUS_NOT_FINISHED
     44       LZMA_STATUS_NEEDS_MORE_INPUT
     45   SZ_ERROR_DATA - Data error
     46 */
     47 
     48 SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,
     49     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
     50 
     51 SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen,
     52     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
     53 
     54 
     55 /* ---------- LZMA2 block and chunk parsing ---------- */
     56 
     57 /*
     58 Lzma2Dec_Parse() parses compressed data stream up to next independent block or next chunk data.
     59 It can return LZMA_STATUS_* code or LZMA2_PARSE_STATUS_* code:
     60   - LZMA2_PARSE_STATUS_NEW_BLOCK - there is new block, and 1 additional byte (control byte of next block header) was read from input.
     61   - LZMA2_PARSE_STATUS_NEW_CHUNK - there is new chunk, and only lzma2 header of new chunk was read.
     62                                    CLzma2Dec::unpackSize contains unpack size of that chunk
     63 */
     64 
     65 typedef enum
     66 {
     67 /*
     68   LZMA_STATUS_NOT_SPECIFIED                 // data error
     69   LZMA_STATUS_FINISHED_WITH_MARK
     70   LZMA_STATUS_NOT_FINISHED                  //
     71   LZMA_STATUS_NEEDS_MORE_INPUT
     72   LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK   // unused
     73 */
     74   LZMA2_PARSE_STATUS_NEW_BLOCK = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + 1,
     75   LZMA2_PARSE_STATUS_NEW_CHUNK
     76 } ELzma2ParseStatus;
     77 
     78 ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
     79     SizeT outSize,   // output size
     80     const Byte *src, SizeT *srcLen,
     81     int checkFinishBlock   // set (checkFinishBlock = 1), if it must read full input data, if decoder.dicPos reaches blockMax position.
     82     );
     83 
     84 /*
     85 LZMA2 parser doesn't decode LZMA chunks, so we must read
     86   full input LZMA chunk to decode some part of LZMA chunk.
     87 
     88 Lzma2Dec_GetUnpackExtra() returns the value that shows
     89     max possible number of output bytes that can be output by decoder
     90     at current input positon.
     91 */
     92 
     93 #define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0);
     94 
     95 
     96 /* ---------- One Call Interface ---------- */
     97 
     98 /*
     99 finishMode:
    100   It has meaning only if the decoding reaches output limit (*destLen).
    101   LZMA_FINISH_ANY - use smallest number of input bytes
    102   LZMA_FINISH_END - read EndOfStream marker after decoding
    103 
    104 Returns:
    105   SZ_OK
    106     status:
    107       LZMA_STATUS_FINISHED_WITH_MARK
    108       LZMA_STATUS_NOT_FINISHED
    109   SZ_ERROR_DATA - Data error
    110   SZ_ERROR_MEM  - Memory allocation error
    111   SZ_ERROR_UNSUPPORTED - Unsupported properties
    112   SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
    113 */
    114 
    115 SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
    116     Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc);
    117 
    118 EXTERN_C_END
    119 
    120 #endif
    121