comparison src/com/jcraft/jzlib/InfTree.java @ 0:0ce5cc452d02

initial version
author Carl Byington <carl@five-ten-sg.com>
date Thu, 22 May 2014 10:41:19 -0700
parents
children 46c2115ae1c8
comparison
equal deleted inserted replaced
-1:000000000000 0:0ce5cc452d02
1 /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
2 /*
3 Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7
8 1. Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10
11 2. Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in
13 the documentation and/or other materials provided with the distribution.
14
15 3. The names of the authors may not be used to endorse or promote products
16 derived from this software without specific prior written permission.
17
18 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
19 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
21 INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
22 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 /*
30 * This program is based on zlib-1.1.3, so all credit should go authors
31 * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
32 * and contributors of zlib.
33 */
34
35 package com.jcraft.jzlib;
36
37 final class InfTree {
38
39 static final private int MANY = 1440;
40
41 static final private int Z_OK = 0;
42 static final private int Z_STREAM_END = 1;
43 static final private int Z_NEED_DICT = 2;
44 static final private int Z_ERRNO = -1;
45 static final private int Z_STREAM_ERROR = -2;
46 static final private int Z_DATA_ERROR = -3;
47 static final private int Z_MEM_ERROR = -4;
48 static final private int Z_BUF_ERROR = -5;
49 static final private int Z_VERSION_ERROR = -6;
50
51 static final int fixed_bl = 9;
52 static final int fixed_bd = 5;
53
54 static final int[] fixed_tl = {
55 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115,
56 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192,
57 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160,
58 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224,
59 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144,
60 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208,
61 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176,
62 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240,
63 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227,
64 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200,
65 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168,
66 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232,
67 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152,
68 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216,
69 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184,
70 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248,
71 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163,
72 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196,
73 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164,
74 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228,
75 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148,
76 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212,
77 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180,
78 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244,
79 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0,
80 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204,
81 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172,
82 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236,
83 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156,
84 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220,
85 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188,
86 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252,
87 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131,
88 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194,
89 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162,
90 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226,
91 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146,
92 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210,
93 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178,
94 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242,
95 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258,
96 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202,
97 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170,
98 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234,
99 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154,
100 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218,
101 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186,
102 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250,
103 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195,
104 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198,
105 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166,
106 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230,
107 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150,
108 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214,
109 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182,
110 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246,
111 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0,
112 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206,
113 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174,
114 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238,
115 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158,
116 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222,
117 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190,
118 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254,
119 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115,
120 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193,
121
122 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161,
123 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225,
124 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145,
125 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209,
126 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177,
127 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241,
128 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227,
129 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201,
130 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169,
131 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233,
132 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153,
133 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217,
134 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185,
135 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249,
136 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163,
137 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197,
138 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165,
139 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229,
140 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149,
141 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213,
142 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181,
143 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245,
144 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0,
145 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205,
146 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173,
147 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237,
148 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157,
149 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221,
150 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189,
151 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 253,
152 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131,
153 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195,
154 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163,
155 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227,
156 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147,
157 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211,
158 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179,
159 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243,
160 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258,
161 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203,
162 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171,
163 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235,
164 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155,
165 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219,
166 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187,
167 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251,
168 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195,
169 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199,
170 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167,
171 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231,
172 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151,
173 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215,
174 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183,
175 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247,
176 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0,
177 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207,
178 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175,
179 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239,
180 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159,
181 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223,
182 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191,
183 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255
184 };
185 static final int[] fixed_td = {
186 80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097,
187 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385,
188 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193,
189 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577,
190 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145,
191 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577,
192 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289,
193 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577
194 };
195
196 // Tables for deflate from PKZIP's appnote.txt.
197 static final int[] cplens = { // Copy lengths for literal codes 257..285
198 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
199 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
200 };
201
202 // see note #13 above about 258
203 static final int[] cplext = { // Extra bits for literal codes 257..285
204 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
205 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112 // 112==invalid
206 };
207
208 static final int[] cpdist = { // Copy offsets for distance codes 0..29
209 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
210 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
211 8193, 12289, 16385, 24577
212 };
213
214 static final int[] cpdext = { // Extra bits for distance codes
215 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
216 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
217 12, 12, 13, 13
218 };
219
220 // If BMAX needs to be larger than 16, then h and x[] should be uLong.
221 static final int BMAX = 15; // maximum bit length of any code
222
223 int[] hn = null; // hufts used in space
224 int[] v = null; // work area for huft_build
225 int[] c = null; // bit length count table
226 int[] r = null; // table entry for structure assignment
227 int[] u = null; // table stack
228 int[] x = null; // bit offsets, then code stack
229
230 private int huft_build(int[] b, // code lengths in bits (all assumed <= BMAX)
231 int bindex,
232 int n, // number of codes (assumed <= 288)
233 int s, // number of simple-valued codes (0..s-1)
234 int[] d, // list of base values for non-simple codes
235 int[] e, // list of extra bits for non-simple codes
236 int[] t, // result: starting table
237 int[] m, // maximum lookup bits, returns actual
238 int[] hp,// space for trees
239 int[] hn,// hufts used in space
240 int[] v // working area: values in order of bit length
241 ) {
242 // Given a list of code lengths and a maximum table size, make a set of
243 // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
244 // if the given code set is incomplete (the tables are still built in this
245 // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
246 // lengths), or Z_MEM_ERROR if not enough memory.
247 int a; // counter for codes of length k
248 int f; // i repeats in table every f entries
249 int g; // maximum code length
250 int h; // table level
251 int i; // counter, current code
252 int j; // counter
253 int k; // number of bits in current code
254 int l; // bits per table (returned in m)
255 int mask; // (1 << w) - 1, to avoid cc -O bug on HP
256 int p; // pointer into c[], b[], or v[]
257 int q; // points to current table
258 int w; // bits before this table == (l * h)
259 int xp; // pointer into x
260 int y; // number of dummy codes added
261 int z; // number of entries in current table
262 // Generate counts for each bit length
263 p = 0; i = n;
264
265 do {
266 c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX
267 }
268 while (i != 0);
269
270 if (c[0] == n) { // null input--all zero length codes
271 t[0] = -1;
272 m[0] = 0;
273 return Z_OK;
274 }
275
276 // Find minimum and maximum length, bound *m by those
277 l = m[0];
278
279 for (j = 1; j <= BMAX; j++)
280 if (c[j] != 0) break;
281
282 k = j; // minimum code length
283
284 if (l < j) {
285 l = j;
286 }
287
288 for (i = BMAX; i != 0; i--) {
289 if (c[i] != 0) break;
290 }
291
292 g = i; // maximum code length
293
294 if (l > i) {
295 l = i;
296 }
297
298 m[0] = l;
299
300 // Adjust last length count to fill out codes, if needed
301 for (y = 1 << j; j < i; j++, y <<= 1) {
302 if ((y -= c[j]) < 0) {
303 return Z_DATA_ERROR;
304 }
305 }
306
307 if ((y -= c[i]) < 0) {
308 return Z_DATA_ERROR;
309 }
310
311 c[i] += y;
312 // Generate starting offsets into the value table for each length
313 x[1] = j = 0;
314 p = 1; xp = 2;
315
316 while (--i != 0) { // note that i == g from above
317 x[xp] = (j += c[p]);
318 xp++;
319 p++;
320 }
321
322 // Make a table of values in order of bit lengths
323 i = 0; p = 0;
324
325 do {
326 if ((j = b[bindex + p]) != 0) {
327 v[x[j]++] = i;
328 }
329
330 p++;
331 }
332 while (++i < n);
333
334 n = x[g]; // set n to length of v
335 // Generate the Huffman codes and for each, make the table entries
336 x[0] = i = 0; // first Huffman code is zero
337 p = 0; // grab values in bit order
338 h = -1; // no tables yet--level -1
339 w = -l; // bits decoded == (l * h)
340 u[0] = 0; // just to keep compilers happy
341 q = 0; // ditto
342 z = 0; // ditto
343
344 // go through the bit lengths (k already is bits in shortest code)
345 for (; k <= g; k++) {
346 a = c[k];
347
348 while (a-- != 0) {
349 // here i is the Huffman code of length k bits for value *p
350 // make tables up to required level
351 while (k > w + l) {
352 h++;
353 w += l; // previous table always l bits
354 // compute minimum size table less than or equal to l bits
355 z = g - w;
356 z = (z > l) ? l : z; // table size upper limit
357
358 if ((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table
359 // too few codes for k-w bit table
360 f -= a + 1; // deduct codes from patterns left
361 xp = k;
362
363 if (j < z) {
364 while (++j < z) { // try smaller tables up to z bits
365 if ((f <<= 1) <= c[++xp])
366 break; // enough codes to use up j bits
367
368 f -= c[xp]; // else deduct codes from patterns
369 }
370 }
371 }
372
373 z = 1 << j; // table entries for j-bit table
374
375 // allocate new table
376 if (hn[0] + z > MANY) { // (note: doesn't matter for fixed)
377 return Z_DATA_ERROR; // overflow of MANY
378 }
379
380 u[h] = q = /*hp+*/ hn[0]; // DEBUG
381 hn[0] += z;
382
383 // connect to last table, if there is one
384 if (h != 0) {
385 x[h] = i; // save pattern for backing up
386 r[0] = (byte)j; // bits in this table
387 r[1] = (byte)l; // bits to dump before this table
388 j = i >>> (w - l);
389 r[2] = (int)(q - u[h - 1] - j); // offset to this table
390 System.arraycopy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table
391 }
392 else {
393 t[0] = q; // first table is returned result
394 }
395 }
396
397 // set up table entry in r
398 r[1] = (byte)(k - w);
399
400 if (p >= n) {
401 r[0] = 128 + 64; // out of values--invalid code
402 }
403 else if (v[p] < s) {
404 r[0] = (byte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block
405 r[2] = v[p++]; // simple code is just the value
406 }
407 else {
408 r[0] = (byte)(e[v[p] - s] + 16 + 64); // non-simple--look up in lists
409 r[2] = d[v[p++] - s];
410 }
411
412 // fill code-like entries with r
413 f = 1 << (k - w);
414
415 for (j = i >>> w; j < z; j += f) {
416 System.arraycopy(r, 0, hp, (q + j) * 3, 3);
417 }
418
419 // backwards increment the k-bit code i
420 for (j = 1 << (k - 1); (i & j) != 0; j >>>= 1) {
421 i ^= j;
422 }
423
424 i ^= j;
425 // backup over finished tables
426 mask = (1 << w) - 1; // needed on HP, cc -O bug
427
428 while ((i & mask) != x[h]) {
429 h--; // don't need to update q
430 w -= l;
431 mask = (1 << w) - 1;
432 }
433 }
434 }
435
436 // Return Z_BUF_ERROR if we were given an incomplete table
437 return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
438 }
439
440 int inflate_trees_bits(int[] c, // 19 code lengths
441 int[] bb, // bits tree desired/actual depth
442 int[] tb, // bits tree result
443 int[] hp, // space for trees
444 ZStream z // for messages
445 ) {
446 int result;
447 initWorkArea(19);
448 hn[0] = 0;
449 result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v);
450
451 if (result == Z_DATA_ERROR) {
452 z.msg = "oversubscribed dynamic bit lengths tree";
453 }
454 else if (result == Z_BUF_ERROR || bb[0] == 0) {
455 z.msg = "incomplete dynamic bit lengths tree";
456 result = Z_DATA_ERROR;
457 }
458
459 return result;
460 }
461
462 int inflate_trees_dynamic(int nl, // number of literal/length codes
463 int nd, // number of distance codes
464 int[] c, // that many (total) code lengths
465 int[] bl, // literal desired/actual bit depth
466 int[] bd, // distance desired/actual bit depth
467 int[] tl, // literal/length tree result
468 int[] td, // distance tree result
469 int[] hp, // space for trees
470 ZStream z // for messages
471 ) {
472 int result;
473 // build literal/length tree
474 initWorkArea(288);
475 hn[0] = 0;
476 result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v);
477
478 if (result != Z_OK || bl[0] == 0) {
479 if (result == Z_DATA_ERROR) {
480 z.msg = "oversubscribed literal/length tree";
481 }
482 else if (result != Z_MEM_ERROR) {
483 z.msg = "incomplete literal/length tree";
484 result = Z_DATA_ERROR;
485 }
486
487 return result;
488 }
489
490 // build distance tree
491 initWorkArea(288);
492 result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v);
493
494 if (result != Z_OK || (bd[0] == 0 && nl > 257)) {
495 if (result == Z_DATA_ERROR) {
496 z.msg = "oversubscribed distance tree";
497 }
498 else if (result == Z_BUF_ERROR) {
499 z.msg = "incomplete distance tree";
500 result = Z_DATA_ERROR;
501 }
502 else if (result != Z_MEM_ERROR) {
503 z.msg = "empty distance tree with lengths";
504 result = Z_DATA_ERROR;
505 }
506
507 return result;
508 }
509
510 return Z_OK;
511 }
512
513 static int inflate_trees_fixed(int[] bl, //literal desired/actual bit depth
514 int[] bd, //distance desired/actual bit depth
515 int[][] tl,//literal/length tree result
516 int[][] td,//distance tree result
517 ZStream z //for memory allocation
518 ) {
519 bl[0] = fixed_bl;
520 bd[0] = fixed_bd;
521 tl[0] = fixed_tl;
522 td[0] = fixed_td;
523 return Z_OK;
524 }
525
526 private void initWorkArea(int vsize) {
527 if (hn == null) {
528 hn = new int[1];
529 v = new int[vsize];
530 c = new int[BMAX + 1];
531 r = new int[3];
532 u = new int[BMAX];
533 x = new int[BMAX + 1];
534 }
535
536 if (v.length < vsize) { v = new int[vsize]; }
537
538 for (int i = 0; i < vsize; i++) {v[i] = 0;}
539
540 for (int i = 0; i < BMAX + 1; i++) {c[i] = 0;}
541
542 for (int i = 0; i < 3; i++) {r[i] = 0;}
543
544 // for(int i=0; i<BMAX; i++){u[i]=0;}
545 System.arraycopy(c, 0, u, 0, BMAX);
546 // for(int i=0; i<BMAX+1; i++){x[i]=0;}
547 System.arraycopy(c, 0, x, 0, BMAX + 1);
548 }
549 }