Beispiel #1
0
		internal InfBlocks( ZStream z, object checkfn, int w ) {
			this.window = new byte[ w ];
			this.end = w;
			this.checkfn = checkfn;
			this.mode = 0;
			this.reset( z, null );
		}
Beispiel #2
0
		public ZOutputStream( Stream out_Renamed, int level ) {
			this.z = new ZStream();
			this.bufsize = 0x200;
			this.buf1 = new byte[ 1 ];
			this.InitBlock();
			this.out_Renamed = out_Renamed;
			this.z.deflateInit( level );
			this.compress = true;
		}
Beispiel #3
0
		internal InfCodes( int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, ZStream z ) {
			this.mode = 0;
			this.lbits = (byte)bl;
			this.dbits = (byte)bd;
			this.ltree = tl;
			this.ltree_index = tl_index;
			this.dtree = td;
			this.dtree_index = td_index;
		}
Beispiel #4
0
		public ZOutputStream( Stream out_Renamed ) {
			this.z = new ZStream();
			this.bufsize = 0x200;
			this.buf1 = new byte[ 1 ];
			this.InitBlock();
			this.out_Renamed = out_Renamed;
			this.z.inflateInit();
			this.compress = false;
		}
Beispiel #5
0
		public virtual void end() {
			if( this.compress ) {
				this.z.deflateEnd();
			} else {
				this.z.inflateEnd();
			}
			this.z.free();
			this.z = null;
		}
Beispiel #6
0
		public ZInputStream( Stream in_Renamed, int level )
			: base( in_Renamed ) {
			this.z = new ZStream();
			this.bufsize = 0x200;
			this.buf1 = new byte[ 1 ];
			this.InitBlock();
			this.in_Renamed = in_Renamed;
			this.z.deflateInit( level );
			this.compress = true;
			this.z.next_in = this.buf;
			this.z.next_in_index = 0;
			this.z.avail_in = 0;
		}
Beispiel #7
0
		internal int inflate_flush( ZStream z, int r ) {
			int destinationIndex = z.next_out_index;
			int read = this.read;
			int len = ( ( read <= this.write ) ? this.write : this.end ) - read;
			if( len > z.avail_out ) {
				len = z.avail_out;
			}
			if( ( len != 0 ) && ( r == -5 ) ) {
				r = 0;
			}
			z.avail_out -= len;
			z.total_out += len;
			if( this.checkfn != null ) {
				z.adler = this.check = z._adler.adler32( this.check, this.window, read, len );
			}
			Array.Copy( this.window, read, z.next_out, destinationIndex, len );
			destinationIndex += len;
			read += len;
			if( read == this.end ) {
				read = 0;
				if( this.write == this.end ) {
					this.write = 0;
				}
				len = this.write - read;
				if( len > z.avail_out ) {
					len = z.avail_out;
				}
				if( ( len != 0 ) && ( r == -5 ) ) {
					r = 0;
				}
				z.avail_out -= len;
				z.total_out += len;
				if( this.checkfn != null ) {
					z.adler = this.check = z._adler.adler32( this.check, this.window, read, len );
				}
				Array.Copy( this.window, read, z.next_out, destinationIndex, len );
				destinationIndex += len;
				read += len;
			}
			z.next_out_index = destinationIndex;
			this.read = read;
			return r;
		}
Beispiel #8
0
		internal int deflateSetDictionary( ZStream strm, byte[] dictionary, int dictLength ) {
			int length = dictLength;
			int sourceIndex = 0;
			if( ( dictionary == null ) || ( this.status != 0x2a ) ) {
				return -2;
			}
			strm.adler = strm._adler.adler32( strm.adler, dictionary, 0, dictLength );
			if( length >= 3 ) {
				if( length > ( this.w_size - MIN_LOOKAHEAD ) ) {
					length = this.w_size - MIN_LOOKAHEAD;
					sourceIndex = dictLength - length;
				}
				Array.Copy( dictionary, sourceIndex, this.window, 0, length );
				this.strstart = length;
				this.block_start = length;
				this.ins_h = this.window[ 0 ] & 0xff;
				this.ins_h = ( ( this.ins_h << this.hash_shift ) ^ ( this.window[ 1 ] & 0xff ) ) & this.hash_mask;
				for( int i = 0; i <= ( length - 3 ); i++ ) {
					this.ins_h = ( ( this.ins_h << this.hash_shift ) ^ ( this.window[ i + 2 ] & 0xff ) ) & this.hash_mask;
					this.prev[ i & this.w_mask ] = this.head[ this.ins_h ];
					this.head[ this.ins_h ] = (short)i;
				}
			}
			return 0;
		}
