/*
  LzmaDecode.c
  LZMA Decoder (optimized for Speed version)

  LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01)
  http://www.7-zip.org/

  LZMA SDK is licensed under two licenses:
  1) GNU Lesser General Public License (GNU LGPL)
  2) Common Public License (CPL)
  It means that you can select one of these two licenses and
  follow rules of that license.

  SPECIAL EXCEPTION:
  Igor Pavlov, as the author of this Code, expressly permits you to
  statically or dynamically link your Code (or bind by name) to the
  interfaces of this file without subjecting your linked Code to the
  terms of the CPL or GNU LGPL. Any modifications or additions
  to this file, however, are subject to the LGPL or CPL terms.
*/

#include "lzmadecode.h"
#include <stdint.h>

#define kNumTopBits 24
#define kTopValue ((UInt32)1 << kNumTopBits)

#define kNumBitModelTotalBits 11
#define kBitModelTotal (1 << kNumBitModelTotalBits)
#define kNumMoveBits 5

/* Use 32-bit reads whenever possible to avoid bad flash performance. Fall back
 * to byte reads for last 4 bytes since RC_TEST returns an error when BufferLim
 * is *reached* (not surpassed!), meaning we can't allow that to happen while
 * there are still bytes to decode from the algorithm's point of view. */
#define RC_READ_BYTE							\
	(look_ahead_ptr < 4 ? look_ahead.raw[look_ahead_ptr++]		\
	: ((((uintptr_t) Buffer & 3)					\
		|| ((SizeT) (BufferLim - Buffer) <= 4)) ? (*Buffer++)	\
	: ((look_ahead.dw = *(UInt32 *)Buffer), (Buffer += 4),		\
		(look_ahead_ptr = 1), look_ahead.raw[0])))

#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF;		\
{							\
	int i;						\
							\
	for (i = 0; i < 5; i++) {			\
		RC_TEST;				\
		Code = (Code << 8) | RC_READ_BYTE;	\
	}						\
}


#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; }

#define RC_INIT(buffer, bufferSize) Buffer = buffer; \
	BufferLim = buffer + bufferSize; RC_INIT2


#define RC_NORMALIZE					\
	if (Range < kTopValue) {			\
		RC_TEST;				\
		Range <<= 8;				\
		Code = (Code << 8) | RC_READ_BYTE;	\
	}

#define IfBit0(p)						\
	RC_NORMALIZE;						\
	bound = (Range >> kNumBitModelTotalBits) * *(p);	\
	if (Code < bound)

#define UpdateBit0(p)						\
	Range = bound;						\
	*(p) += (kBitModelTotal - *(p)) >> kNumMoveBits

#define UpdateBit1(p)				\
	Range -= bound;				\
	Code -= bound;				\
	*(p) -= (*(p)) >> kNumMoveBits

#define RC_GET_BIT2(p, mi, A0, A1)			\
	IfBit0(p) {					\
		 UpdateBit0(p);				\
		 mi <<= 1;				\
		 A0;					\
	} else {					\
		UpdateBit1(p);				\
		mi = (mi + mi) + 1;			\
		A1;					\
	}

#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ;, ;)

#define RangeDecoderBitTreeDecode(probs, numLevels, res)	\
{								\
	int i = numLevels;					\
								\
	res = 1;						\
	do {							\
		CProb *cp = probs + res;			\
		RC_GET_BIT(cp, res)				\
	} while (--i != 0);					\
	res -= (1 << numLevels);				\
}


#define kNumPosBitsMax 4
#define kNumPosStatesMax (1 << kNumPosBitsMax)

#define kLenNumLowBits 3
#define kLenNumLowSymbols (1 << kLenNumLowBits)
#define kLenNumMidBits 3
#define kLenNumMidSymbols (1 << kLenNumMidBits)
#define kLenNumHighBits 8
#define kLenNumHighSymbols (1 << kLenNumHighBits)

#define LenChoice 0
#define LenChoice2 (LenChoice + 1)
#define LenLow (LenChoice2 + 1)
#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)


#define kNumStates 12
#define kNumLitStates 7

#define kStartPosModelIndex 4
#define kEndPosModelIndex 14
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))

