#include <perms.h>

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

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

  //     2
  //     3    %recordformat RECFM (%integer I, J, K)

  struct RECFM {
    union {
      struct {
        int I;
        int J;
        int K;
      };
    };
  };

  //     4
  //     5    %begin

  { /*%begin*/

    //     6
    //     7      %routine SHOWREC(%record (RECFM) R)

    void SHOWREC(struct RECFM R) {
      //     8        print string("R_I = "); write(R_I, 0); newline

      _imp_PRINTSTRING(_imp_str_literal("R_I = "));
      _imp_WRITE(R.I, 0);
      _imp_NEWLINE();

      //     9      %end

      return;
    } /* end of SHOWREC */

    //    10
    //    11      %recordformat RECFM(%integer K, J, I)

    struct RECFM {
      union {
        struct {
          int K;
          int J;
          int I;
        };
      };
    };

    //    12
    //    13      %record (RECFM) %map FIRST

    struct RECFM *FIRST(void)
    {

      //    14        %own %record (RECFM) BEFORE

      static struct RECFM BEFORE;

      //    15        %result == BEFORE

      return /*?*/ &BEFORE;

      //    16      %end

    } /* end of FIRST */

    //    17
    //    18      FIRST_I = 17; FIRST_K = 42;

    FIRST()->I = 17;
    FIRST()->K = 42;

    //    19      SHOWREC(FIRST)

    SHOWREC(*FIRST());

    //    20
    //    21    %end

    goto end_1000;
  end_1000:;
  }

  //    22
  //    23  %endofprogram

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