diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/studiomdl/filebuffer.h | |
| download | archived-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.h | 131 |
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 |