9 #define kTopValue ((UInt32)1 << kNumTopBits)
11 #define kNumBitModelTotalBits 11
12 #define kBitModelTotal (1 << kNumBitModelTotalBits)
13 #define kNumMoveBits 5
15 #define RC_INIT_SIZE 5
17 #define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
19 #define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
20 #define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
21 #define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
22 #define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
23 { UPDATE_0(p); i = (i + i); A0; } else \
24 { UPDATE_1(p); i = (i + i) + 1; A1; }
25 #define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
27 #define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
28 #define TREE_DECODE(probs, limit, i) \
29 { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
34 #define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
36 #define TREE_6_DECODE(probs, i) \
38 TREE_GET_BIT(probs, i); \
39 TREE_GET_BIT(probs, i); \
40 TREE_GET_BIT(probs, i); \
41 TREE_GET_BIT(probs, i); \
42 TREE_GET_BIT(probs, i); \
43 TREE_GET_BIT(probs, i); \
47 #define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
49 #define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
50 #define UPDATE_0_CHECK range = bound;
51 #define UPDATE_1_CHECK range -= bound; code -= bound;
52 #define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
53 { UPDATE_0_CHECK; i = (i + i); A0; } else \
54 { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
55 #define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
56 #define TREE_DECODE_CHECK(probs, limit, i) \
57 { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
60 #define kNumPosBitsMax 4
61 #define kNumPosStatesMax (1 << kNumPosBitsMax)
63 #define kLenNumLowBits 3
64 #define kLenNumLowSymbols (1 << kLenNumLowBits)
65 #define kLenNumMidBits 3
66 #define kLenNumMidSymbols (1 << kLenNumMidBits)
67 #define kLenNumHighBits 8
68 #define kLenNumHighSymbols (1 << kLenNumHighBits)
71 #define LenChoice2 (LenChoice + 1)
72 #define LenLow (LenChoice2 + 1)
73 #define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
74 #define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
75 #define kNumLenProbs (LenHigh + kLenNumHighSymbols)
79 #define kNumLitStates 7
81 #define kStartPosModelIndex 4
82 #define kEndPosModelIndex 14
83 #define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
85 #define kNumPosSlotBits 6
86 #define kNumLenToPosStates 4
88 #define kNumAlignBits 4
89 #define kAlignTableSize (1 << kNumAlignBits)
91 #define kMatchMinLen 2
92 #define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
95 #define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
96 #define IsRepG0 (IsRep + kNumStates)
97 #define IsRepG1 (IsRepG0 + kNumStates)
98 #define IsRepG2 (IsRepG1 + kNumStates)
99 #define IsRep0Long (IsRepG2 + kNumStates)
100 #define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
101 #define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
102 #define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
103 #define LenCoder (Align + kAlignTableSize)
104 #define RepLenCoder (LenCoder + kNumLenProbs)
105 #define Literal (RepLenCoder + kNumLenProbs)
107 #define LZMA_BASE_SIZE 1846
108 #define LZMA_LIT_SIZE 768
110 #define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
112 #if Literal != LZMA_BASE_SIZE
116 #define LZMA_DIC_MIN (1 << 12)
135 unsigned state = p->
state;
137 unsigned pbMask = ((unsigned)1 << (p->
prop.
pb)) - 1;
138 unsigned lpMask = ((unsigned)1 << (p->
prop.
lp)) - 1;
158 unsigned posState = processedPos & pbMask;
166 if (checkDicSize != 0 || processedPos != 0)
168 (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
172 state -= (state < 4) ? state : 3;
174 do {
GET_BIT(prob + symbol, symbol) }
while (symbol < 0x100);
178 unsigned matchByte = p->
dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
179 unsigned offs = 0x100;
180 state -= (state < 10) ? 3 : 6;
187 bit = (matchByte & offs);
188 probLit = prob + offs + bit + symbol;
189 GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
191 while (symbol < 0x100);
193 dic[dicPos++] = (
Byte)symbol;
200 prob = probs +
IsRep + state;
210 if (checkDicSize == 0 && processedPos == 0)
212 prob = probs +
IsRepG0 + state;
220 dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
232 prob = probs +
IsRepG1 + state;
241 prob = probs +
IsRepG2 + state;
302 unsigned posSlot = (unsigned)distance;
303 int numDirectBits = (int)(((distance >> 1) - 1));
304 distance = (2 | (distance & 1));
307 distance <<= numDirectBits;
308 prob = probs +
SpecPos + distance - posSlot - 1;
314 GET_BIT2(prob + i, i, ; , distance |= mask);
317 while (--numDirectBits != 0);
331 t = (0 - ((
UInt32)code >> 31));
332 distance = (distance << 1) + (t + 1);
344 while (--numDirectBits != 0);
345 prob = probs +
Align;
349 GET_BIT2(prob + i, i, ; , distance |= 1);
350 GET_BIT2(prob + i, i, ; , distance |= 2);
351 GET_BIT2(prob + i, i, ; , distance |= 4);
352 GET_BIT2(prob + i, i, ; , distance |= 8);
354 if (distance == (
UInt32)0xFFFFFFFF)
366 if (checkDicSize == 0)
368 if (distance >= processedPos)
371 else if (distance >= checkDicSize)
381 SizeT rem = limit - dicPos;
382 unsigned curLen = ((rem < len) ? (
unsigned)rem : len);
383 SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
385 processedPos += curLen;
388 if (pos + curLen <= dicBufSize)
391 ptrdiff_t
src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
392 const Byte *lim = dest + curLen;
396 while (++dest != lim);
402 dic[dicPos++] = dic[pos];
403 if (++pos == dicBufSize)
406 while (--curLen != 0);
411 while (dicPos < limit && buf < bufLimit);
437 if (limit - dicPos < len)
438 len = (unsigned)(limit - dicPos);
447 dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
462 if (limit - p->
dicPos > rem)
491 const Byte *bufLimit = buf + inSize;
493 unsigned state = p->
state;
518 do {
GET_BIT_CHECK(prob + symbol, symbol) }
while (symbol < 0x100);
524 unsigned offs = 0x100;
531 bit = (matchByte & offs);
532 probLit = prob + offs + bit + symbol;
535 while (symbol < 0x100);
544 prob = probs +
IsRep + state;
556 prob = probs +
IsRepG0 + state;
575 prob = probs +
IsRepG1 + state;
583 prob = probs +
IsRepG2 + state;
639 int numDirectBits = ((posSlot >> 1) - 1);
645 prob = probs +
SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
654 code -= range & (((code - range) >> 31) - 1);
657 while (--numDirectBits != 0);
658 prob = probs +
Align;
667 while (--numDirectBits != 0);
681 p->
range = 0xFFFFFFFF;
712 for (i = 0; i < numProbs; i++)
722 SizeT inSize = *srcLen;
749 if (p->
dicPos >= dicLimit)
775 const Byte *bufLimit;
781 memcpy(p->
tempBuf, src, inSize);
800 (*srcLen) += processed;
808 p->
tempBuf[rem++] = src[lookAhead++];
815 (*srcLen) += lookAhead;
828 lookAhead -= (rem - (unsigned)(p->
buf - p->
tempBuf));
829 (*srcLen) += lookAhead;
842 SizeT outSize = *destLen;
843 SizeT inSize = *srcLen;
844 *srcLen = *destLen = 0;
847 SizeT inSizeCur = inSize, outSizeCur, dicPos;
860 outSizeCur = dicPos + outSize;
861 curFinishMode = finishMode;
867 *srcLen += inSizeCur;
868 outSizeCur = p->
dicPos - dicPos;
869 memcpy(dest, p->
dic + dicPos, outSizeCur);
871 outSize -= outSizeCur;
872 *destLen += outSizeCur;
875 if (outSizeCur == 0 || outSize == 0)
906 dicSize = data[1] | ((
UInt32)data[2] << 8) | ((
UInt32)data[3] << 16) | ((
UInt32)data[4] << 24);
913 if (d >= (9 * 5 * 5))
975 SizeT inSize = *srcLen;
976 SizeT outSize = *destLen;
977 *srcLen = *destLen = 0;
#define SZ_ERROR_INPUT_EOF
void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
#define LzmaProps_GetNumProbs(p)
#define GET_BIT_CHECK(p, i)
#define GET_BIT2(p, i, A0, A1)
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
#define kLenNumLowSymbols
static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
#define kStartPosModelIndex
SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
#define TREE_DECODE(probs, limit, i)
#define GET_BIT2_CHECK(p, i, A0, A1)
static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
void *(* Alloc)(void *p, size_t size)
static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
#define LZMA_REQUIRED_INPUT_MAX
#define kMatchSpecLenStart
#define kEndPosModelIndex
unsigned int offset(bool)
#define LzmaDec_Construct(p)
#define IF_BIT_0_CHECK(p)
void(* Free)(void *p, void *address)
Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]
#define kLenNumMidSymbols
SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc)
#define kNumLenToPosStates
char data[epos_bytes_allocation]
static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
#define TREE_DECODE_CHECK(probs, limit, i)
void LzmaDec_Init(CLzmaDec *p)
SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
#define TREE_6_DECODE(probs, i)
static void LzmaDec_InitStateReal(CLzmaDec *p)
tuple size
Write out results.
static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
#define SZ_ERROR_UNSUPPORTED