#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  ! Code to test %string
//     2  ! Would be interesting to try %string(30) to test alignment
//     3  ! Also similar test for %record (say 21 bytes per record?)
//     4  %begin

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

  //     5
  //     6    %routine test(%name param)         ;! ia1          ia2

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

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

    //     8      write(sizeof(param),0); newline  ;! 32           8

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

    //     9      write(typeof(param),0); newline  ;! 3            3

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

    //    10    %end

    return;
  } /* end of TEST */

  //    11
  //    12    %string(31)%array ia1(3:5)

  _imp_string31 IA1[3];

  //    13    %string(7)%array ia2(2:4,3:6)

  _imp_string7 IA2[3][4];

  //    14
  //    15    printstring( "Testing ia1"); newline

  _imp_PRINTSTRING(_imp_str_literal("Testing ia1"));
  _imp_NEWLINE();

  //    16    write(addr(ia1),0); newline     ;! 2145833816

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

  //    17    write(addr(ia1(3)),0); newline  ;! 2145833612

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

  //    18    write(sizeof(ia1),0); newline   ;! 32

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

  //    19    write(typeof(ia1),0); newline   ;! 3

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

  //    20    test(ia1)

  TEST(IA1);

  //    21
  //    22    printstring( "Testing ia2"); newline

  _imp_PRINTSTRING(_imp_str_literal("Testing ia2"));
  _imp_NEWLINE();

  //    23    write(addr(ia2),0); newline      ;! 2145833816   again same as ia1

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

  //    24    write(addr(ia2(2,3)),0); newline ;! 2145833708   96 bytes past address of first element of ia1, i.e. ia1(3)

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

  //    25                                      !              i.e. 3 elements of 32 bytes (%string(31)), ie complete contents of array ia1
  //    26    write(sizeof(ia2),0); newline    ;! 8

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

  //    27    write(typeof(ia2),0); newline    ;! 3

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

  //    28    test(ia2)

  TEST(IA2);

  //    29
  //    30  %endofprogram

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