/* ÐROGRAM: BINCMP - COMPARE BINARY FILES ÖERSION: 1.0 01/31/86 ÁUTHOR: ÍARK Ò. ÒINFRET ÓYNOPSIS: $ BINCMP FILE1 FILE2 (ÓÅÑ ÆILES) $ BINCMP FILE1,P FILE2,P (ÐÒÇ FILES) ÆILENAMES MAY ALSO CONTAIN DEVICE NUMBER SPECIFICATION (E.G. #9:FILE1). ÄESC.: ÂINCMP COMPARES TWO FILES (ÓÅÑ,ÐÒÇ) AS BINARY DATA, REPORTING DIFFERENCES TO STANDARD OUTPUT. ×RITTEN FOR ÃOMMODORE Ã64 W/Ã-ÐOWER ÎÏÔÅ: ÔHIS PROGRAM USES A MODIFIED FREAD ROUTINE (ÒAY ÚARLING) WHICH RETURNS THE NUMBER OF ELEMENTS READ RATHER THAN THE SIMPLE 1 OR 0 WHICH THE NON-STANDARD Ã-ÐOWER FREAD RETURNS. ÔHE BUFFERING ACCOMPLISHED BY USING FREAD PROVIDES A SIGNIFICANT IMPROVEMENT IN PERFORMANCE (VS. FGETC). */ #INCLUDE CHAR *MALLOC(); #DEFINE ÂÕÆÓÉÚ 254*4 /* SIZE OF FOUR FULL SECTORS */ #DEFINE ÍÁØÅÒÒ 200 /* MAXIMUM MISMATCHES ALLOWED */ CHAR *BUF1,*BUF2; UNSIGNED BIAS,ERRCNT,I,LAST,LAST1,LAST2; ÆÉÌÅ *FIL1; ÆÉÌÅ *FIL2; /* ÎOTE: FUNCTIONAL DESIGN COULD HAVE BEEN CLEANER, BUT THE PROGRAM IS SMALL - SO WHY BOTHER? */ MAIN(ARGC,ARGV) CHAR **ARGV; Û STATIC CHAR *NOTOPEN = "ÃAN'T OPEN %S\N"; STATIC CHAR *LONGER = "%S IS LONGER!\N\N"; IF (ARGC != 3) HELP(); BUF1 = MALLOC(ÂÕÆÓÉÚ); /* ÄYNAMIC ALLOCATION SAVES ON PROGRAM FILE SIZE */ BUF2 = MALLOC(ÂÕÆÓÉÚ); IF ((FIL1=OPENFILE(ARGV[1],"R"))==ÎÕÌÌ ßß FERROR()) Û PRINTF(NOTOPEN,ARGV[1]); EXIT(); Ý IF ((FIL2=OPENFILE(ARGV[2],"R"))==ÎÕÌÌ ßß FERROR()) Û PRINTF(NOTOPEN,ARGV[2]); EXIT(); Ý PRINTF(" %-16S %-16S\N\N",ARGV[1],ARGV[2]); BIAS = 0; FOR (ERRCNT = 0 ; ERRCNT < 20 ;) Û LAST1 = FREAD(BUF1,1,ÂÕÆÓÉÚ,FIL1); /* READ FROM FILE 1 */ LAST2 = FREAD(BUF2,1,ÂÕÆÓÉÚ,FIL2); /* READ FROM FILE 2 */ LAST = LAST1; IF (LAST1 != LAST2) Û IF (LAST1 > LAST2) Û LAST = LAST2; PRINTF(LONGER,ARGV[1]); Ý ELSE PRINTF(LONGER,ARGV[2]); Ý FOR (I=0; I ÍÁØÅÒÒ) Û PUTS("\NÔOO MANY ERRORS!\N"); BREAK; Ý Ý Ý IF (LAST<ÂÕÆÓÉÚ) BREAK; BIAS += ÂÕÆÓÉÚ; Ý IF (LAST1==LAST2 && ERRCNT==0) PUTS("\NÆILES MATCH."); ELSE Û IF (ERRCNT) PRINTF("\NÔHERE WERE AT LEAST %D MISMATCHES.\N",ERRCNT); ELSE PUTS("\NÔHERE WERE NO MISMATCHES TO THIS POINT."); Ý Ý /* ÏPEN A FILE, ALLOWING DEVICE SPECIFICATION. */ OPENFILE(NAME,HOW) CHAR *NAME,*HOW; Û CHAR *XNAME; CHAR C; UNSIGNED DVC; XNAME = NAME; /* COPY POINTER */ DVC = 8; /* DEFAULT IS DEVICE 8 */ IF ((C=*XNAME) == '#') Û XNAME++; IF (((C=*XNAME) == '8') ßß ((C=*XNAME) == '9')) Û XNAME++; DVC = (8 + (C - '8')); IF (*XNAME==':') XNAME++; ELSE Û PRINTF("MISSING ':' IN DEVICE SPECIFICATION\N%S\N",XNAME); RETURN ÎÕÌÌ; Ý Ý ELSE Û PRINTF("ILLEGAL DEVICE NUMBER:\N%S\N",XNAME); RETURN ÎÕÌÌ; Ý Ý DEVICE(DVC); RETURN (FOPEN(XNAME,HOW)); Ý /* ÅXPLAIN PROGRAM TO USER */ HELP() Û PUTS("ÔHIS PROGRAM COMPARES 2 FILES AS BINARY"); PUTS("DATA. ÉT CAN BE USED TO COMPARE EITHER"); PUTS("ÓÅÑ OR ÐÒÇ FILES (OR ONE OF EACH)."); PUTS("ÒEMEMBER TO SUFFIX ÐÒÇ FILENAMES WITH"); PUTS("',P'. ÁLSO, THE DEVICE NUMBER FOR EACH"); PUTS("FILE MAY BE SPECIFIED."); PUTS("ÕSAGE: $ BINCMP FILE1 FILE2"); PUTS(" $ BINCMP #8:FILE1,P #9:FILE2,P"); PUTS("\NÔHIS PROGRAM IS CURRENTLY HARDWIRED TO"); PRINTF("ABORT AFTER %D ERRORS.\N",ÍÁØÅÒÒ); PUTS("ÒEMEMBER, WHEN COMPARING ÐÒÇ FILES THAT"); PUTS("THE ADDRESS REPORTED SHOULD BE ADJUSTED"); PUTS("BY LOAD ADDRESS MINUS 2 (LA-2)."); EXIT(); Ý