#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];
struct _imp_dv IA1_dv = {IA1, sizeof(_imp_string) /*, dims, <bounds> */};
// 13 %string(7)%array ia2(2:4,3:6)
_imp_string7 IA2[3][4];
struct _imp_dv IA2_dv = {IA2, sizeof(_imp_string) /*, dims, <bounds> */};
// 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:;
}