#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[21];
      };
    };
  };

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

  struct F ONE[100];

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

  struct F TWO[2];

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

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

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

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

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