www.pudn.com > inet_stock.zip > BITIO.C


#include 
#include 
//#include "bitio.h"
//#include "errhand.h"
        
typedef struct tag_bit_file
{
	FILE *file;
	unsigned char mask;
	int rack;
	int pacifier_counter;
  	char *buffer;
  	unsigned int ptr;
}BIT_FILE;

BIT_FILE		*OpenInputBitFile(char *filename);
BIT_FILE		*OpenOutputBitFile(char *filename);
void			OutputBit(BIT_FILE *bit_file,int bit);
void			OutputBits(BIT_FILE *bit_file,unsigned long code,int count);
int				InputBit(BIT_FILE *bit_file);
unsigned long	InputBits(BIT_FILE *bit_file,int count);
void			CloseInputBitFile(BIT_FILE *bit_file);
void			CloseOutputBitFile(BIT_FILE *bit_file);
void			FilePrintBinary(FILE *file,unsigned int code,int bits);

void fatal_error(char *fmt);
        
#define		PACIFIER_COUNT	2047
#define   	BUFFER_SIZE 1024*2

void fatal_error(char *fmt)
{
}

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;
  	bit_file->buffer = calloc(1,BUFFER_SIZE);
  	bit_file->ptr =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->ptr>0)
  {
    if(fwrite((void *)&bit_file->buffer[0],sizeof(char),bit_file->ptr,
        bit_file->file)!=bit_file->ptr)
      fatal_error("Fatal error in write CloseBitFile!\n");
    bit_file->ptr=0;
  }
	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);

  if(bit_file->buffer!=NULL)
    free(bit_file->buffer);

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

    if(bit_file->ptrbuffer[bit_file->ptr]=bit_file->rack;
      bit_file->ptr++;
    }
    if(bit_file->ptr == BUFFER_SIZE)
    {
      if(fwrite((void *)&bit_file->buffer[0],sizeof(char),bit_file->ptr,
          bit_file->file)!=bit_file->ptr)
        fatal_error("Fatal error in write CloseBitFile!\n");
      bit_file->ptr=0;
    }

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

      if(bit_file->ptrbuffer[bit_file->ptr]=bit_file->rack;
        bit_file->ptr++;
      }
      if(bit_file->ptr ==BUFFER_SIZE)
      {
        if(fwrite((void *)&bit_file->buffer[0],sizeof(char),bit_file->ptr,
            bit_file->file)!=bit_file->ptr)
        {
          fatal_error("Fatal error in write OutputBits");
        }
        bit_file->ptr=0;
      }

			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!\n");
		//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 InputBit!\n");
			//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;
	}
}