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; 
  } 
}