Beispiel #9
0
		internal int proc( ZStream z, int r ) {
			int table;
			int sourceIndex = z.next_in_index;
			int num5 = z.avail_in;
			int bitb = this.bitb;
			int bitk = this.bitk;
			int write = this.write;
			int num7 = ( write < this.read ) ? ( ( this.read - write ) - 1 ) : ( this.end - write );
Label_0047:
			switch( this.mode ) {
				case 0:
					while( bitk < 3 ) {
						if( num5 != 0 ) {
							r = 0;
						} else {
							this.bitb = bitb;
							this.bitk = bitk;
							z.avail_in = num5;
							z.total_in += sourceIndex - z.next_in_index;
							z.next_in_index = sourceIndex;
							this.write = write;
							return this.inflate_flush( z, r );
						}
						num5--;
						bitb |= ( z.next_in[ sourceIndex++ ] & 0xff ) << bitk;
						bitk += 8;
					}
					table = bitb & 7;
					this.last = table & 1;
					switch( SupportClass.URShift( table, 1 ) ) {
						case 0:
							bitb = SupportClass.URShift( bitb, 3 );
							bitk -= 3;
							table = bitk & 7;
							bitb = SupportClass.URShift( bitb, table );
							bitk -= table;
							this.mode = 1;
							goto Label_0047;

						case 1: {
								int[] numArray = new int[ 1 ];
								int[] numArray2 = new int[ 1 ];
								int[][] numArray3 = new int[ 1 ][];
								int[][] numArray4 = new int[ 1 ][];
								InfTree.inflate_trees_fixed( numArray, numArray2, numArray3, numArray4, z );
								this.codes = new InfCodes( numArray[ 0 ], numArray2[ 0 ], numArray3[ 0 ], numArray4[ 0 ], z );
								bitb = SupportClass.URShift( bitb, 3 );
								bitk -= 3;
								this.mode = 6;
								goto Label_0047;
							}
						case 2:
							bitb = SupportClass.URShift( bitb, 3 );
							bitk -= 3;
							this.mode = 3;
							goto Label_0047;

						case 3:
							bitb = SupportClass.URShift( bitb, 3 );
							bitk -= 3;
							this.mode = 9;
							z.msg = "invalid block type";
							r = -3;
							this.bitb = bitb;
							this.bitk = bitk;
							z.avail_in = num5;
							z.total_in += sourceIndex - z.next_in_index;
							z.next_in_index = sourceIndex;
							this.write = write;
							return this.inflate_flush( z, r );
					}
					goto Label_0047;

				case 1:
					while( bitk < 0x20 ) {
						if( num5 != 0 ) {
							r = 0;
						} else {
							this.bitb = bitb;
							this.bitk = bitk;
							z.avail_in = num5;
							z.total_in += sourceIndex - z.next_in_index;
							z.next_in_index = sourceIndex;
							this.write = write;
							return this.inflate_flush( z, r );
						}
						num5--;
						bitb |= ( z.next_in[ sourceIndex++ ] & 0xff ) << bitk;
						bitk += 8;
					}
					if( ( SupportClass.URShift( ~bitb, 0x10 ) & 0xffff ) != ( bitb & 0xffff ) ) {
						this.mode = 9;
						z.msg = "invalid stored block lengths";
						r = -3;
						this.bitb = bitb;
						this.bitk = bitk;
						z.avail_in = num5;
						z.total_in += sourceIndex - z.next_in_index;
						z.next_in_index = sourceIndex;
						this.write = write;
						return this.inflate_flush( z, r );
					}
					this.left = bitb & 0xffff;
					bitb = bitk = 0;
					this.mode = ( this.left != 0 ) ? 2 : ( ( this.last != 0 ) ? 7 : 0 );
					goto Label_0047;

				case 2:
					if( num5 != 0 ) {
						if( num7 == 0 ) {
							if( ( write == this.end ) && ( this.read != 0 ) ) {
								write = 0;
								num7 = ( write < this.read ) ? ( ( this.read - write ) - 1 ) : ( this.end - write );
							}
							if( num7 == 0 ) {
								this.write = write;
								r = this.inflate_flush( z, r );
								write = this.write;
								num7 = ( write < this.read ) ? ( ( this.read - write ) - 1 ) : ( this.end - write );
								if( ( write == this.end ) && ( this.read != 0 ) ) {
									write = 0;
									num7 = ( write < this.read ) ? ( ( this.read - write ) - 1 ) : ( this.end - write );
								}
								if( num7 == 0 ) {
									this.bitb = bitb;
									this.bitk = bitk;
									z.avail_in = num5;
									z.total_in += sourceIndex - z.next_in_index;
									z.next_in_index = sourceIndex;
									this.write = write;
									return this.inflate_flush( z, r );
								}
							}
						}
						r = 0;
						table = this.left;
						if( table > num5 ) {
							table = num5;
						}
						if( table > num7 ) {
							table = num7;
						}
						Array.Copy( z.next_in, sourceIndex, this.window, write, table );
						sourceIndex += table;
						num5 -= table;
						write += table;
						num7 -= table;
						this.left -= table;
						if( this.left == 0 ) {
							this.mode = ( this.last != 0 ) ? 7 : 0;
						}
						goto Label_0047;
					}
					this.bitb = bitb;
					this.bitk = bitk;
					z.avail_in = num5;
					z.total_in += sourceIndex - z.next_in_index;
					z.next_in_index = sourceIndex;
					this.write = write;
					return this.inflate_flush( z, r );

				case 3:
					while( bitk < 14 ) {
						if( num5 != 0 ) {
							r = 0;
						} else {
							this.bitb = bitb;
							this.bitk = bitk;
							z.avail_in = num5;
							z.total_in += sourceIndex - z.next_in_index;
							z.next_in_index = sourceIndex;
							this.write = write;
							return this.inflate_flush( z, r );
						}
						num5--;
						bitb |= ( z.next_in[ sourceIndex++ ] & 0xff ) << bitk;
						bitk += 8;
					}
					this.table = table = bitb & 0x3fff;
					if( ( ( table & 0x1f ) > 0x1d ) || ( ( ( table >> 5 ) & 0x1f ) > 0x1d ) ) {
						this.mode = 9;
						z.msg = "too many length or distance symbols";
						r = -3;
						this.bitb = bitb;
						this.bitk = bitk;
						z.avail_in = num5;
						z.total_in += sourceIndex - z.next_in_index;
						z.next_in_index = sourceIndex;
						this.write = write;
						return this.inflate_flush( z, r );
					}
					table = ( 0x102 + ( table & 0x1f ) ) + ( ( table >> 5 ) & 0x1f );
					this.blens = new int[ table ];
					bitb = SupportClass.URShift( bitb, 14 );
					bitk -= 14;
					this.index = 0;
					this.mode = 4;
					break;

				case 4:
					break;

				case 5:
					goto Label_07B9;

				case 6:
					goto Label_0B63;

				case 7:
					goto Label_0C2C;

				case 8:
					goto Label_0CC1;

				case 9:
					r = -3;
					this.bitb = bitb;
					this.bitk = bitk;
					z.avail_in = num5;
					z.total_in += sourceIndex - z.next_in_index;
					z.next_in_index = sourceIndex;
					this.write = write;
					return this.inflate_flush( z, r );

				default:
					r = -2;
					this.bitb = bitb;
					this.bitk = bitk;
					z.avail_in = num5;
					z.total_in += sourceIndex - z.next_in_index;
					z.next_in_index = sourceIndex;
					this.write = write;
					return this.inflate_flush( z, r );
			}
			while( this.index < ( 4 + SupportClass.URShift( this.table, 10 ) ) ) {
				while( bitk < 3 ) {
					if( num5 != 0 ) {
						r = 0;
					} else {
						this.bitb = bitb;
						this.bitk = bitk;
						z.avail_in = num5;
						z.total_in += sourceIndex - z.next_in_index;
						z.next_in_index = sourceIndex;
						this.write = write;
						return this.inflate_flush( z, r );
					}
					num5--;
					bitb |= ( z.next_in[ sourceIndex++ ] & 0xff ) << bitk;
					bitk += 8;
				}
				this.blens[ border[ this.index++ ] ] = bitb & 7;
				bitb = SupportClass.URShift( bitb, 3 );
				bitk -= 3;
			}
			while( this.index < 0x13 ) {
				this.blens[ border[ this.index++ ] ] = 0;
			}
			this.bb[ 0 ] = 7;
			table = InfTree.inflate_trees_bits( this.blens, this.bb, this.tb, this.hufts, z );
			if( table != 0 ) {
				r = table;
				if( r == -3 ) {
					this.blens = null;
					this.mode = 9;
				}
				this.bitb = bitb;
				this.bitk = bitk;
				z.avail_in = num5;
				z.total_in += sourceIndex - z.next_in_index;
				z.next_in_index = sourceIndex;
				this.write = write;
				return this.inflate_flush( z, r );
			}
			this.index = 0;
			this.mode = 5;
Label_07B9:
			table = this.table;
			if( this.index < ( ( 0x102 + ( table & 0x1f ) ) + ( ( table >> 5 ) & 0x1f ) ) ) {
				table = this.bb[ 0 ];
				while( bitk < table ) {
					if( num5 != 0 ) {
						r = 0;
					} else {
						this.bitb = bitb;
						this.bitk = bitk;
						z.avail_in = num5;
						z.total_in += sourceIndex - z.next_in_index;
						z.next_in_index = sourceIndex;
						this.write = write;
						return this.inflate_flush( z, r );
					}
					num5--;
					bitb |= ( z.next_in[ sourceIndex++ ] & 0xff ) << bitk;
					bitk += 8;
				}
				int num1 = this.tb[ 0 ];
				table = this.hufts[ ( ( this.tb[ 0 ] + ( bitb & inflate_mask[ table ] ) ) * 3 ) + 1 ];
				int num10 = this.hufts[ ( ( this.tb[ 0 ] + ( bitb & inflate_mask[ table ] ) ) * 3 ) + 2 ];
				if( num10 < 0x10 ) {
					bitb = SupportClass.URShift( bitb, table );
					bitk -= table;
					this.blens[ this.index++ ] = num10;
				} else {
					int index = ( num10 == 0x12 ) ? 7 : ( num10 - 14 );
					int num9 = ( num10 == 0x12 ) ? 11 : 3;
					while( bitk < ( table + index ) ) {
						if( num5 != 0 ) {
							r = 0;
						} else {
							this.bitb = bitb;
							this.bitk = bitk;
							z.avail_in = num5;
							z.total_in += sourceIndex - z.next_in_index;
							z.next_in_index = sourceIndex;
							this.write = write;
							return this.inflate_flush( z, r );
						}
						num5--;
						bitb |= ( z.next_in[ sourceIndex++ ] & 0xff ) << bitk;
						bitk += 8;
					}
					bitb = SupportClass.URShift( bitb, table );
					bitk -= table;
					num9 += bitb & inflate_mask[ index ];
					bitb = SupportClass.URShift( bitb, index );
					bitk -= index;
					index = this.index;
					table = this.table;
					if( ( ( index + num9 ) > ( ( 0x102 + ( table & 0x1f ) ) + ( ( table >> 5 ) & 0x1f ) ) ) || ( ( num10 == 0x10 ) && ( index < 1 ) ) ) {
						this.blens = null;
						this.mode = 9;
						z.msg = "invalid bit length repeat";
						r = -3;
						this.bitb = bitb;
						this.bitk = bitk;
						z.avail_in = num5;
						z.total_in += sourceIndex - z.next_in_index;
						z.next_in_index = sourceIndex;
						this.write = write;
						return this.inflate_flush( z, r );
					}
					num10 = ( num10 == 0x10 ) ? this.blens[ index - 1 ] : 0;
					do {
						this.blens[ index++ ] = num10;
					}
					while( --num9 != 0 );
					this.index = index;
				}
				goto Label_07B9;
			}
			this.tb[ 0 ] = -1;
			int[] bl = new int[ 1 ];
			int[] bd = new int[ 1 ];
			int[] tl = new int[ 1 ];
			int[] td = new int[ 1 ];
			bl[ 0 ] = 9;
			bd[ 0 ] = 6;
			table = this.table;
			table = InfTree.inflate_trees_dynamic( 0x101 + ( table & 0x1f ), 1 + ( ( table >> 5 ) & 0x1f ), this.blens, bl, bd, tl, td, this.hufts, z );
			switch( table ) {
				case 0:
					this.codes = new InfCodes( bl[ 0 ], bd[ 0 ], this.hufts, tl[ 0 ], this.hufts, td[ 0 ], z );
					this.blens = null;
					this.mode = 6;
					goto Label_0B63;

				case -3:
					this.blens = null;
					this.mode = 9;
					break;
			}
			r = table;
			this.bitb = bitb;
			this.bitk = bitk;
			z.avail_in = num5;
			z.total_in += sourceIndex - z.next_in_index;
			z.next_in_index = sourceIndex;
			this.write = write;
			return this.inflate_flush( z, r );
Label_0B63:
			this.bitb = bitb;
			this.bitk = bitk;
			z.avail_in = num5;
			z.total_in += sourceIndex - z.next_in_index;
			z.next_in_index = sourceIndex;
			this.write = write;
			if( ( r = this.codes.proc( this, z, r ) ) != 1 ) {
				return this.inflate_flush( z, r );
			}
			r = 0;
			this.codes.free( z );
			sourceIndex = z.next_in_index;
			num5 = z.avail_in;
			bitb = this.bitb;
			bitk = this.bitk;
			write = this.write;
			num7 = ( write < this.read ) ? ( ( this.read - write ) - 1 ) : ( this.end - write );
			if( this.last == 0 ) {
				this.mode = 0;
				goto Label_0047;
			}
			this.mode = 7;
Label_0C2C:
			this.write = write;
			r = this.inflate_flush( z, r );
			write = this.write;
			num7 = ( write < this.read ) ? ( ( this.read - write ) - 1 ) : ( this.end - write );
			if( this.read != this.write ) {
				this.bitb = bitb;
				this.bitk = bitk;
				z.avail_in = num5;
				z.total_in += sourceIndex - z.next_in_index;
				z.next_in_index = sourceIndex;
				this.write = write;
				return this.inflate_flush( z, r );
			}
			this.mode = 8;
Label_0CC1:
			r = 1;
			this.bitb = bitb;
			this.bitk = bitk;
			z.avail_in = num5;
			z.total_in += sourceIndex - z.next_in_index;
			z.next_in_index = sourceIndex;
			this.write = write;
			return this.inflate_flush( z, r );
		}
