53 lines
1.1 KiB
C++
53 lines
1.1 KiB
C++
#include "rar.hpp"
|
|
|
|
BitInput::BitInput(bool AllocBuffer)
|
|
{
|
|
ExternalBuffer=false;
|
|
if (AllocBuffer)
|
|
{
|
|
// getbits32 attempts to read data from InAddr, ... InAddr+3 positions.
|
|
// So let's allocate 3 additional bytes for situation, when we need to
|
|
// read only 1 byte from the last position of buffer and avoid a crash
|
|
// from access to next 3 bytes, which contents we do not need.
|
|
size_t BufSize=MAX_SIZE+3;
|
|
InBuf=new byte[BufSize];
|
|
|
|
// Ensure that we get predictable results when accessing bytes in area
|
|
// not filled with read data.
|
|
memset(InBuf,0,BufSize);
|
|
}
|
|
else
|
|
InBuf=NULL;
|
|
}
|
|
|
|
|
|
BitInput::~BitInput()
|
|
{
|
|
if (!ExternalBuffer)
|
|
delete[] InBuf;
|
|
}
|
|
|
|
|
|
void BitInput::faddbits(uint Bits)
|
|
{
|
|
// Function wrapped version of inline addbits to save code size.
|
|
addbits(Bits);
|
|
}
|
|
|
|
|
|
uint BitInput::fgetbits()
|
|
{
|
|
// Function wrapped version of inline getbits to save code size.
|
|
return getbits();
|
|
}
|
|
|
|
|
|
void BitInput::SetExternalBuffer(byte *Buf)
|
|
{
|
|
if (InBuf!=NULL && !ExternalBuffer)
|
|
delete[] InBuf;
|
|
InBuf=Buf;
|
|
ExternalBuffer=true;
|
|
}
|
|
|