/* Compare two files */

#include <stdio.h>

BOOL check_bufs(char *buf1, char *buf2, int size);
int filesize(FILE *fp);
void msg(char *text);

BOOL verbose=1;

int main(int argc, char **argv) {
	FILE *f1,*f2;
	char *buf1,*buf2;
	int count= -1;
	BOOL result=RETURN_OK;
	
	if(argc>2 && argc<5) {
		if(argc==4 && !strcmp(strlwr(argv[3]),"quiet")) verbose=0;
		if(buf1=malloc(10240)) {
			if(buf2=malloc(10240)) {
				if(f1=fopen(argv[1],"rb")) {
					if(f2=fopen(argv[2],"rb")) {
						if(filesize(f1)==filesize(f2)) {
							while(count!=0) {
								count=fread(buf1,1,10240,f1);
								count=fread(buf2,1,10240,f2);
								if(check_bufs(buf1,buf2,count)) {
									result=RETURN_WARN;
									msg("Files contain different data\n");
									break;
								}
							}
						} else {
							msg("Files are of different size\n");
							result=RETURN_WARN;
						}
						fclose(f2);
					} else {
						char str[200];
						sprintf(str,"File %s does not exist!\n",argv[2]);
						msg(str);
						result=RETURN_ERROR;
					}
					fclose(f1);
				} else {
					char str[200];
					sprintf(str,"File %s does not exist!\n",argv[1]);
					msg(str);
					result=RETURN_ERROR;
				}
				free(buf2);
			} else
				result=RETURN_FAIL;
			free(buf1);
		} else
			result=RETURN_FAIL;
	} else {
		
		msg("\tUsage: compare {first file} {second file} [QUIET]\n");
		result=RETURN_FAIL;
	}
	
	if(result==RETURN_OK)
		msg("Files are the same\n");
	
	return(result);
}

BOOL check_bufs(char *buf1, char *buf2, int size) {
	int i;
	BOOL result=0;

	for(i=0; i<size; i++) {
		if(buf1[i]!=buf2[i])
			result=1;
	}
	
	return(result);
}

int filesize(FILE *fp) {
	long oldpos;
	int length;

	oldpos=ftell(fp);

	fseek(fp,0,SEEK_END);
	length=ftell(fp);
	fseek(fp,oldpos,SEEK_SET);

	return(length);
}

void msg(char *text) {
	if(verbose) {
		printf("Compare 1.0 by Ben Matthew (31.1.97)\n");
		printf("%s",text);
	}
}