#include <perms.h>

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

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

  //     2
  //     3    %integer x, i

  int X;
  int I;

  //     4
  //     5    %integername in

  int *IN;

  //     6    %integerarray ira(0:9)

  int IRA[10];
  struct _imp_dv IRA_dv = {IRA, sizeof(int) /*, dims, <bounds> */};

  //     7    %integernamearray ina(0:9)

  int *INA[10];
  struct _imp_dv INA_dv = {INA, sizeof(int *) /*, dims, <bounds> */};

  //     8    %integernamearrayname inan

  int **INAN;
  struct _imp_dv INAN_dv = {0};  // assignment of an array to an arrayname must copy bounds info too...

  //     9    %integermap im(%integer i); %result == i; %end

  int *IM(int I) { return /*?*/ &I; } /* end of IM */

  //    10    %integermap im2(%integer i); %result == in; %end

  int *IM2(int I) { return IN; } /* end of IM2 */

  // ?I unused
  //    11    %integermap im3(%integer i); %result == ira(i); %end

  int *IM3(int I) { return /*?*/ &IRA[I]; } /* end of IM3 */

  //    12    %integermap im4(%integer i); %result == ina(i); %end

  int *IM4(int I) { return INA[I]; } /* end of IM4 */

  //    13    %integermap im5(%integer i); %result == inan(i); %end

  int *IM5(int I) { return INAN[/*BUG*/ I]; } /* end of IM5 */

  //    14    in == i

  IN = (int *)/*?*/ &I;

  //    15    x = i

  X = I;

  //    16    x = in

  X = *IN;

  //    17    x = ira(i)

  X = IRA[I];

  //    18    in == ira(i)

  IN = (int *)/*?*/ &IRA[I];

  //    19    x = ira(i)

  X = IRA[I];

  //    20    ira(i) = i

  IRA[I] = I;

  //    21    in == ina(i)

  IN = (int *)INA[I];

  //    22    x = ina(i)

  X = *INA[I];

  //    23    ina(x) = i

  *INA[X] = I;

  //    24    inan == ina

  INAN = (int *)INA;

  //    25    in == inan(i)

  IN = (int *)INAN[/*BUG*/ I];

  //    26    inan(i) = x

  *INAN[/*BUG*/ I] = X;

  //    27    x = inan(i)

  X = *INAN[/*BUG*/ I];

  //    28    in == im(i)

  IN = (int *)IM(I);

  //    29    x = im(i)

  X = *IM(I);

  //    30    im(i) = x

  *IM(I) = X;

  //    31  %endofprogram

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