|
|
/* common.h
* * Common functions useful for Windows programs. * * InitializeDebugOutput(szAppName): * * Read debug level for this application (named <szAppName>) from * win.ini's [debug] section, which should look like this: * * [debug] * location=aux ; use OutputDebugString() to output * foobar=2 ; this app has debug level 2 * blorg=0 ; this app has debug output disabled * * If you want debug output to go to a file instead of to the AUX * device (or the debugger), use "location=>filename". To append to * the file instead of rewriting the file, use "location=>>filename". * * If DEBUG is not #define'd, then the call to InitializeDebugOutput() * generates no code, * * TerminateDebugOutput(): * * End debug output for this application. If DEBUG is not #define'd, * then the call to InitializeDebugOutput() generates no code. * * DPF((szFormat, args...)) * * If debugging output for this applicaton is enabled (see * InitializeDebugOutput()), print debug output specified by format * string <szFormat>, which may contain wsprintf()-style formatting * codes corresponding to arguments <args>. Example: * * DPF(("in WriteFile(): szFile='%s', dwFlags=0x%08lx\n", * (LSPTR) szFile, dwFlags)); * * DPF2((szFormat, args...)) * DPF3((szFormat, args...)) * DPF4((szFormat, args...)) * * Like DPF, but only output the debug string if the debug level for * this application is at least 2, 3, or 4, respectively. * * Assert(fExpr) * * If DEBUG is #define'd, then generate an "assertion failed" message box * allowing the user to abort the program, enter the debugger (the "Retry" * button), or ignore the error. If DEBUG is not #define'd then Assert() * generates no code. * * AssertEval(fExpr) * * Like Assert(), but evaluate and return <fExpr>, even if DEBUG * is not #define'd. (Use if you want the BOOL expression to be * evaluated even in a retail build.) */
#ifdef DEBUG
/* Assert() macros */ #undef Assert
#undef AssertSz
#undef AssertEval
#define AssertSz(x,sz) ((x) ? (void)0 : (void)_Assert(sz, __FILE__, __LINE__))
#define Assert(expr) AssertSz(expr, #expr)
#define AssertEval(expr) Assert(expr)
/* debug printf macros */ #define DPF( _x_ ) if (giDebugLevel >= 1) _DebugPrintf _x_
#define DPF0( _x_ ) _DebugPrintf _x_
#define DPF1( _x_ ) if (giDebugLevel >= 1) _DebugPrintf _x_
#define DPF2( _x_ ) if (giDebugLevel >= 2) _DebugPrintf _x_
#define DPF3( _x_ ) if (giDebugLevel >= 3) _DebugPrintf _x_
#define DPF4( _x_ ) if (giDebugLevel >= 4) _DebugPrintf _x_
#define DOUT( _x_ ) if (giDebugLevel >= 1) {static char _based(_segname("_CODE")) smag[] = _x_; _DebugPrintf(smag); }
#define DOUT0( _x_ ) {static char _based(_segname("_CODE")) smag[] = _x_; _DebugPrintf(smag); }
#define DOUT1( _x_ ) if (giDebugLevel >= 1) {static char _based(_segname("_CODE")) smag[] = _x_; _DebugPrintf(smag); }
#define DOUT2( _x_ ) if (giDebugLevel >= 2) {static char _based(_segname("_CODE")) smag[] = _x_; _DebugPrintf(smag); }
#define DOUT3( _x_ ) if (giDebugLevel >= 3) {static char _based(_segname("_CODE")) smag[] = _x_; _DebugPrintf(smag); }
#define DOUT4( _x_ ) if (giDebugLevel >= 4) {static char _based(_segname("_CODE")) smag[] = _x_; _DebugPrintf(smag); }
/* prototypes */ void FAR PASCAL InitializeDebugOutput(LPSTR szAppName); void FAR PASCAL TerminateDebugOutput(void); void FAR PASCAL _Assert(char *szExp, char *szFile, int iLine); void FAR CDECL _DebugPrintf(LPSTR szFormat, ...); extern int giDebugLevel; // current debug level
#else
/* Assert() macros */ #define AssertSz(expr,x) ((void)0)
#define Assert(expr) ((void)0)
#define AssertEval(expr) (expr)
/* debug printf macros */ #define DPF( x )
#define DPF0( x )
#define DPF1( x )
#define DPF2( x )
#define DPF3( x )
#define DPF4( x )
#define DOUT( x )
#define DOUT0( x )
#define DOUT1( x )
#define DOUT2( x )
#define DOUT3( x )
#define DOUT4( x )
/* stubs for debugging function prototypes */ #define InitializeDebugOutput(szAppName) 0
#define TerminateDebugOutput() 0
#endif
/* flags for _llseek() */ #ifndef SEEK_SET
#define SEEK_SET 0 // seek relative to start of file
#define SEEK_CUR 1 // seek relative to current position
#define SEEK_END 2 // seek relative to end of file
#endif
|