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]; RemTextAddr: PROC [n: RefTextNode, addr: REF]; PinTextAddr: PROC [n: RefTextNode, addr: REF]; UnpinTextAddr: PROC [n: RefTextNode, addr: REF]; UnpinAll: PROC [n: RefTextNode]; MoveTextAddr: PROC [from, to: RefTextNode, addr: REF, location: Offset]; GetTextAddr: PROC [n: RefTextNode, addr: REF] RETURNS [node: RefTextNode, location: Offset]; TextAddrNotFound: ERROR; TryGetTextAddr: PROC [n: RefTextNode, addr: REF] RETURNS [found: BOOLEAN, node: RefTextNode, location: Offset]; MapTextAddrs: PROC [n: RefTextNode, action: TextAddrsAction] RETURNS [BOOLEAN]; TextAddrsAction: TYPE = PROC [addr: REF, location: Offset] RETURNS [BOOLEAN]; AddNotifyProc, RemoveNotifyProc: PROC [proc: AddrNotifyProc]; AddrNotifyProc: TYPE = PROC [node: RefTextNode, new: PROC [old: Offset] RETURNS [Offset]]; Replace: PROC [node: RefTextNode, start, len, newlen: Offset]; AfterReplace: PROC [initLoc, start, len, newlen: Offset] RETURNS [newLoc: Offset]; StartNodeAddrs: PROC; -- for initialization only END. Ü-- 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 -- assigns addr to location in text -- ok if addr was previously assigned elsewhere in the text -- location automatically updated when text is edited -- removes the given addr -- if addr has been moved, does RemTextAddr on new location also -- don't modify location when edits take place -- does RemTextAddr[from, addr]; PutTextAddr[to, addr, location]; -- add leaves forwarding address for use by GetTextAddr -- generates ERROR TextAddrNotFound if the addr is not in the mapping -- node may be different than n if addr has been moved -- apply the action to each addr&location pair for the text -- returns true if&when an action returns true -- skips pinned or moved addresses -- **** notify proc registration **** -- **** Editing Operations for persistent addrs **** -- 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 **** -- ***** Initialization ʘJšÏc™Jš!™!Jš5™5J˜Jš>™>J™0JšÏk ˜ J˜ J˜Jšœ žœ˜Jšž˜J˜Jšœžœ˜Jšœžœ˜Jšœ žœ˜)J˜Jšœ žœžœ˜Jšœžœžœ˜"J˜Jšœžœžœ ˜šœ žœžœ˜Jšœ ˜ Jšœžœžœ<˜RJšœžœ˜ Jšœ˜1Jšœ˜—J˜JšÏn œžœžœžœ˜J˜šŸ œžœžœ˜AJš#™#Jš;™;Jš5™5J˜—šŸ œžœžœ˜.Jš™J™@J˜—šŸ œžœžœ˜.Jš.™.J˜—šŸ œžœžœ˜0J˜—šŸœžœ˜ J˜—šŸ œžœžœ˜HJšA™AJšœ7™7J˜—šŸ œžœžœžœ'˜\JšE™EJ™6J˜—Jšœžœ˜J˜šŸœžœžœ˜0Jšžœ žœ'˜>J˜—šŸ œžœ*˜Jš6™6Jš7™7Jš@™@J˜—Jš2™2J˜JšŸ œžœ'žœ˜RJ˜Jš™J˜JšŸœžœ˜0J˜Jšžœ˜J˜J˜—…—