f92ad96b |
1 | /************************** Start of BITIO.C ************************* |
2 | * |
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. |
6 | * |
7 | */ |
8 | #include <stdio.h> |
9 | #include <stdlib.h> |
10 | #include "bitio.h" |
11 | #include "errhand.h" |
12 | |
13 | #define PACIFIER_COUNT 2047 |
14 | |
15 | BIT_FILE *OpenOutputBitFile( char *name ) |
16 | { |
17 | BIT_FILE *bit_file; |
18 | |
19 | bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) ); |
20 | if ( bit_file == NULL ) |
21 | return( bit_file ); |
22 | bit_file->file = fopen( name, "wb" ); |
23 | bit_file->rack = 0; |
24 | bit_file->mask = 0x80; |
25 | bit_file->pacifier_counter = 0; |
26 | return( bit_file ); |
27 | } |
28 | |
29 | BIT_FILE *OpenInputBitFile( char *name ) |
30 | { |
31 | BIT_FILE *bit_file; |
32 | |
33 | bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) ); |
34 | if ( bit_file == NULL ) |
35 | return( bit_file ); |
36 | bit_file->file = fopen( name, "rb" ); |
37 | bit_file->rack = 0; |
38 | bit_file->mask = 0x80; |
39 | bit_file->pacifier_counter = 0; |
40 | return( bit_file ); |
41 | } |
42 | |
43 | void CloseOutputBitFile(BIT_FILE *bit_file ) |
44 | { |
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 ); |
50 | } |
51 | |
52 | void CloseInputBitFile(BIT_FILE *bit_file ) |
53 | { |
54 | fclose( bit_file->file ); |
55 | free( (char *) bit_file ); |
56 | } |
57 | |
58 | void OutputBit( BIT_FILE *bit_file, int bit ) |
59 | { |
4a838220 |
60 | if ( bit ) |
61 | bit_file->rack |= bit_file->mask; |
62 | bit_file->mask >>= 1; |
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" ); |
66 | /*else |
67 | if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 ) |
68 | putc( '.', stdout );*/ |
69 | bit_file->rack = 0; |
70 | bit_file->mask = 0x80; |
71 | } |
f92ad96b |
72 | } |
73 | |
74 | void OutputBits(BIT_FILE *bit_file,unsigned long code, int count ) |
75 | { |
76 | unsigned long mask; |
4a838220 |
77 | |
f92ad96b |
78 | mask = 1L << ( count - 1 ); |
79 | while ( mask != 0) { |
4a838220 |
80 | if ( mask & code ) |
81 | bit_file->rack |= bit_file->mask; |
82 | bit_file->mask >>= 1; |
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 );*/ |
88 | bit_file->rack = 0; |
89 | bit_file->mask = 0x80; |
90 | } |
91 | mask >>= 1; |
f92ad96b |
92 | } |
93 | } |
94 | |
95 | int InputBit( BIT_FILE *bit_file ) |
96 | { |
4a838220 |
97 | int value; |
98 | |
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 );*/ |
105 | } |
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 ); |
f92ad96b |
111 | } |
112 | |
113 | unsigned long InputBits( BIT_FILE *bit_file, int bit_count ) |
114 | { |
115 | unsigned long mask; |
116 | unsigned long return_value; |
117 | |
118 | mask = 1L << ( bit_count - 1 ); |
119 | return_value = 0; |
120 | while ( mask != 0) { |
4a838220 |
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 );*/ |
127 | } |
128 | if ( bit_file->rack & bit_file->mask ) |
129 | return_value |= mask; |
130 | mask >>= 1; |
131 | bit_file->mask >>= 1; |
132 | if ( bit_file->mask == 0 ) |
133 | bit_file->mask = 0x80; |
f92ad96b |
134 | } |
135 | return( return_value ); |
136 | } |
137 | |
138 | void FilePrintBinary( FILE *file, unsigned int code, int bits ) |
139 | { |
140 | unsigned int mask; |
141 | |
142 | mask = 1 << ( bits - 1 ); |
143 | while ( mask != 0 ) { |
144 | if ( code & mask ) |
145 | fputc( '1', file ); |
146 | else |
147 | fputc( '0', file ); |
148 | mask >>= 1; |
149 | } |
150 | } |
151 | |
8f2aba92 |
152 | |
f92ad96b |
153 | /*************************** End of BITIO.C **************************/ |
154 | |