//////////////////////////////////////////////////////////////////
// File     : dbg.h
// Purpose  : MACRO definition for showing debug message
// 
// 
// Copyright(c) 1991-1997, Microsoft Corp. All rights reserved
//
//////////////////////////////////////////////////////////////////
#ifndef _DBG_H_
#define _DBG_H_

#define	MemAlloc(a)		GlobalAlloc(GMEM_FIXED, (a))
#define MemFree(a)		GlobalFree((a))

//-------------------------------------------------------
//MACRO function(?) prototype declare
//-------------------------------------------------------
////////////////////////////////////////////////////////
// Function	: DBG
// Type		: VOID
// Purpose	: Printing ANSI debug message with same usage as printf()
//			: 
// Args		: 
//			: LPSTR lpstrFuncName 
//			: ...	
// CAUTION	: Must use DOUBLE Blaket to remove in Release version!!!
/////////////////////////////////////////////////////////
//VOID DBG((LPSTR lpstrFuncName, ...));


////////////////////////////////////////////////////////
// Function: DBGW
// Type    : VOID
// Purpose : Printing Unicode debug message with same usage as printf()
// Args    : 
//         : LPWSTR lpstrFuncName 
//		   : ...	
// CAUTION: Please use DOUBLE Blaket!!!
/////////////////////////////////////////////////////////
//VOID DBGW((LPWSTR lpstrFuncName, ...));

////////////////////////////////////////////////////////
// Function	: DBGMB
// Type		: VOID
// Purpose	: Show Messagebox for ANSI debug message 
//			: Same usage as printf()
// Args		: 
//			: LPSTR lpstrFuncName 
//			: ...	
// CAUTION	: Must use DOUBLE Blaket to remove in Release version!!!
/////////////////////////////////////////////////////////
//VOID DBGMB((LPSTR lpstrFuncName, ...));


////////////////////////////////////////////////////////
// Function	: DBGShowWindow
// Type		: VOID
// Purpose	: Invoke debug message window.
//			: DBG(), DBGW()'s message is shown here.
// Args		: HINSTANCE	hInst
//		    : HWND		hwndOwner
/////////////////////////////////////////////////////////
//VOID DBGShowWindow(HINSTANCE hInst, HWND hwndOwner);




#ifdef _DEBUG
extern VOID _plvDbgShowWindow(HINSTANCE hInst, HWND hwndOwner);
#ifndef UNICODE_ONLY
extern VOID  _plvDbgA		 (LPSTR lpstrFile, INT lineNo, LPSTR lpstrMsg);
extern VOID  _plvDbgPrintA (LPSTR lpstrMsg, ...);
extern LPSTR _plvDbgVaStrA (LPSTR lpstrFmt, ...);
extern LPWSTR _plvDbgMulti2Wide(LPSTR lpstr);
extern VOID _plvDbgMBA(LPSTR lpstrFile, INT lineNo, LPSTR lpstrMsg);
extern VOID _plvDbgMBW(LPWSTR lpstrFile, INT lineNo, LPWSTR lpstrMsg);
extern VOID _dbg_Assert(LPCTSTR		fileName,
						INT			line,
						BOOL			flag,
						LPCTSTR		pszExp);

#endif

#ifndef ANSI_ONLY
extern VOID   _plvDbgW(LPWSTR lpstrFile, INT lineNo, LPWSTR lpstrMsg);
extern VOID   _plvDbgPrintW(LPWSTR lpstrMsg, ...);
extern LPWSTR _plvDbgVaStrW(LPWSTR lpstrFmt, ...);
#endif
#endif

#if defined(_DEBUG) || (defined(_NDEBUG) && defined(_RELDEBUG))
#	define DBGShowWindow(a,b)	_plvDbgShowWindow(a,b);
#	define DBGW(a)				_plvDbgW( _plvDbgMulti2Wide(__FILE__), __LINE__, _plvDbgVaStrW a)
#	define DBGA(a)				_plvDbgA(__FILE__, __LINE__, _plvDbgVaStrA a)
#	define Dbg(a)				_plvDbgA(__FILE__, __LINE__, _plvDbgVaStrA a)
#	define DBGMB(a)				_plvDbgMBA(__FILE__, __LINE__, _plvDbgVaStrA a)
#	define DBGMBA(a)			_plvDbgMBA(__FILE__, __LINE__, _plvDbgVaStrA a)
#	define DBGMBW(a)			_plvDbgMBW(_plvDbgMulti2Wide(__FILE__), __LINE__, _plvDbgVaStrW a)
#	define DBGASSERT(a)			_plvDbgAssert(__FILE__, __LINE__, a, #a);
#	define DBGASSERTDO(a)		_plvDbgAssert(__FILE__, __LINE__, a, #a);
#else //!_DEBUG	//in Release version, these are disapear...
#	define DBGShowWindow(a,b)
#	define DBGW(a)	
#	define DBGA(a)		
#	define Dbg(a)
#	define DBGMB(a)
#	define DBGMBA(a)
#	define DBGMBW(a)
#	define DBGASSERT(a)
#	define DBGASSERTDO(a)		(a)
#endif //_DEBUG

//extern VOID  _plvDbgA		 (LPSTR lpstrFile, INT lineNo, LPSTR lpstrMsg);
//extern VOID  _plvDbgPrintA (LPSTR lpstrMsg, ...);
//extern LPSTR _plvDbgVaStrA (LPSTR lpstrFmt, ...);
#define DP(a) //_plvDbgA(__FILE__, __LINE__, _plvDbgVaStrA a)
#endif //_DBG_H_