Beispiel #10
0
		internal int deflateParams( ZStream strm, int _level, int _strategy ) {
			int num = 0;
			if( _level == -1 ) {
				_level = 6;
			}
			if( ( ( _level < 0 ) || ( _level > 9 ) ) || ( ( _strategy < 0 ) || ( _strategy > 2 ) ) ) {
				return -2;
			}
			if( ( config_table[ this.level ].func != config_table[ _level ].func ) && ( strm.total_in != 0L ) ) {
				num = strm.deflate( 1 );
			}
			if( this.level != _level ) {
				this.level = _level;
				this.max_lazy_match = config_table[ this.level ].max_lazy;
				this.good_match = config_table[ this.level ].good_length;
				this.nice_match = config_table[ this.level ].nice_length;
				this.max_chain_length = config_table[ this.level ].max_chain;
			}
			this.strategy = _strategy;
			return num;
		}
Beispiel #11
0
		internal int deflateReset( ZStream strm ) {
			strm.total_in = strm.total_out = 0L;
			strm.msg = null;
			strm.data_type = 2;
			this.pending = 0;
			this.pending_out = 0;
			if( this.noheader < 0 ) {
				this.noheader = 0;
			}
			this.status = ( this.noheader != 0 ) ? 0x71 : 0x2a;
			strm.adler = strm._adler.adler32( 0L, null, 0, 0 );
			this.last_flush = 0;
			this.tr_init();
			this.lm_init();
			return 0;
		}
