1
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5
6 #include "huffman.h"
7
8
9
10 Huffman *
huffman_new(void)11 huffman_new (void)
12 {
13 Huffman *huff;
14
15 huff = malloc (sizeof (Huffman));
16 memset (huff, 0, sizeof(Huffman));
17
18 return huff;
19 }
20
21
22 void
huffman_add_code(Huffman * huff,unsigned int code,int n_bits,int value)23 huffman_add_code (Huffman *huff, unsigned int code, int n_bits,
24 int value)
25 {
26 huff->codes = realloc(huff->codes,
27 sizeof(HuffmanCode) * (huff->n_codes + 1));
28 huff->codes[huff->n_codes].value = value;
29 huff->codes[huff->n_codes].code = code << (32 - n_bits);
30 huff->codes[huff->n_codes].mask = 0xffffffff << (32 - n_bits);
31 huff->codes[huff->n_codes].n_bits = n_bits;
32
33 huff->n_codes++;
34 }
35
36
huffman_decode_iterate(Huffman * huff)37 void huffman_decode_iterate (Huffman *huff)
38 {
39 unsigned int bits;
40 int i;
41
42 if (huff->state == HUFF_NEED_BYTE) {
43 huff->state_bits = (huff->state_bits << 8) | huff->next_byte;
44 huff->state_n_bits += 8;
45 }
46
47 bits = huff->state_bits << (32 - huff->state_n_bits);
48
49 for(i=0;i<huff->n_codes;i++){
50 if (huff->codes[i].n_bits <= huff->state_n_bits &&
51 huff->codes[i].code == (bits & huff->codes[i].mask)) {
52 huff->out_value = huff->codes[i].value;
53 break;
54 }
55 }
56 if (i == huff->n_codes) {
57 huff->state = HUFF_NEED_BYTE;
58 } else {
59 huff->state = HUFF_OK;
60 }
61
62 }
63
huffman_decode_ref(Huffman * huff,int * dest,unsigned char * src,int n)64 void huffman_decode_ref (Huffman *huff, int *dest, unsigned char *src, int n)
65 {
66 int i;
67
68 i = 0;
69 while(n>0 || huff->state == HUFF_OK){
70 printf("STATE %d\n", huff->state);
71 if (huff->state == HUFF_NEED_BYTE) {
72 printf("pushing byte %02x\n", *src);
73 huff->next_byte = *src;
74 src++;
75 n--;
76 }
77 huffman_decode_iterate (huff);
78 if (huff->state == HUFF_OK) {
79 printf("got value %d\n", huff->out_value);
80 dest[i] = huff->out_value;
81 }
82 }
83 }
84
85