Files
Dec2017-Script-Dump/ICSharpCode.SharpZipLib/BZip2/BZip2InputStream.cs
T
2026-06-04 11:42:34 +02:00

946 lines
21 KiB
C#

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
namespace ICSharpCode.SharpZipLib.BZip2
{
// Token: 0x02000006 RID: 6
public class BZip2InputStream : Stream
{
// Token: 0x0600000D RID: 13 RVA: 0x00002A28 File Offset: 0x00001A28
public BZip2InputStream(Stream stream)
{
for (int i = 0; i < 6; i++)
{
this.limit[i] = new int[258];
this.baseArray[i] = new int[258];
this.perm[i] = new int[258];
}
this.BsSetStream(stream);
this.Initialize();
this.InitBlock();
this.SetupBlock();
}
// Token: 0x17000001 RID: 1
// (get) Token: 0x0600000E RID: 14 RVA: 0x00002B46 File Offset: 0x00001B46
// (set) Token: 0x0600000F RID: 15 RVA: 0x00002B4E File Offset: 0x00001B4E
public bool IsStreamOwner
{
get
{
return this.isStreamOwner;
}
set
{
this.isStreamOwner = value;
}
}
// Token: 0x17000002 RID: 2
// (get) Token: 0x06000010 RID: 16 RVA: 0x00002B57 File Offset: 0x00001B57
public override bool CanRead
{
get
{
return this.baseStream.CanRead;
}
}
// Token: 0x17000003 RID: 3
// (get) Token: 0x06000011 RID: 17 RVA: 0x00002B64 File Offset: 0x00001B64
public override bool CanSeek
{
get
{
return this.baseStream.CanSeek;
}
}
// Token: 0x17000004 RID: 4
// (get) Token: 0x06000012 RID: 18 RVA: 0x00002B71 File Offset: 0x00001B71
public override bool CanWrite
{
get
{
return false;
}
}
// Token: 0x17000005 RID: 5
// (get) Token: 0x06000013 RID: 19 RVA: 0x00002B74 File Offset: 0x00001B74
public override long Length
{
get
{
return this.baseStream.Length;
}
}
// Token: 0x17000006 RID: 6
// (get) Token: 0x06000014 RID: 20 RVA: 0x00002B81 File Offset: 0x00001B81
// (set) Token: 0x06000015 RID: 21 RVA: 0x00002B8E File Offset: 0x00001B8E
public override long Position
{
get
{
return this.baseStream.Position;
}
set
{
throw new NotSupportedException("BZip2InputStream position cannot be set");
}
}
// Token: 0x06000016 RID: 22 RVA: 0x00002B9A File Offset: 0x00001B9A
public override void Flush()
{
if (this.baseStream != null)
{
this.baseStream.Flush();
}
}
// Token: 0x06000017 RID: 23 RVA: 0x00002BAF File Offset: 0x00001BAF
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException("BZip2InputStream Seek not supported");
}
// Token: 0x06000018 RID: 24 RVA: 0x00002BBB File Offset: 0x00001BBB
public override void SetLength(long value)
{
throw new NotSupportedException("BZip2InputStream SetLength not supported");
}
// Token: 0x06000019 RID: 25 RVA: 0x00002BC7 File Offset: 0x00001BC7
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotSupportedException("BZip2InputStream Write not supported");
}
// Token: 0x0600001A RID: 26 RVA: 0x00002BD3 File Offset: 0x00001BD3
public override void WriteByte(byte value)
{
throw new NotSupportedException("BZip2InputStream WriteByte not supported");
}
// Token: 0x0600001B RID: 27 RVA: 0x00002BE0 File Offset: 0x00001BE0
public override int Read(byte[] buffer, int offset, int count)
{
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
for (int i = 0; i < count; i++)
{
int num = this.ReadByte();
if (num == -1)
{
return i;
}
buffer[offset + i] = (byte)num;
}
return count;
}
// Token: 0x0600001C RID: 28 RVA: 0x00002C1C File Offset: 0x00001C1C
public override void Close()
{
if (this.IsStreamOwner && this.baseStream != null)
{
this.baseStream.Close();
}
}
// Token: 0x0600001D RID: 29 RVA: 0x00002C3C File Offset: 0x00001C3C
public override int ReadByte()
{
if (this.streamEnd)
{
return -1;
}
int num = this.currentChar;
switch (this.currentState)
{
case 3:
this.SetupRandPartB();
break;
case 4:
this.SetupRandPartC();
break;
case 6:
this.SetupNoRandPartB();
break;
case 7:
this.SetupNoRandPartC();
break;
}
return num;
}
// Token: 0x0600001E RID: 30 RVA: 0x00002CA8 File Offset: 0x00001CA8
private void MakeMaps()
{
this.nInUse = 0;
for (int i = 0; i < 256; i++)
{
if (this.inUse[i])
{
this.seqToUnseq[this.nInUse] = (byte)i;
this.unseqToSeq[i] = (byte)this.nInUse;
this.nInUse++;
}
}
}
// Token: 0x0600001F RID: 31 RVA: 0x00002D04 File Offset: 0x00001D04
private void Initialize()
{
char c = this.BsGetUChar();
char c2 = this.BsGetUChar();
char c3 = this.BsGetUChar();
char c4 = this.BsGetUChar();
if (c != 'B' || c2 != 'Z' || c3 != 'h' || c4 < '1' || c4 > '9')
{
this.streamEnd = true;
return;
}
this.SetDecompressStructureSizes((int)(c4 - '0'));
this.computedCombinedCRC = 0U;
}
// Token: 0x06000020 RID: 32 RVA: 0x00002D60 File Offset: 0x00001D60
private void InitBlock()
{
char c = this.BsGetUChar();
char c2 = this.BsGetUChar();
char c3 = this.BsGetUChar();
char c4 = this.BsGetUChar();
char c5 = this.BsGetUChar();
char c6 = this.BsGetUChar();
if (c == '\u0017' && c2 == 'r' && c3 == 'E' && c4 == '8' && c5 == 'P' && c6 == '\u0090')
{
this.Complete();
return;
}
if (c != '1' || c2 != 'A' || c3 != 'Y' || c4 != '&' || c5 != 'S' || c6 != 'Y')
{
BZip2InputStream.BadBlockHeader();
this.streamEnd = true;
return;
}
this.storedBlockCRC = this.BsGetInt32();
this.blockRandomised = this.BsR(1) == 1;
this.GetAndMoveToFrontDecode();
this.mCrc.Reset();
this.currentState = 1;
}
// Token: 0x06000021 RID: 33 RVA: 0x00002E24 File Offset: 0x00001E24
private void EndBlock()
{
this.computedBlockCRC = (int)this.mCrc.Value;
if (this.storedBlockCRC != this.computedBlockCRC)
{
BZip2InputStream.CrcError();
}
this.computedCombinedCRC = ((this.computedCombinedCRC << 1) & uint.MaxValue) | (this.computedCombinedCRC >> 31);
this.computedCombinedCRC ^= (uint)this.computedBlockCRC;
}
// Token: 0x06000022 RID: 34 RVA: 0x00002E83 File Offset: 0x00001E83
private void Complete()
{
this.storedCombinedCRC = this.BsGetInt32();
if (this.storedCombinedCRC != (int)this.computedCombinedCRC)
{
BZip2InputStream.CrcError();
}
this.streamEnd = true;
}
// Token: 0x06000023 RID: 35 RVA: 0x00002EAB File Offset: 0x00001EAB
private void BsSetStream(Stream stream)
{
this.baseStream = stream;
this.bsLive = 0;
this.bsBuff = 0;
}
// Token: 0x06000024 RID: 36 RVA: 0x00002EC4 File Offset: 0x00001EC4
private void FillBuffer()
{
int num = 0;
try
{
num = this.baseStream.ReadByte();
}
catch (Exception)
{
BZip2InputStream.CompressedStreamEOF();
}
if (num == -1)
{
BZip2InputStream.CompressedStreamEOF();
}
this.bsBuff = (this.bsBuff << 8) | (num & 255);
this.bsLive += 8;
}
// Token: 0x06000025 RID: 37 RVA: 0x00002F28 File Offset: 0x00001F28
private int BsR(int n)
{
while (this.bsLive < n)
{
this.FillBuffer();
}
int num = (this.bsBuff >> this.bsLive - n) & ((1 << n) - 1);
this.bsLive -= n;
return num;
}
// Token: 0x06000026 RID: 38 RVA: 0x00002F71 File Offset: 0x00001F71
private char BsGetUChar()
{
return (char)this.BsR(8);
}
// Token: 0x06000027 RID: 39 RVA: 0x00002F7B File Offset: 0x00001F7B
private int BsGetIntVS(int numBits)
{
return this.BsR(numBits);
}
// Token: 0x06000028 RID: 40 RVA: 0x00002F84 File Offset: 0x00001F84
private int BsGetInt32()
{
int num = this.BsR(8);
num = (num << 8) | this.BsR(8);
num = (num << 8) | this.BsR(8);
return (num << 8) | this.BsR(8);
}
// Token: 0x06000029 RID: 41 RVA: 0x00002FC0 File Offset: 0x00001FC0
private void RecvDecodingTables()
{
char[][] array = new char[6][];
for (int i = 0; i < 6; i++)
{
array[i] = new char[258];
}
bool[] array2 = new bool[16];
for (int j = 0; j < 16; j++)
{
array2[j] = this.BsR(1) == 1;
}
for (int k = 0; k < 16; k++)
{
if (array2[k])
{
for (int l = 0; l < 16; l++)
{
this.inUse[k * 16 + l] = this.BsR(1) == 1;
}
}
else
{
for (int m = 0; m < 16; m++)
{
this.inUse[k * 16 + m] = false;
}
}
}
this.MakeMaps();
int num = this.nInUse + 2;
int num2 = this.BsR(3);
int num3 = this.BsR(15);
for (int n = 0; n < num3; n++)
{
int num4 = 0;
while (this.BsR(1) == 1)
{
num4++;
}
this.selectorMtf[n] = (byte)num4;
}
byte[] array3 = new byte[6];
for (int num5 = 0; num5 < num2; num5++)
{
array3[num5] = (byte)num5;
}
for (int num6 = 0; num6 < num3; num6++)
{
int num7 = (int)this.selectorMtf[num6];
byte b = array3[num7];
while (num7 > 0)
{
array3[num7] = array3[num7 - 1];
num7--;
}
array3[0] = b;
this.selector[num6] = b;
}
for (int num8 = 0; num8 < num2; num8++)
{
int num9 = this.BsR(5);
for (int num10 = 0; num10 < num; num10++)
{
while (this.BsR(1) == 1)
{
if (this.BsR(1) == 0)
{
num9++;
}
else
{
num9--;
}
}
array[num8][num10] = (char)num9;
}
}
for (int num11 = 0; num11 < num2; num11++)
{
int num12 = 32;
int num13 = 0;
for (int num14 = 0; num14 < num; num14++)
{
num13 = Math.Max(num13, (int)array[num11][num14]);
num12 = Math.Min(num12, (int)array[num11][num14]);
}
BZip2InputStream.HbCreateDecodeTables(this.limit[num11], this.baseArray[num11], this.perm[num11], array[num11], num12, num13, num);
this.minLens[num11] = num12;
}
}
// Token: 0x0600002A RID: 42 RVA: 0x0000320C File Offset: 0x0000220C
private void GetAndMoveToFrontDecode()
{
byte[] array = new byte[256];
int num = 100000 * this.blockSize100k;
this.origPtr = this.BsGetIntVS(24);
this.RecvDecodingTables();
int num2 = this.nInUse + 1;
int num3 = -1;
int num4 = 0;
for (int i = 0; i <= 255; i++)
{
this.unzftab[i] = 0;
}
for (int j = 0; j <= 255; j++)
{
array[j] = (byte)j;
}
this.last = -1;
if (num4 == 0)
{
num3++;
num4 = 50;
}
num4--;
int num5 = (int)this.selector[num3];
int num6 = this.minLens[num5];
int k;
int num7;
for (k = this.BsR(num6); k > this.limit[num5][num6]; k = (k << 1) | num7)
{
if (num6 > 20)
{
throw new BZip2Exception("Bzip data error");
}
num6++;
while (this.bsLive < 1)
{
this.FillBuffer();
}
num7 = (this.bsBuff >> this.bsLive - 1) & 1;
this.bsLive--;
}
if (k - this.baseArray[num5][num6] < 0 || k - this.baseArray[num5][num6] >= 258)
{
throw new BZip2Exception("Bzip data error");
}
int num8 = this.perm[num5][k - this.baseArray[num5][num6]];
while (num8 != num2)
{
if (num8 == 0 || num8 == 1)
{
int l = -1;
int num9 = 1;
do
{
if (num8 == 0)
{
l += num9;
}
else if (num8 == 1)
{
l += 2 * num9;
}
num9 <<= 1;
if (num4 == 0)
{
num3++;
num4 = 50;
}
num4--;
num5 = (int)this.selector[num3];
num6 = this.minLens[num5];
for (k = this.BsR(num6); k > this.limit[num5][num6]; k = (k << 1) | num7)
{
num6++;
while (this.bsLive < 1)
{
this.FillBuffer();
}
num7 = (this.bsBuff >> this.bsLive - 1) & 1;
this.bsLive--;
}
num8 = this.perm[num5][k - this.baseArray[num5][num6]];
}
while (num8 == 0 || num8 == 1);
l++;
byte b = this.seqToUnseq[(int)array[0]];
this.unzftab[(int)b] += l;
while (l > 0)
{
this.last++;
this.ll8[this.last] = b;
l--;
}
if (this.last >= num)
{
BZip2InputStream.BlockOverrun();
}
}
else
{
this.last++;
if (this.last >= num)
{
BZip2InputStream.BlockOverrun();
}
byte b2 = array[num8 - 1];
this.unzftab[(int)this.seqToUnseq[(int)b2]]++;
this.ll8[this.last] = this.seqToUnseq[(int)b2];
for (int m = num8 - 1; m > 0; m--)
{
array[m] = array[m - 1];
}
array[0] = b2;
if (num4 == 0)
{
num3++;
num4 = 50;
}
num4--;
num5 = (int)this.selector[num3];
num6 = this.minLens[num5];
for (k = this.BsR(num6); k > this.limit[num5][num6]; k = (k << 1) | num7)
{
num6++;
while (this.bsLive < 1)
{
this.FillBuffer();
}
num7 = (this.bsBuff >> this.bsLive - 1) & 1;
this.bsLive--;
}
num8 = this.perm[num5][k - this.baseArray[num5][num6]];
}
}
}
// Token: 0x0600002B RID: 43 RVA: 0x000035F4 File Offset: 0x000025F4
private void SetupBlock()
{
int[] array = new int[257];
array[0] = 0;
Array.Copy(this.unzftab, 0, array, 1, 256);
for (int i = 1; i <= 256; i++)
{
array[i] += array[i - 1];
}
for (int j = 0; j <= this.last; j++)
{
byte b = this.ll8[j];
this.tt[array[(int)b]] = j;
array[(int)b]++;
}
this.tPos = this.tt[this.origPtr];
this.count = 0;
this.i2 = 0;
this.ch2 = 256;
if (this.blockRandomised)
{
this.rNToGo = 0;
this.rTPos = 0;
this.SetupRandPartA();
return;
}
this.SetupNoRandPartA();
}
// Token: 0x0600002C RID: 44 RVA: 0x000036D8 File Offset: 0x000026D8
private void SetupRandPartA()
{
if (this.i2 <= this.last)
{
this.chPrev = this.ch2;
this.ch2 = (int)this.ll8[this.tPos];
this.tPos = this.tt[this.tPos];
if (this.rNToGo == 0)
{
this.rNToGo = BZip2Constants.RandomNumbers[this.rTPos];
this.rTPos++;
if (this.rTPos == 512)
{
this.rTPos = 0;
}
}
this.rNToGo--;
this.ch2 ^= ((this.rNToGo == 1) ? 1 : 0);
this.i2++;
this.currentChar = this.ch2;
this.currentState = 3;
this.mCrc.Update(this.ch2);
return;
}
this.EndBlock();
this.InitBlock();
this.SetupBlock();
}
// Token: 0x0600002D RID: 45 RVA: 0x000037D4 File Offset: 0x000027D4
private void SetupNoRandPartA()
{
if (this.i2 <= this.last)
{
this.chPrev = this.ch2;
this.ch2 = (int)this.ll8[this.tPos];
this.tPos = this.tt[this.tPos];
this.i2++;
this.currentChar = this.ch2;
this.currentState = 6;
this.mCrc.Update(this.ch2);
return;
}
this.EndBlock();
this.InitBlock();
this.SetupBlock();
}
// Token: 0x0600002E RID: 46 RVA: 0x00003868 File Offset: 0x00002868
private void SetupRandPartB()
{
if (this.ch2 != this.chPrev)
{
this.currentState = 2;
this.count = 1;
this.SetupRandPartA();
return;
}
this.count++;
if (this.count >= 4)
{
this.z = this.ll8[this.tPos];
this.tPos = this.tt[this.tPos];
if (this.rNToGo == 0)
{
this.rNToGo = BZip2Constants.RandomNumbers[this.rTPos];
this.rTPos++;
if (this.rTPos == 512)
{
this.rTPos = 0;
}
}
this.rNToGo--;
this.z ^= ((this.rNToGo == 1) ? 1 : 0);
this.j2 = 0;
this.currentState = 4;
this.SetupRandPartC();
return;
}
this.currentState = 2;
this.SetupRandPartA();
}
// Token: 0x0600002F RID: 47 RVA: 0x00003960 File Offset: 0x00002960
private void SetupRandPartC()
{
if (this.j2 < (int)this.z)
{
this.currentChar = this.ch2;
this.mCrc.Update(this.ch2);
this.j2++;
return;
}
this.currentState = 2;
this.i2++;
this.count = 0;
this.SetupRandPartA();
}
// Token: 0x06000030 RID: 48 RVA: 0x000039CC File Offset: 0x000029CC
private void SetupNoRandPartB()
{
if (this.ch2 != this.chPrev)
{
this.currentState = 5;
this.count = 1;
this.SetupNoRandPartA();
return;
}
this.count++;
if (this.count >= 4)
{
this.z = this.ll8[this.tPos];
this.tPos = this.tt[this.tPos];
this.currentState = 7;
this.j2 = 0;
this.SetupNoRandPartC();
return;
}
this.currentState = 5;
this.SetupNoRandPartA();
}
// Token: 0x06000031 RID: 49 RVA: 0x00003A5C File Offset: 0x00002A5C
private void SetupNoRandPartC()
{
if (this.j2 < (int)this.z)
{
this.currentChar = this.ch2;
this.mCrc.Update(this.ch2);
this.j2++;
return;
}
this.currentState = 5;
this.i2++;
this.count = 0;
this.SetupNoRandPartA();
}
// Token: 0x06000032 RID: 50 RVA: 0x00003AC8 File Offset: 0x00002AC8
private void SetDecompressStructureSizes(int newSize100k)
{
if (0 > newSize100k || newSize100k > 9 || 0 > this.blockSize100k || this.blockSize100k > 9)
{
throw new BZip2Exception("Invalid block size");
}
this.blockSize100k = newSize100k;
if (newSize100k == 0)
{
return;
}
int num = 100000 * newSize100k;
this.ll8 = new byte[num];
this.tt = new int[num];
}
// Token: 0x06000033 RID: 51 RVA: 0x00003B27 File Offset: 0x00002B27
private static void CompressedStreamEOF()
{
throw new EndOfStreamException("BZip2 input stream end of compressed stream");
}
// Token: 0x06000034 RID: 52 RVA: 0x00003B33 File Offset: 0x00002B33
private static void BlockOverrun()
{
throw new BZip2Exception("BZip2 input stream block overrun");
}
// Token: 0x06000035 RID: 53 RVA: 0x00003B3F File Offset: 0x00002B3F
private static void BadBlockHeader()
{
throw new BZip2Exception("BZip2 input stream bad block header");
}
// Token: 0x06000036 RID: 54 RVA: 0x00003B4B File Offset: 0x00002B4B
private static void CrcError()
{
throw new BZip2Exception("BZip2 input stream crc error");
}
// Token: 0x06000037 RID: 55 RVA: 0x00003B58 File Offset: 0x00002B58
private static void HbCreateDecodeTables(int[] limit, int[] baseArray, int[] perm, char[] length, int minLen, int maxLen, int alphaSize)
{
int num = 0;
for (int i = minLen; i <= maxLen; i++)
{
for (int j = 0; j < alphaSize; j++)
{
if ((int)length[j] == i)
{
perm[num] = j;
num++;
}
}
}
for (int k = 0; k < 23; k++)
{
baseArray[k] = 0;
}
for (int l = 0; l < alphaSize; l++)
{
baseArray[(int)(length[l] + '\u0001')]++;
}
for (int m = 1; m < 23; m++)
{
baseArray[m] += baseArray[m - 1];
}
for (int n = 0; n < 23; n++)
{
limit[n] = 0;
}
int num2 = 0;
for (int num3 = minLen; num3 <= maxLen; num3++)
{
num2 += baseArray[num3 + 1] - baseArray[num3];
limit[num3] = num2 - 1;
num2 <<= 1;
}
for (int num4 = minLen + 1; num4 <= maxLen; num4++)
{
baseArray[num4] = (limit[num4 - 1] + 1 << 1) - baseArray[num4];
}
}
// Token: 0x0400000C RID: 12
private const int START_BLOCK_STATE = 1;
// Token: 0x0400000D RID: 13
private const int RAND_PART_A_STATE = 2;
// Token: 0x0400000E RID: 14
private const int RAND_PART_B_STATE = 3;
// Token: 0x0400000F RID: 15
private const int RAND_PART_C_STATE = 4;
// Token: 0x04000010 RID: 16
private const int NO_RAND_PART_A_STATE = 5;
// Token: 0x04000011 RID: 17
private const int NO_RAND_PART_B_STATE = 6;
// Token: 0x04000012 RID: 18
private const int NO_RAND_PART_C_STATE = 7;
// Token: 0x04000013 RID: 19
private int last;
// Token: 0x04000014 RID: 20
private int origPtr;
// Token: 0x04000015 RID: 21
private int blockSize100k;
// Token: 0x04000016 RID: 22
private bool blockRandomised;
// Token: 0x04000017 RID: 23
private int bsBuff;
// Token: 0x04000018 RID: 24
private int bsLive;
// Token: 0x04000019 RID: 25
private IChecksum mCrc = new StrangeCRC();
// Token: 0x0400001A RID: 26
private bool[] inUse = new bool[256];
// Token: 0x0400001B RID: 27
private int nInUse;
// Token: 0x0400001C RID: 28
private byte[] seqToUnseq = new byte[256];
// Token: 0x0400001D RID: 29
private byte[] unseqToSeq = new byte[256];
// Token: 0x0400001E RID: 30
private byte[] selector = new byte[18002];
// Token: 0x0400001F RID: 31
private byte[] selectorMtf = new byte[18002];
// Token: 0x04000020 RID: 32
private int[] tt;
// Token: 0x04000021 RID: 33
private byte[] ll8;
// Token: 0x04000022 RID: 34
private int[] unzftab = new int[256];
// Token: 0x04000023 RID: 35
private int[][] limit = new int[6][];
// Token: 0x04000024 RID: 36
private int[][] baseArray = new int[6][];
// Token: 0x04000025 RID: 37
private int[][] perm = new int[6][];
// Token: 0x04000026 RID: 38
private int[] minLens = new int[6];
// Token: 0x04000027 RID: 39
private Stream baseStream;
// Token: 0x04000028 RID: 40
private bool streamEnd;
// Token: 0x04000029 RID: 41
private int currentChar = -1;
// Token: 0x0400002A RID: 42
private int currentState = 1;
// Token: 0x0400002B RID: 43
private int storedBlockCRC;
// Token: 0x0400002C RID: 44
private int storedCombinedCRC;
// Token: 0x0400002D RID: 45
private int computedBlockCRC;
// Token: 0x0400002E RID: 46
private uint computedCombinedCRC;
// Token: 0x0400002F RID: 47
private int count;
// Token: 0x04000030 RID: 48
private int chPrev;
// Token: 0x04000031 RID: 49
private int ch2;
// Token: 0x04000032 RID: 50
private int tPos;
// Token: 0x04000033 RID: 51
private int rNToGo;
// Token: 0x04000034 RID: 52
private int rTPos;
// Token: 0x04000035 RID: 53
private int i2;
// Token: 0x04000036 RID: 54
private int j2;
// Token: 0x04000037 RID: 55
private byte z;
// Token: 0x04000038 RID: 56
private bool isStreamOwner = true;
}
}