www.pudn.com > HuffmanForFile.zip > BITIO.C
#include#include #include "bitio.h" #include "errhand.h" #define PACIFIER_COUNT 2047 BIT_FILE * OpenOutputBitFile( char * name ) { BIT_FILE * bit_file; bit_file=( BIT_FILE * )calloc( 1,sizeof( BIT_FILE ) ); if( bit_file==NULL ) return( bit_file ); bit_file->file=fopen( name,"wb" ); bit_file->rack=0; bit_file->mask=0x80; bit_file->pacifier_counter=0; return( bit_file ); } BIT_FILE * OpenInputBitFile( char * name ) { BIT_FILE * bit_file; bit_file=( BIT_FILE * )calloc( 1,sizeof( BIT_FILE ) ); if( bit_file==NULL ) return( bit_file ); bit_file->file=fopen( name,"rb" ); bit_file->rack=0; bit_file->mask=0x80; bit_file->pacifier_counter=0; return( bit_file ); } void CloseOutputBitFile( BIT_FILE * bit_file ) { if( bit_file->mask!=0x80 ) if( putc( bit_file->rack,bit_file->file )!=bit_file->rack ) fatal_error( "Fatal error in CloseBitFile!\n" ); fclose( bit_file->file ); free( ( char * ) bit_file ); } void CloseInputBitFile( BIT_FILE * bit_file ) { fclose( bit_file->file ); free( ( char * ) bit_file ); } void OutputBit( BIT_FILE * bit_file,int bit ) { if( bit ) bit_file->rack|=bit_file->mask; bit_file->mask>>=1; if( bit_file->mask==0 ) { if( putc( bit_file->rack,bit_file->file)!=bit_file->rack ) fatal_error( "Fatal error in OutputBit\n" ); else if( ( bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 ) putc( '.',stdout ); bit_file->rack=0; bit_file->mask=0x80; } } void OutputBits( BIT_FILE * bit_file,unsigned long code,int count ) { unsigned long mask; mask=1l<<( count-1 ); while( mask!=0 ) { if( mask & code ) bit_file->rack|=bit_file->mask; bit_file->mask>>=1; if( bit_file->mask==0 ) { if( putc( bit_file->rack,bit_file->file )!=bit_file->rack ) fatal_error( "Fatal error in Outputbits!\n" ); else if( ( bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 ) putc( '.',stdout ); bit_file->rack=0; bit_file->mask=0x80; } mask >>= 1; } } int InputBit( BIT_FILE * bit_file ) { int value; if( bit_file->mask==0x80 ) { bit_file->rack=getc( bit_file->file ); if( bit_file->rack==EOF ) fatal_error( "Fatal error in InputBit!(1)" ); if( (bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 ) putc( '.',stdout ); } value=bit_file->rack & bit_file->mask; bit_file->mask>>=1; if( bit_file->mask==0 ) bit_file->mask=0x80; return( value?1:0 ); } unsigned long InputBits( BIT_FILE * bit_file,int bit_count ) { unsigned long mask; unsigned long return_value; mask=1l<<( bit_count-1 ); return_value=0; while( mask!=0 ) { if( bit_file->mask==0x80 ) { bit_file->rack=getc( bit_file->file ); if( bit_file->rack==EOF ) fatal_error( "Fatal error in InputBits!(2)" ); if( ( bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 ) putc( '.',stdout ); } if( bit_file->rack & bit_file->mask ) return_value|=mask; mask>>=1; bit_file->mask>>=1; if( bit_file->mask==0 ) bit_file->mask=0x80; } return( return_value ); } void FilePrintBinary( FILE * file,unsigned int code,int bits ) { unsigned int mask; mask=1<<( bits-1 ); while( mask!=0 ) { if( code & mask ) fputc( '1',file ); else fputc( '0',file ); mask>>=1; } }