home *** CD-ROM | disk | FTP | other *** search
/ s-gikan2.maizuru-ct.ac.jp / s-gikan2.maizuru-ct.ac.jp.zip / s-gikan2.maizuru-ct.ac.jp / pub / source / magdb141su.lzh / MagaDbgLib.cpp < prev    next >
C/C++ Source or Header  |  1999-07-19  |  11KB  |  411 lines

  1. /*
  2.     MagaDebug32 âfâoâbâOâcü[âï Ver1.41
  3.     ébü{ü{û{æ╠
  4. */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdarg.h>
  8. #include "MagaDbgMsg.h"
  9.  
  10. // Åπê╩4bits Mask
  11. #define    MAGADBGMAPNUMBERMASK    0x0fffffff
  12. #define    MAGADBGMAPLIBMTFLG        0x10000000
  13. #define    MAGADBGMAPLIBMDFLG        0x20000000
  14. #define    MAGADBGMAPLIBRFLG        0x40000000
  15.  
  16. // --------------------------------
  17. // èεû{âNâëâX
  18. // --------------------------------
  19.  
  20. // ôαòöÅêù¥è╓Éö
  21. // --------------------------------
  22. void CMagaDbg::CMagaDbgInit(char* s, BOOL f, dbgColor c, DWORD n) {
  23.     m_fSep      = f ? TRUE : FALSE;
  24.     m_iColor    = (int)c;
  25.     m_nInterval = n;
  26.  
  27.     m_nMapNumber = g_MagaDbgMapNumber;
  28.     InterlockedIncrement(&g_MagaDbgMapNumber);
  29.     m_nMapNumber &= MAGADBGMAPNUMBERMASK;
  30. #if defined(_MT)
  31.     #if !defined(_DLL)
  32.         m_nMapNumber |= MAGADBGMAPLIBMTFLG;
  33.     #else
  34.         m_nMapNumber |= MAGADBGMAPLIBMDFLG;
  35.     #endif
  36. #endif
  37. #if !defined(_DEBUG)
  38.     m_nMapNumber |= MAGADBGMAPLIBRFLG;
  39. #endif
  40.  
  41.     char    szTmp[32];
  42.     wsprintf(szTmp, "%s%08X", MAGADBG_COPYDATA_MAP, m_nMapNumber);
  43.     if ( (m_hDbgMap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
  44.                         PAGE_READWRITE, 0, STRLEN, szTmp)) != NULL )
  45.         m_lpDbgMap = (LPSTR)MapViewOfFile(m_hDbgMap, FILE_MAP_WRITE, 0, 0, 0);
  46.     else
  47.         m_lpDbgMap = NULL;
  48.  
  49.     SetHeader(s, this);
  50. }
  51.  
  52. void CMagaDbg::SetHeader(char* s, CMagaDbg* p) {
  53.     m_lpszHead = NULL;
  54.     m_iHeadLen = 0;
  55.     if ( s!=NULL && lstrlen(s)!=0 ) {
  56.         char*    tok;
  57.         char*    szTmp = new char[lstrlen(s)+1];
  58.         lstrcpy(szTmp, s);
  59.         if ( szTmp[0] == '\n' ) {
  60.             if ( lstrlen(s) > 1) p->print(szTmp+1);
  61.         }
  62.         else {
  63.             tok = strtok(szTmp, "\n");
  64.             m_lpszHead = new char[lstrlen(tok)+2];
  65.             m_iHeadLen = lstrlen(lstrcat(lstrcpy(m_lpszHead, tok), ":"));
  66.             if ( (tok=strtok(NULL, "\n")) != NULL )
  67.                 p->print(tok);
  68.         }
  69.         delete szTmp;
  70.     }
  71. }
  72.  
  73. int CMagaDbg::AddHeader(char** szResult, char* szbuf) {
  74.     int        len = 0;
  75.  
  76.     if ( szbuf!=NULL ) len = lstrlen(szbuf);
  77.     if ( m_lpszHead != NULL ) {
  78.         len += m_iHeadLen;
  79.         *szResult = new char[len+1];
  80.         if ( len!=0 )
  81.             lstrcat(lstrcpy(*szResult, m_lpszHead), szbuf);
  82.         else
  83.             lstrcpy(*szResult, m_lpszHead);
  84.     }
  85.     else if ( len!=0 ) {
  86.         *szResult = new char[len+1];
  87.         lstrcpy(*szResult, szbuf);
  88.     }
  89.     else {
  90.         *szResult = NULL;
  91.     }
  92.     return len;
  93. }
  94.  
  95. // âRâôâXâgâëâNâ^
  96. // --------------------------------
  97. CMagaDbg::CMagaDbg(void) {
  98.     CMagaDbgInit(NULL, FALSE, DBG_BLACK);
  99. }
  100.  
  101. CMagaDbg::CMagaDbg(char* s, BOOL f, dbgColor c, DWORD n) {
  102.     CMagaDbgInit(s, f, c, n);
  103. }
  104.  
  105. CMagaDbg::CMagaDbg(char* s, dbgColor c) {
  106.     CMagaDbgInit(s, FALSE, c);
  107. }
  108.  
  109. CMagaDbg::CMagaDbg(char* s, BOOL f) {
  110.     CMagaDbgInit(s, f, DBG_BLACK);
  111. }
  112.  
  113. CMagaDbg::CMagaDbg(BOOL f) {
  114.     CMagaDbgInit(NULL, f, DBG_BLACK);
  115. }
  116.  
  117. CMagaDbg::CMagaDbg(dbgColor c) {
  118.     CMagaDbgInit(NULL, FALSE, c);
  119. }
  120.  
  121. CMagaDbg::CMagaDbg(BOOL f, dbgColor c) {
  122.     CMagaDbgInit(NULL, f, c);
  123. }
  124.  
  125. // âfâBâXâgâëâNâ^
  126. // --------------------------------
  127. CMagaDbg::~CMagaDbg() {
  128.     UnmapViewOfFile(m_lpDbgMap);
  129.     CloseHandle(m_hDbgMap);
  130.     InterlockedDecrement(&g_MagaDbgMapNumber);
  131.     
  132.     if ( m_lpszHead!=NULL ) delete m_lpszHead;
  133.     if ( !m_fSep ) return;
  134.  
  135.     HWND    hwnd;
  136.     if ( (hwnd=MagaDbgFind()) == NULL ) return;
  137.     SendMessage(hwnd, WM_OBJ_MARK, (WPARAM)m_iColor, 0);
  138. }
  139.  
  140. // ò╢ÄÜù±é╠ò\Ī
  141. // --------------------------------
  142. void CMagaDbg::print(char* s, BOOL f) {
  143.     HWND    hwnd;
  144.     if ( (hwnd=MagaDbgFind())==NULL ) return;
  145.  
  146.     char*    tmp;
  147.     int len = AddHeader(&tmp, s);
  148.     if ( m_lpDbgMap == NULL ) {
  149.         m_cds.dwData = MAKELONG((f ? DBG_CR : 0), m_iColor);
  150.         m_cds.lpData = tmp;
  151.         m_cds.cbData = len;
  152.         SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)&m_cds);
  153.     }
  154.     else {
  155.         lstrcpyn(m_lpDbgMap, tmp, STRLEN);
  156.         SendMessage(hwnd, WM_DBGCOPYDATA, (WPARAM)m_nMapNumber, MAKELPARAM((f ? DBG_CR : 0), m_iColor));
  157.     }
  158.     if ( len!=0 ) delete tmp;
  159.     if ( m_nInterval!=0 ) Sleep(m_nInterval);
  160. }
  161.  
  162. // öCê╙ò╢ÄÜù±é╠ò\Ī
  163. // --------------------------------
  164. void CMagaDbg::printf(char* s, ...) {
  165.     char    msg[STRLEN];
  166.     char*    pArg = (char *)&s + sizeof(s);
  167. #if defined(_MSC_VER)
  168.     if ( _vsnprintf(msg, STRLEN, s, pArg) == -1 )
  169. #else
  170.     if ( vsprintf(msg, s, pArg) == EOF )
  171. #endif
  172.         msg[STRLEN-1] = '\0';
  173.     print(msg);
  174. }
  175.  
  176. // éµé¡Ägéñì\æóæ╠âüâôâoé╠ò\Ī
  177. // --------------------------------
  178. void CMagaDbg::printStruct(LPRECT lpRect, char* lpStr) {
  179.     this->printf("%s left=%d top=%d right=%d bottom=%d", (lpStr==NULL ? "" : lpStr),
  180.                     lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
  181. }
  182.  
  183. void CMagaDbg::printStruct(LPSIZE lpSize, char* lpStr) {
  184.     this->printf("%s cx=%d cy=%d", (lpStr==NULL ? "" : lpStr),
  185.                     lpSize->cx, lpSize->cy);
  186. }
  187.  
  188. void CMagaDbg::printStruct(LPPOINT lpPoint, char* lpStr) {
  189.     this->printf("%s x=%d y=%d", (lpStr==NULL ? "" : lpStr),
  190.                     lpPoint->x, lpPoint->y);
  191. }
  192.  
  193. // öCê╙ò╢ÄÜù±ôⁿù═
  194. // --------------------------------
  195. BOOL CMagaDbg::scanf(char* szIndata, char* szTitle) {
  196.  
  197.     if ( szIndata == NULL ) return -1;
  198.  
  199.     HWND    hwnd;
  200.     HANDLE    hFileMap;
  201.     LPSTR    lpView;
  202.     if ( (hwnd=MagaDbgFind())==NULL ) return -1;
  203.  
  204.     hFileMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
  205.         PAGE_READWRITE, 0, STRLEN, MAGADBG_SCANF_MAP);
  206.     if ( hFileMap!=NULL && GetLastError()==ERROR_ALREADY_EXISTS ) {
  207.         CloseHandle(hFileMap);
  208.         return -1;
  209.     }
  210.     else if ( hFileMap==NULL ) {
  211.         return -1;
  212.     }
  213.     if ( (lpView=(LPSTR)MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0)) == NULL ) {
  214.         CloseHandle(hFileMap);
  215.         return -1;
  216.     }
  217.     if ( szTitle != NULL )
  218.         lstrcpyn(lpView, szTitle, STRLEN);
  219.     else
  220.         lstrcpy(lpView, "");
  221.     UnmapViewOfFile(lpView);
  222.     if ( SendMessage(hwnd, WM_SCANF, 0, 0) == IDCANCEL ) {
  223.         CloseHandle(hFileMap);
  224.         return -1;
  225.     }
  226.     if ( (lpView=(LPSTR)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0)) == NULL ) {
  227.         CloseHandle(hFileMap);
  228.         return -1;
  229.     }
  230.     lstrcpyn(szIndata, lpView, min(STRLEN, lstrlen(lpView)+1));
  231.     UnmapViewOfFile(lpView);
  232.     CloseHandle(hFileMap);
  233.     return 0;
  234. }
  235.  
  236. // â_âôâvò\Ī
  237. // --------------------------------
  238. void CMagaDbg::dump(LPVOID lp, UINT byte, DWORD flg) {
  239.  
  240.     char    szbuf[STRLEN], szasc[32], sztmp[16];
  241.     UINT    i, ii, factor;
  242.  
  243.     factor = flg & DBG_OCTDUMP ? 8 : 16;
  244.     if ( !(flg & DBG_NOHEADERDUMP) ) {
  245.         if ( !(flg & DBG_NOADDRESSDUMP) )
  246.             lstrcpy(szbuf, "     ");
  247.         else
  248.             szbuf[0] = '\0';
  249.         for (i=0; i<factor; i++) {
  250.             wsprintf(sztmp, " +%X", i);
  251.             lstrcat(szbuf, sztmp);
  252.         }
  253.         print(szbuf);
  254.         if ( !(flg & DBG_NOADDRESSDUMP) )
  255.             lstrcpy(szbuf, "     ");
  256.         else
  257.             szbuf[0] = '\0';
  258.         for (i=0; i<factor; i++) lstrcat(szbuf, "---");
  259.         print(szbuf);
  260.     }
  261.  
  262.     ii = 0;
  263.     while ( ii < byte ) {
  264.         if ( !(flg & DBG_NOADDRESSDUMP) ) {
  265.             wsprintf(sztmp, "%04X ", ii);
  266.             lstrcpy(szbuf, sztmp);
  267.         }
  268.         else {
  269.             szbuf[0] = '\0';
  270.         }
  271.         i = 0;
  272.         while ( ii+i<byte && i<factor ) {
  273.             wsprintf(sztmp, " %02X", *((unsigned char *)lp+ii+i));
  274.             lstrcat(szbuf, sztmp);
  275.             if ( !(flg & DBG_NOCHRDUMP) ) {
  276.                 if ( *((unsigned char *)lp+ii+i)>=0x20 && *((unsigned char *)lp+ii+i)<=0x7e )
  277.                     szasc[i] = *((unsigned char *)lp+ii+i);
  278.                 else
  279.                     szasc[i] = '.';
  280.             }
  281.             i++;
  282.         }
  283.         if ( !(flg & DBG_NOCHRDUMP) ) {
  284.             szasc[i] = '\0';
  285.             for ( ; i<factor; i++) lstrcat(szbuf, "   ");
  286.             lstrcat(lstrcat(szbuf, "  "), szasc);
  287.         }
  288.         print(szbuf);
  289.         ii += factor;
  290.     }
  291. }
  292.  
  293.  
  294. // --------------------------------
  295. // öhÉ╢âNâëâX
  296. // --------------------------------
  297.  
  298. // ôαòöÅêù¥è╓Éö
  299. // --------------------------------
  300. void CMagaDbgFile::ErrorMsg(char* s, DWORD code) {
  301.     char    sztmp[MAX_PATH];
  302.     wsprintf(sztmp, "CMagaDbgFile %s = %lX", s, code);
  303.     Dbg_printf(sztmp);
  304.     MessageBox(NULL, sztmp, "CMagaDbgFile", MB_OK|MB_ICONERROR);
  305. }
  306.  
  307. void CMagaDbgFile::CMagaDbgFileInit(LPMAGADBGOPT lpopt) {
  308.  
  309.     m_hFile = INVALID_HANDLE_VALUE;
  310.     if ( lpopt->lpszFilename==NULL || lstrlen(lpopt->lpszFilename)==0 ) {
  311.         ErrorMsg("║▌╜─╫╕└┤╫░(╠º▓┘û╝û│î°)", 0);
  312.         return;
  313.     }
  314.     m_fDisplay = lpopt->fDisplay ? TRUE : FALSE;
  315.     DWORD dwOpenMode = lpopt->fOverwrite ? CREATE_ALWAYS : OPEN_ALWAYS;
  316.     if ( (m_hFile = CreateFile(lpopt->lpszFilename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
  317.             dwOpenMode, FILE_ATTRIBUTE_ARCHIVE, NULL)) == INVALID_HANDLE_VALUE ) {
  318.         ErrorMsg("║▌╜─╫╕└┤╫░", GetLastError());
  319.     }
  320.     else {
  321.         if ( !lpopt->fOverwrite ) SetFilePointer(m_hFile, NULL, NULL, FILE_END);
  322.     }
  323.  
  324.     SetHeader(lpopt->lpHead, this);        // CMagaDbg
  325. }
  326.  
  327. // âRâôâXâgâëâNâ^
  328. // --------------------------------
  329. // Éµé╔╠º▓┘é≡OPENé╖éΘòKùvé¬éáéΘé╠é┼üC
  330. // èεû{╕╫╜é≡î─é╘æµéPê°Éöé╔ NULL
  331. // --------------------------------
  332. CMagaDbgFile::CMagaDbgFile
  333.     (char* lpszFilename, BOOL fOver, BOOL fDis, char* s, BOOL f, dbgColor c, DWORD n) :
  334.     CMagaDbg(NULL, f, c, n)
  335. {
  336.     MAGADBGOPT    opt;
  337.     opt.lpszFilename    = lpszFilename;
  338.     opt.fOverwrite        = fOver;
  339.     opt.fDisplay        = fDis;
  340.     opt.lpHead            = s;
  341.     opt.fSeparator        = f;
  342.     opt.eColor            = c;
  343.     opt.nInterval        = n;
  344.     CMagaDbgFileInit(&opt);
  345. }
  346.  
  347. CMagaDbgFile::CMagaDbgFile(LPMAGADBGOPT lpopt) :
  348.     CMagaDbg(NULL, lpopt->fSeparator, lpopt->eColor, lpopt->nInterval)
  349. {
  350.     CMagaDbgFileInit(lpopt);
  351. }
  352.  
  353. // âfâBâXâgâëâNâ^
  354. // --------------------------------
  355. CMagaDbgFile::~CMagaDbgFile() {
  356.  
  357.     if ( m_hFile==INVALID_HANDLE_VALUE ) return;
  358.     if ( !GetSeparator() ) {        // CMagaDbg
  359.         CloseHandle(m_hFile);
  360.         return;
  361.     }
  362.     HWND    hwnd;
  363.     if ( (hwnd=MagaDbgFind())==NULL ) {
  364.         CloseHandle(m_hFile);
  365.         return;
  366.     }
  367.     // LogFileé╓╛╩▀┌░└Åoù═
  368.     HANDLE    hFileMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
  369.                             PAGE_READWRITE, 0, STRLEN, MAGADBG_SEP_MAP);
  370.     if ( hFileMap != NULL ) {
  371.         int        num;
  372.         if ( (num=(int)SendMessage(hwnd, WM_GETSEPARATOR, 0, 0)) > 0 ) {
  373.             LPSTR    lpView;
  374.             if ( (lpView=(LPSTR)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0)) != NULL ) {
  375.                 DWORD    dwWritesize;
  376.                 for ( int i=0; i<num; i++ ) {
  377.                     WriteFile(m_hFile, lpView, lstrlen(lpView), &dwWritesize, NULL);
  378.                     WriteFile(m_hFile, "\x0d\x0a", 2, &dwWritesize, NULL);
  379.                 }
  380.                 UnmapViewOfFile(lpView);
  381.             }
  382.         }
  383.         CloseHandle(hFileMap);
  384.     }
  385.  
  386.     CloseHandle(m_hFile);
  387. }
  388.  
  389. // ò╢ÄÜù±é╠ò\Ī
  390. // --------------------------------
  391. void CMagaDbgFile::print(char* s, BOOL fCR) {
  392.  
  393.     if ( m_hFile != INVALID_HANDLE_VALUE ) {
  394.         BOOL    fWrite; 
  395.         DWORD    dwWritesize;
  396.         char*    tmp;
  397.         DWORD    dwLen = (DWORD)AddHeader(&tmp, s);        // CMagaDbg
  398.         fWrite = WriteFile(m_hFile, tmp, dwLen, &dwWritesize, NULL);
  399.         if ( !fWrite || dwLen!=dwWritesize )
  400.             ErrorMsg("file print error", GetLastError());
  401.         if ( fCR )
  402.             WriteFile(m_hFile, "\x0d\x0a", 2, &dwWritesize, NULL);
  403.         if ( dwLen!=0 ) delete tmp;
  404.     }
  405.  
  406.     if ( m_fDisplay )
  407.         CMagaDbg::print(s, fCR);
  408.     else if ( GetInterval() != 0 )
  409.         Sleep(GetInterval());
  410. }
  411.