126 lines
6.7 KiB
C++
126 lines
6.7 KiB
C++
|
//
|
||
|
// _RE.CPP
|
||
|
//
|
||
|
// Source file for ArchiveLib 2.0
|
||
|
//
|
||
|
// Copyright (c) Greenleaf Software, Inc. 1994-1996
|
||
|
// All Rights Reserved
|
||
|
//
|
||
|
// CONTENTS
|
||
|
//
|
||
|
// All shrouded.
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// May 26, 1994 1.0A : First release
|
||
|
//
|
||
|
// August 10, 1994 1.0B : Had a bug in BCC32.EXE code generation. Fixed
|
||
|
// with a pragma that disables optimization. Check
|
||
|
// out BUG007.TXT in DOCS for details.
|
||
|
//
|
||
|
// January 1, 1994 1.0B : BC++ 4.5 reported that a local variable
|
||
|
// in RExpand::Expand() wasn't being used, so
|
||
|
// I deleted it.
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New release w/no significant changes
|
||
|
|
||
|
#include "arclib.h"
|
||
|
#if !defined( AL_IBM )
|
||
|
#pragma hdrstop
|
||
|
#endif
|
||
|
#include "_r.h"
|
||
|
#define _519 "Incorrect compression level parameter passed to compressor. Compression level = %d"
|
||
|
#define _520 "Memory allocation failure in expansion startup"
|
||
|
#define _521 "Internal 1 error in Greenleaf Decompression routine"
|
||
|
#define _522 "Internal 2 error in Greenleaf Decompression routine"
|
||
|
|
||
|
RExpand::RExpand(ALStorage&_266, ALStorage&_267, long _268, int _269) {
|
||
|
_161=&_266; _162=&_267; _248=_268;; if(_269>_137||_269<_138){
|
||
|
mStatus.SetError(AL_ILLEGAL_PARAMETER, _519, _269-10); _175=2; }else
|
||
|
_175=(short )(1<<_269); _176=(short )(_175-1); _166=new uchar [_175+2];
|
||
|
if(_166) memset(_166,0,(_175+2)*sizeof(uchar )); _240=new ushort [_148];
|
||
|
if(_240) memset(_240,0,_148*sizeof(ushort )); _241=new ushort [_149];
|
||
|
if(_241) memset(_241,0,_149*sizeof(ushort )); _242=new uchar [_159];
|
||
|
if(_242) memset(_242,0,_159*sizeof(uchar )); _189=new ushort [2*_141-1];
|
||
|
if(_189) memset(_189,0,(2*_141-1)*sizeof(ushort )); _190=new ushort
|
||
|
[2*_141-1]; if(_190) memset(_190,0,(2*_141-1)*sizeof(ushort )); _180=new
|
||
|
uchar [_141]; _181=new uchar [_152]; if(!_166|| !_240|| !_241|| !_242||
|
||
|
!_189|| !_190|| !_180|| !_181){
|
||
|
mStatus.SetError(AL_CANT_ALLOCATE_MEMORY,_520); } } RExpand::~RExpand()
|
||
|
{ if(_166) delete[]_166; if(_240) delete[]_240; if(_241) delete[]_241;
|
||
|
if(_242) delete[]_242; if(_189) delete[]_189; if(_190) delete[]_190;
|
||
|
if(_180) delete[]_180; if(_181) delete[]_181; } int RExpand::Expand() {
|
||
|
int _231; short _226; short _276; short _203; short _200;
|
||
|
uchar *_278; short _279; short _280; _278=_166; _279=_175; _280=_176;
|
||
|
_231=0; _243=0; _251(); _200=0; while(_243<5){
|
||
|
if((_203=_249())<=UCHAR_MAX){ _278[_200]=(uchar )_203;
|
||
|
if(++_200>=_279){ _200=0; if((short )_162->WriteBuffer(_278,_279)!=_279)
|
||
|
goto _282; } }else { _276=(short )(_203-(UCHAR_MAX+1-_135));
|
||
|
if(_276==_144) break; _226=(short )((_200-_250()-1)&_280);
|
||
|
if(_226<_279-_140-1&&_200<_279-_140-1){ while(--_276>=0)
|
||
|
_278[_200++]=_278[_226++]; }else { while(--_276>=0){
|
||
|
_278[_200]=_278[_226]; if(++_200>=_279){ _200=0; if((short
|
||
|
)_162->WriteBuffer(_278,_279)!=_279) goto _282; } _226=(short
|
||
|
)((_226+1)&_280); } } } } if(_200!=0) _162->WriteBuffer(_278,_200);
|
||
|
_282: return _231; } ushort RExpand::_249() { ushort _276,_283;
|
||
|
if(_244==0){ _244=_252(16); _253(_145,_147,3); _255();
|
||
|
_253(_142,_540,-1); if(mStatus<0) return 0; } _244--;
|
||
|
_276=_240[_182>>4]; if(_276>=_141){ _283=1U<<3; do{ if(_182&_283)
|
||
|
_276=_190[_276]; else _276=_189[_276]; _283>>=1; }while(_276>=_141); }
|
||
|
_256(_180[_276]); return _276; } ushort RExpand::_250() { ushort
|
||
|
_276,_283; _276=_241[_182>>8]; if(_276>=_142){ _283=1U<<7; do{
|
||
|
if(_182&_283) _276=_190[_276]; else _276=_189[_276]; _283>>=1;
|
||
|
}while(_276>=_142); } _256(_181[_276]); if(_276!=0){ _276--; _276=(short
|
||
|
)((1U<<_276)+_252(_276)); } return _276; } void RExpand::_251() {
|
||
|
_244=0; _257(); } ushort RExpand::_252(int _219) { ushort _284;
|
||
|
_284=(ushort )(_182>>(2*CHAR_BIT-_219)); _256(_219); return _284; } void
|
||
|
RExpand::_253(short _254,short _220,short _221) { short _226,_203,_219;
|
||
|
ushort _283; _219=_252(_220); if(_219==0){ _203=_252(_220);
|
||
|
for(_226=0;_226<_254;_226++) _181[_226]=0; for(_226=0;_226<256;_226++)
|
||
|
_241[_226]=_203; }else { _226=0; while(_226<_219){ _203=(short
|
||
|
)(_182>>13); if(_203==7){ _283=1U<<12; while(_283&_182){ _283>>=1;
|
||
|
_203++; } } _256((_203<7)?3:_203-3); _181[_226++]=(uchar )_203;
|
||
|
if(_226==_221){ _203=_252(2); while(--_203>=0) _181[_226++]=0; } }
|
||
|
while(_226<_254) _181[_226++]=0; _258(_254,_181,8,_241,_149); } } void
|
||
|
RExpand::_255() { short _226,_203,_219; ushort _283; _219=_252(_143);
|
||
|
if(_219==0){ _203=_252(_143); for(_226=0;_226<_141;_226++) _180[_226]=0;
|
||
|
for(_226=0;_226<_148;_226++) _240[_226]=_203; }else { _226=0;
|
||
|
while(_226<_219){ _203=_241[_182>>8]; if(_203>=_145){ _283=1U<<7; do{
|
||
|
if(_182&_283) _203=_190[_203]; else _203=_189[_203]; _283>>=1;
|
||
|
}while(_203>=_145); } _256(_181[_203]); if(_203<=2){ if(_203==0) _203=1;
|
||
|
else if(_203==1) _203=(short )(_252(4)+3); else _203=(short
|
||
|
)(_252(_143)+20); while(--_203>=0) _180[_226++]=0; }else
|
||
|
_180[_226++]=(uchar )(_203-2); } while(_226<_141) _180[_226++]=0;
|
||
|
_258(_141,_180,12,_240,_148); } } void RExpand::_256(int _219) {
|
||
|
while(_219>_172){ _219-=_172; _182=(ushort
|
||
|
)((_182<<_172)+(_245>>(CHAR_BIT-_172))); if(_246<=0){ _247=_242;
|
||
|
if(_248>=0&&_248<_159){ _246=(short
|
||
|
)_161->ReadBuffer(_242,(size_t)_248); _248-=_246; }else _246=(short
|
||
|
)_161->ReadBuffer(_242,_159); if(_246<=0) _243++; } _245=*_247++;
|
||
|
_246--; _172=CHAR_BIT; } _172=(short )(_172-_219); _182=(ushort
|
||
|
)((_182<<_219)+(_245>>(CHAR_BIT-_219))); _245<<=_219; } void
|
||
|
RExpand::_257() { _182=0; _245=0; _172=0; _246=0; _256(2*CHAR_BIT); }
|
||
|
#if defined(AL_BORLAND)&&defined(AL_FLAT_MODEL)
|
||
|
#pragma option -Od
|
||
|
#endif
|
||
|
void RExpand::_258(int _259, uchar *_260, int _261, ushort *_262, ushort
|
||
|
_263) { ushort _277[17],_287[17],_288[18],*_204; uint
|
||
|
_226,_289,_209,_290,_291,_292,_293,_283; for(_226=1;_226<=16;_226++)
|
||
|
_277[_226]=0; for(_226=0;(int )_226<_259;_226++) _277[_260[_226]]++;
|
||
|
_288[1]=0; for(_226=1;_226<=16;_226++) _288[_226+1]=(ushort
|
||
|
)(_288[_226]+(_277[_226]<<(16-_226))); if(_288[17]!=(ushort )(1U<<16)){
|
||
|
mStatus.SetError(AL_INTERNAL_ERROR,_521); _243=10; return ; }
|
||
|
_291=16-_261; for(_226=1;(int )_226<=_261;_226++){ _288[_226]>>=_291;
|
||
|
_287[_226]=(ushort )(1U<<(_261-_226)); } while(_226<=16){
|
||
|
_287[_226]=(ushort )(1U<<(16-_226)); _226++; } _226=_288[_261+1]>>_291;
|
||
|
if(_226!=(ushort )(1U<<16)){ _289=1U<<_261; while(_226!=_289)
|
||
|
_262[_226++]=0; } _292=_259; _283=1U<<(15-_261); for(_290=0;(int
|
||
|
)_290<_259;_290++){ if((_209=_260[_290])==0) continue;
|
||
|
_293=_288[_209]+_287[_209]; if((int )_209<=_261){ if(_293>_263){
|
||
|
mStatus.SetError(AL_INTERNAL_ERROR,_522); _243=10; return ; }
|
||
|
for(_226=_288[_209];_226<_293;_226++) _262[_226]=(ushort )_290; }else {
|
||
|
_289=_288[_209]; _204=&_262[_289>>_291]; _226=_209-_261; while(_226!=0){
|
||
|
if(*_204==0){ _190[_292]=_189[_292]=0; *_204=(ushort )_292++; }
|
||
|
if(_289&_283) _204=&_190[*_204]; else _204=&_189[*_204]; _289<<=1;
|
||
|
_226--; } *_204=(ushort )_290; } _288[_209]=(ushort )_293; } }
|