Mercurial > 510Connectbot
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 } |