#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  ! SIMPLE TEST OF BYTE POINTER VARIABLES AFTER PERQ
//     2  %BEGIN

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

  //     3  %owninteger fail=0

  static int FAIL = 0;

  //     4  %BYTEINTEGERARRAY a(1:10)

  unsigned char A[10];
  struct _imp_dv A_dv = {A, sizeof(unsigned char) /*, dims, <bounds> */};

  //     5  %BYTEINTEGERNAME ap

  unsigned char *AP;

  //     6  %INTEGER i

  int I;

  //     7  %ROUTINE or(%BYTEINTEGERNAME x)

  void OR(unsigned char *X) {
    //     8        x=x!64

    *X = *X | 64;

    //     9  %END

    return;
  } /* end of OR */

  //    10        a(i)=i %FOR i=1,1,10

  // %for I = 1, 1, 10 %cycle
  {
    I = 0;
  L_0001:
    if (I == 10) goto L_0002;
    I += 1;
    A[I - 1] = I;
    goto L_0001;
  }

L_0002:;

//    11        or(a(i)) %FOR i=1,1,10

  // %for I = 1, 1, 10 %cycle
  {
    I = 0;
  L_0004:
    if (I == 10) goto L_0005;
    I += 1;
    OR(/*?*/ &A[I - 1]);
    goto L_0004;
  }

L_0005:;

//    12        %FOR i=1,1,10 %CYCLE

  // %for I = 1, 1, 10 %cycle
  {
    I = 0;
  L_0006:
    if (I == 10) goto L_0007;
    I += 1;

    //    13           ap==a(i)

    AP = (unsigned char *)/*?*/ &A[I - 1];

    //    14           ap=ap!128

    *AP = *AP | 128;

    //    15           write(a(i),4) %and fail=1 %UNLESS a(i)=i!x'c0'

    if (A[I - 1] == I | 192) goto L_0008;
    _imp_WRITE(A[I - 1], 4);
    FAIL = 1;
  L_0008:;

  //    16        %REPEAT

    goto L_0006;
  }

L_0007:;

//    17        printstring("TEST OK") %if fail=0

  if (FAIL != 0) goto L_0009;
  _imp_PRINTSTRING(_imp_str_literal("TEST OK"));
L_0009:;

//    18  %ENDOFPROGRAM

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