#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];
struct _imp_dv IRA_dv = {IRA, sizeof(int) /*, dims, <bounds> */};
// 7 %integernamearray ina(0:9)
int *INA[10];
struct _imp_dv INA_dv = {INA, sizeof(int *) /*, dims, <bounds> */};
// 8 %integernamearrayname inan
int **INAN;
struct _imp_dv INAN_dv = {0}; // assignment of an array to an arrayname must copy bounds info too...
// 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 INAN[/*BUG*/ I]; } /* 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 *)INAN[/*BUG*/ I];
// 26 inan(i) = x
*INAN[/*BUG*/ I] = X;
// 27 x = inan(i)
X = *INAN[/*BUG*/ I];
// 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:;
}