#include "impstrings.h"
#define unless(cond) if (!(cond))
int main(int _imp_argc, char **_imp_argv)
{
  extern void PROMPT(_imp_string255 S);
  extern void OPENINPUT(int STREAM, _imp_string255 FILE);
  const _imp_string1 SNL = "
";
  static _imp_string255 CLIPARAM = "file1.txt file2.txt";
  const int TRUE = 1;
  const int FALSE = 0;
  const int ASTREAM = 1;
  const int BSTREAM = 2;
  _imp_string255 AFILE;
  _imp_string255 BFILE;
  _imp_string255 PR;
  _imp_string255 LEFT;
  _imp_string255 RIGHT;
  _imp_string255 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(9)) return TRUE;
    CH = NEXTSYMBOL;
    return FALSE;
  }
  auto void RDLINE(_imp_string * *S)
  {
    int CH;

    S = "";
    for (;;) {
      READSYMBOL(CH);
      if (CH == NL || LENGTH == MAXLINEWIDTH) break;
      S = S.TOSTRING;
    }
  }
  auto char *A(int I, int J)
  {
    return &AA;
  }
  auto char *B(int I, int J)
  {
    return &BB;
  }
  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) {
      for (;;) {
        if (INPUTENDED == TRUE) return;
        READSYMBOL(CH);
        if (CH != NL) break;    /* watch for %continue! */
      }
      for (J = 1; J <= MAXLINEWIDTH - 1; J += 1) {
        if (CH == NL || CH < 32) break;
        X(I, J) = CH;
        if (INPUTENDED == TRUE) return;
        READSYMBOL(CH);
      }
      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) {
      PRINTSTRING("" "".FILE."" ",");
      WRITE(BASE + I + 1, 5);
      PRINTSTRING(": ");
      J = 0;
      for (;;) {
        J = J + 1;
        if (X == NL) break;
        PRINTSYMBOL(X);
        if (J == 57) {
          NEWLINE;
          SPACES(20);
          PRINTSYMBOL(':');
        }
      }
      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 != B) return FALSE;
      if (A == 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 == TRUE) {
        AL = I;
        BL = I;
        return;
      }
      if (I > 1) {
        for (J = 1; J <= I - 1; J += 1) {
          if (LINESMATCH == TRUE) {
            AL = I;
            BL = J;
            return;
          }
          if (LINESMATCH == 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;
  if (_imp_resolve(CLIPARAM /* STR-LVALUE */, ("-h"))) {
    PRINTSTRING("Syntax: compare oldfile newfile".SNL);
    exit(0);
  }
  PR = "New file: ";
  unless (_imp_resolve(CLIPARAM /* STR-LVALUE */, AFILE /* STR-LVALUE */.(" ").BFILE /* STR-LVALUE */ )) {
    AFILE = CLIPARAM;
    if (AFILE != "") {
      BFILE = "";
      PR = "Against:  ";
    } else {
      AFILE = "";
      BFILE = "";
    }
  };
  while (_imp_resolve(AFILE /* STR-LVALUE */, LEFT /* STR-LVALUE */.(" ").RIGHT /* STR-LVALUE */ )) AFILE = /* Jam transfer */ LEFT.RIGHT;
  while (_imp_resolve(BFILE /* STR-LVALUE */, LEFT /* STR-LVALUE */.(" ").RIGHT /* STR-LVALUE */ )) BFILE = /* Jam transfer */ LEFT.RIGHT;
  FILE('A') = AFILE;
  FILE('B') = BFILE;
  PROMPT("Old file: ");
  while (AFILE == "") RDLINE(AFILE);
  PROMPT(PR);
  while (BFILE == "") RDLINE(BFILE);
  FNAMELEN = LENGTH;
  if (FNAMELEN < LENGTH) FNAMELEN = LENGTH; ;
  if (FNAMELEN > 11) FNAMELEN = 11; ;
  OPENINPUT(ASTREAM, AFILE);
  OPENINPUT(BSTREAM, BFILE);
  AFILE = "           ".AFILE;
  BFILE = "           ".BFILE;
  AFILE = SUBSTRING;
  BFILE = SUBSTRING;
  for (;;) {
    SELECTINPUT(ASTREAM);
    REFILL(A, ANUM, ACOUNT);
    SELECTINPUT(BSTREAM);
    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');
      PRINTSTRING("---------------------".SNL);
      if (ANUM > MAXLINES) {
        PRINTSTRING("*** Mismatch too large");
        NEWLINE;
        exit(0);
      }
    }
    BASE('A') = BASE + ANUM;
    BASE('B') = BASE + BNUM;
    ACOUNT = ACOUNT - ANUM;
    BCOUNT = BCOUNT - BNUM;
  }
}
