emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/zip/Inflate.java
brancharithmetic
changeset 774 42bc1e89134d
parent 755 5652acd48509
parent 773 406faa8bc64f
child 778 6f8683517f1f
     1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/zip/Inflate.java	Mon Feb 25 19:00:08 2013 +0100
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,727 +0,0 @@
     1.4 -/* -*-mode:java; c-basic-offset:2; -*- */
     1.5 -/*
     1.6 -Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved.
     1.7 -
     1.8 -Redistribution and use in source and binary forms, with or without
     1.9 -modification, are permitted provided that the following conditions are met:
    1.10 -
    1.11 -  1. Redistributions of source code must retain the above copyright notice,
    1.12 -     this list of conditions and the following disclaimer.
    1.13 -
    1.14 -  2. Redistributions in binary form must reproduce the above copyright 
    1.15 -     notice, this list of conditions and the following disclaimer in 
    1.16 -     the documentation and/or other materials provided with the distribution.
    1.17 -
    1.18 -  3. The names of the authors may not be used to endorse or promote products
    1.19 -     derived from this software without specific prior written permission.
    1.20 -
    1.21 -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
    1.22 -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
    1.23 -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
    1.24 -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
    1.25 -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    1.26 -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
    1.27 -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    1.28 -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    1.29 -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    1.30 -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    1.31 - */
    1.32 -/*
    1.33 - * This program is based on zlib-1.1.3, so all credit should go authors
    1.34 - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
    1.35 - * and contributors of zlib.
    1.36 - */
    1.37 -
    1.38 -package org.apidesign.bck2brwsr.emul.zip;
    1.39 -
    1.40 -import org.apidesign.bck2brwsr.emul.lang.System;
    1.41 -
    1.42 -final class Inflate{
    1.43 -  
    1.44 -  static final private int MAX_WBITS=15; // 32K LZ77 window
    1.45 -
    1.46 -  // preset dictionary flag in zlib header
    1.47 -  static final private int PRESET_DICT=0x20;
    1.48 -
    1.49 -  static final int Z_NO_FLUSH=0;
    1.50 -  static final int Z_PARTIAL_FLUSH=1;
    1.51 -  static final int Z_SYNC_FLUSH=2;
    1.52 -  static final int Z_FULL_FLUSH=3;
    1.53 -  static final int Z_FINISH=4;
    1.54 -
    1.55 -  static final private int Z_DEFLATED=8;
    1.56 -
    1.57 -  static final private int Z_OK=0;
    1.58 -  static final private int Z_STREAM_END=1;
    1.59 -  static final private int Z_NEED_DICT=2;
    1.60 -  static final private int Z_ERRNO=-1;
    1.61 -  static final private int Z_STREAM_ERROR=-2;
    1.62 -  static final private int Z_DATA_ERROR=-3;
    1.63 -  static final private int Z_MEM_ERROR=-4;
    1.64 -  static final private int Z_BUF_ERROR=-5;
    1.65 -  static final private int Z_VERSION_ERROR=-6;
    1.66 -
    1.67 -  static final private int METHOD=0;   // waiting for method byte
    1.68 -  static final private int FLAG=1;     // waiting for flag byte
    1.69 -  static final private int DICT4=2;    // four dictionary check bytes to go
    1.70 -  static final private int DICT3=3;    // three dictionary check bytes to go
    1.71 -  static final private int DICT2=4;    // two dictionary check bytes to go
    1.72 -  static final private int DICT1=5;    // one dictionary check byte to go
    1.73 -  static final int DICT0=6;    // waiting for inflateSetDictionary
    1.74 -  static final private int BLOCKS=7;   // decompressing blocks
    1.75 -  static final private int CHECK4=8;   // four check bytes to go
    1.76 -  static final private int CHECK3=9;   // three check bytes to go
    1.77 -  static final private int CHECK2=10;  // two check bytes to go
    1.78 -  static final private int CHECK1=11;  // one check byte to go
    1.79 -  static final private int DONE=12;    // finished check, done
    1.80 -  static final private int BAD=13;     // got an error--stay here
    1.81 -
    1.82 -  static final private int HEAD=14;
    1.83 -  static final private int LENGTH=15;
    1.84 -  static final private int TIME=16;
    1.85 -  static final private int OS=17;
    1.86 -  static final private int EXLEN=18;
    1.87 -  static final private int EXTRA=19;
    1.88 -  static final private int NAME=20;
    1.89 -  static final private int COMMENT=21;
    1.90 -  static final private int HCRC=22;
    1.91 -  static final private int FLAGS=23;
    1.92 -
    1.93 -  int mode;                            // current inflate mode
    1.94 -
    1.95 -  // mode dependent information
    1.96 -  int method;        // if FLAGS, method byte
    1.97 -
    1.98 -  // if CHECK, check values to compare
    1.99 -  long was = -1;           // computed check value
   1.100 -  long need;               // stream check value
   1.101 -
   1.102 -  // if BAD, inflateSync's marker bytes count
   1.103 -  int marker;
   1.104 -
   1.105 -  // mode independent information
   1.106 -  int  wrap;          // flag for no wrapper
   1.107 -  int wbits;            // log2(window size)  (8..15, defaults to 15)
   1.108 -
   1.109 -  InfBlocks blocks;     // current inflate_blocks state
   1.110 -
   1.111 -  private final ZStream z;
   1.112 -
   1.113 -  private int flags; 
   1.114 -
   1.115 -  private int need_bytes = -1;
   1.116 -  private byte[] crcbuf=new byte[4];
   1.117 -
   1.118 -  GZIPHeader gheader = null;
   1.119 -
   1.120 -  int inflateReset(){
   1.121 -    if(z == null) return Z_STREAM_ERROR;
   1.122 -    
   1.123 -    z.total_in = z.total_out = 0;
   1.124 -    z.msg = null;
   1.125 -    this.mode = HEAD;
   1.126 -    this.need_bytes = -1;
   1.127 -    this.blocks.reset();
   1.128 -    return Z_OK;
   1.129 -  }
   1.130 -
   1.131 -  int inflateEnd(){
   1.132 -    if(blocks != null){
   1.133 -      blocks.free();
   1.134 -    }
   1.135 -    return Z_OK;
   1.136 -  }
   1.137 -
   1.138 -  Inflate(ZStream z){
   1.139 -    this.z=z;
   1.140 -  }
   1.141 -
   1.142 -  int inflateInit(int w){
   1.143 -    z.msg = null;
   1.144 -    blocks = null;
   1.145 -
   1.146 -    // handle undocumented wrap option (no zlib header or check)
   1.147 -    wrap = 0;
   1.148 -    if(w < 0){
   1.149 -      w = - w;
   1.150 -    }
   1.151 -    else {
   1.152 -      wrap = (w >> 4) + 1;
   1.153 -      if(w < 48)
   1.154 -        w &= 15;
   1.155 -    }
   1.156 -
   1.157 -    if(w<8 ||w>15){
   1.158 -      inflateEnd();
   1.159 -      return Z_STREAM_ERROR;
   1.160 -    }
   1.161 -    if(blocks != null && wbits != w){
   1.162 -      blocks.free();
   1.163 -      blocks=null;
   1.164 -    }
   1.165 -
   1.166 -    // set window size
   1.167 -    wbits=w;
   1.168 -
   1.169 -    this.blocks=new InfBlocks(z, 1<<w);
   1.170 -
   1.171 -    // reset state
   1.172 -    inflateReset();
   1.173 -
   1.174 -    return Z_OK;
   1.175 -  }
   1.176 -
   1.177 -  int inflate(int f){
   1.178 -    int hold = 0;
   1.179 -
   1.180 -    int r;
   1.181 -    int b;
   1.182 -
   1.183 -    if(z == null || z.next_in == null){
   1.184 -      if(f == Z_FINISH && this.mode==HEAD)
   1.185 -        return Z_OK; 
   1.186 -      return Z_STREAM_ERROR;
   1.187 -    }
   1.188 -
   1.189 -    f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
   1.190 -    r = Z_BUF_ERROR;
   1.191 -    while (true){
   1.192 -
   1.193 -      switch (this.mode){
   1.194 -      case HEAD:
   1.195 -        if(wrap==0){
   1.196 -	  this.mode = BLOCKS;
   1.197 -          break;
   1.198 -        } 
   1.199 -
   1.200 -        try { r=readBytes(2, r, f); }
   1.201 -        catch(Return e){ return e.r; }
   1.202 -
   1.203 -        if((wrap&2)!=0 && this.need == 0x8b1fL) {   // gzip header
   1.204 -	  z.adler=new CRC32();
   1.205 -          checksum(2, this.need);
   1.206 -
   1.207 -          if(gheader==null) 
   1.208 -            gheader=new GZIPHeader();
   1.209 -
   1.210 -          this.mode = FLAGS;
   1.211 -          break;
   1.212 -        }
   1.213 -
   1.214 -        flags = 0;
   1.215 -
   1.216 -        this.method = ((int)this.need)&0xff;
   1.217 -        b=((int)(this.need>>8))&0xff;
   1.218 -
   1.219 -        if((wrap&1)==0 ||  // check if zlib header allowed
   1.220 -           (((this.method << 8)+b) % 31)!=0){
   1.221 -          this.mode = BAD;
   1.222 -          z.msg = "incorrect header check";
   1.223 -          // since zlib 1.2, it is allowted to inflateSync for this case.
   1.224 -          /*
   1.225 -          this.marker = 5;       // can't try inflateSync
   1.226 -          */
   1.227 -          break;
   1.228 -        }
   1.229 -
   1.230 -        if((this.method&0xf)!=Z_DEFLATED){
   1.231 -          this.mode = BAD;
   1.232 -          z.msg="unknown compression method";
   1.233 -          // since zlib 1.2, it is allowted to inflateSync for this case.
   1.234 -	  /*
   1.235 -          this.marker = 5;       // can't try inflateSync
   1.236 -	  */
   1.237 -          break;
   1.238 -        }
   1.239 -
   1.240 -        if((this.method>>4)+8>this.wbits){
   1.241 -          this.mode = BAD;
   1.242 -          z.msg="invalid window size";
   1.243 -          // since zlib 1.2, it is allowted to inflateSync for this case.
   1.244 -	  /*
   1.245 -          this.marker = 5;       // can't try inflateSync
   1.246 -	  */
   1.247 -          break;
   1.248 -        }
   1.249 -
   1.250 -        z.adler=new Adler32();
   1.251 -
   1.252 -        if((b&PRESET_DICT)==0){
   1.253 -          this.mode = BLOCKS;
   1.254 -          break;
   1.255 -        }
   1.256 -        this.mode = DICT4;
   1.257 -      case DICT4:
   1.258 -
   1.259 -        if(z.avail_in==0)return r;r=f;
   1.260 -
   1.261 -        z.avail_in--; z.total_in++;
   1.262 -        this.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
   1.263 -        this.mode=DICT3;
   1.264 -      case DICT3:
   1.265 -
   1.266 -        if(z.avail_in==0)return r;r=f;
   1.267 -
   1.268 -        z.avail_in--; z.total_in++;
   1.269 -        this.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
   1.270 -        this.mode=DICT2;
   1.271 -      case DICT2:
   1.272 -
   1.273 -        if(z.avail_in==0)return r;r=f;
   1.274 -
   1.275 -        z.avail_in--; z.total_in++;
   1.276 -        this.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
   1.277 -        this.mode=DICT1;
   1.278 -      case DICT1:
   1.279 -
   1.280 -        if(z.avail_in==0)return r;r=f;
   1.281 -
   1.282 -        z.avail_in--; z.total_in++;
   1.283 -        this.need += (z.next_in[z.next_in_index++]&0xffL);
   1.284 -        z.adler.reset(this.need);
   1.285 -        this.mode = DICT0;
   1.286 -        return Z_NEED_DICT;
   1.287 -      case DICT0:
   1.288 -        this.mode = BAD;
   1.289 -        z.msg = "need dictionary";
   1.290 -        this.marker = 0;       // can try inflateSync
   1.291 -        return Z_STREAM_ERROR;
   1.292 -      case BLOCKS:
   1.293 -        r = this.blocks.proc(r);
   1.294 -        if(r == Z_DATA_ERROR){
   1.295 -          this.mode = BAD;
   1.296 -          this.marker = 0;     // can try inflateSync
   1.297 -          break;
   1.298 -        }
   1.299 -        if(r == Z_OK){
   1.300 -          r = f;
   1.301 -        }
   1.302 -        if(r != Z_STREAM_END){
   1.303 -          return r;
   1.304 -        }
   1.305 -        r = f;
   1.306 -        this.was=z.adler.getValue();
   1.307 -        this.blocks.reset();
   1.308 -        if(this.wrap==0){
   1.309 -          this.mode=DONE;
   1.310 -          break;
   1.311 -        }
   1.312 -        this.mode=CHECK4;
   1.313 -      case CHECK4:
   1.314 -
   1.315 -        if(z.avail_in==0)return r;r=f;
   1.316 -
   1.317 -        z.avail_in--; z.total_in++;
   1.318 -        this.need=((z.next_in[z.next_in_index++]&0xff)<<24)&0xff000000L;
   1.319 -        this.mode=CHECK3;
   1.320 -      case CHECK3:
   1.321 -
   1.322 -        if(z.avail_in==0)return r;r=f;
   1.323 -
   1.324 -        z.avail_in--; z.total_in++;
   1.325 -        this.need+=((z.next_in[z.next_in_index++]&0xff)<<16)&0xff0000L;
   1.326 -        this.mode = CHECK2;
   1.327 -      case CHECK2:
   1.328 -
   1.329 -        if(z.avail_in==0)return r;r=f;
   1.330 -
   1.331 -        z.avail_in--; z.total_in++;
   1.332 -        this.need+=((z.next_in[z.next_in_index++]&0xff)<<8)&0xff00L;
   1.333 -        this.mode = CHECK1;
   1.334 -      case CHECK1:
   1.335 -
   1.336 -        if(z.avail_in==0)return r;r=f;
   1.337 -
   1.338 -        z.avail_in--; z.total_in++;
   1.339 -        this.need+=(z.next_in[z.next_in_index++]&0xffL);
   1.340 -
   1.341 -        if(flags!=0){  // gzip
   1.342 -          this.need = ((this.need&0xff000000)>>24 | 
   1.343 -                          (this.need&0x00ff0000)>>8 | 
   1.344 -                          (this.need&0x0000ff00)<<8 | 
   1.345 -                          (this.need&0x0000ffff)<<24)&0xffffffffL;
   1.346 -        }
   1.347 -
   1.348 -        if(((int)(this.was)) != ((int)(this.need))){
   1.349 -          z.msg = "incorrect data check";
   1.350 -          // chack is delayed
   1.351 -          /*
   1.352 -          this.mode = BAD;
   1.353 -          this.marker = 5;       // can't try inflateSync
   1.354 -          break;
   1.355 -	  */
   1.356 -        }
   1.357 -        else if(flags!=0 && gheader!=null){
   1.358 -          gheader.crc = this.need; 
   1.359 -        }
   1.360 -
   1.361 -        this.mode = LENGTH;
   1.362 -      case LENGTH:
   1.363 -        if (wrap!=0 && flags!=0) {
   1.364 -
   1.365 -          try { r=readBytes(4, r, f); }
   1.366 -          catch(Return e){ return e.r; }
   1.367 -
   1.368 -          if(z.msg!=null && z.msg.equals("incorrect data check")){
   1.369 -            this.mode = BAD;
   1.370 -            this.marker = 5;       // can't try inflateSync
   1.371 -            break;
   1.372 -          }
   1.373 -
   1.374 -          if (this.need != (z.total_out & 0xffffffffL)) {
   1.375 -            z.msg = "incorrect length check";
   1.376 -            this.mode = BAD;
   1.377 -            break;
   1.378 -          }
   1.379 -          z.msg = null;
   1.380 -        }
   1.381 -        else {
   1.382 -          if(z.msg!=null && z.msg.equals("incorrect data check")){
   1.383 -            this.mode = BAD;
   1.384 -            this.marker = 5;       // can't try inflateSync
   1.385 -            break;
   1.386 -          }
   1.387 -        }
   1.388 -
   1.389 -        this.mode = DONE;
   1.390 -      case DONE:
   1.391 -        return Z_STREAM_END;
   1.392 -      case BAD:
   1.393 -        return Z_DATA_ERROR;
   1.394 -
   1.395 -      case FLAGS:
   1.396 -
   1.397 -        try { r=readBytes(2, r, f); }
   1.398 -        catch(Return e){ return e.r; }
   1.399 -
   1.400 -        flags = ((int)this.need)&0xffff;
   1.401 -
   1.402 -        if ((flags & 0xff) != Z_DEFLATED) {
   1.403 -          z.msg = "unknown compression method";
   1.404 -          this.mode = BAD; 
   1.405 -          break;
   1.406 -        }
   1.407 -        if ((flags & 0xe000)!=0) {
   1.408 -          z.msg = "unknown header flags set";
   1.409 -          this.mode = BAD; 
   1.410 -          break;
   1.411 -        }
   1.412 -
   1.413 -        if ((flags & 0x0200)!=0){
   1.414 -          checksum(2, this.need);
   1.415 -        } 
   1.416 -
   1.417 -        this.mode = TIME;
   1.418 -
   1.419 -      case TIME:
   1.420 -        try { r=readBytes(4, r, f); }
   1.421 -        catch(Return e){ return e.r; }
   1.422 -        if(gheader!=null)
   1.423 -          gheader.time = this.need;
   1.424 -        if ((flags & 0x0200)!=0){
   1.425 -          checksum(4, this.need);
   1.426 -        }
   1.427 -        this.mode = OS;
   1.428 -      case OS:
   1.429 -        try { r=readBytes(2, r, f); }
   1.430 -        catch(Return e){ return e.r; }
   1.431 -        if(gheader!=null){
   1.432 -          gheader.xflags = ((int)this.need)&0xff;
   1.433 -          gheader.os = (((int)this.need)>>8)&0xff;
   1.434 -        }
   1.435 -        if ((flags & 0x0200)!=0){
   1.436 -          checksum(2, this.need);
   1.437 -        }
   1.438 -        this.mode = EXLEN;
   1.439 -      case EXLEN:
   1.440 -        if ((flags & 0x0400)!=0) {
   1.441 -          try { r=readBytes(2, r, f); }
   1.442 -          catch(Return e){ return e.r; }
   1.443 -          if(gheader!=null){
   1.444 -            gheader.extra = new byte[((int)this.need)&0xffff];
   1.445 -          }
   1.446 -          if ((flags & 0x0200)!=0){
   1.447 -            checksum(2, this.need);
   1.448 -          }
   1.449 -        }
   1.450 -        else if(gheader!=null){
   1.451 -          gheader.extra=null;
   1.452 -        }
   1.453 -        this.mode = EXTRA;
   1.454 -
   1.455 -      case EXTRA:
   1.456 -        if ((flags & 0x0400)!=0) {
   1.457 -          try { 
   1.458 -            r=readBytes(r, f);
   1.459 -            if(gheader!=null){
   1.460 -              byte[] foo = tmp_array;
   1.461 -              tmp_array=null;
   1.462 -              if(foo.length == gheader.extra.length){
   1.463 -                System.arraycopy(foo, 0, gheader.extra, 0, foo.length);
   1.464 -	      }
   1.465 -              else{
   1.466 -                z.msg = "bad extra field length";
   1.467 -                this.mode = BAD; 
   1.468 -                break;
   1.469 -	      }
   1.470 -            }
   1.471 -          }
   1.472 -          catch(Return e){ return e.r; }
   1.473 -        }
   1.474 -        else if(gheader!=null){
   1.475 -          gheader.extra=null;
   1.476 -	}
   1.477 -	this.mode = NAME;
   1.478 -      case NAME:
   1.479 -	if ((flags & 0x0800)!=0) {
   1.480 -          try { 
   1.481 -            r=readString(r, f);
   1.482 -            if(gheader!=null){
   1.483 -              gheader.name=tmp_array;
   1.484 -            }
   1.485 -            tmp_array=null;
   1.486 -          }
   1.487 -          catch(Return e){ return e.r; }
   1.488 -        }
   1.489 -        else if(gheader!=null){
   1.490 -          gheader.name=null;
   1.491 -	}
   1.492 -        this.mode = COMMENT;
   1.493 -      case COMMENT:
   1.494 -        if ((flags & 0x1000)!=0) {
   1.495 -          try { 
   1.496 -            r=readString(r, f);
   1.497 -            if(gheader!=null){
   1.498 -              gheader.comment=tmp_array;
   1.499 -            }
   1.500 -            tmp_array=null;
   1.501 -          }
   1.502 -          catch(Return e){ return e.r; }
   1.503 -        }
   1.504 -        else if(gheader!=null){
   1.505 -          gheader.comment=null;
   1.506 -	}
   1.507 -        this.mode = HCRC;
   1.508 -      case HCRC:
   1.509 -	if ((flags & 0x0200)!=0) {
   1.510 -          try { r=readBytes(2, r, f); }
   1.511 -          catch(Return e){ return e.r; }
   1.512 -          if(gheader!=null){
   1.513 -            gheader.hcrc=(int)(this.need&0xffff);
   1.514 -          }
   1.515 -          if(this.need != (z.adler.getValue()&0xffffL)){
   1.516 -            this.mode = BAD;
   1.517 -            z.msg = "header crc mismatch";
   1.518 -            this.marker = 5;       // can't try inflateSync
   1.519 -            break;
   1.520 -          }
   1.521 -        }
   1.522 -        z.adler = new CRC32();
   1.523 -
   1.524 -        this.mode = BLOCKS;
   1.525 -        break;
   1.526 -      default:
   1.527 -        return Z_STREAM_ERROR;
   1.528 -      }
   1.529 -    }
   1.530 -  }
   1.531 -
   1.532 -  int inflateSetDictionary(byte[] dictionary, int dictLength){
   1.533 -    if(z==null || (this.mode != DICT0 && this.wrap != 0)){
   1.534 -      return Z_STREAM_ERROR;
   1.535 -    }
   1.536 -
   1.537 -    int index=0;
   1.538 -    int length = dictLength;
   1.539 -
   1.540 -    if(this.mode==DICT0){
   1.541 -      long adler_need=z.adler.getValue();
   1.542 -      z.adler.reset();
   1.543 -      z.adler.update(dictionary, 0, dictLength);
   1.544 -      if(z.adler.getValue()!=adler_need){
   1.545 -        return Z_DATA_ERROR;
   1.546 -      }
   1.547 -    }
   1.548 -
   1.549 -    z.adler.reset();
   1.550 -
   1.551 -    if(length >= (1<<this.wbits)){
   1.552 -      length = (1<<this.wbits)-1;
   1.553 -      index=dictLength - length;
   1.554 -    }
   1.555 -    this.blocks.set_dictionary(dictionary, index, length);
   1.556 -    this.mode = BLOCKS;
   1.557 -    return Z_OK;
   1.558 -  }
   1.559 -
   1.560 -  static private byte[] mark = {(byte)0, (byte)0, (byte)0xff, (byte)0xff};
   1.561 -
   1.562 -  int inflateSync(){
   1.563 -    int n;       // number of bytes to look at
   1.564 -    int p;       // pointer to bytes
   1.565 -    int m;       // number of marker bytes found in a row
   1.566 -    long r, w;   // temporaries to save total_in and total_out
   1.567 -
   1.568 -    // set up
   1.569 -    if(z == null)
   1.570 -      return Z_STREAM_ERROR;
   1.571 -    if(this.mode != BAD){
   1.572 -      this.mode = BAD;
   1.573 -      this.marker = 0;
   1.574 -    }
   1.575 -    if((n=z.avail_in)==0)
   1.576 -      return Z_BUF_ERROR;
   1.577 -
   1.578 -    p=z.next_in_index;
   1.579 -    m=this.marker;
   1.580 -    // search
   1.581 -    while (n!=0 && m < 4){
   1.582 -      if(z.next_in[p] == mark[m]){
   1.583 -        m++;
   1.584 -      }
   1.585 -      else if(z.next_in[p]!=0){
   1.586 -        m = 0;
   1.587 -      }
   1.588 -      else{
   1.589 -        m = 4 - m;
   1.590 -      }
   1.591 -      p++; n--;
   1.592 -    }
   1.593 -
   1.594 -    // restore
   1.595 -    z.total_in += p-z.next_in_index;
   1.596 -    z.next_in_index = p;
   1.597 -    z.avail_in = n;
   1.598 -    this.marker = m;
   1.599 -
   1.600 -    // return no joy or set up to restart on a new block
   1.601 -    if(m != 4){
   1.602 -      return Z_DATA_ERROR;
   1.603 -    }
   1.604 -    r=z.total_in;  w=z.total_out;
   1.605 -    inflateReset();
   1.606 -    z.total_in=r;  z.total_out = w;
   1.607 -    this.mode = BLOCKS;
   1.608 -
   1.609 -    return Z_OK;
   1.610 -  }
   1.611 -
   1.612 -  // Returns true if inflate is currently at the end of a block generated
   1.613 -  // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
   1.614 -  // implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH
   1.615 -  // but removes the length bytes of the resulting empty stored block. When
   1.616 -  // decompressing, PPP checks that at the end of input packet, inflate is
   1.617 -  // waiting for these length bytes.
   1.618 -  int inflateSyncPoint(){
   1.619 -    if(z == null || this.blocks == null)
   1.620 -      return Z_STREAM_ERROR;
   1.621 -    return this.blocks.sync_point();
   1.622 -  }
   1.623 -
   1.624 -  private int readBytes(int n, int r, int f) throws Return{
   1.625 -    if(need_bytes == -1){
   1.626 -      need_bytes=n;
   1.627 -      this.need=0;
   1.628 -    }
   1.629 -    while(need_bytes>0){
   1.630 -      if(z.avail_in==0){ throw new Return(r); }; r=f;
   1.631 -      z.avail_in--; z.total_in++;
   1.632 -      this.need = this.need | 
   1.633 -	((z.next_in[z.next_in_index++]&0xff)<<((n-need_bytes)*8));
   1.634 -      need_bytes--;
   1.635 -    }
   1.636 -    if(n==2){
   1.637 -      this.need&=0xffffL;
   1.638 -    }
   1.639 -    else if(n==4) {
   1.640 -      this.need&=0xffffffffL;
   1.641 -    }
   1.642 -    need_bytes=-1;
   1.643 -    return r;
   1.644 -  }
   1.645 -  class Return extends Exception{
   1.646 -    int r;
   1.647 -    Return(int r){this.r=r; }
   1.648 -  }
   1.649 -
   1.650 -  private byte[] tmp_array;
   1.651 -  private int readString(int r, int f) throws Return{
   1.652 -    int b=0; 
   1.653 -    byte[] arr = new byte[4092];
   1.654 -    int at = 0;
   1.655 -    do {
   1.656 -      if(z.avail_in==0){ throw new Return(r); }; r=f;
   1.657 -      z.avail_in--; z.total_in++;
   1.658 -      b = z.next_in[z.next_in_index];
   1.659 -      if(b!=0) arr = append(arr, z.next_in[z.next_in_index], at++);
   1.660 -      z.adler.update(z.next_in, z.next_in_index, 1);
   1.661 -      z.next_in_index++;
   1.662 -    }while(b!=0);
   1.663 -    
   1.664 -    tmp_array = copy(arr, at);
   1.665 -    
   1.666 -    return r;
   1.667 -  }
   1.668 -
   1.669 -  private int readBytes(int r, int f) throws Return{
   1.670 -    int b=0; 
   1.671 -    byte[] arr = new byte[4092];
   1.672 -    int at = 0;
   1.673 -    while(this.need>0){
   1.674 -      if(z.avail_in==0){ throw new Return(r); }; r=f;
   1.675 -      z.avail_in--; z.total_in++;
   1.676 -      b = z.next_in[z.next_in_index];
   1.677 -      arr = append(arr, z.next_in[z.next_in_index], at++);
   1.678 -      z.adler.update(z.next_in, z.next_in_index, 1);
   1.679 -      z.next_in_index++;
   1.680 -      this.need--;
   1.681 -    }
   1.682 -    
   1.683 -    tmp_array = copy(arr, at);
   1.684 -    
   1.685 -    return r;
   1.686 -  }
   1.687 -  
   1.688 -  private static byte[] copy(byte[] arr, int len) {
   1.689 -      byte[] ret = new byte[len];
   1.690 -      org.apidesign.bck2brwsr.emul.lang.System.arraycopy(arr, 0, ret, 0, len);
   1.691 -      return ret;
   1.692 -  }
   1.693 -  private static byte[] append(byte[] arr, byte b, int index) {
   1.694 -      arr[index] = b;
   1.695 -      return arr;
   1.696 -  }
   1.697 -
   1.698 -  private void checksum(int n, long v){
   1.699 -    for(int i=0; i<n; i++){
   1.700 -      crcbuf[i]=(byte)(v&0xff);
   1.701 -      v>>=8;
   1.702 -    }
   1.703 -    z.adler.update(crcbuf, 0, n);
   1.704 -  }
   1.705 -
   1.706 -  public GZIPHeader getGZIPHeader(){
   1.707 -    return gheader;
   1.708 -  }
   1.709 -
   1.710 -  boolean inParsingHeader(){
   1.711 -    switch(mode){
   1.712 -      case HEAD:
   1.713 -      case DICT4:
   1.714 -      case DICT3:
   1.715 -      case DICT2:
   1.716 -      case DICT1:
   1.717 -      case FLAGS:
   1.718 -      case TIME:
   1.719 -      case OS:
   1.720 -      case EXLEN:
   1.721 -      case EXTRA:
   1.722 -      case NAME:
   1.723 -      case COMMENT:
   1.724 -      case HCRC:
   1.725 -	return true;
   1.726 -      default:
   1.727 -	return false;
   1.728 -    }
   1.729 -  }
   1.730 -}