162 lines
3.5 KiB
C
162 lines
3.5 KiB
C
|
#ifndef __DEBUG_H__
|
||
|
#define __DEBUG_H__
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
|
||
|
#ifndef _DEBUG
|
||
|
#define _DEBUG
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
|
||
|
/*
|
||
|
// Put in include files to insure that necessary files have been included
|
||
|
// to get all function prototypes and structure defined before use
|
||
|
*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
|
||
|
/*
|
||
|
// Need a macro to output messages to the debugger
|
||
|
*/
|
||
|
|
||
|
#define DEBUG_OUT(str) OutputDebugString(str)
|
||
|
|
||
|
/*
|
||
|
// Define our trapping related debugging stuff
|
||
|
// Define 4 levels of trap to allow us to break only in certain
|
||
|
// conditions
|
||
|
*/
|
||
|
|
||
|
#define TRAP_LEVEL_1 1
|
||
|
#define TRAP_LEVEL_2 2
|
||
|
#define TRAP_LEVEL_3 3
|
||
|
#define TRAP_LEVEL_4 4
|
||
|
|
||
|
#ifndef __DEBUG_C__
|
||
|
|
||
|
extern INT Debug_TrapLevel;
|
||
|
extern BOOL Debug_TrapOn;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#define TRAP_ON() Debug_TrapOn = TRUE
|
||
|
#define TRAP_OFF() Debug_TrapOn = FALSE
|
||
|
#define GET_TRAP_STATE() Debug_TrapOn
|
||
|
#define SET_TRAP_LEVEL(lvl) Debug_TrapLevel = lvl
|
||
|
|
||
|
/*
|
||
|
// Define the trap macro which will break only when the trap levels
|
||
|
// are matching and also displays an optional message
|
||
|
*/
|
||
|
|
||
|
#undef TRAP
|
||
|
#define TRAP(lvl, msg) \
|
||
|
{ \
|
||
|
if (Debug_TrapOn && ((lvl) >= Debug_TrapLevel)) { \
|
||
|
if (NULL != (msg)) \
|
||
|
DEBUG_OUT((msg)); \
|
||
|
\
|
||
|
DebugBreak(); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
// Define the ASSERT macro to test the string. Current it will trap
|
||
|
// whenever is on and the expression fails
|
||
|
*/
|
||
|
|
||
|
#undef ASSERT
|
||
|
#define ASSERT(exp) \
|
||
|
{ \
|
||
|
if ((!(exp))) { \
|
||
|
static CHAR TempStr[1024]; \
|
||
|
\
|
||
|
wsprintf(TempStr, \
|
||
|
"Assertion Failed: %s, file: %s, line %s", \
|
||
|
#exp, __FILE__, __LINE__); \
|
||
|
\
|
||
|
DEBUG_OUT(TempStr); \
|
||
|
TRAP(TRAP_LEVEL_1, NULL); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
// Memory allocation routines
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
// Function definitions
|
||
|
*/
|
||
|
|
||
|
HGLOBAL __cdecl
|
||
|
Debug_Alloc(
|
||
|
IN PCHAR FileName,
|
||
|
IN ULONG LineNumber,
|
||
|
IN DWORD AllocSize
|
||
|
);
|
||
|
|
||
|
HGLOBAL __cdecl
|
||
|
Debug_Realloc(
|
||
|
IN PCHAR FileName,
|
||
|
IN ULONG LineNumber,
|
||
|
IN PVOID MemoryBlock,
|
||
|
IN DWORD AllocSize
|
||
|
);
|
||
|
|
||
|
HGLOBAL __cdecl
|
||
|
Debug_Free(
|
||
|
IN PVOID Buffer
|
||
|
);
|
||
|
|
||
|
BOOL __cdecl
|
||
|
Debug_ValidateMemoryAlloc(
|
||
|
IN PVOID Header,
|
||
|
OUT PVOID AllocStatus
|
||
|
);
|
||
|
|
||
|
VOID __cdecl
|
||
|
Debug_CheckForMemoryLeaks();
|
||
|
|
||
|
/*
|
||
|
// Wrapper macros
|
||
|
*/
|
||
|
|
||
|
#define ALLOC(siz) Debug_Alloc(__FILE__, __LINE__, siz)
|
||
|
#define REALLOC(blk, siz) Debug_Realloc(__FILE__, __LINE__, blk, siz)
|
||
|
#define FREE(ptr) Debug_Free(ptr)
|
||
|
#define VALIDATEMEM(ptr) Debug_ValidateMemoryAlloc(ptr, NULL)
|
||
|
#define CHECKFORLEAKS() Debug_CheckForMemoryLeaks()
|
||
|
|
||
|
#else
|
||
|
|
||
|
/*
|
||
|
// Non-debug versions of the above routines
|
||
|
*/
|
||
|
|
||
|
#define DEBUG_OUT(str)
|
||
|
|
||
|
#define TRAP_ON()
|
||
|
#define TRAP_OFF()
|
||
|
#define GET_TRAP_STATE()
|
||
|
#define SET_TRAP_LEVEL(lvl)
|
||
|
|
||
|
#undef TRAP
|
||
|
#define TRAP(lvl, msg)
|
||
|
|
||
|
#undef ASSERT
|
||
|
#define ASSERT(exp)
|
||
|
|
||
|
|
||
|
#define ALLOC(siz) GlobalAlloc(GPTR, siz)
|
||
|
#define REALLOC(blk, siz) GlobalReAlloc(blk, siz, GMEM_ZEROINIT)
|
||
|
#define FREE(ptr) GlobalFree(ptr)
|
||
|
#define VALIDATEMEM(ptr) TRUE
|
||
|
#define CHECKFORLEAKS()
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|