diff options
Diffstat (limited to 'src/Document.cxx')
-rw-r--r-- | src/Document.cxx | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index 4a915314d..80135f245 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -46,7 +46,7 @@ Document::Document() { useTabs = true; watchers = 0; lenWatchers = 0; - + matchesValid = false; pre = 0; substituted = 0; @@ -733,6 +733,10 @@ int Document::NextWordStart(int pos, int delta) { return pos; } +/** + * Check that the character before the given position + * is not a word character. + */ bool Document::IsWordStartAt(int pos) { if (pos > 0) { return !IsWordChar(CharAt(pos - 1)); @@ -740,6 +744,10 @@ bool Document::IsWordStartAt(int pos) { return true; } +/** + * Check that the character after the given position + * is not a word character. + */ bool Document::IsWordEndAt(int pos) { if (pos < Length() - 1) { return !IsWordChar(CharAt(pos)); @@ -747,6 +755,10 @@ bool Document::IsWordEndAt(int pos) { return true; } +/** + * Check that the given range is delimited by + * non word characters. + */ bool Document::IsWordAt(int start, int end) { return IsWordStartAt(start) && IsWordEndAt(end); } @@ -772,31 +784,32 @@ static inline char MakeLowerCase(char ch) { class DocumentIndexer : public CharacterIndexer { Document *pdoc; int end; -public: - DocumentIndexer(Document *pdoc_, int end_) : - pdoc(pdoc_), end(end_) { - } +public: +DocumentIndexer(Document *pdoc_, int end_) : + pdoc(pdoc_), end(end_) {} + virtual char CharAt(int index) { if (index < 0 || index >= end) return 0; - else + else return pdoc->CharAt(index); } }; -// Find text in document, supporting both forward and backward -// searches (just pass minPos > maxPos to do a backward search) -// Has not been tested with backwards DBCS searches yet. +/** + * Find text in document, supporting both forward and backward + * searches (just pass minPos > maxPos to do a backward search) + * Has not been tested with backwards DBCS searches yet. + */ long Document::FindText(int minPos, int maxPos, const char *s, bool caseSensitive, bool word, bool wordStart, bool regExp, - int *length) { + int *length) { if (regExp) { - if (!pre) pre = new RESearch(); if (!pre) return -1; - + int startPos; int endPos; @@ -826,18 +839,18 @@ long Document::FindText(int minPos, int maxPos, const char *s, int lenRet = 0; char searchEnd = '\0'; if (*s) - searchEnd = s[strlen(s)-1]; - for (int line=lineRangeStart; line<=lineRangeEnd; line++) { + searchEnd = s[strlen(s) - 1]; + for (int line = lineRangeStart; line <= lineRangeEnd; line++) { int startOfLine = LineStart(line); int endOfLine = LineEnd(line); if (line == lineRangeStart) { if ((startPos != startOfLine) && (s[0] == '^')) - continue; // Can't match start of line if start position after start of line + continue; // Can't match start of line if start position after start of line startOfLine = startPos; } if (line == lineRangeEnd) { if ((endPos != endOfLine) && (searchEnd == '$')) - continue; // Can't match end of line if end position before end of line + continue; // Can't match end of line if end position before end of line endOfLine = endPos; } DocumentIndexer di(this, endOfLine); @@ -852,14 +865,14 @@ long Document::FindText(int minPos, int maxPos, const char *s, return pos; } else { - + bool forward = minPos <= maxPos; int increment = forward ? 1 : -1; - + // Range endpoints should not be inside DBCS characters, but just in case, move them. int startPos = MovePositionOutsideChar(minPos, increment, false); int endPos = MovePositionOutsideChar(maxPos, increment, false); - + // Compute actual search ranges needed int lengthFind = strlen(s); int endSearch = endPos; @@ -883,8 +896,8 @@ long Document::FindText(int minPos, int maxPos, const char *s, } if (found) { if ((!word && !wordStart) || - word && IsWordAt(pos, pos + lengthFind) || - wordStart && IsWordStartAt(pos)) + word && IsWordAt(pos, pos + lengthFind) || + wordStart && IsWordStartAt(pos)) return pos; } } @@ -898,8 +911,8 @@ long Document::FindText(int minPos, int maxPos, const char *s, } if (found) { if ((!word && !wordStart) || - word && IsWordAt(pos, pos + lengthFind) || - wordStart && IsWordStartAt(pos)) + word && IsWordAt(pos, pos + lengthFind) || + wordStart && IsWordStartAt(pos)) return pos; } } @@ -924,9 +937,9 @@ const char *Document::SubstituteByPosition(const char *text) { if (!pre->GrabMatches(di)) return 0; unsigned int lenResult = 0; - for (const char *t=text; *t; t++) { - if ((*t == '\\') && (*(t+1) >= '1' && *(t+1) <= '9')) { - unsigned int patNum = *(t+1) - '0'; + for (const char *t = text; *t; t++) { + if ((*t == '\\') && (*(t + 1) >= '1' && *(t + 1) <= '9')) { + unsigned int patNum = *(t + 1) - '0'; lenResult += pre->eopat[patNum] - pre->bopat[patNum]; t++; } else { @@ -937,9 +950,9 @@ const char *Document::SubstituteByPosition(const char *text) { if (!substituted) return 0; char *o = substituted; - for (const char *s=text; *s; s++) { - if ((*s == '\\') && (*(s+1) >= '1' && *(s+1) <= '9')) { - unsigned int patNum = *(s+1) - '0'; + for (const char *s = text; *s; s++) { + if ((*s == '\\') && (*(s + 1) >= '1' && *(s + 1) <= '9')) { + unsigned int patNum = *(s + 1) - '0'; unsigned int len = pre->eopat[patNum] - pre->bopat[patNum]; strcpy(o, pre->pat[patNum]); o += len; |