//========= 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