namespace SharpCompress.Compressors.Rar.VM { internal class BitInput { /// the max size of the input internal const int MAX_SIZE = 0x8000; public int inAddr; public int inBit; // TODO: rename var public int InAddr { get { return inAddr; } set { inAddr = value; } } public int InBit { get { return inBit; } set { inBit = value; } } public bool ExternalBuffer; /// internal BitInput() { InBuf = new byte[MAX_SIZE]; } internal byte[] InBuf { get; } internal void InitBitInput() { inAddr = 0; inBit = 0; } internal void faddbits(uint bits) { // TODO uint AddBits((int)bits); } /// /// also named faddbits /// /// internal void AddBits(int bits) { bits += inBit; inAddr += (bits >> 3); inBit = bits & 7; } internal uint fgetbits() { // TODO uint return (uint)GetBits(); } internal uint getbits() { // TODO uint return (uint)GetBits(); } /// /// (also named fgetbits) /// /// /// the bits (unsigned short) /// internal int GetBits() { // int BitField=0; // BitField|=(int)(inBuf[inAddr] << 16)&0xFF0000; // BitField|=(int)(inBuf[inAddr+1] << 8)&0xff00; // BitField|=(int)(inBuf[inAddr+2])&0xFF; // BitField >>>= (8-inBit); // return (BitField & 0xffff); return ((Utility.URShift((((InBuf[inAddr] & 0xff) << 16) + ((InBuf[inAddr + 1] & 0xff) << 8) + ((InBuf[inAddr + 2] & 0xff))), (8 - inBit))) & 0xffff); } /// Indicates an Overfow /// how many bytes to inc /// /// true if an Oververflow would occur /// internal bool Overflow(int IncPtr) { return (inAddr + IncPtr >= MAX_SIZE); } } }