home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / showlinks / showlinks.mod < prev    next >
Text File  |  1995-08-04  |  5KB  |  238 lines

  1. MODULE ShowLinks;
  2.  
  3.  
  4. FROM    SYSTEM            IMPORT    ADR, LONGSET;
  5. FROM    Arts            IMPORT    BreakPoint;
  6. FROM    ExecL            IMPORT    SetSignal;
  7. FROM    DosD            IMPORT    ctrlC,
  8.                     sharedLock,
  9.                     dosFib,
  10.                     noFreeStore, noMoreEntries, objectNotFound, break,
  11.                     stLinkFile, stLinkDir,
  12.                     FileLockPtr, FileInfoBlockPtr;
  13. FROM    DosL            IMPORT    IoErr, Fault,
  14.                     AllocDosObject, FreeDosObject,
  15.                     Lock, UnLock,
  16.                     AddPart, NameFromLock,
  17.                     Examine, ExNext;
  18. FROM    String            IMPORT    Length,
  19.                     Copy, CopyPart;
  20. FROM    InOut            IMPORT    WriteString, WriteInt, WriteLn;
  21. FROM    NewArgSupport        IMPORT    Str, StrPtr,
  22.                     StrArray, StrArrayPtr,
  23.                     SetArgumentInfo, UseArguments,
  24.                     ArgMultiple;
  25.  
  26. CONST    Pen1            ="\e[31m";
  27.     Pen2            ="\e[32m";
  28.  
  29.     Version            ="$VER: ShowLinks 0.1 (04.01.94) von Reiner B. Nix";
  30.  
  31.     maxName            =108;
  32.     Space            ="                                                            ";
  33.  
  34. VAR    Weiter            :BOOLEAN;
  35.     i            :CARDINAL;
  36.     Pfade            :StrArrayPtr;
  37.  
  38.  
  39. PROCEDURE UntersuchePfad    (    Pfad        :ARRAY OF CHAR);
  40.  
  41. VAR    ok, Abbruch        :BOOLEAN;
  42.     Signale            :LONGSET;
  43.     PfadSperre        :FileLockPtr;
  44.     InfoBlock        :FileInfoBlockPtr;
  45.  
  46.  
  47.   PROCEDURE FehlerAusgeben    (    KopfText        :ARRAY OF CHAR;
  48.                        FehlerNummer    :LONGINT;
  49.                      ErsatzText        :ARRAY OF CHAR);
  50.  
  51.   VAR    FehlerText        :ARRAY [0..80] OF CHAR;
  52.  
  53.   BEGIN
  54.   WriteString (Pen2);
  55.   IF Fault (FehlerNummer, ADR (KopfText), ADR (FehlerText), 80) THEN
  56.     WriteString ("ShowLinks: ");
  57.     WriteString (FehlerText);
  58.   ELSE
  59.     WriteString ("ShowLinks: ");
  60.     WriteString (KopfText);
  61.     WriteString (" ");
  62.     WriteString (ErsatzText);
  63.     END;
  64.   WriteString (Pen1);
  65.   WriteLn;
  66.  
  67.   (* BreakPoint (ADR ("Fehler!")); *)
  68.   END FehlerAusgeben;
  69.  
  70.  
  71.  
  72.   PROCEDURE VerweisAusgeben    (    InfoBlock        :FileInfoBlockPtr);
  73.  
  74.   VAR    LeerText        :ARRAY [0..60] OF CHAR;
  75.         VerweisName,
  76.         OriginalName        :ARRAY [0..maxName] OF CHAR;
  77.  
  78.  
  79.     PROCEDURE VerfolgeVerweis    (    VerweisName    :ARRAY OF CHAR;
  80.                      VAR OriginalName    :ARRAY OF CHAR);
  81.  
  82.     VAR    ok            :BOOLEAN;
  83.         VerweisSperre        :FileLockPtr;
  84.  
  85.     BEGIN
  86.     VerweisSperre := Lock (ADR (VerweisName), sharedLock);
  87.     IF VerweisSperre # NIL THEN
  88.       IF NOT (NameFromLock (VerweisSperre, ADR (OriginalName), HIGH (OriginalName))) THEN
  89.         Copy (OriginalName, "???")
  90.         END;
  91.       UnLock (VerweisSperre)
  92.  
  93.     ELSE
  94.       Copy (OriginalName, "???")
  95.       END
  96.     END VerfolgeVerweis;
  97.  
  98.  
  99.   (* VerweisAusgeben *)
  100.   BEGIN
  101.   WITH InfoBlock^ DO
  102.     Copy (VerweisName, Pfad);
  103.     IF AddPart (ADR (VerweisName), ADR (InfoBlock^.fileName), maxName) THEN
  104.       WriteString (VerweisName);
  105.       CopyPart (LeerText, Space, 0, 60-Length (VerweisName));
  106.       WriteString (LeerText);
  107.  
  108.       IF    dirEntryType = stLinkFile THEN
  109.         WriteString (" hardlink to ")
  110.       ELSIF dirEntryType = stLinkDir THEN
  111.         WriteString (" dir-link to ")
  112.         END;
  113.  
  114.       VerfolgeVerweis (VerweisName, OriginalName);
  115.       WriteString (OriginalName);
  116.       WriteLn
  117.  
  118.       END
  119.     END
  120.   END VerweisAusgeben;
  121.  
  122.  
  123.   PROCEDURE UntersucheNeuenPfad    (    Pfad        :ARRAY OF CHAR;
  124.                      InfoBlock        :FileInfoBlockPtr);
  125.  
  126.   VAR    NeuerPfad        :ARRAY [0..maxName] OF CHAR;
  127.  
  128.   BEGIN
  129.   Copy (NeuerPfad, Pfad);
  130.   IF AddPart (ADR (NeuerPfad), ADR (InfoBlock^.fileName), maxName) THEN
  131.     (*
  132.     WriteString ("NeuerPfad: ");
  133.     WriteString (NeuerPfad);
  134.     WriteLn;
  135.     *)
  136.  
  137.     UntersuchePfad (NeuerPfad)
  138.     END
  139.   END UntersucheNeuenPfad;
  140.  
  141.  
  142.  
  143. (* UntersuchePfad *)
  144. BEGIN
  145. PfadSperre := Lock (ADR (Pfad), sharedLock);
  146. IF PfadSperre = NIL THEN
  147.   IF IoErr() # objectNotFound THEN            (* Programmfehler: bei         *)
  148.     FehlerAusgeben (Pfad, IoErr (), "Pfad unbekannt!")    (* Rekursion enthält der erste    *)
  149.     END;                        (* Pfad vorheriges Verzeichnis    *)
  150.  
  151.  
  152. ELSE (* PfadSperre # NIL *)
  153.   InfoBlock := AllocDosObject (dosFib, NIL);
  154.   IF InfoBlock = NIL THEN
  155.     FehlerAusgeben ("", noFreeStore, "Speicherplatzmangel!")
  156.  
  157.  
  158.   ELSE
  159.     ok :=Examine (PfadSperre, InfoBlock);
  160.     WHILE ok & Weiter DO
  161.       (*
  162.       WriteString (" >>");
  163.       WriteString (Pfad);
  164.       WriteString (" >>");
  165.       WriteString (InfoBlock^.fileName);
  166.       WriteString (" >>");
  167.       WriteInt    (InfoBlock^.dirEntryType, 3);
  168.       WriteLn;
  169.       *)
  170.  
  171.       Signale := SetSignal (LONGSET {}, LONGSET {});
  172.       IF ctrlC IN Signale THEN
  173.         IF Weiter THEN
  174.           FehlerAusgeben ("", break, "*** Abbruch!");
  175.           Weiter := FALSE
  176.           END
  177.         END;
  178.  
  179.       IF (InfoBlock^.dirEntryType = stLinkDir) OR    (* Verweis gefunden        *)
  180.          (InfoBlock^.dirEntryType = stLinkFile) THEN
  181.         VerweisAusgeben (InfoBlock)
  182.  
  183.       ELSIF InfoBlock^.dirEntryType > 0 THEN        (* VerzeichnisInfo gefunden    *)
  184.         UntersucheNeuenPfad (Pfad, InfoBlock)
  185.         END;
  186.  
  187.       ok := ExNext (PfadSperre, InfoBlock);
  188.       END;
  189.     IF Weiter & (IoErr () # noMoreEntries) THEN
  190.       FehlerAusgeben (Pfad, IoErr (), "Suchfehler!")
  191.       END;
  192.  
  193.     FreeDosObject (dosFib, InfoBlock);
  194.     END;
  195.  
  196.  
  197.   UnLock (PfadSperre);
  198.   END
  199. END UntersuchePfad;
  200.  
  201.  
  202.  
  203. PROCEDURE ProgrammInfo ();
  204.  
  205. VAR    KurzVersion    :ARRAY [0..80] OF CHAR;
  206.  
  207. BEGIN
  208. CopyPart (KurzVersion, Version, 6, Length (Version)-6);
  209.  
  210. WriteLn;
  211. WriteString (Pen2);
  212. WriteString (KurzVersion);
  213. WriteString (Pen1);
  214. WriteLn;
  215.  
  216. WriteString ("  Sucht rekursiv alle Links im angegebenen Pfad.");
  217. WriteLn
  218. END ProgrammInfo;
  219.  
  220.  
  221.  
  222. (* MODULE ShowLinks *)
  223. BEGIN
  224. SetArgumentInfo (ProgrammInfo);
  225. UseArguments ("Path/A/M");
  226.  
  227. Weiter := TRUE;
  228. Pfade := ArgMultiple ("Path");
  229. IF Pfade # NIL THEN
  230.   i := 0;
  231.   WHILE Pfade^[i] # NIL DO
  232.     UntersuchePfad (Pfade^[i]^);
  233.     INC (i)
  234.     END
  235.   END
  236.  
  237. END ShowLinks.
  238.