// exception standard header for Microsoft
#pragma once
#ifndef _EXCEPTION_
#define _EXCEPTION_
#include <xstddef>

#pragma pack(push,8)
#pragma warning(push,3)
_STD_BEGIN

  #define _USE_EX	using ::exception; \
	using ::set_terminate; using ::terminate_handler; using ::terminate; \
	using ::set_unexpected; using ::unexpected_handler; using ::unexpected;


 #if _HAS_EXCEPTIONS
 _STD_END

 #include <eh.h>

 #if !defined(_WIN32)
  #error ERROR: Only Win32 targets supported!
 #endif /* !defined(_WIN32) */

 #ifndef _CRTIMP

  #ifdef	_DLL
   #define _CRTIMP __declspec(dllimport)

  #else	/* ndef _DLL */
   #define _CRTIMP
  #endif	/* _DLL */

 #endif	/* _CRTIMP */

typedef const char *__exString;

class _CRTIMP exception
	{	// base of all library exceptions
public:
	exception();
	exception(const char *const&);
	exception(const exception&);
	exception& operator=(const exception&);
	virtual ~exception();
	virtual const char *what() const;

private:
	const char *_m_what;
	int _m_doFree;
	};

 _STD_BEGIN

_USE_EX
typedef void (*_Prhand)(const exception&);
extern _CRTIMP2 _Prhand _Raise_handler;
_CRTIMP2 bool __cdecl uncaught_exception();

 #else /* _HAS_EXCEPTIONS */
		// CLASS exception
class exception;
typedef void (*_Prhand)(const exception&);

extern _CRTIMP2 _Prhand _Raise_handler;	// pointer to raise handler

_CRTIMP2 void __cdecl _Throw(const exception&);	// throw the exception

class _CRTIMP2 exception
	{	// base of all library exceptions
public:
	static _Prhand _Set_raise_handler(_Prhand _Pnew)
		{	// register a handler for _Raise calls
		const _Prhand _Pold = _Raise_handler;
		_Raise_handler = _Pnew;
		return (_Pold);
		}

	explicit exception(const char *_Message = _MESG("unknown"))
		_THROW0()
		: _Ptr(_Message)
		{	// construct from message string
		}

	exception(const exception& _Right) _THROW0()
		: _Ptr(_Right._Ptr)
		{	// construct by copying _Right
		}

	exception& operator=(const exception& _Right) _THROW0()
		{	// assign _Right
		_Ptr = _Right._Ptr;
		return (*this);
		}

	virtual ~exception()
		{	// destroy the object
		}

	virtual const char *what() const _THROW0()
		{	// return pointer to message string
		return (_Ptr);
		}

	void _Raise() const
		{	// raise the exception
		if (_Raise_handler != 0)
			(*_Raise_handler)(*this);	// call raise handler if present

		_Doraise();	// call the protected virtual
		_RAISE(*this);	// raise this exception
		}

protected:
	virtual void _Doraise() const
		{	// perform class-specific exception handling
		}

protected:
	const char *_Ptr;	// the message pointer
	};

		// TYPES
typedef void (__cdecl *terminate_handler)();
typedef void (__cdecl *unexpected_handler)();

		// DUMMY FUNCTION DECLARATIONS
inline terminate_handler __cdecl set_terminate(terminate_handler)
	_THROW0()
	{	// register a terminate handler
	return 0;
	}

inline unexpected_handler __cdecl set_unexpected(unexpected_handler)
	_THROW0()
	{	// register an unexpected handler
	return 0;
	}

inline void __cdecl terminate()
	{	// handle exception termination
	}

inline void __cdecl unexpected()
	{	// handle unexpected exception
	}

_CRTIMP2 bool __cdecl uncaught_exception();	// handle uncaught exception
 #endif /* _HAS_EXCEPTIONS */

		// CLASS bad_exception
class bad_exception : public exception
	{	// base of all bad exceptions
public:
	bad_exception(const char *_Message = _MESG("bad exception"))
		_THROW0()
		: exception(_Message)
		{	// construct from message string
		}

	virtual ~bad_exception() _THROW0()
		{	// destroy the object
		}

 #if !_HAS_EXCEPTIONS
protected:
	virtual void _Doraise() const
		{	// raise this exception
		_RAISE(*this);
		}
 #endif /* _HAS_EXCEPTIONS */

	};
_STD_END
#pragma warning(pop)
#pragma pack(pop)

#endif /* _EXCEPTION_ */

/*
 * Copyright (c) 1992-2002 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
 V3.13:0009 */
