DIRECTORY TextNode USING [Ref, RefTextNode]; NodeAddrs: CEDAR DEFINITIONS = BEGIN Ref: TYPE = TextNode.Ref; RefTextNode: TYPE = TextNode.RefTextNode; Offset: TYPE = INT; 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: INT ]; AddrsProp: PROC RETURNS [ATOM]; PutTextAddr: PROC [n: RefTextNode, addr: REF, location: INT]; 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: INT]; GetTextAddr: PROC [n: RefTextNode, addr: REF] RETURNS [node: RefTextNode, location: INT]; TryGetTextAddr: PROC [n: RefTextNode, addr: REF] RETURNS [found: BOOL, node: RefTextNode, location: INT]; TextAddrNotFound: ERROR; MapTextAddrs: PROC [n: RefTextNode, action: TextAddrsAction] RETURNS [BOOL]; TextAddrsAction: TYPE = PROC [addr: REF, location: INT] RETURNS [BOOL]; AddNotifyProc: PROC [proc: AddrNotifyProc]; RemoveNotifyProc: PROC [proc: AddrNotifyProc]; AddrNotifyProc: TYPE = PROC [node: RefTextNode, new: PROC [old: INT] RETURNS [INT]]; Replace: PROC [node: RefTextNode, start, len, newlen: INT]; AfterReplace: PROC [initLoc, start, len, newlen: INT] RETURNS [newLoc: INT]; END. ΐNodeAddrs.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. written by Paxton. March 1981 last written by Paxton. December 28, 1982 10:40 am Last Edited by: Maxwell, January 5, 1983 8:42 am Doug Wyatt, March 2, 1985 3:28:57 pm PST Persistent addressing for characters in text node. 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 Κc˜codešœ™Kšœ Οmœ1™Kšœ ™ Kšœ8™8Kšœ2™2K˜—š‘ œžœžœ˜.Kšœ™K™=K˜—š‘ œžœžœ˜.Kšœ+™+K˜—š‘ œžœžœ˜0K˜—š‘œžœ˜ K˜—š‘ œžœžœ žœ˜EKšœ>™>Kšœ4™4K˜—K˜š ‘ œžœžœžœžœ˜YKšœB™BK™3K˜—š ‘œžœžœžœ žœžœ˜jK˜—šœžœ˜K˜—K˜š‘ œžœ+žœžœ˜LKšœ8™8Kšœ+™+K™K˜—š œžœžœžœ žœžœžœ˜GK˜—K˜Kšœ™K˜Kš‘ œžœ˜+š‘œžœ˜.K˜—š œžœžœžœžœžœžœ˜TK˜—K˜Kšœ'™'K˜š‘œžœ)žœ˜;Kšœ3™3Kšœ4™4Kšœ=™=K˜—K˜Kšœ%™%K˜š ‘ œžœžœžœ žœ˜LK˜—K˜Kšžœ˜—…—π