/* FILE: compare.c
 * DATE: 24.JUL 1992.
 * AUTH: Peter Verhas
 * CONT: C program that compares two ascii files lines by lines.
 *       Displays the line numbers and the lines that do match.
 *       This program serves only as an auxiliary program for the HION
 *       package, and therefore this is not foolproof. The rest of the
 *       comment is in Hungarian using a special platform independent
 *       accent notation.
 *
 * Ha mo1dosi1tottad a hion.dct szo1ta1rat, e1s sok u1j szo1t i1rta1l
 * bele, akkor elo3fordulhat, hogy olyan szavak is belekeru2ltek, amelyeket
 * a HION jo1l va1laszt el. Ma1sold a1t a szo1ta1rat pe1lda1ul a h.hun
 * fa1jlba, e1s egy szo2vegszerkeszto3vel to2ro2ld ki a - jeleket. Ezuta1n
 * fordi1tsd le a hionnal, u1gy, hogy egyszer haszna1lod a kive1tel
 * szo1ta1rat, egyszer pedig nem. Terme1szetesen ke1t ku2lo2nbo2zo3
 * eredme1nyfa1jlnak kell keletkeznie, pe1lda1ul i1gy:
 * >>>>hion h .te1
 * >>>>hion h .te2 -r
 * Ezek uta1n hasonli1sd o2ssze a ke1t fa1jlt ezzel a programmal:
 * >>>>compare h.te1 h.te2
 * A program ki fogja i1rni az o2sszes olyan sor tartalma1t e1s sorsza1ma1t
 * amely a ke1t fa1jlban megegyezik. Ezek a szavak feleslegesek a szo1ta1rban,
 * hiszen annak haszna1lata ne1lku2l (-r opcio1) is helyesen va1lasztotta el
 * a HION, e1s i1gy ki lehet o2ket to2ro2lni a szo1ta1rbo1l. Az is lehet,
 * hogy a szo1 kell a szo1ta1rba, csak e1ppen rossz helyre lett berakva az
 * elva1laszta1s.
 *
 * Ezt a programot ba1rmilyen C fordi1to1val, ba1rmilyen ge1pen le kell
 * tudnod fordi1tani.
 *                     1992. ju1lius 24.
 */
#include <stdio.h>
#include <string.h>
#define MaximalAllovedLineLengthOfFiles 200
#define EndOfFileSign EOF
#define Begin {
#define End   }
#define Array []
#define WriteOneCharacter putchar
#define Write printf(
#define FlushOutput )
#define If    if(
#define Then  )
#define For   for(
#define While while(
#define Do    )
#define Let
#define And &&
#define Be =
#define InitValue =
#define Is ==
#define IsNot !=
#define LessThan <
#define NewLineCharacter '\n'
#define Increment(x) x++
#define Integer int
#define Character char
#define LongInteger long
#define NextCharacterFrom getc
#define NotOpened NULL
#define WriteError fprintf(stderr,
#define CloseError )
#define OpenFile fopen(
#define CheckFileState ,"r")
#define CloseFile fclose
#define ErrorExit exit(1)
#define StringsAreEqual !strcmp
#define Not !
typedef FILE *File;
typedef Character *String;
Integer ReadOneLineFromFile(OneOfTheFilesToCompare,AneOfTheLineBuffers)
  File OneOfTheFilesToCompare;
  String AneOfTheLineBuffers;
  Begin
  Integer ActualCharacterRead,IndexOfTheLineBuffer;

  Let ActualCharacterRead Be NextCharacterFrom(OneOfTheFilesToCompare);
  If ActualCharacterRead Is EndOfFileSign Then return EndOfFileSign;

  For Let IndexOfTheLineBuffer Be 0 ;
       ActualCharacterRead IsNot NewLineCharacter  And
         ActualCharacterRead IsNot EndOfFileSign And
         IndexOfTheLineBuffer LessThan MaximalAllovedLineLengthOfFiles ;
       Increment(IndexOfTheLineBuffer) Do
    Begin
    Let AneOfTheLineBuffers[IndexOfTheLineBuffer] Be ActualCharacterRead;
    Let ActualCharacterRead Be NextCharacterFrom(OneOfTheFilesToCompare);
    End
  Let AneOfTheLineBuffers[IndexOfTheLineBuffer] Be (Character)0;
  return Not EndOfFileSign;
  End

main(NumberOfArguments,Argument)
  Integer NumberOfArguments;
  String Argument Array;
  Begin
  LongInteger LineNumber InitValue 0;
  File FirstFileToCompare,SecondFileToCompare;
  Integer i,j;
  Character FirstLineBuffer[MaximalAllovedLineLengthOfFiles],
       SecondLineBuffer[MaximalAllovedLineLengthOfFiles];

  If NumberOfArguments Is 1 Then
    Begin
    WriteError
"Usage: compare file1.ext file2.ext\n  Use redirection to print to file.\n"
    CloseError;
    ErrorExit;
    End
  Let FirstFileToCompare Be OpenFile Argument[1] CheckFileState;
  If FirstFileToCompare Is NotOpened Then
    Begin
    WriteError "File %s can not be opened.\n",Argument[1]
    CloseError;
    ErrorExit;
    End
  Let SecondFileToCompare Be OpenFile Argument[2] CheckFileState;
  If SecondFileToCompare Is NotOpened Then
    Begin
    CloseFile(FirstFileToCompare);
    WriteError "File %s can not be opened.\n",Argument[2]
    CloseError;
    ErrorExit;
    End
  While  ReadOneLineFromFile(FirstFileToCompare,FirstLineBuffer) IsNot
                EndOfFileSign And
         ReadOneLineFromFile(SecondFileToCompare,SecondLineBuffer) IsNot
                EndOfFileSign Do
    Begin
    Increment(LineNumber);
    If StringsAreEqual(FirstLineBuffer,SecondLineBuffer) Then
      Begin
      Write ">>" FlushOutput;
      For Let j Be 0, Let i Be 0 ; FirstLineBuffer[i] ; Increment(i) Do
        If FirstLineBuffer[i] IsNot '\\' Then
          WriteOneCharacter(FirstLineBuffer[i]),Increment(j);
      For ; j LessThan 40 ; Increment(j) Do
        WriteOneCharacter('<');
      Write "%5ld\n",LineNumber FlushOutput;
      End
    End
  End

