4 enum BLOCK_TYPES {BLOCK_LZ,BLOCK_PPM};
9 unsigned int DecodeLen[16];
10 unsigned int DecodePos[16];
11 unsigned int DecodeNum[2];
17 unsigned int DecodeLen[16];
18 unsigned int DecodePos[16];
19 unsigned int DecodeNum[NC];
25 unsigned int DecodeLen[16];
26 unsigned int DecodePos[16];
27 unsigned int DecodeNum[DC];
33 unsigned int DecodeLen[16];
34 unsigned int DecodePos[16];
35 unsigned int DecodeNum[LDC];
41 unsigned int DecodeLen[16];
42 unsigned int DecodePos[16];
43 unsigned int DecodeNum[RC];
49 unsigned int DecodeLen[16];
50 unsigned int DecodePos[16];
51 unsigned int DecodeNum[BC];
56 unsigned int BlockStart;
57 unsigned int BlockLength;
58 unsigned int ExecCount;
60 VM_PreparedProgram Prg;
63 /***************************** Unpack v 2.0 *********************************/
67 unsigned int DecodeLen[16];
68 unsigned int DecodePos[16];
69 unsigned int DecodeNum[MC20];
78 unsigned int ByteCount;
81 /***************************** Unpack v 2.0 *********************************/
84 class Unpack:private BitInput
89 void Unpack29(bool Solid);
92 void ExecuteCode(VM_PreparedProgram *Prg);
93 void UnpWriteArea(unsigned int StartPtr,unsigned int EndPtr);
94 void UnpWriteData(byte *Data,int Size);
96 void MakeDecodeTables(unsigned char *LenTab,struct Decode *Dec,int Size);
97 int DecodeNumber(struct Decode *Dec);
99 inline void InsertOldDist(unsigned int Distance);
100 inline void InsertLastMatch(unsigned int Length,unsigned int Distance);
101 void UnpInitData(int Solid);
102 void CopyString(unsigned int Length,unsigned int Distance);
103 bool ReadEndOfBlock();
105 bool ReadVMCodePPM();
106 bool AddVMCode(unsigned int FirstByte,byte *Code,int CodeSize);
114 Array<UnpackFilter*> Filters;
115 Array<UnpackFilter*> PrgStack;
116 Array<int> OldFilterLengths;
121 struct DistDecode DD;
122 struct LowDistDecode LDD;
126 unsigned int OldDist[4],OldDistPtr;
127 unsigned int LastDist,LastLength;
129 unsigned int UnpPtr,WrPtr;
134 unsigned char UnpOldTable[HUFF_TABLE_SIZE];
147 Int64 WrittenFileSize;
151 int PrevLowDist,LowDistRepCount;
153 /***************************** Unpack v 1.5 *********************************/
154 void Unpack15(bool Solid);
159 void OldUnpInitData(int Solid);
161 void CorrHuff(unsigned int *CharSet,unsigned int *NumToPlace);
162 void OldCopyString(unsigned int Distance,unsigned int Length);
163 unsigned int DecodeNum(int Num,unsigned int StartPos,
164 unsigned int *DecTab,unsigned int *PosTab);
165 void OldUnpWriteBuf();
167 unsigned int ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256];
168 unsigned int Place[256],PlaceA[256],PlaceB[256],PlaceC[256];
169 unsigned int NToPl[256],NToPlB[256],NToPlC[256];
170 unsigned int FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3;
171 int Buf60,NumHuf,StMode,LCount,FlagsCnt;
172 unsigned int Nhfb,Nlzb,MaxDist3;
173 /***************************** Unpack v 1.5 *********************************/
175 /***************************** Unpack v 2.0 *********************************/
176 void Unpack20(bool Solid);
177 struct MultDecode MD[4];
178 unsigned char UnpOldTable20[MC20*4];
179 int UnpAudioBlock,UnpChannels,UnpCurChannel,UnpChannelDelta;
180 void CopyString20(unsigned int Length,unsigned int Distance);
182 void UnpInitData20(int Solid);
183 void ReadLastTables();
184 byte DecodeAudio(int Delta);
185 struct AudioVariables AudV[4];
186 /***************************** Unpack v 2.0 *********************************/
189 Unpack(ComprDataIO *DataIO);
191 void Init(byte *Window=NULL);
192 void DoUnpack(int Method,bool Solid);
193 bool IsFileExtracted() {return(FileExtracted);}
194 void SetDestSize(Int64 DestSize) {DestUnpSize=DestSize;FileExtracted=false;}
195 void SetSuspended(bool Suspended) {Unpack::Suspended=Suspended;}
197 unsigned int GetChar()
199 if (InAddr>BitInput::MAX_SIZE-30)
201 return(InBuf[InAddr++]);