#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:;
}