1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  package org.jboss.netty.util.internal.jzlib;
49  
50  final class InfTree {
51  
52      static final int fixed_bl = 9;
53      static final int fixed_bd = 5;
54  
55      static final int[] fixed_tl = { 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, 80, 7, 10, 0, 8, 96, 0,
57              8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7,
58              6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56,
59              0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0,
60              8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8,
61              227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8,
62              100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232,
63              80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0,
64              8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8,
65              12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18,
66              85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11,
67              0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9,
68              228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122,
69              0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0,
70              8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8,
71              22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7,
72              15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70,
73              0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0,
74              8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9,
75              188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8,
76              81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9,
77              194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129,
78              0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83,
79              7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8,
80              41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4,
81              0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0,
82              9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8,
83              133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154,
84              84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0,
85              8, 45, 0, 9, 186, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7,
86              3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51,
87              0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8,
88              131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150,
89              84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0,
90              8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7,
91              5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55,
92              0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0,
93              8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9,
94              158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8,
95              111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254,
96              96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112,
97              0, 8, 48, 0, 9, 193,
98              80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8,
99              64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59,
100             0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0,
101             9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8,
102             84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9,
103             201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132,
104             0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84,
105             7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8,
106             44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3,
107             0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0,
108             9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8,
109             130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149,
110             84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0,
111             8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7,
112             5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54,
113             0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0,
114             8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9,
115             157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8,
116             110, 0, 8, 46, 0, 9, 189, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 253,
117             96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113,
118             0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0,
119             8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25,
120             0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0,
121             8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9,
122             243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8,
123             117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9,
124             171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93,
125             0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82,
126             7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8,
127             77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35,
128             0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0,
129             9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8,
130             91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215,
131             82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0,
132             8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7,
133             51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39,
134             0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8,
135             95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223,
136             82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0,
137             8, 79, 0, 9, 255 };
138 
139     static final int[] fixed_td = { 80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5,
140             4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88,
141             5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129,
142             192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5,
143             7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84,
144             5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5,
145             24577 };
146 
147     
148     static final int[] cplens = { 
149     3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59,
150             67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 };
151 
152     
153     static final int[] cplext = { 
154     0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5,
155             5, 5, 5, 0, 112, 112 
156     };
157 
158     static final int[] cpdist = { 
159     1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513,
160             769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 };
161 
162     static final int[] cpdext = { 
163     0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10,
164             11, 11, 12, 12, 13, 13 };
165 
166     
167     static final int BMAX = 15; 
168 
169     private int[] hn; 
170     private int[] v;  
171     private int[] c;  
172     private int[] r;  
173     private int[] u;  
174     private int[] x;  
175 
176     private int huft_build(int[] b, 
177             int bindex, int n, 
178             int s, 
179             int[] d, 
180             int[] e, 
181             int[] t, 
182             int[] m, 
183             int[] hp, 
184             int[] hn, 
185             int[] v 
186     ) {
187         
188         
189         
190         
191         
192 
193         int a; 
194         int f; 
195         int g; 
196         int h; 
197         int i; 
198         int j; 
199         int k; 
200         int l; 
201         int mask; 
202         int p; 
203         int q; 
204         int w; 
205         int xp; 
206         int y; 
207         int z; 
208 
209         
210 
211         p = 0;
212         i = n;
213         do {
214             c[b[bindex + p]] ++;
215             p ++;
216             i --; 
217         } while (i != 0);
218 
219         if (c[0] == n) { 
220             t[0] = -1;
221             m[0] = 0;
222             return JZlib.Z_OK;
223         }
224 
225         
226         l = m[0];
227         for (j = 1; j <= BMAX; j ++) {
228             if (c[j] != 0) {
229                 break;
230             }
231         }
232         k = j; 
233         if (l < j) {
234             l = j;
235         }
236         for (i = BMAX; i != 0; i --) {
237             if (c[i] != 0) {
238                 break;
239             }
240         }
241         g = i; 
242         if (l > i) {
243             l = i;
244         }
245         m[0] = l;
246 
247         
248         for (y = 1 << j; j < i; j ++, y <<= 1) {
249             if ((y -= c[j]) < 0) {
250                 return JZlib.Z_DATA_ERROR;
251             }
252         }
253         if ((y -= c[i]) < 0) {
254             return JZlib.Z_DATA_ERROR;
255         }
256         c[i] += y;
257 
258         
259         x[1] = j = 0;
260         p = 1;
261         xp = 2;
262         while (-- i != 0) { 
263             x[xp] = j += c[p];
264             xp ++;
265             p ++;
266         }
267 
268         
269         i = 0;
270         p = 0;
271         do {
272             if ((j = b[bindex + p]) != 0) {
273                 v[x[j] ++] = i;
274             }
275             p ++;
276         } while (++ i < n);
277         n = x[g]; 
278 
279         
280         x[0] = i = 0; 
281         p = 0; 
282         h = -1; 
283         w = -l; 
284         u[0] = 0; 
285         q = 0; 
286         z = 0; 
287 
288         
289         for (; k <= g; k ++) {
290             a = c[k];
291             while (a -- != 0) {
292                 
293                 
294                 while (k > w + l) {
295                     h ++;
296                     w += l; 
297                     
298                     z = g - w;
299                     z = z > l? l : z; 
300                     if ((f = 1 << (j = k - w)) > a + 1) { 
301                         
302                         f -= a + 1; 
303                         xp = k;
304                         if (j < z) {
305                             while (++ j < z) { 
306                                 if ((f <<= 1) <= c[++ xp]) {
307                                     break; 
308                                 }
309                                 f -= c[xp]; 
310                             }
311                         }
312                     }
313                     z = 1 << j; 
314 
315                     
316                     if (hn[0] + z > JZlib.MANY) { 
317                         return JZlib.Z_DATA_ERROR; 
318                     }
319                     u[h] = q = 
320                     hn[0] += z;
321 
322                     
323                     if (h != 0) {
324                         x[h] = i; 
325                         r[0] = (byte) j; 
326                         r[1] = (byte) l; 
327                         j = i >>> w - l;
328                         r[2] = q - u[h - 1] - j; 
329                         System.arraycopy(r, 0, hp, (u[h - 1] + j) * 3, 3); 
330                     } else {
331                         t[0] = q; 
332                     }
333                 }
334 
335                 
336                 r[1] = (byte) (k - w);
337                 if (p >= n) {
338                     r[0] = 128 + 64; 
339                 } else if (v[p] < s) {
340                     r[0] = (byte) (v[p] < 256? 0 : 32 + 64); 
341                     r[2] = v[p ++]; 
342                 } else {
343                     r[0] = (byte) (e[v[p] - s] + 16 + 64); 
344                     r[2] = d[v[p ++] - s];
345                 }
346 
347                 
348                 f = 1 << k - w;
349                 for (j = i >>> w; j < z; j += f) {
350                     System.arraycopy(r, 0, hp, (q + j) * 3, 3);
351                 }
352 
353                 
354                 for (j = 1 << k - 1; (i & j) != 0; j >>>= 1) {
355                     i ^= j;
356                 }
357                 i ^= j;
358 
359                 
360                 mask = (1 << w) - 1; 
361                 while ((i & mask) != x[h]) {
362                     h --; 
363                     w -= l;
364                     mask = (1 << w) - 1;
365                 }
366             }
367         }
368         
369         return y != 0 && g != 1? JZlib.Z_BUF_ERROR : JZlib.Z_OK;
370     }
371 
372     int inflate_trees_bits(int[] c, 
373             int[] bb, 
374             int[] tb, 
375             int[] hp, 
376             ZStream z 
377     ) {
378         int result;
379         initWorkArea(19);
380         hn[0] = 0;
381         result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v);
382 
383         if (result == JZlib.Z_DATA_ERROR) {
384             z.msg = "oversubscribed dynamic bit lengths tree";
385         } else if (result == JZlib.Z_BUF_ERROR || bb[0] == 0) {
386             z.msg = "incomplete dynamic bit lengths tree";
387             result = JZlib.Z_DATA_ERROR;
388         }
389         return result;
390     }
391 
392     int inflate_trees_dynamic(int nl, 
393             int nd, 
394             int[] c, 
395             int[] bl, 
396             int[] bd, 
397             int[] tl, 
398             int[] td, 
399             int[] hp, 
400             ZStream z 
401     ) {
402         int result;
403 
404         
405         initWorkArea(288);
406         hn[0] = 0;
407         result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v);
408         if (result != JZlib.Z_OK || bl[0] == 0) {
409             if (result == JZlib.Z_DATA_ERROR) {
410                 z.msg = "oversubscribed literal/length tree";
411             } else if (result != JZlib.Z_MEM_ERROR) {
412                 z.msg = "incomplete literal/length tree";
413                 result = JZlib.Z_DATA_ERROR;
414             }
415             return result;
416         }
417 
418         
419         initWorkArea(288);
420         result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v);
421 
422         if (result != JZlib.Z_OK || bd[0] == 0 && nl > 257) {
423             if (result == JZlib.Z_DATA_ERROR) {
424                 z.msg = "oversubscribed distance tree";
425             } else if (result == JZlib.Z_BUF_ERROR) {
426                 z.msg = "incomplete distance tree";
427                 result = JZlib.Z_DATA_ERROR;
428             } else if (result != JZlib.Z_MEM_ERROR) {
429                 z.msg = "empty distance tree with lengths";
430                 result = JZlib.Z_DATA_ERROR;
431             }
432             return result;
433         }
434 
435         return JZlib.Z_OK;
436     }
437 
438     static int inflate_trees_fixed(int[] bl, 
439             int[] bd, 
440             int[][] tl, 
441             int[][] td 
442     ) {
443         bl[0] = fixed_bl;
444         bd[0] = fixed_bd;
445         tl[0] = fixed_tl;
446         td[0] = fixed_td;
447         return JZlib.Z_OK;
448     }
449 
450     private void initWorkArea(int vsize) {
451         if (hn == null) {
452             hn = new int[1];
453             v = new int[vsize];
454             c = new int[BMAX + 1];
455             r = new int[3];
456             u = new int[BMAX];
457             x = new int[BMAX + 1];
458         } else {
459             if (v.length < vsize) {
460                 v = new int[vsize];
461             } else {
462                 for (int i = 0; i < vsize; i ++) {
463                     v[i] = 0;
464                 }
465             }
466             for (int i = 0; i < BMAX + 1; i ++) {
467                 c[i] = 0;
468             }
469             for (int i = 0; i < 3; i ++) {
470                 r[i] = 0;
471             }
472             
473             System.arraycopy(c, 0, u, 0, BMAX);
474             
475             System.arraycopy(c, 0, x, 0, BMAX + 1);
476         }
477     }
478 }