/**************************************************************************** DEBUG.H Owner: cslim Copyright (c) 1997-1999 Microsoft Corporation Debug functions History: 14-JUL-1999 cslim Copied from IME98 source tree *****************************************************************************/ #if !defined (_DEBUG_H__INCLUDED_) #define _DEBUG_H__INCLUDED_ //#include // va_list, va_start() // Debug flag extern DWORD vdwDebug; #define DBGID_API 0x00000001 // IME API called #define DBGID_Key 0x00000002 #define DBGID_Mode 0x00000004 #define DBGID_UI 0x00000008 #define DBGID_UIObj 0x00000010 #define DBGID_Cand 0x00000020 #define DBGID_Conv 0x00000040 #define DBGID_UIWin 0x00000080 #define DBGID_IMECnt 0x00000100 #define DBGID_Tray 0x00000200 #define DBGID_UIMsg 0x00000400 #define DBGID_Mem 0x00000800 #define DBGID_ARRData 0x00001000 #define DBGID_Mouse 0x00002000 #define DBGID_SendMsg 0x00004000 #define DBGID_Automata 0x00008000 #define DBGID_IMENotify 0x00010000 #define DBGID_Hanja 0x00020000 #define DBGID_CompChar 0x00040000 #define DBGID_IMEDATA 0x00080000 #define DBGID_SetComp 0x00100000 #define DBGID_IMEPAD 0x00200000 #define DBGID_Misc 0x01000000 // destination #define DBGID_OUTCOM 0x00000000 #define DBGID_OUTVIDEO 0x10000000 #define DBGID_OUTFILE 0x20000000 #ifdef DEBUG // Start of debug code #define DbgW(a) DebugOutW(a) VOID InitDebug(VOID); #define AST(a) _AST(__FILE__, __LINE__, a, #a, fFalse) #define AST_EX(a) _AST(__FILE__, __LINE__, a, #a, fTrue) #define DbgAssert AST_EX inline VOID DebugOut(LPCSTR pSz) { static INT DCLine = 0; // // out to com // OutputDebugStringA(pSz); // // out to video // if (vdwDebug & DBGID_OUTVIDEO) { HDC hDC = GetDC((HWND)0); static CHAR sz[512]; wsprintfA((LPSTR)sz, "%s||", (CHAR*)pSz); TextOutA(hDC, 0, DCLine*16, (LPSTR)sz, lstrlenA((LPSTR)sz)); if( DCLine++ > 50 ) { DCLine = 0; } ReleaseDC( (HWND)0, hDC ); } // // out to file // if (vdwDebug & DBGID_OUTFILE) { HANDLE hFile; DWORD dwWrite; hFile = CreateFile(TEXT("C:\\IMEDBGKO.TXT"), GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ); SetFilePointer(hFile, 0, NULL, FILE_END); WriteFile( hFile, pSz, lstrlenA(pSz), &dwWrite, NULL ); WriteFile( hFile, "\r\n", 2, &dwWrite, NULL ); CloseHandle(hFile); } } inline VOID DebugOutW(LPCWSTR pwSz) { static CHAR pSz[1280] = {0}; INT cwch = lstrlenW( pwSz ); INT cch = WideCharToMultiByte( 949, 0, (LPWSTR)pwSz, -1, NULL, NULL, NULL, NULL ); WideCharToMultiByte( 949, 0, (LPWSTR)pwSz, cwch, pSz, sizeof(pSz), NULL, NULL ); pSz[cch-1] = 0; DebugOut( pSz ); } inline VOID DebugOutT(LPTSTR pwSz) { #if !defined (UNICODE) DebugOut(pwSz); #else DebugOutW(pwSz); #endif } inline void cdecl Dbg( DWORD dID, LPCTSTR szFormat, ...) { static TCHAR szOutput[512]; va_list valist; szOutput[0] = 0; if( vdwDebug & dID ) { va_start( valist, szFormat ); wvsprintf(szOutput, szFormat, valist); va_end(valist); lstrcat(szOutput, TEXT("\r\n")); DebugOutT(szOutput); } return; } inline void _AST(LPCSTR szFile, INT iLine, BOOL fAssert, LPCSTR pSz, BOOL fBreak) { if( fAssert == fFalse ) { static CHAR szOutput[512]; wsprintfA(szOutput, "* * * * * A S S E R T I O N F A I L E D * * * * *\r\n%s(%d) : value=%d / %s", szFile, iLine, fTrue, pSz ); lstrcatA(szOutput, "\r\n"); //#if !defined (UNICODE) DebugOut(szOutput); //#else // DebugOutW(szOutput); //#endif if( fBreak == fTrue ) { __try { DebugBreak(); } __except(EXCEPTION_EXECUTE_HANDLER) { OutputDebugStringA("DebugBreak"); } } } } #else // Start of retail code // Define Dbg as void(0) will not compile with 64bit compiler #define Dbg /##/ // Dbg should be appeared as one line. Even brace will cause compile error. #define DbgW /##/ #define DbgAssert(a) #define DebugOut(a) #define DebugOutW(a) #define DebugOutT(a) #define AST(a) #define AST_EX(a) // End of retail code #endif // ifndef _DEBUG #endif // !defined (_DEBUG_H__INCLUDED_)