#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];
  struct _imp_dv SRA_dv = {SRA, sizeof(_imp_string) /*, dims, <bounds> */};

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

  _imp_string255 *SNA[10];
  struct _imp_dv SNA_dv = {SNA, sizeof(_imp_string *) /*, dims, <bounds> */};

  //     9    %string(255)%namearrayname snan

  _imp_string255 **SNAN;
  struct _imp_dv SNAN_dv = {0};  // assignment of an array to an arrayname must copy bounds info too...

  //    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


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

  /* clang-format on */

  //    13    x = sn


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

  /* clang-format on */

  //    14    sn = x

  *SN = X;

  //    15    x = sra(i)


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

  /* clang-format on */

  //    16    sn == sra(i)

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

  //    17    x = sra(i)


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

  /* clang-format on */

  //    18    sra(i) = x


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

  /* clang-format on */

  //    19    sn == sna(i)

  SN = (_imp_string255 *)SNA[I];

  //    20    x = sna(i)


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

  /* clang-format on */

  //    21    sna(i) = x

  *SNA[I] = X;

  //    22    snan == sna

  SNAN = (_imp_string255 *)SNA;

  //    23    sn == snan(i)

  SN = (_imp_string255 *)SNAN[/*BUG*/ I];

  //    24    x = snan(i)


  /* clang-format off */
_imp_strncpy(/*?*/&X, ({__typeof__(_imp_string255) tmp;/*B*/ tmp = *SNAN[/*BUG*/I]; (void *)&tmp;}), /*max:*/255);

  /* clang-format on */

  //    25    snan(i) = x

  *SNAN[/*BUG*/ I] = X;

  //    26    x = sm(i)


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

  /* clang-format on */

  //    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:;
}