1 2 29 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 static final int[] cplens = { 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 static final int[] cplext = { 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 }; 207 208 static final int[] cpdist = { 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 = { 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 static final int BMAX=15; 222 int[] hn = null; int[] v = null; int[] c = null; int[] r = null; int[] u = null; int[] x = null; 229 private int huft_build(int[] b, int bindex, 231 int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v ){ 241 247 int a; int f; int g; int h; int i; int j; int k; int l; int mask; int p; int q; int w; int xp; int y; int z; 263 265 p = 0; i = n; 266 do { 267 c[b[bindex+p]]++; p++; i--; }while(i!=0); 269 270 if(c[0] == n){ t[0] = -1; 272 m[0] = 0; 273 return Z_OK; 274 } 275 276 l = m[0]; 278 for (j = 1; j <= BMAX; j++) 279 if(c[j]!=0) break; 280 k = j; if(l < j){ 282 l = j; 283 } 284 for (i = BMAX; i!=0; i--){ 285 if(c[i]!=0) break; 286 } 287 g = i; if(l > i){ 289 l = i; 290 } 291 m[0] = l; 292 293 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 x[1] = j = 0; 306 p = 1; xp = 2; 307 while (--i!=0) { x[xp] = (j += c[p]); 309 xp++; 310 p++; 311 } 312 313 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]; 324 x[0] = i = 0; p = 0; h = -1; w = -l; u[0] = 0; q = 0; z = 0; 333 for (; k <= g; k++){ 335 a = c[k]; 336 while (a--!=0){ 337 while (k > w + l){ 340 h++; 341 w += l; z = g - w; 344 z = (z > l) ? l : z; if((f=1<<(j=k-w))>a+1){ f -= a + 1; xp = k; 349 if(j < z){ 350 while (++j < z){ if((f <<= 1) <= c[++xp]) 352 break; f -= c[xp]; } 355 } 356 } 357 z = 1 << j; 359 if (hn[0] + z > MANY){ return Z_DATA_ERROR; } 363 u[h] = q = hn[0]; hn[0] += z; 365 366 if(h!=0){ 368 x[h]=i; r[0]=(byte)j; r[1]=(byte)l; j=i>>>(w - l); 372 r[2] = (int)(q - u[h-1] - j); System.arraycopy(r, 0, hp, (u[h-1]+j)*3, 3); } 375 else{ 376 t[0] = q; } 378 } 379 380 r[1] = (byte)(k - w); 382 if (p >= n){ 383 r[0] = 128 + 64; } 385 else if (v[p] < s){ 386 r[0] = (byte)(v[p] < 256 ? 0 : 32 + 64); r[2] = v[p++]; } 389 else{ 390 r[0]=(byte)(e[v[p]-s]+16+64); r[2]=d[v[p++] - s]; 392 } 393 394 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 for (j = 1 << (k - 1); (i & j)!=0; j >>>= 1){ 402 i ^= j; 403 } 404 i ^= j; 405 406 mask = (1 << w) - 1; while ((i & mask) != x[h]){ 409 h--; w -= l; 411 mask = (1 << w) - 1; 412 } 413 } 414 } 415 return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; 417 } 418 419 int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZStream z ){ 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, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZStream z ){ 450 int result; 451 452 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 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, int[] bd, int[][] tl, int[][] td, ZStream z ){ 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 System.arraycopy(c, 0, u, 0, BMAX); 517 System.arraycopy(c, 0, x, 0, BMAX+1); 519 } 520 } 521 | Popular Tags |