1
/* LzmaDec.c -- LZMA Decoder
2
2008-11-06 : Igor Pavlov : Public domain */
9
#include <linux/string.h>
11
#define kNumTopBits 24
12
#define kTopValue ((UInt32)1 << kNumTopBits)
14
#define kNumBitModelTotalBits 11
15
#define kBitModelTotal (1 << kNumBitModelTotalBits)
16
#define kNumMoveBits 5
18
#define RC_INIT_SIZE 5
20
#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
22
#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
23
#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
24
#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
25
#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
26
{ UPDATE_0(p); i = (i + i); A0; } else \
27
{ UPDATE_1(p); i = (i + i) + 1; A1; }
28
#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
30
#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
31
#define TREE_DECODE(probs, limit, i) \
32
{ i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
34
/* #define _LZMA_SIZE_OPT */
37
#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
39
#define TREE_6_DECODE(probs, i) \
41
TREE_GET_BIT(probs, i); \
42
TREE_GET_BIT(probs, i); \
43
TREE_GET_BIT(probs, i); \
44
TREE_GET_BIT(probs, i); \
45
TREE_GET_BIT(probs, i); \
46
TREE_GET_BIT(probs, i); \
50
#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
52
#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
53
#define UPDATE_0_CHECK range = bound;
54
#define UPDATE_1_CHECK range -= bound; code -= bound;
55
#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
56
{ UPDATE_0_CHECK; i = (i + i); A0; } else \
57
{ UPDATE_1_CHECK; i = (i + i) + 1; A1; }
58
#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
59
#define TREE_DECODE_CHECK(probs, limit, i) \
60
{ i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
63
#define kNumPosBitsMax 4
64
#define kNumPosStatesMax (1 << kNumPosBitsMax)
66
#define kLenNumLowBits 3
67
#define kLenNumLowSymbols (1 << kLenNumLowBits)
68
#define kLenNumMidBits 3
69
#define kLenNumMidSymbols (1 << kLenNumMidBits)
70
#define kLenNumHighBits 8
71
#define kLenNumHighSymbols (1 << kLenNumHighBits)
74
#define LenChoice2 (LenChoice + 1)
75
#define LenLow (LenChoice2 + 1)
76
#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
77
#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
78
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
82
#define kNumLitStates 7
84
#define kStartPosModelIndex 4
85
#define kEndPosModelIndex 14
86
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
88
#define kNumPosSlotBits 6
89
#define kNumLenToPosStates 4
91
#define kNumAlignBits 4
92
#define kAlignTableSize (1 << kNumAlignBits)
94
#define kMatchMinLen 2
95
#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
98
#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
99
#define IsRepG0 (IsRep + kNumStates)
100
#define IsRepG1 (IsRepG0 + kNumStates)
101
#define IsRepG2 (IsRepG1 + kNumStates)
102
#define IsRep0Long (IsRepG2 + kNumStates)
103
#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
104
#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
105
#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
106
#define LenCoder (Align + kAlignTableSize)
107
#define RepLenCoder (LenCoder + kNumLenProbs)
108
#define Literal (RepLenCoder + kNumLenProbs)
110
#define LZMA_BASE_SIZE 1846
111
#define LZMA_LIT_SIZE 768
113
#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
115
#if Literal != LZMA_BASE_SIZE
119
static const Byte kLiteralNextStates[kNumStates * 2] =
121
0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5,
122
7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10
125
#define LZMA_DIC_MIN (1 << 12)
127
/* First LZMA-symbol is always decoded.
128
And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
132
SZ_ERROR_DATA - Error
134
< kMatchSpecLenStart : normal remain
135
= kMatchSpecLenStart : finished
136
= kMatchSpecLenStart + 1 : Flush marker
137
= kMatchSpecLenStart + 2 : State Init Marker
140
static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
142
CLzmaProb *probs = p->probs;
144
unsigned state = p->state;
145
UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
146
unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
147
unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
148
unsigned lc = p->prop.lc;
151
SizeT dicBufSize = p->dicBufSize;
152
SizeT dicPos = p->dicPos;
154
UInt32 processedPos = p->processedPos;
155
UInt32 checkDicSize = p->checkDicSize;
158
const Byte *buf = p->buf;
159
UInt32 range = p->range;
160
UInt32 code = p->code;
169
unsigned posState = processedPos & pbMask;
171
prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
176
prob = probs + Literal;
177
if (checkDicSize != 0 || processedPos != 0)
178
prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
179
(dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
181
if (state < kNumLitStates)
187
do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
191
unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
192
unsigned offs = 0x100;
202
bit = (matchByte & offs);
203
probLit = prob + offs + bit + symbol;
204
GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
206
while (symbol < 0x100);
208
dic[dicPos++] = (Byte)symbol;
211
state = kLiteralNextStates[state];
212
/* if (state < 4) state = 0; else if (state < 10) state -= 3; else state -= 6; */
218
prob = probs + IsRep + state;
223
prob = probs + LenCoder;
228
if (checkDicSize == 0 && processedPos == 0)
229
return SZ_ERROR_DATA;
230
prob = probs + IsRepG0 + state;
234
prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
238
dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
241
state = state < kNumLitStates ? 9 : 11;
250
prob = probs + IsRepG1 + state;
259
prob = probs + IsRepG2 + state;
276
state = state < kNumLitStates ? 8 : 11;
277
prob = probs + RepLenCoder;
280
unsigned limit, offset;
281
CLzmaProb *probLen = prob + LenChoice;
285
probLen = prob + LenLow + (posState << kLenNumLowBits);
287
limit = (1 << kLenNumLowBits);
292
probLen = prob + LenChoice2;
296
probLen = prob + LenMid + (posState << kLenNumMidBits);
297
offset = kLenNumLowSymbols;
298
limit = (1 << kLenNumMidBits);
303
probLen = prob + LenHigh;
304
offset = kLenNumLowSymbols + kLenNumMidSymbols;
305
limit = (1 << kLenNumHighBits);
308
TREE_DECODE(probLen, limit, len);
312
if (state >= kNumStates)
315
prob = probs + PosSlot +
316
((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
317
TREE_6_DECODE(prob, distance);
318
if (distance >= kStartPosModelIndex)
320
unsigned posSlot = (unsigned)distance;
321
int numDirectBits = (int)(((distance >> 1) - 1));
322
distance = (2 | (distance & 1));
323
if (posSlot < kEndPosModelIndex)
325
distance <<= numDirectBits;
326
prob = probs + SpecPos + distance - posSlot - 1;
335
GET_BIT2(prob + i, i, ; , distance |= mask);
338
while (--numDirectBits != 0);
343
numDirectBits -= kNumAlignBits;
355
t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
356
distance = (distance << 1) + (t + 1);
368
while (--numDirectBits != 0);
369
prob = probs + Align;
370
distance <<= kNumAlignBits;
373
GET_BIT2(prob + i, i, ; , distance |= 1);
374
GET_BIT2(prob + i, i, ; , distance |= 2);
375
GET_BIT2(prob + i, i, ; , distance |= 4);
376
GET_BIT2(prob + i, i, ; , distance |= 8);
378
if (distance == (UInt32)0xFFFFFFFF)
380
len += kMatchSpecLenStart;
390
if (checkDicSize == 0)
392
if (distance >= processedPos)
393
return SZ_ERROR_DATA;
395
else if (distance >= checkDicSize)
396
return SZ_ERROR_DATA;
397
state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
398
/* state = kLiteralNextStates[state]; */
404
return SZ_ERROR_DATA;
406
SizeT rem = limit - dicPos;
407
unsigned curLen = ((rem < len) ? (unsigned)rem : len);
408
SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
410
processedPos += curLen;
413
if (pos + curLen <= dicBufSize)
415
Byte *dest = dic + dicPos;
416
ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
417
const Byte *lim = dest + curLen;
423
*(dest) = (Byte)*(dest + src);
424
while (++dest != lim);
433
dic[dicPos++] = dic[pos];
434
if (++pos == dicBufSize)
437
while (--curLen != 0);
442
while (dicPos < limit && buf < bufLimit);
452
p->processedPos = processedPos;
462
static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
464
if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
467
SizeT dicPos = p->dicPos;
468
SizeT dicBufSize = p->dicBufSize;
469
unsigned len = p->remainLen;
470
UInt32 rep0 = p->reps[0];
471
if (limit - dicPos < len)
472
len = (unsigned)(limit - dicPos);
474
if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
475
p->checkDicSize = p->prop.dicSize;
477
p->processedPos += len;
481
dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
488
static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
492
SizeT limit2 = limit;
493
if (p->checkDicSize == 0)
495
UInt32 rem = p->prop.dicSize - p->processedPos;
496
if (limit - p->dicPos > rem)
497
limit2 = p->dicPos + rem;
499
RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
500
if (p->processedPos >= p->prop.dicSize)
501
p->checkDicSize = p->prop.dicSize;
502
LzmaDec_WriteRem(p, limit);
504
while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
506
if (p->remainLen > kMatchSpecLenStart)
508
p->remainLen = kMatchSpecLenStart;
515
DUMMY_ERROR, /* unexpected end of input stream */
521
static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
523
UInt32 range = p->range;
524
UInt32 code = p->code;
525
const Byte *bufLimit = buf + inSize;
526
CLzmaProb *probs = p->probs;
527
unsigned state = p->state;
534
unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
536
prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
541
/* if (bufLimit - buf >= 7) return DUMMY_LIT; */
543
prob = probs + Literal;
544
if (p->checkDicSize != 0 || p->processedPos != 0)
545
prob += (LZMA_LIT_SIZE *
546
((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
547
(p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
549
if (state < kNumLitStates)
552
do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
556
unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
557
((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
558
unsigned offs = 0x100;
565
bit = (matchByte & offs);
566
probLit = prob + offs + bit + symbol;
567
GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
569
while (symbol < 0x100);
578
prob = probs + IsRep + state;
583
prob = probs + LenCoder;
590
prob = probs + IsRepG0 + state;
594
prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
609
prob = probs + IsRepG1 + state;
617
prob = probs + IsRepG2 + state;
629
prob = probs + RepLenCoder;
632
unsigned limit, offset;
633
CLzmaProb *probLen = prob + LenChoice;
634
IF_BIT_0_CHECK(probLen)
637
probLen = prob + LenLow + (posState << kLenNumLowBits);
639
limit = 1 << kLenNumLowBits;
644
probLen = prob + LenChoice2;
645
IF_BIT_0_CHECK(probLen)
648
probLen = prob + LenMid + (posState << kLenNumMidBits);
649
offset = kLenNumLowSymbols;
650
limit = 1 << kLenNumMidBits;
655
probLen = prob + LenHigh;
656
offset = kLenNumLowSymbols + kLenNumMidSymbols;
657
limit = 1 << kLenNumHighBits;
660
TREE_DECODE_CHECK(probLen, limit, len);
667
prob = probs + PosSlot +
668
((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
670
TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
671
if (posSlot >= kStartPosModelIndex)
673
int numDirectBits = ((posSlot >> 1) - 1);
675
/* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
677
if (posSlot < kEndPosModelIndex)
679
prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
683
numDirectBits -= kNumAlignBits;
688
code -= range & (((code - range) >> 31) - 1);
689
/* if (code >= range) code -= range; */
691
while (--numDirectBits != 0);
692
prob = probs + Align;
693
numDirectBits = kNumAlignBits;
699
GET_BIT_CHECK(prob + i, i);
701
while (--numDirectBits != 0);
712
static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
714
p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
715
p->range = 0xFFFFFFFF;
719
void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
729
p->needInitState = 1;
732
p->needInitState = 1;
735
void LzmaDec_Init(CLzmaDec *p)
738
LzmaDec_InitDicAndState(p, True, True);
741
static void LzmaDec_InitStateReal(CLzmaDec *p)
743
UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
745
CLzmaProb *probs = p->probs;
746
for (i = 0; i < numProbs; i++)
747
probs[i] = kBitModelTotal >> 1;
748
p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
750
p->needInitState = 0;
753
SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
754
ELzmaFinishMode finishMode, ELzmaStatus *status)
756
SizeT inSize = *srcLen;
758
LzmaDec_WriteRem(p, dicLimit);
760
*status = LZMA_STATUS_NOT_SPECIFIED;
762
while (p->remainLen != kMatchSpecLenStart)
766
if (p->needFlush != 0)
768
for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
769
p->tempBuf[p->tempBufSize++] = *src++;
770
if (p->tempBufSize < RC_INIT_SIZE)
772
*status = LZMA_STATUS_NEEDS_MORE_INPUT;
775
if (p->tempBuf[0] != 0)
776
return SZ_ERROR_DATA;
778
LzmaDec_InitRc(p, p->tempBuf);
783
if (p->dicPos >= dicLimit)
785
if (p->remainLen == 0 && p->code == 0)
787
*status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
790
if (finishMode == LZMA_FINISH_ANY)
792
*status = LZMA_STATUS_NOT_FINISHED;
795
if (p->remainLen != 0)
797
*status = LZMA_STATUS_NOT_FINISHED;
798
return SZ_ERROR_DATA;
803
if (p->needInitState)
804
LzmaDec_InitStateReal(p);
806
if (p->tempBufSize == 0)
809
const Byte *bufLimit;
810
if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
812
int dummyRes = LzmaDec_TryDummy(p, src, inSize);
813
if (dummyRes == DUMMY_ERROR)
815
memcpy(p->tempBuf, src, inSize);
816
p->tempBufSize = (unsigned)inSize;
818
*status = LZMA_STATUS_NEEDS_MORE_INPUT;
821
if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
823
*status = LZMA_STATUS_NOT_FINISHED;
824
return SZ_ERROR_DATA;
829
bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
831
if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
832
return SZ_ERROR_DATA;
833
processed = (SizeT)(p->buf - src);
834
(*srcLen) += processed;
840
unsigned rem = p->tempBufSize, lookAhead = 0;
841
while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
842
p->tempBuf[rem++] = src[lookAhead++];
843
p->tempBufSize = rem;
844
if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
846
int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
847
if (dummyRes == DUMMY_ERROR)
849
(*srcLen) += lookAhead;
850
*status = LZMA_STATUS_NEEDS_MORE_INPUT;
853
if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
855
*status = LZMA_STATUS_NOT_FINISHED;
856
return SZ_ERROR_DATA;
860
if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
861
return SZ_ERROR_DATA;
862
lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
863
(*srcLen) += lookAhead;
870
*status = LZMA_STATUS_FINISHED_WITH_MARK;
871
return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
874
SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
876
SizeT outSize = *destLen;
877
SizeT inSize = *srcLen;
878
*srcLen = *destLen = 0;
881
SizeT inSizeCur = inSize, outSizeCur, dicPos;
882
ELzmaFinishMode curFinishMode;
884
if (p->dicPos == p->dicBufSize)
887
if (outSize > p->dicBufSize - dicPos)
889
outSizeCur = p->dicBufSize;
890
curFinishMode = LZMA_FINISH_ANY;
894
outSizeCur = dicPos + outSize;
895
curFinishMode = finishMode;
898
res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
901
*srcLen += inSizeCur;
902
outSizeCur = p->dicPos - dicPos;
903
memcpy(dest, p->dic + dicPos, outSizeCur);
905
outSize -= outSizeCur;
906
*destLen += outSizeCur;
909
if (outSizeCur == 0 || outSize == 0)
914
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
916
alloc->Free(alloc, p->probs);
920
static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
922
alloc->Free(alloc, p->dic);
926
void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
928
LzmaDec_FreeProbs(p, alloc);
929
LzmaDec_FreeDict(p, alloc);
932
SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
937
if (size < LZMA_PROPS_SIZE)
938
return SZ_ERROR_UNSUPPORTED;
940
dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
942
if (dicSize < LZMA_DIC_MIN)
943
dicSize = LZMA_DIC_MIN;
944
p->dicSize = dicSize;
947
if (d >= (9 * 5 * 5))
948
return SZ_ERROR_UNSUPPORTED;
958
static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
960
UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
961
if (p->probs == 0 || numProbs != p->numProbs)
963
LzmaDec_FreeProbs(p, alloc);
964
p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
965
p->numProbs = numProbs;
972
SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
975
RINOK(LzmaProps_Decode(&propNew, props, propsSize));
976
RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
981
SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
985
RINOK(LzmaProps_Decode(&propNew, props, propsSize));
986
RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
987
dicBufSize = propNew.dicSize;
988
if (p->dic == 0 || dicBufSize != p->dicBufSize)
990
LzmaDec_FreeDict(p, alloc);
991
p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
994
LzmaDec_FreeProbs(p, alloc);
998
p->dicBufSize = dicBufSize;
1003
SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
1004
const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
1005
ELzmaStatus *status, ISzAlloc *alloc)
1009
SizeT inSize = *srcLen;
1010
SizeT outSize = *destLen;
1011
*srcLen = *destLen = 0;
1012
if (inSize < RC_INIT_SIZE)
1013
return SZ_ERROR_INPUT_EOF;
1015
LzmaDec_Construct(&p);
1016
res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);
1020
p.dicBufSize = outSize;
1025
res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
1027
if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
1028
res = SZ_ERROR_INPUT_EOF;
1030
(*destLen) = p.dicPos;
1031
LzmaDec_FreeProbs(&p, alloc);