www.pudn.com > HuffmanForFile.zip > CARMAN.C
#include#include #include #include #include #include /*Used in Turbo c*/ #define MSDOS 1 #define DIR_STRUCT struct ffblk #define FIND_FIRST(n,d,a) findfirst(n,d,a) #define FIND_NEXT findnext #define DIR_FILE_NAME ff_name #define BASE_HEADER_SIZE 19 #define CRC_MASK 0xffffffffl #define CRC32_POLYNOMIAL Oxedb88320l #ifndef FILENAME_MAX #define FILENAME_MAX 128\ #endif typedef struct header{ char file_name[FILENAME_MAX]; char compression_method; unsigned long original; unsigned long compressed_size; unsigned long original_crc; unsigned long header_crc; }HEADER; int main( int argc,char * argv[] ); void FatalError( char * message,... ); void BuildCRCTable( void ); unsigned long CalculateBlockCRC32( unsigned int count, unsigned long crc,void * buffer ); unsigned long UpdateCharacterCRC32( unsigned long crc,int c ); int ParseArguments( int argc,char * argv[] ); void UsageExit( void ); void OpenArchiveFile( char * name,int command ); void BuildFileList( int argc,char * argv,int command ); int ExpandAndMassageMSDOSFileNames( int count,char * wild_name ); void MassageMSDOSFileName( int count,char * file ); int AddFileListToArchive( void ); int ProcessAllFileInInputCar( int command,int count ); int SearchFileList( char * file_name ); int WildCardMatch( char * s1,char * s2 ); void SkipOverFileFromInputCar( void ); void copyFileFromInputCar( void ); void PrintListTitles( void ); void ListCarFileEntry( void ); int RatioInPercent( unsigned long compressed,unsigned long original ); int ReadFileHeader( void ); unsigned long UnpackUnsignedData( int number_of_bytes,unsigned char * buffer ); void WriteFileHeader( void ); void PackUnsignedData( int number_of_bytes,unsigned long number,unsigned char * buffer ); void WriteEndOfCarHeader( void ); void Insert( FILE * input_text_file,char * operation ); void Extract( FILE * destination ); int Store( FILE * input_text_file ); unsigned long UnStore( FILE * destination ); int LZSSCompress( FILE * input_text_file ); unsigned long LZSSExpand( FILE * destination ); char TempFileName[FILENAME_MAX]; FILE * InputCarFile; char CarFileName[FILENAME_MAX]; FILE *OutputCarFile; HEADER header; char * FileList[100]; unsigned long Ccitt32Table[256]; int main( int argc,char * argv[] ) { int command; int count; setbuf( stdout,NULL ); setbuf( stderr,NULL ); fprintf( stderr,"CARMAN 1.0:" ); BuildCRCTable(); command=ParseArguments( argc,argv ); fprintf( stderr,"\n" ); OpenArchiveFiles( argv[2],command ); BuildFileList( argc-3,argv+3,command ); if( command=='A' ) count=AddFileListArchive(); else count=0; if( command='L' ) PrintListTitles(); count=ProcessAllFilesInInputCar( command,count ); if( OutputCarFile!=NULL && count!=0 ){ WriteEnsOfCarHeader(); if( ferror( OutputCarFile )||fclose( OutputCarFile )==EOF ) FfatalError( "Can't write!" ); remove( CarFileName ); rename( TempFileName ); } if( command!='P' ) printf( "\n%d file %s\n"count,(count==1)?"":"s" ); else fprintf( stderr,"\n%d file %s\n",count,(count==1)?"":"s" ); return( 0 ); } void FatalError( char * fmt,... ) { va_list args; va_start( args,fmt ); putc( '\n',stderr ); vfprintf( stderr,fmt,args ); putc( '\n',stderr ); va_end( args ); if( OutputCarFile!=NULL ) fclose( OutputCarFile ); remove( TempFileName ); exit( 1 ); } void BuildCRCTable() { int i; int j; unsigned long value; for( i=0;i<=255;i++ ){ value=i; for( j=8;j>0;j-- ){ if( value & 1 ) value=( value>>1 )^CRC32_POLYNOMIAL; else value>>=1; } Ccitt32Table[i]=value; } }