Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
2.4 KiB

5 years ago
//========= 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