/*
  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;
}
