diff options
Diffstat (limited to 'utils/vmpi/messbuf.cpp')
| -rw-r--r-- | utils/vmpi/messbuf.cpp | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/utils/vmpi/messbuf.cpp b/utils/vmpi/messbuf.cpp new file mode 100644 index 0000000..d0f65eb --- /dev/null +++ b/utils/vmpi/messbuf.cpp @@ -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"); +}
\ No newline at end of file |