summaryrefslogtreecommitdiff
path: root/utils/studiomdl/filebuffer.h
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/studiomdl/filebuffer.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/studiomdl/filebuffer.h')
-rw-r--r--utils/studiomdl/filebuffer.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/utils/studiomdl/filebuffer.h b/utils/studiomdl/filebuffer.h
new file mode 100644
index 0000000..d7c0a42
--- /dev/null
+++ b/utils/studiomdl/filebuffer.h
@@ -0,0 +1,131 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef FILEBUFFER_H
+#define FILEBUFFER_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "tier1/smartptr.h"
+#include "tier2/p4helpers.h"
+
+class CFileBuffer
+{
+public:
+ CFileBuffer( int size )
+ {
+ m_pData = new unsigned char[size];
+#ifdef _DEBUG
+ m_pUsed = new const char *[size];
+ memset( m_pUsed, 0, size * sizeof( const char * ) );
+#endif
+ m_Size = size;
+ m_pCurPos = m_pData;
+#ifdef _DEBUG
+ memset( m_pData, 0xbaadf00d, size );
+#endif
+ }
+ ~CFileBuffer()
+ {
+ delete [] m_pData;
+#ifdef _DEBUG
+ delete [] m_pUsed;
+#endif
+ }
+
+#ifdef _DEBUG
+ void TestWritten( int EndOfFileOffset )
+ {
+ if ( !g_quiet )
+ {
+ printf( "testing to make sure that the whole file has been written\n" );
+ }
+ int i;
+ for( i = 0; i < EndOfFileOffset; i++ )
+ {
+ if( !m_pUsed[i] )
+ {
+ printf( "offset %d not written, end of file invalid!\n", i );
+ assert( 0 );
+ }
+ }
+ }
+#endif
+
+ void WriteToFile( const char *fileName, int size )
+ {
+ CPlainAutoPtr< CP4File > spFile( g_p4factory->AccessFile( fileName ) );
+ spFile->Edit();
+ FILE *fp = fopen( fileName, "wb" );
+ if( !fp )
+ {
+ MdlWarning( "Can't open \"%s\" for writing!\n", fileName );
+ return;
+ }
+
+ fwrite( m_pData, 1, size, fp );
+
+ fclose( fp );
+ spFile->Add();
+ }
+
+ void WriteAt( int offset, void *data, int size, const char *name )
+ {
+// printf( "WriteAt: \"%s\" offset: %d end: %d size: %d\n", name, offset, offset + size - 1, size );
+ m_pCurPos = m_pData + offset;
+
+#ifdef _DEBUG
+ int i;
+ const char **used = m_pUsed + offset;
+ bool bitched = false;
+ for( i = 0; i < size; i++ )
+ {
+ if( used[i] )
+ {
+ if( !bitched )
+ {
+ printf( "overwrite at %d! (overwriting \"%s\" with \"%s\")\n", i + offset, used[i], name );
+ assert( 0 );
+ bitched = true;
+ }
+ }
+ else
+ {
+ used[i] = name;
+ }
+ }
+#endif // _DEBUG
+
+ Append( data, size );
+ }
+ int GetOffset( void )
+ {
+ return m_pCurPos - m_pData;
+ }
+ void *GetPointer( int offset )
+ {
+ return m_pData + offset;
+ }
+private:
+ void Append( void *data, int size )
+ {
+ assert( m_pCurPos + size - m_pData < m_Size );
+ memcpy( m_pCurPos, data, size );
+ m_pCurPos += size;
+ }
+ CFileBuffer(); // undefined
+ int m_Size;
+ unsigned char *m_pData;
+ unsigned char *m_pCurPos;
+#ifdef _DEBUG
+ const char **m_pUsed;
+#endif
+};
+
+
+#endif // FILEBUFFER_H