Files
nsis-plugin-ns7zip/versions/25.01/CPP/7zip/Compress/LzxDecoder.h
T
Simone d074cc7c07 chore: initial commit (extracted from Launchers monorepo)
Plugin: ns7zip v2.0.0
Architectures: x86-ansi, x86-unicode, amd64-unicode
License: LGPL-2.1-or-later
2026-04-29 14:07:51 +02:00

107 lines
2.9 KiB
C++

// LzxDecoder.h
#ifndef ZIP7_INC_LZX_DECODER_H
#define ZIP7_INC_LZX_DECODER_H
#include "HuffmanDecoder.h"
#include "Lzx.h"
namespace NCompress {
namespace NLzx {
const unsigned kAdditionalOutputBufSize = 32 * 2;
const unsigned kNumTableBits_Main = 11;
const unsigned kNumTableBits_Len = 8;
// if (kNumLenSymols_Big <= 256) we can use NHuffman::CDecoder256
// if (kNumLenSymols_Big > 256) we must use NHuffman::CDecoder
// const unsigned kNumLenSymols_Big_Start = kNumLenSlots - 1 + kMatchMinLen; // 8 - 1 + 2
const unsigned kNumLenSymols_Big_Start = 0;
// const unsigned kNumLenSymols_Big_Start = 0;
const unsigned kNumLenSymols_Big = kNumLenSymols_Big_Start + kNumLenSymbols;
#if 1
// for smallest structure size:
const unsigned kPosSlotOffset = 0;
#else
// use virtual entries for mispredicted branches:
const unsigned kPosSlotOffset = 256 / kNumLenSlots;
#endif
class CBitByteDecoder;
class CDecoder
{
public:
UInt32 _pos;
UInt32 _winSize;
Byte *_win;
bool _overDict;
bool _isUncompressedBlock;
bool _skipByte;
bool _keepHistory;
bool _keepHistoryForNext;
bool _needAlloc;
bool _wimMode;
Byte _numDictBits;
// unsigned _numAlignBits_PosSlots;
// unsigned _numAlignBits;
UInt32 _numAlignBits_Dist;
private:
unsigned _numPosLenSlots;
UInt32 _unpackBlockSize;
UInt32 _writePos;
UInt32 _x86_translationSize;
UInt32 _x86_processedSize;
Byte *_x86_buf;
Byte *_unpackedData;
public:
Byte _extra[kPosSlotOffset + kNumPosSlots];
UInt32 _reps[kPosSlotOffset + kNumPosSlots];
NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize, kNumTableBits_Main> _mainDecoder;
NHuffman::CDecoder256<kNumHuffmanBits, kNumLenSymols_Big, kNumTableBits_Len> _lenDecoder;
NHuffman::CDecoder7b<kAlignTableSize> _alignDecoder;
private:
Byte _mainLevels[kMainTableSize];
Byte _lenLevels[kNumLenSymols_Big];
HRESULT Flush() throw();
bool ReadTables(CBitByteDecoder &_bitStream) throw();
HRESULT CodeSpec(const Byte *inData, size_t inSize, UInt32 outSize) throw();
HRESULT SetParams2(unsigned numDictBits) throw();
public:
CDecoder() throw();
~CDecoder() throw();
void Set_WimMode(bool wimMode) { _wimMode = wimMode; }
void Set_KeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
void Set_KeepHistoryForNext(bool keepHistoryForNext) { _keepHistoryForNext = keepHistoryForNext; }
HRESULT Set_ExternalWindow_DictBits(Byte *win, unsigned numDictBits)
{
_needAlloc = false;
_win = win;
_winSize = (UInt32)1 << numDictBits;
return SetParams2(numDictBits);
}
HRESULT Set_DictBits_and_Alloc(unsigned numDictBits) throw();
HRESULT Code_WithExceedReadWrite(const Byte *inData, size_t inSize, UInt32 outSize) throw();
bool WasBlockFinished() const { return _unpackBlockSize == 0; }
const Byte *GetUnpackData() const { return _unpackedData; }
UInt32 GetUnpackSize() const { return _pos - _writePos; }
};
}}
#endif