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