home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c083 / 19.ddi / DIAGXPRT.PAK / TOOLHELP.CPP < prev   
Encoding:
C/C++ Source or Header  |  1993-12-02  |  6.2 KB  |  198 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1991, 1993 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include <owl\owlpch.h>
  5. #include "diagxprt.h"
  6. #include <stdlib.h>
  7.  
  8. char  TToolHelp::buffer[1024];
  9. struct  TToolHelp::ERRMAP TToolHelp::errmap[] = {
  10. #ifndef __FLAT__
  11.   { ERR_GALLOC,     "GlobalAlloc failed" },
  12.   { ERR_GREALLOC,   "GlobalReAlloc failed" },
  13.   { ERR_GLOCK,      "GlobalLock failed" },
  14.   { ERR_LALLOC,     "LocalAlloc failed" },
  15.   { ERR_LREALLOC,   "LocalReAlloc failed" },
  16.   { ERR_LLOCK,      "LocalLock failed" },
  17. #endif
  18.   { ERR_ALLOCRES,   "AllocResource failed" },
  19.   { ERR_LOCKRES,    "LockResource failed" },
  20.   { ERR_LOADMODULE, "LoadModule failed" },
  21.  
  22.   { ERR_CREATEDLG,  "CreateDialog() failed: Couldn't load menu or create window" },
  23.   { ERR_CREATEDLG2, "CreateDialog() failed: Couldn't create window" },
  24.   { ERR_REGISTERCLASS, "RegisterClass failed: Class already exists" },
  25.   { ERR_DCBUSY,     "DC Cache full: Too many GetDC() calls" },
  26.   { ERR_CREATEWND,  "CreateWindow failed: Window class not found" },
  27.   { ERR_STRUCEXTRA, "Unallocated extra window/class word index used" },
  28.   { ERR_LOADSTR,    "LoadString() failed" },
  29.   { ERR_LOADMENU,   "LoadMenu() failed" },
  30.   { ERR_NESTEDBEGINPAINT, "Nested BeginPaint() calls" },
  31.   { ERR_BADINDEX,   "Invalid window word index value" },
  32.   { ERR_CREATEMENU, "CreateMenu failed" },
  33.  
  34.   { ERR_CREATEDC,   "CreateDC failed" },
  35.   { ERR_CREATEMETA, "CreateMetafile: Can't create metafile" },
  36.   { ERR_SELBITMAP,  "Bitmap already selected" },
  37.   { ERR_DELOBJSELECTED, "Selected object deleted" },
  38.   { 0, 0 }
  39. };
  40.  
  41. char *
  42. TToolHelp::GetTaskName()
  43. {
  44.   HTASK hTask = GetCurrentTask();
  45.   TASKENTRY te;
  46.   te.dwSize = sizeof(te);
  47.   TaskName[0]=0;
  48.   if (TaskFindHandle(&te, hTask))
  49.     strcpy(TaskName,(LPSTR)te.szModule);
  50.   return TaskName;
  51. }
  52.  
  53. char *
  54. TToolHelp::GetProcName(FARPROC lpfn)
  55. {
  56.   GLOBALENTRY ge;
  57.   MODULEENTRY me;
  58.   ge.dwSize = sizeof(ge);
  59.   me.dwSize = sizeof(me);
  60.   ProcName[0]=0;
  61.   if (GlobalEntryHandle(&ge, (HGLOBAL)HIWORD(lpfn)) &&
  62.                         ge.wType == GT_CODE &&
  63.                         ModuleFindHandle(&me, (HMODULE)ge.hOwner)) {
  64.     strcpy(ProcName,(LPSTR)me.szModule);
  65.   }
  66.   return ProcName;
  67. }
  68.  
  69.  
  70. // Table of LogParamErrors
  71. //
  72. struct LogParamError
  73. {
  74.   unsigned err;   // Error code
  75.   char*    type;
  76.   unsigned fmt;  // Format hints for specific error
  77. };           
  78.  
  79. struct LogParamError logParamErrors[] =
  80. {
  81.   {ERR_BAD_VALUE,        "value",        1},
  82.   {ERR_BAD_INDEX,        "index",        1},
  83.   {ERR_BAD_FLAGS,        "flags",        2},
  84.   {ERR_BAD_SELECTOR,     "selector",     2},
  85.   {ERR_BAD_DFLAGS,       "flags",        3},
  86.   {ERR_BAD_DVALUE,       "value",        3},
  87.   {ERR_BAD_DINDEX,       "index",        3},
  88.   {ERR_BAD_PTR,          "pointer",      4},
  89.   {ERR_BAD_FUNC_PTR,     "function pointer", 4},
  90.   {ERR_BAD_STRING_PTR,   "string pointer", 4},
  91.   {ERR_BAD_HINSTANCE,    "HINSTANCE",    2},
  92.   {ERR_BAD_HMODULE,      "HMODULE",      2},
  93.   {ERR_BAD_GLOBAL_HANDLE,"global handle", 2},
  94.   {ERR_BAD_LOCAL_HANDLE, "local handle", 2},
  95.   {ERR_BAD_ATOM,         "atom",         2},
  96.   {ERR_BAD_HWND,         "HWND",         2},
  97.   {ERR_BAD_HMENU,        "HMENU",        2},
  98.   {ERR_BAD_HCURSOR,      "HCURSOR",      2},
  99.   {ERR_BAD_HICON,        "HICON",        2},
  100.   {ERR_BAD_GDI_OBJECT,   "HGDIOBJ",      2},
  101.   {ERR_BAD_HDC,          "HDC",          2},
  102.   {ERR_BAD_HPEN,         "HPEN",         2},
  103.   {ERR_BAD_HFONT,        "HFONT",        2},
  104.   {ERR_BAD_HBRUSH,       "HBRUSH",       2},
  105.   {ERR_BAD_HBITMAP,      "HBITMAP",      2},
  106.   {ERR_BAD_HRGN,         "HRGN",         2},
  107.   {ERR_BAD_HPALETTE,     "HPALETTE",     2},
  108.   {ERR_BAD_HANDLE,       "HANDLE",       2},
  109.   {ERR_BAD_HFILE,        "HFILE",        2},
  110.   {ERR_BAD_HMETAFILE,    "HMETAFILE",    2},
  111.   {ERR_BAD_CID,          "CID",          2},
  112.   {ERR_BAD_HDRVR,        "HDRVR",        2},
  113.   {ERR_BAD_HDWP,         "HDWP",         2}
  114. };
  115.  
  116.  
  117. void
  118. TToolHelp::FormatLogParamError(char *result, int size, TDispData *d) 
  119. {
  120.   char *type = "parameter";
  121.   unsigned fmt = 0;
  122.   char *warning;
  123.   unsigned err = d->ErrorCode & ~ERR_WARNING;
  124.  
  125.   // Look through table of errors until we find one that matches
  126.   //
  127.   for (int i = 0; i < (sizeof(logParamErrors) / sizeof(struct LogParamError)); i++) {
  128.     if (logParamErrors[i].err == err) {
  129.       fmt = logParamErrors[i].fmt;
  130.       type = logParamErrors[i].type;
  131.       break;
  132.     }
  133.   }
  134.   if (d->ErrorCode & ERR_WARNING)
  135.     warning = "Warning:";
  136.   else
  137.     warning = "Error:";
  138.   
  139.   if (fmt == 4)
  140.     wsprintf(buffer,"%s %s %s: Invalid %s: %#04x:%#04x \r\n",warning,
  141.       d->ModuleName,d->ProcName,type,SELECTOROF(d->Param),OFFSETOF(d->Param));
  142.  
  143.   else if (fmt == 3)
  144.     wsprintf(buffer,"%s %s %s: Invalid %s: %#04x%#04x \r\n",warning,
  145.       d->ModuleName,d->ProcName,type,(DWORD)d->Param);
  146.  
  147.   else
  148.     wsprintf(buffer,"%s %s %s: Invalid %s: %#04x\r\n",warning,
  149.       d->ModuleName,d->ProcName,type,(WORD)(DWORD)d->Param);
  150.  
  151.   strncpy(result, buffer, size - 1);
  152.   buffer[size - 1] = 0;
  153. }
  154.  
  155.  
  156. #define ERR_SIZEMASK   (ERR_BYTE | ERR_WORD | ERR_DWORD)
  157.  
  158. void
  159. TToolHelp::FormatLogError(char* result, int size, TDispData* d) 
  160. {
  161.   char* p = buffer;
  162.   char* errStr = "";
  163.  
  164.   UINT err = (d->ErrorCode & ~(ERR_WARNING | ERR_SIZEMASK));
  165.  
  166.   for (int i = 0; errmap[i].szErr; i++) {
  167.     if (errmap[i].err == err) {
  168.       errStr = errmap[i].szErr;
  169.       break;
  170.     }
  171.   }
  172.  
  173.   if (d->ErrorCode & ERR_WARNING) {
  174.     wsprintf(p, "%s: Warning %x: %s",
  175.       (LPSTR)d->ModuleName, d->ErrorCode, (LPSTR)errStr);
  176.   } else {
  177.     wsprintf(p, "%s: Error %x: %s",
  178.       (LPSTR)d->ModuleName, d->ErrorCode, (LPSTR)errStr);
  179.   }
  180.  
  181.   p += strlen(p);
  182.   switch (d->ErrorCode & ERR_SIZEMASK) {
  183.     case ERR_BYTE:
  184.       wsprintf(p, "%x\r\n", LOBYTE(LOWORD(d->Data)));
  185.       break;
  186.     case ERR_WORD:
  187.       wsprintf(p, "%x\r\n", LOWORD(d->Data));
  188.       break;
  189.     case ERR_DWORD:
  190.       wsprintf(p, "%x%x\r\n", HIWORD(d->Data), LOWORD(d->Data));
  191.       break;
  192.     default:
  193.       wsprintf(p, "\r\n");
  194.   }
  195.   strncpy(result, buffer, size - 1);
  196.   buffer[size - 1] = 0;
  197. }
  198.