#include <perms.h>
void Levelonetest(void);
void Hop(int Option);
int /* boolean */ Prime(int Ptest);
int _imp_mainep(int _imp_argc, char **_imp_argv) {
  typedef struct Ra {
    int A;
    int B[500 /*1:500*/];
  } Ra;
  typedef struct Era {
    int A;
    int B[4 /*1:4*/];
    _imp_string C;
  } Era;
  typedef struct Pointer {
    Pointer *Link;
    int A;
  } Pointer;
  typedef struct Cell {
    int A;
  } Cell;
  _imp_string Param;
  extern _imp_string Estr;
  extern unsigned char Ebint;
  extern int Eint;
  Era Erec[3 /*1:3*/];
  _imp_string Esa[3 /*30:32*/];
  int Eia[6 /*10:15*/];
  extern Cell Esell;
  extern Pointer *Eptr1;
  extern Pointer *Eptr2;
  extern Pointer *Eptr3;
  extern Cell *Epcell;
  extern _imp_string *Epstr;
  extern int *Epint;
  int X;
  int A;
  int J;
  int K;
  int Sub;
  Pointer R1;
  Pointer R2;
  Pointer R3;
  Ra Reca;
  Ra Recb;
  Ra Recc[3 /*-1:1*/];
  int Int1[3 /*1:3*/][5 /*11:15*/];
  int Int2[5 /*1:5*/];
  _imp_string S1;
  _imp_string S2;
  _imp_string S3;
  _imp_string Sarray[11 /*100:110*/];
  int Error;
  static int Trap_sw;
  static void *Trap[16 /*0:15*/] = {
      &&Trap_0,       &&Trap_default, &&Trap_default, &&Trap_default,
      &&Trap_default, &&Trap_default, &&Trap_default, &&Trap_default,
      &&Trap_default, &&Trap_default, &&Trap_default, &&Trap_default,
      &&Trap_default, &&Trap_13,      &&Trap_default, &&Trap_default,
  };
  Cell Sell;
  Cell *Pcell;
  Pointer *Ptr;
  static int Failures = 0;
  void Pass(void) { Printstring(_imp_str_literal("Pass: ")); }
  void Fail(void) {
    Printstring(_imp_str_literal("FAIL: "));
    Failures++;
  }
  if (_imp_on_event(0, 10, 13, 15)) {
    Sub = Event.Sub;
    goto *Trap[Trap_sw = Event.Event()];
  Trap_0:;
    if (!Sub)
      Printstring(_imp_str_literal("Trapped a '%STOP' from external module"));
    else {
      Printstring(_imp_str_literal("Error in _Sub field (="));
      Write(Sub, 1);
      Printstring(_imp_str_literal(") for event 0"));
    }
    Newline();
    goto Resume1;
  Trap_13:;
    if (Sub == 117)
      Printstring(_imp_str_literal("FAIL: "));
    else
      Printstring(_imp_str_literal("Error in _Sub field for event 13"));
    Newline();
    goto Resume0;
  Trap_default:;
    Printstring(_imp_str_literal("Failed: unknown event"));
    Write(Event.Event(), 1);
    Newline();
    exit(0);
  }
  void Staticdata(int N, int *E) {
    int I;
    int Sum = 0;
    static int J = 1;
    static int K = 3;
    static _imp_string S = _imp_str_literal("1");
    static int Int[100 /*1:100*/] = {[0 ... 99] = 1};
    if (J != N || K != 3 * N || S != Tostring('0' + N)) *E = *E + 1;
    for (I = 1; I <= 100; I++) Sum += Int[I];
    if (Sum != 100 * N) *E = *E + 1;
    J++;
    K = J * 3;
    S = Tostring('0' + J);
    for (I = 1; I <= 100; I++) Int[I] = J;
  }
  _imp_string *Smap(int Choice) {
    if (Choice == 'E') return (&Estr);
    if (Choice == 1) return (&S1);
    return (&S2);
  }
  int *Intmap(void) {
    if (J < K) return (&J);
    if (J == K) return (&Eint);
    return (&K);
  }
  Param = Cliparam();
  if (Param == _imp_str_literal(""))
    Selectoutput(2);
  else if (Param == _imp_str_literal("s") || Param == _imp_str_literal("S"))
    Selectoutput(0);
  else if (Param == _imp_str_literal("j") || Param == _imp_str_literal("J")) {
    Openoutput(2, _imp_str_literal("journal"));
    Selectoutput(2);
  } else {
    Openoutput(2, Param);
    Selectoutput(2);
  }
  Newlines(2);
  Printstring(
      _imp_str_literal("Test Linkage to External Data and Procedures."));
  Newline();
  Printstring(
      _imp_str_literal("============================================="));
  Newlines(3);
  Error = 0;
  if (Prime(20)) Error++;
  if (!Prime(17)) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("%External %Predicates successfully called."));
  Newlines(4);
  Printstring(_imp_str_literal("Test the Chaining to External Routines."));
  Newline();
  Printstring(_imp_str_literal("---------------------------------------"));
  Newlines(2);
  Hop(1);
