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. ψMDSymbolsImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Willie-sue, April 14, 1986 6:48:14 pm PST taken from MicSym.bcpl and (distantly) MicSA.bcpl SearchTableProc: TYPE = PROC[sym: MDDefs.Symbol] RETURNS[quit: BOOL]; Κ1˜šœ™Icodešœ Οmœ1™J˜—J˜šŸœžœžœ˜Jšœ3  ˜=—J˜Jš œžœžœžœžœ™EšŸœžœžœ#˜AšŸœ˜!Jšœžœ˜Jšœ˜J˜—Jšœ'˜'J˜—J˜šΟbœžœ žœžœ˜1Jšœžœžœ˜#—J˜—J˜Jšžœ˜—…—X