
// Includes
#include <exec/types.h>
#include <pragma/exec_lib.h>
#include <exec/memory.h>
#include <pragma/dos_lib.h>
#include <dos/dos.h>
#include <string.h>
#include <stdlib.h>


// Konstanten
#define RC_EQUAL     RETURN_OK
#define RC_NOT_EQUAL RETURN_WARN
#define RC_FAILED    RETURN_FAIL


// globale Variablen
char *versi = "$VER: CmpFiles 1.0 (19-May-1996) © by Maik \"BLiZZeR\" Schreiber [FREEWARE]";


// Programm
long filelength(char *filename)
{
  struct FileInfoBlock *fib;
  BPTR                  lock;
  long                  rc = -1;

  if (strlen(filename) == 0)
    return(rc);

  if (fib = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, NULL))
  {
    if (lock = Lock(filename, SHARED_LOCK))
    {
      if (Examine(lock, fib) != DOSFALSE)
        rc = fib->fib_Size;
      UnLock(lock);
    };
    FreeDosObject(DOS_FIB, (APTR) fib);
  };
  return(rc);
};

int main(int argc, char *argv[])
{
  int   rc = RC_FAILED;
  BPTR  handle1,
        handle2;
  APTR  buffer1,
        buffer2;
  ULONG len1,
        len2,
        dummy;
  BOOL  ok = FALSE;

  if (!strlen(argv[1]) || !strlen(argv[2]))
    exit(RC_FAILED);
  if ((len1 = filelength(argv[1])) != (len2 = filelength(argv[2])))
    exit(RC_FAILED);

  if (buffer1 = AllocVec(len1, MEMF_ANY))
  {
    if (buffer2 = AllocVec(len2, MEMF_ANY))
    {
      if (handle1 = Open(argv[1], MODE_OLDFILE))
      {
        if (handle2 = Open(argv[2], MODE_OLDFILE))
        {
          Read(handle1, buffer1, len1);
          Read(handle2, buffer2, len2);
          ok = TRUE;
          Close(handle2);
        };
        Close(handle1);
        if (ok)
        {
          char *buf1 = (char *) buffer1;
          char *buf2 = (char *) buffer2;
          BOOL  equal = TRUE;

          for (dummy = 0; dummy < len1; dummy++)
          {
            if (buf1[dummy] != buf2[dummy])
            {
              equal = FALSE;
              break;
            };
          };
          rc = equal ? RC_EQUAL : RC_NOT_EQUAL;
        };
      };
      FreeVec(buffer2);
    };
    FreeVec(buffer1);
  };
  exit(rc);
};

