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