home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / util / cli / CompareHT.lha / Compare / Compare.mod < prev    next >
Encoding:
Text File  |  1997-03-28  |  5.3 KB  |  187 lines

  1. |##########|
  2. |#MAGIC   #|ELNAGMHM
  3. |#PROJECT #|"Compare"
  4. |#PATHS   #|"StdProject"
  5. |#FLAGS   #|xx---x--xx--xxx-x---------------
  6. |#USERSW  #|--------------------------------
  7. |#USERMASK#|--------------------------------
  8. |#SWITCHES#|x----x----------
  9. |##########|
  10.  
  11. MODULE Compare;
  12.  
  13. FROM T_Dos       AS td IMPORT AllDosErr, NoFreeStore, ArgErr,
  14.                               RequiredArgMissing;
  15. FROM Dos               IMPORT TypeGrp, DosMiscGrp, DosIOGrp, DosArgGrp,
  16.                               IoErr, Examine, ExNext, CurrentDir,
  17.                               Unlock, DupLock, PrintFault,
  18.                               FileLockPtr, FileHandlePtr, FileInfoBlockPtr,
  19.                               OpenFromLock, Lock, VPrintf, AssertDos;
  20. FROM System            IMPORT Regs, SysStringPtr, GuruId;
  21. FROM Exec              IMPORT AllocMem, FreeMem;
  22.  
  23. TYPE
  24.   MemBlock = POINTER TO ARRAY OF BYTE;
  25.  
  26. VAR
  27.   tab, n     : INTEGER := 0;
  28.   offsetFail : LONGINT;
  29.  
  30. CONST
  31.   ErrorStr = "*** Error";
  32.  
  33. PROCEDURE CompareMem(mem1 IN A0,mem2 IN A1 : MemBlock;
  34.                      len  IN D2            : LONGCARD; ) : LONGINT;
  35.  
  36. VAR pos IN D3 : LONGCARD
  37.  
  38. | Lösung mit Array-Pointer geht nur mit Filelängen bis 32767
  39. BEGIN
  40. (*
  41.   pos := 0;
  42.   REPEAT
  43.     IF mem1+^#mem2+^ THEN EXIT END;
  44.     INC (pos);
  45.     DEC (len);
  46.   UNTIL =;
  47. *)
  48.   ASSEMBLE(
  49.     CLR pos
  50.     loop:
  51.       CMP.B (mem1)+,(mem2)+
  52.       BNE exit
  53.       ADD #1,pos
  54.       SUB #1,len
  55.     BNE loop
  56.     exit:
  57.   );
  58.  
  59.   IF len=0 THEN
  60.     RETURN -1;
  61.   ELSE
  62.     RETURN pos;
  63.   END;
  64. END CompareMem;
  65.  
  66. PROCEDURE Check (file1, file2 : FileLockPtr);
  67. VAR
  68.   info1, info2 : FileInfoBlockPtr := NIL;
  69.   lock1, lock2 : FileLockPtr      := NIL;
  70.  
  71.   PROCEDURE CheckDir;
  72.   VAR
  73.     oldLock : FileLockPtr;
  74.   BEGIN
  75.     FORGET VPrintf ("%s, %s <dir>"+&10, info1.fileName'ADR, info2.fileName'ADR);
  76.     INC (tab);
  77.     WHILE ExNext (file1, info1) DO
  78.       TRY
  79.         TRACK
  80.           oldLock := CurrentDir (file1);
  81.           lock1 := Lock (info1.fileName'PTR, sharedLock); AssertDos (#);
  82.           FORGET CurrentDir (file2);
  83.           | gleicher Name im anderen Verzeichnis!
  84.           lock2 := Lock (info1.fileName'PTR, sharedLock); AssertDos (#);
  85.           Check (lock1, lock2);
  86.         CLOSE
  87.           FORGET CurrentDir (oldLock);
  88.           IF lock1#NIL THEN Unlock(lock1) END;
  89.           IF lock2#NIL THEN Unlock(lock2) END;
  90.         END;
  91.       EXCEPT OF AllDosErr THEN FORGET PrintFault (IoErrors(GuruId), ErrorStr) END;
  92.       END;
  93.     END;
  94.     DEC (tab);
  95.   END CheckDir;
  96.  
  97.   PROCEDURE CheckFile;
  98.   VAR
  99.     fh1,   fh2   : FileHandlePtr := NIL;
  100.     mem1,  mem2  : MemBlock      := NIL;
  101.   BEGIN
  102.     IF info1.size > info2.size THEN
  103.       FORGET VPrintf ("*** Error: %s > %s", info1.fileName'ADR, info2.fileName'ADR);
  104.     OR_IF < THEN
  105.       FORGET VPrintf ("*** Error: %s < %s", info1.fileName'ADR, info2.fileName'ADR);
  106.     ELSE
  107.       FORGET VPrintf ("%s = %s", info1.fileName'ADR, info2.fileName'ADR);   | WriteBuffer;
  108.       offsetFail := -1;
  109.       IF (info1.size>0) AND (info2.size>0) THEN
  110.         TRACK
  111.           mem1 := AllocMem (info1.size, {}); ASSERT (#, NoFreeStore);
  112.           mem2 := AllocMem (info2.size, {}); ASSERT (#, NoFreeStore);
  113.           lock1 := DupLock (file1);    AssertDos (#);
  114.           lock2 := DupLock (file2);    AssertDos (#);
  115.           | DupLock muß sein, weil OpenFromLock den Lock unlockt
  116.           fh1 := OpenFromLock (lock1); AssertDos (#);
  117.           fh2 := OpenFromLock (lock2); AssertDos (#);
  118.           FORGET Read (fh1, mem1, info1.size);
  119.           FORGET Read (fh2, mem2, info2.size);
  120.  
  121.           offsetFail := CompareMem (mem1, mem2, info1.size);
  122.         CLOSE
  123.           IF mem1#NIL THEN FreeMem (mem1, info1.size) END;
  124.           IF mem2#NIL THEN FreeMem (mem2, info2.size) END;
  125.           IF fh1#NIL  THEN FORGET Close (fh1) END;
  126.           IF fh2#NIL  THEN FORGET Close (fh2) END;
  127.         END;
  128.       END;
  129.       IF offsetFail # -1 THEN
  130.         FORGET VPrintf (", *** Difference in Byte $%lx", offsetFail);
  131.       ELSE
  132.         FORGET VPrintf (" Ok");
  133.       END;
  134.     END;
  135.     FORGET PutStr (&10*);
  136.   END CheckFile;
  137.  
  138. BEGIN
  139.   TRY
  140.     TRACK
  141.       FOR n:=tab-1 TO 0 BY -1 DO FORGET PutStr ("  ") END;
  142.       info1 := AllocDosObject (FIB, DONE); AssertDos (#);
  143.       FORGET Examine (file1, info1);
  144.       info2 := AllocDosObject (FIB, DONE); AssertDos (#);
  145.       FORGET Examine (file2, info2);
  146.       IF (info1.dirEntryType<root) AND (info2.dirEntryType<root) THEN
  147.         CheckFile;
  148.       OR_IF (info1.dirEntryType>=root) AND (info2.dirEntryType>=root) THEN
  149.         CheckDir;
  150.       ELSE
  151.         FORGET VPrintf ("%s - can't compare dir and file", info1.fileName'ADR);
  152.       END;
  153.     CLOSE
  154.       IF info1#NIL THEN FreeDosObject (FIB, info1) END;
  155.       IF info2#NIL THEN FreeDosObject (FIB, info2) END;
  156.     END;
  157.   EXCEPT
  158.     OF AllDosErr THEN FORGET PrintFault (IoErrors(GuruId), ErrorStr) END;
  159.   END;
  160. END Check;
  161.  
  162. CONST
  163.   Template = "SRC/A,DST/A";
  164.  
  165. TYPE
  166.   ArgRec   = RECORD src, dst : SysStringPtr END;
  167.  
  168. VAR
  169.   RD       : RDArgsPtr := NIL;
  170.   args     := ArgRec : ("", "");
  171.   lock1, lock2 : FileLockPtr := NIL;
  172.  
  173. BEGIN
  174.   TRY
  175.     RD := ReadArgs (Template, args'PTR, NIL); AssertDos (#);
  176.     lock1 := Lock (args.src, sharedLock); AssertDos (#);
  177.     lock2 := Lock (args.dst, sharedLock); AssertDos (#);
  178.     Check (lock1, lock2);
  179.   EXCEPT
  180.     OF AllDosErr, ArgErr THEN FORGET PrintFault (IoErrors(GuruId), ErrorStr) END;
  181.   END;
  182. CLOSE
  183.   IF lock1#NIL THEN Unlock(lock1) END;
  184.   IF lock2#NIL THEN Unlock(lock2) END;
  185.   IF RD   #NIL THEN FreeArgs (RD) END;
  186. END Compare.
  187.