#include <perms.h>
static const int Maxpanic = 20;
typedef struct Impframe {
  int Xret;
} Impframe;
void Terminateiosystem(void);
void Saveevent(int Line, int Event, int Sub, int Extra);
void Messageformata(int Messageid);
void Messageformatb(int Address);
void Dumpalltrapinfo(void);
int /* boolean */ Handlerfound(int Event, int Address);
int /* boolean */ Initialentryfound(int Address);
int Handlerentryaddress(int Address);
static void Impexit(int Status) {
  Terminateiosystem();
  Exit;
}
void Impstop(void) { Impexit(1); }
void Impsignal(int Line, int Event, int Sub, int Info) {
  int Status;
  Impframe *Mybp;
  Impframe *Chainbp;
  int Panic;
  if (Debugmode == Dbgtrap) Dumpalltrapinfo();
  Saveevent(Line, Event, Sub, Info);
  asm("mov  mybp,ebp");
  Chainbp = Mybp;
  Panic = 0;
  for (;;) {
    if (Handlerfound(Event, Chainbp->Xret)) {
      Mybp->Xebp = &Chainbp->Xebp;
      Mybp->Xret = Handlerentryaddress(Chainbp->Xret);
      return;
    }
    if (Initialentryfound(Chainbp->Xret)) break;
    Chainbp = &Chainbp->Xebp;
    Panic++;
    if (Panic > 20) break;
    if (Chainbp->Xret == 0) break;
  }
  if (Event != 0) {
    Messageformata(1);
    Panic = 0;
    Messageformata(2);
    for (;;) {
      Messageformatb(Mybp->Xret);
      if (Initialentryfound(Mybp->Xret)) break;
      Mybp = &Mybp->Xebp;
      Panic++;
      if ((Panic > 20) || (Mybp->Xret == 0)) {
        Messageformata(4);
        break;
      }
    }
    Messageformata(5);
    Messageformata(3);
    Status = 1;
  } else {
    Status = Info;
    if (Info == 0) {
      if ((Debugmode & Dbgcore) != 0) Messageformata(6);
    } else
      Messageformata(3);
  }
  Impexit(Status);
}
