<> <> <> <> <> DIRECTORY ImagerFont USING [XChar], Rope USING [ROPE], TextLooks USING [Looks]; TextFindPrivate: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; XChar: TYPE ~ ImagerFont.XChar; --[set: BYTE, code: BYTE] anyStringPattern: XChar = [377B, 0]; oneCharPattern: XChar = [377B, 1]; oneBlankPattern: XChar = [377B, 2]; oneNonBlankPattern: XChar = [377B, 3]; anyBlankPattern: XChar = [377B, 4]; anyNonBlankPattern: XChar = [377B, 5]; oneAlphaPattern: XChar = [377B, 6]; oneNonAlphaPattern: XChar = [377B, 7]; anyAlphaPattern: XChar = [377B, 8]; anyNonAlphaPattern: XChar = [377B, 9]; leftBracketPattern: XChar = [377B, 10]; rightBracketPattern: XChar = [377B, 11]; leftBoundaryPattern: XChar = [377B, 12]; rightBoundaryPattern: XChar = [377B, 13]; maxStringPattern: XChar = [377B, 14]; maxBlankPattern: XChar = [377B, 15]; maxNonBlankPattern: XChar = [377B, 16]; maxAlphaPattern: XChar = [377B, 17]; maxNonAlphaPattern: XChar = [377B, 18]; nopPattern: XChar = [377B, 19]; nullChar: XChar = [377B, 377B]; MaxPatternLength: NAT = 1024; TextStackArray: TYPE = RECORD[stack: SEQUENCE length: NAT OF INT]; PatternStackArray: TYPE = RECORD[stack: SEQUENCE length: NAT OF NAT]; LooksArray: TYPE = RECORD[looks: SEQUENCE length: NAT OF TextLooks.Looks]; NameArray: TYPE = RECORD [array: SEQUENCE length: NAT OF NameRec]; NameRec: TYPE = RECORD [name: ROPE, at, atEnd: INT, looks: TextLooks.Looks]; PatternArray: TYPE = RECORD [pat: SEQUENCE length: NAT OF PatRec]; PatRec: TYPE = RECORD [SELECT tag:* FROM pattern => [char: XChar], not => [char: XChar], startname => [index: NAT], endname => [index: NAT], ENDCASE ]; anyStringPat: pattern PatRec = [pattern[anyStringPattern]]; anyAlphaPat: pattern PatRec = [pattern[anyAlphaPattern]]; anyNonAlphaPat: pattern PatRec = [pattern[anyNonAlphaPattern]]; anyBlankPat: pattern PatRec = [pattern[anyBlankPattern]]; anyNonBlankPat: pattern PatRec = [pattern[anyNonBlankPattern]]; leftBoundaryPat: pattern PatRec = [pattern[leftBoundaryPattern]]; rightBoundaryPat: pattern PatRec = [pattern[rightBoundaryPattern]]; nonPat: pattern PatRec = [pattern[[0,0]]]; IsWord: PROC [rope: ROPE, at, atEnd: INT] RETURNS [BOOL]; Boundary: PROC [char: XChar] RETURNS [BOOL] = INLINE { RETURN [char = leftBoundaryPattern OR char = rightBoundaryPattern] }; Pat: PROC [p: PatRec] RETURNS [pp: pattern PatRec] = INLINE { WITH p: p SELECT FROM pattern => pp _ p; ENDCASE => pp _ nonPat; }; FinderRecord: TYPE = RECORD [ stackSize: NAT _ 0, patternPosStack: REF PatternStackArray, textPosStack: REF TextStackArray, textLenStack: REF TextStackArray, patternArray: REF PatternArray, length: NAT _ 0, patternLooks: REF LooksArray, nameArray: REF NameArray, firstPatChar1, firstPatChar2, lastPatChar1, lastPatChar2: XChar _ nullChar, textBuffer: REF TEXT, looks: TextLooks.Looks, looksOnly: BOOL _ FALSE, wordSearch: BOOL _ FALSE, leftBracketSeen, rightBracketSeen: BOOL _ FALSE, firstPatternCharIsNormal, lastPatternCharIsNormal: BOOL _ FALSE ]; END.