#include <perms.h>
static const int Integersize = 4;
static const int Bytesize = 1;
typedef struct Imptrap {
  int Start;
  int End;
  int Trapep;
  int From;
  unsigned char Data[16 /*0:15*/];
} Imptrap;
static const int Trapsize = 4 * Integersize + 16 * Bytesize;
static Imptrap Noinfo;
extern Imptrap Trapbase;
extern Imptrap Trapend;
static _imp_string Getprocname(Imptrap *Tp) {
  _imp_string Procname;
  int I;
  *Length(Procname) = 0;
  for (I = 1; I <= 14; I++)
    if (Tp.Data != 0) {
      *Length(Procname) = *Length(Procname) + 1;
      *Charno(Procname, I) = Tp.Data;
    }
  return (Procname);
}
static void Dumptrapinfo(Imptrap *Tp) {
  int Events;
  int I;
  _imp_string Procname;
  Events = (Tp.Data << 8) + Tp.Data;
  Procname = Getprocname(*Tp);
  if (Events != 0) {
    Debugstring;
    Debugstring;
    Debugstring;
    Debugstring;
    Debugnewline;
    Debugstring;
    for (I = Maxevent - 1; I >= 0; I--)
      if (((1 << I) & Events) != 0)
        Debugstring;
      else
        Debugstring;
    Debugstring;
    Debugstring;
  } else {
    Debugstring;
    Debugstring;
    Debugstring;
    Debugstring;
  }
  Debugnewline;
}
void Dumpalltrapinfo(void) {
  Imptrap *Tp;
  Tp = &Trapbase;
  while (Addr(*Tp) < Addr(Trapend)) {
    Dumptrapinfo(*Tp);
    Tp = Record(Addr(*Tp) + Trapsize);
  }
}
static Imptrap *Blockinfo(int Address) {
  Imptrap *Tp;
  Imptrap *Found;
  Tp = &Trapend;
  Found = &Noinfo;
  for (;;) {
    if (Tp->Start <= Address && Address <= Tp->End) {
      Found = Tp;
      break;
    }
    Tp = Record(Addr(*Tp) - Trapsize);
    if (Addr(*Tp) < Addr(Trapbase)) break;
  }
  return (Found);
}
int /* boolean */ Handlerfound(int Event, int Address) {
  Imptrap *Tp;
  int Trapbit;
  int Checkbit;
  Tp = Blockinfo(Address);
  Trapbit = 1;
  if ((0 < Event) && (Event < Maxevent)) Trapbit = 1 << Event;
  Checkbit = (Tp->Data << 8) + Tp->Data;
  if (((Checkbit & Trapbit) != 0) &&
      (Tp->Start <= Address && Address <= Tp->End))
    return (1);
  return (0);
}
int /* boolean */ Initialentryfound(int Address) {
  Imptrap *Tp;
  _imp_string Procname;
  if (Address == 0) return (0);
  Tp = Blockinfo(Address);
  if (Tp == &Noinfo) return (0);
  Procname = Getprocname(*Tp);
  if (Procname == _imp_str_literal("STARTIMP")) return (1);
  return (0);
}
_imp_string Handlername(int Address) {
  Imptrap *Tp;
  _imp_string Procname;
  Tp = Blockinfo(Address);
  return (Getprocname(*Tp));
}
int Handlerentryaddress(int Address) {
  Imptrap *Tp;
  Tp = Blockinfo(Address);
  return (Tp->Trapep);
}
