|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "textstatsmgr.h"
#include "tier0/dbg.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
CTextStatsMgr g_TextStatsMgr; // The default text stats manager.
// ------------------------------------------------------------------------------------------ //
// CTextStatsMgr implementation.
// ------------------------------------------------------------------------------------------ //
CTextStatsMgr::CTextStatsMgr( void ) { m_szStatFilename[0] = 0; }
bool CTextStatsMgr::WriteFile( IFileSystem *pFileSys, const char *pFilename ) { // If no filename was specified, use out preset one
if ( !pFilename ) { pFilename = m_szStatFilename; }
FileHandle_t hFile = pFileSys->Open( pFilename, "wt", "LOGDIR" ); if ( hFile == FILESYSTEM_INVALID_HANDLE ) return false; CTextStat *pHead = CTextStat::GetTextStatsList(); for ( CTextStat *pCur=pHead->m_pNext; pCur != pHead; pCur=pCur->m_pNext ) { if ( pCur->m_pMgr == this ) pCur->m_PrintFn( pFileSys, hFile, pCur->m_pUserData ); }
pFileSys->Close( hFile );
// Call each CTextStatFile..
for( CTextStatFile *pCurFile=CTextStatFile::s_pHead; pCurFile; pCurFile=pCurFile->m_pNext ) { pCurFile->m_pFn(); }
return true; }
char *CTextStatsMgr::GetStatsFilename( void ) { return m_szStatFilename; }
void CTextStatsMgr::SetStatsFilename( char *sFilename ) { Assert( sFilename && sFilename[0] );
Q_strncpy( m_szStatFilename, sFilename, sizeof(m_szStatFilename) ); }
// ------------------------------------------------------------------------------------------ //
// CTextStat implementation.
// ------------------------------------------------------------------------------------------ //
CTextStat::CTextStat() { m_pPrev = m_pNext = this; m_pMgr = NULL; }
CTextStat::CTextStat( TextStatPrintFn printFn, void *pUserData, CTextStatsMgr *pMgr ) { m_pPrev = m_pNext = this; Init( printFn, pUserData, pMgr ); }
CTextStat::~CTextStat() { Term(); }
void CTextStat::Init( TextStatPrintFn printFn, void *pUserData, CTextStatsMgr *pMgr ) { Term();
m_pPrev = GetTextStatsList(); m_pNext = GetTextStatsList()->m_pNext; m_pPrev->m_pNext = m_pNext->m_pPrev = this; m_PrintFn = printFn; m_pUserData = pUserData; m_pMgr = pMgr; }
void CTextStat::Term() { // Remove from the global list.
m_pPrev->m_pNext = m_pNext; m_pNext->m_pPrev = m_pPrev; m_pPrev = m_pNext = this; m_pMgr = NULL; }
CTextStat::CTextStat( bool bGlobalListHead ) { Assert( bGlobalListHead ); m_pPrev = m_pNext = this; }
CTextStat* CTextStat::GetTextStatsList() { static CTextStat theList( true ); return &theList; }
void CTextStat::RemoveFn( void *pUserData ) { CTextStat *pReg = (CTextStat*)pUserData; pReg->Term(); }
// ------------------------------------------------------------------------------------------ //
// CTextStatInt implementation.
// ------------------------------------------------------------------------------------------ //
CTextStatInt::CTextStatInt( const char *pName, int initialValue, CTextStatsMgr *pMgr ) { m_pName = pName; m_Value = initialValue; m_Reg.Init( &CTextStatInt::PrintFn, this, pMgr ); }
void CTextStatInt::PrintFn( IFileSystem *pFileSys, FileHandle_t hFile, void *pUserData ) { CTextStatInt *pStat = (CTextStatInt*)pUserData; pFileSys->FPrintf( hFile, "%s %d\n", pStat->m_pName, pStat->m_Value ); }
// ------------------------------------------------------------------------------------------ //
// CTextStatFile functions.
// ------------------------------------------------------------------------------------------ //
CTextStatFile *CTextStatFile::s_pHead = NULL;
CTextStatFile::CTextStatFile( TextStatFileFn fn ) { m_pFn = fn; m_pNext = CTextStatFile::s_pHead; CTextStatFile::s_pHead = this; }
|