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.
174 lines
3.9 KiB
174 lines
3.9 KiB
//========= 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; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|