diff --git a/Versions/build.txt b/Versions/build.txt
index c29e53f81..82a96596d 100644
--- a/Versions/build.txt
+++ b/Versions/build.txt
@@ -1 +1 @@
-2248
+2249
diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf
index c19678e3d..b24ec3835 100644
--- a/res/Notepad3.exe.manifest.conf
+++ b/res/Notepad3.exe.manifest.conf
@@ -3,7 +3,7 @@
Notepad3 RC2
diff --git a/scintilla/lexers/LexRegistry.cxx b/scintilla/lexers/LexRegistry.cxx
index 779ea2f47..55578be20 100644
--- a/scintilla/lexers/LexRegistry.cxx
+++ b/scintilla/lexers/LexRegistry.cxx
@@ -32,7 +32,7 @@
using namespace Scintilla;
static const char *const RegistryWordListDesc[] = {
- 0
+ nullptr
};
struct OptionsRegistry {
@@ -64,6 +64,10 @@ class LexerRegistry : public DefaultLexer {
return (state == SCE_REG_ADDEDKEY || state == SCE_REG_DELETEDKEY);
}
+ static bool IsByteValue(int value) {
+ return ((value >= 0) && (value < 256));
+ }
+
static bool AtValueType(LexAccessor &styler, Sci_Position start) {
Sci_Position i = 0;
while (i < 10) {
@@ -78,39 +82,59 @@ class LexerRegistry : public DefaultLexer {
return false;
}
+ static bool AtEndOfLine(LexAccessor& styler, Sci_Position pos) {
+ const char curr = styler.SafeGetCharAt(pos, '\0');
+ const char next = styler.SafeGetCharAt(pos+1, '\0');
+ return (!curr || (curr == '\n') || (curr == '\r' && next != '\n'));
+ }
+
+ static bool AtBeginOfLine(LexAccessor& styler, Sci_Position pos) {
+ const char prev = styler.SafeGetCharAt(pos-1, '\0');
+ const char curr = styler.SafeGetCharAt(pos, '\0');
+ return (!curr || (prev == '\n') || (prev == '\r' && curr != '\n'));
+ }
+
static bool IsNextNonWhitespace(LexAccessor &styler, Sci_Position start, char ch) {
- Sci_Position i = 0;
- while (i < 100) {
- i++;
- char curr = styler.SafeGetCharAt(start+i, '\0');
- char next = styler.SafeGetCharAt(start+i+1, '\0');
- bool atEOL = (curr == '\r' && next != '\n') || (curr == '\n');
+ while (!AtEndOfLine(styler, start + 1)) {
+ ++start;
+ char curr = styler.SafeGetCharAt(start, '\0');
if (curr == ch) {
return true;
- } else if (!isspacechar(curr) || atEOL) {
+ } else if (!isspacechar(curr)) {
return false;
}
}
return false;
}
+ static bool IsPrevNonWhitespace(LexAccessor &styler, Sci_Position start, char ch) {
+ while (!AtBeginOfLine(styler, start - 1)) {
+ --start;
+ char curr = styler.SafeGetCharAt(start, '\0');
+ if (curr == ch) {
+ return true;
+ }
+ else if (!isspacechar(curr)) {
+ return false;
+ }
+ }
+ return false;
+ }
+
// Looks for the equal sign at the end of the string
static bool AtValueName(LexAccessor &styler, Sci_Position start) {
- bool atEOL = false;
- Sci_Position i = 0;
bool escaped = false;
- while (!atEOL) {
- i++;
- char curr = styler.SafeGetCharAt(start+i, '\0');
- char next = styler.SafeGetCharAt(start+i+1, '\0');
- atEOL = (curr == '\r' && next != '\n') || (curr == '\n');
+ while (!AtEndOfLine(styler, start + 1)) {
+ ++start;
+ char curr = styler.SafeGetCharAt(start, '\0');
+ char next = styler.SafeGetCharAt(start+1, '\0');
if (escaped) {
escaped = false;
continue;
}
escaped = curr == '\\';
if (curr == '"') {
- return IsNextNonWhitespace(styler, start+i, '=');
+ return IsNextNonWhitespace(styler, start, '=');
} else if (!curr) {
return false;
}
@@ -118,15 +142,10 @@ class LexerRegistry : public DefaultLexer {
return false;
}
- static bool AtKeyPathEnd(LexAccessor &styler, Sci_Position start) {
- bool atEOL = false;
- Sci_Position i = 0;
- while (!atEOL) {
- i++;
- char curr = styler.SafeGetCharAt(start+i, '\0');
- char next = styler.SafeGetCharAt(start+i+1, '\0');
- atEOL = (curr == '\r' && next != '\n') || (curr == '\n');
- if (curr == ']' || !curr) {
+ static bool AtKeyPathEnd(LexAccessor& styler, Sci_Position start) {
+ while (!AtEndOfLine(styler, start + 1)) {
+ char curr = styler.SafeGetCharAt(++start, '\0');
+ if (curr == ']') {
// There's still at least one or more square brackets ahead
return false;
}
@@ -160,6 +179,17 @@ class LexerRegistry : public DefaultLexer {
}
}
+ static void ContextForwardSetState(StyleContext& context, const int newState, int& lastNonDefaultState)
+ {
+ if (context.state != SCE_REG_DEFAULT) {
+ lastNonDefaultState = context.state;
+ }
+ if (newState >= SCE_REG_DEFAULT)
+ context.ForwardSetState(newState);
+ else
+ context.Forward();
+ }
+
public:
LexerRegistry() {}
virtual ~LexerRegistry() {}
@@ -188,7 +218,7 @@ public:
return -1;
}
void *SCI_METHOD PrivateCall(int, void *) override {
- return 0;
+ return nullptr;
}
static ILexer4 *LexerFactoryRegistry() {
return new LexerRegistry;
@@ -200,6 +230,7 @@ public:
Sci_Position length,
int initStyle,
IDocument *pAccess) override;
+
void SCI_METHOD Fold(Sci_PositionU startPos,
Sci_Position length,
int initStyle,
@@ -207,9 +238,9 @@ public:
};
void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
- Sci_Position length,
- int initStyle,
- IDocument *pAccess) {
+ Sci_Position length,
+ int initStyle,
+ IDocument *pAccess) {
int beforeGUID = SCE_REG_DEFAULT;
int beforeEscape = SCE_REG_DEFAULT;
CharacterSet setOperators = CharacterSet(CharacterSet::setNone, "-,.=:\\@()");
@@ -217,11 +248,18 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
StyleContext context(startPos, length, initStyle, styler);
bool highlight = true;
bool afterEqualSign = false;
- while (context.More()) {
+ //int statePrevious = SCE_REG_DEFAULT;
+ int stateLastNonDefault = SCE_REG_DEFAULT;
+
+ while (context.More() && context.ch) {
if (context.atLineStart) {
Sci_Position currPos = static_cast(context.currentPos);
- bool continued = styler[currPos-3] == '\\';
+ bool continued = IsPrevNonWhitespace(styler, currPos, '\\'); //styler[currPos - 3] == '\\';
highlight = continued ? true : false;
+ if (!continued) {
+ context.SetState(SCE_REG_DEFAULT);
+ stateLastNonDefault = SCE_REG_DEFAULT;
+ }
}
switch (context.state) {
case SCE_REG_COMMENT:
@@ -233,7 +271,7 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
case SCE_REG_STRING: {
Sci_Position currPos = static_cast(context.currentPos);
if (context.ch == '"') {
- context.ForwardSetState(SCE_REG_DEFAULT);
+ ContextForwardSetState(context, SCE_REG_DEFAULT, stateLastNonDefault);
} else if (context.ch == '\\') {
beforeEscape = context.state;
context.SetState(SCE_REG_ESCAPED);
@@ -252,9 +290,9 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
}
break;
case SCE_REG_PARAMETER:
- context.ForwardSetState(SCE_REG_STRING);
+ ContextForwardSetState(context, SCE_REG_STRING, stateLastNonDefault);
if (context.ch == '"') {
- context.ForwardSetState(SCE_REG_DEFAULT);
+ ContextForwardSetState(context, SCE_REG_DEFAULT, stateLastNonDefault);
}
break;
case SCE_REG_VALUETYPE:
@@ -271,7 +309,7 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
case SCE_REG_ADDEDKEY: {
Sci_Position currPos = static_cast(context.currentPos);
if (context.ch == ']' && AtKeyPathEnd(styler, currPos)) {
- context.ForwardSetState(SCE_REG_DEFAULT);
+ ContextForwardSetState(context, SCE_REG_DEFAULT, stateLastNonDefault);
} else if (context.ch == '{') {
if (AtGUID(styler, currPos)) {
beforeGUID = context.state;
@@ -283,7 +321,7 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
case SCE_REG_ESCAPED:
if (context.ch == '"') {
context.SetState(beforeEscape);
- context.ForwardSetState(SCE_REG_DEFAULT);
+ ContextForwardSetState(context, SCE_REG_DEFAULT, stateLastNonDefault);
} else if (context.ch == '\\') {
context.Forward();
} else {
@@ -294,16 +332,19 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
case SCE_REG_STRING_GUID:
case SCE_REG_KEYPATH_GUID: {
if (context.ch == '}') {
- context.ForwardSetState(beforeGUID);
+ ContextForwardSetState(context, beforeGUID, stateLastNonDefault);
beforeGUID = SCE_REG_DEFAULT;
}
Sci_Position currPos = static_cast(context.currentPos);
if (context.ch == '"' && IsStringState(context.state)) {
- context.ForwardSetState(SCE_REG_DEFAULT);
- } else if (context.ch == ']' &&
- AtKeyPathEnd(styler, currPos) &&
- IsKeyPathState(context.state)) {
- context.ForwardSetState(SCE_REG_DEFAULT);
+ ContextForwardSetState(context, SCE_REG_DEFAULT, stateLastNonDefault);
+ } else if (context.ch == ']' && IsKeyPathState(context.state)) {
+ if (AtKeyPathEnd(styler, currPos)) {
+ ContextForwardSetState(context, SCE_REG_DEFAULT, stateLastNonDefault);
+ }
+ else {
+ ContextForwardSetState(context, beforeGUID, stateLastNonDefault);
+ }
} else if (context.ch == '\\' && IsStringState(context.state)) {
beforeEscape = context.state;
context.SetState(SCE_REG_ESCAPED);
@@ -337,15 +378,20 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
if (wordStart && AtValueType(styler, currPos)) {
context.SetState(SCE_REG_VALUETYPE);
}
- } else if (isxdigit(context.ch) && highlight) {
+ } else if (IsByteValue(context.ch) && isxdigit(context.ch & 0xFF) && highlight) {
context.SetState(SCE_REG_HEXDIGIT);
}
highlight = (context.ch == '@') ? true : highlight;
if (setOperators.Contains(context.ch) && highlight) {
context.SetState(SCE_REG_OPERATOR);
}
+ // continue style for eolfilled
+ if (context.ch == '\r' || context.ch == '\n') {
+ context.SetState(stateLastNonDefault);
+ }
}
- context.Forward();
+ //statePrevious = context.state;
+ ContextForwardSetState(context, -1, stateLastNonDefault);
}
context.Complete();
}
@@ -409,7 +455,7 @@ void SCI_METHOD LexerRegistry::Fold(Sci_PositionU startPos,
}
LexerModule lmRegistry(SCLEX_REGISTRY,
- LexerRegistry::LexerFactoryRegistry,
- "registry",
- RegistryWordListDesc);
+ LexerRegistry::LexerFactoryRegistry,
+ "registry",
+ RegistryWordListDesc);
diff --git a/src/VersionEx.h b/src/VersionEx.h
index 65d1432fb..6c08dc47a 100644
--- a/src/VersionEx.h
+++ b/src/VersionEx.h
@@ -8,7 +8,7 @@
#define VERSION_MAJOR 5
#define VERSION_MINOR 19
#define VERSION_REV 611
-#define VERSION_BUILD 2248
+#define VERSION_BUILD 2249
#define SCINTILLA_VER 416
#define ONIGMO_REGEX_VER 6.2.0
#define VERSION_PATCH RC2