#include"CAssert.h"
#include"../../Setup/Win32.h"

namespace Maid
{

	/*!
 		@class	CAssert CAssert.h
		@brief	Win32 用アサート関数
	 */
	CAssert::CAssert( const char* szFile, int Line ) : m_StreamBuf(szFile,Line), MySTL::ostream(&m_StreamBuf)
	{
	}

	CAssert::StreamBuf::StreamBuf(const char* szFile, int Line)
		: m_FileName(szFile), m_Line(Line)
	{
	}

	CAssert::StreamBuf::~StreamBuf()
	{
		MySTL::string text;

		{
			int len = (int)m_Message.length();
			//	末尾に \n がついてたらはずす
			if( m_Message[len-1]=='\n' ) { --len; }

			text = m_Message.substr(0,len);
		}

		char Text[1024];
		::sprintf( Text,	"エラーが起きました\n"
							"ファイル名%s\n"
							"行番号%d\n"
							"内容：%s\n"
							"デバッガに入るときは「はい」をクリックしてください"
							,m_FileName.c_str(), m_Line, text.c_str()  );

		::ShowCursor(TRUE);
		const int ret = ::MessageBox( NULL, Text, "assertion", MB_ICONSTOP|MB_YESNO|MB_DEFBUTTON2 );
		::ShowCursor(FALSE);

		if( ret==IDYES )
		{
	#ifdef _DEBUG
			_asm int 3;
			//	ここで止まるはずだからコールスタックを巻き上げて上ってください(^^;
	#else
			//	リリースビルドの時は終了させてしまおう
			exit(0);
	#endif

		}
	}

	MySTL::streambuf::int_type CAssert::StreamBuf::overflow(MySTL::streambuf::int_type iChar) {
		if (iChar != EOF) {
			m_Message += iChar;
		}
		return iChar;   // 出力が成功したことを示す eof 以外を返す。
	}
}
