aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarkus Heidelberg <markus.heidelberg@web.de>2014-12-29 14:28:14 +1100
committerMarkus Heidelberg <markus.heidelberg@web.de>2014-12-29 14:28:14 +1100
commit5963a15d69f6c87a3f1690398c1827669e1bfb61 (patch)
tree823bfbf13534d854204c41c67c4d142f8e20d607
parent95033e3837ac066c31853a176f1dd94422fa4838 (diff)
downloadscintilla-mirror-5963a15d69f6c87a3f1690398c1827669e1bfb61.tar.gz
S-Record lexer: add future-proof highlighting for unknown record types
An S4 record for example, which is not defined in the S-Record specification, will now be highlighted until record end (checksum) instead of aborting after the "byte count" field. The former behaviour looked a bit half-baked. Since the size of the address field is unknown, the address and data fields are highlighted with the same style in the new state SCE_SREC_DATA_UNKNOWN. Alternating styles (ODD/EVEN) for readability of the data field of valid record types are not applied.
-rw-r--r--include/Scintilla.iface2
-rw-r--r--lexers/LexHex.cxx26
2 files changed, 16 insertions, 12 deletions
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 30593426e..70b46e0d4 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -4563,6 +4563,8 @@ val SCE_SREC_DATA_ODD=9
val SCE_SREC_DATA_EVEN=10
val SCE_SREC_CHECKSUM=11
val SCE_SREC_CHECKSUM_WRONG=12
+val SCE_SREC_ADDRESSFIELD_UNKNOWN=13
+val SCE_SREC_DATA_UNKNOWN=14
# Events
diff --git a/lexers/LexHex.cxx b/lexers/LexHex.cxx
index 9b35732f6..05cb7e636 100644
--- a/lexers/LexHex.cxx
+++ b/lexers/LexHex.cxx
@@ -22,9 +22,9 @@
* +----------+
* | count | 2 SCE_SREC_BYTECOUNT, SCE_SREC_BYTECOUNT_WRONG
* +----------+
- * | address | 4/6/8 SCE_SREC_NOADDRESS, SCE_SREC_DATAADDRESS, SCE_SREC_RECCOUNT, SCE_SREC_STARTADDRESS
+ * | address | 4/6/8 SCE_SREC_NOADDRESS, SCE_SREC_DATAADDRESS, SCE_SREC_RECCOUNT, SCE_SREC_STARTADDRESS, (SCE_SREC_ADDRESSFIELD_UNKNOWN)
* +----------+
- * | data | 0..500 SCE_SREC_DATA_ODD, SCE_SREC_DATA_EVEN
+ * | data | 0..500 SCE_SREC_DATA_ODD, SCE_SREC_DATA_EVEN, (SCE_SREC_DATA_UNKNOWN)
* +----------+
* | checksum | 2 SCE_SREC_CHECKSUM, SCE_SREC_CHECKSUM_WRONG
* +----------+
@@ -228,8 +228,8 @@ static int GetSrecAddressFieldType(unsigned int recStartPos, Accessor &styler)
case '9':
return SCE_SREC_STARTADDRESS;
- default:
- return SCE_SREC_DEFAULT;
+ default: // handle possible format extension in the future
+ return SCE_SREC_ADDRESSFIELD_UNKNOWN;
}
}
@@ -307,25 +307,26 @@ static void ColouriseSrecDoc(unsigned int startPos, int length, int initStyle, W
addrFieldSize = GetSrecAddressFieldSize(recStartPos, styler);
addrFieldType = GetSrecAddressFieldType(recStartPos, styler);
- if (addrFieldSize > 0) {
- sc.SetState(addrFieldType);
- ForwardWithinLine(sc, addrFieldSize * 2);
- } else {
- // malformed
- sc.SetState(SCE_SREC_DEFAULT);
- ForwardWithinLine(sc);
- }
+ sc.SetState(addrFieldType);
+ ForwardWithinLine(sc, addrFieldSize * 2);
break;
case SCE_SREC_NOADDRESS:
case SCE_SREC_DATAADDRESS:
case SCE_SREC_RECCOUNT:
case SCE_SREC_STARTADDRESS:
+ case SCE_SREC_ADDRESSFIELD_UNKNOWN:
recStartPos = GetSrecRecStartPosition(sc.currentPos, styler);
byteCount = GetSrecByteCount(recStartPos, styler);
addrFieldSize = GetSrecAddressFieldSize(recStartPos, styler);
dataFieldSize = byteCount - addrFieldSize - 1; // -1 for checksum field
+ if (sc.state == SCE_SREC_ADDRESSFIELD_UNKNOWN) {
+ sc.SetState(SCE_SREC_DATA_UNKNOWN);
+ ForwardWithinLine(sc, dataFieldSize * 2);
+ break;
+ }
+
sc.SetState(SCE_SREC_DATA_ODD);
for (int i = 0; i < dataFieldSize * 2; i++) {
@@ -343,6 +344,7 @@ static void ColouriseSrecDoc(unsigned int startPos, int length, int initStyle, W
case SCE_SREC_DATA_ODD:
case SCE_SREC_DATA_EVEN:
+ case SCE_SREC_DATA_UNKNOWN:
recStartPos = GetSrecRecStartPosition(sc.currentPos, styler);
cs1 = CalcSrecChecksum(recStartPos, styler);
cs2 = GetSrecChecksum(recStartPos, styler);