-- DirImpl.Mesa, last edit 22-Dec-81 13:01:15 -- Pilot 6.0/ Mesa 7.0 DIRECTORY CWF: TYPE USING [WF1], Dir: TYPE USING [ADepRecord, DepSeq, FileInfo], Directory: TYPE USING [ignore, Lookup], File: TYPE USING [Capability, nullCapability], MDModel: TYPE USING [ResetFileEntries]; DirImpl: PROGRAM IMPORTS CWF, Directory, MDModel EXPORTS Dir = { -- no MDS usage -- may raise Directory.Error!!! NewVersion: PUBLIC PROC[fi: Dir.FileInfo, src: BOOL] RETURNS[newVersion: BOOL] = { IF src THEN { fi.srcCap _ File.nullCapability; fi.srcPresent _ FALSE; fi.srcDepSeq _ NIL; fi.srcCreate _ 0; -- will be recomputed fi.srcCap _ Directory.Lookup[fileName: fi.srcFileName, permissions: Directory.ignore]; fi.srcPresent _ TRUE; newVersion _ TRUE; } ELSE { oldCap: File.Capability _ fi.bcdCap; fi.bcdCap _ File.nullCapability; fi.bcdPresent _ FALSE; fi.bcdDepSeq _ NIL; fi.bcdCreate _ 0; -- will be recomputed fi.bcdCap _ Directory.Lookup[fileName: fi.bcdFileName, permissions: Directory.ignore]; fi.bcdPresent _ TRUE; newVersion _ TRUE; IF oldCap ~= File.nullCapability THEN MDModel.ResetFileEntries[oldCap, fi]; }; }; AddToDep: PUBLIC PROC[depseq: Dir.DepSeq, padeprecord: POINTER TO Dir.ADepRecord] = { IF padeprecord^.relation = errortype THEN ERROR; IF depseq.size + 1 >= depseq.maxsize THEN CWF.WF1["Error - too many dependencies for %s.\n"L, IF depseq.bcdFileName ~= NIL THEN depseq.bcdFileName ELSE depseq.srcFileName] ELSE { depseq[depseq.size] _ padeprecord^; depseq.size _ depseq.size + 1; }; }; }. -- uses the diskseq ReadInUnsavedFiles: PUBLIC ENTRY PROC[window: Window.Handle] = { ENABLE UNWIND => NULL; log: Stream.Handle; target: STRING _ [100]; disk: Dir.Disk; WriteP: PROC[ch: CHAR] = { Put.Char[window, ch]; }; log _ Subr.NewStream["NonPermanentFiles"L, Subr.Read ! Subr.FileError => GOTO out]; WHILE Subr.GetLine[log, target] DO disk _ InternalLookup[target]; IF disk ~= NIL THEN { disk.notsaved _ TRUE; CWF.FWF1[WriteP, "%s will be stored on the next Permanent.\n"L, target]; }; ENDLOOP; Stream.Delete[log]; EXITS out => NULL; }; WriteOutUnsavedFiles: PUBLIC ENTRY PROC = { ENABLE UNWIND => NULL; log: Stream.Handle _ NIL; disk: Dir.Disk; LogProc: INTERNAL PROC[ch: CHAR] = { Stream.PutChar[log, ch]; }; FOR i: CARDINAL IN [0 .. diskseq.size) DO disk _ @diskseq[i]; IF disk.notsaved THEN { IF log = NIL THEN log _ Subr.NewStream["NonPermanentFiles"L, Subr.Write]; CWF.FWF1[LogProc, "%s\n"L, disk.filename]; }; ENDLOOP; IF log ~= NIL THEN Stream.Delete[log]; };