DEBUG.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *
  3. *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. *  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
  5. *  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
  6. *  A PARTICULAR PURPOSE.
  7. *
  8. *  Copyright (C) 1993 - 1997 Microsoft Corporation. All Rights Reserved.
  9. *
  10. ******************************************************************************
  11. *
  12. * Debug.C
  13. *
  14. * Debug output routines
  15. *
  16. *****************************************************************************/
  17. #ifdef   DEBUG
  18. #include <windows.h>
  19. #include <mmsystem.h>  
  20. #include <stdarg.h>
  21. #include "global.h"
  22. #include "debug.h"
  23. PRIVATE VOID FAR CDECL DbgVPrintF(LPSTR szFmt, LPSTR va);
  24. /*
  25. **  Since we don't UNICODE our debugging messages, use the ASCII entry
  26. **  points regardless of how we are compiled.
  27. */
  28. #define wvsprintfA          wvsprintf
  29. #define GetProfileIntA      GetProfileInt
  30. #define OutputDebugStringA  OutputDebugStr
  31. #define lstrcatA            lstrcat
  32. #define lstrlenA            lstrlen
  33. BOOL                        __gfDbgEnabled  = TRUE;
  34. UINT                        __guDbgLevel    = 0;   
  35. WORD                        wDebugLevel     = 0;
  36. /*****************************************************************************
  37. *
  38. * WinAssert
  39. *
  40. * Cause a debug out on an assert; breaking to the debugger if installed.
  41. *
  42. * lpstrExp                  - Assert expression string
  43. * lpstrFile                 - File of assert
  44. * dwLine                    - Line number of assert
  45. *
  46. * Handle WM_CREATE message to main application window.
  47. *
  48. * HWND hWnd                 - Window handle
  49. * CREATESTRUCT FAR* lpCreateStruct
  50. *                           - Pointer to creation parameters for the window.
  51. *
  52. *****************************************************************************/
  53. VOID WINAPI WinAssert(
  54.     LPSTR                   lpstrExp,
  55.     LPSTR                   lpstrFile,
  56.     DWORD                   dwLine)
  57. {
  58.     static char szWork[256];
  59.     static char BCODE szFormat[] =
  60.         "!Assert: %s#%lu [%s]";
  61.     dprintf(0, (LPSTR)szFormat, (LPSTR)lpstrFile, dwLine, (LPSTR)lpstrExp);
  62. }
  63. /*****************************************************************************
  64. *
  65. * DbgVPrintF
  66. *
  67. * Format and print a debug output string
  68. *
  69. * szFmt                     - Format string
  70. * va                        - printf style argument list
  71. *
  72. * The following characters have special meanings when they are
  73. * the first in the string:
  74. *
  75. *   !   Causes a break into the debugger after the output has been printed
  76. *   `   Causes no module prefix to be printed
  77. *   ~   Causes no CR/LF pair to follow the string
  78. *
  79. *****************************************************************************/
  80. VOID FAR CDECL DbgVPrintF(
  81.     LPSTR                   szFmt, 
  82.     LPSTR                   va)
  83. {
  84.     char                    ach[DEBUG_MAX_LINE_LEN];
  85.     BOOL                    fDebugBreak = FALSE;
  86.     BOOL                    fPrefix     = TRUE;
  87.     BOOL                    fCRLF       = TRUE;
  88.     ach[0] = '';
  89.     for (;;)
  90.     {
  91.         switch(*szFmt)
  92.         {
  93.             case '!':
  94.                 fDebugBreak = TRUE;
  95.                 szFmt++;
  96.                 continue;
  97.             case '`':
  98.                 fPrefix = FALSE;
  99.                 szFmt++;
  100.                 continue;
  101.             case '~':
  102.                 fCRLF = FALSE;
  103.                 szFmt++;
  104.                 continue;
  105.         }
  106.         break;
  107.     }
  108.     if (fDebugBreak)
  109.     {
  110.         ach[0] = '07';
  111.         ach[1] = '';
  112.     }
  113.     if (fPrefix)
  114.         lstrcatA(ach, DEBUG_MODULE_NAME ": ");
  115.     wvsprintfA(ach + lstrlenA(ach), szFmt, (LPSTR)va);
  116.     if (fCRLF)
  117.         lstrcatA(ach, "rn");
  118.     OutputDebugStringA(ach);
  119.     if (fDebugBreak)
  120.         DebugBreak();
  121. }
  122. /*****************************************************************************
  123. *
  124. * dprintf
  125. *
  126. * User-level function to print a debug string
  127. *
  128. * uDbgLevel                 - Debug level of this message
  129. * szFmt                     - Format string for this message
  130. * ...                       - printf style arguments
  131. *
  132. * The message will be printed only if debugging is enabled and the messages's
  133. * debug level is less than or equal to the current debug level.
  134. *
  135. * This function is called by the DPF() macro in Debug.H.
  136. *
  137. *****************************************************************************/
  138. void FAR CDECL dprintf(
  139.     UINT                    uDbgLevel, 
  140.     LPSTR                   szFmt, 
  141.     ...)
  142. {
  143.     va_list                 va;
  144.     if (!__gfDbgEnabled || (__guDbgLevel < uDbgLevel))
  145.         return;
  146.     va_start(va, szFmt);
  147.     DbgVPrintF(szFmt, (LPSTR)va);
  148.     va_end(va);
  149. }
  150. /*****************************************************************************
  151. *
  152. * DbgEnable
  153. *
  154. * Enable or disable debug output
  155. *
  156. * fEnable                   - Enable or disable output
  157. *
  158. * Returns the old state.
  159. *
  160. *****************************************************************************/
  161. BOOL WINAPI DbgEnable(
  162.     BOOL                    fEnable)
  163. {
  164.     BOOL                    fOldState;
  165.     fOldState      = __gfDbgEnabled;
  166.     __gfDbgEnabled = fEnable;
  167.     return (fOldState);
  168. }
  169. /*****************************************************************************
  170. *
  171. * DbgSetLevel
  172. *
  173. * Set the current level for debug output
  174. *
  175. * uLevel                    - New level for debug output
  176. *
  177. * Returns the old level.
  178. *
  179. *****************************************************************************/
  180. UINT WINAPI DbgSetLevel(
  181.     UINT                    uLevel)
  182. {
  183.     UINT                    uOldLevel;
  184.     uOldLevel    = __guDbgLevel;
  185.     __guDbgLevel = wDebugLevel = uLevel;
  186.     return (uOldLevel);
  187. }
  188. /*****************************************************************************
  189. *
  190. * DbgInitialize
  191. *
  192. * Get debug output settings from WIN.INI for this module
  193. *
  194. * fEnable                   - Enable or disable debug output
  195. *
  196. * Returns the current debug level
  197. *
  198. * The debug level will be read from the [debug] section of WIN.INI,
  199. * from an entry with this module's name as #define'd in Debug.H.
  200. *
  201. * WIN.INI:
  202. *  [Debug]
  203. *  Module=3
  204. *
  205. *****************************************************************************/
  206. UINT WINAPI DbgInitialize(BOOL fEnable)
  207. {
  208.     DbgSetLevel(GetProfileIntA(DEBUG_SECTION, DEBUG_MODULE_NAME, 0));
  209.     DbgEnable(fEnable);
  210.     return (__guDbgLevel);
  211. #endif