#include <perms.h>
int _imp_mainep(int _imp_argc, char **_imp_argv) {
  static const int Low = 0;
  static const int High = 25 * 10 + 5;
  static const unsigned char Cb[256 /*10:265*/] = {[0 ... 9] = 10,
                                                   [10 ... 29] = 20,
                                                   [30 ... 59] = 30,
                                                   [60 ... 99] = 40,
                                                   [100 ... 255] = 50};
  _imp_string S[11 /*12000:12010*/];
  int J[3 /*1:3*/][3 /*-1:1*/][1024 /*0:1023*/][2 /*-1:0*/];
  unsigned char B[256 /*0:255*/];
  _imp_string T;
  int K;
  int L;
  int M;
  int N;
  int Acc;
  unsigned char Byte;
  int Errors = 0;
  typedef struct Ra {
    int A;
  } Ra;
  typedef struct Rb {
    int A;
    int B[11 /*0:10*/];
    int C;
  } Rb;
  typedef struct Rc {
    Rc *Next;
    Rb B[4 /*0:3*/];
    int C[10 /*1:10*/];
  } Rc;
  typedef struct Rd {
    int A;
  } Rd;
  Ra Reca;
  Rb Recb[4 /*10:13*/];
  Rc Recc[3 /*1:3*/];
  Rd Recd;
  int *Pint1;
  int *Pint2;
  _imp_string *Pstr;
  Rc *Prc;
  Rc *Prc2;
  Rc Prca;
  int Pinta;
  static int Failures = 0;
  void Pass(void) { Printstring(_imp_str_literal("Pass: ")); }
  void Fail(void) {
    Printstring(_imp_str_literal("FAIL: "));
    Failures++;
  }
  Openoutput(2, _imp_str_literal("Journal"));
  Selectoutput(2);
  Newlines(2);
  Printstring(_imp_str_literal("%RECORD, %ARRAY and %NAME Validation"));
  Newline();
  Printstring(_imp_str_literal("===================================="));
  Newlines(2);
  Printstring(_imp_str_literal("Entities:"));
  Newline();
  Printstring(_imp_str_literal("-------- "));
  Newlines(2);
  Printstring(_imp_str_literal("Constants:                      "));
  Newline();
  Printstring(_imp_str_literal("---------                       "));
  Newline();
  Printstring(_imp_str_literal("%Integer  Low   = 0             "));
  Newline();
  Printstring(_imp_str_literal("%Integer  High  = 25 * 10 + 5   "));
  Newline();
  Printstring(_imp_str_literal("%Byte %Integer %Array  Bits2 =  "));
  Newline();
  Printstring(_imp_str_literal("5(0), 10(10), 20(20), 30(30), 40(40), 50(*)"));
  Newlines(3);
  Printstring(_imp_str_literal("Record Formats                  "));
  Newline();
  Printstring(_imp_str_literal("--------------                  "));
  Newline();
  Printstring(_imp_str_literal("RA (%Integer A)                 "));
  Newlines(2);
  Printstring(_imp_str_literal("RB (%Integer A,                 "));
  Newline();
  Printstring(_imp_str_literal("    %Integer %Array B (0 : 10), "));
  Newline();
  Printstring(_imp_str_literal("    %Integer C)                 "));
  Newlines(2);
  Printstring(_imp_str_literal("RC (%Record (RC) %Name  Next,   "));
  Newline();
  Printstring(_imp_str_literal("    %Record (RB) %Array B (0:3),"));
  Newline();
  Printstring(_imp_str_literal("    %Integer %Array C (1:10))   "));
  Newlines(2);
  Printstring(_imp_str_literal("RD (%Integer A  %orc            "));
  Newline();
  Printstring(_imp_str_literal("    %Byte %Array B (0:10)       "));
  Newlines(3);
  Printstring(_imp_str_literal("Variables: "));
  Newline();
  Printstring(_imp_str_literal("---------  "));
  Newline();
  Printstring(_imp_str_literal("%Integer K "));
  Newline();
  Printstring(_imp_str_literal("%Integer L "));
  Newline();
  Printstring(_imp_str_literal("%Integer M "));
  Newline();
  Printstring(_imp_str_literal("%Integer N "));
  Newlines(2);
  Printstring(
      _imp_str_literal("%Integer %Array        J (1:3, -1:1, 0:1023, -1:0)"));
  Newline();
  Printstring(_imp_str_literal("%String(255) %Array    S (12000 : 12010)"));
  Newline();
  Printstring(_imp_str_literal("%Byte %Integer %Array  B (Low : High)"));
  Newlines(2);
  Printstring(_imp_str_literal("%Record (RA)         Rec A"));
  Newline();
  Printstring(_imp_str_literal("%Record (RB) %Array  Rec B (10 : 13)"));
  Newline();
  Printstring(_imp_str_literal("%Record (RC) %Array  Rec C (1 : 3)"));
  Newlines(2);
  Printstring(_imp_str_literal("%Record (RD)         Rec D"));
  Newline();
  Newlines(3);
  Printstring(_imp_str_literal("%Name Variables                 "));
  Newline();
  Printstring(_imp_str_literal("---------------                 "));
  Newline();
  Printstring(_imp_str_literal("%Integer      %Name PInt1, PInt2"));
  Newline();
  Printstring(_imp_str_literal("%String(255)  %Name PStr        "));
  Newline();
  Printstring(_imp_str_literal("%Record (RC) %Name  PRC, PRC2   "));
  Newline();
  Printstring(_imp_str_literal("%Record (RC) %Array %Name  PRCA "));
  Newline();
  Printstring(_imp_str_literal("%Integer     %Array %Name  PIntA"));
  Newline();
  Newlines(5);
  Newlines(3);
  Printstring(_imp_str_literal("Check the SIZE OF Function for Structures."));
  Newline();
  Printstring(_imp_str_literal("------------------------------------------"));
  Newlines(2);
  Printstring(_imp_str_literal("SIZE OF (S) ="));
  Write(Sizeof(S), 1);
  if (Sizeof(S) == 2816)
    Pass();
  else
    Fail();
  Newline();
  Printstring(_imp_str_literal("SIZE OF (J) ="));
  Write(Sizeof(J), 1);
  if (Sizeof(J) == 73728)
    Pass();
  else
    Fail();
  Newline();
  Printstring(_imp_str_literal("SIZE OF (B) ="));
  Write(Sizeof(B), 1);
  if (Sizeof(B) == 256)
    Pass();
  else
    Fail();
  Newlines(2);
  Printstring(_imp_str_literal("SIZE OF (Rec A) ="));
  Write(Sizeof(Reca), 1);
  if (Sizeof(Reca) == 4)
    Pass();
  else
    Fail();
  Newline();
  Printstring(_imp_str_literal("SIZE OF (Rec B) ="));
  Write(Sizeof(Recb), 1);
  if (Sizeof(Recb) == 208)
    Pass();
  else
    Fail();
  Newline();
  Printstring(_imp_str_literal("SIZE OF (Rec C) ="));
  Write(Sizeof(Recc), 1);
  if (Sizeof(Recc) == 756)
    Pass();
  else
    Fail();
  Newline();
  Printstring(_imp_str_literal("SIZE OF (Rec D) ="));
  Write(Sizeof(Recd), 1);
  if (Sizeof(Recd) == 12)
    Pass();
  else
    Fail();
  Newlines(2);
  Printstring(_imp_str_literal("SIZE OF (PInt1) ="));
  Write(Sizeof(*Pint1), 1);
  if (Sizeof(*Pint1) == 4)
    Pass();
  else
    Fail();
  Newline();
  Printstring(_imp_str_literal("SIZE OF (PStr) ="));
  Write(Sizeof(*Pstr), 1);
  if (Sizeof(*Pstr) == 256)
    Pass();
  else
    Fail();
  Newline();
  Printstring(_imp_str_literal("SIZE OF (PRCA) ="));
  Write(Sizeof(Prca), 1);
  if (Sizeof(Prca) == 756)
    Pass();
  else
    Fail();
  Newline();
  Newlines(3);
  Printstring(_imp_str_literal("Check Assignment to Structured Elements"));
  Newline();
  Printstring(_imp_str_literal("---------------------------------------"));
  Newlines(2);
  for (K = 12000; K <= 12010; K++) S[K] = Tostring('A' + K - 12000);
  for (K = 0; K <= 255; K++) B[K] = Cb[265 - K];
  Acc = 0;
  for (K = 1; K <= 3; K++)
    for (L = -1; L <= 1; L++)
      for (M = 0; M <= 1023; M++)
        for (N = -1; N <= 0; N++) {
          Acc++;
          J[K][L][M][N] = Acc;
        }
  Reca.A = 4;
  if (Reca.A == 4)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Rec A_A = 4"));
  Newline();
  K = J[2][0][500][0];
  if (J[1][-1][0][-1] == 1 && J[3][1][1023][0] == 18432 && K == 9194)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("%INTEGER %ARRAY assignment and access."));
  Newline();
  for (K = 0; K <= 255; K++) {
    Write(K, 1);
    Printsymbol(':');
    Write(B[K], 0);
    if (!(K & 7))
      Newline();
    else
      Spaces(2);
  }
  Newline();
  if (B[0] == 50 && B[180] == 40 && B[240] == 20 && B[255] == 10)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("%BYTE %INTEGER %ARRAY assignment and access."));
  Newline();
  B[0] = 1;
  B[1] = 2;
  B[2] = 3;
  B[3] = 4;
  B[4] = 5;
  B[5] = 200;
  L = B[B[B[B[B[B[0]]]]]];
  if (L == 200)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Accessing element:  B(B(B(B(B(B(0))))))"));
  Newline();
  T = _imp_join(
      S[12000],
      _imp_join(S[12001],
                _imp_join(S[12002],
                          _imp_join(S[12003], _imp_join(S[12004], S[12005])))));
  T = _imp_join(
      T,
      _imp_join(S[12006],
                _imp_join(S[12007],
                          _imp_join(S[12008], _imp_join(S[12009], S[12010])))));
  if (T == _imp_str_literal("ABCDEFGHIJK"))
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("%STRING %ARRAY assignment and access."));
  Newlines(2);
  for (L = 10; L <= 13; L++) {
    Recb[L].A = Reca.A + 1;
    for (K = 0; K <= 10; K++) Recb[L].B[K] = K;
    Recb[L].C = 0;
    for (K = 0; K <= 10; K++) Recb[L].C = Recb[L].C + Recb[L].B[K];
    Recb[L].C = Recb[L].C + L;
  }
  Errors = 0;
  for (K = 10; K <= 13; K++)
    if (Recb[K].C != K + 55) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Assignment and accessing REC A and REC B"));
  Newline();
  for (K = 1; K <= 3; K++) {
    if (K == 3)
      L = 1;
    else
      L = K + 1;
    Recc[K].Next = &Recc[L];
    for (L = 1; L <= 10; L++) Recc[K].C = (K - 1) * 10 + L;
    Recc[K].B[1] = 0;
    Recc[K].B[2] = Recb[10 + K];
    Recc[K].B[2].A = K;
    Recc[K].B[3].A = 10 * K;
    for (L = 0; L <= 10; L++) Recc[K].B[3].B[L] = L;
    Recc[K].B[3].C = -K;
  }
  if (Recc[1].C == 5 && Recc[2].C == 16 && Recc[3].C == 27)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Assignment to REC C(?)_C array."));
  Newline();
  Errors = 0;
  for (K = 1; K <= 3; K++)
    if (Recc[K].B[1].A != 0 || Recc[K].B[1].C != 0) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Simple assignment to Rec C(?)_B(1)_A and _C"));
  Newline();
  Errors = 0;
  for (K = 1; K <= 3; K++) {
    Acc = 0;
    for (L = 0; L <= 10; L++) Acc += Recc[K].B[1].B[L];
    if (Acc) Errors++;
  }
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Array assignment to Rec C(?)_B(1)_B(?)"));
  Newline();
  Errors = 0;
  for (K = 1; K <= 3; K++) {
    if (Recc[K].B[2].A != K || Recc[K].B[3].A != K * 10 ||
        Recc[K].B[2].C != 55 + K + 10 || Recc[K].B[3].C != -K)
      Errors++;
  }
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Simple assignment to Rec C(?)_B(2)_A and _C"));
  Newline();
  Errors = 0;
  for (K = 1; K <= 3; K++) {
    Acc = 0;
    for (L = 0; L <= 10; L++) Acc += Recc[K].B[3].B[L];
    if (Acc != 55) Errors++;
  }
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Array assignment to Rec C(?)_B(3)_B(?)"));
  Newline();
  Recd = 0;
  if (!Recd.A)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Rec D = 0"));
  Newline();
  for (K = 0; K <= 10; K++) Recd.B[K] = *Charno(T, K + 1);
  T = _imp_str_literal("");
  for (K = 0; K <= 10; K++) T = _imp_join(T, Tostring(Recd.B[K]));
  if (T == _imp_str_literal("ABCDEFGHIJK"))
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Simple assignment to Rec D_B(?)"));
  Newline();
  Recd.A = -256;
  if (Recd.A == -256 && Recd.B[4] == 'E')
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Assignment to alternative fields within Rec D"));
  Newlines(2);
  Newlines(2);
  Printstring(_imp_str_literal("Test the Pointer Variables"));
  Newline();
  Printstring(_imp_str_literal("--------------------------"));
  Newlines(2);
  K = 2;
  L = 3;
  Pint1 = &K;
  Pint2 = &L;
  if (*Pint1 == 2 && *Pint2 == 3)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Reference to integer variable."));
  Newline();
  Errors = 0;
  *Pint1 = 4;
  if (K != 4) Errors++;
  K = 5;
  if (*Pint1 != 5) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Accessing %Integer directly and by reference."));
  Newline();
  Errors = 0;
  if (Pint1 == Pint2) Errors++;
  if (Pint1 == Pint2) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Comparison of reference variables."));
  Newline();
  *Pint1 = *Pint2;
  if (K == 3 && Pint1 != Pint2)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PInt1 = PInt2  does not affect reference."));
  Newline();
  Pint1 = Pint2;
  if (K == 3 && Pint1 == Pint2)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PInt1 == PInt2  does affect reference."));
  Newline();
  if (K == 3 && L == 3)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Simple variables unaffected by dereference."));
  Newline();
  Errors = 0;
  Pstr = &T;
  if (*Pstr != _imp_str_literal("ABCDEFGHIJK")) Errors++;
  *Pstr = _imp_str_literal("New");
  if (T != _imp_str_literal("New")) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Reference to a String variable."));
  Newlines(2);
  *Prca = &Recc;
  Prc = &Recc[3];
  if (&Prca(2).Next == Prc)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Record Array reference and access."));
  Newline();
  *Pinta = &Prca(3).C;
  Acc = 0;
  for (L = 1; L <= 10; L++) Acc += Pinta(L);
  if (Acc == 255)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal(
      "Integer array reference via a Record Array reference."));
  Newlines(2);
  Prc = &Recc[1];
  Prc2 = &Recc[2];
  if (Prc != Prc2)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PRC ## PRC2"));
  Newline();
  if (Prc != Prc2)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PRC == PRC2"));
  Newline();
  if (&Prc->Next == Prc)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PRC_Next_Next_Next == PRC"));
  Newline();
  Prc = &Nil;
  if (Prc == &Nil && Prc != Prc2 && &Nil == Prc)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PRC == Nil  does affect reference."));
  Newline();
  Prc2 = &Nil;
  if (Prc == Prc2)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PRC == PRC2  comparison for NIL."));
  Newlines(2);
  Newlines(2);
  Printstring(
      _imp_str_literal("Test the Address Modification of %Name Variables"));
  Newline();
  Printstring(
      _imp_str_literal("------------------------------------------------"));
  Newlines(2);
  Pint1 = Pinta;
  if (*Pint1 == 25 && Pint1 == 23 && Pint1 == 30)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Integer Array Address modification."));
  Newline();
  Prc = &Recc[2];
  if (Prc->C == 11 && Prc == 1 && Prc == 21)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Record Array Address modification."));
  Newlines(2);
  Newlines(2);
  Printstring(_imp_str_literal("Test the ADDR Function and Access Maps"));
  Newline();
  Printstring(_imp_str_literal("--------------------------------------"));
  Newlines(2);
  Pint1 = &K;
  if (Pint1 == Integer(Addr(K)))
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PInt1 == INTEGER (ADDR (K))"));
  Newline();
  Pstr = &T;
  if (Pstr == String(Addr(T)))
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PSTR == STRING (ADDR (T))"));
  Newline();
  Prc = &Recc[2];
  if (Prc == Record(Addr(Recc[2])))
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("PRC == RECORD (ADDR (Rec C(2))"));
  Newline();
  Selectoutput(0);
  Write(Failures, 1);
  Printstring(_imp_str_literal(" failure(s)"));
  Newline();
  exit(0);
  return (1);
}
