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