15
local unsigned decode OF((unsigned count, uch buffer[]));
16
local void decode_start OF((void));
15
local unsigned decode (unsigned count, uch buffer[]);
16
local void decode_start (void);
19
local void huf_decode_start OF((void));
20
local unsigned decode_c OF((void));
21
local unsigned decode_p OF((void));
22
local void read_pt_len OF((int nn, int nbit, int i_special));
23
local void read_c_len OF((void));
19
local void huf_decode_start (void);
20
local unsigned decode_c (void);
21
local unsigned decode_p (void);
22
local void read_pt_len (int nn, int nbit, int i_special);
23
local void read_c_len (void);
26
local void fillbuf OF((int n));
27
local unsigned getbits OF((int n));
28
local void init_getbits OF((void));
26
local void fillbuf (int n);
27
local unsigned getbits (int n);
28
local void init_getbits (void);
32
local void make_table OF((int nchar, uch bitlen[],
33
int tablebits, ush table[]));
32
local void make_table (int nchar, uch bitlen[],
33
int tablebits, ush table[]);
36
36
#define DICBIT 13 /* 12(-lh4-) or 13(-lh5-) */
59
59
#define NC (UCHAR_MAX + MAXMATCH + 2 - THRESHOLD)
60
/* alphabet = {0, 1, 2, ..., NC - 1} */
60
/* alphabet = {0, 1, 2, ..., NC - 1} */
61
61
#define CBIT 9 /* $\lfloor \log_2 NC \rfloor + 1$ */
62
62
#define CODE_BIT 16 /* codeword length */
106
106
while (n > bitcount) {
107
bitbuf |= subbitbuf << (n -= bitcount);
108
subbitbuf = (unsigned)try_byte();
109
if ((int)subbitbuf == EOF) subbitbuf = 0;
107
bitbuf |= subbitbuf << (n -= bitcount);
108
subbitbuf = (unsigned)try_byte();
109
if ((int)subbitbuf == EOF) subbitbuf = 0;
112
112
bitbuf |= subbitbuf >> (bitcount -= n);
130
130
/***********************************************************
131
maketbl.c -- make table for decoding
131
maketbl.c -- make table for decoding
132
132
***********************************************************/
134
134
local void make_table(nchar, bitlen, tablebits, table)
147
147
for (i = 1; i <= 16; i++)
148
start[i + 1] = start[i] + (count[i] << (16 - i));
148
start[i + 1] = start[i] + (count[i] << (16 - i));
149
149
if ((start[17] & 0xffff) != 0)
150
150
gzip_error ("Bad table\n");
152
152
jutbits = 16 - tablebits;
153
153
for (i = 1; i <= (unsigned)tablebits; i++) {
154
start[i] >>= jutbits;
155
weight[i] = (unsigned) 1 << (tablebits - i);
154
start[i] >>= jutbits;
155
weight[i] = (unsigned) 1 << (tablebits - i);
157
157
while (i <= 16) {
158
weight[i] = (unsigned) 1 << (16 - i);
158
weight[i] = (unsigned) 1 << (16 - i);
162
162
i = start[tablebits + 1] >> jutbits;
165
while (i != k) table[i++] = 0;
165
while (i != k) table[i++] = 0;
169
169
mask = (unsigned) 1 << (15 - tablebits);
170
170
for (ch = 0; ch < (unsigned)nchar; ch++) {
171
if ((len = bitlen[ch]) == 0) continue;
172
nextcode = start[len] + weight[len];
173
if (len <= (unsigned)tablebits) {
174
if ((unsigned) 1 << tablebits < nextcode)
175
gzip_error ("Bad table\n");
176
for (i = start[len]; i < nextcode; i++) table[i] = ch;
179
p = &table[k >> jutbits];
183
right[avail] = left[avail] = 0;
186
if (k & mask) p = &right[*p];
192
start[len] = nextcode;
171
if ((len = bitlen[ch]) == 0) continue;
172
nextcode = start[len] + weight[len];
173
if (len <= (unsigned)tablebits) {
174
if ((unsigned) 1 << tablebits < nextcode)
175
gzip_error ("Bad table\n");
176
for (i = start[len]; i < nextcode; i++) table[i] = ch;
179
p = &table[k >> jutbits];
183
right[avail] = left[avail] = 0;
186
if (k & mask) p = &right[*p];
192
start[len] = nextcode;
208
208
n = getbits(nbit);
211
for (i = 0; i < nn; i++) pt_len[i] = 0;
212
for (i = 0; i < 256; i++) pt_table[i] = c;
211
for (i = 0; i < nn; i++) pt_len[i] = 0;
212
for (i = 0; i < 256; i++) pt_table[i] = c;
216
c = bitbuf >> (BITBUFSIZ - 3);
218
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 3);
219
while (mask & bitbuf) { mask >>= 1; c++; }
221
gzip_error ("Bad table\n");
223
fillbuf((c < 7) ? 3 : c - 3);
225
if (i == i_special) {
227
while (--c >= 0) pt_len[i++] = 0;
230
while (i < nn) pt_len[i++] = 0;
231
make_table(nn, pt_len, 8, pt_table);
216
c = bitbuf >> (BITBUFSIZ - 3);
218
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 3);
219
while (mask & bitbuf) { mask >>= 1; c++; }
221
gzip_error ("Bad table\n");
223
fillbuf((c < 7) ? 3 : c - 3);
225
if (i == i_special) {
227
while (--c >= 0) pt_len[i++] = 0;
230
while (i < nn) pt_len[i++] = 0;
231
make_table(nn, pt_len, 8, pt_table);
240
240
n = getbits(CBIT);
243
for (i = 0; i < NC; i++) c_len[i] = 0;
244
for (i = 0; i < 4096; i++) c_table[i] = c;
243
for (i = 0; i < NC; i++) c_len[i] = 0;
244
for (i = 0; i < 4096; i++) c_table[i] = c;
248
c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
250
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
252
if (bitbuf & mask) c = right[c];
257
fillbuf((int) pt_len[c]);
260
else if (c == 1) c = getbits(4) + 3;
261
else c = getbits(CBIT) + 20;
262
while (--c >= 0) c_len[i++] = 0;
263
} else c_len[i++] = c - 2;
265
while (i < NC) c_len[i++] = 0;
266
make_table(NC, c_len, 12, c_table);
248
c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
250
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
252
if (bitbuf & mask) c = right[c];
257
fillbuf((int) pt_len[c]);
260
else if (c == 1) c = getbits(4) + 3;
261
else c = getbits(CBIT) + 20;
262
while (--c >= 0) c_len[i++] = 0;
263
} else c_len[i++] = c - 2;
265
while (i < NC) c_len[i++] = 0;
266
make_table(NC, c_len, 12, c_table);
272
272
unsigned j, mask;
274
274
if (blocksize == 0) {
275
blocksize = getbits(16);
276
if (blocksize == 0) {
277
return NC; /* end of file */
279
read_pt_len(NT, TBIT, 3);
281
read_pt_len(NP, PBIT, -1);
275
blocksize = getbits(16);
276
if (blocksize == 0) {
277
return NC; /* end of file */
279
read_pt_len(NT, TBIT, 3);
281
read_pt_len(NP, PBIT, -1);
284
284
j = c_table[bitbuf >> (BITBUFSIZ - 12)];
286
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 12);
288
if (bitbuf & mask) j = right[j];
286
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 12);
288
if (bitbuf & mask) j = right[j];
293
293
fillbuf((int) c_len[j]);
301
301
j = pt_table[bitbuf >> (BITBUFSIZ - 8)];
303
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
305
if (bitbuf & mask) j = right[j];
303
mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
305
if (bitbuf & mask) j = right[j];
310
310
fillbuf((int) pt_len[j]);
311
311
if (j != 0) j = ((unsigned) 1 << (j - 1)) + getbits((int) (j - 1));
352
352
while (--j >= 0) {
353
buffer[r] = buffer[i];
354
i = (i + 1) & (DICSIZ - 1);
355
if (++r == count) return r;
353
buffer[r] = buffer[i];
354
i = (i + 1) & (DICSIZ - 1);
355
if (++r == count) return r;
363
if (c <= UCHAR_MAX) {
365
if (++r == count) return r;
367
j = c - (UCHAR_MAX + 1 - THRESHOLD);
368
i = (r - decode_p() - 1) & (DICSIZ - 1);
370
buffer[r] = buffer[i];
371
i = (i + 1) & (DICSIZ - 1);
372
if (++r == count) return r;
363
if (c <= UCHAR_MAX) {
365
if (++r == count) return r;
367
j = c - (UCHAR_MAX + 1 - THRESHOLD);
368
i = (r - decode_p() - 1) & (DICSIZ - 1);
370
buffer[r] = buffer[i];
371
i = (i + 1) & (DICSIZ - 1);
372
if (++r == count) return r;
392
n = decode((unsigned) DICSIZ, window);
393
if (!test && n > 0) {
394
write_buf(out, (char*)window, n);
392
n = decode((unsigned) DICSIZ, window);
393
if (!test && n > 0) {
394
write_buf(out, (char*)window, n);