#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  !%permroutinespec    write(%integer  v,p);
//     2  !%permroutinespec    newline
//     3  !%primintegerfnspec      addr(%name p)
//     4  !%primintegerfnspec      typeof(%name n)
//     5  !%primintegerfnspec      sizeof(%name n)
//     6
//     7  %begin

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

  //     8    %routine test(%name param)

  void TEST(_imp_name * PARAM) {
    //     9      write(addr(param),0)  ; newline

    _imp_WRITE(_imp_ADDR(PARAM), 0);
    _imp_NEWLINE();

    //    10      write(sizeof(param),0); newline

    _imp_WRITE(_imp_SIZEOF(PARAM), 0);
    _imp_NEWLINE();

    //    11      write(typeof(param),0); newline

    _imp_WRITE(_imp_TYPEOF(PARAM), 0);
    _imp_NEWLINE();

    //    12    %end

    return;
  } /* end of TEST */

  //    13
  //    14    %integerarray ia1(3:5)

  int IA1[3];

  //    15
  //    16    %integerarray ia2(2:4,3:6)

  int IA2[3][4];

  //    17
  //    18
  //    19    write(addr(ia1),0)  ; newline

  _imp_WRITE(_imp_ADDR(IA1), 0);
  _imp_NEWLINE();

  //    20    write(addr(ia1(3)),0)  ; newline

  _imp_WRITE(_imp_ADDR(/*?*/ &IA1[0]), 0);
  _imp_NEWLINE();

  //    21    write(sizeof(ia1),0); newline

  _imp_WRITE(_imp_SIZEOF(IA1), 0);
  _imp_NEWLINE();

  //    22    write(typeof(ia1),0); newline

  _imp_WRITE(_imp_TYPEOF(IA1), 0);
  _imp_NEWLINE();

  //    23    test(ia1)

  TEST(IA1);

  //    24
  //    25    write(addr(ia2),0)  ; newline

  _imp_WRITE(_imp_ADDR(IA2), 0);
  _imp_NEWLINE();

  //    26    write(addr(ia2(2,3)),0)  ; newline

  _imp_WRITE(_imp_ADDR(/*?*/ &IA2[0][0]), 0);
  _imp_NEWLINE();

  //    27    write(sizeof(ia2),0); newline

  _imp_WRITE(_imp_SIZEOF(IA2), 0);
  _imp_NEWLINE();

  //    28    write(typeof(ia2),0); newline

  _imp_WRITE(_imp_TYPEOF(IA2), 0);
  _imp_NEWLINE();

  //    29    test(ia2)

  TEST(IA2);

  //    30
  //    31  %endofprogram

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