Beispiel #12
0
		internal int inflateSync( ZStream z ) {
			if( ( z == null ) || ( z.istate == null ) ) {
				return -2;
			}
			if( z.istate.mode != 13 ) {
				z.istate.mode = 13;
				z.istate.marker = 0;
			}
			int num = z.avail_in;
			if( num == 0 ) {
				return -5;
			}
			int index = z.next_in_index;
			int marker = z.istate.marker;
			while( ( num != 0 ) && ( marker < 4 ) ) {
				if( z.next_in[ index ] == mark[ marker ] ) {
					marker++;
				} else if( z.next_in[ index ] != 0 ) {
					marker = 0;
				} else {
					marker = 4 - marker;
				}
				index++;
				num--;
			}
			z.total_in += index - z.next_in_index;
			z.next_in_index = index;
			z.avail_in = num;
			z.istate.marker = marker;
			if( marker != 4 ) {
				return -3;
			}
			long num4 = z.total_in;
			long num5 = z.total_out;
			this.inflateReset( z );
			z.total_in = num4;
			z.total_out = num5;
			z.istate.mode = 7;
			return 0;
		}
Beispiel #13
0
		internal int deflateInit2( ZStream strm, int level, int method, int windowBits, int memLevel, int strategy ) {
			int num = 0;
			strm.msg = null;
			if( level == -1 ) {
				level = 6;
			}
			if( windowBits < 0 ) {
				num = 1;
				windowBits = -windowBits;
			}
			if( ( ( ( memLevel < 1 ) || ( memLevel > 9 ) ) || ( ( method != 8 ) || ( windowBits < 9 ) ) ) || ( ( ( windowBits > 15 ) || ( level < 0 ) ) || ( ( ( level > 9 ) || ( strategy < 0 ) ) || ( strategy > 2 ) ) ) ) {
				return -2;
			}
			strm.dstate = this;
			this.noheader = num;
			this.w_bits = windowBits;
			this.w_size = ( (int)1 ) << this.w_bits;
			this.w_mask = this.w_size - 1;
			this.hash_bits = memLevel + 7;
			this.hash_size = ( (int)1 ) << this.hash_bits;
			this.hash_mask = this.hash_size - 1;
			this.hash_shift = ( ( this.hash_bits + 3 ) - 1 ) / 3;
			this.window = new byte[ this.w_size * 2 ];
			this.prev = new short[ this.w_size ];
			this.head = new short[ this.hash_size ];
			this.lit_bufsize = ( (int)1 ) << ( memLevel + 6 );
			this.pending_buf = new byte[ this.lit_bufsize * 4 ];
			this.pending_buf_size = this.lit_bufsize * 4;
			this.d_buf = this.lit_bufsize / 2;
			this.l_buf = 3 * this.lit_bufsize;
			this.level = level;
			this.strategy = strategy;
			this.method = (byte)method;
			return this.deflateReset( strm );
		}
Beispiel #14
0
		internal static int inflate_trees_dynamic( int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZStream z ) {
			int[] hn = new int[ 1 ];
			int[] v = new int[ 0x120 ];
			int num = huft_build( c, 0, nl, 0x101, cplens, cplext, tl, bl, hp, hn, v );
			if( ( num != 0 ) || ( bl[ 0 ] == 0 ) ) {
				if( num == -3 ) {
					z.msg = "oversubscribed literal/length tree";
					return num;
				}
				if( num != -4 ) {
					z.msg = "incomplete literal/length tree";
					num = -3;
				}
				return num;
			}
			num = huft_build( c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v );
			if( ( num == 0 ) && ( ( bd[ 0 ] != 0 ) || ( nl <= 0x101 ) ) ) {
				return 0;
			}
			if( num == -3 ) {
				z.msg = "oversubscribed distance tree";
				return num;
			}
			if( num == -5 ) {
				z.msg = "incomplete distance tree";
				return -3;
			}
			if( num != -4 ) {
				z.msg = "empty distance tree with lengths";
				num = -3;
			}
			return num;
		}
Beispiel #15
0
		internal void free( ZStream z ) {
			this.reset( z, null );
			this.window = null;
			this.hufts = null;
		}
Beispiel #16
0
		internal int inflateInit( ZStream z, int w ) {
			z.msg = null;
			this.blocks = null;
			this.nowrap = 0;
			if( w < 0 ) {
				w = -w;
				this.nowrap = 1;
			}
			if( ( w < 8 ) || ( w > 15 ) ) {
				this.inflateEnd( z );
				return -2;
			}
			this.wbits = w;
			z.istate.blocks = new InfBlocks( z, ( z.istate.nowrap != 0 ) ? null : this, ( (int)1 ) << w );
			this.inflateReset( z );
			return 0;
		}
Beispiel #17
0
		internal int inflateEnd( ZStream z ) {
			if( this.blocks != null ) {
				this.blocks.free( z );
			}
			this.blocks = null;
			return 0;
		}
Beispiel #18
0
		internal int inflateReset( ZStream z ) {
			if( ( z == null ) || ( z.istate == null ) ) {
				return -2;
			}
			z.total_in = z.total_out = 0L;
			z.msg = null;
			z.istate.mode = ( z.istate.nowrap != 0 ) ? 7 : 0;
			z.istate.blocks.reset( z, null );
			return 0;
		}
