diff options
author | Markus Heidelberg <markus.heidelberg@web.de> | 2014-12-29 14:28:14 +1100 |
---|---|---|
committer | Markus Heidelberg <markus.heidelberg@web.de> | 2014-12-29 14:28:14 +1100 |
commit | 5963a15d69f6c87a3f1690398c1827669e1bfb61 (patch) | |
tree | 823bfbf13534d854204c41c67c4d142f8e20d607 | |
parent | 95033e3837ac066c31853a176f1dd94422fa4838 (diff) | |
download | scintilla-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.iface | 2 | ||||
-rw-r--r-- | lexers/LexHex.cxx | 26 |
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); |