#include <stdlib.h>
#include <signal.h>

#include "kernel.h"

#include "Desk.Error2.h"
#include "Desk.DeskMem.h"


Desk_error2_block*	Desk_Error2_VerboseExit( Desk_error2_block* error)
{
if (0)	;

else if ( error->type==Desk_error2_type_MISC)
	Desk_Error_ReportFatal( 1, "Error2: Misc. '%p'", error->data.misc);

else if ( error->type==Desk_error2_type_OSERROR)	{
	if ( error->data.oserror)
		Desk_Error_ReportFatal( 1, "Error2: oserror. %i, '%s'", 
			error->data.oserror->errnum,
			error->data.oserror->errmess
			);
	else	Desk_Error_ReportFatal( 1, "Error2: oserror. NULL");
	}

else if ( error->type==Desk_error2_type_DESKMEM)	{
	if ( error->data.deskmem)
		Desk_Error_ReportFatal( 1, "Error2: DeskMem. Size=%i, ptr=%p\n",
			error->data.deskmem->size,
			error->data.deskmem->ptr
			);
	else 	Desk_Error_ReportFatal( 1, "Error2: DeskMem. NULL");
	}

else if ( error->type==Desk_error2_type_SIGNAL)	{
	Desk_Error_Report( 1, "Error2: Signal. Number %i", error->data.signal);
	if ( error->data.signal == SIGOSERROR)	{
		Desk_os_error*	e = (Desk_os_error*) _kernel_last_oserror();
		if (e)	{
			Desk_Error_ReportFatal( 1, "This is signal for os error. %i, '%s'", 
				e->errnum,
				e->errmess
				);
			}
		else	Desk_Error_ReportFatal( 1, "Couldn't find Desk_os_error with _kernel_last_oserror");
		}
	abort();
	}

else if ( error->type==Desk_error2_type_MEM)	{
	Desk_Error_ReportFatal( 1, "Error2: Mem. %p", error->data.misc);
	}

else if ( error->type==Desk_error2_type_TEXT)	{
	if ( error->data.text)	Desk_Error_ReportFatal( 1, "Error2: Text. '%s'", error->data.text);
	else			Desk_Error_ReportFatal( 1, "Error2: Text. NULL");
	}
	
else	Desk_Error_ReportFatal( 1, "Error2: Unknown type %i, data %p", 
		(int) error->type, 
		error->data.misc
		);

return error;
}
