DIRECTORY Char USING [XCHAR], Rope USING [ROPE]; TextFind: CEDAR DEFINITIONS ~ BEGIN XCHAR: TYPE ~ Char.XCHAR; ROPE: TYPE ~ Rope.ROPE; Direction: TYPE ~ {forward, backward}; LiteralSearch: PROC [direction: Direction, targetHash: PROC [INT] RETURNS [BYTE], targetStart: INT, targetLen: INT, objectHash: PROC [INT] RETURNS [BYTE], objectStart: INT, objectLen: INT, match: PROC [objectStart, targetStart, len: INT] RETURNS [BOOL], interrupt: REF BOOL ฌ NIL] RETURNS [found: BOOL ฌ FALSE, matchStart, matchEnd: INT ฌ 0]; CharMap: TYPE ~ REF CharMapRep; CharMapRep: TYPE ~ PACKED ARRAY CHAR OF CHAR; CharMapFromCase: PROC [case: BOOL] RETURNS [CharMap]; FetchProc: TYPE ~ PROC [index: INT] RETURNS [XCHAR]; SubstrProc: TYPE ~ PROC [start, len: INT] RETURNS [Text]; Text: TYPE ~ REF; Target: TYPE ~ REF TargetRep; TargetRep: TYPE; -- see TextFindImpl CreateTarget: PROC [size: INT, start: INT ฌ 0, len: INT ฌ INT.LAST, fetch: FetchProc, substr: SubstrProc, pattern: BOOL ฌ FALSE] RETURNS [Target]; Error: ERROR [index: INT, reason: ROPE]; WildType: TYPE ~ {any, alpha, nonalpha, blank, nonblank}; MatchTypeProc: TYPE ~ PROC [index: INT, type: WildType] RETURNS [BOOL]; MatchStringProc: TYPE ~ PROC [index: INT, text: Text, start: INT, len: INT] RETURNS [BOOL]; Bound: TYPE ~ {start, end}; MatchBoundProc: TYPE ~ PROC [index: INT, bound: Bound] RETURNS [BOOL]; Subs: TYPE ~ REF SubsRep; SubsRep: TYPE; -- see TextFindImpl Search: PROC [direction: Direction, target: Target, size: INT, start: INT ฌ 0, len: INT ฌ INT.LAST, substr: SubstrProc, matchType: MatchTypeProc, matchString: MatchStringProc, matchProps: MatchStringProc ฌ NIL, matchBound: MatchBoundProc ฌ NIL, interrupt: REF BOOL ฌ NIL] RETURNS [found: BOOL ฌ FALSE, matchStart, matchEnd, selStart, selEnd: INT ฌ 0, subs: Subs ฌ NIL]; ReplaceProc: TYPE ~ PROC [start, len: INT]; SubstituteProc: TYPE ~ PROC [text: Text, start, len: INT, nameStart, nameLen: INT]; Replace: PROC [replace: ReplaceProc, substitute: SubstituteProc, size: INT, start: INT ฌ 0, len: INT ฌ INT.LAST, fetch: FetchProc, pattern: BOOL ฌ FALSE, subs: Subs ฌ NIL]; RopeLiteralSearch: PROC [direction: Direction, target: ROPE, targetStart: INT ฌ 0, targetLen: INT ฌ INT.LAST, object: ROPE, objectStart: INT ฌ 0, objectLen: INT ฌ INT.LAST, case: BOOL ฌ TRUE] RETURNS [found: BOOL, matchStart, matchEnd: INT ฌ 0]; TargetFromRope: PROC [rope: ROPE, start: INT ฌ 0, len: INT ฌ INT.LAST, pattern: BOOL ฌ FALSE] RETURNS [Target]; RopeSearch: PROC [direction: Direction, target: Target, rope: ROPE, start: INT ฌ 0, len: INT ฌ INT.LAST, case: BOOL ฌ TRUE, word, def, all: BOOL ฌ FALSE, interrupt: REF BOOL ฌ NIL] RETURNS [found: BOOL ฌ FALSE, matchStart, matchEnd, selStart, selEnd: INT ฌ 0, subs: Subs ฌ NIL]; RopeReplace: PROC [rope: ROPE, start: INT ฌ 0, len: INT ฌ INT.LAST, with: ROPE, pattern: BOOL ฌ FALSE, subs: Subs ฌ NIL] RETURNS [ROPE]; END. ์ TextFind.mesa Copyright ำ 1985, 1986, 1991, 1992 by Xerox Corporation. All rights reserved. Pattern syntax derived from EditorFind.mesa of Laurel 6 Old version of TextFind.mesa written by Bill Paxton, May 1981 Major redesign by Doug Wyatt, December 1991 Doug Wyatt, March 11, 1992 7:04 pm PST Literal search case=TRUE means case is significant (same convention as the Rope interface) Pattern search and replace return the character at the given index in the object text return an immutable representation of a substring of the object text Either ROPE or a type private to Tioga. creates a search target from the specified text pattern -> parse the text as a pattern description, else use it literally addBounds -> ensure that the target has left and right boundary items may raise Error if the pattern is malformed test whether object[index] has the specified type test whether object[index..index+len) matches text[start..start+len) test whether index is an acceptable matchStart/matchEnd searches in direction for target in object[start..start+len) if the target has named subpatterns, subs represents what they matched abort the search if interrupt^ becomes true emit replacement[start..start+len) emit text[start..start+len), corresponding to replacement[nameStart..nameStart+nameLen) calls replace and substitute to emit the result of a replacement uses the specified text as the replacement source if pattern, parses the text as a replacement pattern, substituting names from subs Rope operations ส0–"cedarcode" style•NewlineDelimiter ™codešœ ™ Kšœ ฯeœC™NKšœ7™7Kšœ=™=K™+K™&—K˜šฯk ˜ Kšœžœžœ˜Kšœžœžœ˜—K˜šฯnœžœž œž˜#K˜Kšžœžœžœ˜Kšžœžœžœ˜K˜—head™šœ žœ˜&K˜—š2Ÿ œžœ$žœžœžœžœžœ žœžœžœžœžœžœ žœ žœ!žœžœžœžœžœžœžœ žœžœžœ˜ฺK˜—Kšœ žœžœ ˜š œ žœžœžœžœžœžœ˜-K˜—šŸœžœžœžœ ˜5K™K——™š œ žœžœ žœžœžœ˜4K™:K˜—š œ žœžœžœžœ˜9K™DK˜—šœžœžœ˜Kšœžœ™'K™—Kšœžœžœ ˜šœ žœฯc˜$K˜—šŸ œžœžœ žœ žœžœžœ2žœžœžœ ˜”K™/K™IKšœE™EK™+K˜—šŸœžœ žœ žœ˜(K˜—šœ žœ+˜9K˜—š œžœžœ žœžœžœ˜GK™1K˜—šœžœžœ žœžœžœžœžœ˜[K™DK˜—šœžœ˜K˜—š œžœžœ žœžœžœ˜FKšœ7™7K˜—Kšœžœžœ ˜šœ žœ ˜"K˜—š"Ÿœžœ/žœ žœ žœžœžœnžœžœžœžœžœžœ žœžœ+žœžœ˜๖Kšœ<™