1 /***********************************************************
2 huf.c -- static Huffman
3 ***********************************************************/
7 #define NP (MAXDICBIT + 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 static uchar c_len[NC], pt_len[NPT];
18 static ushort c_freq[2 * NC - 1], c_table[4096], c_code[NC],
19 p_freq[2 * NP - 1], pt_table[256], pt_code[NPT], t_freq[2 * NT - 1];
25 init_parameter(struct lha_method *m)
31 /***** encoding *****/
38 for (i = 0; i < NT; i++)
41 while (n > 0 && c_len[n - 1] == 0)
48 while (i < n && c_len[i] == 0) {
56 else if (count == 19) {
69 write_pt_len(struct lzh_ostream *wp, int n, int nbit, int i_special)
73 while (n > 0 && pt_len[n - 1] == 0)
82 putbits(wp, k - 3, (1U << (k - 3)) - 2);
84 while (i < 6 && pt_len[i] == 0)
86 putbits(wp, 2, (i - 3) & 3);
92 write_c_len(struct lzh_ostream *wp)
97 while (n > 0 && c_len[n - 1] == 0)
105 while (i < n && c_len[i] == 0) {
110 for (k = 0; k < count; k++)
111 putbits(wp, pt_len[0], pt_code[0]);
113 else if (count <= 18) {
114 putbits(wp, pt_len[1], pt_code[1]);
115 putbits(wp, 4, count - 3);
117 else if (count == 19) {
118 putbits(wp, pt_len[0], pt_code[0]);
119 putbits(wp, pt_len[1], pt_code[1]);
123 putbits(wp, pt_len[2], pt_code[2]);
124 putbits(wp, CBIT, count - 20);
128 putbits(wp, pt_len[k + 2], pt_code[k + 2]);
133 encode_c(struct lzh_ostream *wp, int c)
135 putbits(wp, c_len[c], c_code[c]);
139 encode_p(struct lzh_ostream *wp, uint p)
149 putbits(wp, pt_len[c], pt_code[c]);
151 putbits(wp, c - 1, p & (0xFFFFU >> (17 - c)));
155 send_block(struct lzh_ostream *wp)
157 uint i, k, flags, root, pos, size;
159 root = make_tree(NC, c_freq, c_len, c_code);
161 putbits(wp, 16, size);
164 root = make_tree(NT, t_freq, pt_len, pt_code);
166 write_pt_len(wp, NT, TBIT, 3);
169 putbits(wp, TBIT, 0);
170 putbits(wp, TBIT, root);
175 putbits(wp, TBIT, 0);
176 putbits(wp, TBIT, 0);
177 putbits(wp, CBIT, 0);
178 putbits(wp, CBIT, root);
180 root = make_tree(np, p_freq, pt_len, pt_code);
182 write_pt_len(wp, np, pbit, -1);
185 putbits(wp, pbit, 0);
186 putbits(wp, pbit, root);
189 for (i = 0; i < size; i++) {
190 if (i % CHAR_BIT == 0)
191 flags = wp->buf[pos++];
194 if (flags & (1U << (CHAR_BIT - 1))) {
195 encode_c(wp, wp->buf[pos++] + (1U << CHAR_BIT));
196 k = wp->buf[pos++] << CHAR_BIT;
201 encode_c(wp, wp->buf[pos++]);
205 for (i = 0; i < NC; i++)
207 for (i = 0; i < np; i++)
211 static uint output_pos, output_mask;
214 output(struct lzh_ostream *wp, uint c, uint p)
218 if ((output_mask >>= 1) == 0) {
219 output_mask = 1U << (CHAR_BIT - 1);
220 if (output_pos >= wp->bufsiz - 3 * CHAR_BIT) {
229 wp->buf[output_pos++] = (uchar) c;
231 if (c >= (1U << CHAR_BIT)) {
232 wp->buf[cpos] |= output_mask;
233 wp->buf[output_pos++] = (uchar) (p >> CHAR_BIT);
234 wp->buf[output_pos++] = (uchar) p;
245 huf_encode_start(struct lzh_ostream *wp, struct lha_method *m)
252 wp->bufsiz = 16 * 1024U;
253 while ((wp->buf = malloc(wp->bufsiz)) == NULL) {
254 wp->bufsiz = (wp->bufsiz / 10U) * 9U;
255 if (wp->bufsiz < 4 * 1024U)
256 error("Out of memory.");
260 for (i = 0; i < NC; i++)
262 for (i = 0; i < np; i++)
264 output_pos = output_mask = 0;
269 huf_encode_end(struct lzh_ostream *wp)
271 if (!wp->unpackable) {
273 putbits(wp, CHAR_BIT - 1, 0); /* flush remaining bits */
282 /***** decoding *****/
285 read_pt_len(struct huf_t *huf, struct lzh_istream *rp, int nn, int nbit, int i_special)
290 n = getbits(rp, nbit);
292 c = getbits(rp, nbit);
293 for (i = 0; i < nn; i++)
295 for (i = 0; i < 256; i++)
301 c = rp->bitbuf >> (BITBUFSIZ - 3);
303 mask = 1U << (BITBUFSIZ - 1 - 3);
304 while (mask & rp->bitbuf) {
309 fillbuf(rp, (c < 7) ? 3 : c - 3);
311 if (i == i_special) {
319 make_table(huf, nn, pt_len, 8, pt_table);
324 read_c_len(struct huf_t *huf, struct lzh_istream *rp)
329 n = getbits(rp, CBIT);
331 c = getbits(rp, CBIT);
332 for (i = 0; i < NC; i++)
334 for (i = 0; i < 4096; i++)
340 c = pt_table[rp->bitbuf >> (BITBUFSIZ - 8)];
342 mask = 1U << (BITBUFSIZ - 1 - 8);
344 if (rp->bitbuf & mask)
351 fillbuf(rp, pt_len[c]);
356 c = getbits(rp, 4) + 3;
358 c = getbits(rp, CBIT) + 20;
367 make_table(huf, NC, c_len, 12, c_table);
372 decode_c(struct huf_t *huf, struct lzh_istream *rp)
376 if (rp->blocksize == 0) {
377 rp->blocksize = getbits(rp, 16);
378 read_pt_len(huf, rp, NT, TBIT, 3);
380 read_pt_len(huf, rp, np, pbit, -1);
383 j = c_table[rp->bitbuf >> (BITBUFSIZ - 12)];
385 mask = 1U << (BITBUFSIZ - 1 - 12);
387 if (rp->bitbuf & mask)
394 fillbuf(rp, c_len[j]);
399 decode_p(struct huf_t *huf, struct lzh_istream *rp)
403 j = pt_table[rp->bitbuf >> (BITBUFSIZ - 8)];
405 mask = 1U << (BITBUFSIZ - 1 - 8);
407 if (rp->bitbuf & mask)
414 fillbuf(rp, pt_len[j]);
416 j = (1U << (j - 1)) + getbits(rp, j - 1);
421 huf_decode_start(struct lzh_istream *rp, struct lha_method *m)