#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  ! File of externals followed by a main program.
//     2
//     3  %recordformat rf ( %integer i, %real r, %integer rf)  ;! Are record format vars in a sub-scope?  Or is it just that formats are in a different name space?

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

//     4
//     5  ! owns and externals are simpler declarations
//     6  %externalinteger xi1

int XI1;

//     7  %externalintegername xin1

int *XIN1;

//     8  %externalreal xr1

float XR1;

//     9  %externalinteger xi2,xi3

int XI2;
int XI3;

//    10  %externalreal xcr1 = 3.1415

float XCR1 = 3.1415;

//    11  %externalrealarray xra1(0:9)

float XRA1[10];

//    12  %externalrealarrayname xran1

float *XRAN1;

//    13  %externallongreal xclr1 = 3.1415

double XCLR1 = 3.1415;

//    14  %externallongrealarray xlra1(0:9)

double XLRA1[10];

//    15  %externallongrealarrayname xlran1

double *XLRAN1;

//    16  %externalintegernamearray xina1(0:9)

int *XINA1[10];

//    17  %externalintegernamearrayname xinan1

int **XINAN1;

//    18
//    19  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//    20
//    21  %begin

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

  //    22    %integer %array ia3, ia4(1:10), ia5(2:11,0:1,0:2)

  int IA3[10];
  int IA4[10];
  int IA5[10][2][3];

  //    23    %integernamearray in3a1(2:11,0:1,0:2)

  int *IN3A1[10][2][3];

  //    24
  //    25  xi1 = 123

  XI1 = 123;

  //    26    xin1 == xi1

  XIN1 = (int *)/*?*/ &XI1;

  //    27    xin1 = xi1

  *XIN1 = XI1;

  //    28
  //    29    xr1 = 1.23

  XR1 = 1.23;

  //    30    xr1 = xra1(4)

  XR1 = XRA1[4];

  //    31    xra1(4) = xr1

  XRA1[4] = XR1;

  //    32    xclr1 = 3.1415

  XCLR1 = 3.1415;

  //    33    xlra1(4) = xclr1

  XLRA1[4] = XCLR1;

  //    34    xclr1 = xlra1(4)

  XCLR1 = XLRA1[4];

  //    35    xina1(4) == xi1

  XINA1[4] = (int *)/*?*/ &XI1;

  //    36    xina1(4) = xi1

  *XINA1[4] = XI1;

  //    37    xinan1 == xina1

  XINAN1 = (int *)XINA1;

  //    38    xinan1(4) == xi1

  [/*BUG*/ 0] = (int *)/*?*/ &XI1;

  //    39    xinan1(4) == xin1

  [/*BUG*/ 0] = (int *)XIN1;

  //    40
  //    41
  //    42    ia3(4) = xi1

  IA3[3] = XI1;

  //    43    ia4(4) = xi1

  IA4[3] = XI1;

  //    44    ia5(5,0,2) = xi1

  IA5[3][0][2] = XI1;

  //    45    xi1 = ia5(5,0,2)

  XI1 = IA5[3][0][2];

  //    46    in3a1(6,1,1) == xi1

  IN3A1[4][1][1] = (int *)/*?*/ &XI1;

  //    47    xi1 = in3a1(6,1,1)

  XI1 = *IN3A1[4][1][1];

  //    48
  //    49  %endofprogram

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