#include <perms.h>

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

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

  //     2    %owninteger      io

  static int IO;

  //     3    %integer         i

  int I;

  //     4    %externalinteger ie

  int IE;

  //     5    %integerarray    ia(0:9)

  int IA[10];

  //     6    %integerfn       ifn

  int IFN(void) {
    //     7      %result = 1

    return 1;

    //     8    %end

  } /* end of IFN */

  //     9    %integermap      im

  int *IM(void)
  {

    //    10      %result ==  io

    return /*?*/ &IO;

    //    11    %end

  } /* end of IM */

  //    12    %routine         ir

  void IR(void) {
    //    13    %end

    return;
  } /* end of IR */

  //    14    %recordformat    rf(%integer i)

  struct RF {
    union {
      struct {
        int I;
      };
    };
  };

  //    15    %record(rf)%array  rec(0:9)

  struct RF REC[10];

  //    16    %switch          sw(0:9)

  int SW_index;
  int SW_line;
  char *SW_file;
  static const void *SW[10] = {&&case_SW_missing, &&case_SW_1,       &&case_SW_missing, &&case_SW_missing,
                               &&case_SW_missing, &&case_SW_missing, &&case_SW_missing, &&case_SW_missing,
                               &&case_SW_missing, &&case_SW_missing};

  //    17
  //    18
  //    19    io = 1

  IO = 1;

  //    20    %comment io = 1
  //    21    ie = 1

  IE = 1;

  //    22    %comment ie = 1
  //    23    ia(1) = 1

  IA[1] = 1;

  //    24    %comment ia(1) = 1
  //    25    i = ifn

  I = IFN();

  //    26    %comment i = ifn(1)
  //    27    i = im

  I = *IM();

  //    28    %comment i = im(1)
  //    29    rec(1)_i = 1

  REC[1].I = 1;

  //    30    %comment rec(1)_i = 1
  //    31    sw(1):

case_SW_1:;

//    32    %comment sw(1):
//    33    ir

  IR();

  //    34
  //    35  %endofprogram

  _imp_stop(0);
  return 0;

case_SW_dispatch:
  if (SW_index < 0 || SW_index > 9)
    _imp_signalf(6, 3, SW_index, "->SW(%d) out of bounds at %s line %d", SW_index, SW_file, SW_line);
  goto *SW[SW_index - 0];

case_SW_missing:
  _imp_signalf(8, 2, SW_index, "switch jump to undefined label SW(%d): at %s line %d", SW_index, SW_file, SW_line);
end_0:;
}