DIRECTORY Process USING [Detach], Rope USING [Concat, Equal, ROPE], TEditDocumentsCache USING [Update], TEditDocumentPrivate USING [], TEditInput USING [FreeTree], TEditProfile USING [unsavedDocumentCacheSize], TextNode USING [Node]; 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.Node]; 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.Node] = { 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.Node; 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.Node] = { 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.Node] = { -- 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, 1986 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, September 2, 1986 3:05:27 pm PDT Κί˜codešœ™Kšœ Οmœ7™BKšœ,™,Kšœ1™1Kšœ5™5Kšœ,™,K™—šΟk ˜ Kšœžœ ˜Kšœžœžœ˜!Kšœžœ ˜#Kšœžœ˜Kšœ žœ ˜Kšœ žœ˜.Kšœ žœ˜K˜—KšΠblœžœž˜&Kšžœ=˜DKšžœ*˜1Kšœž˜Kšžœžœžœ˜Kšœžœžœ˜"Kšœžœžœ˜7Kšœžœžœ žœ˜Lš Οnœžœžœžœžœžœ˜3š žœžœžœ$žœžœž˜@K˜>Kšžœ˜—K˜K˜—š  œžœžœžœ žœ˜RKšžœžœžœ˜š œžœžœžœ˜&K˜ Kšžœžœžœžœ˜š žœžœžœ$žœžœž˜@K˜Kšžœ˜—K˜—K˜K˜šžœ$žœžœΟc!˜PK˜—Kšœžœ,˜6Kšœžœ ˜šžœ žœ+ž˜?Kšœ˜Kšžœ˜—Kšžœžœ!˜>K˜K˜—Kš  œžœžœžœ žœ˜7šžœ˜!Kšžœžœžœ˜Kš žœ!žœžœžœžœ ˜hK˜K˜—š  œžœ˜Kšžœžœžœžœ˜šžœžœžœ$ž˜4Kš žœ žœžœžœ‘%˜@K˜2Kšžœ˜Kšžœ˜—K˜K˜—š   œžœ žœžœ‘˜[Kšœžœžœ˜"Kš žœžœžœžœžœ˜šžœ+žœžœ˜:K˜K˜Kšžœ˜K˜—K˜ š žœžœžœ)žœžœž˜Ešžœ(žœžœ˜7K˜K˜Kšžœ˜K˜—K˜ Kšžœ˜—Kšžœžœ˜ K˜—K˜Kšžœ˜—…— v