#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1
//     2  %BEGIN

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     3  !***********************************************************************
  //     4  !*    TESTS SOME VERY NOTTED CONDITIONS FOR CONSISTENCY. NO OPUT IF OK *
  //     5  !***********************************************************************
  //     6  %INTEGER I,J,K

  int I;
  int J;
  int K;
  auto void A(void);

  auto void B(void);

  auto void C(void);

  //     7  %ROUTINESPEC A
  //     8  %ROUTINESPEC B
  //     9  %ROUTINESPEC C
  //    10        K=0

  K = 0;

  //    11        %CYCLE I=-1,1,1

  // %for I =  -1, 1, 1 %cycle
  {
    I = -2;
  L_0001:
    if (I == 1) goto L_0002;
    I += 1;

    //    12           %CYCLE J=0,1,3

    // %for J = 0, 1, 3 %cycle
    {
      J = -1;
    L_0004:
      if (J == 3) goto L_0005;
      J += 1;

      //    13              %IFNOTNOTNOTNOT I=1 %THEN A %ELSE B

      if (I != 1) goto L_0007;
      A();
      goto L_0008;
    L_0007:;
      B();
    L_0008:;

    //    14              %IFNOT (%NOT I=1) %THEN A %ELSE B

      if (I != 1) goto L_0009;
      A();
      goto L_000A;
    L_0009:;
      B();
    L_000A:;

    //    15              %IF I=1 %THEN A %ELSE B

      if (I != 1) goto L_000B;
      A();
      goto L_000C;
    L_000B:;
      B();
    L_000C:;

    //    16              C

      C();

      //    17              %IFNOT I=1 %THEN A %ELSE B

      if (I == 1) goto L_000D;
      A();
      goto L_000E;
    L_000D:;
      B();
    L_000E:;

    //    18              %UNLESS I=1 %THEN A %ELSE B

      if (I == 1) goto L_000F;
      A();
      goto L_0010;
    L_000F:;
      B();
    L_0010:;

    //    19              C

      C();

      //    20              %IF I=1 %AND J#2 %THEN A %ELSE B

      if (I != 1) goto L_0011;
      if (J == 2) goto L_0011;
      A();
      goto L_0012;
    L_0011:;
      B();
    L_0012:;

    //    21              %IF I=1 %ANDNOT J=2 %THEN A %ELSE B

      if (I != 1) goto L_0013;
      if (J == 2) goto L_0013;
      A();
      goto L_0014;
    L_0013:;
      B();
    L_0014:;

    //    22              C

      C();

      //    23              %IF I=1 %OR 1<=J<=2 %THEN A %ELSE B

      if (I == 1) goto L_0015;
      {
        // Double-sided test on J (Part I)
        int tmp;
        if (1 > (tmp = J)) goto L_0016;
        // Double-sided test on J (Part II)
        if (tmp > 2) goto L_0016;
      }
    L_0015:;
      A();
      goto L_0017;
    L_0016:;
      B();
    L_0017:;

    //    24              %IF I=1 %OR (1<=J %AND J<=2) %THEN A %ELSE B

      if (I == 1) goto L_0018;
      if (1 > J) goto L_0019;
      if (J > 2) goto L_0019;
    L_0018:;
      A();
      goto L_001A;
    L_0019:;
      B();
    L_001A:;

    //    25              C

      C();

      //    26              %IF I=0=J %THEN A %ELSE B

      {
        // Double-sided test on 0 (Part I)
        int tmp;
        if (I != (tmp = 0)) goto L_001B;
        // Double-sided test on 0 (Part II)
        if (tmp != J) goto L_001B;
      }
      A();
      goto L_001C;
    L_001B:;
      B();
    L_001C:;

    //    27              %IF I=0 %AND J=0 %THEN A %ELSE B

      if (I != 0) goto L_001D;
      if (J != 0) goto L_001D;
      A();
      goto L_001E;
    L_001D:;
      B();
    L_001E:;

    //    28              C

      C();

      //    29           %REPEAT

      goto L_0004;
    }

  L_0005:;

  //    30        %REPEAT

    goto L_0001;
  }

