|
|
/****************************Module*Header******************************\
* Module Name: DEBUG.H * * Module Descripton: Debugging macros for ICM project * * Warnings: * * Issues: * * Created: 8 January 1996 * Author: Srinivasan Chandraekar [srinivac] * * Copyright (c) 1996, 1997 Microsoft Corporation \***********************************************************************/
#ifndef _DEBUG_H_
#define _DEBUG_H_
#if DBG
//
// These are used for debugging purposes, and do not generate code in the
// retail version of the driver.
//
// A global variable (again present only in the debug build) maintains the
// current debug level in the low order WORD. The high order WORD is treated
// as a bitfield and is used to give more flexibility to debugging.
//
PSTR StripDirPrefixA(PSTR); VOID MyDebugPrintW(PWSTR, ...); VOID MyDebugPrintA(PSTR, ...);
#ifdef UNICODE
#define MyDebugPrint MyDebugPrintW
#else
#define MyDebugPrint MyDebugPrintA
#endif
#define DBGPRINT MyDebugPrint
#define DBGPRINTA MyDebugPrintA
#define DBGBREAK() DebugBreak()
//
// List of debug levels for low WORD of gdwDebugControl
//
#define DBG_LEVEL_VERBOSE 0x00000001
#define DBG_LEVEL_TERSE 0x00000002
#define DBG_LEVEL_WARNING 0x00000003
#define DBG_LEVEL_ERROR 0x00000004
#define DBG_LEVEL_FATAL 0x00000005
//
// Bits used in the high WORD of gdwDebugControl
//
#define FLAG_TRACEAPI 0x00010000 // Trace API entries
#define CHECK_DBG_LEVEL(level) ((level) >= gdwDebugControl)
#define TRACEAPI(funcname) \
{ \ if (gdwDebugControl & FLAG_TRACEAPI) \ { \ DBGPRINTA("ICM: Entering function "); \ DBGPRINT funcname; \ } \ }
#define DBGMSG(level, mesg) \
{ \ if (CHECK_DBG_LEVEL(level)) \ { \ DBGPRINTA("ICM: %s (%d): ", \ StripDirPrefixA(__FILE__), __LINE__); \ DBGPRINT mesg; \ } \ }
//
// These are the main macros that you'll be using in your code.
// For giving additional parameters enclose the parameters in
// paranthesis as shown in the example below.
//
// WARNING((__TEXT("Out of memory")));
// ERR((__TEXT("Incorrect return value: %d"), rc)); // Note extra brackets
//
#define VERBOSE(mesg) DBGMSG(DBG_LEVEL_VERBOSE, mesg)
#define TERSE(mesg) DBGMSG(DBG_LEVEL_TERSE, mesg)
#define WARNING(mesg) DBGMSG(DBG_LEVEL_WARNING, mesg)
#define ERR(mesg) DBGMSG(DBG_LEVEL_ERROR, mesg)
#define FATAL(mesg) DBGMSG(DBG_LEVEL_FATAL, mesg)
//
// These macros are for Asserting and work independently of the
// debugging variable.
//
#define ASSERT(expr) \
{ \ if (! (expr)) { \ DBGPRINTA("ICM: Assertion failed: %s (%d)\n", \ StripDirPrefixA(__FILE__), __LINE__); \ DBGBREAK(); \ } \ }
//
// For giving additional parameters, enclose the message and the other
// parameters in extra paranthesis as shown below.
//
// ASSERTMSG(x>0, "x less than 0");
// ASSERTMSG(x>0, ("x less than 0: x=%d", x));
//
#define ASSERTMSG(expr, mesg) \
{ \ if (! (expr)) { \ DBGPRINTA("ICM: Assertion failed: %s (%d)\n", \ StripDirPrefixA(__FILE__), __LINE__); \ DBGPRINT mesg; \ DBGPRINTA("\n"); \ DBGBREAK(); \ } \ }
#define RIP(mesg) \
{ \ DBGPRINTA("ICM: "); \ DBGPRINT mesg; \ DBGBREAK(); \ }
#else // !DBG
#define TRACEAPI(mesg)
#define DBGMSG(level, mesg)
#define VERBOSE(mesg)
#define TERSE(mesg)
#define WARNING(mesg)
#define ERR(mesg)
#define FATAL(mesg)
#define ASSERT(expr)
#define ASSERTMSG(expr, mesg)
#define RIP(mesg)
#endif // !DBG
#endif // ifndef _DEBUG_H_
|