/************************** Start of BITIO.C ************************* * * This utility file contains all of the routines needed to impement * bit oriented routines under either ANSI or K&R C. It needs to be * linked with every program used in the entire book. * */ #include #include #include "bitio.h" #include "errhand.h" #define PACIFIER_COUNT 2047 void OpenOutputBitFile( bit_file,name ) /*char *name;*/ char name[130]; BIT_FILE *bit_file; { /*bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) ); if ( bit_file == NULL ) return( bit_file );*/ if ((bit_file->file=fopen(name,"w"))==NULL) {printf("impossible d'ouvrir bit_file->file en output\n");exit;} rewind(bit_file->file); /* bit_file->file = fopen( name, "wb" );*/ bit_file->rack = 0; bit_file->mask = 0x80; bit_file->pacifier_counter = 0; /* return( bit_file );*/ } void OpenInputBitFile( bit_file,name) char name[130]; BIT_FILE *bit_file; { /* bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) ); if ( bit_file == NULL ) return( bit_file );*/ if ((bit_file->file=fopen(name,"r"))==NULL) {printf("impossible d'ouvrir bit_file->file en input\n"); exit; } rewind(bit_file->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,nbbitari ) BIT_FILE *bit_file; int *nbbitari; { if ( bit_file->mask != 0x80 ) range(bit_file->file,bit_file->rack,8);/*printf("je suis sort de range\n");*/ *nbbitari=*nbbitari+1; /* 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 ); free( (char) bit_file );*/ } void CloseInputBitFile( bit_file ) BIT_FILE *bit_file; { fclose( bit_file->file ); /* free( (char *) bit_file );*/ } void OutputBit(fichs, bit_file, bit,nbbitari ) BIT_FILE *bit_file; FILE *fichs; int bit,*nbbitari; {/*printf("je suis ds OutputBit et nbbitari est %d\n",*nbbitari);*/ if ( bit ) {/*printf("oui 0\n");*/bit_file->rack |= bit_file->mask;/*printf("oui 1\n");*/} bit_file->mask >>= 1;/*printf("oui 12\n");*/ if ( bit_file->mask == 0 ) {/*printf("oui 13\n");*/ range(bit_file->file,bit_file->rack,8);/*printf("je suis sort de range\n");*/ *nbbitari=*nbbitari+1; /*if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack )*/ /* printf("oui 15\n");fatal_error( "Fatal error in OutputBit!\n" );} else {*/ /*printf("oui 16\n");*/ if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 ) {/*printf("oui 14\n");*/putc( '.', stdout );} bit_file->rack = 0; bit_file->mask = 0x80; } } void OutputBits( bit_file, code, count,nbbitari ) BIT_FILE *bit_file; unsigned long code; int count,*nbbitari; { 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 ) { range(bit_file->file,bit_file->rack,8);/*printf("je suis sort de range\n");*/ *nbbitari=*nbbitari+1; /* 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; } mask >>= 1; } } int InputBit( bit_file ) 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_count ) 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, code, bits ) 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; } } /*************************** End of BITIO.C **************************/