Beispiel #19
0
		internal int inflate( ZStream z, int f ) {
			if( ( ( z == null ) || ( z.istate == null ) ) || ( z.next_in == null ) ) {
				return -2;
			}
			f = ( f == 4 ) ? -5 : 0;
			int r = -5;
Label_0024:
			switch( z.istate.mode ) {
				case 0:
					if( z.avail_in != 0 ) {
						r = f;
						z.avail_in--;
						z.total_in += 1L;
						if( ( ( z.istate.method = z.next_in[ z.next_in_index++ ] ) & 15 ) != 8 ) {
							z.istate.mode = 13;
							z.msg = "unknown compression method";
							z.istate.marker = 5;
							goto Label_0024;
						}
						if( ( ( z.istate.method >> 4 ) + 8 ) > z.istate.wbits ) {
							z.istate.mode = 13;
							z.msg = "invalid window size";
							z.istate.marker = 5;
							goto Label_0024;
						}
						z.istate.mode = 1;
						break;
					}
					return r;

				case 1:
					break;

				case 2:
					goto Label_01EE;

				case 3:
					goto Label_0258;

				case 4:
					goto Label_02CA;

				case 5:
					goto Label_033B;

				case 6:
					z.istate.mode = 13;
					z.msg = "need dictionary";
					z.istate.marker = 0;
					return -2;

				case 7:
					r = z.istate.blocks.proc( z, r );
					if( r != -3 ) {
						if( r == 0 ) {
							r = f;
						}
						if( r != 1 ) {
							return r;
						}
						r = f;
						z.istate.blocks.reset( z, z.istate.was );
						if( z.istate.nowrap != 0 ) {
							z.istate.mode = 12;
							goto Label_0024;
						}
						z.istate.mode = 8;
						goto Label_0468;
					}
					z.istate.mode = 13;
					z.istate.marker = 0;
					goto Label_0024;

				case 8:
					goto Label_0468;

				case 9:
					goto Label_04D3;

				case 10:
					goto Label_0546;

				case 11:
					goto Label_05B8;

				case 12:
					goto Label_0667;

				case 13:
					return -3;

				default:
					return -2;
			}
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			int num2 = z.next_in[ z.next_in_index++ ] & 0xff;
			if( ( ( ( z.istate.method << 8 ) + num2 ) % 0x1f ) != 0 ) {
				z.istate.mode = 13;
				z.msg = "incorrect header check";
				z.istate.marker = 5;
				goto Label_0024;
			}
			if( ( num2 & 0x20 ) == 0 ) {
				z.istate.mode = 7;
				goto Label_0024;
			}
			z.istate.mode = 2;
Label_01EE:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need = ( ( z.next_in[ z.next_in_index++ ] & 0xff ) << 0x18 ) & -16777216;
			z.istate.mode = 3;
Label_0258:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need += ( ( z.next_in[ z.next_in_index++ ] & 0xff ) << 0x10 ) & 0xff0000L;
			z.istate.mode = 4;
Label_02CA:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need += ( ( z.next_in[ z.next_in_index++ ] & 0xff ) << 8 ) & 0xff00L;
			z.istate.mode = 5;
Label_033B:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need += z.next_in[ z.next_in_index++ ] & 0xffL;
			z.adler = z.istate.need;
			z.istate.mode = 6;
			return 2;
Label_0468:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need = ( ( z.next_in[ z.next_in_index++ ] & 0xff ) << 0x18 ) & -16777216;
			z.istate.mode = 9;
Label_04D3:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need += ( ( z.next_in[ z.next_in_index++ ] & 0xff ) << 0x10 ) & 0xff0000L;
			z.istate.mode = 10;
Label_0546:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need += ( ( z.next_in[ z.next_in_index++ ] & 0xff ) << 8 ) & 0xff00L;
			z.istate.mode = 11;
Label_05B8:
			if( z.avail_in == 0 ) {
				return r;
			}
			r = f;
			z.avail_in--;
			z.total_in += 1L;
			z.istate.need += z.next_in[ z.next_in_index++ ] & 0xffL;
			if( ( (int)z.istate.was[ 0 ] ) != ( (int)z.istate.need ) ) {
				z.istate.mode = 13;
				z.msg = "incorrect data check";
				z.istate.marker = 5;
				goto Label_0024;
			}
			z.istate.mode = 12;
Label_0667:
			return 1;
		}
Beispiel #20
0
		internal int inflateSyncPoint( ZStream z ) {
			if( ( ( z != null ) && ( z.istate != null ) ) && ( z.istate.blocks != null ) ) {
				return z.istate.blocks.sync_point();
			}
			return -2;
		}
Beispiel #21
0
		internal void free( ZStream z ) {
		}
