1 /************************** Start of BITIO.C *************************
3 * This utility file contains all of the routines needed to impement
4 * bit oriented routines under either ANSI or K&R C. It needs to be
5 * linked with every program used in the entire book.
13 #define PACIFIER_COUNT 2047
15 BIT_FILE *OpenOutputBitFile( char *name )
19 bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) );
20 if ( bit_file == NULL )
22 bit_file->file = fopen( name, "wb" );
24 bit_file->mask = 0x80;
25 bit_file->pacifier_counter = 0;
29 BIT_FILE *OpenInputBitFile( char *name )
33 bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) );
34 if ( bit_file == NULL )
36 bit_file->file = fopen( name, "rb" );
38 bit_file->mask = 0x80;
39 bit_file->pacifier_counter = 0;
43 void CloseOutputBitFile(BIT_FILE *bit_file )
45 if ( bit_file->mask != 0x80 )
46 if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack )
47 fatal_error( "Fatal error in CloseBitFile!\n" );
48 fclose( bit_file->file );
49 free( (char *) bit_file );
52 void CloseInputBitFile(BIT_FILE *bit_file )
54 fclose( bit_file->file );
55 free( (char *) bit_file );
58 void OutputBit( BIT_FILE *bit_file, int bit )
61 bit_file->rack |= bit_file->mask;
63 if ( bit_file->mask == 0 ) {
64 if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack )
65 fatal_error( "Fatal error in OutputBit!\n" );
67 if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
68 putc( '.', stdout );*/
70 bit_file->mask = 0x80;
74 void OutputBits(BIT_FILE *bit_file,unsigned long code, int count )
78 mask = 1L << ( count - 1 );
81 bit_file->rack |= bit_file->mask;
83 if ( bit_file->mask == 0 ) {
84 if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack )
85 fatal_error( "Fatal error in OutputBit!\n" );
86 /*else if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
87 putc( '.', stdout );*/
89 bit_file->mask = 0x80;
95 int InputBit( BIT_FILE *bit_file )
99 if ( bit_file->mask == 0x80 ) {
100 bit_file->rack = getc( bit_file->file );
101 if ( bit_file->rack == EOF )
102 fatal_error( "Fatal error in InputBit!\n" );
103 /*if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
104 putc( '.', stdout );*/
106 value = bit_file->rack & bit_file->mask;
107 bit_file->mask >>= 1;
108 if ( bit_file->mask == 0 )
109 bit_file->mask = 0x80;
110 return( value ? 1 : 0 );
113 unsigned long InputBits( BIT_FILE *bit_file, int bit_count )
116 unsigned long return_value;
118 mask = 1L << ( bit_count - 1 );
121 if ( bit_file->mask == 0x80 ) {
122 bit_file->rack = getc( bit_file->file );
123 if ( bit_file->rack == EOF )
124 fatal_error( "Fatal error in InputBit!\n" );
125 /*if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
126 putc( '.', stdout );*/
128 if ( bit_file->rack & bit_file->mask )
129 return_value |= mask;
131 bit_file->mask >>= 1;
132 if ( bit_file->mask == 0 )
133 bit_file->mask = 0x80;
135 return( return_value );
138 void FilePrintBinary( FILE *file, unsigned int code, int bits )
142 mask = 1 << ( bits - 1 );
143 while ( mask != 0 ) {
153 /*************************** End of BITIO.C **************************/