#include <perms.h>

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

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

  //     2    %recordformat fredfm (%integer a, %real b, %integer c)

  struct FREDFM {
    union {
      struct {
        int A;
        float B;
        int C;
      };
    };
  };

  //     3    %record (fredfm) fred = 0

  struct FREDFM FRED;
  FRED = (struct FREDFM){0};

  //     4    ! NOT ALLOWED: %record (fredfm) %name fredp == 0
  //     5    ! NOT ALLOWED: %record (fredfm) %name fredp = 0
  //     6    %record (fredfm) %name fredp == RECORD(0)

  struct FREDFM *FREDP;
  FREDP = (struct FREDFM *)_imp_RECORD(0);

  //     7
  //     8    %on %event * %start

  if (!_imp_on_event(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) goto L_0001;

    //     9      ! does not trap SIGSEGV !
    //    10      write(event_event,0); newline

  _imp_WRITE(_imp_EVENT().EVENT, 0);
  _imp_NEWLINE();

  //    11      %stop

  _imp_stop(0);

  //    12    %finish

L_0001:;

//    13
//    14    fred_a = 1; fred_b = 1.1; fred_c = 1

  FRED.A = 1;
  FRED.B = 1.1;
  FRED.C = 1;

  //    15    write(fred_a,0); write(fred_c,3); newline

  _imp_WRITE(FRED.A, 0);
  _imp_WRITE(FRED.C, 3);
  _imp_NEWLINE();

  //    16    fred = 0

  FRED = (struct FREDFM){0};

  //    17    write(fred_a,0); write(fred_c,3); newline

  _imp_WRITE(FRED.A, 0);
  _imp_WRITE(FRED.C, 3);
  _imp_NEWLINE();

  //    18
  //    19    fredp == fred

  FREDP = (struct FREDFM *)/*?*/ &FRED;

  //    20    fred_a = 1; fred_b = 1.1; fred_c = 1

  FRED.A = 1;
  FRED.B = 1.1;
  FRED.C = 1;

  //    21    write(fredp_a,0); write(fredp_c,3); newline

  _imp_WRITE(FREDP->A, 0);
  _imp_WRITE(FREDP->C, 3);
  _imp_NEWLINE();

  //    22
  //    23    fredp = 0

  *FREDP = (struct FREDFM){0};

  //    24    write(fred_a,0); write(fred_c,3); newline

  _imp_WRITE(FRED.A, 0);
  _imp_WRITE(FRED.C, 3);
  _imp_NEWLINE();

  //    25
  //    26  ! NOT ALLOWED: fredp == 0
  //    27    fredp == RECORD(0)

  FREDP = (struct FREDFM *)_imp_RECORD(0);

  //    28    !write(fredp_a,0); write(fredp_c,3); newline ;! "Segmentation fault" as expected
  //    29  %endofprogram

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