-- NodeAddrs.Mesa
-- written by Paxton. March 1981
-- last written by Paxton. December 28, 1982 10:40 am
-- **** Persistent addressing for characters in text node ****
Last Edited by: Maxwell, January 5, 1983 8:42 am
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.