Functions for bitio. Taken as is from The Data Compression Book
[u/mrichter/AliRoot.git] / HLT / comp / bitio.c
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 {
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     }
72 }
73
74 void OutputBits(BIT_FILE *bit_file,unsigned long code, int count )
75 {
76     unsigned long mask;
77
78     mask = 1L << ( count - 1 );
79     while ( mask != 0) {
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;
92     }
93 }
94
95 int InputBit( BIT_FILE *bit_file )
96 {
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 );
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) {
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;
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
152 /*************************** End of BITIO.C **************************/
153