Beispiel #22
0
		internal int inflate_fast( int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InfBlocks s, ZStream z ) {
			int num12;
			int num6 = z.next_in_index;
			int num7 = z.avail_in;
			int bitb = s.bitb;
			int bitk = s.bitk;
			int write = s.write;
			int num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
			int num10 = inflate_mask[ bl ];
			int num11 = inflate_mask[ bd ];
Label_0092:
			while( bitk < 20 ) {
				num7--;
				bitb |= ( z.next_in[ num6++ ] & 0xff ) << bitk;
				bitk += 8;
			}
			int num = bitb & num10;
			int[] numArray = tl;
			int num2 = tl_index;
			int index = numArray[ ( num2 + num ) * 3 ];
			if( index == 0 ) {
				bitb = bitb >> numArray[ ( ( num2 + num ) * 3 ) + 1 ];
				bitk -= numArray[ ( ( num2 + num ) * 3 ) + 1 ];
				s.window[ write++ ] = (byte)numArray[ ( ( num2 + num ) * 3 ) + 2 ];
				num9--;
				goto Label_05E0;
			}
Label_00F1:
			bitb = bitb >> numArray[ ( ( num2 + num ) * 3 ) + 1 ];
			bitk -= numArray[ ( ( num2 + num ) * 3 ) + 1 ];
			if( ( index & 0x10 ) == 0 ) {
				if( ( index & 0x40 ) == 0 ) {
					num += numArray[ ( ( num2 + num ) * 3 ) + 2 ];
					num += bitb & inflate_mask[ index ];
					index = numArray[ ( num2 + num ) * 3 ];
					if( index != 0 ) {
						goto Label_00F1;
					}
					bitb = bitb >> numArray[ ( ( num2 + num ) * 3 ) + 1 ];
					bitk -= numArray[ ( ( num2 + num ) * 3 ) + 1 ];
					s.window[ write++ ] = (byte)numArray[ ( ( num2 + num ) * 3 ) + 2 ];
					num9--;
				} else {
					if( ( index & 0x20 ) != 0 ) {
						num12 = z.avail_in - num7;
						num12 = ( ( bitk >> 3 ) < num12 ) ? ( bitk >> 3 ) : num12;
						num7 += num12;
						num6 -= num12;
						bitk -= num12 << 3;
						s.bitb = bitb;
						s.bitk = bitk;
						z.avail_in = num7;
						z.total_in += num6 - z.next_in_index;
						z.next_in_index = num6;
						s.write = write;
						return 1;
					}
					z.msg = "invalid literal/length code";
					num12 = z.avail_in - num7;
					num12 = ( ( bitk >> 3 ) < num12 ) ? ( bitk >> 3 ) : num12;
					num7 += num12;
					num6 -= num12;
					bitk -= num12 << 3;
					s.bitb = bitb;
					s.bitk = bitk;
					z.avail_in = num7;
					z.total_in += num6 - z.next_in_index;
					z.next_in_index = num6;
					s.write = write;
					return -3;
				}
				goto Label_05E0;
			}
			index &= 15;
			num12 = numArray[ ( ( num2 + num ) * 3 ) + 2 ] + ( bitb & inflate_mask[ index ] );
			bitb = bitb >> index;
			bitk -= index;
			while( bitk < 15 ) {
				num7--;
				bitb |= ( z.next_in[ num6++ ] & 0xff ) << bitk;
				bitk += 8;
			}
			num = bitb & num11;
			numArray = td;
			num2 = td_index;
			index = numArray[ ( num2 + num ) * 3 ];
Label_018B:
			bitb = bitb >> numArray[ ( ( num2 + num ) * 3 ) + 1 ];
			bitk -= numArray[ ( ( num2 + num ) * 3 ) + 1 ];
			if( ( index & 0x10 ) != 0 ) {
				int num14;
				index &= 15;
				while( bitk < index ) {
					num7--;
					bitb |= ( z.next_in[ num6++ ] & 0xff ) << bitk;
					bitk += 8;
				}
				int num13 = numArray[ ( ( num2 + num ) * 3 ) + 2 ] + ( bitb & inflate_mask[ index ] );
				bitb = bitb >> index;
				bitk -= index;
				num9 -= num12;
				if( write >= num13 ) {
					num14 = write - num13;
					if( ( ( write - num14 ) > 0 ) && ( 2 > ( write - num14 ) ) ) {
						s.window[ write++ ] = s.window[ num14++ ];
						num12--;
						s.window[ write++ ] = s.window[ num14++ ];
						num12--;
					} else {
						Array.Copy( s.window, num14, s.window, write, 2 );
						write += 2;
						num14 += 2;
						num12 -= 2;
					}
				} else {
					num14 = write - num13;
					do {
						num14 += s.end;
					}
					while( num14 < 0 );
					index = s.end - num14;
					if( num12 > index ) {
						num12 -= index;
						if( ( ( write - num14 ) > 0 ) && ( index > ( write - num14 ) ) ) {
							do {
								s.window[ write++ ] = s.window[ num14++ ];
							}
							while( --index != 0 );
						} else {
							Array.Copy( s.window, num14, s.window, write, index );
							write += index;
							num14 += index;
							index = 0;
						}
						num14 = 0;
					}
				}
				if( ( ( write - num14 ) > 0 ) && ( num12 > ( write - num14 ) ) ) {
					do {
						s.window[ write++ ] = s.window[ num14++ ];
					}
					while( --num12 != 0 );
				} else {
					Array.Copy( s.window, num14, s.window, write, num12 );
					write += num12;
					num14 += num12;
					num12 = 0;
				}
			} else {
				if( ( index & 0x40 ) == 0 ) {
					num += numArray[ ( ( num2 + num ) * 3 ) + 2 ];
					num += bitb & inflate_mask[ index ];
					index = numArray[ ( num2 + num ) * 3 ];
					goto Label_018B;
				}
				z.msg = "invalid distance code";
				num12 = z.avail_in - num7;
				num12 = ( ( bitk >> 3 ) < num12 ) ? ( bitk >> 3 ) : num12;
				num7 += num12;
				num6 -= num12;
				bitk -= num12 << 3;
				s.bitb = bitb;
				s.bitk = bitk;
				z.avail_in = num7;
				z.total_in += num6 - z.next_in_index;
				z.next_in_index = num6;
				s.write = write;
				return -3;
			}
Label_05E0:
			if( ( num9 >= 0x102 ) && ( num7 >= 10 ) ) {
				goto Label_0092;
			}
			num12 = z.avail_in - num7;
			num12 = ( ( bitk >> 3 ) < num12 ) ? ( bitk >> 3 ) : num12;
			num7 += num12;
			num6 -= num12;
			bitk -= num12 << 3;
			s.bitb = bitb;
			s.bitk = bitk;
			z.avail_in = num7;
			z.total_in += num6 - z.next_in_index;
			z.next_in_index = num6;
			s.write = write;
			return 0;
		}
Beispiel #23
0
		internal void reset( ZStream z, long[] c ) {
			if( c != null ) {
				c[ 0 ] = this.check;
			}
			if( ( this.mode == 4 ) || ( this.mode == 5 ) ) {
				this.blens = null;
			}
			if( this.mode == 6 ) {
				this.codes.free( z );
			}
			this.mode = 0;
			this.bitk = 0;
			this.bitb = 0;
			this.read = this.write = 0;
			if( this.checkfn != null ) {
				z.adler = this.check = z._adler.adler32( 0L, null, 0, 0 );
			}
		}
Beispiel #24
0
		internal int deflateInit( ZStream strm, int level, int bits ) {
			return this.deflateInit2( strm, level, 8, bits, 8, 0 );
		}
