summaryrefslogtreecommitdiff
path: root/utils/vmpi/messbuf.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/vmpi/messbuf.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'utils/vmpi/messbuf.cpp')
-rw-r--r--utils/vmpi/messbuf.cpp279
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