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.