<> <> <> <> DIRECTORY Atom USING [MakeAtom], RefTab USING [EachPairAction, Create, Fetch, Pairs, Ref, Store, Val], IO, Rope, MDDefs, MDOps USING [], MDUtils; MDSymbolsImpl: CEDAR PROGRAM IMPORTS Atom, RefTab EXPORTS MDOps, MDUtils = BEGIN OPEN MDDefs; ROPE: TYPE = Rope.ROPE; symbolTable: RefTab.Ref; symbolTableSize: NAT = 2047; AddSym: PUBLIC PROC[symName: ROPE, addIfNew: BOOL _ TRUE] RETURNS[symbol: Symbol] = { found: BOOL; val: RefTab.Val; symb: ATOM _ Atom.MakeAtom[symName]; [found, val] _ RefTab.Fetch[symbolTable, symb]; IF found THEN symbol _ NARROW[val]; IF found OR ~addIfNew THEN RETURN[symbol]; symbol _ NEW[SymbolRec _ [atm: symb, name: symName]]; [] _ RefTab.Store[symbolTable, symb, symbol]; -- add to table }; InitSymbolTable: PUBLIC PROC = { symbolTable _ RefTab.Create[symbolTableSize] }; -- easiest <> SearchSymbolTable: PUBLIC PROC[proc: MDUtils.SearchTableProc] = { LookAt: RefTab.EachPairAction = { sym: Symbol _ NARROW[val]; quit _ proc[sym]; }; [] _ RefTab.Pairs[symbolTable, LookAt]; }; GS: PROC[symName: ROPE] RETURNS[symbol: Symbol] = { RETURN[AddSym[symName, FALSE]] }; END.