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 / With / With.mod < prev    next >
Text File  |  1989-10-19  |  6KB  |  204 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    With.mod
  3.     :Author.     Fridtjof Siebert
  4.     :Address.    Nobileweg 67, D-7-Stgt-40
  5.     :Shortcut.   [fbs]
  6.     :Version.    1.0
  7.     :Date.       19-Jan-88
  8.     :Copyright.  PD
  9.     :Language.   Modula-II
  10.     :Translator. M2Amiga v3.1d
  11.     :Imports.    arp.library 34
  12.     :Contents.   Programm to execute a CLI command on multiple files
  13.     :Usage.      WITH <File-Pattern> <Command> [ALL] [DIRS] [FILES] [SHOW]
  14. ---------------------------------------------------------------------------*)
  15.  
  16. MODULE With;
  17.  
  18. (*------  IMPORTs:  ------*)
  19.  
  20. FROM SYSTEM  IMPORT ADR, ADDRESS, LONGSET;
  21. FROM Arts    IMPORT Assert, wbStarted, dosCmdBuf, dosCmdLen, Terminate,
  22.                     detectCtrlC;
  23. FROM ARP     IMPORT StdAnchorPathPtr, FindFirst, FindNext, FreeAnchorChain,
  24.                     ArpAlloc, AnchorPathPtr, Puts, GADS, AddDANode,
  25.                     FreeDAList, DirEntryTypeSet, DirectoryEntryPtr, Printf,
  26.                     errorBreak, ArpAllocMem, Examine, ExNext, Lock, UnLock,
  27.                     TackOn, CheckBreak, Execute, ArpOpen;
  28. FROM Dos     IMPORT ctrlC, ctrlF, noMoreEntries, FileInfoBlockPtr, FileLockPtr,
  29.                     sharedLock, newFile, FileHandlePtr;
  30. FROM Exec    IMPORT MemReqs, MemReqSet;
  31.  
  32. (*------  CONSTs:  ------*)
  33.  
  34. CONST
  35.   Template = "PATTERN,COMMAND,TO/k,ALL/S,DIRS/S,FILES/S,SHOW/S";
  36.   Help = '#With starts a cli command multiple times with different files##Usage: With <File-Pattern> "Command" [TO <File>] [ALL] [DIRS] [FILES] [SHOW]##Example: WITH * "RENAME $ AS $.txt" ALL FILES SHOW##© 1988 by Fridtjof Siebert / AMOK Stuttgart#';
  37.   Break = "*** Break.";
  38.   NoMem = "no memory.";
  39.  
  40. (*------  TYPEs:  ------*)
  41.  
  42. TYPE
  43.   StringType = ARRAY[0..255] OF CHAR;
  44.  
  45. (*------  VARs:  ------*)
  46.  
  47. VAR
  48.   ap: StdAnchorPathPtr;
  49.   CharPtr: POINTER TO CHAR;
  50.   Args: RECORD pat,comm,to,all,dirs,files,show: ADDRESS END;
  51.   Argc: INTEGER;
  52.   l: LONGINT;
  53.   n,c,res: INTEGER;
  54.   String: StringType;
  55.   StringPtr: POINTER TO StringType;
  56.   StrFound: BOOLEAN;
  57.   FileList,de: DirectoryEntryPtr;
  58.   break: LONGSET;
  59.   out: FileHandlePtr;
  60.  
  61. (*------  Procedure for option ALL:  ------*)
  62.  
  63. PROCEDURE GetAllFiles(Path: StringType): BOOLEAN;
  64.  
  65. VAR
  66.   fib: FileInfoBlockPtr;
  67.   lock: FileLockPtr;
  68.   res: BOOLEAN;
  69.  
  70. BEGIN
  71.   fib := ArpAllocMem(SIZE(fib^),MemReqSet{chip,memClear});
  72.   lock := Lock(ADR(Path),sharedLock);
  73.   IF lock=NIL THEN
  74.     StringPtr := ADR(Path); l:=Printf(ADR("Can't lock %s !"),ADR(StringPtr));
  75.     RETURN FALSE;
  76.   END;
  77.   res := TRUE;
  78.   IF Examine(lock,fib) THEN
  79.     LOOP
  80.       IF NOT ExNext(lock,fib) THEN EXIT END;
  81.       WITH fib^ DO
  82.         String := Path; TackOn(ADR(String),ADR(fileName));
  83.         IF ((Args.files=NIL) AND (dirEntryType>0)) OR
  84.            ((Args.dirs =NIL) AND (dirEntryType<0)) THEN
  85.           IF AddDANode(ADR(String),ADR(FileList),0,DirEntryTypeSet{})=NIL THEN
  86.             l:= Puts(ADR(NoMem)); res := FALSE; EXIT;
  87.           END;
  88.         END;
  89.         IF dirEntryType>0 THEN
  90.           IF NOT GetAllFiles(String) THEN res := FALSE; EXIT END;
  91.         END;
  92.         IF CheckBreak(LONGSET{ctrlC..ctrlF},NIL)#LONGSET{} THEN
  93.           l:=Puts(ADR(Break)); res := FALSE; EXIT;
  94.         END;
  95.       END;
  96.     END;
  97.   END;
  98.   UnLock(lock);
  99.   RETURN res;
  100. END GetAllFiles;
  101.  
  102. (*------  MAIN:  ------*)
  103.  
  104. BEGIN
  105.  
  106. (*------  Don't you start us from WB:  ------*)
  107.  
  108.   Assert(NOT wbStarted,ADR("Please start from CLI!"));
  109.  
  110. (*------  Let's modify our HELP-constant:  ------*)
  111.  
  112.   CharPtr := ADR(Help);
  113.   WHILE CharPtr^#0C DO IF CharPtr^="#" THEN CharPtr^:=12C END; INC(CharPtr) END;
  114.  
  115. (*------  Handle Argument list:  ------*)
  116.  
  117.   Argc := GADS(dosCmdBuf,dosCmdLen,ADR(Help),ADR(Args),ADR(Template));
  118.   IF Argc<2 THEN l := Puts(ADR(Help)); Terminate(0) END;
  119.   IF Args.to#NIL THEN out := ArpOpen(Args.to,newFile) ELSE out := NIL END;
  120.  
  121. (*------  Get list of files:  ------*)
  122.  
  123.   detectCtrlC := FALSE;
  124.   ap := ArpAlloc(SIZE(ap^));
  125.   IF ap=NIL THEN l := Puts(ADR(NoMem)); Terminate(0) END;
  126.  
  127.   ap^.anchor.length := 256;
  128.   ap^.anchor.breakBits := LONGSET{ctrlC..ctrlF};
  129.  
  130.   res := FindFirst(Args.pat,AnchorPathPtr(ap));
  131.   WHILE res = 0 DO
  132.     WITH ap^.anchor.info DO
  133.       IF (Args.all#NIL) AND (dirEntryType>0) THEN
  134.         StringPtr := ADR(ap^.buffer);
  135.         IF NOT GetAllFiles(StringPtr^) THEN
  136.           FreeDAList(FileList); Terminate(0);
  137.         END;
  138.       END;
  139.       IF ((Args.files=NIL) AND (dirEntryType>0)) OR
  140.          ((Args.dirs =NIL) AND (dirEntryType<0)) THEN
  141.         IF AddDANode(ADR(ap^.buffer),ADR(FileList),0,DirEntryTypeSet{})=NIL THEN
  142.           l:= Puts(ADR(NoMem));
  143.           FreeDAList(FileList);
  144.           Terminate(0);
  145.         END;
  146.       END;
  147.     END;
  148.     res := FindNext(AnchorPathPtr(ap));
  149.   END;
  150.   FreeAnchorChain(AnchorPathPtr(ap));
  151.  
  152. (*------  Do It:  ------*)
  153.  
  154.   CASE res OF
  155.   errorBreak: l:=Puts(ADR(Break)); |
  156.   noMoreEntries:
  157.     de := FileList;
  158.     break := LONGSET{};
  159.     WHILE (de#NIL) AND (break=LONGSET{}) DO
  160.       n := 0; CharPtr := Args.comm; StrFound := FALSE;
  161.       WHILE (CharPtr^#0C) AND (n#-1) DO
  162.         IF CharPtr^=";" THEN CharPtr^ := 12C END;
  163.         IF CharPtr^="$" THEN
  164.           StrFound := TRUE; c := 0;
  165.           WHILE (de^.name[c]#0C) AND (n#-1) DO
  166.             String[n]:=de^.name[c]; INC(c); INC(n); IF n>253 THEN n:=-1 END;
  167.           END;
  168.         ELSE
  169.           String[n] := CharPtr^; INC(n); IF n>253 THEN n := -1 END;
  170.         END;
  171.         INC(CharPtr);
  172.       END;
  173.       IF NOT StrFound THEN
  174.         String[n] := " "; INC(n); c := 0;
  175.         WHILE (de^.name[c]#0C) AND (n#-1) DO
  176.           String[n]:=de^.name[c]; INC(c); INC(n); IF n>253 THEN n :=-1 END;
  177.         END;
  178.       END;
  179.       IF n=-1 THEN
  180.         l:=Puts(ADR("string too long!"));
  181.       ELSE
  182.         String[n] := 0C;
  183.         IF Args.show#NIL THEN l:=Puts(ADR(String)) END;
  184.         IF Execute(ADR(String),NIL,out)=0 THEN
  185.           l := Puts(ADR("Execute failed."));
  186.         END;
  187.       END;
  188.       de := de^.next;
  189.       break := CheckBreak(LONGSET{ctrlC..ctrlF},NIL);
  190.     END;
  191.     IF break=LONGSET{} THEN
  192.       l := Puts(ADR("--- Done."));
  193.     ELSE
  194.       l := Puts(ADR(Break));
  195.     END; |
  196.  
  197.   ELSE
  198.     l:=Printf(ADR("Dos Error # %d"),ADR(res)); l:=Puts(ADR(""));
  199.   END;
  200.  
  201.   FreeDAList(FileList);
  202.  
  203. END With.
  204.