//==========================================================================; // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1992, 1994 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------; // // debug.c // // Description: // This file contains code yanked from several places to provide debug // support that works in win 16 and win 32. // // //==========================================================================; #include // to translate DBG -> DEBUG for NT builds #ifdef DEBUG #include #include #include #define _INC_DEBUG_CODE #include "debug.h" // // since we don't UNICODE our debugging messages, use the ASCII entry // points regardless of how we are compiled. // #ifdef _WIN32 #include #else #define lstrcpyA lstrcpy #define lstrcatA lstrcat #define lstrlenA lstrlen #define GetProfileIntA GetProfileInt #define OutputDebugStringA OutputDebugString #define wsprintfA wsprintf #define MessageBoxA MessageBox #endif // // // #define cDbgSpecs (sizeof(aszDbgSpecs) / sizeof(aszDbgSpecs[0])) BOOL __gfDbgEnabled[cDbgSpecs]; // master enable UINT __guDbgLevel[cDbgSpecs]; // current debug level //--------------------------------------------------------------------------; // // void DbgVPrintF // // Description: // // // Arguments: // LPSTR szFormat: // // va_list va: // // Return (void): // No value is returned. // //--------------------------------------------------------------------------; void FAR CDECL DbgVPrintF ( LPSTR szFormat, va_list va ) { char ach[DEBUG_MAX_LINE_LEN]; BOOL fDebugBreak = FALSE; BOOL fPrefix = TRUE; BOOL fCRLF = TRUE; ach[0] = '\0'; for (;;) { switch (*szFormat) { case '!': fDebugBreak = TRUE; szFormat++; continue; case '`': fPrefix = FALSE; szFormat++; continue; case '~': fCRLF = FALSE; szFormat++; continue; } break; } if (fDebugBreak) { ach[0] = '\007'; ach[1] = '\0'; } if (fPrefix) { lstrcatA(ach, DEBUG_MODULE_NAME ": "); } #ifdef _WIN32 wvsprintfA(ach + lstrlenA(ach), szFormat, va); #else wvsprintf(ach + lstrlenA(ach), szFormat, (LPSTR)va); #endif if (fCRLF) { lstrcatA(ach, "\r\n"); } OutputDebugStringA(ach); if (fDebugBreak) { DebugBreak(); } } // DbgVPrintF() //--------------------------------------------------------------------------; // // void dprintfS // // Description: // dprintfS() is called by the DPFS() macro if DEBUG is defined at compile // time. It is recommended that you only use the DPFS() macro to call // this function--so you don't have to put #ifdef DEBUG around all // of your code. // // Arguments: // UINT uDbgSpec: // // UINT uDbgLevel: // // LPSTR szFormat: // // Return (void): // No value is returned. // //--------------------------------------------------------------------------; void FAR CDECL dprintfS ( UINT uDbgSpec, UINT uDbgLevel, LPSTR szFormat, ... ) { va_list va; if (!__gfDbgEnabled[uDbgSpec] || (__guDbgLevel[uDbgSpec] < uDbgLevel)) return; va_start(va, szFormat); DbgVPrintF(szFormat, va); va_end(va); } // dprintf() //--------------------------------------------------------------------------; // // void dprintf // // Description: // dprintf() is called by the DPF() macro if DEBUG is defined at compile // time. It is recommended that you only use the DPF() macro to call // this function--so you don't have to put #ifdef DEBUG around all // of your code. // // Arguments: // UINT uDbgLevel: // // LPSTR szFormat: // // Return (void): // No value is returned. // //--------------------------------------------------------------------------; void FAR CDECL dprintf ( UINT uDbgLevel, LPSTR szFormat, ... ) { va_list va; if (!__gfDbgEnabled[dbgNone] || (__guDbgLevel[dbgNone] < uDbgLevel)) return; va_start(va, szFormat); DbgVPrintF(szFormat, va); va_end(va); } // dprintf() //--------------------------------------------------------------------------; // // BOOL DbgEnable // // Description: // // // Arguments: // BOOL fEnable: // // Return (BOOL): // Returns the previous debugging state. // //--------------------------------------------------------------------------; BOOL WINAPI DbgEnable ( UINT uDbgSpec, BOOL fEnable ) { BOOL fOldState; fOldState = __gfDbgEnabled[uDbgSpec]; __gfDbgEnabled[uDbgSpec] = fEnable; return (fOldState); } // DbgEnable() //--------------------------------------------------------------------------; // // UINT DbgSetLevel // // Description: // // // Arguments: // UINT uLevel: // // Return (UINT): // Returns the previous debugging level. // //--------------------------------------------------------------------------; UINT WINAPI DbgSetLevel ( UINT uDbgSpec, UINT uLevel ) { UINT uOldLevel; uOldLevel = __guDbgLevel[uDbgSpec]; __guDbgLevel[uDbgSpec] = uLevel; return (uOldLevel); } // DbgSetLevel() //--------------------------------------------------------------------------; // // UINT DbgGetLevel // // Description: // // // Arguments: // None. // // Return (UINT): // Returns the current debugging level. // //--------------------------------------------------------------------------; UINT WINAPI DbgGetLevel ( UINT uDbgSpec ) { return (__guDbgLevel[uDbgSpec]); } // DbgGetLevel() //--------------------------------------------------------------------------; // // UINT DbgInitializeSpec // // Description: // // // Arguments: // BOOL fEnable: // // Return (UINT): // Returns the debugging level that was set. // //--------------------------------------------------------------------------; UINT WINAPI DbgInitializeSpec ( UINT uDbgSpec, BOOL fEnable ) { UINT uLevel; char szKey[DEBUG_MAX_LINE_LEN]; lstrcpyA(szKey, DEBUG_MODULE_NAME); lstrcatA(szKey, aszDbgSpecs[uDbgSpec]); uLevel = GetProfileIntA(DEBUG_SECTION, szKey, (UINT)-1); if ((UINT)-1 == uLevel) { // // if the debug key is not present, then force debug output to // be disabled. this way running a debug version of a component // on a non-debugging machine will not generate output unless // the debug key exists. // uLevel = 0; fEnable = FALSE; } DbgSetLevel(uDbgSpec, uLevel); DbgEnable(uDbgSpec, fEnable); return (__guDbgLevel[uDbgSpec]); } // DbgInitialize() //--------------------------------------------------------------------------; // // VOID DbgInitialize // // Description: // // // Arguments: // BOOL fEnable: // // Return (UINT): // Returns the debugging level that was set. // //--------------------------------------------------------------------------; VOID WINAPI DbgInitialize ( BOOL fEnable ) { UINT i; for (i=0; i