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

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples.
  3. *       Copyright (C) 1992-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. //+---------------------------------------------------------------------------
  11. //
  12. //  File:       debug.c
  13. //
  14. //  Contents:   Debugging support functions
  15. //
  16. //  Classes:
  17. //
  18. //  Functions:
  19. //
  20. //  Note:       This file is not compiled for retail builds
  21. //
  22. //----------------------------------------------------------------------------
  23. #include "pop3srvp.h"
  24. #pragma hdrstop
  25. #if DBG         // NOTE:  This file not compiled for retail builds
  26. FILE *  LogFile;
  27. DWORD   PopInfoLevel = 15;
  28. // Debugging support functions.
  29. char * DebLevel[] = {   "Pop3Srv-Error",
  30.                         "Pop3Srv-Warn",
  31.                         "Pop3Srv-Trace",
  32.                         "Pop3Srv-Trace-Protocol"
  33.                     };
  34. typedef struct _DebugKeys {
  35.     char *  Name;
  36.     DWORD   Value;
  37. } DebugKeys, *PDebugKeys;
  38. DebugKeys   DebugKeyNames[] = {
  39.                 {"Error",       DEB_ERROR},
  40.                 {"Warning",     DEB_WARN},
  41.                 {"Trace",       DEB_TRACE},
  42.                 {"Pool",        DEB_TRACE_PROT},
  43.                 };
  44. #define NUM_DEBUG_KEYS  sizeof(DebugKeyNames) / sizeof(DebugKeys)
  45. #define NUM_BREAK_KEYS  sizeof(BreakKeyNames) / sizeof(DebugKeys)
  46. //+---------------------------------------------------------------------------
  47. //
  48. //  Function:   LogEvent
  49. //
  50. //  Synopsis:   Logs an event to the console and, optionally, a file.
  51. //
  52. //  Effects:
  53. //
  54. //  Arguments:  [Mask]   --
  55. //              [Format] --
  56. //              [Format] --
  57. //
  58. //  Requires:
  59. //
  60. //  Returns:
  61. //
  62. //  Signals:
  63. //
  64. //  Modifies:
  65. //
  66. //  Algorithm:
  67. //
  68. //  History:    4-29-93   RichardW   Created
  69. //
  70. //  Notes:
  71. //
  72. //----------------------------------------------------------------------------
  73. void
  74. LogEvent(   long            Mask,
  75.             const char *    Format,
  76.             ...)
  77. {
  78.     va_list ArgList;
  79.     int     Level = 0;
  80.     int     PrefixSize = 0;
  81.     char    szOutString[256];
  82.     long    OriWinlogonlMask = Mask;
  83.     if (Mask & PopInfoLevel)
  84.     {
  85.         while (!(Mask & 1))
  86.         {
  87.             Level++;
  88.             Mask >>= 1;
  89.         }
  90.         if (Level >= (sizeof(DebLevel) / sizeof(char *)) )
  91.         {
  92.             Level = (sizeof(DebLevel) / sizeof(char *)) - 1;
  93.         }
  94.         //
  95.         // Make the prefix first:  "Process.Thread> Pop3Svr-XXX"
  96.         //
  97.         PrefixSize = sprintf(szOutString, "%d.%d> %s: ",
  98.                 GetCurrentProcessId(), GetCurrentThreadId(), DebLevel[Level]);
  99.         va_start(ArgList, Format);
  100.         if (_vsnprintf(&szOutString[PrefixSize], sizeof(szOutString) - PrefixSize,
  101.                             Format, ArgList) < 0)
  102.         {
  103.             //
  104.             // Less than zero indicates that the string could not be
  105.             // fitted into the buffer.  Output a special message indicating
  106.             // that:
  107.             //
  108.             OutputDebugStringA("Pop3Svr!LogEvent:  Could not pack string into 256 bytesn");
  109.         }
  110.         else
  111.         {
  112.             OutputDebugStringA(szOutString);
  113.         }
  114.         if (LogFile)
  115.         {
  116.             SYSTEMTIME  stTime;
  117.             GetLocalTime(&stTime);
  118.             fprintf(LogFile, "%02d:%02d:%02d.%03d: %sn",
  119.                     stTime.wHour, stTime.wMinute, stTime.wSecond,
  120.                     stTime.wMilliseconds, szOutString);
  121.             fflush(LogFile);
  122.         }
  123.     }
  124. }
  125. void
  126. DebugOpenLogFile(LPSTR   pszLogFile)
  127. {
  128.     LogFile = fopen(pszLogFile, "a");
  129.     if (!LogFile)
  130.     {
  131.         OutputDebugStringA("Pop3Svr: Could not open logfile for append");
  132.         OutputDebugStringA(pszLogFile);
  133.     }
  134.     DebugLog((DEB_TRACE, "Log file '%s' beginsn", pszLogFile));
  135. }
  136. DWORD
  137. GetDebugKeyValue(
  138.     PDebugKeys      KeyTable,
  139.     int             cKeys,
  140.     LPSTR           pszKey)
  141. {
  142.     int     i;
  143.     for (i = 0; i < cKeys ; i++ )
  144.     {
  145.         if (_stricmp(KeyTable[i].Name, pszKey) == 0)
  146.         {
  147.             return(KeyTable[i].Value);
  148.         }
  149.     }
  150.     return(0);
  151. }
  152. //+---------------------------------------------------------------------------
  153. //
  154. //  Function:   LoadDebugParameters
  155. //
  156. //  Synopsis:   Loads debug parameters from win.ini
  157. //
  158. //  Effects:
  159. //
  160. //  Arguments:  (none)
  161. //
  162. //  Requires:
  163. //
  164. //  Returns:
  165. //
  166. //  Signals:
  167. //
  168. //  Modifies:
  169. //
  170. //  Algorithm:
  171. //
  172. //  History:    4-29-93   RichardW   Created
  173. //
  174. //  Notes:
  175. //
  176. //----------------------------------------------------------------------------
  177. void
  178. LoadDebugParameters(char * szSection)
  179. {
  180.     char    szVal[128];
  181.     char *  pszDebug;
  182.     int     cbVal;
  183.     cbVal = GetProfileStringA(szSection, "DebugFlags", "Error,Warning", szVal, sizeof(szVal));
  184.     pszDebug = strtok(szVal, ", t");
  185.     while (pszDebug)
  186.     {
  187.         PopInfoLevel |= GetDebugKeyValue(DebugKeyNames, NUM_DEBUG_KEYS, pszDebug);
  188.         pszDebug = strtok(NULL, ", t");
  189.     }
  190.     cbVal = GetProfileStringA(szSection, "LogFile", "", szVal, sizeof(szVal));
  191.     if (cbVal)
  192.     {
  193.         DebugOpenLogFile(szVal);
  194.     }
  195. }
  196. //+---------------------------------------------------------------------------
  197. //
  198. //  Function:   InitDebugSupport
  199. //
  200. //  Synopsis:   Initializes debugging support for the Winlogon
  201. //
  202. //  Effects:
  203. //
  204. //  Arguments:  (none)
  205. //
  206. //  Requires:
  207. //
  208. //  Returns:
  209. //
  210. //  Signals:
  211. //
  212. //  Modifies:
  213. //
  214. //  Algorithm:
  215. //
  216. //  History:    4-29-93   RichardW   Created
  217. //
  218. //  Notes:
  219. //
  220. //----------------------------------------------------------------------------
  221. void
  222. InitDebugSupport(void)
  223. {
  224.     LoadDebugParameters("Pop");
  225.     LoadDebugParameters("Winlogon");
  226. }
  227. #else // DBG
  228. #pragma warning(disable:4206)   // Disable the empty transation unit
  229.                                 // warning/error
  230. #endif  // NOTE:  This file not compiled for retail builds