home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / UTILITY / CMPFILES.M next >
Encoding:
Text File  |  1994-06-09  |  5.6 KB  |  223 lines

  1. MODULE CmpFiles;
  2. (*$E MOS *)
  3. IMPORT GEMDOSIO;
  4.  
  5. (*
  6.  * Vergleicht die Dateien zweier Disk-Verzeichnisse, optional auch die
  7.  * in deren Unterverzeichnissen.
  8.  *
  9.  * Das Programm kann ohne Argumentangabe gestartet werden. Dann wird
  10.  * nach den beiden Pfaden gefragt.
  11.  * Die Pfade können auch als Argumente (in Command-Line) angegeben werden.
  12.  * Dann kann optional noch irgendein Zeichen als drittes Wort angegeben
  13.  * werden, damit auch die Unterverzeichnisse mitgeprüft werden.
  14.  *
  15.  * Das Programm prüft alle Dateien, die im zuerst angegebenen Verzeichnis
  16.  * stehen. Diese Dateien werden dann im andern Pfad gesucht. Fehlt die
  17.  * Datei dort, wird dies angezeigt ("Open error").
  18.  * Sind die Dateien in beiden Verzeichnissen vorhanden, werden sie
  19.  * verglichen. Sind sie verschieden lang, wird "Different sizes" angezeigt,
  20.  * sind sie nicht identisch, wird "Not equal" ausgegeben.
  21.  *)
  22.  
  23. FROM ArgCVIO IMPORT PtrArgStr, InitArgCV;
  24.  
  25. FROM InOut IMPORT Write, WriteLn, WriteString, WriteInt, Read, ReadString;
  26.  
  27. FROM Files IMPORT File, Access, Open, Close, State;
  28.  
  29. FROM Binary IMPORT FileSize, ReadBytes;
  30.  
  31. FROM Directory IMPORT MakeFullPath, DirQuery, DirEntry,
  32.         QueryFiles, QueryAll, subdirAttr, FileAttrSet;
  33.  
  34. FROM FileNames IMPORT ValidatePath;
  35.  
  36. FROM Strings IMPORT String, Empty, Append, Assign, Length, Space, Upper, Concat;
  37.  
  38. FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD, ASSEMBLER;
  39.  
  40. VAR subdirs, ok: BOOLEAN;
  41.     res: INTEGER;
  42.     destpath: String;
  43.     f1, f2: File;
  44.     buf1, buf2: ARRAY [1..8192] OF CARDINAL;
  45.  
  46.  
  47. PROCEDURE equal (a,b: ADDRESS; n: LONGCARD): BOOLEAN;
  48.   VAR r: BOOLEAN;
  49.   BEGIN
  50.     ASSEMBLER
  51.         MOVE.L  a(A6),A0
  52.         MOVE.L  b(A6),A1
  53.         MOVE.L  n(A6),D0
  54.         MOVEQ   #0,D1
  55.         BRA     l
  56.      l2 SWAP    D0
  57.      l1 CMPM.B  (A0)+,(A1)+
  58.      l  DBNE    D0,l1
  59.         BNE     f
  60.         SWAP    D0
  61.         DBRA    D0,l2
  62.         MOVE.B  -1(A0),D0
  63.         CMP.B   -1(A1),D0
  64.      f  SEQ     D0
  65.         ANDI    #1,D0
  66.         MOVE    D0,r(A6)
  67.     END;
  68.     RETURN r
  69.   END equal;
  70.  
  71. PROCEDURE error (s, m: ARRAY OF CHAR);
  72.   BEGIN
  73.     WriteLn;
  74.     WriteString (s);
  75.     WriteString (Space (60-INTEGER(Length(s))));
  76.     Write (' ');
  77.     WriteString (m)
  78.   END error;
  79.  
  80. PROCEDURE checkFile (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  81.  
  82.   VAR source, dest: String;
  83.       n, n1: LONGCARD;
  84.  
  85.   BEGIN
  86.     Concat (path, entry.name, source, ok);
  87.  
  88.     Open (f1, source, readOnly);
  89.     IF State (f1) < 0 THEN
  90.       error (source, 'Open error');
  91.       RETURN TRUE
  92.     END;
  93.     
  94.     Concat (destpath, entry.name, dest, ok);
  95.     Open (f2, dest, readOnly);
  96.     IF State (f2) < 0 THEN
  97.       error (dest, 'Open error');
  98.       Close (f1);
  99.       RETURN TRUE
  100.     END;
  101.     
  102.     IF FileSize (f1) <> FileSize (f2) THEN
  103.       error (source, 'Different sizes');
  104.       Close (f1);
  105.       Close (f2);
  106.       RETURN TRUE
  107.     ELSE
  108.       n:= SIZE (buf1);
  109.       LOOP
  110.         ReadBytes (f1, ADR (buf1), n, n1);
  111.         ReadBytes (f2, ADR (buf2), n, n);
  112.         IF n <> n1 THEN
  113.           error (entry.name, 'Read error');
  114.           Close (f1);
  115.           Close (f2);
  116.           RETURN TRUE
  117.         ELSIF n=0L THEN
  118.           EXIT
  119.         ELSIF ~equal (ADR (buf1), ADR (buf2), n) THEN
  120.           error (source, 'Not equal');
  121.           Close (f1);
  122.           Close (f2);
  123.           RETURN TRUE
  124.         END
  125.       END;
  126.     END;
  127. (*
  128.     WriteLn;
  129.     WriteString ('OK: ');
  130.     WriteString (path);
  131.     WriteString (entry.name);
  132. *)
  133.     Close (f1);
  134.     Close (f2);
  135.     RETURN TRUE
  136.   END checkFile;
  137.  
  138. PROCEDURE checkDir (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  139.  
  140.   VAR lastpath, source: String;
  141.  
  142.   BEGIN
  143.     IF subdirAttr IN entry.attr THEN
  144.       IF entry.name[0] # '.' THEN
  145.         Concat (path, entry.name, source, ok);
  146.         WriteLn;
  147.         WriteString ('// Path ');
  148.         WriteString (source);
  149.         Append ('\*.*', source, ok);
  150.         lastpath:= destpath;
  151.         Append (entry.name, destpath, ok);
  152.         Append ('\', destpath, ok);
  153.         DirQuery (source, QueryFiles, checkFile, res);
  154.         Close (f1);
  155.         Close (f2);
  156.         DirQuery (source, QueryAll, checkDir, res);
  157.         destpath:= lastpath;
  158.         IF res < 0 THEN
  159.           error (source, "Can't access subdir");
  160.         END
  161.       END
  162.     END;
  163.     RETURN TRUE
  164.   END checkDir;
  165.  
  166. PROCEDURE checkRes (): BOOLEAN;
  167.   VAR ch: CHAR;
  168.   BEGIN
  169.     IF res < 0 THEN
  170.       WriteLn;
  171.       WriteString ('Error #');
  172.       WriteInt (res,0);
  173.       WriteLn;
  174.       Read (ch);
  175.       RETURN TRUE
  176.     END;
  177.     RETURN FALSE
  178.   END checkRes;
  179.  
  180. VAR     argv: ARRAY [0..3] OF PtrArgStr;
  181.         argc: CARDINAL;
  182.         n1: String;
  183.         ch: CHAR;
  184.  
  185. BEGIN
  186.   InitArgCV ( argc, argv );
  187.   IF argc > 2 THEN
  188.     Assign (argv[1]^, n1, ok);
  189.     Assign (argv[2]^, destpath, ok);
  190.     subdirs:= argc > 3
  191.   ELSE
  192.     WriteString ('First folder  ? ');
  193.     ReadString (n1);
  194.     IF Empty (n1) THEN RETURN END;
  195.     WriteString ('Second folder ? ');
  196.     ReadString (destpath);
  197.     IF Empty (destpath) THEN RETURN END;
  198.     subdirs:= TRUE
  199.   END;
  200.   
  201.   ValidatePath (n1);
  202.   ValidatePath (destpath);
  203.   MakeFullPath (n1, res);
  204.   IF checkRes () THEN RETURN END;
  205.   MakeFullPath (destpath, res);
  206.   IF checkRes () THEN RETURN END;
  207.   WriteString ('// Path ');
  208.   WriteString (n1);
  209.   Append ('*.*', n1, ok);
  210.   DirQuery (n1, QueryFiles, checkFile, res);
  211.   IF checkRes () THEN RETURN END;
  212.   Close (f1);
  213.   Close (f2);
  214.   IF subdirs THEN
  215.     DirQuery (n1, QueryAll, checkDir, res);
  216.     IF checkRes () THEN RETURN END;
  217.   END;
  218.   WriteLn;
  219.   IF argc <= 2 THEN
  220.     Read (ch)
  221.   END
  222. END CmpFiles.
  223.