DIRECTORY Process USING [Detach], Rope USING [Concat, Equal, ROPE], TiogaDocumentsCache, TiogaDocumentPrivate, TiogaInput USING [FreeTree], TiogaProfile USING [unsavedDocumentCacheSize], TiogaNode USING [RefBranchNode]; TiogaDocumentsCacheImpl: CEDAR MONITOR IMPORTS Process, Rope, TiogaDocumentsCache, TiogaInput, TiogaProfile EXPORTS TiogaDocumentsCache, TiogaDocumentPrivate = BEGIN OPEN TiogaDocumentsCache, TiogaDocumentPrivate; list: LIST OF UnsavedDocumentInfo; UnsavedDocumentInfo: TYPE = REF UnsavedDocumentInfoRec; UnsavedDocumentInfoRec: TYPE = RECORD [fileName: ROPE, root: TiogaNode.RefBranchNode]; GetList: PUBLIC ENTRY PROC RETURNS [rope: ROPE] = { FOR l: LIST OF UnsavedDocumentInfo _ list, l.rest UNTIL l=NIL DO rope _ Rope.Concat[rope, Rope.Concat["\n", l.first.fileName]]; ENDLOOP }; RecordUnsavedDocument: PUBLIC ENTRY PROC [ fileName: ROPE, root: TiogaNode.RefBranchNode] = { ENABLE UNWIND => NULL; Size: PROC RETURNS [size: INTEGER] = { size _ 0; IF list=NIL THEN RETURN; FOR l: LIST OF UnsavedDocumentInfo _ list, l.rest UNTIL l=NIL DO size _ size+1; ENDLOOP }; info: UnsavedDocumentInfo; oldRoot: TiogaNode.RefBranchNode; IF (oldRoot _ SearchList[fileName]) # NIL THEN -- discard previous entry, if any TiogaInput.FreeTree[oldRoot]; info _ NEW[UnsavedDocumentInfoRec _ [fileName, root]]; list _ CONS[info, list]; WHILE Size[] > MAX[TiogaProfile.unsavedDocumentCacheSize, 0] DO DiscardOldest[]; ENDLOOP; TRUSTED {Process.Detach[FORK Update[]] }}; FindUnsavedDocument: PUBLIC ENTRY PROC [fileName: ROPE] RETURNS [root: TiogaNode.RefBranchNode] = { ENABLE UNWIND => NULL; IF (root _ SearchList[fileName]) # NIL THEN TRUSTED {Process.Detach[FORK Update[]] }}; DiscardOldest: PROC = { IF list=NIL THEN RETURN; FOR l: LIST OF UnsavedDocumentInfo _ list, l.rest DO IF l.rest # NIL THEN LOOP; -- spin until get to the oldest entry TiogaInput.FreeTree[SearchList[l.first.fileName]]; RETURN; ENDLOOP }; SearchList: PROC [fileName: ROPE] RETURNS [root: TiogaNode.RefBranchNode] = { -- if find, then remove prev: LIST OF UnsavedDocumentInfo; IF list=NIL THEN RETURN [NIL]; IF Rope.Equal[list.first.fileName, fileName, FALSE] THEN { root _ list.first.root; list _ list.rest; RETURN }; prev _ list; FOR l: LIST OF UnsavedDocumentInfo _ list.rest, l.rest UNTIL l=NIL DO IF Rope.Equal[l.first.fileName, fileName, FALSE] THEN { root _ l.first.root; prev.rest _ l.rest; RETURN }; prev _ l; ENDLOOP; RETURN [NIL] }; END. °TiogaDocumentsCacheImpl.mesa; Edited by Paxton on June 20, 1983 1:28 pm Last Edited by: Maxwell, January 6, 1983 11:10 am Last Edited by: Plass, March 16, 1983 11:59 am ʘJšÏcG™GJšÏk1™1J™.J˜šž ˜ Jšœžœ ˜Jšœžœžœ˜!Jšœ˜J˜Jšœ žœ ˜Jšœ žœ˜.Jšœ žœ˜ J˜—Jšœž ˜&J˜Jšžœ=˜DJšžœ*žœ˜3J˜Jšžœžœ+˜5J˜Jšœžœžœ˜"J˜Jšœžœžœ˜7Jšœžœžœ žœ!˜VJ˜š Ïnœžœžœžœžœžœ˜3š žœžœžœ$žœžœž˜@Jšœ>˜>Jšžœ˜ ——J˜šŸœžœ˜*Jšœ žœ$˜2Jšžœžœžœ˜šŸœžœžœžœ˜&J˜ Jšžœžœžœžœ˜š žœžœžœ$žœžœž˜@Jšœ˜Jšžœ˜ ——Jšœ˜Jšœ!˜!šžœ$žœžœ!˜PJ˜—Jšœžœ,˜6Jšœžœ ˜Jšžœ žœ+žœžœ˜YJšžœžœ˜*—J˜šŸœžœ žœ˜7Jšžœ$˜+Jšžœžœžœ˜Jš žœ!žœžœžœžœ˜V—J˜šŸ œžœ˜Jšžœžœžœžœ˜šžœžœžœ$ž˜4Jš žœ žœžœžœ%˜@J˜2Jšžœ˜Jšžœ˜ ——J˜šŸ œžœ žœ˜!Jšžœ%˜CJšœžœžœ˜"Jš žœžœžœžœžœ˜šžœ+žœžœ˜:J˜J˜Jšžœ˜ —J˜ š žœžœžœ)žœžœž˜Ešžœ(žœžœ˜7J˜Jšœ˜Jšžœ˜ —J˜ Jšžœ˜—Jšžœžœ˜—J˜Jšžœ˜J˜—…— ˆ Õ