<> <> <> <> <> <> <<>> <> <<>> 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.