xref: /openbmc/linux/lib/inflate.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds #define DEBG(x)
31da177e4SLinus Torvalds #define DEBG1(x)
41da177e4SLinus Torvalds /* inflate.c -- Not copyrighted 1992 by Mark Adler
51da177e4SLinus Torvalds    version c10p1, 10 January 1993 */
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds /*
81da177e4SLinus Torvalds  * Adapted for booting Linux by Hannu Savolainen 1993
91da177e4SLinus Torvalds  * based on gzip-1.0.3
101da177e4SLinus Torvalds  *
112f82af08SNicolas Pitre  * Nicolas Pitre <nico@fluxnic.net>, 1999/04/14 :
121da177e4SLinus Torvalds  *   Little mods for all variable to reside either into rodata or bss segments
131da177e4SLinus Torvalds  *   by marking constant variables with 'const' and initializing all the others
141da177e4SLinus Torvalds  *   at run-time only.  This allows for the kernel uncompressor to run
151da177e4SLinus Torvalds  *   directly from Flash or ROM memory on embedded systems.
161da177e4SLinus Torvalds  */
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds /*
191da177e4SLinus Torvalds    Inflate deflated (PKZIP's method 8 compressed) data.  The compression
201da177e4SLinus Torvalds    method searches for as much of the current string of bytes (up to a
211da177e4SLinus Torvalds    length of 258) in the previous 32 K bytes.  If it doesn't find any
221da177e4SLinus Torvalds    matches (of at least length 3), it codes the next byte.  Otherwise, it
231da177e4SLinus Torvalds    codes the length of the matched string and its distance backwards from
241da177e4SLinus Torvalds    the current position.  There is a single Huffman code that codes both
251da177e4SLinus Torvalds    single bytes (called "literals") and match lengths.  A second Huffman
261da177e4SLinus Torvalds    code codes the distance information, which follows a length code.  Each
271da177e4SLinus Torvalds    length or distance code actually represents a base value and a number
281da177e4SLinus Torvalds    of "extra" (sometimes zero) bits to get to add to the base value.  At
291da177e4SLinus Torvalds    the end of each deflated block is a special end-of-block (EOB) literal/
301da177e4SLinus Torvalds    length code.  The decoding process is basically: get a literal/length
311da177e4SLinus Torvalds    code; if EOB then done; if a literal, emit the decoded byte; if a
321da177e4SLinus Torvalds    length then get the distance and emit the referred-to bytes from the
331da177e4SLinus Torvalds    sliding window of previously emitted data.
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds    There are (currently) three kinds of inflate blocks: stored, fixed, and
361da177e4SLinus Torvalds    dynamic.  The compressor deals with some chunk of data at a time, and
371da177e4SLinus Torvalds    decides which method to use on a chunk-by-chunk basis.  A chunk might
381da177e4SLinus Torvalds    typically be 32 K or 64 K.  If the chunk is incompressible, then the
391da177e4SLinus Torvalds    "stored" method is used.  In this case, the bytes are simply stored as
401da177e4SLinus Torvalds    is, eight bits per byte, with none of the above coding.  The bytes are
411da177e4SLinus Torvalds    preceded by a count, since there is no longer an EOB code.
421da177e4SLinus Torvalds 
431da177e4SLinus Torvalds    If the data is compressible, then either the fixed or dynamic methods
441da177e4SLinus Torvalds    are used.  In the dynamic method, the compressed data is preceded by
451da177e4SLinus Torvalds    an encoding of the literal/length and distance Huffman codes that are
461da177e4SLinus Torvalds    to be used to decode this block.  The representation is itself Huffman
471da177e4SLinus Torvalds    coded, and so is preceded by a description of that code.  These code
481da177e4SLinus Torvalds    descriptions take up a little space, and so for small blocks, there is
491da177e4SLinus Torvalds    a predefined set of codes, called the fixed codes.  The fixed method is
501da177e4SLinus Torvalds    used if the block codes up smaller that way (usually for quite small
511da177e4SLinus Torvalds    chunks), otherwise the dynamic method is used.  In the latter case, the
521da177e4SLinus Torvalds    codes are customized to the probabilities in the current block, and so
531da177e4SLinus Torvalds    can code it much better than the pre-determined fixed codes.
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds    The Huffman codes themselves are decoded using a multi-level table
561da177e4SLinus Torvalds    lookup, in order to maximize the speed of decoding plus the speed of
571da177e4SLinus Torvalds    building the decoding tables.  See the comments below that precede the
581da177e4SLinus Torvalds    lbits and dbits tuning parameters.
591da177e4SLinus Torvalds  */
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds /*
631da177e4SLinus Torvalds    Notes beyond the 1.93a appnote.txt:
641da177e4SLinus Torvalds 
651da177e4SLinus Torvalds    1. Distance pointers never point before the beginning of the output
661da177e4SLinus Torvalds       stream.
671da177e4SLinus Torvalds    2. Distance pointers can point back across blocks, up to 32k away.
681da177e4SLinus Torvalds    3. There is an implied maximum of 7 bits for the bit length table and
691da177e4SLinus Torvalds       15 bits for the actual data.
701da177e4SLinus Torvalds    4. If only one code exists, then it is encoded using one bit.  (Zero
711da177e4SLinus Torvalds       would be more efficient, but perhaps a little confusing.)  If two
721da177e4SLinus Torvalds       codes exist, they are coded using one bit each (0 and 1).
731da177e4SLinus Torvalds    5. There is no way of sending zero distance codes--a dummy must be
741da177e4SLinus Torvalds       sent if there are none.  (History: a pre 2.0 version of PKZIP would
751da177e4SLinus Torvalds       store blocks with no distance codes, but this was discovered to be
761da177e4SLinus Torvalds       too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
771da177e4SLinus Torvalds       zero distance codes, which is sent as one code of zero bits in
781da177e4SLinus Torvalds       length.
791da177e4SLinus Torvalds    6. There are up to 286 literal/length codes.  Code 256 represents the
801da177e4SLinus Torvalds       end-of-block.  Note however that the static length tree defines
811da177e4SLinus Torvalds       288 codes just to fill out the Huffman codes.  Codes 286 and 287
821da177e4SLinus Torvalds       cannot be used though, since there is no length base or extra bits
831da177e4SLinus Torvalds       defined for them.  Similarly, there are up to 30 distance codes.
841da177e4SLinus Torvalds       However, static trees define 32 codes (all 5 bits) to fill out the
851da177e4SLinus Torvalds       Huffman codes, but the last two had better not show up in the data.
861da177e4SLinus Torvalds    7. Unzip can check dynamic Huffman blocks for complete code sets.
871da177e4SLinus Torvalds       The exception is that a single code would not be complete (see #4).
881da177e4SLinus Torvalds    8. The five bits following the block type is really the number of
891da177e4SLinus Torvalds       literal codes sent minus 257.
901da177e4SLinus Torvalds    9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
911da177e4SLinus Torvalds       (1+6+6).  Therefore, to output three times the length, you output
921da177e4SLinus Torvalds       three codes (1+1+1), whereas to output four times the same length,
931da177e4SLinus Torvalds       you only need two codes (1+3).  Hmm.
941da177e4SLinus Torvalds   10. In the tree reconstruction algorithm, Code = Code + Increment
951da177e4SLinus Torvalds       only if BitLength(i) is not zero.  (Pretty obvious.)
961da177e4SLinus Torvalds   11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
971da177e4SLinus Torvalds   12. Note: length code 284 can represent 227-258, but length code 285
981da177e4SLinus Torvalds       really is 258.  The last length deserves its own, short code
991da177e4SLinus Torvalds       since it gets used a lot in very redundant files.  The length
1001da177e4SLinus Torvalds       258 is special since 258 - 3 (the min match length) is 255.
1011da177e4SLinus Torvalds   13. The literal/length and distance code bit lengths are read as a
1021da177e4SLinus Torvalds       single stream of lengths.  It is possible (and advantageous) for
1031da177e4SLinus Torvalds       a repeat code (16, 17, or 18) to go across the boundary between
1041da177e4SLinus Torvalds       the two sets of lengths.
1051da177e4SLinus Torvalds  */
1061da177e4SLinus Torvalds #include <linux/compiler.h>
1071490cf5fSDavid Howells #ifdef NO_INFLATE_MALLOC
1085a0e3ad6STejun Heo #include <linux/slab.h>
1091490cf5fSDavid Howells #endif
1101da177e4SLinus Torvalds 
1111da177e4SLinus Torvalds #ifdef RCSID
1121da177e4SLinus Torvalds static char rcsid[] = "#Id: inflate.c,v 0.14 1993/06/10 13:27:04 jloup Exp #";
1131da177e4SLinus Torvalds #endif
1141da177e4SLinus Torvalds 
1151da177e4SLinus Torvalds #ifndef STATIC
1161da177e4SLinus Torvalds 
1171da177e4SLinus Torvalds #if defined(STDC_HEADERS) || defined(HAVE_STDLIB_H)
1181da177e4SLinus Torvalds #  include <sys/types.h>
1191da177e4SLinus Torvalds #  include <stdlib.h>
1201da177e4SLinus Torvalds #endif
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds #include "gzip.h"
1231da177e4SLinus Torvalds #define STATIC
1241da177e4SLinus Torvalds #endif /* !STATIC */
1251da177e4SLinus Torvalds 
1261da177e4SLinus Torvalds #ifndef INIT
1271da177e4SLinus Torvalds #define INIT
1281da177e4SLinus Torvalds #endif
1291da177e4SLinus Torvalds 
1301da177e4SLinus Torvalds #define slide window
1311da177e4SLinus Torvalds 
1321da177e4SLinus Torvalds /* Huffman code lookup table entry--this entry is four bytes for machines
1331da177e4SLinus Torvalds    that have 16-bit pointers (e.g. PC's in the small or medium model).
1341da177e4SLinus Torvalds    Valid extra bits are 0..13.  e == 15 is EOB (end of block), e == 16
1351da177e4SLinus Torvalds    means that v is a literal, 16 < e < 32 means that v is a pointer to
1361da177e4SLinus Torvalds    the next table, which codes e - 16 bits, and lastly e == 99 indicates
1371da177e4SLinus Torvalds    an unused code.  If a code with e == 99 is looked up, this implies an
1381da177e4SLinus Torvalds    error in the data. */
1391da177e4SLinus Torvalds struct huft {
1401da177e4SLinus Torvalds   uch e;                /* number of extra bits or operation */
1411da177e4SLinus Torvalds   uch b;                /* number of bits in this code or subcode */
1421da177e4SLinus Torvalds   union {
1431da177e4SLinus Torvalds     ush n;              /* literal, length base, or distance base */
1441da177e4SLinus Torvalds     struct huft *t;     /* pointer to next level of table */
1451da177e4SLinus Torvalds   } v;
1461da177e4SLinus Torvalds };
1471da177e4SLinus Torvalds 
1481da177e4SLinus Torvalds 
1491da177e4SLinus Torvalds /* Function prototypes */
1501da177e4SLinus Torvalds STATIC int INIT huft_build OF((unsigned *, unsigned, unsigned,
1511da177e4SLinus Torvalds 		const ush *, const ush *, struct huft **, int *));
1521da177e4SLinus Torvalds STATIC int INIT huft_free OF((struct huft *));
1531da177e4SLinus Torvalds STATIC int INIT inflate_codes OF((struct huft *, struct huft *, int, int));
1541da177e4SLinus Torvalds STATIC int INIT inflate_stored OF((void));
1551da177e4SLinus Torvalds STATIC int INIT inflate_fixed OF((void));
1561da177e4SLinus Torvalds STATIC int INIT inflate_dynamic OF((void));
1571da177e4SLinus Torvalds STATIC int INIT inflate_block OF((int *));
1581da177e4SLinus Torvalds STATIC int INIT inflate OF((void));
1591da177e4SLinus Torvalds 
1601da177e4SLinus Torvalds 
1611da177e4SLinus Torvalds /* The inflate algorithm uses a sliding 32 K byte window on the uncompressed
1621da177e4SLinus Torvalds    stream to find repeated byte strings.  This is implemented here as a
1631da177e4SLinus Torvalds    circular buffer.  The index is updated simply by incrementing and then
1641da177e4SLinus Torvalds    ANDing with 0x7fff (32K-1). */
1651da177e4SLinus Torvalds /* It is left to other modules to supply the 32 K area.  It is assumed
1661da177e4SLinus Torvalds    to be usable as if it were declared "uch slide[32768];" or as just
1671da177e4SLinus Torvalds    "uch *slide;" and then malloc'ed in the latter case.  The definition
1681da177e4SLinus Torvalds    must be in unzip.h, included above. */
1691da177e4SLinus Torvalds /* unsigned wp;             current position in slide */
1701da177e4SLinus Torvalds #define wp outcnt
1711da177e4SLinus Torvalds #define flush_output(w) (wp=(w),flush_window())
1721da177e4SLinus Torvalds 
1731da177e4SLinus Torvalds /* Tables for deflate from PKZIP's appnote.txt. */
1741da177e4SLinus Torvalds static const unsigned border[] = {    /* Order of the bit length code lengths */
1751da177e4SLinus Torvalds         16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
1761da177e4SLinus Torvalds static const ush cplens[] = {         /* Copy lengths for literal codes 257..285 */
1771da177e4SLinus Torvalds         3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
1781da177e4SLinus Torvalds         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
1791da177e4SLinus Torvalds         /* note: see note #13 above about the 258 in this list. */
1801da177e4SLinus Torvalds static const ush cplext[] = {         /* Extra bits for literal codes 257..285 */
1811da177e4SLinus Torvalds         0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
1821da177e4SLinus Torvalds         3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */
1831da177e4SLinus Torvalds static const ush cpdist[] = {         /* Copy offsets for distance codes 0..29 */
1841da177e4SLinus Torvalds         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
1851da177e4SLinus Torvalds         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
1861da177e4SLinus Torvalds         8193, 12289, 16385, 24577};
1871da177e4SLinus Torvalds static const ush cpdext[] = {         /* Extra bits for distance codes */
1881da177e4SLinus Torvalds         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
1891da177e4SLinus Torvalds         7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
1901da177e4SLinus Torvalds         12, 12, 13, 13};
1911da177e4SLinus Torvalds 
1921da177e4SLinus Torvalds 
1931da177e4SLinus Torvalds 
1941da177e4SLinus Torvalds /* Macros for inflate() bit peeking and grabbing.
1951da177e4SLinus Torvalds    The usage is:
1961da177e4SLinus Torvalds 
1971da177e4SLinus Torvalds         NEEDBITS(j)
1981da177e4SLinus Torvalds         x = b & mask_bits[j];
1991da177e4SLinus Torvalds         DUMPBITS(j)
2001da177e4SLinus Torvalds 
2011da177e4SLinus Torvalds    where NEEDBITS makes sure that b has at least j bits in it, and
2021da177e4SLinus Torvalds    DUMPBITS removes the bits from b.  The macros use the variable k
2031da177e4SLinus Torvalds    for the number of bits in b.  Normally, b and k are register
2041da177e4SLinus Torvalds    variables for speed, and are initialized at the beginning of a
2051da177e4SLinus Torvalds    routine that uses these macros from a global bit buffer and count.
2061da177e4SLinus Torvalds 
2071da177e4SLinus Torvalds    If we assume that EOB will be the longest code, then we will never
2081da177e4SLinus Torvalds    ask for bits with NEEDBITS that are beyond the end of the stream.
2091da177e4SLinus Torvalds    So, NEEDBITS should not read any more bytes than are needed to
2101da177e4SLinus Torvalds    meet the request.  Then no bytes need to be "returned" to the buffer
2111da177e4SLinus Torvalds    at the end of the last block.
2121da177e4SLinus Torvalds 
2131da177e4SLinus Torvalds    However, this assumption is not true for fixed blocks--the EOB code
2141da177e4SLinus Torvalds    is 7 bits, but the other literal/length codes can be 8 or 9 bits.
2151da177e4SLinus Torvalds    (The EOB code is shorter than other codes because fixed blocks are
2161da177e4SLinus Torvalds    generally short.  So, while a block always has an EOB, many other
2171da177e4SLinus Torvalds    literal/length codes have a significantly lower probability of
2181da177e4SLinus Torvalds    showing up at all.)  However, by making the first table have a
2191da177e4SLinus Torvalds    lookup of seven bits, the EOB code will be found in that first
2201da177e4SLinus Torvalds    lookup, and so will not require that too many bits be pulled from
2211da177e4SLinus Torvalds    the stream.
2221da177e4SLinus Torvalds  */
2231da177e4SLinus Torvalds 
2241da177e4SLinus Torvalds STATIC ulg bb;                         /* bit buffer */
2251da177e4SLinus Torvalds STATIC unsigned bk;                    /* bits in bit buffer */
2261da177e4SLinus Torvalds 
2271da177e4SLinus Torvalds STATIC const ush mask_bits[] = {
2281da177e4SLinus Torvalds     0x0000,
2291da177e4SLinus Torvalds     0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
2301da177e4SLinus Torvalds     0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
2311da177e4SLinus Torvalds };
2321da177e4SLinus Torvalds 
2331da177e4SLinus Torvalds #define NEXTBYTE()  ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; })
2341da177e4SLinus Torvalds #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}}
2351da177e4SLinus Torvalds #define DUMPBITS(n) {b>>=(n);k-=(n);}
2361da177e4SLinus Torvalds 
2372d6ffccaSThomas Petazzoni #ifndef NO_INFLATE_MALLOC
2382d6ffccaSThomas Petazzoni /* A trivial malloc implementation, adapted from
2392d6ffccaSThomas Petazzoni  *  malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
2402d6ffccaSThomas Petazzoni  */
2412d6ffccaSThomas Petazzoni 
2422d6ffccaSThomas Petazzoni static unsigned long malloc_ptr;
2432d6ffccaSThomas Petazzoni static int malloc_count;
2442d6ffccaSThomas Petazzoni 
malloc(int size)2452d6ffccaSThomas Petazzoni static void *malloc(int size)
2462d6ffccaSThomas Petazzoni {
2472d6ffccaSThomas Petazzoni        void *p;
2482d6ffccaSThomas Petazzoni 
2492d6ffccaSThomas Petazzoni        if (size < 0)
2502d6ffccaSThomas Petazzoni 		error("Malloc error");
2512d6ffccaSThomas Petazzoni        if (!malloc_ptr)
2522d6ffccaSThomas Petazzoni 		malloc_ptr = free_mem_ptr;
2532d6ffccaSThomas Petazzoni 
2542d6ffccaSThomas Petazzoni        malloc_ptr = (malloc_ptr + 3) & ~3;     /* Align */
2552d6ffccaSThomas Petazzoni 
2562d6ffccaSThomas Petazzoni        p = (void *)malloc_ptr;
2572d6ffccaSThomas Petazzoni        malloc_ptr += size;
2582d6ffccaSThomas Petazzoni 
2592d6ffccaSThomas Petazzoni        if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
2602d6ffccaSThomas Petazzoni 		error("Out of memory");
2612d6ffccaSThomas Petazzoni 
2622d6ffccaSThomas Petazzoni        malloc_count++;
2632d6ffccaSThomas Petazzoni        return p;
2642d6ffccaSThomas Petazzoni }
2652d6ffccaSThomas Petazzoni 
free(void * where)2662d6ffccaSThomas Petazzoni static void free(void *where)
2672d6ffccaSThomas Petazzoni {
2682d6ffccaSThomas Petazzoni        malloc_count--;
2692d6ffccaSThomas Petazzoni        if (!malloc_count)
2702d6ffccaSThomas Petazzoni 		malloc_ptr = free_mem_ptr;
2712d6ffccaSThomas Petazzoni }
2722d6ffccaSThomas Petazzoni #else
2732d6ffccaSThomas Petazzoni #define malloc(a) kmalloc(a, GFP_KERNEL)
2742d6ffccaSThomas Petazzoni #define free(a) kfree(a)
2752d6ffccaSThomas Petazzoni #endif
2761da177e4SLinus Torvalds 
2771da177e4SLinus Torvalds /*
2781da177e4SLinus Torvalds    Huffman code decoding is performed using a multi-level table lookup.
2791da177e4SLinus Torvalds    The fastest way to decode is to simply build a lookup table whose
2801da177e4SLinus Torvalds    size is determined by the longest code.  However, the time it takes
2811da177e4SLinus Torvalds    to build this table can also be a factor if the data being decoded
2821da177e4SLinus Torvalds    is not very long.  The most common codes are necessarily the
2831da177e4SLinus Torvalds    shortest codes, so those codes dominate the decoding time, and hence
2841da177e4SLinus Torvalds    the speed.  The idea is you can have a shorter table that decodes the
2851da177e4SLinus Torvalds    shorter, more probable codes, and then point to subsidiary tables for
2861da177e4SLinus Torvalds    the longer codes.  The time it costs to decode the longer codes is
2871da177e4SLinus Torvalds    then traded against the time it takes to make longer tables.
2881da177e4SLinus Torvalds 
2891da177e4SLinus Torvalds    This results of this trade are in the variables lbits and dbits
2901da177e4SLinus Torvalds    below.  lbits is the number of bits the first level table for literal/
2911da177e4SLinus Torvalds    length codes can decode in one step, and dbits is the same thing for
2921da177e4SLinus Torvalds    the distance codes.  Subsequent tables are also less than or equal to
2931da177e4SLinus Torvalds    those sizes.  These values may be adjusted either when all of the
2941da177e4SLinus Torvalds    codes are shorter than that, in which case the longest code length in
2951da177e4SLinus Torvalds    bits is used, or when the shortest code is *longer* than the requested
2961da177e4SLinus Torvalds    table size, in which case the length of the shortest code in bits is
2971da177e4SLinus Torvalds    used.
2981da177e4SLinus Torvalds 
2991da177e4SLinus Torvalds    There are two different values for the two tables, since they code a
3001da177e4SLinus Torvalds    different number of possibilities each.  The literal/length table
3011da177e4SLinus Torvalds    codes 286 possible values, or in a flat code, a little over eight
3021da177e4SLinus Torvalds    bits.  The distance table codes 30 possible values, or a little less
3031da177e4SLinus Torvalds    than five bits, flat.  The optimum values for speed end up being
3041da177e4SLinus Torvalds    about one bit more than those, so lbits is 8+1 and dbits is 5+1.
3051da177e4SLinus Torvalds    The optimum values may differ though from machine to machine, and
3061da177e4SLinus Torvalds    possibly even between compilers.  Your mileage may vary.
3071da177e4SLinus Torvalds  */
3081da177e4SLinus Torvalds 
3091da177e4SLinus Torvalds 
3101da177e4SLinus Torvalds STATIC const int lbits = 9;          /* bits in base literal/length lookup table */
3111da177e4SLinus Torvalds STATIC const int dbits = 6;          /* bits in base distance lookup table */
3121da177e4SLinus Torvalds 
3131da177e4SLinus Torvalds 
3141da177e4SLinus Torvalds /* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
3151da177e4SLinus Torvalds #define BMAX 16         /* maximum bit length of any code (16 for explode) */
3161da177e4SLinus Torvalds #define N_MAX 288       /* maximum number of codes in any set */
3171da177e4SLinus Torvalds 
3181da177e4SLinus Torvalds 
3191da177e4SLinus Torvalds STATIC unsigned hufts;         /* track memory usage */
3201da177e4SLinus Torvalds 
3211da177e4SLinus Torvalds 
huft_build(unsigned * b,unsigned n,unsigned s,const ush * d,const ush * e,struct huft ** t,int * m)3221da177e4SLinus Torvalds STATIC int INIT huft_build(
3231da177e4SLinus Torvalds 	unsigned *b,            /* code lengths in bits (all assumed <= BMAX) */
3241da177e4SLinus Torvalds 	unsigned n,             /* number of codes (assumed <= N_MAX) */
3251da177e4SLinus Torvalds 	unsigned s,             /* number of simple-valued codes (0..s-1) */
3261da177e4SLinus Torvalds 	const ush *d,           /* list of base values for non-simple codes */
3271da177e4SLinus Torvalds 	const ush *e,           /* list of extra bits for non-simple codes */
3281da177e4SLinus Torvalds 	struct huft **t,        /* result: starting table */
3291da177e4SLinus Torvalds 	int *m                  /* maximum lookup bits, returns actual */
3301da177e4SLinus Torvalds 	)
3311da177e4SLinus Torvalds /* Given a list of code lengths and a maximum table size, make a set of
3321da177e4SLinus Torvalds    tables to decode that set of codes.  Return zero on success, one if
3331da177e4SLinus Torvalds    the given code set is incomplete (the tables are still built in this
3341da177e4SLinus Torvalds    case), two if the input is invalid (all zero length codes or an
3351da177e4SLinus Torvalds    oversubscribed set of lengths), and three if not enough memory. */
3361da177e4SLinus Torvalds {
3371da177e4SLinus Torvalds   unsigned a;                   /* counter for codes of length k */
3381da177e4SLinus Torvalds   unsigned f;                   /* i repeats in table every f entries */
3391da177e4SLinus Torvalds   int g;                        /* maximum code length */
3401da177e4SLinus Torvalds   int h;                        /* table level */
3411da177e4SLinus Torvalds   register unsigned i;          /* counter, current code */
3421da177e4SLinus Torvalds   register unsigned j;          /* counter */
3431da177e4SLinus Torvalds   register int k;               /* number of bits in current code */
3441da177e4SLinus Torvalds   int l;                        /* bits per table (returned in m) */
3451da177e4SLinus Torvalds   register unsigned *p;         /* pointer into c[], b[], or v[] */
3461da177e4SLinus Torvalds   register struct huft *q;      /* points to current table */
3471da177e4SLinus Torvalds   struct huft r;                /* table entry for structure assignment */
3481da177e4SLinus Torvalds   register int w;               /* bits before this table == (l * h) */
3491da177e4SLinus Torvalds   unsigned *xp;                 /* pointer into x */
3501da177e4SLinus Torvalds   int y;                        /* number of dummy codes added */
3511da177e4SLinus Torvalds   unsigned z;                   /* number of entries in current table */
35235c74226SJeremy Fitzhardinge   struct {
35335c74226SJeremy Fitzhardinge     unsigned c[BMAX+1];           /* bit length count table */
35435c74226SJeremy Fitzhardinge     struct huft *u[BMAX];         /* table stack */
35535c74226SJeremy Fitzhardinge     unsigned v[N_MAX];            /* values in order of bit length */
35635c74226SJeremy Fitzhardinge     unsigned x[BMAX+1];           /* bit offsets, then code stack */
35735c74226SJeremy Fitzhardinge   } *stk;
35835c74226SJeremy Fitzhardinge   unsigned *c, *v, *x;
35935c74226SJeremy Fitzhardinge   struct huft **u;
36035c74226SJeremy Fitzhardinge   int ret;
3611da177e4SLinus Torvalds 
3621da177e4SLinus Torvalds DEBG("huft1 ");
3631da177e4SLinus Torvalds 
36435c74226SJeremy Fitzhardinge   stk = malloc(sizeof(*stk));
36535c74226SJeremy Fitzhardinge   if (stk == NULL)
36635c74226SJeremy Fitzhardinge     return 3;			/* out of memory */
36735c74226SJeremy Fitzhardinge 
36835c74226SJeremy Fitzhardinge   c = stk->c;
36935c74226SJeremy Fitzhardinge   v = stk->v;
37035c74226SJeremy Fitzhardinge   x = stk->x;
37135c74226SJeremy Fitzhardinge   u = stk->u;
37235c74226SJeremy Fitzhardinge 
3731da177e4SLinus Torvalds   /* Generate counts for each bit length */
37435c74226SJeremy Fitzhardinge   memzero(stk->c, sizeof(stk->c));
3751da177e4SLinus Torvalds   p = b;  i = n;
3761da177e4SLinus Torvalds   do {
3771da177e4SLinus Torvalds     Tracecv(*p, (stderr, (n-i >= ' ' && n-i <= '~' ? "%c %d\n" : "0x%x %d\n"),
3781da177e4SLinus Torvalds 	    n-i, *p));
3791da177e4SLinus Torvalds     c[*p]++;                    /* assume all entries <= BMAX */
3801da177e4SLinus Torvalds     p++;                      /* Can't combine with above line (Solaris bug) */
3811da177e4SLinus Torvalds   } while (--i);
3821da177e4SLinus Torvalds   if (c[0] == n)                /* null input--all zero length codes */
3831da177e4SLinus Torvalds   {
3841da177e4SLinus Torvalds     *t = (struct huft *)NULL;
3851da177e4SLinus Torvalds     *m = 0;
38635c74226SJeremy Fitzhardinge     ret = 2;
38735c74226SJeremy Fitzhardinge     goto out;
3881da177e4SLinus Torvalds   }
3891da177e4SLinus Torvalds 
3901da177e4SLinus Torvalds DEBG("huft2 ");
3911da177e4SLinus Torvalds 
3921da177e4SLinus Torvalds   /* Find minimum and maximum length, bound *m by those */
3931da177e4SLinus Torvalds   l = *m;
3941da177e4SLinus Torvalds   for (j = 1; j <= BMAX; j++)
3951da177e4SLinus Torvalds     if (c[j])
3961da177e4SLinus Torvalds       break;
3971da177e4SLinus Torvalds   k = j;                        /* minimum code length */
3981da177e4SLinus Torvalds   if ((unsigned)l < j)
3991da177e4SLinus Torvalds     l = j;
4001da177e4SLinus Torvalds   for (i = BMAX; i; i--)
4011da177e4SLinus Torvalds     if (c[i])
4021da177e4SLinus Torvalds       break;
4031da177e4SLinus Torvalds   g = i;                        /* maximum code length */
4041da177e4SLinus Torvalds   if ((unsigned)l > i)
4051da177e4SLinus Torvalds     l = i;
4061da177e4SLinus Torvalds   *m = l;
4071da177e4SLinus Torvalds 
4081da177e4SLinus Torvalds DEBG("huft3 ");
4091da177e4SLinus Torvalds 
4101da177e4SLinus Torvalds   /* Adjust last length count to fill out codes, if needed */
4111da177e4SLinus Torvalds   for (y = 1 << j; j < i; j++, y <<= 1)
41235c74226SJeremy Fitzhardinge     if ((y -= c[j]) < 0) {
41335c74226SJeremy Fitzhardinge       ret = 2;                 /* bad input: more codes than bits */
41435c74226SJeremy Fitzhardinge       goto out;
41535c74226SJeremy Fitzhardinge     }
41635c74226SJeremy Fitzhardinge   if ((y -= c[i]) < 0) {
41735c74226SJeremy Fitzhardinge     ret = 2;
41835c74226SJeremy Fitzhardinge     goto out;
41935c74226SJeremy Fitzhardinge   }
4201da177e4SLinus Torvalds   c[i] += y;
4211da177e4SLinus Torvalds 
4221da177e4SLinus Torvalds DEBG("huft4 ");
4231da177e4SLinus Torvalds 
4241da177e4SLinus Torvalds   /* Generate starting offsets into the value table for each length */
4251da177e4SLinus Torvalds   x[1] = j = 0;
4261da177e4SLinus Torvalds   p = c + 1;  xp = x + 2;
4271da177e4SLinus Torvalds   while (--i) {                 /* note that i == g from above */
4281da177e4SLinus Torvalds     *xp++ = (j += *p++);
4291da177e4SLinus Torvalds   }
4301da177e4SLinus Torvalds 
4311da177e4SLinus Torvalds DEBG("huft5 ");
4321da177e4SLinus Torvalds 
4331da177e4SLinus Torvalds   /* Make a table of values in order of bit lengths */
4341da177e4SLinus Torvalds   p = b;  i = 0;
4351da177e4SLinus Torvalds   do {
4361da177e4SLinus Torvalds     if ((j = *p++) != 0)
4371da177e4SLinus Torvalds       v[x[j]++] = i;
4381da177e4SLinus Torvalds   } while (++i < n);
4394aad724dSTim Yamin   n = x[g];                   /* set n to length of v */
4401da177e4SLinus Torvalds 
4411da177e4SLinus Torvalds DEBG("h6 ");
4421da177e4SLinus Torvalds 
4431da177e4SLinus Torvalds   /* Generate the Huffman codes and for each, make the table entries */
4441da177e4SLinus Torvalds   x[0] = i = 0;                 /* first Huffman code is zero */
4451da177e4SLinus Torvalds   p = v;                        /* grab values in bit order */
4461da177e4SLinus Torvalds   h = -1;                       /* no tables yet--level -1 */
4471da177e4SLinus Torvalds   w = -l;                       /* bits decoded == (l * h) */
4481da177e4SLinus Torvalds   u[0] = (struct huft *)NULL;   /* just to keep compilers happy */
4491da177e4SLinus Torvalds   q = (struct huft *)NULL;      /* ditto */
4501da177e4SLinus Torvalds   z = 0;                        /* ditto */
4511da177e4SLinus Torvalds DEBG("h6a ");
4521da177e4SLinus Torvalds 
4531da177e4SLinus Torvalds   /* go through the bit lengths (k already is bits in shortest code) */
4541da177e4SLinus Torvalds   for (; k <= g; k++)
4551da177e4SLinus Torvalds   {
4561da177e4SLinus Torvalds DEBG("h6b ");
4571da177e4SLinus Torvalds     a = c[k];
4581da177e4SLinus Torvalds     while (a--)
4591da177e4SLinus Torvalds     {
4601da177e4SLinus Torvalds DEBG("h6b1 ");
4611da177e4SLinus Torvalds       /* here i is the Huffman code of length k bits for value *p */
4621da177e4SLinus Torvalds       /* make tables up to required level */
4631da177e4SLinus Torvalds       while (k > w + l)
4641da177e4SLinus Torvalds       {
4651da177e4SLinus Torvalds DEBG1("1 ");
4661da177e4SLinus Torvalds         h++;
4671da177e4SLinus Torvalds         w += l;                 /* previous table always l bits */
4681da177e4SLinus Torvalds 
4691da177e4SLinus Torvalds         /* compute minimum size table less than or equal to l bits */
4701da177e4SLinus Torvalds         z = (z = g - w) > (unsigned)l ? l : z;  /* upper limit on table size */
4711da177e4SLinus Torvalds         if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */
4721da177e4SLinus Torvalds         {                       /* too few codes for k-w bit table */
4731da177e4SLinus Torvalds DEBG1("2 ");
4741da177e4SLinus Torvalds           f -= a + 1;           /* deduct codes from patterns left */
4751da177e4SLinus Torvalds           xp = c + k;
4764aad724dSTim Yamin           if (j < z)
4771da177e4SLinus Torvalds             while (++j < z)       /* try smaller tables up to z bits */
4781da177e4SLinus Torvalds             {
4791da177e4SLinus Torvalds               if ((f <<= 1) <= *++xp)
4801da177e4SLinus Torvalds                 break;            /* enough codes to use up j bits */
4811da177e4SLinus Torvalds               f -= *xp;           /* else deduct codes from patterns */
4821da177e4SLinus Torvalds             }
4831da177e4SLinus Torvalds         }
4841da177e4SLinus Torvalds DEBG1("3 ");
4851da177e4SLinus Torvalds         z = 1 << j;             /* table entries for j-bit table */
4861da177e4SLinus Torvalds 
4871da177e4SLinus Torvalds         /* allocate and link in new table */
4881da177e4SLinus Torvalds         if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) ==
4891da177e4SLinus Torvalds             (struct huft *)NULL)
4901da177e4SLinus Torvalds         {
4911da177e4SLinus Torvalds           if (h)
4921da177e4SLinus Torvalds             huft_free(u[0]);
49335c74226SJeremy Fitzhardinge           ret = 3;             /* not enough memory */
49435c74226SJeremy Fitzhardinge 	  goto out;
4951da177e4SLinus Torvalds         }
4961da177e4SLinus Torvalds DEBG1("4 ");
4971da177e4SLinus Torvalds         hufts += z + 1;         /* track memory usage */
4981da177e4SLinus Torvalds         *t = q + 1;             /* link to list for huft_free() */
4991da177e4SLinus Torvalds         *(t = &(q->v.t)) = (struct huft *)NULL;
5001da177e4SLinus Torvalds         u[h] = ++q;             /* table starts after link */
5011da177e4SLinus Torvalds 
5021da177e4SLinus Torvalds DEBG1("5 ");
5031da177e4SLinus Torvalds         /* connect to last table, if there is one */
5041da177e4SLinus Torvalds         if (h)
5051da177e4SLinus Torvalds         {
5061da177e4SLinus Torvalds           x[h] = i;             /* save pattern for backing up */
5071da177e4SLinus Torvalds           r.b = (uch)l;         /* bits to dump before this table */
5081da177e4SLinus Torvalds           r.e = (uch)(16 + j);  /* bits in this table */
5091da177e4SLinus Torvalds           r.v.t = q;            /* pointer to this table */
5101da177e4SLinus Torvalds           j = i >> (w - l);     /* (get around Turbo C bug) */
5111da177e4SLinus Torvalds           u[h-1][j] = r;        /* connect to last table */
5121da177e4SLinus Torvalds         }
5131da177e4SLinus Torvalds DEBG1("6 ");
5141da177e4SLinus Torvalds       }
5151da177e4SLinus Torvalds DEBG("h6c ");
5161da177e4SLinus Torvalds 
5171da177e4SLinus Torvalds       /* set up table entry in r */
5181da177e4SLinus Torvalds       r.b = (uch)(k - w);
5191da177e4SLinus Torvalds       if (p >= v + n)
5201da177e4SLinus Torvalds         r.e = 99;               /* out of values--invalid code */
5211da177e4SLinus Torvalds       else if (*p < s)
5221da177e4SLinus Torvalds       {
5231da177e4SLinus Torvalds         r.e = (uch)(*p < 256 ? 16 : 15);    /* 256 is end-of-block code */
5241da177e4SLinus Torvalds         r.v.n = (ush)(*p);             /* simple code is just the value */
5251da177e4SLinus Torvalds 	p++;                           /* one compiler does not like *p++ */
5261da177e4SLinus Torvalds       }
5271da177e4SLinus Torvalds       else
5281da177e4SLinus Torvalds       {
5291da177e4SLinus Torvalds         r.e = (uch)e[*p - s];   /* non-simple--look up in lists */
5301da177e4SLinus Torvalds         r.v.n = d[*p++ - s];
5311da177e4SLinus Torvalds       }
5321da177e4SLinus Torvalds DEBG("h6d ");
5331da177e4SLinus Torvalds 
5341da177e4SLinus Torvalds       /* fill code-like entries with r */
5351da177e4SLinus Torvalds       f = 1 << (k - w);
5361da177e4SLinus Torvalds       for (j = i >> w; j < z; j += f)
5371da177e4SLinus Torvalds         q[j] = r;
5381da177e4SLinus Torvalds 
5391da177e4SLinus Torvalds       /* backwards increment the k-bit code i */
5401da177e4SLinus Torvalds       for (j = 1 << (k - 1); i & j; j >>= 1)
5411da177e4SLinus Torvalds         i ^= j;
5421da177e4SLinus Torvalds       i ^= j;
5431da177e4SLinus Torvalds 
5441da177e4SLinus Torvalds       /* backup over finished tables */
5451da177e4SLinus Torvalds       while ((i & ((1 << w) - 1)) != x[h])
5461da177e4SLinus Torvalds       {
5471da177e4SLinus Torvalds         h--;                    /* don't need to update q */
5481da177e4SLinus Torvalds         w -= l;
5491da177e4SLinus Torvalds       }
5501da177e4SLinus Torvalds DEBG("h6e ");
5511da177e4SLinus Torvalds     }
5521da177e4SLinus Torvalds DEBG("h6f ");
5531da177e4SLinus Torvalds   }
5541da177e4SLinus Torvalds 
5551da177e4SLinus Torvalds DEBG("huft7 ");
5561da177e4SLinus Torvalds 
5571da177e4SLinus Torvalds   /* Return true (1) if we were given an incomplete table */
55835c74226SJeremy Fitzhardinge   ret = y != 0 && g != 1;
55935c74226SJeremy Fitzhardinge 
56035c74226SJeremy Fitzhardinge   out:
56135c74226SJeremy Fitzhardinge   free(stk);
56235c74226SJeremy Fitzhardinge   return ret;
5631da177e4SLinus Torvalds }
5641da177e4SLinus Torvalds 
5651da177e4SLinus Torvalds 
5661da177e4SLinus Torvalds 
huft_free(struct huft * t)5671da177e4SLinus Torvalds STATIC int INIT huft_free(
5681da177e4SLinus Torvalds 	struct huft *t         /* table to free */
5691da177e4SLinus Torvalds 	)
5701da177e4SLinus Torvalds /* Free the malloc'ed tables built by huft_build(), which makes a linked
5711da177e4SLinus Torvalds    list of the tables it made, with the links in a dummy first entry of
5721da177e4SLinus Torvalds    each table. */
5731da177e4SLinus Torvalds {
5741da177e4SLinus Torvalds   register struct huft *p, *q;
5751da177e4SLinus Torvalds 
5761da177e4SLinus Torvalds 
5771da177e4SLinus Torvalds   /* Go through linked list, freeing from the malloced (t[-1]) address. */
5781da177e4SLinus Torvalds   p = t;
5791da177e4SLinus Torvalds   while (p != (struct huft *)NULL)
5801da177e4SLinus Torvalds   {
5811da177e4SLinus Torvalds     q = (--p)->v.t;
5821da177e4SLinus Torvalds     free((char*)p);
5831da177e4SLinus Torvalds     p = q;
5841da177e4SLinus Torvalds   }
5851da177e4SLinus Torvalds   return 0;
5861da177e4SLinus Torvalds }
5871da177e4SLinus Torvalds 
5881da177e4SLinus Torvalds 
inflate_codes(struct huft * tl,struct huft * td,int bl,int bd)5891da177e4SLinus Torvalds STATIC int INIT inflate_codes(
5901da177e4SLinus Torvalds 	struct huft *tl,    /* literal/length decoder tables */
5911da177e4SLinus Torvalds 	struct huft *td,    /* distance decoder tables */
5921da177e4SLinus Torvalds 	int bl,             /* number of bits decoded by tl[] */
5931da177e4SLinus Torvalds 	int bd              /* number of bits decoded by td[] */
5941da177e4SLinus Torvalds 	)
5951da177e4SLinus Torvalds /* inflate (decompress) the codes in a deflated (compressed) block.
5961da177e4SLinus Torvalds    Return an error code or zero if it all goes ok. */
5971da177e4SLinus Torvalds {
5981da177e4SLinus Torvalds   register unsigned e;  /* table entry flag/number of extra bits */
5991da177e4SLinus Torvalds   unsigned n, d;        /* length and index for copy */
6001da177e4SLinus Torvalds   unsigned w;           /* current window position */
6011da177e4SLinus Torvalds   struct huft *t;       /* pointer to table entry */
6021da177e4SLinus Torvalds   unsigned ml, md;      /* masks for bl and bd bits */
6031da177e4SLinus Torvalds   register ulg b;       /* bit buffer */
6041da177e4SLinus Torvalds   register unsigned k;  /* number of bits in bit buffer */
6051da177e4SLinus Torvalds 
6061da177e4SLinus Torvalds 
6071da177e4SLinus Torvalds   /* make local copies of globals */
6081da177e4SLinus Torvalds   b = bb;                       /* initialize bit buffer */
6091da177e4SLinus Torvalds   k = bk;
6101da177e4SLinus Torvalds   w = wp;                       /* initialize window position */
6111da177e4SLinus Torvalds 
6121da177e4SLinus Torvalds   /* inflate the coded data */
6131da177e4SLinus Torvalds   ml = mask_bits[bl];           /* precompute masks for speed */
6141da177e4SLinus Torvalds   md = mask_bits[bd];
6151da177e4SLinus Torvalds   for (;;)                      /* do until end of block */
6161da177e4SLinus Torvalds   {
6171da177e4SLinus Torvalds     NEEDBITS((unsigned)bl)
6181da177e4SLinus Torvalds     if ((e = (t = tl + ((unsigned)b & ml))->e) > 16)
6191da177e4SLinus Torvalds       do {
6201da177e4SLinus Torvalds         if (e == 99)
6211da177e4SLinus Torvalds           return 1;
6221da177e4SLinus Torvalds         DUMPBITS(t->b)
6231da177e4SLinus Torvalds         e -= 16;
6241da177e4SLinus Torvalds         NEEDBITS(e)
6251da177e4SLinus Torvalds       } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);
6261da177e4SLinus Torvalds     DUMPBITS(t->b)
6271da177e4SLinus Torvalds     if (e == 16)                /* then it's a literal */
6281da177e4SLinus Torvalds     {
6291da177e4SLinus Torvalds       slide[w++] = (uch)t->v.n;
6301da177e4SLinus Torvalds       Tracevv((stderr, "%c", slide[w-1]));
6311da177e4SLinus Torvalds       if (w == WSIZE)
6321da177e4SLinus Torvalds       {
6331da177e4SLinus Torvalds         flush_output(w);
6341da177e4SLinus Torvalds         w = 0;
6351da177e4SLinus Torvalds       }
6361da177e4SLinus Torvalds     }
6371da177e4SLinus Torvalds     else                        /* it's an EOB or a length */
6381da177e4SLinus Torvalds     {
6391da177e4SLinus Torvalds       /* exit if end of block */
6401da177e4SLinus Torvalds       if (e == 15)
6411da177e4SLinus Torvalds         break;
6421da177e4SLinus Torvalds 
6431da177e4SLinus Torvalds       /* get length of block to copy */
6441da177e4SLinus Torvalds       NEEDBITS(e)
6451da177e4SLinus Torvalds       n = t->v.n + ((unsigned)b & mask_bits[e]);
6461da177e4SLinus Torvalds       DUMPBITS(e);
6471da177e4SLinus Torvalds 
6481da177e4SLinus Torvalds       /* decode distance of block to copy */
6491da177e4SLinus Torvalds       NEEDBITS((unsigned)bd)
6501da177e4SLinus Torvalds       if ((e = (t = td + ((unsigned)b & md))->e) > 16)
6511da177e4SLinus Torvalds         do {
6521da177e4SLinus Torvalds           if (e == 99)
6531da177e4SLinus Torvalds             return 1;
6541da177e4SLinus Torvalds           DUMPBITS(t->b)
6551da177e4SLinus Torvalds           e -= 16;
6561da177e4SLinus Torvalds           NEEDBITS(e)
6571da177e4SLinus Torvalds         } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);
6581da177e4SLinus Torvalds       DUMPBITS(t->b)
6591da177e4SLinus Torvalds       NEEDBITS(e)
6601da177e4SLinus Torvalds       d = w - t->v.n - ((unsigned)b & mask_bits[e]);
6611da177e4SLinus Torvalds       DUMPBITS(e)
6621da177e4SLinus Torvalds       Tracevv((stderr,"\\[%d,%d]", w-d, n));
6631da177e4SLinus Torvalds 
6641da177e4SLinus Torvalds       /* do the copy */
6651da177e4SLinus Torvalds       do {
6661da177e4SLinus Torvalds         n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e);
6671da177e4SLinus Torvalds #if !defined(NOMEMCPY) && !defined(DEBUG)
6681da177e4SLinus Torvalds         if (w - d >= e)         /* (this test assumes unsigned comparison) */
6691da177e4SLinus Torvalds         {
6701da177e4SLinus Torvalds           memcpy(slide + w, slide + d, e);
6711da177e4SLinus Torvalds           w += e;
6721da177e4SLinus Torvalds           d += e;
6731da177e4SLinus Torvalds         }
6741da177e4SLinus Torvalds         else                      /* do it slow to avoid memcpy() overlap */
6751da177e4SLinus Torvalds #endif /* !NOMEMCPY */
6761da177e4SLinus Torvalds           do {
6771da177e4SLinus Torvalds             slide[w++] = slide[d++];
6781da177e4SLinus Torvalds 	    Tracevv((stderr, "%c", slide[w-1]));
6791da177e4SLinus Torvalds           } while (--e);
6801da177e4SLinus Torvalds         if (w == WSIZE)
6811da177e4SLinus Torvalds         {
6821da177e4SLinus Torvalds           flush_output(w);
6831da177e4SLinus Torvalds           w = 0;
6841da177e4SLinus Torvalds         }
6851da177e4SLinus Torvalds       } while (n);
6861da177e4SLinus Torvalds     }
6871da177e4SLinus Torvalds   }
6881da177e4SLinus Torvalds 
6891da177e4SLinus Torvalds 
6901da177e4SLinus Torvalds   /* restore the globals from the locals */
6911da177e4SLinus Torvalds   wp = w;                       /* restore global window pointer */
6921da177e4SLinus Torvalds   bb = b;                       /* restore global bit buffer */
6931da177e4SLinus Torvalds   bk = k;
6941da177e4SLinus Torvalds 
6951da177e4SLinus Torvalds   /* done */
6961da177e4SLinus Torvalds   return 0;
6971da177e4SLinus Torvalds 
6981da177e4SLinus Torvalds  underrun:
6991da177e4SLinus Torvalds   return 4;			/* Input underrun */
7001da177e4SLinus Torvalds }
7011da177e4SLinus Torvalds 
7021da177e4SLinus Torvalds 
7031da177e4SLinus Torvalds 
inflate_stored(void)7041da177e4SLinus Torvalds STATIC int INIT inflate_stored(void)
7051da177e4SLinus Torvalds /* "decompress" an inflated type 0 (stored) block. */
7061da177e4SLinus Torvalds {
7071da177e4SLinus Torvalds   unsigned n;           /* number of bytes in block */
7081da177e4SLinus Torvalds   unsigned w;           /* current window position */
7091da177e4SLinus Torvalds   register ulg b;       /* bit buffer */
7101da177e4SLinus Torvalds   register unsigned k;  /* number of bits in bit buffer */
7111da177e4SLinus Torvalds 
7121da177e4SLinus Torvalds DEBG("<stor");
7131da177e4SLinus Torvalds 
7141da177e4SLinus Torvalds   /* make local copies of globals */
7151da177e4SLinus Torvalds   b = bb;                       /* initialize bit buffer */
7161da177e4SLinus Torvalds   k = bk;
7171da177e4SLinus Torvalds   w = wp;                       /* initialize window position */
7181da177e4SLinus Torvalds 
7191da177e4SLinus Torvalds 
7201da177e4SLinus Torvalds   /* go to byte boundary */
7211da177e4SLinus Torvalds   n = k & 7;
7221da177e4SLinus Torvalds   DUMPBITS(n);
7231da177e4SLinus Torvalds 
7241da177e4SLinus Torvalds 
7251da177e4SLinus Torvalds   /* get the length and its complement */
7261da177e4SLinus Torvalds   NEEDBITS(16)
7271da177e4SLinus Torvalds   n = ((unsigned)b & 0xffff);
7281da177e4SLinus Torvalds   DUMPBITS(16)
7291da177e4SLinus Torvalds   NEEDBITS(16)
7301da177e4SLinus Torvalds   if (n != (unsigned)((~b) & 0xffff))
7311da177e4SLinus Torvalds     return 1;                   /* error in compressed data */
7321da177e4SLinus Torvalds   DUMPBITS(16)
7331da177e4SLinus Torvalds 
7341da177e4SLinus Torvalds 
7351da177e4SLinus Torvalds   /* read and output the compressed data */
7361da177e4SLinus Torvalds   while (n--)
7371da177e4SLinus Torvalds   {
7381da177e4SLinus Torvalds     NEEDBITS(8)
7391da177e4SLinus Torvalds     slide[w++] = (uch)b;
7401da177e4SLinus Torvalds     if (w == WSIZE)
7411da177e4SLinus Torvalds     {
7421da177e4SLinus Torvalds       flush_output(w);
7431da177e4SLinus Torvalds       w = 0;
7441da177e4SLinus Torvalds     }
7451da177e4SLinus Torvalds     DUMPBITS(8)
7461da177e4SLinus Torvalds   }
7471da177e4SLinus Torvalds 
7481da177e4SLinus Torvalds 
7491da177e4SLinus Torvalds   /* restore the globals from the locals */
7501da177e4SLinus Torvalds   wp = w;                       /* restore global window pointer */
7511da177e4SLinus Torvalds   bb = b;                       /* restore global bit buffer */
7521da177e4SLinus Torvalds   bk = k;
7531da177e4SLinus Torvalds 
7541da177e4SLinus Torvalds   DEBG(">");
7551da177e4SLinus Torvalds   return 0;
7561da177e4SLinus Torvalds 
7571da177e4SLinus Torvalds  underrun:
7581da177e4SLinus Torvalds   return 4;			/* Input underrun */
7591da177e4SLinus Torvalds }
7601da177e4SLinus Torvalds 
7611da177e4SLinus Torvalds 
7621da177e4SLinus Torvalds /*
7631da177e4SLinus Torvalds  * We use `noinline' here to prevent gcc-3.5 from using too much stack space
7641da177e4SLinus Torvalds  */
inflate_fixed(void)7651da177e4SLinus Torvalds STATIC int noinline INIT inflate_fixed(void)
7661da177e4SLinus Torvalds /* decompress an inflated type 1 (fixed Huffman codes) block.  We should
7671da177e4SLinus Torvalds    either replace this with a custom decoder, or at least precompute the
7681da177e4SLinus Torvalds    Huffman tables. */
7691da177e4SLinus Torvalds {
7701da177e4SLinus Torvalds   int i;                /* temporary variable */
7711da177e4SLinus Torvalds   struct huft *tl;      /* literal/length code table */
7721da177e4SLinus Torvalds   struct huft *td;      /* distance code table */
7731da177e4SLinus Torvalds   int bl;               /* lookup bits for tl */
7741da177e4SLinus Torvalds   int bd;               /* lookup bits for td */
77535c74226SJeremy Fitzhardinge   unsigned *l;          /* length list for huft_build */
7761da177e4SLinus Torvalds 
7771da177e4SLinus Torvalds DEBG("<fix");
7781da177e4SLinus Torvalds 
77935c74226SJeremy Fitzhardinge   l = malloc(sizeof(*l) * 288);
78035c74226SJeremy Fitzhardinge   if (l == NULL)
78135c74226SJeremy Fitzhardinge     return 3;			/* out of memory */
78235c74226SJeremy Fitzhardinge 
7831da177e4SLinus Torvalds   /* set up literal table */
7841da177e4SLinus Torvalds   for (i = 0; i < 144; i++)
7851da177e4SLinus Torvalds     l[i] = 8;
7861da177e4SLinus Torvalds   for (; i < 256; i++)
7871da177e4SLinus Torvalds     l[i] = 9;
7881da177e4SLinus Torvalds   for (; i < 280; i++)
7891da177e4SLinus Torvalds     l[i] = 7;
7901da177e4SLinus Torvalds   for (; i < 288; i++)          /* make a complete, but wrong code set */
7911da177e4SLinus Torvalds     l[i] = 8;
7921da177e4SLinus Torvalds   bl = 7;
79335c74226SJeremy Fitzhardinge   if ((i = huft_build(l, 288, 257, cplens, cplext, &tl, &bl)) != 0) {
79435c74226SJeremy Fitzhardinge     free(l);
7951da177e4SLinus Torvalds     return i;
79635c74226SJeremy Fitzhardinge   }
7971da177e4SLinus Torvalds 
7981da177e4SLinus Torvalds   /* set up distance table */
7991da177e4SLinus Torvalds   for (i = 0; i < 30; i++)      /* make an incomplete code set */
8001da177e4SLinus Torvalds     l[i] = 5;
8011da177e4SLinus Torvalds   bd = 5;
8021da177e4SLinus Torvalds   if ((i = huft_build(l, 30, 0, cpdist, cpdext, &td, &bd)) > 1)
8031da177e4SLinus Torvalds   {
8041da177e4SLinus Torvalds     huft_free(tl);
80535c74226SJeremy Fitzhardinge     free(l);
8061da177e4SLinus Torvalds 
8071da177e4SLinus Torvalds     DEBG(">");
8081da177e4SLinus Torvalds     return i;
8091da177e4SLinus Torvalds   }
8101da177e4SLinus Torvalds 
8111da177e4SLinus Torvalds 
8121da177e4SLinus Torvalds   /* decompress until an end-of-block code */
81335c74226SJeremy Fitzhardinge   if (inflate_codes(tl, td, bl, bd)) {
81435c74226SJeremy Fitzhardinge     free(l);
8151da177e4SLinus Torvalds     return 1;
81635c74226SJeremy Fitzhardinge   }
8171da177e4SLinus Torvalds 
8181da177e4SLinus Torvalds   /* free the decoding tables, return */
81935c74226SJeremy Fitzhardinge   free(l);
8201da177e4SLinus Torvalds   huft_free(tl);
8211da177e4SLinus Torvalds   huft_free(td);
8221da177e4SLinus Torvalds   return 0;
8231da177e4SLinus Torvalds }
8241da177e4SLinus Torvalds 
8251da177e4SLinus Torvalds 
8261da177e4SLinus Torvalds /*
8271da177e4SLinus Torvalds  * We use `noinline' here to prevent gcc-3.5 from using too much stack space
8281da177e4SLinus Torvalds  */
inflate_dynamic(void)8291da177e4SLinus Torvalds STATIC int noinline INIT inflate_dynamic(void)
8301da177e4SLinus Torvalds /* decompress an inflated type 2 (dynamic Huffman codes) block. */
8311da177e4SLinus Torvalds {
8321da177e4SLinus Torvalds   int i;                /* temporary variables */
8331da177e4SLinus Torvalds   unsigned j;
8341da177e4SLinus Torvalds   unsigned l;           /* last length */
8351da177e4SLinus Torvalds   unsigned m;           /* mask for bit lengths table */
8361da177e4SLinus Torvalds   unsigned n;           /* number of lengths to get */
8371da177e4SLinus Torvalds   struct huft *tl;      /* literal/length code table */
8381da177e4SLinus Torvalds   struct huft *td;      /* distance code table */
8391da177e4SLinus Torvalds   int bl;               /* lookup bits for tl */
8401da177e4SLinus Torvalds   int bd;               /* lookup bits for td */
8411da177e4SLinus Torvalds   unsigned nb;          /* number of bit length codes */
8421da177e4SLinus Torvalds   unsigned nl;          /* number of literal/length codes */
8431da177e4SLinus Torvalds   unsigned nd;          /* number of distance codes */
84439b7ee06SJeremy Fitzhardinge   unsigned *ll;         /* literal/length and distance code lengths */
8451da177e4SLinus Torvalds   register ulg b;       /* bit buffer */
8461da177e4SLinus Torvalds   register unsigned k;  /* number of bits in bit buffer */
84739b7ee06SJeremy Fitzhardinge   int ret;
8481da177e4SLinus Torvalds 
8491da177e4SLinus Torvalds DEBG("<dyn");
8501da177e4SLinus Torvalds 
85139b7ee06SJeremy Fitzhardinge #ifdef PKZIP_BUG_WORKAROUND
85239b7ee06SJeremy Fitzhardinge   ll = malloc(sizeof(*ll) * (288+32));  /* literal/length and distance code lengths */
85339b7ee06SJeremy Fitzhardinge #else
85439b7ee06SJeremy Fitzhardinge   ll = malloc(sizeof(*ll) * (286+30));  /* literal/length and distance code lengths */
85539b7ee06SJeremy Fitzhardinge #endif
85639b7ee06SJeremy Fitzhardinge 
85722caa041SJim Meyering   if (ll == NULL)
85822caa041SJim Meyering     return 1;
85922caa041SJim Meyering 
8601da177e4SLinus Torvalds   /* make local bit buffer */
8611da177e4SLinus Torvalds   b = bb;
8621da177e4SLinus Torvalds   k = bk;
8631da177e4SLinus Torvalds 
8641da177e4SLinus Torvalds 
8651da177e4SLinus Torvalds   /* read in table lengths */
8661da177e4SLinus Torvalds   NEEDBITS(5)
8671da177e4SLinus Torvalds   nl = 257 + ((unsigned)b & 0x1f);      /* number of literal/length codes */
8681da177e4SLinus Torvalds   DUMPBITS(5)
8691da177e4SLinus Torvalds   NEEDBITS(5)
8701da177e4SLinus Torvalds   nd = 1 + ((unsigned)b & 0x1f);        /* number of distance codes */
8711da177e4SLinus Torvalds   DUMPBITS(5)
8721da177e4SLinus Torvalds   NEEDBITS(4)
8731da177e4SLinus Torvalds   nb = 4 + ((unsigned)b & 0xf);         /* number of bit length codes */
8741da177e4SLinus Torvalds   DUMPBITS(4)
8751da177e4SLinus Torvalds #ifdef PKZIP_BUG_WORKAROUND
8761da177e4SLinus Torvalds   if (nl > 288 || nd > 32)
8771da177e4SLinus Torvalds #else
8781da177e4SLinus Torvalds   if (nl > 286 || nd > 30)
8791da177e4SLinus Torvalds #endif
88039b7ee06SJeremy Fitzhardinge   {
88139b7ee06SJeremy Fitzhardinge     ret = 1;             /* bad lengths */
88239b7ee06SJeremy Fitzhardinge     goto out;
88339b7ee06SJeremy Fitzhardinge   }
8841da177e4SLinus Torvalds 
8851da177e4SLinus Torvalds DEBG("dyn1 ");
8861da177e4SLinus Torvalds 
8871da177e4SLinus Torvalds   /* read in bit-length-code lengths */
8881da177e4SLinus Torvalds   for (j = 0; j < nb; j++)
8891da177e4SLinus Torvalds   {
8901da177e4SLinus Torvalds     NEEDBITS(3)
8911da177e4SLinus Torvalds     ll[border[j]] = (unsigned)b & 7;
8921da177e4SLinus Torvalds     DUMPBITS(3)
8931da177e4SLinus Torvalds   }
8941da177e4SLinus Torvalds   for (; j < 19; j++)
8951da177e4SLinus Torvalds     ll[border[j]] = 0;
8961da177e4SLinus Torvalds 
8971da177e4SLinus Torvalds DEBG("dyn2 ");
8981da177e4SLinus Torvalds 
8991da177e4SLinus Torvalds   /* build decoding table for trees--single level, 7 bit lookup */
9001da177e4SLinus Torvalds   bl = 7;
9011da177e4SLinus Torvalds   if ((i = huft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0)
9021da177e4SLinus Torvalds   {
9031da177e4SLinus Torvalds     if (i == 1)
9041da177e4SLinus Torvalds       huft_free(tl);
90539b7ee06SJeremy Fitzhardinge     ret = i;                   /* incomplete code set */
90639b7ee06SJeremy Fitzhardinge     goto out;
9071da177e4SLinus Torvalds   }
9081da177e4SLinus Torvalds 
9091da177e4SLinus Torvalds DEBG("dyn3 ");
9101da177e4SLinus Torvalds 
9111da177e4SLinus Torvalds   /* read in literal and distance code lengths */
9121da177e4SLinus Torvalds   n = nl + nd;
9131da177e4SLinus Torvalds   m = mask_bits[bl];
9141da177e4SLinus Torvalds   i = l = 0;
9151da177e4SLinus Torvalds   while ((unsigned)i < n)
9161da177e4SLinus Torvalds   {
9171da177e4SLinus Torvalds     NEEDBITS((unsigned)bl)
9181da177e4SLinus Torvalds     j = (td = tl + ((unsigned)b & m))->b;
9191da177e4SLinus Torvalds     DUMPBITS(j)
9201da177e4SLinus Torvalds     j = td->v.n;
9211da177e4SLinus Torvalds     if (j < 16)                 /* length of code in bits (0..15) */
9221da177e4SLinus Torvalds       ll[i++] = l = j;          /* save last length in l */
9231da177e4SLinus Torvalds     else if (j == 16)           /* repeat last length 3 to 6 times */
9241da177e4SLinus Torvalds     {
9251da177e4SLinus Torvalds       NEEDBITS(2)
9261da177e4SLinus Torvalds       j = 3 + ((unsigned)b & 3);
9271da177e4SLinus Torvalds       DUMPBITS(2)
92839b7ee06SJeremy Fitzhardinge       if ((unsigned)i + j > n) {
92939b7ee06SJeremy Fitzhardinge         ret = 1;
93039b7ee06SJeremy Fitzhardinge 	goto out;
93139b7ee06SJeremy Fitzhardinge       }
9321da177e4SLinus Torvalds       while (j--)
9331da177e4SLinus Torvalds         ll[i++] = l;
9341da177e4SLinus Torvalds     }
9351da177e4SLinus Torvalds     else if (j == 17)           /* 3 to 10 zero length codes */
9361da177e4SLinus Torvalds     {
9371da177e4SLinus Torvalds       NEEDBITS(3)
9381da177e4SLinus Torvalds       j = 3 + ((unsigned)b & 7);
9391da177e4SLinus Torvalds       DUMPBITS(3)
94039b7ee06SJeremy Fitzhardinge       if ((unsigned)i + j > n) {
94139b7ee06SJeremy Fitzhardinge         ret = 1;
94239b7ee06SJeremy Fitzhardinge 	goto out;
94339b7ee06SJeremy Fitzhardinge       }
9441da177e4SLinus Torvalds       while (j--)
9451da177e4SLinus Torvalds         ll[i++] = 0;
9461da177e4SLinus Torvalds       l = 0;
9471da177e4SLinus Torvalds     }
9481da177e4SLinus Torvalds     else                        /* j == 18: 11 to 138 zero length codes */
9491da177e4SLinus Torvalds     {
9501da177e4SLinus Torvalds       NEEDBITS(7)
9511da177e4SLinus Torvalds       j = 11 + ((unsigned)b & 0x7f);
9521da177e4SLinus Torvalds       DUMPBITS(7)
95339b7ee06SJeremy Fitzhardinge       if ((unsigned)i + j > n) {
95439b7ee06SJeremy Fitzhardinge         ret = 1;
95539b7ee06SJeremy Fitzhardinge 	goto out;
95639b7ee06SJeremy Fitzhardinge       }
9571da177e4SLinus Torvalds       while (j--)
9581da177e4SLinus Torvalds         ll[i++] = 0;
9591da177e4SLinus Torvalds       l = 0;
9601da177e4SLinus Torvalds     }
9611da177e4SLinus Torvalds   }
9621da177e4SLinus Torvalds 
9631da177e4SLinus Torvalds DEBG("dyn4 ");
9641da177e4SLinus Torvalds 
9651da177e4SLinus Torvalds   /* free decoding table for trees */
9661da177e4SLinus Torvalds   huft_free(tl);
9671da177e4SLinus Torvalds 
9681da177e4SLinus Torvalds DEBG("dyn5 ");
9691da177e4SLinus Torvalds 
9701da177e4SLinus Torvalds   /* restore the global bit buffer */
9711da177e4SLinus Torvalds   bb = b;
9721da177e4SLinus Torvalds   bk = k;
9731da177e4SLinus Torvalds 
9741da177e4SLinus Torvalds DEBG("dyn5a ");
9751da177e4SLinus Torvalds 
9761da177e4SLinus Torvalds   /* build the decoding tables for literal/length and distance codes */
9771da177e4SLinus Torvalds   bl = lbits;
9781da177e4SLinus Torvalds   if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0)
9791da177e4SLinus Torvalds   {
9801da177e4SLinus Torvalds DEBG("dyn5b ");
9811da177e4SLinus Torvalds     if (i == 1) {
9821da177e4SLinus Torvalds       error("incomplete literal tree");
9831da177e4SLinus Torvalds       huft_free(tl);
9841da177e4SLinus Torvalds     }
98539b7ee06SJeremy Fitzhardinge     ret = i;                   /* incomplete code set */
98639b7ee06SJeremy Fitzhardinge     goto out;
9871da177e4SLinus Torvalds   }
9881da177e4SLinus Torvalds DEBG("dyn5c ");
9891da177e4SLinus Torvalds   bd = dbits;
9901da177e4SLinus Torvalds   if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0)
9911da177e4SLinus Torvalds   {
9921da177e4SLinus Torvalds DEBG("dyn5d ");
9931da177e4SLinus Torvalds     if (i == 1) {
9941da177e4SLinus Torvalds       error("incomplete distance tree");
9951da177e4SLinus Torvalds #ifdef PKZIP_BUG_WORKAROUND
9961da177e4SLinus Torvalds       i = 0;
9971da177e4SLinus Torvalds     }
9981da177e4SLinus Torvalds #else
9991da177e4SLinus Torvalds       huft_free(td);
10001da177e4SLinus Torvalds     }
10011da177e4SLinus Torvalds     huft_free(tl);
100239b7ee06SJeremy Fitzhardinge     ret = i;                   /* incomplete code set */
100339b7ee06SJeremy Fitzhardinge     goto out;
10041da177e4SLinus Torvalds #endif
10051da177e4SLinus Torvalds   }
10061da177e4SLinus Torvalds 
10071da177e4SLinus Torvalds DEBG("dyn6 ");
10081da177e4SLinus Torvalds 
10091da177e4SLinus Torvalds   /* decompress until an end-of-block code */
101039b7ee06SJeremy Fitzhardinge   if (inflate_codes(tl, td, bl, bd)) {
101139b7ee06SJeremy Fitzhardinge     ret = 1;
101239b7ee06SJeremy Fitzhardinge     goto out;
101339b7ee06SJeremy Fitzhardinge   }
10141da177e4SLinus Torvalds 
10151da177e4SLinus Torvalds DEBG("dyn7 ");
10161da177e4SLinus Torvalds 
10171da177e4SLinus Torvalds   /* free the decoding tables, return */
10181da177e4SLinus Torvalds   huft_free(tl);
10191da177e4SLinus Torvalds   huft_free(td);
10201da177e4SLinus Torvalds 
10211da177e4SLinus Torvalds   DEBG(">");
102239b7ee06SJeremy Fitzhardinge   ret = 0;
102339b7ee06SJeremy Fitzhardinge out:
102439b7ee06SJeremy Fitzhardinge   free(ll);
102539b7ee06SJeremy Fitzhardinge   return ret;
10261da177e4SLinus Torvalds 
10271da177e4SLinus Torvalds underrun:
102839b7ee06SJeremy Fitzhardinge   ret = 4;			/* Input underrun */
102939b7ee06SJeremy Fitzhardinge   goto out;
10301da177e4SLinus Torvalds }
10311da177e4SLinus Torvalds 
10321da177e4SLinus Torvalds 
10331da177e4SLinus Torvalds 
inflate_block(int * e)10341da177e4SLinus Torvalds STATIC int INIT inflate_block(
10351da177e4SLinus Torvalds 	int *e                  /* last block flag */
10361da177e4SLinus Torvalds 	)
10371da177e4SLinus Torvalds /* decompress an inflated block */
10381da177e4SLinus Torvalds {
10391da177e4SLinus Torvalds   unsigned t;           /* block type */
10401da177e4SLinus Torvalds   register ulg b;       /* bit buffer */
10411da177e4SLinus Torvalds   register unsigned k;  /* number of bits in bit buffer */
10421da177e4SLinus Torvalds 
10431da177e4SLinus Torvalds   DEBG("<blk");
10441da177e4SLinus Torvalds 
10451da177e4SLinus Torvalds   /* make local bit buffer */
10461da177e4SLinus Torvalds   b = bb;
10471da177e4SLinus Torvalds   k = bk;
10481da177e4SLinus Torvalds 
10491da177e4SLinus Torvalds 
10501da177e4SLinus Torvalds   /* read in last block bit */
10511da177e4SLinus Torvalds   NEEDBITS(1)
10521da177e4SLinus Torvalds   *e = (int)b & 1;
10531da177e4SLinus Torvalds   DUMPBITS(1)
10541da177e4SLinus Torvalds 
10551da177e4SLinus Torvalds 
10561da177e4SLinus Torvalds   /* read in block type */
10571da177e4SLinus Torvalds   NEEDBITS(2)
10581da177e4SLinus Torvalds   t = (unsigned)b & 3;
10591da177e4SLinus Torvalds   DUMPBITS(2)
10601da177e4SLinus Torvalds 
10611da177e4SLinus Torvalds 
10621da177e4SLinus Torvalds   /* restore the global bit buffer */
10631da177e4SLinus Torvalds   bb = b;
10641da177e4SLinus Torvalds   bk = k;
10651da177e4SLinus Torvalds 
10661da177e4SLinus Torvalds   /* inflate that block type */
10671da177e4SLinus Torvalds   if (t == 2)
10681da177e4SLinus Torvalds     return inflate_dynamic();
10691da177e4SLinus Torvalds   if (t == 0)
10701da177e4SLinus Torvalds     return inflate_stored();
10711da177e4SLinus Torvalds   if (t == 1)
10721da177e4SLinus Torvalds     return inflate_fixed();
10731da177e4SLinus Torvalds 
10741da177e4SLinus Torvalds   DEBG(">");
10751da177e4SLinus Torvalds 
10761da177e4SLinus Torvalds   /* bad block type */
10771da177e4SLinus Torvalds   return 2;
10781da177e4SLinus Torvalds 
10791da177e4SLinus Torvalds  underrun:
10801da177e4SLinus Torvalds   return 4;			/* Input underrun */
10811da177e4SLinus Torvalds }
10821da177e4SLinus Torvalds 
10831da177e4SLinus Torvalds 
10841da177e4SLinus Torvalds 
inflate(void)10851da177e4SLinus Torvalds STATIC int INIT inflate(void)
10861da177e4SLinus Torvalds /* decompress an inflated entry */
10871da177e4SLinus Torvalds {
10881da177e4SLinus Torvalds   int e;                /* last block flag */
10891da177e4SLinus Torvalds   int r;                /* result code */
10901da177e4SLinus Torvalds   unsigned h;           /* maximum struct huft's malloc'ed */
10911da177e4SLinus Torvalds 
10921da177e4SLinus Torvalds   /* initialize window, bit buffer */
10931da177e4SLinus Torvalds   wp = 0;
10941da177e4SLinus Torvalds   bk = 0;
10951da177e4SLinus Torvalds   bb = 0;
10961da177e4SLinus Torvalds 
10971da177e4SLinus Torvalds 
10981da177e4SLinus Torvalds   /* decompress until the last block */
10991da177e4SLinus Torvalds   h = 0;
11001da177e4SLinus Torvalds   do {
11011da177e4SLinus Torvalds     hufts = 0;
11022d6ffccaSThomas Petazzoni #ifdef ARCH_HAS_DECOMP_WDOG
11032d6ffccaSThomas Petazzoni     arch_decomp_wdog();
11042d6ffccaSThomas Petazzoni #endif
11052d6ffccaSThomas Petazzoni     r = inflate_block(&e);
11062d6ffccaSThomas Petazzoni     if (r)
11071da177e4SLinus Torvalds 	    return r;
11081da177e4SLinus Torvalds     if (hufts > h)
11091da177e4SLinus Torvalds       h = hufts;
11101da177e4SLinus Torvalds   } while (!e);
11111da177e4SLinus Torvalds 
11121da177e4SLinus Torvalds   /* Undo too much lookahead. The next read will be byte aligned so we
11131da177e4SLinus Torvalds    * can discard unused bits in the last meaningful byte.
11141da177e4SLinus Torvalds    */
11151da177e4SLinus Torvalds   while (bk >= 8) {
11161da177e4SLinus Torvalds     bk -= 8;
11171da177e4SLinus Torvalds     inptr--;
11181da177e4SLinus Torvalds   }
11191da177e4SLinus Torvalds 
11201da177e4SLinus Torvalds   /* flush out slide */
11211da177e4SLinus Torvalds   flush_output(wp);
11221da177e4SLinus Torvalds 
11231da177e4SLinus Torvalds 
11241da177e4SLinus Torvalds   /* return success */
11251da177e4SLinus Torvalds #ifdef DEBUG
11261da177e4SLinus Torvalds   fprintf(stderr, "<%u> ", h);
11271da177e4SLinus Torvalds #endif /* DEBUG */
11281da177e4SLinus Torvalds   return 0;
11291da177e4SLinus Torvalds }
11301da177e4SLinus Torvalds 
11311da177e4SLinus Torvalds /**********************************************************************
11321da177e4SLinus Torvalds  *
11331da177e4SLinus Torvalds  * The following are support routines for inflate.c
11341da177e4SLinus Torvalds  *
11351da177e4SLinus Torvalds  **********************************************************************/
11361da177e4SLinus Torvalds 
11371da177e4SLinus Torvalds static ulg crc_32_tab[256];
11381da177e4SLinus Torvalds static ulg crc;		/* initialized in makecrc() so it'll reside in bss */
11391da177e4SLinus Torvalds #define CRC_VALUE (crc ^ 0xffffffffUL)
11401da177e4SLinus Torvalds 
11411da177e4SLinus Torvalds /*
11421da177e4SLinus Torvalds  * Code to compute the CRC-32 table. Borrowed from
11431da177e4SLinus Torvalds  * gzip-1.0.3/makecrc.c.
11441da177e4SLinus Torvalds  */
11451da177e4SLinus Torvalds 
11461da177e4SLinus Torvalds static void INIT
makecrc(void)11471da177e4SLinus Torvalds makecrc(void)
11481da177e4SLinus Torvalds {
11491da177e4SLinus Torvalds /* Not copyrighted 1990 Mark Adler	*/
11501da177e4SLinus Torvalds 
11511da177e4SLinus Torvalds   unsigned long c;      /* crc shift register */
11521da177e4SLinus Torvalds   unsigned long e;      /* polynomial exclusive-or pattern */
11531da177e4SLinus Torvalds   int i;                /* counter for all possible eight bit values */
11541da177e4SLinus Torvalds   int k;                /* byte being shifted into crc apparatus */
11551da177e4SLinus Torvalds 
11561da177e4SLinus Torvalds   /* terms of polynomial defining this crc (except x^32): */
11571da177e4SLinus Torvalds   static const int p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
11581da177e4SLinus Torvalds 
11591da177e4SLinus Torvalds   /* Make exclusive-or pattern from polynomial */
11601da177e4SLinus Torvalds   e = 0;
11611da177e4SLinus Torvalds   for (i = 0; i < sizeof(p)/sizeof(int); i++)
11621da177e4SLinus Torvalds     e |= 1L << (31 - p[i]);
11631da177e4SLinus Torvalds 
11641da177e4SLinus Torvalds   crc_32_tab[0] = 0;
11651da177e4SLinus Torvalds 
11661da177e4SLinus Torvalds   for (i = 1; i < 256; i++)
11671da177e4SLinus Torvalds   {
11681da177e4SLinus Torvalds     c = 0;
11691da177e4SLinus Torvalds     for (k = i | 256; k != 1; k >>= 1)
11701da177e4SLinus Torvalds     {
11711da177e4SLinus Torvalds       c = c & 1 ? (c >> 1) ^ e : c >> 1;
11721da177e4SLinus Torvalds       if (k & 1)
11731da177e4SLinus Torvalds         c ^= e;
11741da177e4SLinus Torvalds     }
11751da177e4SLinus Torvalds     crc_32_tab[i] = c;
11761da177e4SLinus Torvalds   }
11771da177e4SLinus Torvalds 
11781da177e4SLinus Torvalds   /* this is initialized here so this code could reside in ROM */
11791da177e4SLinus Torvalds   crc = (ulg)0xffffffffUL; /* shift register contents */
11801da177e4SLinus Torvalds }
11811da177e4SLinus Torvalds 
11821da177e4SLinus Torvalds /* gzip flag byte */
11831da177e4SLinus Torvalds #define ASCII_FLAG   0x01 /* bit 0 set: file probably ASCII text */
11841da177e4SLinus Torvalds #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
11851da177e4SLinus Torvalds #define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
11861da177e4SLinus Torvalds #define ORIG_NAME    0x08 /* bit 3 set: original file name present */
11871da177e4SLinus Torvalds #define COMMENT      0x10 /* bit 4 set: file comment present */
11881da177e4SLinus Torvalds #define ENCRYPTED    0x20 /* bit 5 set: file is encrypted */
11891da177e4SLinus Torvalds #define RESERVED     0xC0 /* bit 6,7:   reserved */
11901da177e4SLinus Torvalds 
11911da177e4SLinus Torvalds /*
11921da177e4SLinus Torvalds  * Do the uncompression!
11931da177e4SLinus Torvalds  */
gunzip(void)11941da177e4SLinus Torvalds static int INIT gunzip(void)
11951da177e4SLinus Torvalds {
11961da177e4SLinus Torvalds     uch flags;
11971da177e4SLinus Torvalds     unsigned char magic[2]; /* magic header */
11981da177e4SLinus Torvalds     char method;
11991da177e4SLinus Torvalds     ulg orig_crc = 0;       /* original crc */
12001da177e4SLinus Torvalds     ulg orig_len = 0;       /* original uncompressed length */
12011da177e4SLinus Torvalds     int res;
12021da177e4SLinus Torvalds 
12031da177e4SLinus Torvalds     magic[0] = NEXTBYTE();
12041da177e4SLinus Torvalds     magic[1] = NEXTBYTE();
12051da177e4SLinus Torvalds     method   = NEXTBYTE();
12061da177e4SLinus Torvalds 
12071da177e4SLinus Torvalds     if (magic[0] != 037 ||
12081da177e4SLinus Torvalds 	((magic[1] != 0213) && (magic[1] != 0236))) {
12091da177e4SLinus Torvalds 	    error("bad gzip magic numbers");
12101da177e4SLinus Torvalds 	    return -1;
12111da177e4SLinus Torvalds     }
12121da177e4SLinus Torvalds 
12131da177e4SLinus Torvalds     /* We only support method #8, DEFLATED */
12141da177e4SLinus Torvalds     if (method != 8)  {
12151da177e4SLinus Torvalds 	    error("internal error, invalid method");
12161da177e4SLinus Torvalds 	    return -1;
12171da177e4SLinus Torvalds     }
12181da177e4SLinus Torvalds 
12191da177e4SLinus Torvalds     flags  = (uch)get_byte();
12201da177e4SLinus Torvalds     if ((flags & ENCRYPTED) != 0) {
12211da177e4SLinus Torvalds 	    error("Input is encrypted");
12221da177e4SLinus Torvalds 	    return -1;
12231da177e4SLinus Torvalds     }
12241da177e4SLinus Torvalds     if ((flags & CONTINUATION) != 0) {
12251da177e4SLinus Torvalds 	    error("Multi part input");
12261da177e4SLinus Torvalds 	    return -1;
12271da177e4SLinus Torvalds     }
12281da177e4SLinus Torvalds     if ((flags & RESERVED) != 0) {
12291da177e4SLinus Torvalds 	    error("Input has invalid flags");
12301da177e4SLinus Torvalds 	    return -1;
12311da177e4SLinus Torvalds     }
12321da177e4SLinus Torvalds     NEXTBYTE();	/* Get timestamp */
12331da177e4SLinus Torvalds     NEXTBYTE();
12341da177e4SLinus Torvalds     NEXTBYTE();
12351da177e4SLinus Torvalds     NEXTBYTE();
12361da177e4SLinus Torvalds 
12371da177e4SLinus Torvalds     (void)NEXTBYTE();  /* Ignore extra flags for the moment */
12381da177e4SLinus Torvalds     (void)NEXTBYTE();  /* Ignore OS type for the moment */
12391da177e4SLinus Torvalds 
12401da177e4SLinus Torvalds     if ((flags & EXTRA_FIELD) != 0) {
12411da177e4SLinus Torvalds 	    unsigned len = (unsigned)NEXTBYTE();
12421da177e4SLinus Torvalds 	    len |= ((unsigned)NEXTBYTE())<<8;
12431da177e4SLinus Torvalds 	    while (len--) (void)NEXTBYTE();
12441da177e4SLinus Torvalds     }
12451da177e4SLinus Torvalds 
12461da177e4SLinus Torvalds     /* Get original file name if it was truncated */
12471da177e4SLinus Torvalds     if ((flags & ORIG_NAME) != 0) {
12481da177e4SLinus Torvalds 	    /* Discard the old name */
12491da177e4SLinus Torvalds 	    while (NEXTBYTE() != 0) /* null */ ;
12501da177e4SLinus Torvalds     }
12511da177e4SLinus Torvalds 
12521da177e4SLinus Torvalds     /* Discard file comment if any */
12531da177e4SLinus Torvalds     if ((flags & COMMENT) != 0) {
12541da177e4SLinus Torvalds 	    while (NEXTBYTE() != 0) /* null */ ;
12551da177e4SLinus Torvalds     }
12561da177e4SLinus Torvalds 
12571da177e4SLinus Torvalds     /* Decompress */
12581da177e4SLinus Torvalds     if ((res = inflate())) {
12591da177e4SLinus Torvalds 	    switch (res) {
12601da177e4SLinus Torvalds 	    case 0:
12611da177e4SLinus Torvalds 		    break;
12621da177e4SLinus Torvalds 	    case 1:
12631da177e4SLinus Torvalds 		    error("invalid compressed format (err=1)");
12641da177e4SLinus Torvalds 		    break;
12651da177e4SLinus Torvalds 	    case 2:
12661da177e4SLinus Torvalds 		    error("invalid compressed format (err=2)");
12671da177e4SLinus Torvalds 		    break;
12681da177e4SLinus Torvalds 	    case 3:
12691da177e4SLinus Torvalds 		    error("out of memory");
12701da177e4SLinus Torvalds 		    break;
12711da177e4SLinus Torvalds 	    case 4:
12721da177e4SLinus Torvalds 		    error("out of input data");
12731da177e4SLinus Torvalds 		    break;
12741da177e4SLinus Torvalds 	    default:
12751da177e4SLinus Torvalds 		    error("invalid compressed format (other)");
12761da177e4SLinus Torvalds 	    }
12771da177e4SLinus Torvalds 	    return -1;
12781da177e4SLinus Torvalds     }
12791da177e4SLinus Torvalds 
12801da177e4SLinus Torvalds     /* Get the crc and original length */
12811da177e4SLinus Torvalds     /* crc32  (see algorithm.doc)
12821da177e4SLinus Torvalds      * uncompressed input size modulo 2^32
12831da177e4SLinus Torvalds      */
12841da177e4SLinus Torvalds     orig_crc = (ulg) NEXTBYTE();
12851da177e4SLinus Torvalds     orig_crc |= (ulg) NEXTBYTE() << 8;
12861da177e4SLinus Torvalds     orig_crc |= (ulg) NEXTBYTE() << 16;
12871da177e4SLinus Torvalds     orig_crc |= (ulg) NEXTBYTE() << 24;
12881da177e4SLinus Torvalds 
12891da177e4SLinus Torvalds     orig_len = (ulg) NEXTBYTE();
12901da177e4SLinus Torvalds     orig_len |= (ulg) NEXTBYTE() << 8;
12911da177e4SLinus Torvalds     orig_len |= (ulg) NEXTBYTE() << 16;
12921da177e4SLinus Torvalds     orig_len |= (ulg) NEXTBYTE() << 24;
12931da177e4SLinus Torvalds 
12941da177e4SLinus Torvalds     /* Validate decompression */
12951da177e4SLinus Torvalds     if (orig_crc != CRC_VALUE) {
12961da177e4SLinus Torvalds 	    error("crc error");
12971da177e4SLinus Torvalds 	    return -1;
12981da177e4SLinus Torvalds     }
12991da177e4SLinus Torvalds     if (orig_len != bytes_out) {
13001da177e4SLinus Torvalds 	    error("length error");
13011da177e4SLinus Torvalds 	    return -1;
13021da177e4SLinus Torvalds     }
13031da177e4SLinus Torvalds     return 0;
13041da177e4SLinus Torvalds 
13051da177e4SLinus Torvalds  underrun:			/* NEXTBYTE() goto's here if needed */
13061da177e4SLinus Torvalds     error("out of input data");
13071da177e4SLinus Torvalds     return -1;
13081da177e4SLinus Torvalds }
13091da177e4SLinus Torvalds 
13101da177e4SLinus Torvalds 
1311