#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];

  //     7    %integernamearray ina(0:9)

  int *INA[10];

  //     8    %integernamearrayname inan

  int **INAN;

  //     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 [/*BUG*/ 0];
  } /* 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 *)[/*BUG*/ 0];

  //    26    inan(i) = x

  *[/*BUG*/ 0] = X;

  //    27    x = inan(i)

  X = *[/*BUG*/ 0];

  //    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:;
}