#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,mult)

  int FACT(int N, int MULT) {
    //     5        %IF N<=1 %THENRESULT=mult

    if (N > 1) goto L_0001;
    return MULT;
  L_0001:;

  //     6        %RESULT=FACT(N-1,mult*N)

    return FACT(N - 1, MULT * N);

    //     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,1),I*FACT(I-1,1)) %FOR I=2,1,100

  // %for I = 2, 1, 100 %cycle
  {
    I = 1;
  L_0003:
    if (I == 100) goto L_0004;
    I += 1;
    COMPARE(FACT(I, 1), I * FACT(I - 1, 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:;
}