   /************************************************/
  /* Difference v1.1 (27.08.94) - a file comparer */
 /*        Public Domain   (c) 1994 by BSZ       */
/************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define max(x,y) ((x)>(y) ? (x):(y))
#define min(x,y) ((x)>(y) ? (y):(x))

/* modyfikacja funkcji standardowej strncmp tak, aby zwracaîa
offset (rzeczywisty, nie numer elementu tablicy liczony przecieű
od zera), na którym wystëpuje róznica */
int strn_cmp(char *string1, char *string2, int size)
{
	int position;
	for (position=0; position<size; position++)
	{
		if (string1[position]!=string2[position])
		{	
			return (position+1);
		}
	}
	return 0;
}

void clean(char *buffer, int size)
{
	int loop;
	for(loop=0; loop<size; loop++)
		buffer[loop]=0;
}

main(int argc, char *argv[])
{
	long offset, size1, size2, size, c, d;
	int cmp;
	char io_buffer1[1024], io_buffer2[1024];
	FILE *in1, *in2;
	char *path_1[30], *path_2[30];

	*path_1=argv[1];
	*path_2=argv[2];

	if(argc!=3)
	{
		printf("\n[1mDifference v1.1 (27.08.94)[22m - a file comparer\n");
		printf("[32mPublic Domain (c) 1994 by BSZ[31m\n");
		printf("Usage: %s <file 1> <file 2>\n", argv[0]);
		exit(0);
	}

	if( !(in1=fopen(*path_1, "rb")))
	{
		fprintf(stderr,">>>Error opening %s\n", *path_1);
		exit(1);
	}
	else
		fseek(in1,0L,SEEK_END);

	if( !(in2=fopen(*path_2, "rb")))
	{
		fprintf(stderr, ">>>Error opening %s\n", *path_2);
		exit(1);
	}
	else
		fseek(in2,0L,SEEK_END);

	size1=ftell(in1);
	size2=ftell(in2);
	size=min(size1, size2);
	rewind(in1);
	rewind(in2);

	for(offset=1; offset<=size ; offset+=1024)
	{
		printf("%02d%c completed",100*offset/size,'%');
		fflush(stdout);
		clean(io_buffer1,1024);
		clean(io_buffer2,1024);
		c=fread(io_buffer1, 1, 1024, in1);
		d=fread(io_buffer2, 1, 1024, in2);
		cmp=strn_cmp(io_buffer1, io_buffer2, 1024);
		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b");
		if (cmp)
		{
			offset+=cmp-1;
			printf("100%c completed. Files differ at position %d ($%x) \n",'%', offset,offset);
			exit(0);
		}
	}
	printf ("100%c completed. Files DO NOT differ\n",'%');
	fclose(in1);
	fclose(in2);
}
