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