AxibugEmuOnline/OtherCore/MyNes.Standard2/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs

135 lines
2.6 KiB
C#

using System.IO;
namespace ComponentAce.Compression.Libs.zlib
{
public class ZInputStream : BinaryReader
{
protected ZStream z = new ZStream();
protected int bufsize = 512;
protected int flush;
protected byte[] buf;
protected byte[] buf1 = new byte[1];
protected bool compress;
internal Stream in_Renamed;
internal bool nomoreinput;
public virtual int FlushMode
{
get
{
return flush;
}
set
{
flush = value;
}
}
public virtual long TotalIn => z.total_in;
public virtual long TotalOut => z.total_out;
internal void InitBlock()
{
flush = 0;
buf = new byte[bufsize];
}
public ZInputStream(Stream in_Renamed)
: base(in_Renamed)
{
InitBlock();
this.in_Renamed = in_Renamed;
z.inflateInit();
compress = false;
z.next_in = buf;
z.next_in_index = 0;
z.avail_in = 0;
}
public ZInputStream(Stream in_Renamed, int level)
: base(in_Renamed)
{
InitBlock();
this.in_Renamed = in_Renamed;
z.deflateInit(level);
compress = true;
z.next_in = buf;
z.next_in_index = 0;
z.avail_in = 0;
}
public override int Read()
{
if (read(buf1, 0, 1) == -1)
{
return -1;
}
return buf1[0] & 0xFF;
}
public int read(byte[] b, int off, int len)
{
if (len == 0)
{
return 0;
}
z.next_out = b;
z.next_out_index = off;
z.avail_out = len;
int num;
do
{
if (z.avail_in == 0 && !nomoreinput)
{
z.next_in_index = 0;
z.avail_in = SupportClass.ReadInput(in_Renamed, buf, 0, bufsize);
if (z.avail_in == -1)
{
z.avail_in = 0;
nomoreinput = true;
}
}
num = ((!compress) ? z.inflate(flush) : z.deflate(flush));
if (nomoreinput && num == -5)
{
return -1;
}
if (num != 0 && num != 1)
{
throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg);
}
if (nomoreinput && z.avail_out == len)
{
return -1;
}
}
while (z.avail_out == len && num == 0);
return len - z.avail_out;
}
public long skip(long n)
{
int num = 512;
if (n < num)
{
num = (int)n;
}
byte[] array = new byte[num];
return SupportClass.ReadInput(BaseStream, array, 0, array.Length);
}
public override void Close()
{
in_Renamed.Close();
}
}
}