1 /* ------------------------------------------------------------------------ */
3 /* huf.c -- new static Huffman */
5 /* Modified Nobutaka Watazaki */
7 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
8 /* Ver. 1.14i Support LH7 & Bug Fixed 2000.10. 6 t.okamoto */
9 /* ------------------------------------------------------------------------ */
15 #include <sys/param.h>
21 extern char *malloc ();
24 /* ------------------------------------------------------------------------ */
25 unsigned short left[2 * NC - 1], right[2 * NC - 1];
27 unsigned short c_code[NC]; /* encode */
28 unsigned short pt_code[NPT]; /* encode */
30 unsigned short c_table[4096]; /* decode */
31 unsigned short pt_table[256]; /* decode */
33 unsigned short c_freq[2 * NC - 1]; /* encode */
34 unsigned short p_freq[2 * NP - 1]; /* encode */
35 unsigned short t_freq[2 * NT - 1]; /* encode */
37 unsigned char c_len[NC];
38 unsigned char pt_len[NPT];
40 static unsigned char *buf; /* encode */
41 static unsigned int bufsiz; /* encode */
42 static unsigned short blocksize; /* decode */
43 static unsigned short output_pos, output_mask; /* encode */
47 /* ------------------------------------------------------------------------ */
49 /* ------------------------------------------------------------------------ */
51 count_t_freq(/*void*/)
55 for (i = 0; i < NT; i++)
58 while (n > 0 && c_len[n - 1] == 0)
65 while (i < n && c_len[i] == 0) {
73 else if (count == 19) {
84 /* ------------------------------------------------------------------------ */
86 write_pt_len(n, nbit, i_special)
93 while (n > 0 && pt_len[n - 1] == 0)
102 /* k=7 -> 1110 k=8 -> 11110 k=9 -> 111110 ... */
103 putbits(k - 3, USHRT_MAX << 1);
104 if (i == i_special) {
105 while (i < 6 && pt_len[i] == 0)
112 /* ------------------------------------------------------------------------ */
114 write_c_len(/*void*/)
116 short i, k, n, count;
119 while (n > 0 && c_len[n - 1] == 0)
127 while (i < n && c_len[i] == 0) {
132 for (k = 0; k < count; k++)
133 putcode(pt_len[0], pt_code[0]);
135 else if (count <= 18) {
136 putcode(pt_len[1], pt_code[1]);
137 putbits(4, count - 3);
139 else if (count == 19) {
140 putcode(pt_len[0], pt_code[0]);
141 putcode(pt_len[1], pt_code[1]);
145 putcode(pt_len[2], pt_code[2]);
146 putbits(CBIT, count - 20);
150 putcode(pt_len[k + 2], pt_code[k + 2]);
154 /* ------------------------------------------------------------------------ */
159 putcode(c_len[c], c_code[c]);
162 /* ------------------------------------------------------------------------ */
175 putcode(pt_len[c], pt_code[c]);
180 /* ------------------------------------------------------------------------ */
182 send_block( /* void */ )
185 unsigned short i, k, root, pos, size;
187 root = make_tree(NC, c_freq, c_len, c_code);
192 root = make_tree(NT, t_freq, pt_len, pt_code);
194 write_pt_len(NT, TBIT, 3);
206 root = make_tree(np, p_freq, pt_len, pt_code);
208 write_pt_len(np, pbit, -1);
215 for (i = 0; i < size; i++) {
216 if (i % CHAR_BIT == 0)
220 if (flags & (1 << (CHAR_BIT - 1))) {
221 encode_c(buf[pos++] + (1 << CHAR_BIT));
222 k = buf[pos++] << CHAR_BIT;
226 encode_c(buf[pos++]);
230 for (i = 0; i < NC; i++)
232 for (i = 0; i < np; i++)
236 /* ------------------------------------------------------------------------ */
243 static unsigned short cpos;
246 if (output_mask == 0) {
247 output_mask = 1 << (CHAR_BIT - 1);
248 if (output_pos >= bufsiz - 3 * CHAR_BIT) {
257 buf[output_pos++] = (unsigned char) c;
259 if (c >= (1 << CHAR_BIT)) {
260 buf[cpos] |= output_mask;
261 buf[output_pos++] = (unsigned char) (p >> CHAR_BIT);
262 buf[output_pos++] = (unsigned char) p;
272 /* ------------------------------------------------------------------------ */
274 alloc_buf( /* void */ )
276 bufsiz = 16 * 1024 *2; /* 65408U; */ /* t.okamoto */
277 while ((buf = (unsigned char *) malloc(bufsiz)) == NULL) {
278 bufsiz = (bufsiz / 10) * 9;
279 if (bufsiz < 4 * 1024)
280 fatal_error("Not enough memory");
285 /* ------------------------------------------------------------------------ */
288 encode_start_st1( /* void */ )
294 case LZHUFF5_DICBIT: pbit = 4; np = LZHUFF5_DICBIT + 1; break;
295 case LZHUFF6_DICBIT: pbit = 5; np = LZHUFF6_DICBIT + 1; break;
296 case LZHUFF7_DICBIT: pbit = 5; np = LZHUFF7_DICBIT + 1; break;
301 for (i = 0; i < NC; i++)
303 for (i = 0; i < np; i++)
305 output_pos = output_mask = 0;
311 /* ------------------------------------------------------------------------ */
314 encode_end_st1( /* void */ )
318 putbits(CHAR_BIT - 1, 0); /* flush remaining bits */
322 /* ------------------------------------------------------------------------ */
324 /* ------------------------------------------------------------------------ */
326 read_pt_len(nn, nbit, i_special)
336 for (i = 0; i < nn; i++)
338 for (i = 0; i < 256; i++)
348 unsigned short mask = 1 << (16 - 4);
349 while (mask & bitbuf) {
357 if (i == i_special) {
365 make_table(nn, pt_len, 8, pt_table);
369 /* ------------------------------------------------------------------------ */
371 read_c_len( /* void */ )
378 for (i = 0; i < NC; i++)
380 for (i = 0; i < 4096; i++)
385 c = pt_table[peekbits(8)];
387 unsigned short mask = 1 << (16 - 9);
403 c = getbits(CBIT) + 20;
412 make_table(NC, c_len, 12, c_table);
416 /* ------------------------------------------------------------------------ */
419 decode_c_st1( /*void*/ )
421 unsigned short j, mask;
423 if (blocksize == 0) {
424 blocksize = getbits(16);
425 read_pt_len(NT, TBIT, 3);
427 read_pt_len(np, pbit, -1);
430 j = c_table[peekbits(12)];
435 mask = 1 << (16 - 1);
443 fillbuf(c_len[j] - 12);
448 /* ------------------------------------------------------------------------ */
451 decode_p_st1( /* void */ )
453 unsigned short j, mask;
455 j = pt_table[peekbits(8)];
460 mask = 1 << (16 - 1);
468 fillbuf(pt_len[j] - 8);
471 j = (1 << (j - 1)) + getbits(j - 1);
475 /* ------------------------------------------------------------------------ */
478 decode_start_st1( /* void */ )
482 case LZHUFF5_DICBIT: pbit = 4; np = LZHUFF5_DICBIT + 1; break;
483 case LZHUFF6_DICBIT: pbit = 5; np = LZHUFF6_DICBIT + 1; break;
484 case LZHUFF7_DICBIT: pbit = 5; np = LZHUFF7_DICBIT + 1; break;