home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff253.lzh / DumpDiff / DumpDiff.mod < prev    next >
Text File  |  1989-10-19  |  4KB  |  178 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    DumpDiff.mod
  3.     :Author.     Fridtjof Siebert
  4.     :Address.    Nobileweg 67, D-7000 Stuttgart 40
  5.     :Shortcut.   [fbs]
  6.     :Version.    1.0
  7.     :Date.       13-Aug-89
  8.     :Copyright.  PD
  9.     :Language.   Modula-II
  10.     :Translator. M2Amiga v3.2
  11.     :History.    created from Bernd Preusing's Diff Program
  12.     :Contents.   Show differences of two files
  13. ---------------------------------------------------------------------------*)
  14.  
  15. MODULE DumpDiff;
  16.  
  17. FROM SYSTEM IMPORT
  18.     ADR, ADDRESS, CAST;
  19.  
  20. FROM InOut IMPORT
  21.     Write, WriteString, WriteLn, WriteHex, WriteInt;
  22.  
  23. FROM Arts IMPORT
  24.     Assert;
  25.  
  26. FROM FileSystem IMPORT
  27.     File, Lookup, Close, ReadBytes, Response, Length;
  28.  
  29. FROM Arguments IMPORT
  30.      NumArgs, GetArg;
  31.  
  32. FROM Heap IMPORT Allocate, Deallocate;
  33.  
  34. TYPE wp = PROCEDURE(CHAR);
  35.  
  36. VAR i,l1,l2,errs:LONGINT;
  37.     f1,f2:File;
  38.     len:INTEGER;
  39.     s1,s2:ARRAY[0..50] OF CHAR;
  40.     a1,a2: POINTER TO CHAR;
  41.     equalmode: BOOLEAN;
  42.     S1,S2,ch1,ch2: ARRAY [0..255] OF CHAR;
  43.     L1,L2,cL1,cL2: INTEGER;
  44.  
  45.  
  46. PROCEDURE write1(c: CHAR);
  47.  
  48. BEGIN
  49.   S1[L1] := c; INC(L1);
  50. END write1;
  51.  
  52. PROCEDURE write2(c: CHAR);
  53.  
  54. BEGIN
  55.   S2[L2] := c; INC(L2);
  56. END write2;
  57.  
  58. PROCEDURE writec2(c: CHAR);
  59.  
  60. BEGIN
  61.   ch2[cL2] := c; INC(cL2);
  62. END writec2;
  63.  
  64. PROCEDURE writec1(c: CHAR);
  65.  
  66. BEGIN
  67.   ch1[cL1] := c; INC(cL1);
  68. END writec1;
  69.  
  70. PROCEDURE write(c: CHAR);
  71.  
  72. BEGIN
  73.   write1(c); write2(c); writec1(c); writec2(c);
  74. END write;
  75.  
  76. PROCEDURE Mode(ok: BOOLEAN);
  77.  
  78. BEGIN
  79.   IF ok # equalmode THEN
  80.     equalmode := ok;
  81.     write(33C); write("[");
  82.     IF ok THEN write("0") ELSE write("3"); write("3") END;
  83.     write("m");
  84.   END;
  85.   IF NOT ok THEN INC(errs) END;
  86. END Mode;
  87.  
  88. PROCEDURE whex(c: CHAR; p: wp);
  89.  
  90.   PROCEDURE whexdig(i: INTEGER);
  91.  
  92.   BEGIN
  93.     IF i>9 THEN INC(i,55) ELSE INC(i,30H) END;
  94.     p(CHR(i));
  95.   END whexdig;
  96.  
  97. BEGIN
  98.   whexdig(ORD(c) DIV 16); whexdig(ORD(c) MOD 16);
  99. END whex;
  100.  
  101. PROCEDURE Out();
  102.  
  103. BEGIN
  104.   Mode(TRUE); WriteHex(i-7,8); WriteString(":  ");
  105.   S1[L1] := 0C; WriteString(S1); Write(" "); L1 := 0; ch1[cL1] := 0C; WriteString(ch1); cL1 := 0;
  106.   WriteString("  |  ");
  107.   S2[L2] := 0C; WriteString(S2); Write(" "); L2 := 0; ch2[cL2] := 0C; WriteString(ch2); cL2 := 0;
  108.   WriteLn;
  109. END Out;
  110.  
  111. PROCEDURE writehex(c1,c2: CHAR);
  112.  
  113.   PROCEDURE ascii(c: CHAR): CHAR;
  114.  
  115.   BEGIN
  116.     CASE c OF 40C..177C,240C..377C: RETURN c ELSE RETURN "." END;
  117.   END ascii;
  118.  
  119. BEGIN
  120.   whex(c1,write1); writec1(ascii(c1));
  121.   whex(c2,write2); writec2(ascii(c2));
  122.   IF i MOD 4 = 3 THEN write1(" "); write2(" ") END;
  123.   IF (i MOD 8 = 7) THEN Out END;
  124. END writehex;
  125.  
  126. BEGIN
  127.   i:=NumArgs();
  128.   errs:=0; equalmode := TRUE;
  129.   IF i#2 THEN
  130.     WriteString("usage: DumpDiff file1 file2");
  131.     WriteLn;
  132.   ELSE
  133.     GetArg(1,s1,len);
  134.     GetArg(2,s2,len);
  135.     Lookup(f1,s1,0,FALSE);
  136.     Assert(f1.res=done,ADR("1.File nicht zu öffnen."));
  137.     Lookup(f2,s2,0,FALSE);
  138.     IF f2.res#done THEN
  139.       Close(f1);
  140.       Assert(f2.res=done,ADR("2.File nicht zu öffnen."));
  141.     END;
  142.     Length(f1,l1);
  143.     Length(f2,l2);
  144.     Allocate(a1,l1);
  145.     Assert(a1#NIL,ADR("Nicht genug Speicher für File1"));
  146.     Allocate(a2,l2);
  147.     Assert(a2#NIL,ADR("Nicht genug Speicher für File1"));
  148.     ReadBytes(f1,a1,l1,i);
  149.     Assert(f1.res=done,ADR("Lesefehler File1"));
  150.     ReadBytes(f2,a2,l2,i);
  151.     Assert(f2.res=done,ADR("Lesefehler File2"));
  152.     Close(f1); Close(f2);
  153.     i:=0;
  154.     REPEAT
  155.       Mode(CAST(CHAR,a1^)=CAST(CHAR,a2^));
  156.       writehex(a1^,a2^);
  157.       INC(a1); INC(a2);
  158.       INC(i); DEC(l1); DEC(l2);
  159.     UNTIL (l1<=0) OR (l2<=0);
  160.     Mode(TRUE);
  161.     IF i MOD 8 # 0 THEN
  162.       WHILE i MOD 8 # 0 DO
  163.         write1(" "); write2(" "); write(" ");
  164.         IF i MOD 4 = 3 THEN write1(" "); write2(" ") END;
  165.         INC(i)
  166.       END;
  167.       Out();
  168.     END;
  169.     IF errs#0 THEN
  170.       WriteInt(errs,5);
  171.     ELSE
  172.       WriteString("Keine");
  173.     END;
  174.     WriteString(" Unterschiede gefunden.");
  175.     WriteLn;
  176.   END;
  177. END DumpDiff.
  178.