Beispiel #25
0
		internal int deflate( ZStream strm, int flush ) {
			if( ( flush > 4 ) || ( flush < 0 ) ) {
				return -2;
			}
			if( ( ( strm.next_out == null ) || ( ( strm.next_in == null ) && ( strm.avail_in != 0 ) ) ) || ( ( this.status == 0x29a ) && ( flush != 4 ) ) ) {
				strm.msg = z_errmsg[ 4 ];
				return -2;
			}
			if( strm.avail_out == 0 ) {
				strm.msg = z_errmsg[ 7 ];
				return -5;
			}
			this.strm = strm;
			int num = this.last_flush;
			this.last_flush = flush;
			if( this.status == 0x2a ) {
				int b = ( 8 + ( ( this.w_bits - 8 ) << 4 ) ) << 8;
				int num3 = ( ( this.level - 1 ) & 0xff ) >> 1;
				if( num3 > 3 ) {
					num3 = 3;
				}
				b |= num3 << 6;
				if( this.strstart != 0 ) {
					b |= 0x20;
				}
				b += 0x1f - ( b % 0x1f );
				this.status = 0x71;
				this.putShortMSB( b );
				if( this.strstart != 0 ) {
					this.putShortMSB( (int)SupportClass.URShift( strm.adler, 0x10 ) );
					this.putShortMSB( (int)( strm.adler & 0xffffL ) );
				}
				strm.adler = strm._adler.adler32( 0L, null, 0, 0 );
			}
			if( this.pending != 0 ) {
				strm.flush_pending();
				if( strm.avail_out == 0 ) {
					this.last_flush = -1;
					return 0;
				}
			} else if( ( ( strm.avail_in == 0 ) && ( flush <= num ) ) && ( flush != 4 ) ) {
				strm.msg = z_errmsg[ 7 ];
				return -5;
			}
			if( ( this.status == 0x29a ) && ( strm.avail_in != 0 ) ) {
				strm.msg = z_errmsg[ 7 ];
				return -5;
			}
			if( ( ( strm.avail_in != 0 ) || ( this.lookahead != 0 ) ) || ( ( flush != 0 ) && ( this.status != 0x29a ) ) ) {
				int num4 = -1;
				switch( config_table[ this.level ].func ) {
					case 0:
						num4 = this.deflate_stored( flush );
						break;

					case 1:
						num4 = this.deflate_fast( flush );
						break;

					case 2:
						num4 = this.deflate_slow( flush );
						break;
				}
				switch( num4 ) {
					case 2:
					case 3:
						this.status = 0x29a;
						break;
				}
				if( ( num4 == 0 ) || ( num4 == 2 ) ) {
					if( strm.avail_out == 0 ) {
						this.last_flush = -1;
					}
					return 0;
				}
				if( num4 == 1 ) {
					if( flush == 1 ) {
						this._tr_align();
					} else {
						this._tr_stored_block( 0, 0, false );
						if( flush == 3 ) {
							for( int i = 0; i < this.hash_size; i++ ) {
								this.head[ i ] = 0;
							}
						}
					}
					strm.flush_pending();
					if( strm.avail_out == 0 ) {
						this.last_flush = -1;
						return 0;
					}
				}
			}
			if( flush == 4 ) {
				if( this.noheader != 0 ) {
					return 1;
				}
				this.putShortMSB( (int)SupportClass.URShift( strm.adler, 0x10 ) );
				this.putShortMSB( (int)( strm.adler & 0xffffL ) );
				strm.flush_pending();
				this.noheader = -1;
				if( this.pending == 0 ) {
					return 1;
				}
			}
			return 0;
		}
Beispiel #26
0
		internal int inflateSetDictionary( ZStream z, byte[] dictionary, int dictLength ) {
			int start = 0;
			int n = dictLength;
			if( ( ( z == null ) || ( z.istate == null ) ) || ( z.istate.mode != 6 ) ) {
				return -2;
			}
			if( z._adler.adler32( 1L, dictionary, 0, dictLength ) != z.adler ) {
				return -3;
			}
			z.adler = z._adler.adler32( 0L, null, 0, 0 );
			if( n >= ( ( (int)1 ) << z.istate.wbits ) ) {
				n = ( ( (int)1 ) << z.istate.wbits ) - 1;
				start = dictLength - n;
			}
			z.istate.blocks.set_dictionary( dictionary, start, n );
			z.istate.mode = 7;
			return 0;
		}
Beispiel #27
0
		internal static int inflate_trees_bits( int[] c, int[] bb, int[] tb, int[] hp, ZStream z ) {
			int[] hn = new int[ 1 ];
			int[] v = new int[ 0x13 ];
			int num = huft_build( c, 0, 0x13, 0x13, null, null, tb, bb, hp, hn, v );
			if( num == -3 ) {
				z.msg = "oversubscribed dynamic bit lengths tree";
				return num;
			}
			if( ( num != -5 ) && ( bb[ 0 ] != 0 ) ) {
				return num;
			}
			z.msg = "incomplete dynamic bit lengths tree";
			return -3;
		}
Beispiel #28
0
		internal int deflateInit( ZStream strm, int level ) {
			return this.deflateInit( strm, level, 15 );
		}
Beispiel #29
0
		internal static int inflate_trees_fixed( int[] bl, int[] bd, int[][] tl, int[][] td, ZStream z ) {
			bl[ 0 ] = 9;
			bd[ 0 ] = 5;
			tl[ 0 ] = fixed_tl;
			td[ 0 ] = fixed_td;
			return 0;
		}