#define kNumPosSlotBits 6
#define kNumLenToPosStates 4

#define kNumAlignBits 4
#define kAlignTableSize (1 << kNumAlignBits)

#define kMatchMinLen 2

#define IsMatch 0
#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
#define IsRepG0 (IsRep + kNumStates)
#define IsRepG1 (IsRepG0 + kNumStates)
#define IsRepG2 (IsRepG1 + kNumStates)
#define IsRep0Long (IsRepG2 + kNumStates)
#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
#define LenCoder (Align + kAlignTableSize)
#define RepLenCoder (LenCoder + kNumLenProbs)
#define Literal (RepLenCoder + kNumLenProbs)

#if Literal != LZMA_BASE_SIZE
StopCompilingDueBUG
#endif

int LzmaDecodeProperties(CLzmaProperties *propsRes,
	const unsigned char *propsData, int size)
{
	unsigned char prop0;
	if (size < LZMA_PROPERTIES_SIZE)
		return LZMA_RESULT_DATA_ERROR;
	prop0 = propsData[0];
	if (prop0 >= (9 * 5 * 5))
		return LZMA_RESULT_DATA_ERROR;
	{
		for (propsRes->pb = 0; prop0 >= (9 * 5);
			propsRes->pb++, prop0 -= (9 * 5))
			;
		for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9)
			;
		propsRes->lc = prop0;
		/*
		 * unsigned char remainder = (unsigned char)(prop0 / 9);
		 * propsRes->lc = prop0 % 9;
		 * propsRes->pb = remainder / 5;
		 * propsRes->lp = remainder % 5;
		 */
	}

	return LZMA_RESULT_OK;
}

#define kLzmaStreamWasFinishedId (-1)

