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.
131 lines
2.4 KiB
131 lines
2.4 KiB
//========= 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
|
|
|