www.pudn.com > EZW_.rar > BITIO.C


/*---------------------------------------------------------------------------*/ 
/*---------------------------------------------------------------------------*/ 
/* The codes are from the book "The Data Compression Book" by Mark Nelson  
 * and Jean-Loup Gailly, M&T Books 1996. 
 * 
 * I did some changes to the end of file issue, but not really successful. 
 * 
 * Mow-Song, Ng 2/9/2002ge 
 * msng@mmu.edu.my 
 * http://www.pesona.mmu.edu.my/~msng 
 * 
 * I do not claim copyright to the code, but if you use them or modify them, 
 * please drop me a mail. 
 *  
 */ 
/*---------------------------------------------------------------------------*/ 
/*---------------------------------------------------------------------------*/ 
 
#include "bitio.h" 
 
BIT_FILE *OpenOutputBitFile(char *name ) 
{ 
	//定义比特流文件句柄 
	BIT_FILE *bit_file; 
	//分配相应的数据缓存空间 
   bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) ); 
	//打开磁盘文件,bit_file将获得其句柄 
	if ( bit_file == NULL ) 
		return( bit_file ); 
	bit_file->file = fopen( name, "wb" ); 
	//如何文件打开失败,返回NULL 
	if (bit_file->file == NULL){ 
		return NULL; 
	} 
	//写入比特流文件的标志信息 
   bit_file->rack = 0; 
   bit_file->mask = 0x80; 
	//返回文件的有效值 
	return( bit_file ); 
} 
 
BIT_FILE *OpenInputBitFile(char *name ) 
{ 
	//定义比特流文件句柄 
	BIT_FILE *bit_file; 
	//分配相应的数据缓存空间 
   bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) ); 
	//打开磁盘文件,bit_file将获得其句柄 
	if ( bit_file == NULL ) 
		return( bit_file ); 
	bit_file->file = fopen( name, "rb" ); 
	//如何文件打开失败,返回NULL 
	if (bit_file->file == NULL){ 
		return NULL; 
	} 
	//写入比特流文件的标志信息 
   bit_file->rack = 0; 
   bit_file->mask = 0x80; 
	//返回文件的有效值 
	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 ) 
         BitioError("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 ){ 
         BitioError("Fatal error in OutputBit!\n" ); 
      } 
      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 ){ 
            BitioError( "Fatal error in OutputBit!\n" ); 
         } 
          
         bit_file->rack = 0; 
         bit_file->mask = 0x80; 
      } 
		 
      mask >>= 1; 
   } 
} 
 
int InputBit(BIT_FILE *bit_file, int *EOFflag) 
{ 
   int value; 
	 
   *EOFflag=0; 
   if ( bit_file->mask == 0x80 ){ 
      bit_file->rack = getc( bit_file->file );	 
      if ( bit_file->rack == EOF ){ 
         *EOFflag=1; 
		} 
   } 
	 
   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, int *EOFflag) 
{ 
   unsigned long mask; 
   unsigned long return_value; 
	 
   *EOFflag=0; 
   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 ){ 
            *EOFflag=1; 
         } 
      } 
       
      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; 
   } 
} 
 
void BitioError(char *fmt, ...) 
{ 
	va_list argptr; 
	 
	va_start( argptr, fmt ); 
	printf( "BitioError: " ); 
	vprintf( fmt, argptr ); 
	va_end( argptr ); 
	exit( -1 ); 
}