]>
Commit | Line | Data |
---|---|---|
0763e16d JW |
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 | // If BMAX needs to be larger than 16, then h and x[] should be uLong. | |
220 | static final int BMAX=15; // maximum bit length of any code | |
221 | ||
222 | int[] hn = null; // hufts used in space | |
223 | int[] v = null; // work area for huft_build | |
224 | int[] c = null; // bit length count table | |
225 | int[] r = null; // table entry for structure assignment | |
226 | int[] u = null; // table stack | |
227 | int[] x = null; // bit offsets, then code stack | |
228 | ||
229 | private int huft_build(int[] b, // code lengths in bits (all assumed <= BMAX) | |
230 | int bindex, | |
231 | int n, // number of codes (assumed <= 288) | |
232 | int s, // number of simple-valued codes (0..s-1) | |
233 | int[] d, // list of base values for non-simple codes | |
234 | int[] e, // list of extra bits for non-simple codes | |
235 | int[] t, // result: starting table | |
236 | int[] m, // maximum lookup bits, returns actual | |
237 | int[] hp,// space for trees | |
238 | int[] hn,// hufts used in space | |
239 | int[] v // working area: values in order of bit length | |
240 | ){ | |
241 | // Given a list of code lengths and a maximum table size, make a set of | |
242 | // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR | |
243 | // if the given code set is incomplete (the tables are still built in this | |
244 | // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of | |
245 | // lengths), or Z_MEM_ERROR if not enough memory. | |
246 | ||
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 | ||
263 | // Generate counts for each bit length | |
264 | ||
265 | p = 0; i = n; | |
266 | do { | |
267 | c[b[bindex+p]]++; p++; i--; // assume all entries <= BMAX | |
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 | for (j = 1; j <= BMAX; j++) | |
279 | if(c[j]!=0) break; | |
280 | k = j; // minimum code length | |
281 | if(l < j){ | |
282 | l = j; | |
283 | } | |
284 | for (i = BMAX; i!=0; i--){ | |
285 | if(c[i]!=0) break; | |
286 | } | |
287 | g = i; // maximum code length | |
288 | if(l > i){ | |
289 | l = i; | |
290 | } | |
291 | m[0] = l; | |
292 | ||
293 | // Adjust last length count to fill out codes, if needed | |
294 | for (y = 1 << j; j < i; j++, y <<= 1){ | |
295 | if ((y -= c[j]) < 0){ | |
296 | return Z_DATA_ERROR; | |
297 | } | |
298 | } | |
299 | if ((y -= c[i]) < 0){ | |
300 | return Z_DATA_ERROR; | |
301 | } | |
302 | c[i] += y; | |
303 | ||
304 | // Generate starting offsets into the value table for each length | |
305 | x[1] = j = 0; | |
306 | p = 1; xp = 2; | |
307 | while (--i!=0) { // note that i == g from above | |
308 | x[xp] = (j += c[p]); | |
309 | xp++; | |
310 | p++; | |
311 | } | |
312 | ||
313 | // Make a table of values in order of bit lengths | |
314 | i = 0; p = 0; | |
315 | do { | |
316 | if ((j = b[bindex+p]) != 0){ | |
317 | v[x[j]++] = i; | |
318 | } | |
319 | p++; | |
320 | } | |
321 | while (++i < n); | |
322 | n = x[g]; // set n to length of v | |
323 | ||
324 | // Generate the Huffman codes and for each, make the table entries | |
325 | x[0] = i = 0; // first Huffman code is zero | |
326 | p = 0; // grab values in bit order | |
327 | h = -1; // no tables yet--level -1 | |
328 | w = -l; // bits decoded == (l * h) | |
329 | u[0] = 0; // just to keep compilers happy | |
330 | q = 0; // ditto | |
331 | z = 0; // ditto | |
332 | ||
333 | // go through the bit lengths (k already is bits in shortest code) | |
334 | for (; k <= g; k++){ | |
335 | a = c[k]; | |
336 | while (a--!=0){ | |
337 | // here i is the Huffman code of length k bits for value *p | |
338 | // make tables up to required level | |
339 | while (k > w + l){ | |
340 | h++; | |
341 | w += l; // previous table always l bits | |
342 | // compute minimum size table less than or equal to l bits | |
343 | z = g - w; | |
344 | z = (z > l) ? l : z; // table size upper limit | |
345 | if((f=1<<(j=k-w))>a+1){ // try a k-w bit table | |
346 | // too few codes for k-w bit table | |
347 | f -= a + 1; // deduct codes from patterns left | |
348 | xp = k; | |
349 | if(j < z){ | |
350 | while (++j < z){ // try smaller tables up to z bits | |
351 | if((f <<= 1) <= c[++xp]) | |
352 | break; // enough codes to use up j bits | |
353 | f -= c[xp]; // else deduct codes from patterns | |
354 | } | |
355 | } | |
356 | } | |
357 | z = 1 << j; // table entries for j-bit table | |
358 | ||
359 | // allocate new table | |
360 | if (hn[0] + z > MANY){ // (note: doesn't matter for fixed) | |
361 | return Z_DATA_ERROR; // overflow of MANY | |
362 | } | |
363 | u[h] = q = /*hp+*/ hn[0]; // DEBUG | |
364 | hn[0] += z; | |
365 | ||
366 | // connect to last table, if there is one | |
367 | if(h!=0){ | |
368 | x[h]=i; // save pattern for backing up | |
369 | r[0]=(byte)j; // bits in this table | |
370 | r[1]=(byte)l; // bits to dump before this table | |
371 | j=i>>>(w - l); | |
372 | r[2] = (int)(q - u[h-1] - j); // offset to this table | |
373 | System.arraycopy(r, 0, hp, (u[h-1]+j)*3, 3); // connect to last table | |
374 | } | |
375 | else{ | |
376 | t[0] = q; // first table is returned result | |
377 | } | |
378 | } | |
379 | ||
380 | // set up table entry in r | |
381 | r[1] = (byte)(k - w); | |
382 | if (p >= n){ | |
383 | r[0] = 128 + 64; // out of values--invalid code | |
384 | } | |
385 | else if (v[p] < s){ | |
386 | r[0] = (byte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block | |
387 | r[2] = v[p++]; // simple code is just the value | |
388 | } | |
389 | else{ | |
390 | r[0]=(byte)(e[v[p]-s]+16+64); // non-simple--look up in lists | |
391 | r[2]=d[v[p++] - s]; | |
392 | } | |
393 | ||
394 | // fill code-like entries with r | |
395 | f=1<<(k-w); | |
396 | for (j=i>>>w;j<z;j+=f){ | |
397 | System.arraycopy(r, 0, hp, (q+j)*3, 3); | |
398 | } | |
399 | ||
400 | // backwards increment the k-bit code i | |
401 | for (j = 1 << (k - 1); (i & j)!=0; j >>>= 1){ | |
402 | i ^= j; | |
403 | } | |
404 | i ^= j; | |
405 | ||
406 | // backup over finished tables | |
407 | mask = (1 << w) - 1; // needed on HP, cc -O bug | |
408 | while ((i & mask) != x[h]){ | |
409 | h--; // don't need to update q | |
410 | w -= l; | |
411 | mask = (1 << w) - 1; | |
412 | } | |
413 | } | |
414 | } | |
415 | // Return Z_BUF_ERROR if we were given an incomplete table | |
416 | return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; | |
417 | } | |
418 | ||
419 | int inflate_trees_bits(int[] c, // 19 code lengths | |
420 | int[] bb, // bits tree desired/actual depth | |
421 | int[] tb, // bits tree result | |
422 | int[] hp, // space for trees | |
423 | ZStream z // for messages | |
424 | ){ | |
425 | int result; | |
426 | initWorkArea(19); | |
427 | hn[0]=0; | |
428 | result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); | |
429 | ||
430 | if(result == Z_DATA_ERROR){ | |
431 | z.msg = "oversubscribed dynamic bit lengths tree"; | |
432 | } | |
433 | else if(result == Z_BUF_ERROR || bb[0] == 0){ | |
434 | z.msg = "incomplete dynamic bit lengths tree"; | |
435 | result = Z_DATA_ERROR; | |
436 | } | |
437 | return result; | |
438 | } | |
439 | ||
440 | int inflate_trees_dynamic(int nl, // number of literal/length codes | |
441 | int nd, // number of distance codes | |
442 | int[] c, // that many (total) code lengths | |
443 | int[] bl, // literal desired/actual bit depth | |
444 | int[] bd, // distance desired/actual bit depth | |
445 | int[] tl, // literal/length tree result | |
446 | int[] td, // distance tree result | |
447 | int[] hp, // space for trees | |
448 | ZStream z // for messages | |
449 | ){ | |
450 | int result; | |
451 | ||
452 | // build literal/length tree | |
453 | initWorkArea(288); | |
454 | hn[0]=0; | |
455 | result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); | |
456 | if (result != Z_OK || bl[0] == 0){ | |
457 | if(result == Z_DATA_ERROR){ | |
458 | z.msg = "oversubscribed literal/length tree"; | |
459 | } | |
460 | else if (result != Z_MEM_ERROR){ | |
461 | z.msg = "incomplete literal/length tree"; | |
462 | result = Z_DATA_ERROR; | |
463 | } | |
464 | return result; | |
465 | } | |
466 | ||
467 | // build distance tree | |
468 | initWorkArea(288); | |
469 | result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); | |
470 | ||
471 | if (result != Z_OK || (bd[0] == 0 && nl > 257)){ | |
472 | if (result == Z_DATA_ERROR){ | |
473 | z.msg = "oversubscribed distance tree"; | |
474 | } | |
475 | else if (result == Z_BUF_ERROR) { | |
476 | z.msg = "incomplete distance tree"; | |
477 | result = Z_DATA_ERROR; | |
478 | } | |
479 | else if (result != Z_MEM_ERROR){ | |
480 | z.msg = "empty distance tree with lengths"; | |
481 | result = Z_DATA_ERROR; | |
482 | } | |
483 | return result; | |
484 | } | |
485 | ||
486 | return Z_OK; | |
487 | } | |
488 | ||
489 | static int inflate_trees_fixed(int[] bl, //literal desired/actual bit depth | |
490 | int[] bd, //distance desired/actual bit depth | |
491 | int[][] tl,//literal/length tree result | |
492 | int[][] td,//distance tree result | |
493 | ZStream z //for memory allocation | |
494 | ){ | |
495 | bl[0]=fixed_bl; | |
496 | bd[0]=fixed_bd; | |
497 | tl[0]=fixed_tl; | |
498 | td[0]=fixed_td; | |
499 | return Z_OK; | |
500 | } | |
501 | ||
502 | private void initWorkArea(int vsize){ | |
503 | if(hn==null){ | |
504 | hn=new int[1]; | |
505 | v=new int[vsize]; | |
506 | c=new int[BMAX+1]; | |
507 | r=new int[3]; | |
508 | u=new int[BMAX]; | |
509 | x=new int[BMAX+1]; | |
510 | } | |
511 | if(v.length<vsize){ v=new int[vsize]; } | |
512 | for(int i=0; i<vsize; i++){v[i]=0;} | |
513 | for(int i=0; i<BMAX+1; i++){c[i]=0;} | |
514 | for(int i=0; i<3; i++){r[i]=0;} | |
515 | // for(int i=0; i<BMAX; i++){u[i]=0;} | |
516 | System.arraycopy(c, 0, u, 0, BMAX); | |
517 | // for(int i=0; i<BMAX+1; i++){x[i]=0;} | |
518 | System.arraycopy(c, 0, x, 0, BMAX+1); | |
519 | } | |
520 | } |