1 /***********************************************************
2 huf.c -- static Huffman
3 ***********************************************************/
7 #define NP (DICBIT + 1)
8 #define NT (CODE_BIT + 3)
9 #define PBIT 4 /* smallest integer such that (1U << PBIT) > NP */
10 #define TBIT 5 /* smallest integer such that (1U << TBIT) > NT */
17 ushort left[2 * NC - 1], right[2 * NC - 1];
18 static uchar *buf, c_len[NC], pt_len[NPT];
19 static uint bufsiz = 0, blocksize;
20 static ushort c_freq[2 * NC - 1], c_table[4096], c_code[NC],
21 p_freq[2 * NP - 1], pt_table[256], pt_code[NPT], t_freq[2 * NT - 1];
23 /***** encoding *****/
30 for (i = 0; i < NT; i++)
33 while (n > 0 && c_len[n - 1] == 0)
40 while (i < n && c_len[i] == 0) {
48 else if (count == 19) {
61 write_pt_len(int n, int nbit, int i_special)
65 while (n > 0 && pt_len[n - 1] == 0)
74 putbits(k - 3, (1U << (k - 3)) - 2);
76 while (i < 6 && pt_len[i] == 0)
78 putbits(2, (i - 3) & 3);
89 while (n > 0 && c_len[n - 1] == 0)
97 while (i < n && c_len[i] == 0) {
102 for (k = 0; k < count; k++)
103 putbits(pt_len[0], pt_code[0]);
105 else if (count <= 18) {
106 putbits(pt_len[1], pt_code[1]);
107 putbits(4, count - 3);
109 else if (count == 19) {
110 putbits(pt_len[0], pt_code[0]);
111 putbits(pt_len[1], pt_code[1]);
115 putbits(pt_len[2], pt_code[2]);
116 putbits(CBIT, count - 20);
120 putbits(pt_len[k + 2], pt_code[k + 2]);
127 putbits(c_len[c], c_code[c]);
141 putbits(pt_len[c], pt_code[c]);
143 putbits(c - 1, p & (0xFFFFU >> (17 - c)));
149 uint i, k, flags, root, pos, size;
151 root = make_tree(NC, c_freq, c_len, c_code);
156 root = make_tree(NT, t_freq, pt_len, pt_code);
158 write_pt_len(NT, TBIT, 3);
172 root = make_tree(NP, p_freq, pt_len, pt_code);
174 write_pt_len(NP, PBIT, -1);
181 for (i = 0; i < size; i++) {
182 if (i % CHAR_BIT == 0)
186 if (flags & (1U << (CHAR_BIT - 1))) {
187 encode_c(buf[pos++] + (1U << CHAR_BIT));
188 k = buf[pos++] << CHAR_BIT;
193 encode_c(buf[pos++]);
197 for (i = 0; i < NC; i++)
199 for (i = 0; i < NP; i++)
203 static uint output_pos, output_mask;
206 output(uint c, uint p)
210 if ((output_mask >>= 1) == 0) {
211 output_mask = 1U << (CHAR_BIT - 1);
212 if (output_pos >= bufsiz - 3 * CHAR_BIT) {
221 buf[output_pos++] = (uchar) c;
223 if (c >= (1U << CHAR_BIT)) {
224 buf[cpos] |= output_mask;
225 buf[output_pos++] = (uchar) (p >> CHAR_BIT);
226 buf[output_pos++] = (uchar) p;
237 huf_encode_start(void)
243 while ((buf = malloc(bufsiz)) == NULL) {
244 bufsiz = (bufsiz / 10U) * 9U;
245 if (bufsiz < 4 * 1024U)
246 error("Out of memory.");
250 for (i = 0; i < NC; i++)
252 for (i = 0; i < NP; i++)
254 output_pos = output_mask = 0;
263 putbits(CHAR_BIT - 1, 0); /* flush remaining bits */
267 /***** decoding *****/
270 read_pt_len(int nn, int nbit, int i_special)
278 for (i = 0; i < nn; i++)
280 for (i = 0; i < 256; i++)
286 c = bitbuf >> (BITBUFSIZ - 3);
288 mask = 1U << (BITBUFSIZ - 1 - 3);
289 while (mask & bitbuf) {
294 fillbuf((c < 7) ? 3 : c - 3);
296 if (i == i_special) {
304 make_table(nn, pt_len, 8, pt_table);
317 for (i = 0; i < NC; i++)
319 for (i = 0; i < 4096; i++)
325 c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
327 mask = 1U << (BITBUFSIZ - 1 - 8);
343 c = getbits(CBIT) + 20;
352 make_table(NC, c_len, 12, c_table);
361 if (blocksize == 0) {
362 blocksize = getbits(16);
363 read_pt_len(NT, TBIT, 3);
365 read_pt_len(NP, PBIT, -1);
368 j = c_table[bitbuf >> (BITBUFSIZ - 12)];
370 mask = 1U << (BITBUFSIZ - 1 - 12);
388 j = pt_table[bitbuf >> (BITBUFSIZ - 8)];
390 mask = 1U << (BITBUFSIZ - 1 - 8);
401 j = (1U << (j - 1)) + getbits(j - 1);
406 huf_decode_start(void)