L_0002:;

//    31        PRINTSTRING("PART 1 OK ")

  _imp_PRINTSTRING(_imp_str_literal("PART 1 OK "));

  //    32        %CYCLE I=-1,1,1

  // %for I =  -1, 1, 1 %cycle
  {
    I = -2;
  L_001F:
    if (I == 1) goto L_0020;
    I += 1;

    //    33           %CYCLE J=0,1,3

    // %for J = 0, 1, 3 %cycle
    {
      J = -1;
    L_0021:
      if (J == 3) goto L_0022;
      J += 1;

      //    34              %IF I=1 %ANDNOT J#1 %THEN A %ELSE B

      if (I != 1) goto L_0023;
      if (J != 1) goto L_0023;
      A();
      goto L_0024;
    L_0023:;
      B();
    L_0024:;

    //    35              %IF I=1 %ANDNOT (J#1) %THEN A %ELSE B

      if (I != 1) goto L_0025;
      if (J != 1) goto L_0025;
      A();
      goto L_0026;
    L_0025:;
      B();
    L_0026:;

    //    36              C

      C();

      //    37              %IF I=1 %ORNOT 1<=J<=2 %THEN A %ELSE B

      if (I == 1) goto L_0027;
      {
        // Double-sided test on J (Part I)
        int tmp;
        if (1 > (tmp = J)) goto L_0027;
        // Double-sided test on J (Part II)
        if (tmp <= 2) goto L_0028;
      }
    L_0027:;
      A();
      goto L_0029;
    L_0028:;
      B();
    L_0029:;

    //    38              %IF I=1 %ORNOT (1<=J %AND J<=2) %THEN A %ELSE B

      if (I == 1) goto L_002A;
      if (1 > J) goto L_002A;
      if (J <= 2) goto L_002B;
    L_002A:;
      A();
      goto L_002C;
    L_002B:;
      B();
    L_002C:;

    //    39              C

      C();

      //    40              %IF I=1 %AND J=2 %THEN A %ELSE B

      if (I != 1) goto L_002D;
      if (J != 2) goto L_002D;
      A();
      goto L_002E;
    L_002D:;
      B();
    L_002E:;

    //    41              %IFNOT (%NOT (I=1 %AND J=2)) %THEN A %ELSE B

      if (I != 1) goto L_002F;
      if (J != 2) goto L_002F;
      A();
      goto L_0030;
    L_002F:;
      B();
    L_0030:;

    //    42              C

      C();

      //    43           %REPEAT

      goto L_0021;
    }

  L_0022:;

  //    44        %REPEAT

    goto L_001F;
  }

L_0020:;

//    45        PRINTSTRING("TEST OK")

  _imp_PRINTSTRING(_imp_str_literal("TEST OK"));

  //    46  %ROUTINE A; K=K<<8!'A'; %END

  void A(void) {
    K = K << 8 | 65;
    return;
  } /* end of A */

  //    47  %ROUTINE B; K=K<<8!'B'; %END

  void B(void) {
    K = K << 8 | 66;
    return;
  } /* end of B */

  //    48  %ROUTINE C

  void C(void) {
    //    49        %IF K=M'AA' %OR K=M'BB' %OR K=M'AAA' %OR K=M'BBB' %THEN K=0 %ANDRETURN

    if (K == 16705) goto L_0003;
    if (K == 16962) goto L_0003;
    if (K == 4276545) goto L_0003;
    if (K != 4342338) goto L_0031;
  L_0003:;
    K = 0;
    return;
  L_0031:;

  //    50        WRITE(I,1); WRITE(J,1); WRITE(K,1)

    _imp_WRITE(I, 1);
    _imp_WRITE(J, 1);
    _imp_WRITE(K, 1);

    //    51        %MONITOR

    /*_imp_monitor(__LINE__, __FILE__, PRETTY_FUNCTION);*/

    //    52        %STOP

    _imp_stop(0);

    //    53  %END

  } /* end of C */

  //    54  %ENDOFPROGRAM

  _imp_stop(0);
  return 0;
end_0:;
}