Beispiel #30
0
		internal int proc( InfBlocks s, ZStream z, int r ) {
			int num;
			int num10;
			int number = 0;
			int bitk = 0;
			int num6 = 0;
			num6 = z.next_in_index;
			int num7 = z.avail_in;
			number = s.bitb;
			bitk = s.bitk;
			int write = s.write;
			int num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
Label_0051:
			switch( this.mode ) {
				case 0:
					if( ( num9 < 0x102 ) || ( num7 < 10 ) ) {
						break;
					}
					s.bitb = number;
					s.bitk = bitk;
					z.avail_in = num7;
					z.total_in += num6 - z.next_in_index;
					z.next_in_index = num6;
					s.write = write;
					r = this.inflate_fast( this.lbits, this.dbits, this.ltree, this.ltree_index, this.dtree, this.dtree_index, s, z );
					num6 = z.next_in_index;
					num7 = z.avail_in;
					number = s.bitb;
					bitk = s.bitk;
					write = s.write;
					num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
					if( r == 0 ) {
						break;
					}
					this.mode = ( r == 1 ) ? 7 : 9;
					goto Label_0051;

				case 1:
					goto Label_0199;

				case 2:
					num = this.get_Renamed;
					while( bitk < num ) {
						if( num7 != 0 ) {
							r = 0;
						} else {
							s.bitb = number;
							s.bitk = bitk;
							z.avail_in = num7;
							z.total_in += num6 - z.next_in_index;
							z.next_in_index = num6;
							s.write = write;
							return s.inflate_flush( z, r );
						}
						num7--;
						number |= ( z.next_in[ num6++ ] & 0xff ) << bitk;
						bitk += 8;
					}
					this.len += number & inflate_mask[ num ];
					number = number >> num;
					bitk -= num;
					this.need = this.dbits;
					this.tree = this.dtree;
					this.tree_index = this.dtree_index;
					this.mode = 3;
					goto Label_0412;

				case 3:
					goto Label_0412;

				case 4:
					num = this.get_Renamed;
					while( bitk < num ) {
						if( num7 != 0 ) {
							r = 0;
						} else {
							s.bitb = number;
							s.bitk = bitk;
							z.avail_in = num7;
							z.total_in += num6 - z.next_in_index;
							z.next_in_index = num6;
							s.write = write;
							return s.inflate_flush( z, r );
						}
						num7--;
						number |= ( z.next_in[ num6++ ] & 0xff ) << bitk;
						bitk += 8;
					}
					this.dist += number & inflate_mask[ num ];
					number = number >> num;
					bitk -= num;
					this.mode = 5;
					goto Label_0635;

				case 5:
					goto Label_0635;

				case 6:
					if( num9 == 0 ) {
						if( ( write == s.end ) && ( s.read != 0 ) ) {
							write = 0;
							num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
						}
						if( num9 == 0 ) {
							s.write = write;
							r = s.inflate_flush( z, r );
							write = s.write;
							num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
							if( ( write == s.end ) && ( s.read != 0 ) ) {
								write = 0;
								num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
							}
							if( num9 == 0 ) {
								s.bitb = number;
								s.bitk = bitk;
								z.avail_in = num7;
								z.total_in += num6 - z.next_in_index;
								z.next_in_index = num6;
								s.write = write;
								return s.inflate_flush( z, r );
							}
						}
					}
					r = 0;
					s.window[ write++ ] = (byte)this.lit;
					num9--;
					this.mode = 0;
					goto Label_0051;

				case 7:
					if( bitk > 7 ) {
						bitk -= 8;
						num7++;
						num6--;
					}
					s.write = write;
					r = s.inflate_flush( z, r );
					write = s.write;
					num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
					if( s.read != s.write ) {
						s.bitb = number;
						s.bitk = bitk;
						z.avail_in = num7;
						z.total_in += num6 - z.next_in_index;
						z.next_in_index = num6;
						s.write = write;
						return s.inflate_flush( z, r );
					}
					this.mode = 8;
					goto Label_098A;

				case 8:
					goto Label_098A;

				case 9:
					r = -3;
					s.bitb = number;
					s.bitk = bitk;
					z.avail_in = num7;
					z.total_in += num6 - z.next_in_index;
					z.next_in_index = num6;
					s.write = write;
					return s.inflate_flush( z, r );

				default:
					r = -2;
					s.bitb = number;
					s.bitk = bitk;
					z.avail_in = num7;
					z.total_in += num6 - z.next_in_index;
					z.next_in_index = num6;
					s.write = write;
					return s.inflate_flush( z, r );
			}
			this.need = this.lbits;
			this.tree = this.ltree;
			this.tree_index = this.ltree_index;
			this.mode = 1;
Label_0199:
			num = this.need;
			while( bitk < num ) {
				if( num7 != 0 ) {
					r = 0;
				} else {
					s.bitb = number;
					s.bitk = bitk;
					z.avail_in = num7;
					z.total_in += num6 - z.next_in_index;
					z.next_in_index = num6;
					s.write = write;
					return s.inflate_flush( z, r );
				}
				num7--;
				number |= ( z.next_in[ num6++ ] & 0xff ) << bitk;
				bitk += 8;
			}
			int index = ( this.tree_index + ( number & inflate_mask[ num ] ) ) * 3;
			number = SupportClass.URShift( number, this.tree[ index + 1 ] );
			bitk -= this.tree[ index + 1 ];
			int num3 = this.tree[ index ];
			if( num3 == 0 ) {
				this.lit = this.tree[ index + 2 ];
				this.mode = 6;
				goto Label_0051;
			}
			if( ( num3 & 0x10 ) != 0 ) {
				this.get_Renamed = num3 & 15;
				this.len = this.tree[ index + 2 ];
				this.mode = 2;
				goto Label_0051;
			}
			if( ( num3 & 0x40 ) == 0 ) {
				this.need = num3;
				this.tree_index = ( index / 3 ) + this.tree[ index + 2 ];
				goto Label_0051;
			}
			if( ( num3 & 0x20 ) != 0 ) {
				this.mode = 7;
				goto Label_0051;
			}
			this.mode = 9;
			z.msg = "invalid literal/length code";
			r = -3;
			s.bitb = number;
			s.bitk = bitk;
			z.avail_in = num7;
			z.total_in += num6 - z.next_in_index;
			z.next_in_index = num6;
			s.write = write;
			return s.inflate_flush( z, r );
Label_0412:
			num = this.need;
			while( bitk < num ) {
				if( num7 != 0 ) {
					r = 0;
				} else {
					s.bitb = number;
					s.bitk = bitk;
					z.avail_in = num7;
					z.total_in += num6 - z.next_in_index;
					z.next_in_index = num6;
					s.write = write;
					return s.inflate_flush( z, r );
				}
				num7--;
				number |= ( z.next_in[ num6++ ] & 0xff ) << bitk;
				bitk += 8;
			}
			index = ( this.tree_index + ( number & inflate_mask[ num ] ) ) * 3;
			number = number >> this.tree[ index + 1 ];
			bitk -= this.tree[ index + 1 ];
			num3 = this.tree[ index ];
			if( ( num3 & 0x10 ) != 0 ) {
				this.get_Renamed = num3 & 15;
				this.dist = this.tree[ index + 2 ];
				this.mode = 4;
				goto Label_0051;
			}
			if( ( num3 & 0x40 ) == 0 ) {
				this.need = num3;
				this.tree_index = ( index / 3 ) + this.tree[ index + 2 ];
				goto Label_0051;
			}
			this.mode = 9;
			z.msg = "invalid distance code";
			r = -3;
			s.bitb = number;
			s.bitk = bitk;
			z.avail_in = num7;
			z.total_in += num6 - z.next_in_index;
			z.next_in_index = num6;
			s.write = write;
			return s.inflate_flush( z, r );
Label_0635:
			num10 = write - this.dist;
			while( num10 < 0 ) {
				num10 += s.end;
			}
			while( this.len != 0 ) {
				if( num9 == 0 ) {
					if( ( write == s.end ) && ( s.read != 0 ) ) {
						write = 0;
						num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
					}
					if( num9 == 0 ) {
						s.write = write;
						r = s.inflate_flush( z, r );
						write = s.write;
						num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
						if( ( write == s.end ) && ( s.read != 0 ) ) {
							write = 0;
							num9 = ( write < s.read ) ? ( ( s.read - write ) - 1 ) : ( s.end - write );
						}
						if( num9 == 0 ) {
							s.bitb = number;
							s.bitk = bitk;
							z.avail_in = num7;
							z.total_in += num6 - z.next_in_index;
							z.next_in_index = num6;
							s.write = write;
							return s.inflate_flush( z, r );
						}
					}
				}
				s.window[ write++ ] = s.window[ num10++ ];
				num9--;
				if( num10 == s.end ) {
					num10 = 0;
				}
				this.len--;
			}
			this.mode = 0;
			goto Label_0051;
Label_098A:
			r = 1;
			s.bitb = number;
			s.bitk = bitk;
			z.avail_in = num7;
			z.total_in += num6 - z.next_in_index;
			z.next_in_index = num6;
			s.write = write;
			return s.inflate_flush( z, r );
		}