aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/lzmasdk/Lzma2Dec.h
blob: 74948d910b547676f9632c6b1c35ccd0fa21d268 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* 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