aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <unknown>2002-10-26 05:25:33 +0000
committernyamatongwe <unknown>2002-10-26 05:25:33 +0000
commit0609be20a99fc04d48e610204f673b02cce4f226 (patch)
treeb7a6fb9dc3b15588600747f86c7ac37b83326701 /src
parenta9295effd2ead9408d555102f9306fe73de79d7f (diff)
downloadscintilla-mirror-0609be20a99fc04d48e610204f673b02cce4f226.tar.gz
Patch from Philippe to hoist getting of next char into method, add a
Forward(n) method and use unsigned integers for positions.
Diffstat (limited to 'src')
-rw-r--r--src/StyleContext.cxx4
-rw-r--r--src/StyleContext.h61
2 files changed, 35 insertions, 30 deletions
diff --git a/src/StyleContext.cxx b/src/StyleContext.cxx
index bdae28196..64fc7a048 100644
--- a/src/StyleContext.cxx
+++ b/src/StyleContext.cxx
@@ -29,7 +29,7 @@ static void getRange(unsigned int start,
s[i] = '\0';
}
-void StyleContext::GetCurrent(char *s, int len) {
+void StyleContext::GetCurrent(char *s, unsigned int len) {
getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
@@ -46,6 +46,6 @@ static void getRangeLowered(unsigned int start,
s[i] = '\0';
}
-void StyleContext::GetCurrentLowered(char *s, int len) {
+void StyleContext::GetCurrentLowered(char *s, unsigned int len) {
getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
diff --git a/src/StyleContext.h b/src/StyleContext.h
index 4c9352916..d099520d9 100644
--- a/src/StyleContext.h
+++ b/src/StyleContext.h
@@ -2,21 +2,35 @@
/** @file StyleContext.cxx
** Lexer infrastructure.
**/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
// This file is in the public domain.
// All languages handled so far can treat all characters >= 0x80 as one class
// which just continues the current token or starts an identifier if in default.
-// DBCS treated specially as the second character can be < 0x80 and hence
+// DBCS treated specially as the second character can be < 0x80 and hence
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class StyleContext {
Accessor &styler;
- int endPos;
+ unsigned int endPos;
StyleContext& operator=(const StyleContext&) {
return *this;
}
+ void GetNextChar(unsigned int pos) {
+ chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
+ if (styler.IsLeadByte(static_cast<char>(chNext))) {
+ chNext = chNext << 8;
+ chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
+ }
+ // End of line?
+ // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win)
+ // or on LF alone (Unix). Avoid triggering two times on Dos/Win.
+ atLineEnd = (ch == '\r' && chNext != '\n') ||
+ (ch == '\n') ||
+ (currentPos >= endPos);
+ }
+
public:
- int currentPos;
+ unsigned int currentPos;
bool atLineStart;
bool atLineEnd;
int state;
@@ -24,32 +38,27 @@ public:
int ch;
int chNext;
- StyleContext(unsigned int startPos, int length,
- int initStyle, Accessor &styler_, char chMask=31) :
+ StyleContext(unsigned int startPos, unsigned int length,
+ int initStyle, Accessor &styler_, char chMask=31) :
styler(styler_),
endPos(startPos + length),
- currentPos(startPos),
+ currentPos(startPos),
atLineStart(true),
atLineEnd(false),
- state(initStyle),
+ state(initStyle),
chPrev(0),
- ch(0),
+ ch(0),
chNext(0) {
styler.StartAt(startPos, chMask);
styler.StartSegment(startPos);
- int pos = currentPos;
+ unsigned int pos = currentPos;
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
if (styler.IsLeadByte(static_cast<char>(ch))) {
pos++;
ch = ch << 8;
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
}
- chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
- if (styler.IsLeadByte(static_cast<char>(chNext))) {
- chNext = chNext << 8;
- chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
- }
- atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos);
+ GetNextChar(pos);
}
void Complete() {
styler.ColourTo(currentPos - 1, state);
@@ -60,21 +69,12 @@ public:
void Forward() {
if (currentPos < endPos) {
atLineStart = atLineEnd;
- // A lot of this is repeated from the constructor - TODO: merge code
chPrev = ch;
currentPos++;
if (ch >= 0x100)
currentPos++;
ch = chNext;
- chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
- if (styler.IsLeadByte(static_cast<char>(chNext))) {
- chNext = chNext << 8;
- chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
- }
- // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
- // Avoid triggering two times on Dos/Win
- // End of line
- atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos);
+ GetNextChar(currentPos);
} else {
atLineStart = false;
chPrev = ' ';
@@ -83,6 +83,11 @@ public:
atLineEnd = true;
}
}
+ void Forward(int nb) {
+ for (int i = 0; i < nb; i++) {
+ Forward();
+ }
+ }
void ChangeState(int state_) {
state = state_;
}
@@ -136,8 +141,8 @@ public:
return true;
}
// Non-inline
- void GetCurrent(char *s, int len);
- void GetCurrentLowered(char *s, int len);
+ void GetCurrent(char *s, unsigned int len);
+ void GetCurrentLowered(char *s, unsigned int len);
};
inline bool IsASpace(unsigned int ch) {