<<-- NodeAddrs.Mesa>> <<-- written by Paxton. March 1981>> <<-- last written by Paxton. December 28, 1982 10:40 am>> <<-- **** Persistent addressing for characters in text node ****>> <> DIRECTORY TextNode; NodeAddrs: CEDAR DEFINITIONS = BEGIN Offset: TYPE = TextNode.Offset; Ref: TYPE = TextNode.Ref; RefTextNode: TYPE = TextNode.RefTextNode; RefAddrs: TYPE = REF Body; Body: TYPE = RECORD [addrs: Pair]; Pair: TYPE = REF PairBody; PairBody: TYPE = RECORD [ next: Pair, pinned: BOOL _ FALSE, -- if true, then don't modify location when edits take place addr: REF, movedTo: RefTextNode, -- NIL if hasn't been moved location: Offset ]; AddrsProp: PROC RETURNS [ATOM]; PutTextAddr: PROC [n: RefTextNode, addr: REF, location: Offset]; <<-- assigns addr to location in text>> <<-- ok if addr was previously assigned elsewhere in the text>> <<-- location automatically updated when text is edited>> RemTextAddr: PROC [n: RefTextNode, addr: REF]; <<-- removes the given addr>> <<-- if addr has been moved, does RemTextAddr on new location also>> PinTextAddr: PROC [n: RefTextNode, addr: REF]; <<-- don't modify location when edits take place>> UnpinTextAddr: PROC [n: RefTextNode, addr: REF]; UnpinAll: PROC [n: RefTextNode]; MoveTextAddr: PROC [from, to: RefTextNode, addr: REF, location: Offset]; <<-- does RemTextAddr[from, addr]; PutTextAddr[to, addr, location];>> <<-- add leaves forwarding address for use by GetTextAddr>> GetTextAddr: PROC [n: RefTextNode, addr: REF] RETURNS [node: RefTextNode, location: Offset]; <<-- generates ERROR TextAddrNotFound if the addr is not in the mapping>> <<-- node may be different than n if addr has been moved>> TextAddrNotFound: ERROR; TryGetTextAddr: PROC [n: RefTextNode, addr: REF] RETURNS [found: BOOLEAN, node: RefTextNode, location: Offset]; MapTextAddrs: PROC [n: RefTextNode, action: TextAddrsAction] RETURNS [BOOLEAN]; <<-- apply the action to each addr&location pair for the text>> <<-- returns true if&when an action returns true>> <<-- skips pinned or moved addresses>> TextAddrsAction: TYPE = PROC [addr: REF, location: Offset] RETURNS [BOOLEAN]; <<-- **** notify proc registration ****>> AddNotifyProc, RemoveNotifyProc: PROC [proc: AddrNotifyProc]; AddrNotifyProc: TYPE = PROC [node: RefTextNode, new: PROC [old: Offset] RETURNS [Offset]]; <<-- **** Editing Operations for persistent addrs ****>> Replace: PROC [node: RefTextNode, start, len, newlen: Offset]; <<-- replace chars in [start..start+len) by newlen chars>> <<-- addrs that are in the replaced section move to start>> <<-- add (newlen-len) to addrs that are after the replaced section>> <<-- **** Update Functions for persistent addrs ****>> AfterReplace: PROC [initLoc, start, len, newlen: Offset] RETURNS [newLoc: Offset]; <<-- ***** Initialization>> StartNodeAddrs: PROC; -- for initialization only END.