<> <> <> <<>> <> <<>> <<>> <<>> DIRECTORY FS USING [StreamOpen], IO USING [EndOf, EndOfStream, GetTokenRope, STREAM], Rope USING [ROPE, Substr], ExpertKeepRead, SymTab USING [Create, Fetch, Insert, Ref]; ExpertKeepReadImpl: CEDAR PROGRAM IMPORTS FS, IO, Rope, SymTab EXPORTS ExpertKeepRead ~ BEGIN ROPE: TYPE = Rope.ROPE; RefDesTable: TYPE = ExpertKeepRead.RefDesTable; <> ReadKeepFile: PUBLIC PROC [file: ROPE] RETURNS [refDesTable: RefDesTable] ~ { refDes: Rope.ROPE; in: IO.STREAM _ FS.StreamOpen[file]; refDesTable _ SymTab.Create[]; WHILE NOT IO.EndOf[in] DO refDes _ IO.GetTokenRope[in ! IO.EndOfStream => CONTINUE].token; [] _ SymTab.Insert[refDesTable, refDes, refDes]; ENDLOOP; }; <<>> KeepRefDes: PUBLIC PROC [refDesTable: RefDesTable, refDes: Rope.ROPE] RETURNS [found: BOOLEAN] ~ { found _ SymTab.Fetch[refDesTable, refDes].found; IF NOT found THEN { refDes _ Rope.Substr[refDes, 0, 1]; found _ SymTab.Fetch[refDesTable, refDes].found; }; }; <<>> END.