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:
kichik 2003-11-25 10:51:17 +00:00
parent 06c87de7e0
commit c062ecca53
7 changed files with 59 additions and 90 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);
}
};

View file

@ -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()
{

View file

@ -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;

View file

@ -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;
}
};

View file

@ -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++)