shaved 148 bytes, 236 more to go
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3207 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
06c87de7e0
commit
c062ecca53
7 changed files with 59 additions and 90 deletions
|
@ -2,7 +2,7 @@
|
|||
|
||||
#include "LZMADecoder.h"
|
||||
|
||||
UINT32 CLZMADecoder::Create(BYTE *memoryPointer,
|
||||
void CLZMADecoder::Create(BYTE *memoryPointer,
|
||||
int numLiteralContextBits,
|
||||
int numLiteralPosStateBits,
|
||||
int numPosStateBits)
|
||||
|
@ -10,7 +10,7 @@ UINT32 CLZMADecoder::Create(BYTE *memoryPointer,
|
|||
|
||||
int numPosStates = 1 << numPosStateBits;
|
||||
m_PosStateMask = numPosStates - 1;
|
||||
return m_LiteralDecoder.Create(memoryPointer, numLiteralPosStateBits, numLiteralContextBits);
|
||||
m_LiteralDecoder.Create(memoryPointer, numLiteralPosStateBits, numLiteralContextBits);
|
||||
}
|
||||
|
||||
UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||
|
@ -19,17 +19,9 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
|||
m_OutWindowStream.Init(lzmaState);
|
||||
|
||||
int i;
|
||||
for(i = 0; i < kNumStates; i++)
|
||||
for (i = 0; i < sizeof(m_Decoders) / sizeof(CBitDecoder); i++)
|
||||
{
|
||||
for (int j = 0; j <= m_PosStateMask; j++)
|
||||
{
|
||||
m_MainChoiceDecoders[i][j].Init();
|
||||
m_MatchRepShortChoiceDecoders[i][j].Init();
|
||||
}
|
||||
m_MatchChoiceDecoders[i].Init();
|
||||
m_MatchRepChoiceDecoders[i].Init();
|
||||
m_MatchRep1ChoiceDecoders[i].Init();
|
||||
m_MatchRep2ChoiceDecoders[i].Init();
|
||||
((CBitDecoder *) &m_Decoders)[i].Init();
|
||||
}
|
||||
|
||||
m_LiteralDecoder.Init();
|
||||
|
@ -62,16 +54,12 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
|||
while(nowPos < 0xFFFFFFFF)
|
||||
{
|
||||
int posState = nowPos & m_PosStateMask;
|
||||
if (m_MainChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder) == 0)
|
||||
if (!m_Decoders.MainChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder))
|
||||
{
|
||||
state.UpdateChar();
|
||||
if(peviousIsMatch)
|
||||
{
|
||||
#ifdef __STREAM_VERSION
|
||||
BYTE matchByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
|
||||
#else
|
||||
BYTE matchByte = *(outStream - repDistances[0]);
|
||||
#endif
|
||||
previousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder,
|
||||
nowPos, previousByte, matchByte);
|
||||
peviousIsMatch = false;
|
||||
|
@ -80,11 +68,7 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
|||
previousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder,
|
||||
nowPos, previousByte);
|
||||
|
||||
#ifdef __STREAM_VERSION
|
||||
m_OutWindowStream.PutOneByte(previousByte);
|
||||
#else
|
||||
*outStream++ = previousByte;
|
||||
#endif
|
||||
|
||||
nowPos++;
|
||||
}
|
||||
|
@ -93,21 +77,16 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
|||
peviousIsMatch = true;
|
||||
UINT32 distance;
|
||||
int len;
|
||||
if(m_MatchChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 1)
|
||||
if(m_Decoders.MatchChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||
{
|
||||
if(m_MatchRepChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0)
|
||||
if(!m_Decoders.MatchRepChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||
{
|
||||
if(m_MatchRepShortChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder) == 0)
|
||||
if(!m_Decoders.MatchRepShortChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder))
|
||||
{
|
||||
state.UpdateShortRep();
|
||||
|
||||
#ifdef __STREAM_VERSION
|
||||
previousByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
|
||||
m_OutWindowStream.PutOneByte(previousByte);
|
||||
#else
|
||||
previousByte = *(outStream - repDistances[0]);
|
||||
*outStream++ = previousByte;
|
||||
#endif
|
||||
|
||||
nowPos++;
|
||||
continue;
|
||||
|
@ -116,11 +95,11 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
|||
}
|
||||
else
|
||||
{
|
||||
if(m_MatchRep1ChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0)
|
||||
if(!m_Decoders.MatchRep1ChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||
distance = repDistances[1];
|
||||
else
|
||||
{
|
||||
if (m_MatchRep2ChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0)
|
||||
if (!m_Decoders.MatchRep2ChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||
distance = repDistances[2];
|
||||
else
|
||||
{
|
||||
|
@ -171,10 +150,21 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
|||
}
|
||||
|
||||
len += kMatchMinLen;
|
||||
m_OutWindowStream.CopyBackBlock(m_OutWindowStream._pos - distance, len);
|
||||
previousByte = m_OutWindowStream.GetOneByte((UINT32)(-1));
|
||||
|
||||
nowPos += len;
|
||||
// CopyBackBlock
|
||||
{
|
||||
UINT32 fromPos = m_OutWindowStream._pos - distance;
|
||||
if (fromPos >= m_OutWindowStream._windowSize)
|
||||
fromPos += m_OutWindowStream._windowSize;
|
||||
while (len--)
|
||||
{
|
||||
m_OutWindowStream._buffer[m_OutWindowStream._pos++] = m_OutWindowStream._buffer[fromPos++];
|
||||
if (fromPos >= m_OutWindowStream._windowSize)
|
||||
fromPos = 0;
|
||||
m_OutWindowStream.Flush();
|
||||
}
|
||||
}
|
||||
previousByte = m_OutWindowStream.GetOneByte((UINT32)(-1));
|
||||
}
|
||||
}
|
||||
m_OutWindowStream._windowSize = 0;
|
||||
|
|
|
@ -53,12 +53,15 @@ class CLZMADecoder
|
|||
CLZOutWindow m_OutWindowStream;
|
||||
CRangeDecoder m_RangeDecoder;
|
||||
|
||||
CBitDecoder m_MainChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
||||
CBitDecoder m_MatchRepShortChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
||||
CBitDecoder m_MatchChoiceDecoders[kNumStates];
|
||||
CBitDecoder m_MatchRepChoiceDecoders[kNumStates];
|
||||
CBitDecoder m_MatchRep1ChoiceDecoders[kNumStates];
|
||||
CBitDecoder m_MatchRep2ChoiceDecoders[kNumStates];
|
||||
struct
|
||||
{
|
||||
CBitDecoder MainChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
||||
CBitDecoder MatchRepShortChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
||||
CBitDecoder MatchChoiceDecoders[kNumStates];
|
||||
CBitDecoder MatchRepChoiceDecoders[kNumStates];
|
||||
CBitDecoder MatchRep1ChoiceDecoders[kNumStates];
|
||||
CBitDecoder MatchRep2ChoiceDecoders[kNumStates];
|
||||
} m_Decoders;
|
||||
|
||||
CLZMALiteralDecoder m_LiteralDecoder;
|
||||
|
||||
|
@ -72,7 +75,7 @@ class CLZMADecoder
|
|||
int m_PosStateMask;
|
||||
|
||||
public:
|
||||
UINT32 Create(BYTE *memoryPointer,
|
||||
void Create(BYTE *memoryPointer,
|
||||
int numLiteralContextBits,
|
||||
int numLiteralPosStateBits,
|
||||
int numPosStateBits);
|
||||
|
|
|
@ -19,12 +19,14 @@ const int kLenNumMidSymbols = 1 << kLenNumMidBits;
|
|||
const int kLenNumHighBits = 8;
|
||||
const int kLenNumSymbolsTotal = kLenNumLowSymbols + kLenNumMidSymbols + (1 << kLenNumHighBits);
|
||||
|
||||
#define LOW 0
|
||||
#define HIGH 1
|
||||
|
||||
class CLZMALenDecoder
|
||||
{
|
||||
CBitDecoder m_Choice;
|
||||
CBitDecoder m_Choice2;
|
||||
CBitTreeDecoder3 m_LowCoder[kLenNumPosStatesMax];
|
||||
CBitTreeDecoder3 m_MidCoder[kLenNumPosStatesMax];
|
||||
CBitTreeDecoder3 m_Coder[2][kLenNumPosStatesMax];
|
||||
CBitTreeDecoder8 m_HighCoder;
|
||||
public:
|
||||
// void Init(int numPosStates)
|
||||
|
@ -32,20 +34,18 @@ public:
|
|||
{
|
||||
m_Choice.Init();
|
||||
m_Choice2.Init();
|
||||
// for (int posState = 0; posState < numPosStates; posState++)
|
||||
for (int posState = 0; posState < kLenNumPosStatesMax; posState++)
|
||||
for (int posState = 0; posState < kLenNumPosStatesMax * 2; posState++)
|
||||
{
|
||||
m_LowCoder[posState].Init();
|
||||
m_MidCoder[posState].Init();
|
||||
((CBitTreeDecoder3 *) m_Coder)[posState].Init();
|
||||
}
|
||||
m_HighCoder.Init();
|
||||
}
|
||||
int Decode(CRangeDecoder *rangeDecoder, int posState)
|
||||
{
|
||||
if(m_Choice.Decode(rangeDecoder) == 0)
|
||||
return m_LowCoder[posState].Decode(rangeDecoder);
|
||||
return m_Coder[LOW][posState].Decode(rangeDecoder);
|
||||
if(m_Choice2.Decode(rangeDecoder) == 0)
|
||||
return kLenNumLowSymbols + m_MidCoder[posState].Decode(rangeDecoder);
|
||||
return kLenNumLowSymbols + m_Coder[HIGH][posState].Decode(rangeDecoder);
|
||||
return kLenNumLowSymbols + kLenNumMidSymbols + m_HighCoder.Decode(rangeDecoder);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -12,9 +12,8 @@ class CLZMALiteralDecoder2
|
|||
public:
|
||||
void Init()
|
||||
{
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (int j = 0; j < (1 << 8); j++)
|
||||
m_Decoders[i][j].Init();
|
||||
for (int i = 0; i < sizeof(m_Decoders) / sizeof(CBitDecoder); i++)
|
||||
((CBitDecoder *) m_Decoders)[i].Init();
|
||||
}
|
||||
BYTE DecodeNormal(CRangeDecoder *rangeDecoder)
|
||||
{
|
||||
|
@ -78,17 +77,15 @@ public:
|
|||
class CLZMALiteralDecoder
|
||||
{
|
||||
CLZMALiteralDecoder2 *m_Coders;
|
||||
int m_NumPrevBits;
|
||||
int m_NumPrevBits;
|
||||
int m_PosMask;
|
||||
public:
|
||||
CLZMALiteralDecoder(): m_Coders(0) {}
|
||||
UINT32 Create(BYTE *memory, int numPosBits, int numPrevBits)
|
||||
void Create(BYTE *memory, int numPosBits, int numPrevBits)
|
||||
{
|
||||
m_PosMask = (1 << numPosBits) - 1;
|
||||
m_NumPrevBits = numPrevBits;
|
||||
int numStates = 1 << (numPrevBits + numPosBits);
|
||||
m_Coders = (CLZMALiteralDecoder2 *)memory;
|
||||
return sizeof(CLZMALiteralDecoder2) * numStates;
|
||||
m_Coders = (CLZMALiteralDecoder2 *) memory;
|
||||
}
|
||||
void Init()
|
||||
{
|
||||
|
|
|
@ -23,18 +23,6 @@ public:
|
|||
_streamPos = 0;
|
||||
_pos = 0;
|
||||
}
|
||||
void CopyBackBlock(UINT32 fromPos, int len)
|
||||
{
|
||||
if (fromPos >= _windowSize)
|
||||
fromPos += _windowSize;
|
||||
while (len--)
|
||||
{
|
||||
_buffer[_pos++] = _buffer[fromPos++];
|
||||
if (fromPos >= _windowSize)
|
||||
fromPos = 0;
|
||||
Flush();
|
||||
}
|
||||
}
|
||||
void PutOneByte(BYTE b)
|
||||
{
|
||||
_buffer[_pos++] = b;
|
||||
|
|
|
@ -35,29 +35,27 @@ struct CBitDecoder: public CBitModel
|
|||
int Decode(CRangeDecoder *rangeDecoder)
|
||||
{
|
||||
UINT32 newBound = (rangeDecoder->Range >> kNumBitModelTotalBits) * Probability;
|
||||
int ret = 0;
|
||||
if (rangeDecoder->Code < newBound)
|
||||
{
|
||||
rangeDecoder->Range = newBound;
|
||||
Probability += (kBitModelTotal - Probability) >> kNumMoveBits;
|
||||
if (rangeDecoder->Range < kTopValue)
|
||||
{
|
||||
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
|
||||
rangeDecoder->Range <<= 8;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
rangeDecoder->Range -= newBound;
|
||||
rangeDecoder->Code -= newBound;
|
||||
Probability -= (Probability) >> kNumMoveBits;
|
||||
if (rangeDecoder->Range < kTopValue)
|
||||
{
|
||||
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
|
||||
rangeDecoder->Range <<= 8;
|
||||
}
|
||||
return 1;
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
if (rangeDecoder->Range < kTopValue)
|
||||
{
|
||||
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
|
||||
rangeDecoder->Range <<= 8;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -82,9 +82,7 @@ DWORD WINAPI lzmaDecompressThread(LPVOID lpParameter)
|
|||
firstByte %= 9;
|
||||
int numLiteralContextBits = firstByte;
|
||||
|
||||
int memSize =
|
||||
((1 << (numLiteralContextBits + numLiteralPosStateBits))*
|
||||
256 * 3) * sizeof(CBitDecoder);
|
||||
int memSize = (1 << (numLiteralContextBits + numLiteralPosStateBits)) * sizeof(CLZMALiteralDecoder2);
|
||||
|
||||
if (lzmaState->DynamicData == 0 || firstByte != lzmaState->FirstProp)
|
||||
{
|
||||
|
@ -94,13 +92,8 @@ DWORD WINAPI lzmaDecompressThread(LPVOID lpParameter)
|
|||
lzmaState->FirstProp = firstByte;
|
||||
}
|
||||
|
||||
int memSizeReal = lzmaDecodeder->Create((BYTE *) lzmaState->DynamicData,
|
||||
lzmaDecodeder->Create((LPBYTE) lzmaState->DynamicData,
|
||||
numLiteralContextBits, numLiteralPosStateBits, numPosStateBits);
|
||||
|
||||
if (memSizeReal != memSize)
|
||||
{
|
||||
goto finished;
|
||||
}
|
||||
|
||||
UINT32 dictionarySize = 0;
|
||||
for (int i = 0; i < 4; i++)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue