/************************************
***			          ***
***       Binary Diff v1.0        ***
***       =========== ====        ***
***			          ***
***  (c) 22.2.91 by Andreas Ley   ***
***			          ***
***  (u) 22.2.91                  ***
***			          ***
************************************/

char header[]="Binary Diff v1.0\n(c) 1991 by Andreas Ley\n";

#include <stdio.h>

#ifdef vms
#include "getopt.c"
#endif /* vms */

#define	screen(c)	(((c)&0x7f)<0x20?'.':(c))


void bdiff(src1,src2,src3,src4)
FILE *src1,*src2,*src3,*src4;
{
  unsigned char	c1,c2,c3,c4;
  long		loc=0;

  while (!feof(src1) && !feof(src2) && !feof(src3) && !feof(src4)) {
    c1=fgetc(src1);
    c2=fgetc(src2);
    c3=fgetc(src3);
    c4=fgetc(src4);
    if (c1==c2&&c2!=c3&&c3==c4)
      printf("%06lx: %02x %c %02x %c\n",loc,c1,screen(c1),c3,screen(c3));
    loc++;
  }
  if (!feof(src1) || !feof(src2) || !feof(src3) || !feof(src4))
    printf("File lengths differ.\n");
}



void usage(image)
char *image;
{
  fprintf(stderr,"Usage: %s [-h] file1 file2 file3 file4\n",image);
  fprintf(stderr,"Prints all positions that are equal in file1 and file2 and equal in file3 and\nfile4 but differ from file1/2 to file3/4.\n");
  exit(1);
}



main(argc,argv)
int argc;
char *argv[];
{
  int		c;
  extern char	*optarg;
  extern int	optind;
  FILE		*src1,*src2,*src3,*src4;

  while ((c=getopt(argc,argv,"h?")) != EOF)
    switch ((char)c) {
      case 'h': fprintf(stderr,header);
      case '?': usage(argv[0]);
    }

  if (optind!=argc-4)
    usage(argv[0]);

  if (src1=fopen(argv[optind],"r")) {
    if (src2=fopen(argv[optind+1],"r")) {
      if (src3=fopen(argv[optind+2],"r")) {
        if (src4=fopen(argv[optind+3],"r")) {
          bdiff(src1,src2,src3,src4);
          fclose(src4); }
        else
          fprintf(stderr,"Unable to open '%s'\n",argv[optind+3]);
        fclose(src3); }
      else
        fprintf(stderr,"Unable to open '%s'\n",argv[optind+2]);
      fclose(src2); }
    else
      fprintf(stderr,"Unable to open '%s'\n",argv[optind+1]);
    fclose(src1); }
  else
    fprintf(stderr,"Unable to open '%s'\n",argv[optind]);
}

