| #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; |
| } |
| |