mirror of
https://github.com/dashr9230/SA-MP.git
synced 2024-12-22 22:47:29 +08:00
153 lines
3.5 KiB
C++
153 lines
3.5 KiB
C++
// TODO: Implement BitStream.cpp
|
|
|
|
#include "BitStream.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
using namespace RakNet;
|
|
|
|
BitStream::BitStream()
|
|
{
|
|
numberOfBitsUsed = 0;
|
|
//numberOfBitsAllocated = 32 * 8;
|
|
numberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8;
|
|
readOffset = 0;
|
|
//data = ( unsigned char* ) malloc( 32 );
|
|
data = ( unsigned char* ) stackData;
|
|
|
|
#ifdef _DEBUG
|
|
// assert( data );
|
|
#endif
|
|
//memset(data, 0, 32);
|
|
copyData = true;
|
|
}
|
|
|
|
BitStream::BitStream( int initialBytesToAllocate )
|
|
{
|
|
numberOfBitsUsed = 0;
|
|
readOffset = 0;
|
|
if (initialBytesToAllocate <= BITSTREAM_STACK_ALLOCATION_SIZE)
|
|
{
|
|
data = ( unsigned char* ) stackData;
|
|
numberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8;
|
|
}
|
|
else
|
|
{
|
|
data = ( unsigned char* ) malloc( initialBytesToAllocate );
|
|
numberOfBitsAllocated = initialBytesToAllocate << 3;
|
|
}
|
|
#ifdef _DEBUG
|
|
assert( data );
|
|
#endif
|
|
// memset(data, 0, initialBytesToAllocate);
|
|
copyData = true;
|
|
}
|
|
|
|
BitStream::BitStream( unsigned char* _data, unsigned int lengthInBytes, bool _copyData )
|
|
{
|
|
numberOfBitsUsed = lengthInBytes << 3;
|
|
readOffset = 0;
|
|
copyData = _copyData;
|
|
numberOfBitsAllocated = lengthInBytes << 3;
|
|
|
|
if ( copyData )
|
|
{
|
|
if ( lengthInBytes > 0 )
|
|
{
|
|
if (lengthInBytes < BITSTREAM_STACK_ALLOCATION_SIZE)
|
|
{
|
|
data = ( unsigned char* ) stackData;
|
|
numberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE << 3;
|
|
}
|
|
else
|
|
{
|
|
data = ( unsigned char* ) malloc( lengthInBytes );
|
|
}
|
|
#ifdef _DEBUG
|
|
assert( data );
|
|
#endif
|
|
memcpy( data, _data, lengthInBytes );
|
|
}
|
|
else
|
|
data = 0;
|
|
}
|
|
else
|
|
data = ( unsigned char* ) _data;
|
|
}
|
|
|
|
// SAMPSRV (adding this just as a tag for next RakNet upgrade)
|
|
BitStream::BitStream( char* _dataC, unsigned int lengthInBytes, bool _copyData )
|
|
{
|
|
unsigned char* _data = reinterpret_cast<unsigned char*>(_dataC);
|
|
|
|
numberOfBitsUsed = lengthInBytes << 3;
|
|
readOffset = 0;
|
|
copyData = _copyData;
|
|
numberOfBitsAllocated = lengthInBytes << 3;
|
|
|
|
if ( copyData )
|
|
{
|
|
if ( lengthInBytes > 0 )
|
|
{
|
|
if (lengthInBytes < BITSTREAM_STACK_ALLOCATION_SIZE)
|
|
{
|
|
data = ( unsigned char* ) stackData;
|
|
numberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE << 3;
|
|
}
|
|
else
|
|
{
|
|
data = ( unsigned char* ) malloc( lengthInBytes );
|
|
}
|
|
#ifdef _DEBUG
|
|
assert( data );
|
|
#endif
|
|
memcpy( data, _data, lengthInBytes );
|
|
}
|
|
else
|
|
data = 0;
|
|
}
|
|
else
|
|
data = ( unsigned char* ) _data;
|
|
}
|
|
|
|
// Use this if you pass a pointer copy to the constructor (_copyData==false) and want to overallocate to prevent reallocation
|
|
void BitStream::SetNumberOfBitsAllocated( const unsigned int lengthInBits )
|
|
{
|
|
#ifdef _DEBUG
|
|
assert( lengthInBits >= ( unsigned int ) numberOfBitsAllocated );
|
|
#endif
|
|
numberOfBitsAllocated = lengthInBits;
|
|
}
|
|
|
|
BitStream::~BitStream()
|
|
{
|
|
if ( copyData && numberOfBitsAllocated > BITSTREAM_STACK_ALLOCATION_SIZE << 3)
|
|
free( data ); // Use realloc and free so we are more efficient than delete and new for resizing
|
|
}
|
|
|
|
void BitStream::Reset( void )
|
|
{
|
|
// Note: Do NOT reallocate memory because BitStream is used
|
|
// in places to serialize/deserialize a buffer. Reallocation
|
|
// is a dangerous operation (may result in leaks).
|
|
|
|
if ( numberOfBitsUsed > 0 )
|
|
{
|
|
// memset(data, 0, BITS_TO_BYTES(numberOfBitsUsed));
|
|
}
|
|
|
|
// Don't free memory here for speed efficiency
|
|
//free(data); // Use realloc and free so we are more efficient than delete and new for resizing
|
|
numberOfBitsUsed = 0;
|
|
|
|
//numberOfBitsAllocated=8;
|
|
readOffset = 0;
|
|
|
|
//data=(unsigned char*)malloc(1);
|
|
// if (numberOfBitsAllocated>0)
|
|
// memset(data, 0, BITS_TO_BYTES(numberOfBitsAllocated));
|
|
}
|
|
|
|
|
|
|