Mercurial > 510Connectbot
comparison app/src/main/java/com/jcraft/jzlib/InfBlocks.java @ 438:d29cce60f393
migrate from Eclipse to Android Studio
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Thu, 03 Dec 2015 11:23:55 -0800 |
parents | src/com/jcraft/jzlib/InfBlocks.java@46c2115ae1c8 |
children |
comparison
equal
deleted
inserted
replaced
437:208b31032318 | 438:d29cce60f393 |
---|---|
1 /* -*-mode:java; c-basic-offset:2; -*- */ | |
2 /* | |
3 Copyright (c) 2011 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 InfBlocks{ | |
38 static final private int MANY=1440; | |
39 | |
40 // And'ing with mask[n] masks the lower n bits | |
41 static final private int[] inflate_mask = { | |
42 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, | |
43 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, | |
44 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, | |
45 0x00007fff, 0x0000ffff | |
46 }; | |
47 | |
48 // Table for deflate from PKZIP's appnote.txt. | |
49 static final int[] border = { // Order of the bit length code lengths | |
50 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 | |
51 }; | |
52 | |
53 static final private int Z_OK=0; | |
54 static final private int Z_STREAM_END=1; | |
55 static final private int Z_NEED_DICT=2; | |
56 static final private int Z_ERRNO=-1; | |
57 static final private int Z_STREAM_ERROR=-2; | |
58 static final private int Z_DATA_ERROR=-3; | |
59 static final private int Z_MEM_ERROR=-4; | |
60 static final private int Z_BUF_ERROR=-5; | |
61 static final private int Z_VERSION_ERROR=-6; | |
62 | |
63 static final private int TYPE=0; // get type bits (3, including end bit) | |
64 static final private int LENS=1; // get lengths for stored | |
65 static final private int STORED=2;// processing stored block | |
66 static final private int TABLE=3; // get table lengths | |
67 static final private int BTREE=4; // get bit lengths tree for a dynamic block | |
68 static final private int DTREE=5; // get length, distance trees for a dynamic block | |
69 static final private int CODES=6; // processing fixed or dynamic block | |
70 static final private int DRY=7; // output remaining window bytes | |
71 static final private int DONE=8; // finished last block, done | |
72 static final private int BAD=9; // ot a data error--stuck here | |
73 | |
74 int mode; // current inflate_block mode | |
75 | |
76 int left; // if STORED, bytes left to copy | |
77 | |
78 int table; // table lengths (14 bits) | |
79 int index; // index into blens (or border) | |
80 int[] blens; // bit lengths of codes | |
81 int[] bb=new int[1]; // bit length tree depth | |
82 int[] tb=new int[1]; // bit length decoding tree | |
83 | |
84 int[] bl=new int[1]; | |
85 int[] bd=new int[1]; | |
86 | |
87 int[][] tl=new int[1][]; | |
88 int[][] td=new int[1][]; | |
89 int[] tli=new int[1]; // tl_index | |
90 int[] tdi=new int[1]; // td_index | |
91 | |
92 private final InfCodes codes; // if CODES, current state | |
93 | |
94 int last; // true if this block is the last block | |
95 | |
96 // mode independent information | |
97 int bitk; // bits in bit buffer | |
98 int bitb; // bit buffer | |
99 int[] hufts; // single malloc for tree space | |
100 byte[] window; // sliding window | |
101 int end; // one byte after sliding window | |
102 int read; // window read pointer | |
103 int write; // window write pointer | |
104 private boolean check; | |
105 | |
106 private final InfTree inftree=new InfTree(); | |
107 | |
108 private final ZStream z; | |
109 | |
110 InfBlocks(ZStream z, int w){ | |
111 this.z=z; | |
112 this.codes=new InfCodes(this.z, this); | |
113 hufts=new int[MANY*3]; | |
114 window=new byte[w]; | |
115 end=w; | |
116 this.check = (z.istate.wrap==0) ? false : true; | |
117 mode = TYPE; | |
118 reset(); | |
119 } | |
120 | |
121 void reset(){ | |
122 if(mode==BTREE || mode==DTREE){ | |
123 } | |
124 if(mode==CODES){ | |
125 codes.free(z); | |
126 } | |
127 mode=TYPE; | |
128 bitk=0; | |
129 bitb=0; | |
130 read=write=0; | |
131 if(check){ | |
132 z.adler.reset(); | |
133 } | |
134 } | |
135 | |
136 int proc(int r){ | |
137 int t; // temporary storage | |
138 int b; // bit buffer | |
139 int k; // bits in bit buffer | |
140 int p; // input data pointer | |
141 int n; // bytes available there | |
142 int q; // output window write pointer | |
143 int m; // bytes to end of window or read pointer | |
144 | |
145 // copy input/output information to locals (UPDATE macro restores) | |
146 {p=z.next_in_index;n=z.avail_in;b=bitb;k=bitk;} | |
147 {q=write;m=(int)(q<read?read-q-1:end-q);} | |
148 | |
149 // process input based on current state | |
150 while(true){ | |
151 switch (mode){ | |
152 case TYPE: | |
153 | |
154 while(k<(3)){ | |
155 if(n!=0){ | |
156 r=Z_OK; | |
157 } | |
158 else{ | |
159 bitb=b; bitk=k; | |
160 z.avail_in=n; | |
161 z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
162 write=q; | |
163 return inflate_flush(r); | |
164 }; | |
165 n--; | |
166 b|=(z.next_in[p++]&0xff)<<k; | |
167 k+=8; | |
168 } | |
169 t = (int)(b & 7); | |
170 last = t & 1; | |
171 | |
172 switch (t >>> 1){ | |
173 case 0: // stored | |
174 {b>>>=(3);k-=(3);} | |
175 t = k & 7; // go to byte boundary | |
176 | |
177 {b>>>=(t);k-=(t);} | |
178 mode = LENS; // get length of stored block | |
179 break; | |
180 case 1: // fixed | |
181 InfTree.inflate_trees_fixed(bl, bd, tl, td, z); | |
182 codes.init(bl[0], bd[0], tl[0], 0, td[0], 0); | |
183 | |
184 {b>>>=(3);k-=(3);} | |
185 | |
186 mode = CODES; | |
187 break; | |
188 case 2: // dynamic | |
189 | |
190 {b>>>=(3);k-=(3);} | |
191 | |
192 mode = TABLE; | |
193 break; | |
194 case 3: // illegal | |
195 | |
196 {b>>>=(3);k-=(3);} | |
197 mode = BAD; | |
198 z.msg = "invalid block type"; | |
199 r = Z_DATA_ERROR; | |
200 | |
201 bitb=b; bitk=k; | |
202 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
203 write=q; | |
204 return inflate_flush(r); | |
205 } | |
206 break; | |
207 case LENS: | |
208 | |
209 while(k<(32)){ | |
210 if(n!=0){ | |
211 r=Z_OK; | |
212 } | |
213 else{ | |
214 bitb=b; bitk=k; | |
215 z.avail_in=n; | |
216 z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
217 write=q; | |
218 return inflate_flush(r); | |
219 }; | |
220 n--; | |
221 b|=(z.next_in[p++]&0xff)<<k; | |
222 k+=8; | |
223 } | |
224 | |
225 if ((((~b) >>> 16) & 0xffff) != (b & 0xffff)){ | |
226 mode = BAD; | |
227 z.msg = "invalid stored block lengths"; | |
228 r = Z_DATA_ERROR; | |
229 | |
230 bitb=b; bitk=k; | |
231 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
232 write=q; | |
233 return inflate_flush(r); | |
234 } | |
235 left = (b & 0xffff); | |
236 b = k = 0; // dump bits | |
237 mode = left!=0 ? STORED : (last!=0 ? DRY : TYPE); | |
238 break; | |
239 case STORED: | |
240 if (n == 0){ | |
241 bitb=b; bitk=k; | |
242 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
243 write=q; | |
244 return inflate_flush(r); | |
245 } | |
246 | |
247 if(m==0){ | |
248 if(q==end&&read!=0){ | |
249 q=0; m=(int)(q<read?read-q-1:end-q); | |
250 } | |
251 if(m==0){ | |
252 write=q; | |
253 r=inflate_flush(r); | |
254 q=write;m=(int)(q<read?read-q-1:end-q); | |
255 if(q==end&&read!=0){ | |
256 q=0; m=(int)(q<read?read-q-1:end-q); | |
257 } | |
258 if(m==0){ | |
259 bitb=b; bitk=k; | |
260 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
261 write=q; | |
262 return inflate_flush(r); | |
263 } | |
264 } | |
265 } | |
266 r=Z_OK; | |
267 | |
268 t = left; | |
269 if(t>n) t = n; | |
270 if(t>m) t = m; | |
271 System.arraycopy(z.next_in, p, window, q, t); | |
272 p += t; n -= t; | |
273 q += t; m -= t; | |
274 if ((left -= t) != 0) | |
275 break; | |
276 mode = last!=0 ? DRY : TYPE; | |
277 break; | |
278 case TABLE: | |
279 | |
280 while(k<(14)){ | |
281 if(n!=0){ | |
282 r=Z_OK; | |
283 } | |
284 else{ | |
285 bitb=b; bitk=k; | |
286 z.avail_in=n; | |
287 z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
288 write=q; | |
289 return inflate_flush(r); | |
290 }; | |
291 n--; | |
292 b|=(z.next_in[p++]&0xff)<<k; | |
293 k+=8; | |
294 } | |
295 | |
296 table = t = (b & 0x3fff); | |
297 if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) | |
298 { | |
299 mode = BAD; | |
300 z.msg = "too many length or distance symbols"; | |
301 r = Z_DATA_ERROR; | |
302 | |
303 bitb=b; bitk=k; | |
304 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
305 write=q; | |
306 return inflate_flush(r); | |
307 } | |
308 t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); | |
309 if(blens==null || blens.length<t){ | |
310 blens=new int[t]; | |
311 } | |
312 else{ | |
313 for(int i=0; i<t; i++){blens[i]=0;} | |
314 } | |
315 | |
316 {b>>>=(14);k-=(14);} | |
317 | |
318 index = 0; | |
319 mode = BTREE; | |
320 case BTREE: | |
321 while (index < 4 + (table >>> 10)){ | |
322 while(k<(3)){ | |
323 if(n!=0){ | |
324 r=Z_OK; | |
325 } | |
326 else{ | |
327 bitb=b; bitk=k; | |
328 z.avail_in=n; | |
329 z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
330 write=q; | |
331 return inflate_flush(r); | |
332 }; | |
333 n--; | |
334 b|=(z.next_in[p++]&0xff)<<k; | |
335 k+=8; | |
336 } | |
337 | |
338 blens[border[index++]] = b&7; | |
339 | |
340 {b>>>=(3);k-=(3);} | |
341 } | |
342 | |
343 while(index < 19){ | |
344 blens[border[index++]] = 0; | |
345 } | |
346 | |
347 bb[0] = 7; | |
348 t = inftree.inflate_trees_bits(blens, bb, tb, hufts, z); | |
349 if (t != Z_OK){ | |
350 r = t; | |
351 if (r == Z_DATA_ERROR){ | |
352 blens=null; | |
353 mode = BAD; | |
354 } | |
355 | |
356 bitb=b; bitk=k; | |
357 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
358 write=q; | |
359 return inflate_flush(r); | |
360 } | |
361 | |
362 index = 0; | |
363 mode = DTREE; | |
364 case DTREE: | |
365 while (true){ | |
366 t = table; | |
367 if(!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))){ | |
368 break; | |
369 } | |
370 | |
371 int[] h; | |
372 int i, j, c; | |
373 | |
374 t = bb[0]; | |
375 | |
376 while(k<(t)){ | |
377 if(n!=0){ | |
378 r=Z_OK; | |
379 } | |
380 else{ | |
381 bitb=b; bitk=k; | |
382 z.avail_in=n; | |
383 z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
384 write=q; | |
385 return inflate_flush(r); | |
386 }; | |
387 n--; | |
388 b|=(z.next_in[p++]&0xff)<<k; | |
389 k+=8; | |
390 } | |
391 | |
392 if(tb[0]==-1){ | |
393 //System.err.println("null..."); | |
394 } | |
395 | |
396 t=hufts[(tb[0]+(b&inflate_mask[t]))*3+1]; | |
397 c=hufts[(tb[0]+(b&inflate_mask[t]))*3+2]; | |
398 | |
399 if (c < 16){ | |
400 b>>>=(t);k-=(t); | |
401 blens[index++] = c; | |
402 } | |
403 else { // c == 16..18 | |
404 i = c == 18 ? 7 : c - 14; | |
405 j = c == 18 ? 11 : 3; | |
406 | |
407 while(k<(t+i)){ | |
408 if(n!=0){ | |
409 r=Z_OK; | |
410 } | |
411 else{ | |
412 bitb=b; bitk=k; | |
413 z.avail_in=n; | |
414 z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
415 write=q; | |
416 return inflate_flush(r); | |
417 }; | |
418 n--; | |
419 b|=(z.next_in[p++]&0xff)<<k; | |
420 k+=8; | |
421 } | |
422 | |
423 b>>>=(t);k-=(t); | |
424 | |
425 j += (b & inflate_mask[i]); | |
426 | |
427 b>>>=(i);k-=(i); | |
428 | |
429 i = index; | |
430 t = table; | |
431 if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || | |
432 (c == 16 && i < 1)){ | |
433 blens=null; | |
434 mode = BAD; | |
435 z.msg = "invalid bit length repeat"; | |
436 r = Z_DATA_ERROR; | |
437 | |
438 bitb=b; bitk=k; | |
439 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
440 write=q; | |
441 return inflate_flush(r); | |
442 } | |
443 | |
444 c = c == 16 ? blens[i-1] : 0; | |
445 do{ | |
446 blens[i++] = c; | |
447 } | |
448 while (--j!=0); | |
449 index = i; | |
450 } | |
451 } | |
452 | |
453 tb[0]=-1; | |
454 { | |
455 bl[0] = 9; // must be <= 9 for lookahead assumptions | |
456 bd[0] = 6; // must be <= 9 for lookahead assumptions | |
457 t = table; | |
458 t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), | |
459 1 + ((t >> 5) & 0x1f), | |
460 blens, bl, bd, tli, tdi, hufts, z); | |
461 | |
462 if (t != Z_OK){ | |
463 if (t == Z_DATA_ERROR){ | |
464 blens=null; | |
465 mode = BAD; | |
466 } | |
467 r = t; | |
468 | |
469 bitb=b; bitk=k; | |
470 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
471 write=q; | |
472 return inflate_flush(r); | |
473 } | |
474 codes.init(bl[0], bd[0], hufts, tli[0], hufts, tdi[0]); | |
475 } | |
476 mode = CODES; | |
477 case CODES: | |
478 bitb=b; bitk=k; | |
479 z.avail_in=n; z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
480 write=q; | |
481 | |
482 if ((r = codes.proc(r)) != Z_STREAM_END){ | |
483 return inflate_flush(r); | |
484 } | |
485 r = Z_OK; | |
486 codes.free(z); | |
487 | |
488 p=z.next_in_index; n=z.avail_in;b=bitb;k=bitk; | |
489 q=write;m=(int)(q<read?read-q-1:end-q); | |
490 | |
491 if (last==0){ | |
492 mode = TYPE; | |
493 break; | |
494 } | |
495 mode = DRY; | |
496 case DRY: | |
497 write=q; | |
498 r=inflate_flush(r); | |
499 q=write; m=(int)(q<read?read-q-1:end-q); | |
500 if (read != write){ | |
501 bitb=b; bitk=k; | |
502 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
503 write=q; | |
504 return inflate_flush(r); | |
505 } | |
506 mode = DONE; | |
507 case DONE: | |
508 r = Z_STREAM_END; | |
509 | |
510 bitb=b; bitk=k; | |
511 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
512 write=q; | |
513 return inflate_flush(r); | |
514 case BAD: | |
515 r = Z_DATA_ERROR; | |
516 | |
517 bitb=b; bitk=k; | |
518 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
519 write=q; | |
520 return inflate_flush(r); | |
521 | |
522 default: | |
523 r = Z_STREAM_ERROR; | |
524 | |
525 bitb=b; bitk=k; | |
526 z.avail_in=n;z.total_in+=p-z.next_in_index;z.next_in_index=p; | |
527 write=q; | |
528 return inflate_flush(r); | |
529 } | |
530 } | |
531 } | |
532 | |
533 void free(){ | |
534 reset(); | |
535 window=null; | |
536 hufts=null; | |
537 //ZFREE(z, s); | |
538 } | |
539 | |
540 void set_dictionary(byte[] d, int start, int n){ | |
541 System.arraycopy(d, start, window, 0, n); | |
542 read = write = n; | |
543 } | |
544 | |
545 // Returns true if inflate is currently at the end of a block generated | |
546 // by Z_SYNC_FLUSH or Z_FULL_FLUSH. | |
547 int sync_point(){ | |
548 return mode == LENS ? 1 : 0; | |
549 } | |
550 | |
551 // copy as much as possible from the sliding window to the output area | |
552 int inflate_flush(int r){ | |
553 int n; | |
554 int p; | |
555 int q; | |
556 | |
557 // local copies of source and destination pointers | |
558 p = z.next_out_index; | |
559 q = read; | |
560 | |
561 // compute number of bytes to copy as far as end of window | |
562 n = (int)((q <= write ? write : end) - q); | |
563 if(n > z.avail_out) n = z.avail_out; | |
564 if(n!=0 && r == Z_BUF_ERROR) r = Z_OK; | |
565 | |
566 // update counters | |
567 z.avail_out -= n; | |
568 z.total_out += n; | |
569 | |
570 // update check information | |
571 if(check && n>0){ | |
572 z.adler.update(window, q, n); | |
573 } | |
574 | |
575 // copy as far as end of window | |
576 System.arraycopy(window, q, z.next_out, p, n); | |
577 p += n; | |
578 q += n; | |
579 | |
580 // see if more to copy at beginning of window | |
581 if (q == end){ | |
582 // wrap pointers | |
583 q = 0; | |
584 if (write == end) | |
585 write = 0; | |
586 | |
587 // compute bytes to copy | |
588 n = write - q; | |
589 if (n > z.avail_out) n = z.avail_out; | |
590 if (n!=0 && r == Z_BUF_ERROR) r = Z_OK; | |
591 | |
592 // update counters | |
593 z.avail_out -= n; | |
594 z.total_out += n; | |
595 | |
596 // update check information | |
597 if(check && n>0){ | |
598 z.adler.update(window, q, n); | |
599 } | |
600 | |
601 // copy | |
602 System.arraycopy(window, q, z.next_out, p, n); | |
603 p += n; | |
604 q += n; | |
605 } | |
606 | |
607 // update pointers | |
608 z.next_out_index = p; | |
609 read = q; | |
610 | |
611 // done | |
612 return r; | |
613 } | |
614 } |