mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 09:49:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,279 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//
|
||||
//=============================================================================//
|
||||
//
|
||||
// MessageBuffer - handy for serializing/unserializing
|
||||
// structures to be sent as messages
|
||||
// dal - 9/2002
|
||||
//
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "messbuf.h"
|
||||
#include "tier1/strtools.h"
|
||||
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
MessageBuffer::MessageBuffer()
|
||||
{
|
||||
size = DEFAULT_MESSAGE_BUFFER_SIZE;
|
||||
data = (char *) malloc(size);
|
||||
len = 0;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
MessageBuffer::MessageBuffer(int minsize)
|
||||
{
|
||||
size = minsize;
|
||||
data = (char *) malloc(size);
|
||||
len = 0;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
MessageBuffer::~MessageBuffer()
|
||||
{
|
||||
free(data);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::getSize()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::getLen()
|
||||
{
|
||||
return len;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::setLen(int nlen)
|
||||
{
|
||||
if (nlen < 0) return -1;
|
||||
if (nlen > size) {
|
||||
resize(nlen);
|
||||
}
|
||||
|
||||
int res = len;
|
||||
len = nlen;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::getOffset()
|
||||
{
|
||||
return offset;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::setOffset(int noffset)
|
||||
{
|
||||
if (noffset < 0 || noffset > len) return -1;
|
||||
int res = offset;
|
||||
offset = noffset;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::write(void const * p, int bytes)
|
||||
{
|
||||
if (bytes + len > size) {
|
||||
resize(bytes + len);
|
||||
}
|
||||
memcpy(data + len, p, bytes);
|
||||
int res = len;
|
||||
len += bytes;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::update(int loc, void const * p, int bytes)
|
||||
{
|
||||
if (loc + bytes > size) {
|
||||
resize(loc + bytes);
|
||||
}
|
||||
memcpy(data + loc, p, bytes);
|
||||
|
||||
if (len < loc + bytes) {
|
||||
len = loc + bytes;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::extract(int loc, void * p, int bytes)
|
||||
{
|
||||
if (loc + bytes > len) return -1;
|
||||
memcpy(p, data + loc, bytes);
|
||||
|
||||
return loc + bytes;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
int
|
||||
MessageBuffer::read(void * p, int bytes)
|
||||
{
|
||||
if (offset + bytes > len) return -1;
|
||||
memcpy(p, data + offset, bytes);
|
||||
|
||||
offset += bytes;
|
||||
return offset;
|
||||
}
|
||||
|
||||
int MessageBuffer::WriteString( const char *pString )
|
||||
{
|
||||
return write( pString, V_strlen( pString ) + 1 );
|
||||
}
|
||||
|
||||
int MessageBuffer::ReadString( char *pOut, int bufferLength )
|
||||
{
|
||||
int nChars = 0;
|
||||
while ( 1 )
|
||||
{
|
||||
char ch;
|
||||
if ( read( &ch, sizeof( ch ) ) == -1 )
|
||||
{
|
||||
pOut[0] = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( ch == 0 || nChars >= (bufferLength-1) )
|
||||
break;
|
||||
|
||||
pOut[nChars] = ch;
|
||||
++nChars;
|
||||
}
|
||||
pOut[nChars] = 0;
|
||||
return nChars + 1;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
void
|
||||
MessageBuffer::clear()
|
||||
{
|
||||
memset(data, 0, size);
|
||||
offset = 0;
|
||||
len = 0;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
void
|
||||
MessageBuffer::clear(int minsize)
|
||||
{
|
||||
if (minsize > size) {
|
||||
resize(minsize);
|
||||
}
|
||||
memset(data, 0, size);
|
||||
offset = 0;
|
||||
len = 0;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
void
|
||||
MessageBuffer::reset(int minsize)
|
||||
{
|
||||
if (minsize > size) {
|
||||
resize(minsize);
|
||||
}
|
||||
len = 0;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
//
|
||||
void
|
||||
MessageBuffer::resize(int minsize)
|
||||
{
|
||||
if (minsize < size) return;
|
||||
|
||||
if (size * 2 > minsize) minsize = size * 2;
|
||||
|
||||
char * odata = data;
|
||||
data = (char *) malloc(minsize);
|
||||
memcpy(data, odata, len);
|
||||
size = minsize;
|
||||
free(odata);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
//
|
||||
void
|
||||
MessageBuffer::print(FILE * ofile, int num)
|
||||
{
|
||||
fprintf(ofile, "Len: %d Offset: %d Size: %d\n", len, offset, size);
|
||||
if (num > size) num = size;
|
||||
for (int i=0; i<num; ++i) {
|
||||
fprintf(ofile, "%02x ", (unsigned char) data[i]);
|
||||
}
|
||||
fprintf(ofile, "\n");
|
||||
}
|
||||
Reference in New Issue
Block a user