Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libz/inftrees.c
1808 views
1
/* inftrees.c -- generate Huffman trees for efficient decoding
2
* Copyright (C) 1995-2005 Mark Adler
3
* For conditions of distribution and use, see copyright notice in zlib.h
4
*/
5
6
#include "zutil.h"
7
#include "inftrees.h"
8
9
#define MAXBITS 15
10
11
const char inflate_copyright[] =
12
" inflate 1.2.3 Copyright 1995-2005 Mark Adler ";
13
/*
14
If you use the zlib library in a product, an acknowledgment is welcome
15
in the documentation of your product. If for some reason you cannot
16
include such an acknowledgment, I would appreciate that you keep this
17
copyright string in the executable of your product.
18
*/
19
20
/*
21
Build a set of tables to decode the provided canonical Huffman code.
22
The code lengths are lens[0..codes-1]. The result starts at *table,
23
whose indices are 0..2^bits-1. work is a writable array of at least
24
lens shorts, which is used as a work area. type is the type of code
25
to be generated, CODES, LENS, or DISTS. On return, zero is success,
26
-1 is an invalid code, and +1 means that ENOUGH isn't enough. table
27
on return points to the next available entry's address. bits is the
28
requested root table index bits, and on return it is the actual root
29
table index bits. It will differ if the request is greater than the
30
longest code or if it is less than the shortest code.
31
*/
32
#ifdef ZLIB_STDC
33
/* __MVS__ complains hard about this one K&R prototype -- go figure */
34
int inflate_table(codetype type, unsigned short FAR *lens, unsigned codes,
35
code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)
36
#else
37
int inflate_table(type, lens, codes, table, bits, work)
38
codetype type;
39
unsigned short FAR *lens;
40
unsigned codes;
41
code FAR * FAR *table;
42
unsigned FAR *bits;
43
unsigned short FAR *work;
44
#endif
45
{
46
unsigned len; /* a code's length in bits */
47
unsigned sym; /* index of code symbols */
48
unsigned min, max; /* minimum and maximum code lengths */
49
unsigned root; /* number of index bits for root table */
50
unsigned curr; /* number of index bits for current table */
51
unsigned drop; /* code bits to drop for sub-table */
52
int left; /* number of prefix codes available */
53
unsigned used; /* code entries in table used */
54
unsigned huff; /* Huffman code */
55
unsigned incr; /* for incrementing code, index */
56
unsigned fill; /* index for replicating entries */
57
unsigned low; /* low bits for current root entry */
58
unsigned mask; /* mask for low root bits */
59
code this; /* table entry for duplication */
60
code FAR *next; /* next available space in table */
61
const unsigned short FAR *base; /* base value table to use */
62
const unsigned short FAR *extra; /* extra bits table to use */
63
int end; /* use base and extra for symbol > end */
64
unsigned short count[MAXBITS+1]; /* number of codes of each length */
65
unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
66
static const unsigned short lbase[31] = { /* Length codes 257..285 base */
67
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
68
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
69
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
70
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
71
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196};
72
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
73
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
74
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
75
8193, 12289, 16385, 24577, 0, 0};
76
static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
77
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
78
23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
79
28, 28, 29, 29, 64, 64};
80
81
/*
82
Process a set of code lengths to create a canonical Huffman code. The
83
code lengths are lens[0..codes-1]. Each length corresponds to the
84
symbols 0..codes-1. The Huffman code is generated by first sorting the
85
symbols by length from short to long, and retaining the symbol order
86
for codes with equal lengths. Then the code starts with all zero bits
87
for the first code of the shortest length, and the codes are integer
88
increments for the same length, and zeros are appended as the length
89
increases. For the deflate format, these bits are stored backwards
90
from their more natural integer increment ordering, and so when the
91
decoding tables are built in the large loop below, the integer codes
92
are incremented backwards.
93
94
This routine assumes, but does not check, that all of the entries in
95
lens[] are in the range 0..MAXBITS. The caller must assure this.
96
1..MAXBITS is interpreted as that code length. zero means that that
97
symbol does not occur in this code.
98
99
The codes are sorted by computing a count of codes for each length,
100
creating from that a table of starting indices for each length in the
101
sorted table, and then entering the symbols in order in the sorted
102
table. The sorted table is work[], with that space being provided by
103
the caller.
104
105
The length counts are used for other purposes as well, i.e. finding
106
the minimum and maximum length codes, determining if there are any
107
codes at all, checking for a valid set of lengths, and looking ahead
108
at length counts to determine sub-table sizes when building the
109
decoding tables.
110
*/
111
112
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
113
for (len = 0; len <= MAXBITS; len++)
114
count[len] = 0;
115
for (sym = 0; sym < codes; sym++)
116
count[lens[sym]]++;
117
118
/* bound code lengths, force root to be within code lengths */
119
root = *bits;
120
for (max = MAXBITS; max >= 1; max--)
121
if (count[max] != 0) break;
122
if (root > max) root = max;
123
if (max == 0) { /* no symbols to code at all */
124
this.op = (unsigned char)64; /* invalid code marker */
125
this.bits = (unsigned char)1;
126
this.val = (unsigned short)0;
127
*(*table)++ = this; /* make a table to force an error */
128
*(*table)++ = this;
129
*bits = 1;
130
return 0; /* no symbols, but wait for decoding to report error */
131
}
132
for (min = 1; min <= MAXBITS; min++)
133
if (count[min] != 0) break;
134
if (root < min) root = min;
135
136
/* check for an over-subscribed or incomplete set of lengths */
137
left = 1;
138
for (len = 1; len <= MAXBITS; len++) {
139
left <<= 1;
140
left -= count[len];
141
if (left < 0) return -1; /* over-subscribed */
142
}
143
if (left > 0 && (type == CODES || max != 1))
144
return -1; /* incomplete set */
145
146
/* generate offsets into symbol table for each length for sorting */
147
offs[1] = 0;
148
for (len = 1; len < MAXBITS; len++)
149
offs[len + 1] = offs[len] + count[len];
150
151
/* sort symbols by length, by symbol order within each length */
152
for (sym = 0; sym < codes; sym++)
153
if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
154
155
/*
156
Create and fill in decoding tables. In this loop, the table being
157
filled is at next and has curr index bits. The code being used is huff
158
with length len. That code is converted to an index by dropping drop
159
bits off of the bottom. For codes where len is less than drop + curr,
160
those top drop + curr - len bits are incremented through all values to
161
fill the table with replicated entries.
162
163
root is the number of index bits for the root table. When len exceeds
164
root, sub-tables are created pointed to by the root entry with an index
165
of the low root bits of huff. This is saved in low to check for when a
166
new sub-table should be started. drop is zero when the root table is
167
being filled, and drop is root when sub-tables are being filled.
168
169
When a new sub-table is needed, it is necessary to look ahead in the
170
code lengths to determine what size sub-table is needed. The length
171
counts are used for this, and so count[] is decremented as codes are
172
entered in the tables.
173
174
used keeps track of how many table entries have been allocated from the
175
provided *table space. It is checked when a LENS table is being made
176
against the space in *table, ENOUGH, minus the maximum space needed by
177
the worst case distance code, MAXD. This should never happen, but the
178
sufficiency of ENOUGH has not been proven exhaustively, hence the check.
179
This assumes that when type == LENS, bits == 9.
180
181
sym increments through all symbols, and the loop terminates when
182
all codes of length max, i.e. all codes, have been processed. This
183
routine permits incomplete codes, so another loop after this one fills
184
in the rest of the decoding tables with invalid code markers.
185
*/
186
187
/* set up for code type */
188
switch (type) {
189
case CODES:
190
base = extra = work; /* dummy value--not used */
191
end = 19;
192
break;
193
case LENS:
194
base = lbase;
195
base -= 257;
196
extra = lext;
197
extra -= 257;
198
end = 256;
199
break;
200
default: /* DISTS */
201
base = dbase;
202
extra = dext;
203
end = -1;
204
}
205
206
/* initialize state for loop */
207
huff = 0; /* starting code */
208
sym = 0; /* starting code symbol */
209
len = min; /* starting code length */
210
next = *table; /* current table to fill in */
211
curr = root; /* current table index bits */
212
drop = 0; /* current bits to drop from code for index */
213
low = (unsigned)(-1); /* trigger new sub-table when len > root */
214
used = 1U << root; /* use root table entries */
215
mask = used - 1; /* mask for comparing low */
216
217
/* check available table space */
218
if (type == LENS && used >= ENOUGH - MAXD)
219
return 1;
220
221
/* process all codes and make table entries */
222
for (;;) {
223
/* create table entry */
224
this.bits = (unsigned char)(len - drop);
225
if ((int)(work[sym]) < end) {
226
this.op = (unsigned char)0;
227
this.val = work[sym];
228
}
229
else if ((int)(work[sym]) > end) {
230
this.op = (unsigned char)(extra[work[sym]]);
231
this.val = base[work[sym]];
232
}
233
else {
234
this.op = (unsigned char)(32 + 64); /* end of block */
235
this.val = 0;
236
}
237
238
/* replicate for those indices with low len bits equal to huff */
239
incr = 1U << (len - drop);
240
fill = 1U << curr;
241
min = fill; /* save offset to next table */
242
do {
243
fill -= incr;
244
next[(huff >> drop) + fill] = this;
245
} while (fill != 0);
246
247
/* backwards increment the len-bit code huff */
248
incr = 1U << (len - 1);
249
while (huff & incr)
250
incr >>= 1;
251
if (incr != 0) {
252
huff &= incr - 1;
253
huff += incr;
254
}
255
else
256
huff = 0;
257
258
/* go to next symbol, update count, len */
259
sym++;
260
if (--(count[len]) == 0) {
261
if (len == max) break;
262
len = lens[work[sym]];
263
}
264
265
/* create new sub-table if needed */
266
if (len > root && (huff & mask) != low) {
267
/* if first time, transition to sub-tables */
268
if (drop == 0)
269
drop = root;
270
271
/* increment past last table */
272
next += min; /* here min is 1 << curr */
273
274
/* determine length of next table */
275
curr = len - drop;
276
left = (int)(1 << curr);
277
while (curr + drop < max) {
278
left -= count[curr + drop];
279
if (left <= 0) break;
280
curr++;
281
left <<= 1;
282
}
283
284
/* check for enough space */
285
used += 1U << curr;
286
if (type == LENS && used >= ENOUGH - MAXD)
287
return 1;
288
289
/* point entry in root table to sub-table */
290
low = huff & mask;
291
(*table)[low].op = (unsigned char)curr;
292
(*table)[low].bits = (unsigned char)root;
293
(*table)[low].val = (unsigned short)(next - *table);
294
}
295
}
296
297
/*
298
Fill in rest of table for incomplete codes. This loop is similar to the
299
loop above in incrementing huff for table indices. It is assumed that
300
len is equal to curr + drop, so there is no loop needed to increment
301
through high index bits. When the current sub-table is filled, the loop
302
drops back to the root table to fill in any remaining entries there.
303
*/
304
this.op = (unsigned char)64; /* invalid code marker */
305
this.bits = (unsigned char)(len - drop);
306
this.val = (unsigned short)0;
307
while (huff != 0) {
308
/* when done with sub-table, drop back to root table */
309
if (drop != 0 && (huff & mask) != low) {
310
drop = 0;
311
len = root;
312
next = *table;
313
this.bits = (unsigned char)len;
314
}
315
316
/* put invalid code marker in table */
317
next[huff >> drop] = this;
318
319
/* backwards increment the len-bit code huff */
320
incr = 1U << (len - 1);
321
while (huff & incr)
322
incr >>= 1;
323
if (incr != 0) {
324
huff &= incr - 1;
325
huff += incr;
326
}
327
else
328
huff = 0;
329
}
330
331
/* set return parameters */
332
*table += used;
333
*bits = root;
334
return 0;
335
}
336
337