Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

229 lines
5.8 KiB

#pragma once
#include <stdio.h>
#include <stdarg.h>
#include <stdio.h>
#include <Rtutils.h>
#include <Winsock.h>
extern DWORD g_dwTraceId;
#if defined(DBG) || defined(_DEBUG)
#define MYTRACE_ENABLE DWORD g_dwTraceId=0; int CMyDebugTrace::m_nIndent=-1;
#define MYTRACE_START(UNIQUE_NAME) g_dwTraceId = TraceRegister(UNIQUE_NAME); // TRACE_USE_FILE
#define MYTRACE_STOP TraceDeregister(g_dwTraceId);
#define MYTRACE_ENTER(MSG) CMyDebugTrace _NewMyTrace(MSG, __FILE__, __LINE__, true);
#define MYTRACE_ENTER_EXTRA_SPACE(MSG) CMyDebugTrace _NewMyTrace(MSG, __FILE__, __LINE__, true,1);
#define MYTRACE_ENTER_NOSHOWEXIT(MSG) CMyDebugTrace _NewMyTrace(MSG, __FILE__, __LINE__, false);
#define MYTRACE_ERROR(MSG,ERROR_NUMBER) _NewMyTrace.TraceError(MSG, ERROR_NUMBER, __LINE__);
#define MYTRACE_IP(ULONG_ADDRESS) _NewMyTrace.IP2A(ULONG_ADDRESS)
#define MYTRACE _NewMyTrace.MyTrace
#define MYTRACE_BUFFER2STR(BUFF, NLEN) _NewMyTrace.Buffer2Str(BUFF, NLEN)
#else
#define MYTRACE_ENABLE
#define MYTRACE_START(UNIQUE_NAME)
#define MYTRACE_STOP
#define MYTRACE_ENTER(MSG)
#define MYTRACE_ENTER_EXTRA_SPACE(MSG)
#define MYTRACE_ENTER_NOSHOWEXIT(MSG)
#define MYTRACE_ERROR(MSG,ERROR_NUMBER)
#define MYTRACE_IP(ULONG_ADDRESS) 0
#define MYTRACE
#define MYTRACE_BUFFER2STR(BUFF, NLEN) 0
#endif
//#define DOTRACE(ID, str)
#define DOTRACE(ID, str) TracePrintf(g_dwTraceId, str);
//#define DOTRACE(ID, str) OutputDebugString(str);OutputDebugString(L"\n");
//#define DOTRACE(ID, str) MessageBox(NULL,str,m_szMsgEnter,MB_OK|MB_SERVICE_NOTIFICATION);
class CMyDebugTrace
{
public:
CMyDebugTrace(
LPCSTR szMsgEnter,
LPCSTR szFile,
const int nLine,
bool bShowExit,
int nExtraWhiteSpace=0
)
{
USES_CONVERSION;
m_nExtraSpace = nExtraWhiteSpace;
m_bShowExit = bShowExit;
lstrcpy(m_szMsgEnter, A2T(szMsgEnter));
// From the entry/creation text we extract the function name
// example "CFoo::Format" we will have CFoo to prefix in front of all traces done after
lstrcpy(m_szFunction, A2T(szMsgEnter));
wchar_t* pEnd = wcschr(m_szFunction, L':');
if ( pEnd )
*pEnd = L'\0';
else
lstrcpy(m_szFunction, L"");
lstrcpy(m_szFile, A2T(szFile));
m_nIndent++;
wsprintf(
m_szTrace,
L"%s%s %s",
SzRepeat(m_nIndent),
m_bShowExit ? L"++" : L"+-",
m_szMsgEnter
);
int nLen = lstrlen(m_szTrace);
wsprintf(
m_szTrace,
L"%s%s[L%d]%s",
m_szTrace,
SzRepeat(80-nLen),
nLine,
m_szFile
);
if ( m_nExtraSpace != 0 )
DOTRACE(g_dwTraceId, TEXT(""));
DOTRACE(g_dwTraceId, m_szTrace);
}
~CMyDebugTrace()
{
if ( m_bShowExit )
{
wsprintf(m_szTrace, L"%s-- %s", SzRepeat(m_nIndent), m_szMsgEnter);
DOTRACE(g_dwTraceId, m_szTrace);
if ( m_nExtraSpace != 0 )
DOTRACE(g_dwTraceId, TEXT(""));
}
m_nIndent--;
}
//
// Output to the debug window a user trace
//
inline void _cdecl MyTrace(LPCSTR lpszFormat, ...)
{
#if defined(DBG) || defined(_DEBUG)
USES_CONVERSION;
va_list args;
va_start(args, lpszFormat);
char szBuffer[2048];
_vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
TCHAR szLine[2048];
wsprintf(szLine, L"%s%s %s", SzRepeat(CMyDebugTrace::m_nIndent+3), m_szFunction, A2T(szBuffer));
DOTRACE(g_dwTraceId, szLine);
va_end(args);
#endif
}
//
// Output a debug trace for a error including Line number and source file name
//
inline void
TraceError(
LPCSTR szMsg,
int nError,
const int nLine
)
{
USES_CONVERSION;
TCHAR szBuffer[512];
//
// No Error # was given so lets get the last one raised
//
if ( nError == 0 )
nError = GetLastError();
wsprintf(szBuffer, L"%s %s ERROR(0x%X):%s [L%d]%s", SzRepeat(CMyDebugTrace::m_nIndent), m_szMsgEnter, nError, A2T(szMsg), nLine, m_szFile);
DOTRACE(g_dwTraceId, szBuffer);
}
//
// Return the ascii equivalent of the IP example "192.168.0.1"
//
inline char*
IP2A(ULONG ulAddress)
{
in_addr tmpAddr;
tmpAddr.s_addr = ulAddress;
return inet_ntoa(tmpAddr);
}
inline char*
Buffer2Str(char* pBuff, int nLen)
{
static char szPrintableStr[1024];
memcpy(szPrintableStr, pBuff, min(nLen,1022));
szPrintableStr[min(nLen,1023)] = '\0';
int nLenMin = strlen(szPrintableStr);
for ( int nChar=0; nChar < nLenMin; nChar++ )
{
if ( isprint(szPrintableStr[nChar])==0 )
szPrintableStr[nChar] = '·';
}
return szPrintableStr;
}
//
// Return a left paded space indentation
//
inline LPCTSTR
SzRepeat(int nCount)
{
static TCHAR szPading[200];
lstrcpy(szPading, L"");
for ( int nI=0; nI < nCount; nI++ )
lstrcat(szPading, L" ");
return szPading;
}
int m_nExtraSpace;
bool m_bShowExit;
TCHAR m_szTrace[512];
TCHAR m_szMsgEnter[1024];
TCHAR m_szFunction[256];
TCHAR m_szFile[256];
static int m_nIndent;
};