home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1996-09-27 | 8.6 KB | 331 lines |
- IMPLEMENTATION MODULE DuMisc;
-
- (*$S-*)(*$T-*)(*$A+*)
- (*
- This module has several miscellaneous procedures
- and was separated to keep the main program from getting
- more cluttered than it was. Someday I'll clean it all up.
-
- Written: 3/21/87 by Greg Browne
-
- Compiles on TDI's Modula-2 Compiler version 2.20a
-
-
- *)
-
- FROM SYSTEM IMPORT ADR, NULL,ADDRESS,TSIZE;
- FROM Ports IMPORT ReplyMsg,GetMsg,MessagePtr;
- FROM DOSCodeLoader IMPORT Execute;
- FROM DOSFiles IMPORT Lock,Unlock,AccessRead,FileLock,Open, Close,
- Read, Write, DeleteFile, Examine,Rename,
- FileInfoBlock, IoErr, FileHandle,
- AccessWrite,ModeNewFile, ModeOldFile;
- FROM DuTypefile IMPORT DisplayASCII,DisplayHex;
- FROM Conversions IMPORT ConvertToString;
- FROM Gadgets IMPORT RefreshGadgets,AddGadget,RemoveGadget;
- FROM Strings IMPORT Assign,Concat,Length,Insert;
- FROM Memory IMPORT AllocMem,FreeMem,MemReqSet,MemClear,MemPublic;
- FROM Intuition IMPORT IntuitionText;
- FROM DuWindow IMPORT GadgetNames,DuWindowPtr,DuGads,SlidePot,
- IOStringInfo,IOString,NullReqPtr;
-
- FROM DuDir IMPORT DirEntries,DirTable,QSort;
-
- (* All defined in .def module to be exportable
- TYPE
- CharPtr = POINTER TO CHAR;
-
- VAR
- MyMsg : IntuiMessagePtr;
- MyClass : IDCMPFlagSet;
- MyGadPtr : GadgetPtr;
- OutHandle : FileHandle;
- GadGot : GadgetNames;
- MyX,MyY : INTEGER;
- Gp : ARRAY[0..255] OF CHAR;
- *)
-
- TYPE
- FileInfoBlockPtr = POINTER TO FileInfoBlock;
-
- VAR
- Cp : CharPtr;
- (* ================================*)
-
- PROCEDURE CheckMessages():BOOLEAN;
- BEGIN
- MyMsg := GetMsg(DuWindowPtr^.UserPort);
- IF MyMsg = NULL THEN RETURN FALSE END;
- MyClass := MyMsg^.Class;
- MyX := MyMsg^.MouseX;
- MyY := MyMsg^.MouseY;
- MyGadPtr := MyMsg^.IAddress;
- ReplyMsg(MessagePtr(MyMsg));
- GadGot := GadgetNames(MyGadPtr^.GadgetID);
- RETURN TRUE;
- END CheckMessages;
-
- PROCEDURE FillGpto(VAR a,b:ARRAY OF CHAR);
- BEGIN
- Insert(" to ",Gp,0);
- Insert(b,Gp,0);
- Insert(a,Gp,0);
- ReplaceRSDM(msg,Gp);
- END FillGpto;
-
-
- PROCEDURE AddNameToPath(VAR name,path:ARRAY OF CHAR);
- (* Second name is a path with no filename, first is filename to add *)
- BEGIN
- Assign(Gp,path);
- IF (Gp[Length(path)-1] <> ":") THEN Concat(Gp,"/",Gp) END;
- Concat(Gp,name,Gp);
- END AddNameToPath;
-
-
- PROCEDURE DoFileLook():BOOLEAN;
- VAR s: BOOLEAN; i:CARDINAL ;g:GadgetNames;
- l: FileLock;
- BEGIN
- g := GadGot;
- FOR i := 1 TO DirEntries DO
- IF CheckMessages() THEN RETURN TRUE END;
- WITH DirTable[i]^ DO
- IF (IsSelected) AND (NOT IsDir) THEN
- s := FALSE;
- IF (g = htype) OR (g = type) THEN s := TRUE END;
- l := Lock(FileName,AccessRead);
- IF (l <> 0) THEN
- Unlock(l);
- IF (g = type) OR (g = print) THEN
- DisplayASCII(FileName,s)
- ELSE
- DisplayHex(FileName,s)
- END;
- WasSelected := TRUE;
- IsSelected := FALSE;
- END
- END
- END
- END;
- RETURN FALSE;
- END DoFileLook;
-
-
- PROCEDURE DuCopy(VAR from,into:ARRAY OF CHAR):LONGINT;
- VAR fhand,tohand:FileHandle;siz:CARDINAL;er,ex:LONGINT;
- ad:ADDRESS;
- BEGIN
- ex := LONGINT(0);
- siz := 4000H;
- AddNameToPath(from,into);
- fhand := Open(from,ModeOldFile);
- IF fhand = 0 THEN RETURN IoErr() END;
- tohand := Open(Gp,ModeNewFile);
- IF tohand = 0 THEN
- er := IoErr();
- Close(fhand);
- RETURN er;
- END;
- REPEAT
- ad := AllocMem(LONGCARD(siz),MemReqSet{MemPublic,MemClear});
- IF ad = NULL THEN siz := siz DIV 2 END;
- UNTIL (ad # NULL) OR (siz < 512);
- IF ad = NULL THEN
- Close(fhand);
- Close(tohand);
- RETURN LONGINT(-3)
- END;
- FillGpto("Copying ",from);
- REPEAT
- er := Read(fhand,ad,LONGCARD(siz));
- IF er > 0 THEN er := Write(tohand,ad,LONGCARD(er)) ELSE ex := IoErr() END;
- UNTIL (er <> LONGINT(siz));
- Close(fhand);
- Close(tohand);
- FreeMem(ad,LONGCARD(siz));
- RETURN ex;
- END DuCopy;
-
-
- PROCEDURE CheckDestination():BOOLEAN;
- (* checks to see that IOString[dest] is a valid path without name *)
- VAR l : FileLock; IsOrNot:BOOLEAN; m:FileInfoBlockPtr;
- BEGIN
- IsOrNot := FALSE; (* Assume not ok *)
- l := Lock(IOString[dest],AccessRead);
- IF l = 0 THEN RETURN IsOrNot END;
- m := AllocMem(TSIZE(FileInfoBlock),MemReqSet{MemPublic,MemClear});
- IF (m # NULL) THEN
- IF Examine(l,m^) AND (m^.fibDirEntryType > 0) THEN IsOrNot := TRUE END;
- END;
- Unlock(l);
- FreeMem(m,TSIZE(FileInfoBlock));
- RETURN IsOrNot;
- END CheckDestination;
-
- PROCEDURE BlankName(VAR name:ARRAY OF CHAR);
- BEGIN
- name[0] := 177C;
- name[1] := 177C;
- name[2] := 0C;
- END BlankName;
-
-
- PROCEDURE DuMoveFile(VAR name,name2:ARRAY OF CHAR):LONGINT;
- (* Returns IoErr or 0 *)
- BEGIN
- IF Rename(name,name2) THEN
- BlankName(name);
- RETURN LONGINT(0)
- END;
- RETURN IoErr();
- END DuMoveFile;
-
-
- PROCEDURE DuDelete(VAR name:ARRAY OF CHAR):LONGINT;
- (* Returns IoErr or 0 *)
- BEGIN
- Assign(Gp,"Deleting ");
- Concat(Gp,name,Gp);
- ReplaceRSDM(msg,Gp);
- IF DeleteFile(name) THEN
- BlankName(name);
- RETURN LONGINT(0);
- END;
- RETURN IoErr();
- END DuDelete;
-
-
- PROCEDURE DuFileTwiddle(WithCopy,WithDelete:BOOLEAN):LONGINT;
- (* Returns IoErr *)
- VAR i:CARDINAL ;g:GadgetNames;
- from,to: FileLock;er:LONGINT;temp:ARRAY[0..30] OF CHAR;
- BEGIN
- g := GadGot;
- IF (NOT CheckDestination()) AND WithCopy THEN RETURN LONGINT(-1) END;
- FOR i := 1 TO DirEntries DO
- IF CheckMessages() THEN RETURN LONGINT(-2) END;
- WITH DirTable[i]^ DO
- IF (IsSelected) AND (NOT IsDir) THEN
- from := Lock(FileName,AccessRead);
- IF (from <> 0) THEN
- Unlock(from);
- IF (NOT WithCopy) AND (NOT WithDelete) THEN
- Assign(temp,FileName);
- AddNameToPath(FileName,IOString[dest]);
- er := DuMoveFile(FileName,Gp);
- IF (er <> 0) THEN RETURN er
- ELSE FillGpto("Moved ",temp);
- END;
- END;
- IF WithCopy THEN
- er := (DuCopy(FileName,IOString[dest]));
- IF (er <> 0) THEN RETURN er END;
- END;
- IF WithDelete THEN
- er := DuDelete(FileName);
- IF (er <> 0) THEN RETURN er END;
- ELSE
- WasSelected := TRUE;
- IsSelected := FALSE;
- END
- END
- END
- END
- END;
- RETURN LONGINT(0);
- END DuFileTwiddle;
-
- PROCEDURE DoIt(WRun:BOOLEAN;VAR a,b,c,d:ARRAY OF CHAR);
- BEGIN
- IF WRun THEN Assign(Gp,"RUN >NIL: ") ELSE Gp := "" END;
- Concat(Gp,a,Gp);
- Concat(Gp," ",Gp);
- Concat(Gp,b,Gp);
- Concat(Gp," ",Gp);
- Concat(Gp,c,Gp);
- IF (d[0] > 0C) THEN
- Concat(Gp,' "',Gp);
- Concat(Gp,d,Gp);
- Concat(Gp,'"',Gp);
- END;
- IF Execute(Gp,FileHandle(0),OutHandle) THEN END;
- END DoIt;
-
- PROCEDURE TryIt(g:GadgetNames;VAR Name:ARRAY OF CHAR);
- BEGIN
- CASE g OF
- arc : DoIt(FALSE,"ARC ",IOString[run],IOString[dest],Name);|
- edit : DoIt(FALSE,"MEmacs ","","",Name); |
- runfr : DoIt(TRUE, Name,"","",IOString[run]); |
- runrf : DoIt(TRUE, IOString[run],"","",Name); |
- show : DoIt(FALSE,"SHOW ","","",Name); |
- execfr: DoIt(FALSE, Name,IOString[run],"",""); |
- execrf: DoIt(FALSE, IOString[run],Name,"","");
- ELSE
- END;
- END TryIt;
-
- PROCEDURE DuExec():LONGINT;
- VAR s: BOOLEAN; i:CARDINAL ;g:GadgetNames;
- l: FileLock;
- BEGIN
- g := GadGot; s:= FALSE;
- FOR i := 1 TO DirEntries DO
- IF CheckMessages() THEN RETURN LONGINT(-2) END;
- WITH DirTable[i]^ DO
- IF (IsSelected) THEN
- IF (NOT IsDir) OR (g = execrf) THEN
- s := TRUE;
- TryIt(g,FileName);
- IsSelected := FALSE;
- WasSelected := TRUE;
- END;
- END;
- END;
- END;
- IF (s = FALSE) THEN
- IF (g = execfr) OR (g=execrf) THEN
- TryIt(g,"")
- ELSIF (g <> show) THEN
- TryIt(g,"");
- END;
- END;
- RETURN LONGINT(0);
- END DuExec;
-
-
- PROCEDURE ReplaceRSDM(g:GadgetNames;VAR a:ARRAY OF CHAR);
- VAR VAR d:INTEGER;
- BEGIN
- d := RemoveGadget(DuWindowPtr,DuGads[g]);
- Assign(IOString[g],a);
- IF g = msg THEN Insert(" ",IOString[g],0) END;
- IOStringInfo[g].NumChars := Length(IOString[g]);
- IOStringInfo[g].BufferPos := Length(IOString[g]);
- d := AddGadget(DuWindowPtr,DuGads[g],d);
- RefreshGadgets(DuGads[g],DuWindowPtr,NullReqPtr^);
- END ReplaceRSDM;
-
-
- PROCEDURE StringIt(n:LONGCARD;VAR s:ARRAY OF CHAR):BOOLEAN;
- VAR Okay:BOOLEAN;
- BEGIN
- ConvertToString(ABS(n),10,FALSE,s,Okay);
- RETURN Okay
- END StringIt;
-
-
- PROCEDURE AskForConfirm;
- BEGIN
- ReplaceRSDM(msg,"Click same GADGET again to DO IT! (Anything else cancels)");
- END AskForConfirm;
-
- (********)
- (* MAIN *)
- (********)
-
- BEGIN
- END DuMisc.
-