/* > signal.c< */
/* Intended for AIM Ed Doppenberg 19-04-90 */
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
#include "h.trace"
#include "h.Os"
#include "swis.h"
#include "h.werr"
#include "h.bbc"
#include "h.wimp" 
#include "h.wimpt" 
#include "alarm.h"
#include "window.h"

typedef void SignalHandler(int);
SignalHandler *oldhandler;
void SignalInitialize(void);
static os_regset regs;
extern jmp_buf main_loop;

void AbortHandler(int signal)
{
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);
  wprintf("Fatal error (type=%i), must exit !!!!!!!\n",signal);
  longjmp(main_loop,1);
}

void FpeHandler(int signal)
{
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);
  wprintf("Floating point error (type=%i)\n",signal);
  longjmp(main_loop,1);
}

void IllHandler(int signal)
{
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);
  wprintf("Illegal instruction error (type=%i), must exit ?",signal);
  longjmp(main_loop,1);
}


void IntHandler(int signal)
{
 char buf[80], *pntr;
 wimp_eventstr *evnt;
 int escape_state;

 signal=signal; /* Keep compiler happy */
/*
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 escape_state=regs.r[1];

 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);

do
  {
  wprintf("Escape pressed ........\n [Q] to quit or [C] to continue ->");
  pntr=poll_loop(buf,0,evnt);
  if (buf[0] =='q' || buf[0] =='Q')longjmp(main_loop,1);
  }
while(buf[0] !='c' && buf[0] !='C');
*/
 SignalInitialize();
}


void SegvHandler(int signal)
{
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);
  werr(0,"--- invalid memory access ---");
  longjmp(main_loop,1);
}


void StakHandler(int signal)
{
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);
  werr(0,"--- Stack problem ---");
  longjmp(main_loop,1);
}

void TermHandler(int signal)
{

  os_error err;
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);
  err.errnum = 0;
  sprintf(err.errmess,"Terminator error (type=%i), must exit",signal);
  wimpt_reporterror(&err,wimp_EOK);
  exit(0);
}


void OsErrorHandler(int signal)
{
  os_error err;
 regs.r[0] = 229;
 regs.r[1] = 1;
 regs.r[2] = 0;
 os_swi(OS_Byte,&regs);
 regs.r[0] = 124;
 os_swi(OS_Byte,&regs);
  err.errnum = 0;
  sprintf(err.errmess,"Os error (type=%i), must exit",signal);
  wimpt_reporterror(&err,wimp_EOK);
  exit(0);
}

void SignalInitialize(void)
{
   oldhandler = signal(SIGABRT, &AbortHandler);
   oldhandler = signal(SIGFPE, &FpeHandler);
   oldhandler = signal(SIGILL, &IllHandler);
   oldhandler = signal(SIGINT, &IntHandler);
   oldhandler = signal(SIGSEGV, &SegvHandler);
   oldhandler = signal(SIGTERM, &TermHandler);
   oldhandler = signal(SIGOSERROR, &OsErrorHandler);
   oldhandler = signal(SIGSTAK, &StakHandler);
}
