xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/LzhDecoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // LzhDecoder.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMPRESS_LZH_DECODER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMPRESS_LZH_DECODER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../Common/InBuffer.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "BitmDecoder.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "LzOutWindow.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
17*f6dc9357SAndroid Build Coastguard Worker namespace NLzh {
18*f6dc9357SAndroid Build Coastguard Worker namespace NDecoder {
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMinLen = 3;
21*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMaxLen = 256;
22*f6dc9357SAndroid Build Coastguard Worker const unsigned NC = 256 + kMatchMaxLen - kMatchMinLen + 1;
23*f6dc9357SAndroid Build Coastguard Worker const unsigned NUM_CODE_BITS = 16;
24*f6dc9357SAndroid Build Coastguard Worker const unsigned NUM_DIC_BITS_MAX = 25;
25*f6dc9357SAndroid Build Coastguard Worker const unsigned NT = NUM_CODE_BITS + 3;
26*f6dc9357SAndroid Build Coastguard Worker const unsigned NP = NUM_DIC_BITS_MAX + 1;
27*f6dc9357SAndroid Build Coastguard Worker const unsigned NPT = NP; // Max(NT, NP)
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker class CCoder
30*f6dc9357SAndroid Build Coastguard Worker {
31*f6dc9357SAndroid Build Coastguard Worker   CLzOutWindow _outWindow;
32*f6dc9357SAndroid Build Coastguard Worker   NBitm::CDecoder<CInBuffer> _inBitStream;
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker   int _symbolT;
35*f6dc9357SAndroid Build Coastguard Worker   int _symbolC;
36*f6dc9357SAndroid Build Coastguard Worker   UInt32 DictSize;
37*f6dc9357SAndroid Build Coastguard Worker   // bool FinishMode;
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder256<NUM_CODE_BITS, NPT, 7> _decoderT;
40*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder<NUM_CODE_BITS, NC, 10> _decoderC;
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker   class CCoderReleaser
43*f6dc9357SAndroid Build Coastguard Worker   {
44*f6dc9357SAndroid Build Coastguard Worker     CCoder *_coder;
45*f6dc9357SAndroid Build Coastguard Worker   public:
CCoderReleaser(CCoder * coder)46*f6dc9357SAndroid Build Coastguard Worker     CCoderReleaser(CCoder *coder): _coder(coder) {}
Disable()47*f6dc9357SAndroid Build Coastguard Worker     void Disable() { _coder = NULL; }
~CCoderReleaser()48*f6dc9357SAndroid Build Coastguard Worker     ~CCoderReleaser() { if (_coder) _coder->_outWindow.Flush(); }
49*f6dc9357SAndroid Build Coastguard Worker   };
50*f6dc9357SAndroid Build Coastguard Worker   friend class CCoderReleaser;
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker   bool ReadTP(unsigned num, unsigned numBits, int spec);
53*f6dc9357SAndroid Build Coastguard Worker   bool ReadC();
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeReal(UInt32 outSize, ICompressProgressInfo *progress);
56*f6dc9357SAndroid Build Coastguard Worker public:
CCoder()57*f6dc9357SAndroid Build Coastguard Worker   CCoder(): DictSize(1 << 16)
58*f6dc9357SAndroid Build Coastguard Worker       // , FinishMode(true)
59*f6dc9357SAndroid Build Coastguard Worker       {}
SetDictSize(UInt32 dictSize)60*f6dc9357SAndroid Build Coastguard Worker   void SetDictSize(UInt32 dictSize) { DictSize = dictSize; }
GetInputProcessedSize()61*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetInputProcessedSize() const { return _inBitStream.GetProcessedSize(); }
62*f6dc9357SAndroid Build Coastguard Worker   HRESULT Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
63*f6dc9357SAndroid Build Coastguard Worker       UInt32 outSize, ICompressProgressInfo *progress);
64*f6dc9357SAndroid Build Coastguard Worker };
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker }}}
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker #endif
69