///////////////////////////////////
// Debugging Helpers for Windows CE
// Steve Makofsky - 01/01/02

#ifndef __ASSERTCE_H_
#define __ASSERTCE_H_

#undef ASSERT
#undef TRACE
#undef ATLTRACE

#ifdef DEBUG
#pragma warning (disable:4805)
#define MAX_ASSERTBUFFER		1024
// ASSERT for Windows CE
inline BOOL AssertCE(LPCTSTR lpszMsg, LPCSTR szFile, DWORD dwLine) {
	TCHAR tchAssert[MAX_ASSERTBUFFER+1] = TEXT("\0");
	TCHAR tchProgram[MAX_PATH+1] = TEXT("\0");
	TCHAR tchFile[MAX_PATH+1] = TEXT("\0");

	if(!GetModuleFileName(NULL, tchProgram, MAX_PATH))
		wsprintf(tchProgram, TEXT("<Unknown>"));

	mbstowcs(tchFile, szFile, MAX_PATH);

	wsprintf(tchAssert, TEXT("Assertion Failed!\r\n\r\nProgram: %s\r\nFile: %s\r\nLine: %d\r\nExpression: %s\r\n\r\nContinue?"), tchProgram, tchFile, dwLine, lpszMsg);
	if(MessageBox(NULL, tchAssert, TEXT("Assert"), MB_TOPMOST | MB_YESNO | MB_ICONSTOP) == IDYES)
		return FALSE;

	return TRUE;
}
#define ASSERT(x) do{if(!(x)){if(AssertCE(_T(#x), __FILE__, __LINE__)){exit(-1);}}}while(0)

// TRACE for Windows CE
inline VOID TraceLineCE(LPCSTR szFile, DWORD dwLine) {
	TCHAR tchLine[MAX_PATH+32] = TEXT("\0");
	TCHAR tchFile[MAX_PATH+1] = TEXT("\0");

	mbstowcs(tchFile, szFile, MAX_PATH);
	wsprintf(tchLine, TEXT("%s (%d): "), tchFile, dwLine);
	OutputDebugString(tchLine);
}
inline VOID TraceCE(LPCWSTR pcszFormat, ...) {
	TCHAR tchOutput[MAX_ASSERTBUFFER+1] = TEXT("\0");

	va_list args;
	va_start(args, pcszFormat);

  if(_vsnwprintf(tchOutput, MAX_ASSERTBUFFER, pcszFormat, args) < 0)
		wsprintf(tchOutput, TEXT("<Unknown>"));
	OutputDebugString(tchOutput);
	OutputDebugString(TEXT("\r\n"));
}
#define TRACE TraceLineCE(__FILE__, __LINE__), ::TraceCE
#define ATLTRACE TRACE
#else
#define ASSERT(x)
#define TRACE(x)
#define ATLTRACE(X)
#endif // _DEBUG

#endif // __ASSERTCE_H_
