#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

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

  //     2
  //     3    %string(255) x, s

  _imp_string255 X;
  _imp_string255 S;

  //     4
  //     5    %integer i

  int I;

  //     6    %string(255)%name sn

  _imp_string255 *SN;

  //     7    %string(255)%array sra(0:9)

  _imp_string255 SRA[10];

  //     8    %string(255)%namearray sna(0:9)

  _imp_string255 *SNA[10];

  //     9    %string(255)%namearrayname snan

  _imp_string255 **SNAN;

  //    10    %string(255)%map sm(%integer i); %result == s; %end

  _imp_string255 *SM(int I)
  {

    return /*?*/ &S;
  } /* end of SM */

  // ?I unused
  //    11    sn == s

  SN = (_imp_string255 *)/*?*/ &S;

  //    12    x = s

  _imp_strncpy(/*?*/ &X, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = S;
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    13    x = sn

  _imp_strncpy(/*?*/ &X, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = *SN;
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    14    sn = x

  *SN = X;

  //    15    x = sra(i)

  _imp_strncpy(/*?*/ &X, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = SRA[I];
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    16    sn == sra(i)

  SN = (_imp_string255 *)/*?*/ &SRA[I];

  //    17    x = sra(i)

  _imp_strncpy(/*?*/ &X, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = SRA[I];
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    18    sra(i) = x

  _imp_strncpy(/*?*/ &SRA[I], ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = X;
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    19    sn == sna(i)

  SN = (_imp_string255 *)SNA[I];

  //    20    x = sna(i)

  _imp_strncpy(/*?*/ &X, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = *SNA[I];
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    21    sna(i) = x

  *SNA[I] = X;

  //    22    snan == sna

  SNAN = (_imp_string255 *)SNA;

  //    23    sn == snan(i)

  SN = (_imp_string255 *)[/*BUG*/ 0];

  //    24    x = snan(i)

  _imp_strncpy(/*?*/ &X, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = *[/*BUG*/ 0];
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    25    snan(i) = x

  *[/*BUG*/ 0] = X;

  //    26    x = sm(i)

  _imp_strncpy(/*?*/ &X, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = *SM(I);
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    27    sn == sm(i)

  SN = (_imp_string255 *)SM(I);

  //    28    sm(i) = x

  *SM(I) = X;

  //    29  %endofprogram

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