// trace.h : tracing helper macros // Copyright (c) Microsoft Corporation 1995-1997. #pragma once #pragma warning(disable : 4296) #ifndef TRACE_H #define TRACE_H // if you want to use the vidctl helper *impl templates without using the // vidctl trace/debug infrastructure then #define NO_VIDCTL_TRACE_SUPPORT // separately if you don't want to use the vidctl ASSERT then // #define NO_VIDCTL_ASSERT_SUPPORT #ifdef NO_VIDCTL_TRACE_SUPPORT #ifndef TRACELM #define TRACELM(level, msg) #endif #ifndef TRACELS #define TRACELS(level, stmt) #endif #ifndef TRACELSM #define TRACELSM(level, stmt, msg) #endif #ifndef BEGIN_TRACEL #define BEGIN_TRACEL(level) #endif #ifndef TRACES #define TRACES(stmt) #endif #ifndef END_TRACEL #define END_TRACEL #endif #ifndef END_TRACELM #define END_TRACELM(msg) #endif #ifndef TRACEINDENT #define TRACEINDENT() #endif #ifndef TRACEOUTDENT #define TRACEOUTDENT() #endif #else // NO_VIDCTL_TRACE_SUPPORT #ifdef NO_VIDCTL_ASSERT_SUPPORT #ifndef ASSERT #define ASSERT(x) #endif #else // NO_VIDCTL_ASSERT_SUPPORT #if !defined(DEBUG) && (defined(_DBG) || defined(DBG) || defined(_DEBUG)) #define DEBUG 1 #endif #if !defined(_DEBUG) && (defined(_DBG) || defined(DBG) || defined(DEBUG)) #define _DEBUG 1 #endif #ifdef DEBUG enum { TRACE_ALWAYS = 0, TRACE_ERROR, TRACE_DEBUG, TRACE_DETAIL, TRACE_PAINT, TRACE_TEMP, }; #pragma warning (push) #pragma warning (disable : 4018) // sign/unsign mismatch in ostream line 312 #include #include #include #pragma warning (pop) #define STRSAFE_NO_CB_FUNCTIONS #include #define SIZEOF_CH(X) (sizeof(X)/sizeof(X[0])) inline Tstring hexdump(unsigned long ul) { TCHAR c[32]; _ltot(ul, c, 16); return Tstring(c); } #ifdef DUMP_TIME_STAMPS extern _int64 g_ulFreq, g_ulTimeStart; extern DumpPerfTime(); #else #define DumpPerfTime() #endif #define DUMP_TID #ifdef DUMP_TID inline Tstring DumpTid() { TCHAR c[32]; (void) StringCchPrintf(c, SIZEOF_CH(c), _T("T0x%8.8lX: "), ::GetCurrentThreadId()); return Tstring(c); } #else // DUMP_TID #define DumpTid() #endif // DUMP_TID extern DWORD dwTraceLevel; extern DWORD dwTraceIndent; extern tostream* tdbgout; #define dbgDump (*tdbgout) void DebugInit(LPCTSTR pszLogFile = NULL); void DebugTerm(void); inline tostream& DumpHdr(tostream& tout) { DumpPerfTime(); tout << DumpTid(); for (DWORD i = 0; i < dwTraceIndent; ++i) { tout << " "; } return tout; } template > class basic_oftstream : public basic_otstream<_E, _Tr> { public: typedef basic_oftstream<_E, _Tr> _Myt; typedef std::basic_filebuf<_E, _Tr> _Myfb; basic_oftstream() : basic_otstream<_E, _Tr>(&_Fb) {} explicit basic_oftstream(const char *_S, ios_base::openmode _M = out | trunc) : basic_otstream<_E, _Tr>(&_Fb) {if (_Fb.open(_S, _M | out) == 0) setstate(failbit); } virtual ~basic_oftstream() {} _Myfb *rdbuf() const {return ((_Myfb *)&_Fb); } bool is_open() const {return (_Fb.is_open()); } void open(const char *_S, ios_base::openmode _M = out | trunc) {if (_Fb.open(_S, _M | out) == 0) setstate(failbit); } void open(const char *_S, ios_base::open_mode _M) {open(_S, (openmode)_M); } void close() {if (_Fb.close() == 0) setstate(failbit); } private: _Myfb _Fb; }; #define TRACELM(level, msg) if (dwTraceLevel >= level) { DumpHdr(dbgDump) << msg << _T("\r\n"); dbgDump.flush(); }; #define TRACELS(level, stmt) if (dwTraceLevel >= level) { stmt; } #define TRACELSM(level, stmt, msg) if (dwTraceLevel >= level) {DumpHdr(dbgDump); stmt; dbgDump << msg << _T("\r\n"); dbgDump.flush(); } #define BEGIN_TRACEL(level) if (dwTraceLevel >= level) { #define TRACES(stmt) stmt; #define END_TRACEL } #define END_TRACELM(msg) {DumpHdr(dbgDump) << msg << _T("\r\n"); dbgDump.flush(); } } #ifdef _M_IX86 #define ASSERT(f) \ do { \ if (!(f)) { \ dbgDump << "ASSERT Failed (" #f ") at: " << __FILE__ << " " << __LINE__; dbgDump.flush(); \ _ASSERT(f);\ } \ } while (0) #else #define ASSERT(f) \ do { \ if (!(f)) { \ dbgDump << "ASSERT Failed (" #f ") at: " << __FILE__ << " " << __LINE__; dbgDump.flush(); \ _ASSERT(f);\ } \ } while (0) #endif // _M_IX86 inline void TRACEINDENT() { ++dwTraceIndent; } inline void TRACEOUTDENT() { ASSERT(dwTraceIndent != 0); --dwTraceIndent; } #else //debug #define TRACELM(level, msg) #define TRACELS(level, stmt) #define TRACELSM(level, stmt, msg) #define BEGIN_TRACEL(level) #define TRACES(stmt) #define END_TRACEL #define END_TRACELM(msg) #define ASSERT(x) #define TRACEINDENT() #define TRACEOUTDENT() #pragma warning (push) #pragma warning (disable : 4018) // sign/unsign mismatch in ostream line 312 #include #pragma warning (pop) #define STRSAFE_NO_CB_FUNCTIONS #include #define SIZEOF_CH(X) (sizeof(X)/sizeof(X[0])) #endif // DEBUG #endif // NO_VIDCTL_ASSERT_SUPPORT #endif // NO_VIDCTL_TRACE_SUPPORT #endif // TRACE_H