Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

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