xref: /plan9/sys/src/cmd/scat/bitinput.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include	<u.h>
2*219b2ee8SDavid du Colombier #include	<libc.h>
3*219b2ee8SDavid du Colombier #include	<bio.h>
4*219b2ee8SDavid du Colombier #include	"sky.h"
5*219b2ee8SDavid du Colombier 
6*219b2ee8SDavid du Colombier static int hufvals[] = {
7*219b2ee8SDavid du Colombier 	 1,  1,  1,  1,  1,  1,  1,  1,
8*219b2ee8SDavid du Colombier 	 2,  2,  2,  2,  2,  2,  2,  2,
9*219b2ee8SDavid du Colombier 	 4,  4,  4,  4,  4,  4,  4,  4,
10*219b2ee8SDavid du Colombier 	 8,  8,  8,  8,  8,  8,  8,  8,
11*219b2ee8SDavid du Colombier 	 3,  3,  3,  3,  5,  5,  5,  5,
12*219b2ee8SDavid du Colombier 	10, 10, 10, 10, 12, 12, 12, 12,
13*219b2ee8SDavid du Colombier 	15, 15, 15, 15,  6,  6,  7,  7,
14*219b2ee8SDavid du Colombier 	 9,  9, 11, 11, 13, 13,  0, 14,
15*219b2ee8SDavid du Colombier };
16*219b2ee8SDavid du Colombier 
17*219b2ee8SDavid du Colombier static int huflens[] = {
18*219b2ee8SDavid du Colombier 	3, 3, 3, 3, 3, 3, 3, 3,
19*219b2ee8SDavid du Colombier 	3, 3, 3, 3, 3, 3, 3, 3,
20*219b2ee8SDavid du Colombier 	3, 3, 3, 3, 3, 3, 3, 3,
21*219b2ee8SDavid du Colombier 	3, 3, 3, 3, 3, 3, 3, 3,
22*219b2ee8SDavid du Colombier 	4, 4, 4, 4, 4, 4, 4, 4,
23*219b2ee8SDavid du Colombier 	4, 4, 4, 4, 4, 4, 4, 4,
24*219b2ee8SDavid du Colombier 	4, 4, 4, 4, 5, 5, 5, 5,
25*219b2ee8SDavid du Colombier 	5, 5, 5, 5, 5, 5, 6, 6,
26*219b2ee8SDavid du Colombier };
27*219b2ee8SDavid du Colombier 
28*219b2ee8SDavid du Colombier static	int	buffer;
29*219b2ee8SDavid du Colombier static	int	bits_to_go;		/* Number of bits still in buffer */
30*219b2ee8SDavid du Colombier 
31*219b2ee8SDavid du Colombier void
start_inputing_bits(void)32*219b2ee8SDavid du Colombier start_inputing_bits(void)
33*219b2ee8SDavid du Colombier {
34*219b2ee8SDavid du Colombier 	bits_to_go = 0;
35*219b2ee8SDavid du Colombier }
36*219b2ee8SDavid du Colombier 
37*219b2ee8SDavid du Colombier int
input_huffman(Biobuf * infile)38*219b2ee8SDavid du Colombier input_huffman(Biobuf *infile)
39*219b2ee8SDavid du Colombier {
40*219b2ee8SDavid du Colombier 	int c;
41*219b2ee8SDavid du Colombier 
42*219b2ee8SDavid du Colombier 	if(bits_to_go < 6) {
43*219b2ee8SDavid du Colombier 		c = Bgetc(infile);
44*219b2ee8SDavid du Colombier 		if(c < 0) {
45*219b2ee8SDavid du Colombier 			fprint(2, "input_huffman: unexpected EOF\n");
46*219b2ee8SDavid du Colombier 			exits("format");
47*219b2ee8SDavid du Colombier 		}
48*219b2ee8SDavid du Colombier 		buffer = (buffer<<8) | c;
49*219b2ee8SDavid du Colombier 		bits_to_go += 8;
50*219b2ee8SDavid du Colombier 	}
51*219b2ee8SDavid du Colombier 	c = (buffer >> (bits_to_go-6)) & 0x3f;
52*219b2ee8SDavid du Colombier 	bits_to_go -= huflens[c];
53*219b2ee8SDavid du Colombier 	return hufvals[c];
54*219b2ee8SDavid du Colombier }
55*219b2ee8SDavid du Colombier 
56*219b2ee8SDavid du Colombier int
input_nybble(Biobuf * infile)57*219b2ee8SDavid du Colombier input_nybble(Biobuf *infile)
58*219b2ee8SDavid du Colombier {
59*219b2ee8SDavid du Colombier 	int c;
60*219b2ee8SDavid du Colombier 
61*219b2ee8SDavid du Colombier 	if(bits_to_go < 4) {
62*219b2ee8SDavid du Colombier 		c = Bgetc(infile);
63*219b2ee8SDavid du Colombier 		if(c < 0){
64*219b2ee8SDavid du Colombier 			fprint(2, "input_nybble: unexpected EOF\n");
65*219b2ee8SDavid du Colombier 			exits("format");
66*219b2ee8SDavid du Colombier 		}
67*219b2ee8SDavid du Colombier 		buffer = (buffer<<8) | c;
68*219b2ee8SDavid du Colombier 		bits_to_go += 8;
69*219b2ee8SDavid du Colombier 	}
70*219b2ee8SDavid du Colombier 
71*219b2ee8SDavid du Colombier 	/*
72*219b2ee8SDavid du Colombier 	 * pick off the first 4 bits
73*219b2ee8SDavid du Colombier 	 */
74*219b2ee8SDavid du Colombier 	bits_to_go -= 4;
75*219b2ee8SDavid du Colombier 	return (buffer>>bits_to_go) & 0x0f;
76*219b2ee8SDavid du Colombier }
77