200 lines
5.4 KiB
C++
200 lines
5.4 KiB
C++
// 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 <fstream>
|
|
#include <tstring.h>
|
|
#include <odsstream.h>
|
|
#pragma warning (pop)
|
|
|
|
#define STRSAFE_NO_CB_FUNCTIONS
|
|
#include <strsafe.h>
|
|
#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 _E, class _Tr = std::char_traits<_E> >
|
|
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 <fstream>
|
|
#pragma warning (pop)
|
|
#define STRSAFE_NO_CB_FUNCTIONS
|
|
#include <strsafe.h>
|
|
#define SIZEOF_CH(X) (sizeof(X)/sizeof(X[0]))
|
|
|
|
#endif // DEBUG
|
|
#endif // NO_VIDCTL_ASSERT_SUPPORT
|
|
#endif // NO_VIDCTL_TRACE_SUPPORT
|
|
|
|
#endif // TRACE_H
|