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