#include <perms.h>
int _imp_mainep(int _imp_argc, char **_imp_argv) {
  _imp_string Param;
  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"));
    Newline();
  }
  void Fail(void) {
    Printstring(_imp_str_literal("FAIL"));
    Newline();
    Failures++;
  }
  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("%RECORD, %ARRAY and %NAME Validation"));
  Newline();
  Printstring(_imp_str_literal("===================================="));
  Newlines(3);
  Printstring(_imp_str_literal("Check the SIZE OF Function for Structures."));
  Newline();
  Printstring(_imp_str_literal("------------------------------------------"));
  Newline();
  if (Sizeof(S) == 2816)
    Pass();
  else
    Fail();
  if (Sizeof(J) == 73728)
    Pass();
  else
    Fail();
  if (Sizeof(B) == 256)
    Pass();
  else
    Fail();
  if (Sizeof(Reca) == 4)
    Pass();
  else
    Fail();
  if (Sizeof(Recb) == 208)
    Pass();
  else
    Fail();
  if (Sizeof(Recc) == 756)
    Pass();
  else
    Fail();
  if (Sizeof(Recd) == 12)
    Pass();
  else
    Fail();
  if (Sizeof(*Pint1) == 4)
    Pass();
  else
    Fail();
  if (Sizeof(*Pstr) == 256)
    Pass();
  else
    Fail();
  if (Sizeof(Prca) == 756)
    Pass();
  else
    Fail();
  Newlines(3);
  Printstring(_imp_str_literal("Check Assignment to Structured Elements"));
  Newline();
  Printstring(_imp_str_literal("---------------------------------------"));
  Newline();
  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();
  K = J[2][0][500][0];
  if (J[1][-1][0][-1] == 1 && J[3][1][1023][0] == 18432 && K == 9194)
    Pass();
  else
    Fail();
  Errors = 0;
  for (K = 0; K <= 255; K++)
    if (B[K] != Cb[265 - K]) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  if (B[0] == 50 && B[180] == 40 && B[240] == 20 && B[255] == 10)
    Pass();
  else
    Fail();
  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();
  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();
  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();
  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();
  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();
  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();
  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();
  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();
  Recd = 0;
  if (!Recd.A)
    Pass();
  else
    Fail();
  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();
  Recd.A = -256;
  if (Recd.A == -256 && Recd.B[4] == 'E')
    Pass();
  else
    Fail();
  Newlines(2);
  Printstring(_imp_str_literal("Test the Pointer Variables"));
  Newline();
  Printstring(_imp_str_literal("--------------------------"));
  Newline();
  K = 2;
  L = 3;
  Pint1 = &K;
  Pint2 = &L;
  if (*Pint1 == 2 && *Pint2 == 3)
    Pass();
  else
    Fail();
  Errors = 0;
  *Pint1 = 4;
  if (K != 4) Errors++;
  K = 5;
  if (*Pint1 != 5) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  Errors = 0;
  if (Pint1 == Pint2) Errors++;
  if (Pint1 == Pint2) Errors++;
  if (!Errors)
    Pass();
  else
    Fail();
  *Pint1 = *Pint2;
  if (K == 3 && Pint1 != Pint2)
    Pass();
  else
    Fail();
  Pint1 = Pint2;
  if (K == 3 && Pint1 == Pint2)
    Pass();
  else
    Fail();
  if (K == 3 && L == 3)
    Pass();
  else
    Fail();
  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();
  *Prca = &Recc;
  Prc = &Recc[3];
  if (&Prca(2).Next == Prc)
    Pass();
  else
    Fail();
  *Pinta = &Prca(3).C;
  Acc = 0;
  for (L = 1; L <= 10; L++) Acc += Pinta(L);
  if (Acc == 255)
    Pass();
  else
    Fail();
  Prc = &Recc[1];
  Prc2 = &Recc[2];
  if (Prc != Prc2)
    Pass();
  else
    Fail();
  if (Prc != Prc2)
    Pass();
  else
    Fail();
  if (&Prc->Next == Prc)
    Pass();
  else
    Fail();
  Prc = &Nil;
  if (Prc == &Nil && Prc != Prc2 && &Nil == Prc)
    Pass();
  else
    Fail();
  Prc2 = &Nil;
  if (Prc == Prc2)
    Pass();
  else
    Fail();
  Newlines(2);
  Printstring(
      _imp_str_literal("Test the Address Modification of %Name Variables"));
  Newline();
  Printstring(
      _imp_str_literal("------------------------------------------------"));
  Newline();
  Pint1 = Pinta;
  if (*Pint1 == 25 && Pint1 == 23 && Pint1 == 30)
    Pass();
  else
    Fail();
  Prc = &Recc[2];
  if (Prc->C == 11 && Prc == 1 && Prc == 21)
    Pass();
  else
    Fail();
  Newlines(2);
  Printstring(_imp_str_literal("Test the ADDR Function and Access Maps"));
  Newline();
  Printstring(_imp_str_literal("--------------------------------------"));
  Newline();
  Pint1 = &K;
  if (Pint1 == Integer(Addr(K)))
    Pass();
  else
    Fail();
  Pstr = &T;
  if (Pstr == String(Addr(T)))
    Pass();
  else
    Fail();
  Prc = &Recc[2];
  if (Prc == Record(Addr(Recc[2])))
    Pass();
  else
    Fail();
  Selectoutput(0);
  Write(Failures, 1);
  Printstring(_imp_str_literal(" failure(s)"));
  Newline();
  exit(0);
  return (1);
}
