#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

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

  //     2    %on %event 3,4,9 %start

  if (!_imp_on_event(3, 4, 9)) goto L_0001;

    //     3      printstring("EM CHAR IN STMNT - DISASTER"); newline

  _imp_PRINTSTRING(_imp_str_literal("EM CHAR IN STMNT - DISASTER"));
  _imp_NEWLINE();

  //     4      %stop

  _imp_stop(0);

  //     5    %finish

L_0001:;

//     6    %integerfn x

  int X(void) {
    //     7    %integer j,k

    int J;
    int K;

    //     8    %if j=k %then j=j %else %if k=j %then k=k %else %if j=k %then k=j %else %start

    if (J != K) goto L_0002;
    J = J;
    goto L_0003;
  L_0002:;
    if (K != J) goto L_0004;
    K = K;
    goto L_0003;
  L_0004:;
    if (J != K) goto L_0005;
    K = J;
    goto L_0003;
  L_0005:;

  //     9      %begin

    { /*%begin*/

      //    10        k=j

      K = J;

      //    11        %return   ;! NOT HANDLED PROPERLY. In some version of Imp77 this is a return from the begin/end block.

      goto end_1000;

      //    12      %end

    end_1000:;
    }

    //    13    %finish

  L_0003:;

  //    14    %result=1

    return 1;

    //    15    %end

  } /* end of X */

  //    16    %integer y

  int Y;

  //    17    %cycle

L_0006:;

//    18      y=x

  Y = X();

  //    19    %repeat %until x=y

  if (X() == Y) goto L_0007;
  goto L_0006;
L_0007:;

//    20  %endofprogramm

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