home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / directx / dsstream / debug.c next >
C/C++ Source or Header  |  1997-07-14  |  8KB  |  357 lines

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