-- 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]; };