diff --git a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.cpp b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.cpp index 70209a5b..94f2bbe2 100644 --- a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.cpp +++ b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.cpp @@ -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; diff --git a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.h b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.h index 991f20d4..d2c4efda 100644 --- a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.h +++ b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMADecoder.h @@ -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); diff --git a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALenCoder.h b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALenCoder.h index 2fc93a8a..b476a032 100644 --- a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALenCoder.h +++ b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALenCoder.h @@ -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); } }; diff --git a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALiteralCoder.h b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALiteralCoder.h index 9bf9129c..9562ab51 100644 --- a/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALiteralCoder.h +++ b/Source/7zip/7zip/Compress/LZMA_SMALL/LZMALiteralCoder.h @@ -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() { diff --git a/Source/7zip/7zip/Compress/LZMA_SMALL/LZOutWindow.h b/Source/7zip/7zip/Compress/LZMA_SMALL/LZOutWindow.h index 5f68cf12..480557e2 100644 --- a/Source/7zip/7zip/Compress/LZMA_SMALL/LZOutWindow.h +++ b/Source/7zip/7zip/Compress/LZMA_SMALL/LZOutWindow.h @@ -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; diff --git a/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderBit.h b/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderBit.h index 7abb99c3..014c2f95 100644 --- a/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderBit.h +++ b/Source/7zip/7zip/Compress/LZMA_SMALL/RangeCoderBit.h @@ -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; } }; diff --git a/Source/7zip/lzmaNSIS.cpp b/Source/7zip/lzmaNSIS.cpp index b3209e21..d2364364 100644 --- a/Source/7zip/lzmaNSIS.cpp +++ b/Source/7zip/lzmaNSIS.cpp @@ -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++)