www.pudn.com > huffman2 > huff.c
/* * 7-5-95 5:26 * * StaticHuff v4.0 * * uses Huffman2 * * codes are assigned w/ non huffman-method * * it works! * * * 7-6-95 FastDecode ! It works! * */ /*** config defines ***/ // #define DONT_TIME_INIT #define USE_MACROS #define FAST_DECODE #define FAST_DECODE_ARRAY /*** end config defines ***/ #include#include #include #include #include #include #include #include //globals: clock_t StartClock,StopClock; long RawFileLen; long HuffArrayLen,RawArrayLen; //exit-freed globals: BPTR InFH = NULL; BPTR OutFH = NULL; struct LBitIOInfo * BII = NULL; struct Huff2Info * HI = NULL; ubyte * HuffArray = NULL; ubyte * RawArray = NULL; long * CharCounts = NULL; //protos: void CleanUp(char * ExitMess); int BreakFunc(void); void ExitFunc(void); int main(int argc,char *argv[]) { bool GotDecompressFlag; long HuffLen; long i; errputs("StaticHuff v4.0 copyright (c) 1995 Charles Bloom"); if ( argc < 3 ) CleanUp("Usage: StaticHuff [decompress flag]"); if ( atexit(ExitFunc) ) CleanUp("Couldn't install exit trap!"); if ( (InFH = Open(argv[1],MODE_OLDFILE)) == NULL ) CleanUp("Error opening input file"); if ( (OutFH = Open(argv[2],MODE_NEWFILE)) == NULL ) CleanUp("Error creating output file"); GotDecompressFlag = 0; if ( argc == 4 ) { if ( strichr(argv[3],'d') ) { GotDecompressFlag = 1; } } if ( GotDecompressFlag ) { errputs("Decoding file..."); Read(InFH,&RawFileLen,4); fprintf(stderr,"Decompressing to %lu bytes.\n",RawFileLen); } else //Encode { printf("Encoding file : %s\n",argv[1]); RawFileLen = FileLengthofFH(InFH); Write(OutFH,&RawFileLen,4); } HuffArrayLen = RawFileLen+512; RawArrayLen = RawFileLen + 512; if ( (HuffArray = AllocMem(HuffArrayLen,MEMF_ANY)) == NULL ) CleanUp("AllocMem failed!"); if ( (RawArray = AllocMem(RawArrayLen,MEMF_ANY)) == NULL ) CleanUp("AllocMem failed!"); if ( (CharCounts = AllocMem(256*sizeof(long),MEMF_ANY)) == NULL ) CleanUp("AllocMem failed!"); if ( (BII = LBitIO_Init(HuffArray)) == NULL ) CleanUp("LBitIO_Init failed!"); if ( (HI = Huff2_Init(256,BII,HUFF2_SORT_RADIX)) == NULL ) CleanUp("Huff2_Init failed!"); if ( GotDecompressFlag ) { Read(InFH,&HuffLen,4); Read(InFH,HuffArray,HuffLen); #ifndef DONT_TIME_INIT StartClock = clock(); #endif LBitIO_InitRead(BII); Huff2_UnPackCodeLens(HI); #ifdef FAST_DECODE Huff2_BuildFastDecodeTable(HI); #else Huff2_BuildDecodeTable(HI); #endif #ifdef DONT_TIME_INIT StartClock = clock(); #endif #ifdef FAST_DECODE_ARRAY Huff2_FastDecodeArray_Ubyte(HI,RawArray,RawFileLen); #else #ifdef FAST_DECODE #ifdef USE_MACROS Huff2_FastDecodeC_Macro_Init(HI); for(i=0;i