1ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* inftrees.c -- generate Huffman trees for efficient decoding 2ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Copyright (C) 1995-2002 Mark Adler 3ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * For conditions of distribution and use, see copyright notice in zlib.h 4ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 5ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 6ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "zutil.h" 7ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "inftrees.h" 8ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 9ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if !defined(BUILDFIXED) && !defined(STDC) 10ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */ 11ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 12ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 13ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 14ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if 0 15ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal const char inflate_copyright[] = 16ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease " inflate 1.1.4 Copyright 1995-2002 Mark Adler "; 17ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 18ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* 19ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease If you use the zlib library in a product, an acknowledgment is welcome 20ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease in the documentation of your product. If for some reason you cannot 21ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease include such an acknowledgment, I would appreciate that you keep this 22ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease copyright string in the executable of your product. 23ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 24ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 25ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* simplify the use of the inflate_huft type with some defines */ 26ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define exop word.what.Exop 27ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define bits word.what.Bits 28ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 30ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int huft_build OF(( 31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf *, /* code lengths in bits */ 32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt, /* number of codes */ 33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt, /* number of "simple" codes */ 34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const uIntf *, /* list of base values for non-simple codes */ 35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const uIntf *, /* list of extra bits for non-simple codes */ 36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft * FAR*,/* result: starting table */ 37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf *, /* maximum lookup bits (returns actual) */ 38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft *, /* space for trees */ 39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt *, /* hufts used in space */ 40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf * )); /* space for values */ 41ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 42ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* Tables for deflate from PKZIP's appnote.txt. */ 43ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ 44ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 45ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; 46ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* see note #13 above about 258 */ 47ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ 48ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ 50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ 51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 8193, 12289, 16385, 24577}; 54ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal const uInt cpdext[30] = { /* Extra bits for distance codes */ 55ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 56ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 57ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 12, 12, 13, 13}; 58ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 59ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* 60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Huffman code decoding is performed using a multi-level table lookup. 61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease The fastest way to decode is to simply build a lookup table whose 62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease size is determined by the longest code. However, the time it takes 63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease to build this table can also be a factor if the data being decoded 64ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease is not very long. The most common codes are necessarily the 65ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease shortest codes, so those codes dominate the decoding time, and hence 66ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease the speed. The idea is you can have a shorter table that decodes the 67ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease shorter, more probable codes, and then point to subsidiary tables for 68ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease the longer codes. The time it costs to decode the longer codes is 69ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease then traded against the time it takes to make longer tables. 70ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 71ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease This results of this trade are in the variables lbits and dbits 72ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease below. lbits is the number of bits the first level table for literal/ 73ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease length codes can decode in one step, and dbits is the same thing for 74ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease the distance codes. Subsequent tables are also less than or equal to 75ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease those sizes. These values may be adjusted either when all of the 76ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease codes are shorter than that, in which case the longest code length in 77ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease bits is used, or when the shortest code is *longer* than the requested 78ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease table size, in which case the length of the shortest code in bits is 79ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease used. 80ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 81ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease There are two different values for the two tables, since they code a 82ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease different number of possibilities each. The literal/length table 83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease codes 286 possible values, or in a flat code, a little over eight 84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease bits. The distance table codes 30 possible values, or a little less 85ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease than five bits, flat. The optimum values for speed end up being 86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease about one bit more than those, so lbits is 8+1 and dbits is 5+1. 87ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease The optimum values may differ though from machine to machine, and 88ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease possibly even between compilers. Your mileage may vary. 89ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 90ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 92ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ 93ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define BMAX 15 /* maximum bit length of any code */ 94ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 95ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int huft_build( /* b, n, s, d, e, t, m, hp, hn, v) */ 96ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *b, /* code lengths in bits (all assumed <= BMAX) */ 97ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuInt n, /* number of codes (assumed <= 288) */ 98ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuInt s, /* number of simple-valued codes (0..s-1) */ 99ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseconst uIntf *d, /* list of base values for non-simple codes */ 100ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseconst uIntf *e, /* list of extra bits for non-simple codes */ 101ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft * FAR *t, /* result: starting table */ 102ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *m, /* maximum lookup bits, returns actual */ 103ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft *hp, /* space for trees */ 104ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuInt *hn, /* hufts used in space */ 105ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *v /* working area: values in order of bit length */ 106ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* Given a list of code lengths and a maximum table size, make a set of 107ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR 108ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if the given code set is incomplete (the tables are still built in this 109ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case), or Z_DATA_ERROR if the input is invalid. */ 110ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease) 111ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 112ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 113ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt a; /* counter for codes of length k */ 114ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt c[BMAX+1]; /* bit length count table */ 115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt f; /* i repeats in table every f entries */ 116ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int g; /* maximum code length */ 117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int h; /* table level */ 118fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki uInt i; /* counter, current code */ 119fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki uInt j; /* counter */ 120fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki int k; /* number of bits in current code */ 121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int l; /* bits per table (returned in m) */ 122ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ 123fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki uIntf *p; /* pointer into c[], b[], or v[] */ 124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft *q; /* points to current table */ 125ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease struct inflate_huft_s r; /* table entry for structure assignment */ 126ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft *u[BMAX]; /* table stack */ 127fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki int w; /* bits before this table == (l * h) */ 128ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt x[BMAX+1]; /* bit offsets, then code stack */ 129ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf *xp; /* pointer into x */ 130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int y; /* number of dummy codes added */ 131ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt z; /* number of entries in current table */ 132ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 133ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 134ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Make compiler happy */ 135ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.base = 0; 136ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 137ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Generate counts for each bit length */ 138ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease p = c; 139ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define C0 *p++ = 0; 140ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define C2 C0 C0 C0 C0 141ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define C4 C2 C2 C2 C2 142ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease C4 /* clear c[]--assume BMAX+1 is 16 */ 143ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease p = b; i = n; 144ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease do { 145ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c[*p++]++; /* assume all entries <= BMAX */ 146ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } while (--i); 147ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (c[0] == n) /* null input--all zero length codes */ 148ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 149ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *t = (inflate_huft *)Z_NULL; 150ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *m = 0; 151ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_OK; 152ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 153ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 154ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 155ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Find minimum and maximum length, bound *m by those */ 156ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease l = *m; 157ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (j = 1; j <= BMAX; j++) 158ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (c[j]) 159ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 160ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease k = j; /* minimum code length */ 161ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((uInt)l < j) 162ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease l = j; 163ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (i = BMAX; i; i--) 164ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (c[i]) 165ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 166ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease g = i; /* maximum code length */ 167ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((uInt)l > i) 168ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease l = i; 169ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *m = l; 170ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 171ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 172ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Adjust last length count to fill out codes, if needed */ 173ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (y = 1 << j; j < i; j++, y <<= 1) 174ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((y -= c[j]) < 0) 175ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_DATA_ERROR; 176ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((y -= c[i]) < 0) 177ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_DATA_ERROR; 178ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c[i] += y; 179ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 180ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 181ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Generate starting offsets into the value table for each length */ 182ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease x[1] = j = 0; 183ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease p = c + 1; xp = x + 2; 184ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (--i) { /* note that i == g from above */ 185ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *xp++ = (j += *p++); 186ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 187ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 188ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 189ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Make a table of values in order of bit lengths */ 190ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease p = b; i = 0; 191ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease do { 192ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((j = *p++) != 0) 193ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease v[x[j]++] = i; 194ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } while (++i < n); 195ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease n = x[g]; /* set n to length of v */ 196ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 197ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 198ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Generate the Huffman codes and for each, make the table entries */ 199ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease x[0] = i = 0; /* first Huffman code is zero */ 200ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease p = v; /* grab values in bit order */ 201ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease h = -1; /* no tables yet--level -1 */ 202ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease w = -l; /* bits decoded == (l * h) */ 203ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ 204ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease q = (inflate_huft *)Z_NULL; /* ditto */ 205ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z = 0; /* ditto */ 206ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 207ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* go through the bit lengths (k already is bits in shortest code) */ 208ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (; k <= g; k++) 209ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 210ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease a = c[k]; 211ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (a--) 212ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 213ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* here i is the Huffman code of length k bits for value *p */ 214ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* make tables up to required level */ 215ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (k > w + l) 216ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 217ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease h++; 218ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease w += l; /* previous table always l bits */ 219ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 220ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* compute minimum size table less than or equal to l bits */ 221ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z = g - w; 222ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z = z > (uInt)l ? (uInt)l : z; /* table size upper limit */ 223ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ 224ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { /* too few codes for k-w bit table */ 225ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease f -= a + 1; /* deduct codes from patterns left */ 226ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease xp = c + k; 227ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (j < z) 228ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (++j < z) /* try smaller tables up to z bits */ 229ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 230ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((f <<= 1) <= *++xp) 231ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; /* enough codes to use up j bits */ 232ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease f -= *xp; /* else deduct codes from patterns */ 233ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 234ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 235ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z = 1 << j; /* table entries for j-bit table */ 236ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 237ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* allocate new table */ 238ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ 239ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_DATA_ERROR; /* overflow of MANY */ 240ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease u[h] = q = hp + *hn; 241ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *hn += z; 242ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 243ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* connect to last table, if there is one */ 244ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (h) 245ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 246ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease x[h] = i; /* save pattern for backing up */ 247ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.bits = (Byte)l; /* bits to dump before this table */ 248ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.exop = (Byte)j; /* bits in this table */ 249ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease j = i >> (w - l); 250ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ 251ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease u[h-1][j] = r; /* connect to last table */ 252ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 253ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else 254ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *t = q; /* first table is returned result */ 255ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 256ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 257ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* set up table entry in r */ 258ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.bits = (Byte)(k - w); 259ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (p >= v + n) 260ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.exop = 128 + 64; /* out of values--invalid code */ 261ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else if (*p < s) 262ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 263ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ 264ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.base = *p++; /* simple code is just the value */ 265ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 266ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else 267ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 268ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ 269ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r.base = d[*p++ - s]; 270ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 271ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 272ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* fill code-like entries with r */ 273ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease f = 1 << (k - w); 274ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (j = i >> w; j < z; j += f) 275ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease q[j] = r; 276ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 277ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* backwards increment the k-bit code i */ 278ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (j = 1 << (k - 1); i & j; j >>= 1) 279ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease i ^= j; 280ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease i ^= j; 281ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 282ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* backup over finished tables */ 283ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease mask = (1 << w) - 1; /* needed on HP, cc -O bug */ 284ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while ((i & mask) != x[h]) 285ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 286ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease h--; /* don't need to update q */ 287ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease w -= l; 288ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease mask = (1 << w) - 1; 289ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 290ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 291ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 292ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 293ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 294ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Return Z_BUF_ERROR if we were given an incomplete table */ 295ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; 296ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 297ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 298ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 299ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int inflate_trees_bits( /* c, bb, tb, hp, z) */ 300ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *c, /* 19 code lengths */ 301ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *bb, /* bits tree desired/actual depth */ 302ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft * FAR *tb, /* bits tree result */ 303ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft *hp, /* space for trees */ 304ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z /* for messages */ 305ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease) 306ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 307ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int r; 308ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt hn = 0; /* hufts used in space */ 309ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf *v; /* work area for huft_build */ 310ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 311ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL) 312ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_MEM_ERROR; 313ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, 314ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease tb, bb, hp, &hn, v); 315ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r == Z_DATA_ERROR) 316ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"oversubscribed dynamic bit lengths tree"; 317ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else if (r == Z_BUF_ERROR || *bb == 0) 318ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 319ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"incomplete dynamic bit lengths tree"; 320ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_DATA_ERROR; 321ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 322ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, v); 323ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return r; 324ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 325ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 326ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 327ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int inflate_trees_dynamic( /* nl, nd, c, bl, bd, tl, td, hp, z) */ 328ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuInt nl, /* number of literal/length codes */ 329ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuInt nd, /* number of distance codes */ 330ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *c, /* that many (total) code lengths */ 331ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *bl, /* literal desired/actual bit depth */ 332ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *bd, /* distance desired/actual bit depth */ 333ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft * FAR *tl, /* literal/length tree result */ 334ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft * FAR *td, /* distance tree result */ 335ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft *hp, /* space for trees */ 336ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z /* for messages */ 337ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease) 338ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 339ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int r; 340ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt hn = 0; /* hufts used in space */ 341ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf *v; /* work area for huft_build */ 342ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 343ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* allocate work area */ 344ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) 345ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_MEM_ERROR; 346ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 347ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* build literal/length tree */ 348ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); 349ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r != Z_OK || *bl == 0) 350ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 351ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r == Z_DATA_ERROR) 352ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"oversubscribed literal/length tree"; 353ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else if (r != Z_MEM_ERROR) 354ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 355ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"incomplete literal/length tree"; 356ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_DATA_ERROR; 357ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 358ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, v); 359ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return r; 360ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 361ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 362ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* build distance tree */ 363ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); 364ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r != Z_OK || (*bd == 0 && nl > 257)) 365ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 366ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r == Z_DATA_ERROR) 367ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"oversubscribed distance tree"; 368ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else if (r == Z_BUF_ERROR) { 369ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if 0 370ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 371ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 372ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef PKZIP_BUG_WORKAROUND 373ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_OK; 374ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 375ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#else 376ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"incomplete distance tree"; 377ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_DATA_ERROR; 378ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 379ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease else if (r != Z_MEM_ERROR) 380ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 381ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"empty distance tree with lengths"; 382ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_DATA_ERROR; 383ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 384ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, v); 385ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return r; 386ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 387ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 388ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 389ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* done */ 390ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, v); 391ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_OK; 392ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 393ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 394ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 395ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* build fixed tables only once--keep them here */ 396ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef BUILDFIXED 397ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int fixed_built = 0; 398ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define FIXEDH 544 /* number of hufts used by fixed tables */ 399ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal inflate_huft fixed_mem[FIXEDH]; 400ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal uInt fixed_bl; 401ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal uInt fixed_bd; 402ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal inflate_huft *fixed_tl; 403ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal inflate_huft *fixed_td; 404ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#else 405ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "inffixed.h" 406ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 407ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 408ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 409ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int inflate_trees_fixed( /* bl, bd, tl, td, z) */ 410ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *bl, /* literal desired/actual bit depth */ 411ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuIntf *bd, /* distance desired/actual bit depth */ 412ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseconst inflate_huft * FAR *tl, /* literal/length tree result */ 413ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseconst inflate_huft * FAR *td, /* distance tree result */ 414ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z /* for memory allocation */ 415ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease) 416ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 417ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef BUILDFIXED 418ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* build fixed tables if not already */ 419ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (!fixed_built) 420ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 421ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int k; /* temporary variable */ 422ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt f = 0; /* number of hufts used in fixed_mem */ 423ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf *c; /* length list for huft_build */ 424ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uIntf *v; /* work area for huft_build */ 425ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 426ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* allocate memory */ 427ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) 428ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_MEM_ERROR; 429ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) 430ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 431ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, c); 432ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_MEM_ERROR; 433ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 434ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 435ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* literal table */ 436ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (k = 0; k < 144; k++) 437ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c[k] = 8; 438ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (; k < 256; k++) 439ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c[k] = 9; 440ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (; k < 280; k++) 441ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c[k] = 7; 442ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (; k < 288; k++) 443ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c[k] = 8; 444ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease fixed_bl = 9; 445ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, 446ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease fixed_mem, &f, v); 447ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 448ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* distance table */ 449ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (k = 0; k < 30; k++) 450ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c[k] = 5; 451ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease fixed_bd = 5; 452ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, 453ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease fixed_mem, &f, v); 454ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 455ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* done */ 456ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, v); 457ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, c); 458ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease fixed_built = 1; 459ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 460ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#else 461ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_UNUSED(z); 462ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 463ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *bl = fixed_bl; 464ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *bd = fixed_bd; 465ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *tl = fixed_tl; 466ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *td = fixed_td; 467ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_OK; 468ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 469