#include <perms.h>

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

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

  //     2  !***********************************************************************
  //     3  !*    TESTS CLEARING RECORDARRAY FOR OVERWRITING OFF END               *
  //     4  !***********************************************************************
  //     5  %INTEGER I

  int I;

  //     6  %RECORDFORMAT F(%STRING(15)NAME,%INTEGER I,J,K,%LONGREAL X,Y, %C

  struct F {
    union {
      struct {
        _imp_string15 NAME;
        int I;
        int J;
        int K;
        double X;
        double Y;
        double A[3];
      };
    };
  };

  //     7+       %LONGREALARRAY A(0:2))
  //     8  %RECORD(F)%ARRAY ONE(1:100)

  struct F ONE[100];
  struct _imp_dv ONE_dv = {ONE, sizeof(struct F) /*, dims, <bounds> */};

  //     9  %RECORD(F)%ARRAY TWO(1:2)

  struct F TWO[2];
  struct _imp_dv TWO_dv = {TWO, sizeof(struct F) /*, dims, <bounds> */};

  //    10        TWO(1)_NAME="PETE"


  /* clang-format off */
_imp_strncpy(/*?*/&TWO[0].NAME, ({__typeof__(_imp_string255) tmp;/*B*/ tmp = _imp_str_literal("PETE"); (void *)&tmp;}), /*max:*/255);

  /* clang-format on */

  //    11        %CYCLE I=1,1,100

  // %for I = 1, 1, 100 %cycle
  {
    I = 0;
  L_0001:
    if (I == 100) goto L_0002;
    I += 1;

    //    12           ONE(I)=0

    ONE[I - 1] = (struct F){0};

    //    13        %REPEAT

    goto L_0001;
  }

L_0002:;

//    14        %IF TWO(1)_NAME#"PETE" %THEN PRINTSTRING("***ERROR***")%else %c


  /* clang-format off */
if (_imp_strcmp((_imp_string *)/*?*/&TWO[0].NAME, (_imp_string *)/*?*/_imp_str_literal_ptr("PETE")) == 0) goto L_0004;

  /* clang-format on */
  _imp_PRINTSTRING(_imp_str_literal("***ERROR***"));
  goto L_0005;
L_0004:;
  _imp_PRINTSTRING(_imp_str_literal("TEST OK"));
L_0005:;

//    15+          printstring("TEST OK")
//    16
//    17  %ENDOFPROGRAM

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