#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %BEGIN
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
// 2 %owninteger fail=0
static int FAIL = 0;
// 3 %INTEGER I
int I;
// 4 %INTEGERFN FACT(%INTEGER N)
int FACT(int N) {
// 5 %IF N<=1 %THENRESULT=1
if (N > 1) goto L_0001;
return 1;
L_0001:;
// 6 %RESULT=N*FACT(N-1)
return N * FACT(N - 1);
// 7 %END
} /* end of FACT */
// 8 %ROUTINE COMPARE(%INTEGER I,J)
void COMPARE(int I, int J) {
// 9 %UNLESS I=J %START
if (I == J) goto L_0002;
// 10 PRINTSTRING("ERROR")
_imp_PRINTSTRING(_imp_str_literal("ERROR"));
// 11 WRITE(I,5); WRITE(J,5)
_imp_WRITE(I, 5);
_imp_WRITE(J, 5);
// 12 Fail=1; NEWLINE
FAIL = 1;
_imp_NEWLINE();
// 13 %FINISH
L_0002:;
// 14 %END
return;
} /* end of COMPARE */
// 15 COMPARE(FACT(I),I*FACT(I-1)) %FOR I=2,1,10
// %for I = 2, 1, 10 %cycle
{
I = 1;
L_0003:
if (I == 10) goto L_0004;
I += 1;
COMPARE(FACT(I), I * FACT(I - 1));
goto L_0003;
}
L_0004:;
// 16 %if fail=0 %then printstring("TEST OK")
if (FAIL != 0) goto L_0006;
_imp_PRINTSTRING(_imp_str_literal("TEST OK"));
L_0006:;
// 17 %ENDOFPROGRAM
_imp_stop(0);
return 0;
end_0:;
}