internal int End() { if (this.blocks != null) { this.blocks.Free(); } this.blocks = null; return(0); }
internal int Initialize(ZlibCodec codec, int w) { this._codec = codec; this._codec.Message = null; this.blocks = null; if ((w < 8) || (w > 15)) { this.End(); throw new ZlibException("Bad window size."); } this.wbits = w; this.blocks = new InflateBlocks(codec, this.HandleRfc1950HeaderBytes ? this : null, ((int)1) << w); this.Reset(); return(0); }
internal int Process(InflateBlocks blocks, int r) { ZlibCodec z = blocks._codec; int num1 = z.NextIn; int num2 = z.AvailableBytesIn; int number = blocks.bitb; int num3 = blocks.bitk; int num4 = blocks.write; int num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; while (true) { switch (this.mode) { case 0: if (num5 >= 258 && num2 >= 10) { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; r = this.InflateFast((int)this.lbits, (int)this.dbits, this.ltree, this.ltree_index, this.dtree, this.dtree_index, blocks, z); num1 = z.NextIn; num2 = z.AvailableBytesIn; number = blocks.bitb; num3 = blocks.bitk; num4 = blocks.write; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (r != 0) { this.mode = r == 1 ? 7 : 9; break; } } this.need = (int)this.lbits; this.tree = this.ltree; this.tree_index = this.ltree_index; this.mode = 1; goto case 1; case 1: int index1 = this.need; while (num3 < index1) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); } } int index2 = (this.tree_index + (number & InflateCodes.inflate_mask[index1])) * 3; number = SharedUtils.URShift(number, this.tree[index2 + 1]); num3 -= this.tree[index2 + 1]; int num6 = this.tree[index2]; if (num6 == 0) { this.lit = this.tree[index2 + 2]; this.mode = 6; break; } else if ((num6 & 16) != 0) { this.get_Renamed = num6 & 15; this.len = this.tree[index2 + 2]; this.mode = 2; break; } else if ((num6 & 64) == 0) { this.need = num6; this.tree_index = index2 / 3 + this.tree[index2 + 2]; break; } else if ((num6 & 32) != 0) { this.mode = 7; break; } else { goto label_18; } case 2: int index3 = this.get_Renamed; while (num3 < index3) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); } } this.len += number & InflateCodes.inflate_mask[index3]; number >>= index3; num3 -= index3; this.need = (int)this.dbits; this.tree = this.dtree; this.tree_index = this.dtree_index; this.mode = 3; goto case 3; case 3: int index4 = this.need; while (num3 < index4) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); } } int index5 = (this.tree_index + (number & InflateCodes.inflate_mask[index4])) * 3; number >>= this.tree[index5 + 1]; num3 -= this.tree[index5 + 1]; int num7 = this.tree[index5]; if ((num7 & 16) != 0) { this.get_Renamed = num7 & 15; this.dist = this.tree[index5 + 2]; this.mode = 4; break; } else if ((num7 & 64) == 0) { this.need = num7; this.tree_index = index5 / 3 + this.tree[index5 + 2]; break; } else { goto label_34; } case 4: int index6 = this.get_Renamed; while (num3 < index6) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); } } this.dist += number & InflateCodes.inflate_mask[index6]; number >>= index6; num3 -= index6; this.mode = 5; goto case 5; case 5: int num8 = num4 - this.dist; while (num8 < 0) { num8 += blocks.end; } for (; this.len != 0; --this.len) { if (num5 == 0) { if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) { blocks.write = num4; r = blocks.Flush(r); num4 = blocks.write; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); } } } blocks.window[num4++] = blocks.window[num8++]; --num5; if (num8 == blocks.end) { num8 = 0; } } this.mode = 0; break; case 6: if (num5 == 0) { if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) { blocks.write = num4; r = blocks.Flush(r); num4 = blocks.write; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) { goto label_65; } } } r = 0; blocks.window[num4++] = (byte)this.lit; --num5; this.mode = 0; break; case 7: goto label_68; case 8: goto label_73; case 9: goto label_74; default: goto label_75; } } label_18: this.mode = 9; z.Message = "invalid literal/length code"; r = -3; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); label_34: this.mode = 9; z.Message = "invalid distance code"; r = -3; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); label_65: blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); label_68: if (num3 > 7) { num3 -= 8; ++num2; --num1; } blocks.write = num4; r = blocks.Flush(r); num4 = blocks.write; int num9 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (blocks.read != blocks.write) { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); } else { this.mode = 8; } label_73: r = 1; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); label_74: r = -3; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); label_75: r = -2; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return(blocks.Flush(r)); }
internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InflateBlocks s, ZlibCodec z) { int num1 = z.NextIn; int num2 = z.AvailableBytesIn; int num3 = s.bitb; int num4 = s.bitk; int destinationIndex = s.write; int num5 = destinationIndex < s.read ? s.read - destinationIndex - 1 : s.end - destinationIndex; int num6 = InflateCodes.inflate_mask[bl]; int num7 = InflateCodes.inflate_mask[bd]; do { while (num4 < 20) { --num2; num3 |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num4; num4 += 8; } int num8 = num3 & num6; int[] numArray1 = tl; int num9 = tl_index; int index1 = (num9 + num8) * 3; int index2; if ((index2 = numArray1[index1]) == 0) { num3 >>= numArray1[index1 + 1]; num4 -= numArray1[index1 + 1]; s.window[destinationIndex++] = (byte)numArray1[index1 + 2]; --num5; } else { while (true) { num3 >>= numArray1[index1 + 1]; num4 -= numArray1[index1 + 1]; if ((index2 & 16) == 0) { if ((index2 & 64) == 0) { num8 = num8 + numArray1[index1 + 2] + (num3 & InflateCodes.inflate_mask[index2]); index1 = (num9 + num8) * 3; if ((index2 = numArray1[index1]) != 0) { } else { goto label_34; } } else { goto label_35; } } else { break; } } int index3 = index2 & 15; int length1 = numArray1[index1 + 2] + (num3 & InflateCodes.inflate_mask[index3]); int num10 = num3 >> index3; int num11 = num4 - index3; while (num11 < 15) { --num2; num10 |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num11; num11 += 8; } int num12 = num10 & num7; int[] numArray2 = td; int num13 = td_index; int index4 = (num13 + num12) * 3; int index5 = numArray2[index4]; while (true) { num10 >>= numArray2[index4 + 1]; num11 -= numArray2[index4 + 1]; if ((index5 & 16) == 0) { if ((index5 & 64) == 0) { num12 = num12 + numArray2[index4 + 2] + (num10 & InflateCodes.inflate_mask[index5]); index4 = (num13 + num12) * 3; index5 = numArray2[index4]; } else { goto label_31; } } else { break; } } int index6 = index5 & 15; while (num11 < index6) { --num2; num10 |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num11; num11 += 8; } int num14 = numArray2[index4 + 2] + (num10 & InflateCodes.inflate_mask[index6]); num3 = num10 >> index6; num4 = num11 - index6; num5 -= length1; int sourceIndex1; int num15; if (destinationIndex >= num14) { int sourceIndex2 = destinationIndex - num14; if (destinationIndex - sourceIndex2 > 0 && 2 > destinationIndex - sourceIndex2) { byte[] numArray3 = s.window; int index7 = destinationIndex; int num16 = 1; int num17 = index7 + num16; byte[] numArray4 = s.window; int index8 = sourceIndex2; int num18 = 1; int num19 = index8 + num18; int num20 = (int)numArray4[index8]; numArray3[index7] = (byte)num20; byte[] numArray5 = s.window; int index9 = num17; int num21 = 1; destinationIndex = index9 + num21; byte[] numArray6 = s.window; int index10 = num19; int num22 = 1; sourceIndex1 = index10 + num22; int num23 = (int)numArray6[index10]; numArray5[index9] = (byte)num23; length1 -= 2; } else { Array.Copy((Array)s.window, sourceIndex2, (Array)s.window, destinationIndex, 2); destinationIndex += 2; sourceIndex1 = sourceIndex2 + 2; length1 -= 2; } } else { sourceIndex1 = destinationIndex - num14; do { sourceIndex1 += s.end; }while (sourceIndex1 < 0); int length2 = s.end - sourceIndex1; if (length1 > length2) { length1 -= length2; if (destinationIndex - sourceIndex1 > 0 && length2 > destinationIndex - sourceIndex1) { do { s.window[destinationIndex++] = s.window[sourceIndex1++]; }while (--length2 != 0); } else { Array.Copy((Array)s.window, sourceIndex1, (Array)s.window, destinationIndex, length2); destinationIndex += length2; num15 = sourceIndex1 + length2; } sourceIndex1 = 0; } } if (destinationIndex - sourceIndex1 > 0 && length1 > destinationIndex - sourceIndex1) { do { s.window[destinationIndex++] = s.window[sourceIndex1++]; }while (--length1 != 0); goto label_39; } else { Array.Copy((Array)s.window, sourceIndex1, (Array)s.window, destinationIndex, length1); destinationIndex += length1; num15 = sourceIndex1 + length1; goto label_39; } label_31: z.Message = "invalid distance code"; int num24 = z.AvailableBytesIn - num2; int num25 = num11 >> 3 < num24 ? num11 >> 3 : num24; int num26 = num2 + num25; int num27 = num1 - num25; int num28 = num11 - (num25 << 3); s.bitb = num10; s.bitk = num28; z.AvailableBytesIn = num26; z.TotalBytesIn += (long)(num27 - z.NextIn); z.NextIn = num27; s.write = destinationIndex; return(-3); label_34: num3 >>= numArray1[index1 + 1]; num4 -= numArray1[index1 + 1]; s.window[destinationIndex++] = (byte)numArray1[index1 + 2]; --num5; goto label_39; label_35: if ((index2 & 32) != 0) { int num16 = z.AvailableBytesIn - num2; int num17 = num4 >> 3 < num16 ? num4 >> 3 : num16; int num18 = num2 + num17; int num19 = num1 - num17; int num20 = num4 - (num17 << 3); s.bitb = num3; s.bitk = num20; z.AvailableBytesIn = num18; z.TotalBytesIn += (long)(num19 - z.NextIn); z.NextIn = num19; s.write = destinationIndex; return(1); } else { z.Message = "invalid literal/length code"; int num16 = z.AvailableBytesIn - num2; int num17 = num4 >> 3 < num16 ? num4 >> 3 : num16; int num18 = num2 + num17; int num19 = num1 - num17; int num20 = num4 - (num17 << 3); s.bitb = num3; s.bitk = num20; z.AvailableBytesIn = num18; z.TotalBytesIn += (long)(num19 - z.NextIn); z.NextIn = num19; s.write = destinationIndex; return(-3); } label_39 :; } }while (num5 >= 258 && num2 >= 10); int num29 = z.AvailableBytesIn - num2; int num30 = num4 >> 3 < num29 ? num4 >> 3 : num29; int num31 = num2 + num30; int num32 = num1 - num30; int num33 = num4 - (num30 << 3); s.bitb = num3; s.bitk = num33; z.AvailableBytesIn = num31; z.TotalBytesIn += (long)(num32 - z.NextIn); z.NextIn = num32; s.write = destinationIndex; return(0); }
internal int Process(InflateBlocks blocks, int r) { ZlibCodec z = blocks._codec; int num1 = z.NextIn; int num2 = z.AvailableBytesIn; int number = blocks.bitb; int num3 = blocks.bitk; int num4 = blocks.write; int num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; while (true) { switch (this.mode) { case 0: if (num5 >= 258 && num2 >= 10) { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; r = this.InflateFast((int)this.lbits, (int)this.dbits, this.ltree, this.ltree_index, this.dtree, this.dtree_index, blocks, z); num1 = z.NextIn; num2 = z.AvailableBytesIn; number = blocks.bitb; num3 = blocks.bitk; num4 = blocks.write; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (r != 0) { this.mode = r == 1 ? 7 : 9; break; } } this.need = (int)this.lbits; this.tree = this.ltree; this.tree_index = this.ltree_index; this.mode = 1; goto case 1; case 1: int index1 = this.need; while (num3 < index1) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); } } int index2 = (this.tree_index + (number & InflateCodes.inflate_mask[index1])) * 3; number = SharedUtils.URShift(number, this.tree[index2 + 1]); num3 -= this.tree[index2 + 1]; int num6 = this.tree[index2]; if (num6 == 0) { this.lit = this.tree[index2 + 2]; this.mode = 6; break; } else if ((num6 & 16) != 0) { this.get_Renamed = num6 & 15; this.len = this.tree[index2 + 2]; this.mode = 2; break; } else if ((num6 & 64) == 0) { this.need = num6; this.tree_index = index2 / 3 + this.tree[index2 + 2]; break; } else if ((num6 & 32) != 0) { this.mode = 7; break; } else goto label_18; case 2: int index3 = this.get_Renamed; while (num3 < index3) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); } } this.len += number & InflateCodes.inflate_mask[index3]; number >>= index3; num3 -= index3; this.need = (int)this.dbits; this.tree = this.dtree; this.tree_index = this.dtree_index; this.mode = 3; goto case 3; case 3: int index4 = this.need; while (num3 < index4) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); } } int index5 = (this.tree_index + (number & InflateCodes.inflate_mask[index4])) * 3; number >>= this.tree[index5 + 1]; num3 -= this.tree[index5 + 1]; int num7 = this.tree[index5]; if ((num7 & 16) != 0) { this.get_Renamed = num7 & 15; this.dist = this.tree[index5 + 2]; this.mode = 4; break; } else if ((num7 & 64) == 0) { this.need = num7; this.tree_index = index5 / 3 + this.tree[index5 + 2]; break; } else goto label_34; case 4: int index6 = this.get_Renamed; while (num3 < index6) { if (num2 != 0) { r = 0; --num2; number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3; num3 += 8; } else { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); } } this.dist += number & InflateCodes.inflate_mask[index6]; number >>= index6; num3 -= index6; this.mode = 5; goto case 5; case 5: int num8 = num4 - this.dist; while (num8 < 0) num8 += blocks.end; for (; this.len != 0; --this.len) { if (num5 == 0) { if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) { blocks.write = num4; r = blocks.Flush(r); num4 = blocks.write; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); } } } blocks.window[num4++] = blocks.window[num8++]; --num5; if (num8 == blocks.end) num8 = 0; } this.mode = 0; break; case 6: if (num5 == 0) { if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) { blocks.write = num4; r = blocks.Flush(r); num4 = blocks.write; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (num4 == blocks.end && blocks.read != 0) { num4 = 0; num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; } if (num5 == 0) goto label_65; } } r = 0; blocks.window[num4++] = (byte)this.lit; --num5; this.mode = 0; break; case 7: goto label_68; case 8: goto label_73; case 9: goto label_74; default: goto label_75; } } label_18: this.mode = 9; z.Message = "invalid literal/length code"; r = -3; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); label_34: this.mode = 9; z.Message = "invalid distance code"; r = -3; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); label_65: blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); label_68: if (num3 > 7) { num3 -= 8; ++num2; --num1; } blocks.write = num4; r = blocks.Flush(r); num4 = blocks.write; int num9 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4; if (blocks.read != blocks.write) { blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); } else this.mode = 8; label_73: r = 1; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); label_74: r = -3; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); label_75: r = -2; blocks.bitb = number; blocks.bitk = num3; z.AvailableBytesIn = num2; z.TotalBytesIn += (long)(num1 - z.NextIn); z.NextIn = num1; blocks.write = num4; return blocks.Flush(r); }
internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InflateBlocks s, ZlibCodec z) { int num1 = z.NextIn; int num2 = z.AvailableBytesIn; int num3 = s.bitb; int num4 = s.bitk; int destinationIndex = s.write; int num5 = destinationIndex < s.read ? s.read - destinationIndex - 1 : s.end - destinationIndex; int num6 = InflateCodes.inflate_mask[bl]; int num7 = InflateCodes.inflate_mask[bd]; do { while (num4 < 20) { --num2; num3 |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num4; num4 += 8; } int num8 = num3 & num6; int[] numArray1 = tl; int num9 = tl_index; int index1 = (num9 + num8) * 3; int index2; if ((index2 = numArray1[index1]) == 0) { num3 >>= numArray1[index1 + 1]; num4 -= numArray1[index1 + 1]; s.window[destinationIndex++] = (byte)numArray1[index1 + 2]; --num5; } else { while (true) { num3 >>= numArray1[index1 + 1]; num4 -= numArray1[index1 + 1]; if ((index2 & 16) == 0) { if ((index2 & 64) == 0) { num8 = num8 + numArray1[index1 + 2] + (num3 & InflateCodes.inflate_mask[index2]); index1 = (num9 + num8) * 3; if ((index2 = numArray1[index1]) != 0) {} else goto label_34; } else goto label_35; } else break; } int index3 = index2 & 15; int length1 = numArray1[index1 + 2] + (num3 & InflateCodes.inflate_mask[index3]); int num10 = num3 >> index3; int num11 = num4 - index3; while (num11 < 15) { --num2; num10 |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num11; num11 += 8; } int num12 = num10 & num7; int[] numArray2 = td; int num13 = td_index; int index4 = (num13 + num12) * 3; int index5 = numArray2[index4]; while (true) { num10 >>= numArray2[index4 + 1]; num11 -= numArray2[index4 + 1]; if ((index5 & 16) == 0) { if ((index5 & 64) == 0) { num12 = num12 + numArray2[index4 + 2] + (num10 & InflateCodes.inflate_mask[index5]); index4 = (num13 + num12) * 3; index5 = numArray2[index4]; } else goto label_31; } else break; } int index6 = index5 & 15; while (num11 < index6) { --num2; num10 |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num11; num11 += 8; } int num14 = numArray2[index4 + 2] + (num10 & InflateCodes.inflate_mask[index6]); num3 = num10 >> index6; num4 = num11 - index6; num5 -= length1; int sourceIndex1; int num15; if (destinationIndex >= num14) { int sourceIndex2 = destinationIndex - num14; if (destinationIndex - sourceIndex2 > 0 && 2 > destinationIndex - sourceIndex2) { byte[] numArray3 = s.window; int index7 = destinationIndex; int num16 = 1; int num17 = index7 + num16; byte[] numArray4 = s.window; int index8 = sourceIndex2; int num18 = 1; int num19 = index8 + num18; int num20 = (int)numArray4[index8]; numArray3[index7] = (byte)num20; byte[] numArray5 = s.window; int index9 = num17; int num21 = 1; destinationIndex = index9 + num21; byte[] numArray6 = s.window; int index10 = num19; int num22 = 1; sourceIndex1 = index10 + num22; int num23 = (int)numArray6[index10]; numArray5[index9] = (byte)num23; length1 -= 2; } else { Array.Copy((Array)s.window, sourceIndex2, (Array)s.window, destinationIndex, 2); destinationIndex += 2; sourceIndex1 = sourceIndex2 + 2; length1 -= 2; } } else { sourceIndex1 = destinationIndex - num14; do { sourceIndex1 += s.end; } while (sourceIndex1 < 0); int length2 = s.end - sourceIndex1; if (length1 > length2) { length1 -= length2; if (destinationIndex - sourceIndex1 > 0 && length2 > destinationIndex - sourceIndex1) { do { s.window[destinationIndex++] = s.window[sourceIndex1++]; } while (--length2 != 0); } else { Array.Copy((Array)s.window, sourceIndex1, (Array)s.window, destinationIndex, length2); destinationIndex += length2; num15 = sourceIndex1 + length2; } sourceIndex1 = 0; } } if (destinationIndex - sourceIndex1 > 0 && length1 > destinationIndex - sourceIndex1) { do { s.window[destinationIndex++] = s.window[sourceIndex1++]; } while (--length1 != 0); goto label_39; } else { Array.Copy((Array)s.window, sourceIndex1, (Array)s.window, destinationIndex, length1); destinationIndex += length1; num15 = sourceIndex1 + length1; goto label_39; } label_31: z.Message = "invalid distance code"; int num24 = z.AvailableBytesIn - num2; int num25 = num11 >> 3 < num24 ? num11 >> 3 : num24; int num26 = num2 + num25; int num27 = num1 - num25; int num28 = num11 - (num25 << 3); s.bitb = num10; s.bitk = num28; z.AvailableBytesIn = num26; z.TotalBytesIn += (long)(num27 - z.NextIn); z.NextIn = num27; s.write = destinationIndex; return -3; label_34: num3 >>= numArray1[index1 + 1]; num4 -= numArray1[index1 + 1]; s.window[destinationIndex++] = (byte)numArray1[index1 + 2]; --num5; goto label_39; label_35: if ((index2 & 32) != 0) { int num16 = z.AvailableBytesIn - num2; int num17 = num4 >> 3 < num16 ? num4 >> 3 : num16; int num18 = num2 + num17; int num19 = num1 - num17; int num20 = num4 - (num17 << 3); s.bitb = num3; s.bitk = num20; z.AvailableBytesIn = num18; z.TotalBytesIn += (long)(num19 - z.NextIn); z.NextIn = num19; s.write = destinationIndex; return 1; } else { z.Message = "invalid literal/length code"; int num16 = z.AvailableBytesIn - num2; int num17 = num4 >> 3 < num16 ? num4 >> 3 : num16; int num18 = num2 + num17; int num19 = num1 - num17; int num20 = num4 - (num17 << 3); s.bitb = num3; s.bitk = num20; z.AvailableBytesIn = num18; z.TotalBytesIn += (long)(num19 - z.NextIn); z.NextIn = num19; s.write = destinationIndex; return -3; } label_39: ; } } while (num5 >= 258 && num2 >= 10); int num29 = z.AvailableBytesIn - num2; int num30 = num4 >> 3 < num29 ? num4 >> 3 : num29; int num31 = num2 + num30; int num32 = num1 - num30; int num33 = num4 - (num30 << 3); s.bitb = num3; s.bitk = num33; z.AvailableBytesIn = num31; z.TotalBytesIn += (long)(num32 - z.NextIn); z.NextIn = num32; s.write = destinationIndex; return 0; }
internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InflateBlocks s, ZlibCodec z) { int num23; int nextIn = z.NextIn; int availableBytesIn = z.AvailableBytesIn; int bitb = s.bitb; int bitk = s.bitk; int write = s.write; int num6 = (write < s.read) ? ((s.read - write) - 1) : (s.end - write); int num7 = inflate_mask[bl]; int num8 = inflate_mask[bd]; Label_0085: while (bitk < 20) { availableBytesIn--; bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk; bitk += 8; } int num9 = bitb & num7; int[] numArray = tl; int num10 = tl_index; int index = (num10 + num9) * 3; int num12 = numArray[index]; if (num12 == 0) { bitb = bitb >> numArray[index + 1]; bitk -= numArray[index + 1]; s.window[write++] = (byte)numArray[index + 2]; num6--; goto Label_05F5; } Label_00E3: bitb = bitb >> numArray[index + 1]; bitk -= numArray[index + 1]; if ((num12 & 0x10) == 0) { if ((num12 & 0x40) != 0) { if ((num12 & 0x20) != 0) { int num43 = z.AvailableBytesIn - availableBytesIn; int num44 = ((bitk >> 3) < num43) ? (bitk >> 3) : num43; int num45 = availableBytesIn + num44; int num46 = nextIn - num44; int num47 = bitk - (num44 << 3); s.bitb = bitb; s.bitk = num47; z.AvailableBytesIn = num45; z.TotalBytesIn += num46 - z.NextIn; z.NextIn = num46; s.write = write; return(1); } z.Message = "invalid literal/length code"; int num48 = z.AvailableBytesIn - availableBytesIn; int num49 = ((bitk >> 3) < num48) ? (bitk >> 3) : num48; int num50 = availableBytesIn + num49; int num51 = nextIn - num49; int num52 = bitk - (num49 << 3); s.bitb = bitb; s.bitk = num52; z.AvailableBytesIn = num50; z.TotalBytesIn += num51 - z.NextIn; z.NextIn = num51; s.write = write; return(-3); } num9 = (num9 + numArray[index + 2]) + (bitb & inflate_mask[num12]); index = (num10 + num9) * 3; num12 = numArray[index]; if (num12 == 0) { bitb = bitb >> numArray[index + 1]; bitk -= numArray[index + 1]; s.window[write++] = (byte)numArray[index + 2]; num6--; goto Label_05F5; } goto Label_00E3; } int num13 = num12 & 15; int length = numArray[index + 2] + (bitb & inflate_mask[num13]); int num15 = bitb >> num13; int num16 = bitk - num13; while (num16 < 15) { availableBytesIn--; num15 |= (z.InputBuffer[nextIn++] & 0xff) << num16; num16 += 8; } int num17 = num15 & num8; int[] numArray2 = td; int num18 = td_index; int num19 = (num18 + num17) * 3; int num20 = numArray2[num19]; while (true) { num15 = num15 >> numArray2[num19 + 1]; num16 -= numArray2[num19 + 1]; if ((num20 & 0x10) != 0) { break; } if ((num20 & 0x40) != 0) { z.Message = "invalid distance code"; int num38 = z.AvailableBytesIn - availableBytesIn; int num39 = ((num16 >> 3) < num38) ? (num16 >> 3) : num38; int num40 = availableBytesIn + num39; int num41 = nextIn - num39; int num42 = num16 - (num39 << 3); s.bitb = num15; s.bitk = num42; z.AvailableBytesIn = num40; z.TotalBytesIn += num41 - z.NextIn; z.NextIn = num41; s.write = write; return(-3); } num17 = (num17 + numArray2[num19 + 2]) + (num15 & inflate_mask[num20]); num19 = (num18 + num17) * 3; num20 = numArray2[num19]; } int num21 = num20 & 15; while (num16 < num21) { availableBytesIn--; num15 |= (z.InputBuffer[nextIn++] & 0xff) << num16; num16 += 8; } int num22 = numArray2[num19 + 2] + (num15 & inflate_mask[num21]); bitb = num15 >> num21; bitk = num16 - num21; num6 -= length; if (write >= num22) { int sourceIndex = write - num22; if (((write - sourceIndex) > 0) && (2 > (write - sourceIndex))) { byte[] window = s.window; int num25 = write; int num26 = 1; int num27 = num25 + num26; byte[] buffer2 = s.window; int num28 = sourceIndex; int num29 = 1; int num30 = num28 + num29; int num31 = buffer2[num28]; window[num25] = (byte)num31; byte[] buffer3 = s.window; int num32 = num27; int num33 = 1; write = num32 + num33; byte[] buffer4 = s.window; int num34 = num30; int num35 = 1; num23 = num34 + num35; int num36 = buffer4[num34]; buffer3[num32] = (byte)num36; length -= 2; } else { Array.Copy(s.window, sourceIndex, s.window, write, 2); write += 2; num23 = sourceIndex + 2; length -= 2; } } else { num23 = write - num22; do { num23 += s.end; }while (num23 < 0); int num37 = s.end - num23; if (length > num37) { length -= num37; if (((write - num23) > 0) && (num37 > (write - num23))) { do { s.window[write++] = s.window[num23++]; }while (--num37 != 0); } else { Array.Copy(s.window, num23, s.window, write, num37); write += num37; } num23 = 0; } } if (((write - num23) > 0) && (length > (write - num23))) { do { s.window[write++] = s.window[num23++]; }while (--length != 0); } else { Array.Copy(s.window, num23, s.window, write, length); write += length; } Label_05F5: if ((num6 >= 0x102) && (availableBytesIn >= 10)) { goto Label_0085; } int num53 = z.AvailableBytesIn - availableBytesIn; int num54 = ((bitk >> 3) < num53) ? (bitk >> 3) : num53; int num55 = availableBytesIn + num54; int num56 = nextIn - num54; int num57 = bitk - (num54 << 3); s.bitb = bitb; s.bitk = num57; z.AvailableBytesIn = num55; z.TotalBytesIn += num56 - z.NextIn; z.NextIn = num56; s.write = write; return(0); }
internal int Process(InflateBlocks blocks, int r) { int num7; int num11; int num15; ZlibCodec z = blocks._codec; int nextIn = z.NextIn; int availableBytesIn = z.AvailableBytesIn; int bitb = blocks.bitb; int bitk = blocks.bitk; int write = blocks.write; int num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); Label_004E: switch (this.mode) { case 0: if ((num6 < 0x102) || (availableBytesIn < 10)) { break; } blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; r = this.InflateFast(this.lbits, this.dbits, this.ltree, this.ltree_index, this.dtree, this.dtree_index, blocks, z); nextIn = z.NextIn; availableBytesIn = z.AvailableBytesIn; bitb = blocks.bitb; bitk = blocks.bitk; write = blocks.write; num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); if (r == 0) { break; } this.mode = (r == 1) ? 7 : 9; goto Label_004E; case 1: goto Label_0190; case 2: { int num10 = this.get_Renamed; while (bitk < num10) { if (availableBytesIn != 0) { r = 0; availableBytesIn--; bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk; bitk += 8; } else { blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } } this.len += bitb & inflate_mask[num10]; bitb = bitb >> num10; bitk -= num10; this.need = this.dbits; this.tree = this.dtree; this.tree_index = this.dtree_index; this.mode = 3; goto Label_03B3; } case 3: goto Label_03B3; case 4: { int num14 = this.get_Renamed; while (bitk < num14) { if (availableBytesIn != 0) { r = 0; availableBytesIn--; bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk; bitk += 8; } else { blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } } this.dist += bitb & inflate_mask[num14]; bitb = bitb >> num14; bitk -= num14; this.mode = 5; goto Label_057D; } case 5: goto Label_057D; case 6: if (num6 == 0) { if ((write == blocks.end) && (blocks.read != 0)) { write = 0; num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); } if (num6 == 0) { blocks.write = write; r = blocks.Flush(r); write = blocks.write; num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); if ((write == blocks.end) && (blocks.read != 0)) { write = 0; num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); } if (num6 == 0) { blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } } } r = 0; blocks.window[write++] = (byte)this.lit; num6--; this.mode = 0; goto Label_004E; case 7: if (bitk > 7) { bitk -= 8; availableBytesIn++; nextIn--; } blocks.write = write; r = blocks.Flush(r); write = blocks.write; if (write >= blocks.read) { int end = blocks.end; } else { int read = blocks.read; } if (blocks.read != blocks.write) { blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } this.mode = 8; goto Label_096B; case 8: goto Label_096B; case 9: r = -3; blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); default: r = -2; blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } this.need = this.lbits; this.tree = this.ltree; this.tree_index = this.ltree_index; this.mode = 1; Label_0190: num7 = this.need; while (bitk < num7) { if (availableBytesIn != 0) { r = 0; availableBytesIn--; bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk; bitk += 8; } else { blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } } int index = (this.tree_index + (bitb & inflate_mask[num7])) * 3; bitb = SharedUtils.URShift(bitb, this.tree[index + 1]); bitk -= this.tree[index + 1]; int num9 = this.tree[index]; if (num9 == 0) { this.lit = this.tree[index + 2]; this.mode = 6; } else if ((num9 & 0x10) != 0) { this.get_Renamed = num9 & 15; this.len = this.tree[index + 2]; this.mode = 2; } else if ((num9 & 0x40) == 0) { this.need = num9; this.tree_index = (index / 3) + this.tree[index + 2]; } else { if ((num9 & 0x20) == 0) { this.mode = 9; z.Message = "invalid literal/length code"; r = -3; blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } this.mode = 7; } goto Label_004E; Label_03B3: num11 = this.need; while (bitk < num11) { if (availableBytesIn != 0) { r = 0; availableBytesIn--; bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk; bitk += 8; } else { blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } } int num12 = (this.tree_index + (bitb & inflate_mask[num11])) * 3; bitb = bitb >> this.tree[num12 + 1]; bitk -= this.tree[num12 + 1]; int num13 = this.tree[num12]; if ((num13 & 0x10) != 0) { this.get_Renamed = num13 & 15; this.dist = this.tree[num12 + 2]; this.mode = 4; } else { if ((num13 & 0x40) != 0) { this.mode = 9; z.Message = "invalid distance code"; r = -3; blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } this.need = num13; this.tree_index = (num12 / 3) + this.tree[num12 + 2]; } goto Label_004E; Label_057D: num15 = write - this.dist; while (num15 < 0) { num15 += blocks.end; } while (this.len != 0) { if (num6 == 0) { if ((write == blocks.end) && (blocks.read != 0)) { write = 0; num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); } if (num6 == 0) { blocks.write = write; r = blocks.Flush(r); write = blocks.write; num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); if ((write == blocks.end) && (blocks.read != 0)) { write = 0; num6 = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write); } if (num6 == 0) { blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); } } } blocks.window[write++] = blocks.window[num15++]; num6--; if (num15 == blocks.end) { num15 = 0; } this.len--; } this.mode = 0; goto Label_004E; Label_096B: r = 1; blocks.bitb = bitb; blocks.bitk = bitk; z.AvailableBytesIn = availableBytesIn; z.TotalBytesIn += nextIn - z.NextIn; z.NextIn = nextIn; blocks.write = write; return(blocks.Flush(r)); }