#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %begin
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
// 2
// 3 %routine do5(%string (5) %array (2) %name S)
void DO5(_imp_string5 * S) {
// 4 %string (10) x
_imp_string10 X;
// 5 x = S(2,12)
_imp_strncpy(/*?*/ &X, ({
__typeof__(_imp_string5) tmp; /*B*/
tmp = [/*BUG*/ 0];
(void *)&tmp;
}),
/*max:*/ 10);
// 6 print string(x)
_imp_PRINTSTRING(
*({
__typeof__(_imp_string10) tmp = X /*q*/;
(_imp_string255 *)&tmp;
})
);
// 7
// 8 ! This is failing at compile time:
// 9 !print string(S(2,12))
// 10
// 11 %end
return;
} /* end of DO5 */
// 12
// 13 %routine do(%string (*) %array (2) %name S)
void DO(_imp_string * S) {
// 14 %string (10) x
_imp_string10 X;
// 15 ! and I expect this to fail at runtime, until I implement dopevectors
// 16 x = S(2,12)
_imp_strncpy(/*?*/ &X, ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = [/*BUG*/ 0];
(void *)&tmp;
}),
/*max:*/ 10);
// 17 print string(x)
_imp_PRINTSTRING(
*({
__typeof__(_imp_string10) tmp = X /*q*/;
(_imp_string255 *)&tmp;
})
);
// 18 %end
return;
} /* end of DO */
// 19
// 20 %string (5) %array mnems(1:2, 10:13)
_imp_string5 MNEMS[2][4];
// 21
// 22 mnems(1,10) = "fiver"
_imp_strncpy(/*?*/ &MNEMS[0][0], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("fiver");
(void *)&tmp;
}),
/*max:*/ 5);
// 23 mnems(1,11) = "fours"
_imp_strncpy(/*?*/ &MNEMS[0][1], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("fours");
(void *)&tmp;
}),
/*max:*/ 5);
// 24 mnems(1,12) = "three"
_imp_strncpy(/*?*/ &MNEMS[0][2], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("three");
(void *)&tmp;
}),
/*max:*/ 5);
// 25 mnems(1,13) = "none!"
_imp_strncpy(/*?*/ &MNEMS[0][3], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("none!");
(void *)&tmp;
}),
/*max:*/ 5);
// 26
// 27 mnems(2,10) = "FIVER"
_imp_strncpy(/*?*/ &MNEMS[1][0], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("FIVER");
(void *)&tmp;
}),
/*max:*/ 5);
// 28 mnems(2,11) = "FOURS"
_imp_strncpy(/*?*/ &MNEMS[1][1], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("FOURS");
(void *)&tmp;
}),
/*max:*/ 5);
// 29 mnems(2,12) = "THREE"
_imp_strncpy(/*?*/ &MNEMS[1][2], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("THREE");
(void *)&tmp;
}),
/*max:*/ 5);
// 30 mnems(2,13) = "NONE!"
_imp_strncpy(/*?*/ &MNEMS[1][3], ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("NONE!");
(void *)&tmp;
}),
/*max:*/ 5);
// 31
// 32 do5(mnems)
DO5(
({
__typeof__(_imp_string5) tmp = MNEMS /*q*/;
(_imp_string5 *)&tmp;
})
);
// 33 do(mnems)
DO(
({
__typeof__(_imp_string5) tmp = MNEMS /*q*/;
(_imp_string255 *)&tmp;
})
);
// 34
// 35 %endofprogram
_imp_stop(0);
return 0;
end_0:;
}