int LzmaDecode(CLzmaDecoderState *vs,
	const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
	unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed)
{
	CProb *p = vs->Probs;
	SizeT nowPos = 0;
	Byte previousByte = 0;
	UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1;
	UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1;
	int lc = vs->Properties.lc;


	int state = 0;
	UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
	int len = 0;
	const Byte *Buffer;
	const Byte *BufferLim;
	int look_ahead_ptr = 4;
	union {
		Byte raw[4];
		UInt32 dw;
	} look_ahead;
	UInt32 Range;
	UInt32 Code;

	*inSizeProcessed = 0;
	*outSizeProcessed = 0;

	{
		UInt32 i;
		UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc
						+ vs->Properties.lp));
		for (i = 0; i < numProbs; i++)
			p[i] = kBitModelTotal >> 1;
	}

	RC_INIT(inStream, inSize);


	while (nowPos < outSize) {
		CProb *prob;
		UInt32 bound;
		int posState = (int)((nowPos)&posStateMask);

		prob = p + IsMatch + (state << kNumPosBitsMax) + posState;
		IfBit0(prob) {
			int symbol = 1;
			UpdateBit0(prob);
			prob = p + Literal + (LZMA_LIT_SIZE *
				((((nowPos) & literalPosMask) << lc)
				+ (previousByte >> (8 - lc))));

			if (state >= kNumLitStates) {
				int matchByte;
				matchByte = outStream[nowPos - rep0];
				do {
					int bit;
					CProb *probLit;
					matchByte <<= 1;
					bit = (matchByte & 0x100);
					probLit = prob + 0x100 + bit + symbol;
					RC_GET_BIT2(probLit, symbol,
						if (bit != 0)
							break,
						if (bit == 0)
							break)
				} while (symbol < 0x100);
			}
			while (symbol < 0x100) {
				CProb *probLit = prob + symbol;
				RC_GET_BIT(probLit, symbol)
			}
			previousByte = (Byte)symbol;

			outStream[nowPos++] = previousByte;
			if (state < 4)
				state = 0;
			else if (state < 10)
				state -= 3;
			else
				state -= 6;
		} else {
			UpdateBit1(prob);
			prob = p + IsRep + state;
			IfBit0(prob) {
				UpdateBit0(prob);
				rep3 = rep2;
				rep2 = rep1;
				rep1 = rep0;
				state = state < kNumLitStates ? 0 : 3;
				prob = p + LenCoder;
			} else {
				UpdateBit1(prob);
				prob = p + IsRepG0 + state;
				IfBit0(prob) {
					UpdateBit0(prob);
					prob = p + IsRep0Long
						+ (state << kNumPosBitsMax)
						+ posState;
					IfBit0(prob) {
						UpdateBit0(prob);

						if (nowPos == 0)
							return LZMA_RESULT_DATA_ERROR;

						state = state < kNumLitStates
							? 9 : 11;
						previousByte = outStream[nowPos
							- rep0];
						outStream[nowPos++] =
							previousByte;

						continue;
					} else {
						UpdateBit1(prob);
					}
				} else {
					UInt32 distance;
					UpdateBit1(prob);
					prob = p + IsRepG1 + state;
					IfBit0(prob) {
						UpdateBit0(prob);
						distance = rep1;
					} else {
						UpdateBit1(prob);
						prob = p + IsRepG2 + state;
						IfBit0(prob) {
							UpdateBit0(prob);
							distance = rep2;
						} else {
							UpdateBit1(prob);
							distance = rep3;
							rep3 = rep2;
						}
						rep2 = rep1;
					}
					rep1 = rep0;
					rep0 = distance;
				}
				state = state < kNumLitStates ? 8 : 11;
				prob = p + RepLenCoder;
			}
			{
				int numBits, offset;
				CProb *probLen = prob + LenChoice;
				IfBit0(probLen) {
					UpdateBit0(probLen);
					probLen = prob + LenLow
						+ (posState << kLenNumLowBits);
					offset = 0;
					numBits = kLenNumLowBits;
				} else {
					UpdateBit1(probLen);
					probLen = prob + LenChoice2;
					IfBit0(probLen) {
						UpdateBit0(probLen);
						probLen = prob + LenMid
							+ (posState <<
								kLenNumMidBits);
						offset = kLenNumLowSymbols;
						numBits = kLenNumMidBits;
					} else {
						UpdateBit1(probLen);
						probLen = prob + LenHigh;
						offset = kLenNumLowSymbols
							+ kLenNumMidSymbols;
						numBits = kLenNumHighBits;
					}
				}
				RangeDecoderBitTreeDecode(probLen, numBits,
					len);
				len += offset;
			}

			if (state < 4) {
				int posSlot;
				state += kNumLitStates;
				prob = p + PosSlot +
					((len < kNumLenToPosStates ? len :
					kNumLenToPosStates - 1) <<
					kNumPosSlotBits);
				RangeDecoderBitTreeDecode(prob, kNumPosSlotBits,
					posSlot);
				if (posSlot >= kStartPosModelIndex) {
					int numDirectBits = ((posSlot >> 1)
						- 1);
					rep0 = (2 | ((UInt32)posSlot & 1));
					if (posSlot < kEndPosModelIndex) {
						rep0 <<= numDirectBits;
						prob = p + SpecPos + rep0
							- posSlot - 1;
					} else {
						numDirectBits -= kNumAlignBits;
						do {
							RC_NORMALIZE
							Range >>= 1;
							rep0 <<= 1;
							if (Code >= Range) {
								Code -= Range;
								rep0 |= 1;
							}
						} while (--numDirectBits != 0);
						prob = p + Align;
						rep0 <<= kNumAlignBits;
						numDirectBits = kNumAlignBits;
					}
					{
						int i = 1;
						int mi = 1;
						do {
							CProb *prob3 = prob
								+ mi;
							RC_GET_BIT2(prob3, mi,
								;, rep0 |= i);
							i <<= 1;
						} while (--numDirectBits != 0);
					}
				} else
					rep0 = posSlot;
				if (++rep0 == (UInt32)(0)) {
					/* it's for stream version */
					len = kLzmaStreamWasFinishedId;
					break;
				}
			}

			len += kMatchMinLen;
			if (rep0 > nowPos)
				return LZMA_RESULT_DATA_ERROR;


			do {
				previousByte = outStream[nowPos - rep0];
				len--;
				outStream[nowPos++] = previousByte;
			} while (len != 0 && nowPos < outSize);
		}
	}
	RC_NORMALIZE;


	*inSizeProcessed = (SizeT)(Buffer - inStream);
	*outSizeProcessed = nowPos;
	return LZMA_RESULT_OK;
}
