#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 /* // 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