#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %externalroutine whatever(%integer x)

void WHATEVER(int X) {
  //     2  %end

  return;
} /* end of WHATEVER */

// ?X unused
//     3
//     4  %externalroutine xr1(%routine fred(%integer p2))

void XR1(void (*FRED)(int P2)) {
  //     5    %real r1

  float R1;

  //     6  %end

  return;
} /* end of XR1 */

// ?R1 unused
// ?FRED unused
//     7
//     8  ! Should translate to:
//     9
//    10  ! void xr1(void (*fred)(int p2)) {
//    11  !   float r1;
//    12  ! }
//    13
//    14
//    15  %externalintegermap xm1(%routine fred(%integer p2))

int *XM1(void (*FRED)(int P2)) {
  //    16    %owninteger oi1

  static int OI1;

  //    17    %result == oi1

  return /*?*/ &OI1;

  //    18  %end

} /* end of XM1 */

// ?FRED unused
//    19
//    20  ! Should translate to:
//    21
//    22  ! int *xm1(void (*fred)(int p2)) {
//    23  !   static int oi1;
//    24  !   return &oi1;
//    25  ! }
//    26
//    27  %begin

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

  //    28    %integer i           ;! int I;

  int I;

  //    29    %integername zz      ;! int *ZZ;

  int *ZZ;

  //    30    zz == xm1(whatever)  ;! ZZ = XM1(&whatever);

  ZZ = (int *)XM1(WHATEVER);

  //    31    i = zz               ;! I = *ZZ;

  I = *ZZ;

  //    32  %end

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

//    33
//    34  %endoffile