(*--------------------------------------------------------------------------- :Program. .mod :Author. Bernd Preusing :Address. Gerhardstr. 16 D-2200 Elmshorn :Phone. 04121/22486 :Shortcut. [bep] :Version. 1.0 :Date. Aug-87 :Copyright. PD :Language. Modula-II :Translator. M2Amiga :Imports. :UpDate. :Contents. Show differences of two files :Remark. ---------------------------------------------------------------------------*) MODULE Diff; FROM SYSTEM IMPORT ADR, ADDRESS, CAST; FROM InOut IMPORT Write, WriteString, WriteLn, WriteHex, WriteInt; FROM Arts IMPORT Assert; FROM FileSystem IMPORT File, Lookup, Close, ReadBytes, Response, Length; FROM Arguments IMPORT NumArgs, GetArg; FROM Heap IMPORT Allocate, Deallocate; VAR i,l1,l2,errs:LONGINT; f1,f2:File; len:INTEGER; s1,s2:ARRAY[0..50] OF CHAR; a1,a2: ADDRESS; (* $R- $V- *) PROCEDURE ShowDiff; VAR c1,c2:CHAR; BEGIN c1:=CAST(CHAR,a1^); c2:=CAST(CHAR,a2^); WriteHex(i,6); WriteString(": "); WriteHex(ORD(c1),2); WriteString(" "); IF (c1<' ') OR (ORD(c1)>126) THEN Write('.'); ELSE Write(c1); END; WriteString(" | "); WriteHex(ORD(c2),2); Write(' '); IF (c2<' ') OR (ORD(c2)>126) THEN Write('.'); ELSE Write(c2); END; WriteLn; INC(errs); END ShowDiff; BEGIN i:=NumArgs(); errs:=0; IF i#2 THEN WriteString("usage: Diff file1 file2"); WriteLn; ELSE GetArg(1,s1,len); GetArg(2,s2,len); Lookup(f1,s1,0,FALSE); Assert(f1.res=done,ADR("1.File nicht zu öffnen.")); Lookup(f2,s2,0,FALSE); IF f2.res#done THEN Close(f1); Assert(f2.res=done,ADR("2.File nicht zu öffnen.")); END; Length(f1,l1); Length(f2,l2); Allocate(a1,l1); Assert(a1#NIL,ADR("Nicht genug Speicher für File1")); Allocate(a2,l2); Assert(a2#NIL,ADR("Nicht genug Speicher für File1")); ReadBytes(f1,a1,l1,i); Assert(f1.res=done,ADR("Lesefehler File1")); ReadBytes(f2,a2,l2,i); Assert(f2.res=done,ADR("Lesefehler File2")); Close(f1); Close(f2); i:=0; REPEAT IF CAST(CHAR,a1^)#CAST(CHAR,a2^) THEN ShowDiff END; INC(a1); INC(a2); INC(i); DEC(l1); DEC(l2); UNTIL (l1<=0) OR (l2<=0); IF (l1=0) AND (l2#0) THEN WriteString(s1); WriteString(" vorzeitig beendet."); WriteLn; ELSIF (l1#0) AND (l2=0) THEN WriteString(s2); WriteString(" vorzeitig beendet."); WriteLn; END; IF errs#0 THEN WriteInt(errs,5); ELSE WriteString("Keine"); END; WriteString(" Unterschiede gefunden."); WriteLn; END; END Diff.