218 lines
5.5 KiB
C
218 lines
5.5 KiB
C
|
/*
|
||
|
* johnkn's debug logging and assert macros
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#if !defined _INC_MMDEBUG_
|
||
|
#define _INC_MMDEBUG_
|
||
|
//
|
||
|
// prototypes for debug functions.
|
||
|
//
|
||
|
#if !defined(_WIN32) && !defined(LPTSTR)
|
||
|
#define LPTSTR LPSTR
|
||
|
#endif
|
||
|
|
||
|
#define SQUAWKNUMZ(num) #num
|
||
|
#define SQUAWKNUM(num) SQUAWKNUMZ(num)
|
||
|
#define SQUAWK __FILE__ "(" SQUAWKNUM(__LINE__) ") ----"
|
||
|
#define DEBUGLINE __FILE__ "(" SQUAWKNUM(__LINE__) ") "
|
||
|
|
||
|
#if defined DEBUG || defined _DEBUG || defined DEBUG_RETAIL
|
||
|
|
||
|
int FAR _cdecl AuxDebugEx(int, LPSTR, ...);
|
||
|
VOID WINAPI AuxDebugDump (int, LPVOID, int);
|
||
|
int WINAPI DebugSetOutputLevel (int);
|
||
|
|
||
|
#if defined DEBUG_RETAIL
|
||
|
#define INLINE_BREAK
|
||
|
#else
|
||
|
#ifdef _X86_
|
||
|
#define INLINE_BREAK _asm {int 3}
|
||
|
#else
|
||
|
#define INLINE_BREAK DebugBreak()
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if 0
|
||
|
#undef assert
|
||
|
#define assert(exp) \
|
||
|
(void)((exp) ? 0 : AuxDebugEx(-2, DEBUGLINE "assert failed: " #exp "\r\n", (int)__LINE__))
|
||
|
|
||
|
#undef assert2
|
||
|
#define assert2(exp,sz) \
|
||
|
(void)((exp) ? 0 : AuxDebugEx(-2, DEBUGLINE "assert failed: " sz "\r\n", (int)__LINE__))
|
||
|
#else
|
||
|
#undef assert
|
||
|
#define assert(exp); {\
|
||
|
if (!(exp)) {\
|
||
|
AuxDebugEx(-2, DEBUGLINE "assert failed: " #exp "\r\n", (int)__LINE__); \
|
||
|
INLINE_BREAK;\
|
||
|
}\
|
||
|
}
|
||
|
#undef assert2
|
||
|
#define assert2(exp,sz); {\
|
||
|
if (!(exp)) {\
|
||
|
AuxDebugEx(-2, DEBUGLINE "assert failed: " sz "\r\n", (int)__LINE__); \
|
||
|
INLINE_BREAK;\
|
||
|
}\
|
||
|
}
|
||
|
#undef assert3
|
||
|
#define assert3(exp,sz,arg); {\
|
||
|
if (!(exp)) {\
|
||
|
AuxDebugEx(-2, DEBUGLINE "assert failed: " sz "\r\n", (int)__LINE__, (arg)); \
|
||
|
INLINE_BREAK;\
|
||
|
}\
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifndef STATICFN
|
||
|
#define STATICFN
|
||
|
#endif
|
||
|
|
||
|
#else // defined(DEBUG)
|
||
|
|
||
|
#define AuxDebugEx 1 ? (void)0 : (void)
|
||
|
#define AuxDebugDump(a,b,c)
|
||
|
|
||
|
#define assert(a) ((void)0)
|
||
|
#define assert2(a,b) ((void)0)
|
||
|
#define assert3(a,b,c) ((void)0)
|
||
|
|
||
|
#define INLINE_BREAK
|
||
|
#define DebugSetOutputLevel(i)
|
||
|
#ifndef STATICFN
|
||
|
#define STATICFN static
|
||
|
#endif
|
||
|
|
||
|
#endif // defined(DEBUG)
|
||
|
|
||
|
#define AuxDebug(sz) AuxDebugEx (1, DEBUGLINE sz "\r\n")
|
||
|
#define AuxDebug2(sz,a) AuxDebugEx (1, DEBUGLINE sz "\r\n", (a))
|
||
|
|
||
|
#endif //_INC_MMDEBUG_
|
||
|
|
||
|
// =============================================================================
|
||
|
|
||
|
//
|
||
|
// include this in only one module in a DLL or APP
|
||
|
//
|
||
|
#if defined DEBUG || defined _DEBUG || defined DEBUG_RETAIL
|
||
|
#if (defined _INC_MMDEBUG_CODE_) && (_INC_MMDEBUG_CODE_ != FALSE)
|
||
|
#undef _INC_MMDEBUG_CODE_
|
||
|
#define _INC_MMDEBUG_CODE_ FALSE
|
||
|
|
||
|
#include <stdarg.h>
|
||
|
|
||
|
#if !defined _WIN32 && !defined wvsprintfA
|
||
|
#define wvsprintfA wvsprintf
|
||
|
#endif
|
||
|
|
||
|
int debug_OutputOn = 0;
|
||
|
|
||
|
/*+ AuxDebug - create a formatted string and output to debug terminal
|
||
|
*
|
||
|
*-=================================================================*/
|
||
|
|
||
|
int FAR _cdecl AuxDebugEx (
|
||
|
int iLevel,
|
||
|
LPSTR lpFormat,
|
||
|
...)
|
||
|
{
|
||
|
#ifdef _WIN32
|
||
|
char szBuf[1024];
|
||
|
#else
|
||
|
static char szBuf[512];
|
||
|
#endif
|
||
|
int cb;
|
||
|
va_list va;
|
||
|
char FAR * psz;
|
||
|
|
||
|
if (debug_OutputOn >= iLevel)
|
||
|
{
|
||
|
va_start (va, lpFormat);
|
||
|
cb = wvsprintfA (szBuf, lpFormat, va);
|
||
|
va_end (va);
|
||
|
|
||
|
// eat leading ..\..\ which we get from __FILE__ since
|
||
|
// george's wierd generic makefile stuff.
|
||
|
//
|
||
|
psz = szBuf;
|
||
|
while (psz[0] == '.' && psz[1] == '.' && psz[2] == '\\')
|
||
|
psz += 3;
|
||
|
|
||
|
#ifdef MODULE_DEBUG_PREFIX
|
||
|
if (psz != szBuf)
|
||
|
OutputDebugStringA (MODULE_DEBUG_PREFIX);
|
||
|
#endif
|
||
|
|
||
|
OutputDebugStringA (psz);
|
||
|
}
|
||
|
|
||
|
return cb;
|
||
|
}
|
||
|
|
||
|
/*+ AuxDebugDump -
|
||
|
*
|
||
|
*-=================================================================*/
|
||
|
|
||
|
VOID WINAPI AuxDebugDump (
|
||
|
int iLevel,
|
||
|
LPVOID lpvData,
|
||
|
int nCount)
|
||
|
{
|
||
|
LPBYTE lpData = lpvData;
|
||
|
char szBuf[128];
|
||
|
LPSTR psz;
|
||
|
int cb;
|
||
|
int ix;
|
||
|
BYTE abRow[8];
|
||
|
|
||
|
if (debug_OutputOn <= iLevel || nCount <= 0)
|
||
|
return;
|
||
|
|
||
|
do {
|
||
|
cb = wsprintfA(szBuf, "\t%08X: ", lpData);
|
||
|
psz = szBuf + cb;
|
||
|
|
||
|
for (ix = 0; ix < 8; ++ix)
|
||
|
{
|
||
|
LPBYTE lpb = lpData;
|
||
|
|
||
|
abRow[ix] = '.';
|
||
|
if (IsBadReadPtr (lpData + ix, 1))
|
||
|
lstrcpyA (psz, ".. ");
|
||
|
else
|
||
|
{
|
||
|
wsprintfA (psz, "%02X ", lpData[ix]);
|
||
|
if (lpData[ix] >= 32 && lpData[ix] < 127)
|
||
|
abRow[ix] = lpData[ix];
|
||
|
}
|
||
|
psz += 3;
|
||
|
}
|
||
|
for (ix = 0; ix < 8; ++ix)
|
||
|
*psz++ = abRow[ix];
|
||
|
|
||
|
lstrcpyA (psz, "\r\n");
|
||
|
|
||
|
OutputDebugStringA (szBuf);
|
||
|
|
||
|
} while (lpData += 8, (nCount -= 8) > 0);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/*+ DebugSetOutputLevel
|
||
|
*
|
||
|
*-=================================================================*/
|
||
|
|
||
|
BOOL WINAPI DebugSetOutputLevel (
|
||
|
int nLevel)
|
||
|
{
|
||
|
int nOldLevel = debug_OutputOn;
|
||
|
debug_OutputOn = nLevel;
|
||
|
return nOldLevel;
|
||
|
}
|
||
|
|
||
|
#endif // _INC_MMDEBUG_CODE_
|
||
|
#endif // DEBUG || _DEBUG
|