Resume0:
  Hop(0);
Resume1:
  Printstring(_imp_str_literal("Linkage correctly performed via an %Alias"));
  Newline();
  Newlines(3);
  Printstring(
      _imp_str_literal("Test the Accessing and Assignment of External Data."));
  Newline();
  Printstring(
      _imp_str_literal("---------------------------------------------------"));
  Newlines(2);
  Error = 0;
  if (Eint != 100) Error++;
  if (Ebint != 96) Error++;
  if (Estr != _imp_str_literal("ABCDE")) Error++;
  for (J = 10; J <= 15; J++)
    if (Eia[J] != 25 - J) Error++;
  for (J = 1; J <= 3; J++) {
    if (Erec[J].A) Error++;
    if (Erec[J].C != _imp_str_literal("")) Error++;
    for (K = 1; K <= 4; K++)
      if (Erec[J].B) Error++;
  }
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("External data accessed after simple initialisation."));
  Newline();
  Levelonetest();
  Error = 0;
  if (Eint != -255) Error++;
  if (Ebint != 'K') Error++;
  if (Estr != _imp_str_literal("Access OK")) Error++;
  for (J = 10; J <= 15; J++)
    if (Eia[J] != J) Error++;
  for (J = 1; J <= 3; J++) {
    if (Erec[J].A != J) Error++;
    for (K = 1; K <= 4; K++)
      if (Erec[J].B != J * 10 + K) Error++;
  }
  if (Erec[1].C != _imp_str_literal("1")) Error++;
  if (Erec[2].C != _imp_str_literal("2")) Error++;
  if (Erec[3].C != _imp_str_literal("3")) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("External data accessed after external modification."));
  Newlines(3);
  Printstring(_imp_str_literal("Test %External %Name Variables."));
  Newline();
  Printstring(_imp_str_literal("-------------------------------"));
  Newlines(2);
  if (Epcell == &Nil)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("%External %Record %Name initialised to NIL."));
  Newline();
  Esell.A = 20;
  Sell.A = 30;
  Epcell = &Esell;
  Pcell = &Esell;
  Error = 0;
  if (Epcell != Pcell) Error++;
  if (Epcell->A != 20) Error++;
  Epcell->A = 40;
  if (Esell.A != 40) Error++;
  Epcell = &Sell;
  if (Epcell->A != 30) Error++;
  Epcell->A = 60;
  if (Sell.A != 60) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal(
      "%External %Names referencing across module boundaries."));
  Newline();
  Eptr1 = &R1;
  Eptr2 = &R2;
  Eptr3 = &R3;
  Eptr1->A = 1;
  Eptr2->A = 2;
  Eptr3->A = 3;
  if (Eptr1->A == 1 && Eptr2->A == 2 && Eptr3->A == 3)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal(
      "Assignment of external record fields in seperate modules."));
  Newline();
  Ptr = Eptr1;
  Ptr->Link = Eptr2;
  Ptr->Link = Eptr3;
  Ptr->Link = Ptr;
  Error = 0;
  if (&Ptr->Link != Eptr3) Error++;
  if (&Eptr1->Link != &Eptr2->Link) Error++;
  if (Ptr != &Eptr3->Link) Error++;
  if (Eptr3->Link != 1) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Chaining across modules using %External %Names."));
  Newline();
  S1 = _imp_str_literal("New");
  K = 100;
  Error = 0;
  Epstr = &S1;
  Epint = &K;
  if (*Epstr != _imp_str_literal("New")) Error++;
  if (*Epint != 100) Error++;
  *Epstr = _imp_str_literal("Newer");
  *Epint = 1000;
  if (S1 != _imp_str_literal("Newer")) Error++;
  if (K != 1000) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("%External %String and %Integer %Names."));
  Newline();
  Newlines(2);
  Printstring(_imp_str_literal("Test %MAPs  onto Local and %External Data"));
  Newline();
  Printstring(_imp_str_literal("-----------------------------------------"));
  Newlines(2);
  J = 3;
  K = 4;
  Eint = 5;
  Error = 0;
  *Intmap() = 6;
  if (J != 6 || K != 4 || Eint != 5) Error++;
  *Intmap() = 6;
  if (J != 6 || 6 != K || Eint != 5) Error++;
  *Intmap() = 8;
  if (J != K || K != 6 || Eint != 8) Error++;
  if (*Intmap() != 8) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Conditional and unconditional %RESULT in a MAP."));
  Newline();
  S1 = _imp_str_literal("ONE");
  S2 = _imp_str_literal("TWO");
  S3 = _imp_str_literal("EXTERNAL");
  S3 = *Smap(1);
  if (S3 != _imp_str_literal("ONE")) Error++;
  if (S2 != *Smap(2)) Error++;
  *Smap('E') = _imp_str_literal("Dynamic");
  if (Estr != _imp_str_literal("Dynamic")) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal(
      "Pointing at %External and local %Strings using a MAP."));
  Newline();
  Selectoutput(0);
  Write(Failures, 1);
  Printstring(_imp_str_literal(" failure(s)"));
  Newline();
  exit(0);
  return (1);
}
