#include <perms.h>

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

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);
  auto void DO(float BEFORE, int (*FN)(int P, int Q), unsigned char AFTER);

  //     2    %routinespec do(%real before, %integerfn fn(%integer p,q), %byteinteger after)
  //     3
  //     4    %integerfn sum(%integer a,b)

  int SUM(int A, int B) {
    //     5      %result = a+b

    return A + B;

    //     6    %end

  } /* end of SUM */

  //     7
  //     8    do(3.14, sum, 240)

  DO(3.14, SUM, 240);

  //     9
  //    10    %routine do(%real before, %integerfn fn(%integer p,q), %byteinteger after)

  void DO(float BEFORE, int (*FN)(int P, int Q), unsigned char AFTER) {
    //    11      %integer i

    int I;

    //    12      i = fn(1,2)

    I = FN(1, 2);

    //    13      write(i, -1); newline

    _imp_WRITE(I, -1);
    _imp_NEWLINE();

    //    14    %end

    return;
  } /* end of DO */

  // ?AFTER unused
  // ?BEFORE unused
  //    15
  //    16  %endofprogram

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