<<>> <> <> <> <> <> <> 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]; <> < parse the text as a pattern description, else use it literally>> < ensure that the target has left and right boundary items>> <> 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.