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

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: debug.c
  6.  *  Content: debug code
  7.  *
  8.  ***************************************************************************/
  9. #ifdef DEBUG
  10. #include <windows.h>
  11. #include <windowsx.h>
  12. #include <stdarg.h>
  13. #include "debug.h"
  14. //
  15. //  since we don't UNICODE our debugging messages, use the ASCII entry
  16. //  points regardless of how we are compiled.
  17. //
  18. #ifdef _WIN32
  19.     #include <wchar.h>
  20. #else
  21.     #define lstrcatA            lstrcat
  22.     #define lstrlenA            lstrlen
  23.     #define GetProfileIntA      GetProfileInt
  24.     #define OutputDebugStringA  OutputDebugString
  25.     #define wsprintfA           wsprintf
  26.     #define MessageBoxA         MessageBox
  27. #endif
  28. //
  29. //
  30. //
  31. BOOL    __gfDbgEnabled          = TRUE;         // master enable
  32. UINT    __guDbgLevel            = 0;            // current debug level
  33. //--------------------------------------------------------------------------;
  34. //  
  35. //  void DbgVPrintF
  36. //  
  37. //  Description:
  38. //  
  39. //  
  40. //  Arguments:
  41. //      LPSTR szFormat:
  42. //  
  43. //      va_list va:
  44. //  
  45. //  Return (void):
  46. //      No value is returned.
  47. //  
  48. //--------------------------------------------------------------------------;
  49. void FAR CDECL DbgVPrintF
  50. (
  51.     LPSTR                   szFormat,
  52.     va_list                 va
  53. )
  54. {
  55.     char                ach[DEBUG_MAX_LINE_LEN];
  56.     BOOL                fDebugBreak = FALSE;
  57.     BOOL                fPrefix     = TRUE;
  58.     BOOL                fCRLF       = TRUE;
  59.     ach[0] = '';
  60.     for (;;)
  61.     {
  62.         switch (*szFormat)
  63.         {
  64.             case '!':
  65.                 fDebugBreak = TRUE;
  66.                 szFormat++;
  67.                 continue;
  68.             case '`':
  69.                 fPrefix = FALSE;
  70.                 szFormat++;
  71.                 continue;
  72.             case '~':
  73.                 fCRLF = FALSE;
  74.                 szFormat++;
  75.                 continue;
  76.         }
  77.         break;
  78.     }
  79.     if (fDebugBreak)
  80.     {
  81.         ach[0] = '07';
  82.         ach[1] = '';
  83.     }
  84.     if (fPrefix)
  85.     {
  86.         lstrcatA(ach, DEBUG_MODULE_NAME ": ");
  87.     }
  88. #ifdef _WIN32
  89.     wvsprintfA(ach + lstrlenA(ach), szFormat, va);
  90. #else
  91.     wvsprintf(ach + lstrlenA(ach), szFormat, (LPSTR)va);
  92. #endif
  93.     if (fCRLF)
  94.     {
  95.         lstrcatA(ach, "rn");
  96.     }
  97.     OutputDebugStringA(ach);
  98.     if (fDebugBreak)
  99.     {
  100.         DebugBreak();
  101.     }
  102. } // DbgVPrintF()
  103. //--------------------------------------------------------------------------;
  104. //  
  105. //  void dprintf
  106. //  
  107. //  Description:
  108. //      dprintf() is called by the DPF() macro if DEBUG is defined at compile
  109. //      time. It is recommended that you only use the DPF() macro to call
  110. //      this function--so you don't have to put #ifdef DEBUG around all
  111. //      of your code.
  112. //      
  113. //  Arguments:
  114. //      UINT uDbgLevel:
  115. //  
  116. //      LPSTR szFormat:
  117. //  
  118. //  Return (void):
  119. //      No value is returned.
  120. //
  121. //--------------------------------------------------------------------------;
  122. void FAR CDECL dprintf
  123. (
  124.     UINT                    uDbgLevel,
  125.     LPSTR                   szFormat,
  126.     ...
  127. )
  128. {
  129.     va_list va;
  130.     if (!__gfDbgEnabled || (__guDbgLevel < uDbgLevel))
  131.         return;
  132.     va_start(va, szFormat);
  133.     DbgVPrintF(szFormat, va);
  134.     va_end(va);
  135. } // dprintf()
  136. //--------------------------------------------------------------------------;
  137. //  
  138. //  BOOL DbgEnable
  139. //  
  140. //  Description:
  141. //  
  142. //  
  143. //  Arguments:
  144. //      BOOL fEnable:
  145. //  
  146. //  Return (BOOL):
  147. //      Returns the previous debugging state.
  148. //  
  149. //--------------------------------------------------------------------------;
  150. BOOL WINAPI DbgEnable
  151. (
  152.     BOOL                    fEnable
  153. )
  154. {
  155.     BOOL                fOldState;
  156.     fOldState      = __gfDbgEnabled;
  157.     __gfDbgEnabled = fEnable;
  158.     return (fOldState);
  159. } // DbgEnable()
  160. //--------------------------------------------------------------------------;
  161. //  
  162. //  UINT DbgSetLevel
  163. //  
  164. //  Description:
  165. //  
  166. //  
  167. //  Arguments:
  168. //      UINT uLevel:
  169. //  
  170. //  Return (UINT):
  171. //      Returns the previous debugging level.
  172. //  
  173. //--------------------------------------------------------------------------;
  174. UINT WINAPI DbgSetLevel
  175. (
  176.     UINT                    uLevel
  177. )
  178. {
  179.     UINT                uOldLevel;
  180.     uOldLevel    = __guDbgLevel;
  181.     __guDbgLevel = uLevel;
  182.     return (uOldLevel);
  183. } // DbgSetLevel()
  184. //--------------------------------------------------------------------------;
  185. //  
  186. //  UINT DbgGetLevel
  187. //  
  188. //  Description:
  189. //  
  190. //  
  191. //  Arguments:
  192. //      None.
  193. //  
  194. //  Return (UINT):
  195. //      Returns the current debugging level.
  196. //  
  197. //--------------------------------------------------------------------------;
  198. UINT WINAPI DbgGetLevel
  199. (
  200.     void
  201. )
  202. {
  203.     return (__guDbgLevel);
  204. } // DbgGetLevel()
  205. //--------------------------------------------------------------------------;
  206. //  
  207. //  UINT DbgInitialize
  208. //  
  209. //  Description:
  210. //  
  211. //  
  212. //  Arguments:
  213. //      BOOL fEnable:
  214. //  
  215. //  Return (UINT):
  216. //      Returns the debugging level that was set.
  217. //  
  218. //--------------------------------------------------------------------------;
  219. UINT WINAPI DbgInitialize
  220. (
  221.     BOOL                    fEnable
  222. )
  223. {
  224.     UINT                uLevel;
  225.     uLevel = GetProfileIntA(DEBUG_SECTION, DEBUG_MODULE_NAME, (UINT)-1);
  226.     if ((UINT)-1 == uLevel)
  227.     {
  228.         //
  229.         //  if the debug key is not present, then force debug output to
  230.         //  be disabled. this way running a debug version of a component
  231.         //  on a non-debugging machine will not generate output unless
  232.         //  the debug key exists.
  233.         //
  234.         uLevel  = 0;
  235.         fEnable = FALSE;
  236.     }
  237.     DbgSetLevel(uLevel);
  238.     DbgEnable(fEnable);
  239.     return (__guDbgLevel);
  240. } // DbgInitialize()
  241. //--------------------------------------------------------------------------;
  242. //  
  243. //  void _Assert
  244. //  
  245. //  Description:
  246. //      This routine is called if the ASSERT macro (defined in debug.h)
  247. //      tests and expression that evaluates to FALSE.  This routine 
  248. //      displays an "assertion failed" message box allowing the user to
  249. //      abort the program, enter the debugger (the "retry" button), or
  250. //      ignore the assertion and continue executing.  The message box
  251. //      displays the file name and line number of the _Assert() call.
  252. //  
  253. //  Arguments:
  254. //      char *  szFile: Filename where assertion occurred.
  255. //      int     iLine:  Line number of assertion.
  256. //  
  257. //--------------------------------------------------------------------------;
  258. #ifndef _WIN32
  259. #pragma warning(disable:4704)
  260. #endif
  261. void WINAPI _Assert
  262. (
  263.     char *  szFile,
  264.     int     iLine
  265. )
  266. {
  267.     static char     ach[300];       // debug output (avoid stack overflow)
  268.     int             id;
  269. #ifndef _WIN32
  270.     int             iExitCode;
  271. #endif
  272.     wsprintfA(ach, "Assertion failed in file %s, line %d.  [Press RETRY to debug.]", (LPSTR)szFile, iLine);
  273.     id = MessageBoxA(NULL, ach, "Assertion Failed",
  274.             MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE );
  275. switch (id)
  276. {
  277. case IDABORT:               // Kill the application.
  278. #ifndef _WIN32
  279.         iExitCode = 0;
  280.         _asm
  281.         {
  282.         mov ah, 4Ch
  283.         mov al, BYTE PTR iExitCode
  284.         int     21h
  285.         }
  286. #else
  287.         FatalAppExit(0, TEXT("Good Bye"));
  288. #endif // WIN16
  289. break;
  290. case IDRETRY:               // Break into the debugger.
  291. DebugBreak();
  292. break;
  293. case IDIGNORE:              // Ignore assertion, continue executing.
  294. break;
  295. }
  296. } // _Assert
  297. #ifndef _WIN32
  298. #pragma warning(default:4704)
  299. #endif
  300. #endif // #ifdef DEBUG