DIRECTORY Process USING [Detach], Rope USING [Concat, Equal, ROPE], TEditDocumentsCache USING [Update], TEditDocumentPrivate USING [], TEditInput USING [FreeTree], TEditProfile USING [unsavedDocumentCacheSize], TextNode USING [Ref]; TEditDocumentsCacheImpl: CEDAR MONITOR IMPORTS Process, Rope, TEditDocumentsCache, TEditInput, TEditProfile EXPORTS TEditDocumentsCache, TEditDocumentPrivate = BEGIN ROPE: TYPE ~ Rope.ROPE; list: LIST OF UnsavedDocumentInfo; UnsavedDocumentInfo: TYPE = REF UnsavedDocumentInfoRec; UnsavedDocumentInfoRec: TYPE = RECORD [fileName: ROPE, root: TextNode.Ref]; 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: TextNode.Ref] = { 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: TextNode.Ref; IF (oldRoot _ SearchList[fileName]) # NIL THEN -- discard previous entry, if any TEditInput.FreeTree[oldRoot]; info _ NEW[UnsavedDocumentInfoRec _ [fileName, root]]; list _ CONS[info, list]; WHILE Size[] > MAX[TEditProfile.unsavedDocumentCacheSize, 0] DO DiscardOldest[]; ENDLOOP; TRUSTED { Process.Detach[FORK TEditDocumentsCache.Update[]] }; }; FindUnsavedDocument: PUBLIC ENTRY PROC [fileName: ROPE] RETURNS [root: TextNode.Ref] = { ENABLE UNWIND => NULL; IF (root _ SearchList[fileName]) # NIL THEN TRUSTED {Process.Detach[FORK TEditDocumentsCache.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 TEditInput.FreeTree[SearchList[l.first.fileName]]; RETURN; ENDLOOP; }; SearchList: PROC [fileName: ROPE] RETURNS [root: TextNode.Ref] = { -- 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.  TEditDocumentsCacheImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Edited by Paxton on October 20, 1982 8:39 am Last Edited by: Maxwell, January 6, 1983 11:10 am Last Edited by: Plass, April 10, 1985 10:17:55 am PST Doug Wyatt, March 3, 1985 3:21:28 pm PST Κγ˜šœ™Icodešœ Οmœ1™Jšžœ˜—J˜J˜—š  œžœžœžœ žœ˜QJšžœžœžœ˜š œžœžœžœ˜&J˜ Jšžœžœžœžœ˜š žœžœžœ$žœžœž˜@J˜Jšžœ˜—J˜—J˜J˜šžœ$žœžœΟc!˜PJ˜—Jšœžœ,˜6Jšœžœ ˜šžœ žœ+ž˜?Jšœ˜Jšžœ˜—Jšžœžœ!˜>J˜J˜—Jš  œžœžœžœ žœ˜7šžœ˜ Jšžœžœžœ˜Jš žœ!žœžœžœžœ ˜hJ˜J˜—š  œžœ˜Jšžœžœžœžœ˜šžœžœžœ$ž˜4Jš žœ žœžœžœ‘%˜@J˜2Jšžœ˜Jšžœ˜—J˜J˜—š   œžœ žœžœ‘˜ZJšœžœžœ˜"Jš žœžœžœžœžœ˜šžœ+žœžœ˜:J˜J˜Jšžœ˜J˜—J˜ š žœžœžœ)žœžœž˜Ešžœ(žœžœ˜7J˜J˜Jšžœ˜J˜—J˜ Jšžœ˜—Jšžœžœ˜ J˜—J˜Jšžœ˜—J˜—…— ru