e9a4e4b36b
Files correlati : Ricompilazione Demo : [ ] Commento :correzioni dovute al passaggio al nuovo compilatore git-svn-id: svn://10.65.10.50/trunk@14698 c028cbd2-c16b-5b4b-a496-9718f37d4682
123 lines
3.1 KiB
C++
Executable File
123 lines
3.1 KiB
C++
Executable File
// XTrace.h Version 1.1
|
|
//
|
|
// Author: Paul Mclachlan
|
|
//
|
|
// Modified by: Hans Dietrich
|
|
// hdietrich2@hotmail.com
|
|
//
|
|
// Version 1.1: added Unicode support
|
|
// added optional thread id to output string
|
|
// added option to enable/disable full path
|
|
// added TRACERECT macro
|
|
// changed name to avoid conflicts with Paul's class.
|
|
//
|
|
// This code was taken from article by Paul Mclachlan, "Getting around
|
|
// the need for a vararg #define just to automatically use __FILE__ and
|
|
// __LINE__ in a TRACE macro". For original article, see
|
|
// http://www.codeproject.com/useritems/location_trace.asp
|
|
//
|
|
// XTrace.h is a drop-in replacement for MFC's TRACE facility. It has no
|
|
// dependency on MFC. It is thread-safe and uses no globals or statics.
|
|
//
|
|
// It optionally adds source module/line number and thread id to each line
|
|
// of TRACE output. To control these features, use the following defines:
|
|
//
|
|
// XTRACE_SHOW_FULLPATH
|
|
// XTRACE_SHOW_THREAD_ID
|
|
//
|
|
// XTrace.h also provides the TRACERECT macro, which outputs the contents
|
|
// of a RECT struct. In Release builds, no output will be produced.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef XTRACE_H
|
|
#define XTRACE_H
|
|
|
|
#ifdef WIN32
|
|
#define _CRT_SECURE_NO_DEPRECATE 1
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable : 4127) // conditional expression is constant
|
|
|
|
#define XTRACE_SHOW_FULLPATH FALSE // FALSE = only show base name of file
|
|
#define XTRACE_SHOW_THREAD_ID TRUE // TRUE = include thread id in output
|
|
|
|
class xtracing_output_debug_string
|
|
{
|
|
public:
|
|
xtracing_output_debug_string(LPCTSTR lpszFile, int line) :
|
|
m_file(lpszFile),
|
|
m_line(line)
|
|
{
|
|
}
|
|
|
|
void operator() (LPCTSTR lpszFormat, ...)
|
|
{
|
|
va_list va;
|
|
va_start(va, lpszFormat);
|
|
|
|
TCHAR buf1[BUFFER_SIZE];
|
|
TCHAR buf2[BUFFER_SIZE];
|
|
|
|
// add the __FILE__ and __LINE__ to the front
|
|
LPCTSTR cp = (LPCTSTR) m_file;
|
|
|
|
if (!XTRACE_SHOW_FULLPATH)
|
|
{
|
|
cp = _tcsrchr(m_file, _T('\\'));
|
|
if (cp)
|
|
cp++;
|
|
}
|
|
|
|
if (XTRACE_SHOW_THREAD_ID)
|
|
{
|
|
if (_sntprintf(buf1, BUFFER_SIZE-1, _T("%s(%d) : [%X] %s"),
|
|
cp, m_line, GetCurrentThreadId(), lpszFormat) < 0)
|
|
buf1[BUFFER_SIZE-1] = _T('\0');
|
|
}
|
|
else
|
|
{
|
|
if (_sntprintf(buf1, BUFFER_SIZE-1, _T("%s(%d) : %s"),
|
|
cp, m_line, lpszFormat) < 0)
|
|
buf1[BUFFER_SIZE-1] = _T('\0');
|
|
}
|
|
|
|
// format the message as requested
|
|
if (_vsntprintf(buf2, BUFFER_SIZE-1, buf1, va) < 0)
|
|
buf2[BUFFER_SIZE-1] = _T('\0');
|
|
|
|
va_end(va);
|
|
|
|
// write it out
|
|
OutputDebugString(buf2);
|
|
}
|
|
|
|
private:
|
|
LPCTSTR m_file;
|
|
int m_line;
|
|
enum { BUFFER_SIZE = 4096 };
|
|
};
|
|
|
|
#undef TRACE
|
|
|
|
#ifdef _DEBUG
|
|
#define TRACE (xtracing_output_debug_string(_T(__FILE__), __LINE__ ))
|
|
#define TRACEERROR (xtracing_output_debug_string(_T(__FILE__), __LINE__ ))
|
|
#else
|
|
#define TRACE ((void)0)
|
|
#define TRACEERROR ((void)0)
|
|
#endif
|
|
|
|
#define TRACERECT(r) TRACE(_T(#r) _T(": left = %d top = %d right = %d bottom = %d\n"), \
|
|
(r).left, (r).top, (r).right, (r).bottom)
|
|
|
|
#pragma warning(pop)
|
|
|
|
#endif //XTRACE_H
|