#include <perms.h>

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

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

  //     2
  //     3     %on %event 15 %start

  if (!_imp_on_event(15)) goto L_0001;

    //     4       print string("END OF DIAGNOSTICS"); newline

  _imp_PRINTSTRING(_imp_str_literal("END OF DIAGNOSTICS"));
  _imp_NEWLINE();

  //     5       %stop

  _imp_stop(0);

  //     6     %finish

L_0001:;

//     7
//     8     %routine the procedure(%integer i)

  void THEPROCEDURE(int I) {
    //     9       %integer local variable

    int LOCALVARIABLE;

    //    10       local variable = i

    LOCALVARIABLE = I;

    //    11
    //    12       %on %event 15 %start

    if (!_imp_on_event(15)) goto L_0002;

      //    13         print string("Entered from THEPROCEDURE "); write(i, -1); newlines(2)

    _imp_PRINTSTRING(_imp_str_literal("Entered from THEPROCEDURE "));
    _imp_WRITE(I, -1);
    _imp_NEWLINES(2);

    //    14         print string("LOCALVARIABLE = "); write(local variable, 0); newline

    _imp_PRINTSTRING(_imp_str_literal("LOCALVARIABLE = "));
    _imp_WRITE(LOCALVARIABLE, 0);
    _imp_NEWLINE();

    //    15         ! For comparative testing: Vax compiler needs event_extra not event_info
    //    16         %signal 15, event_sub, event_info  { pass up one level to caller }

    _imp_signal(15, _imp_EVENT().SUB, _imp_EVENT().INFO, "");

    //    17       %finish

  L_0002:;

  //    18
  //    19       %signal 15, 1 %if i >= 10

    if (I < 10) goto L_0003;
    _imp_signal(15, 1, 0, "");
  L_0003:;

  //    20       the procedure(i+3)

    THEPROCEDURE(I + 3);

    //    21     %end

    return;
  } /* end of THEPROCEDURE */

  //    22
  //    23     the procedure(1)

  THEPROCEDURE(1);

  //    24
  //    25  %endofprogram

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