#include <perms.h>
/*prim*/ int REM(int P, int Q);                              /* prim */
float FLOAT(int N);                                     /* prim */
_imp_string TOSTRING(int C);                            /* prim */
int ADDR(void *P);                                      /* prim */
int *INTEGER(int N);                                    /* prim */
char *BYTEINTEGER(int N);                               /* prim */
_imp_string *STRING(int N);                             /* prim */
RECORD *RECORD(int N);                                  /* prim */
float *REAL(int N);                                     /* prim */
double *LONGREAL(int N);                                /* prim */
char *LENGTH(_imp_string S);                            /* prim */
char *CHARNO(_imp_string S, int N);                     /* prim */
int TYPEOF(void *N);                                    /* prim */
int SIZEOF(void *N);                                    /* prim */
int INT(double R);                                      /* perm */
void PROMPT(_imp_string S);                             /* perm */
void READSYMBOL(int *P);                                /* perm */
int NEXTSYMBOL(void);                                   /* perm */
void SKIPSYMBOL(void);                                  /* perm */
void PRINTSYMBOL(int SYM);                              /* perm */
void PRINTSTRING(_imp_string S);                        /* perm */
void WRITE(int V, int P);                               /* perm */
void SELECTINPUT(int N);                                /* perm */
void SELECTOUTPUT(int N);                               /* perm */
void OPENINPUT(int N, _imp_string FD);                  /* perm */
void OPENOUTPUT(int N, _imp_string FD);                 /* perm */
void CLOSEINPUT(void);                                  /* perm */
void CLOSEOUTPUT(void);                                 /* perm */
void SPACE(void);                                       /* perm */
void SPACES(int N);                                     /* perm */
void NEWLINE(void);                                     /* perm */
void NEWLINES(int N);                                   /* perm */
void READ(void *PTR);                                   /* perm */
void PRINT(double R, int PLACES);                       /* perm */
int INTPT(float R);                                     /* perm */
_imp_string SUBSTRING(_imp_string S, int FROM, int TO); /* perm */
_imp_string TRIM(_imp_string S, int MAX);               /* perm */
int EVENT(void);                                        /* perm */
int SUBEVENT(void);                                     /* perm */
int EVENTINFO(void);
const int NL = 10;
int main(int _imp_argc, char **_imp_argv)
{
  extern void PROMPT(_imp_string S);
  extern void OPENINPUT(int STREAM, _imp_string FILE);
  const _imp_string SNL = "
";
  static _imp_string CLIPARAM = "file1.txt file2.txt";
  const int TRUE = 1;
  const int FALSE = 0;
  const int ASTREAM = 1;
  const int BSTREAM = 2;
  _imp_string AFILE;
  _imp_string BFILE;
  _imp_string PR;
  _imp_string LEFT;
  _imp_string RIGHT;
  _imp_string FILE['B' - 'A' + 1];
  int BASE['B' - 'A' + 1];
  int ACOUNT;
  int BCOUNT;
  int ANUM;
  int BNUM;
  const int MAXLINES = 512;
  const int MAXLINEWIDTH = 128;
  char AA[MAXLINES * MAXLINEWIDTH - 1 + 1], BB[MAXLINES * MAXLINEWIDTH - 1 + 1];
  auto int INPUTENDED(void)
  {
    int CH;

    if (onevent()) return TRUE;
    CH = NEXTSYMBOL();
    return FALSE;
  }
  auto void RDLINE(_imp_string * S)
  {
    int CH;

    S = "";
    for (;;) {
      READSYMBOL(CH);
      if (CH == NL || LENGTH(S) == MAXLINEWIDTH) break;
      S = _imp_cat(S, TOSTRING(CH));
    }
  }
  auto char *A(int I, int J)
  {
    return &AA[((BASE['A'] + I) & (MAXLINES - 1)) * MAXLINEWIDTH + J];
  }
  auto char *B(int I, int J)
  {
    return /* ERROR: name_sym_idx is -1! *//* C_NAME */ &;
  }
  auto void REFILL(char *(*X)(int I, int J), int N, int *COUNT)
  {
    int I;
    int J;
    int CH;

    for (I = MAXLINES + 1 - N; I <= MAXLINES; I += 1) {
      do {
        if (INPUTENDED() == TRUE) return; /* ERROR: name_sym_idx is -1! *//* C_NAME */;
      } while (CH == NL);
      for (J = 1; J <= MAXLINEWIDTH - 1; J += 1) {
        if (CH == NL || CH < 32) break;
        *X(I, J) = CH;
        if (INPUTENDED() == TRUE) return; /* ERROR: name_sym_idx is -1! *//* C_NAME */;
      }
      *X(I, J) = NL;
      *COUNT = COUNT + 1;
    }
  }
  auto void PRINT(char *(*X)(int I, int J), int N, int FLAG)
  {
    int I;
    int J;

    for (I = 1; I <= N; I += 1) {
      /*ERROR: name_sym_idx is -1!*//* C_NAME */; /* ERROR: name_sym_idx is -1! *//* C_NAME */; /* ERROR: name_sym_idx is -1! *//* C_NAME */;
      J = 0;
      for (;;) {
        J = J + 1;
        if (X(I, J) == NL) break; /* ERROR: name_sym_idx is -1! *//* C_NAME */;
        if (J == 57) NEWLINE();
      }
      NEWLINE();
    }
  }
  auto int LINESMATCH(int ALINE, int BLINE)
  {
    int J;

    if (ALINE > ACOUNT || BLINE > BCOUNT) {
      if (ALINE > ACOUNT && BLINE > BCOUNT) return TRUE;
      return FALSE;
    }
    for (J = 1; J <= MAXLINEWIDTH; J += 1) {
      if (A(ALINE, J) != B(BLINE, J)) return FALSE;
      if (A(ALINE, J) == NL) return TRUE;
    }
    return TRUE;
  }
  auto void FINDMATCH(int *AL, int *BL)
  {
    int I;
    int J;

    for (I = 1; I <= MAXLINES; I += 1) {
      if (LINESMATCH(I, I) == TRUE) {
        *AL = I;
        *BL = I;
        return;
      }
      if (I > 1) {
        for (J = 1; J <= I - 1; J += 1) {
          if (LINESMATCH(I, J) == TRUE) {
            *AL = I;
            *BL = J;
            return;
          }
          if (LINESMATCH(J, I) == TRUE) {
            *AL = J;
            *BL = I;
            return;
          }
        }
      }
    }
    *AL = MAXLINES + 1;
    *BL = MAXLINES + 1;
  }
  int FNAMELEN;

  ANUM = MAXLINES;
  BNUM = MAXLINES;
  BASE['A'] = 0;
  BASE['B'] = 0;
  ACOUNT = 0;
  BCOUNT = 0;
  _imp_resolve(, ) if ( /* TO DO: at line 3095 */ ) {
    /*ERROR: name_sym_idx is -1!*//* C_NAME */;
    exit(0);
  }
  PR = "New file: ";
  _imp_resolve(, ) if ( /* C_TO_DO */ !/* TO DO: at line 3095 */ ) {
    AFILE = CLIPARAM;
    if (AFILE != "") {
      BFILE = "";
      PR = "Against:  ";
    } else {
      AFILE = "";
      BFILE = "";
    }
  }
  while (_imp_resolve(, ) /* TO DO: at line 3095 */ ) AFILE = _imp_cat(LEFT, RIGHT);
  while (_imp_resolve(, ) /* TO DO: at line 3095 */ ) BFILE = _imp_cat(LEFT, RIGHT);
  FILE = AFILE;
  FILE = BFILE;
  PROMPT("Old file: ");
  while (AFILE == "") RDLINE(AFILE);
  PROMPT(PR);
  while (BFILE == "") RDLINE(BFILE);
  FNAMELEN = LENGTH(AFILE);
  if (FNAMELEN < LENGTH(BFILE)) FNAMELEN = LENGTH(BFILE);
  if (FNAMELEN > 11) FNAMELEN = 11;
  OPENINPUT(ASTREAM, AFILE);
  OPENINPUT(BSTREAM, BFILE);
  AFILE = _imp_cat("           ", AFILE);
  BFILE = _imp_cat("           ", BFILE);
  AFILE = SUBSTRING(AFILE, LENGTH(AFILE) - 10, LENGTH(AFILE));
  BFILE = SUBSTRING(BFILE, LENGTH(BFILE) - 10, LENGTH(BFILE));
  for (;;) {
    /*ERROR: name_sym_idx is -1!*//* C_NAME */;
    REFILL(A(), ANUM, ACOUNT); /* ERROR: name_sym_idx is -1! *//* C_NAME */;
    REFILL(B(), BNUM, BCOUNT);
    if (ACOUNT <= 0 && BCOUNT <= 0) break;
    FINDMATCH(ANUM, BNUM);
    if (ANUM != 1 || BNUM != 1) {
      PRINT(A(), ANUM - 1, 'A');
      PRINT(B(), BNUM - 1, 'B'); /* ERROR: name_sym_idx is -1! *//* C_NAME */;
      if (ANUM > MAXLINES) {
        /*ERROR: name_sym_idx is -1!*//* C_NAME */;
        NEWLINE();
        exit(0);
      }
    }
    BASE['A'] = BASE['A'] + ANUM;
    BASE['B'] = BASE['B'] + BNUM;
    ACOUNT = ACOUNT - ANUM;
    BCOUNT = BCOUNT - BNUM;
  }
}
