diff --git a/source/dcell/parser.d b/source/dcell/parser.d index 0fc6a2d..4ad23d8 100644 --- a/source/dcell/parser.d +++ b/source/dcell/parser.d @@ -400,9 +400,15 @@ private: { parseState = ParseState.ini; size_t index = 0; - dchar dch = decode(cast(string) accum, index); + try + { + dchar dch = decode(cast(const(char)[]) accum, index); + postKey(Key.graph, dch, Modifiers.none); + } + catch (UTFException) + { + } accum = null; - postKey(Key.graph, dch, Modifiers.none); } break; case ParseState.ini: @@ -1283,6 +1289,19 @@ private: assert(ev[0].key.key == Key.graph); assert(ev[0].key.ch == '€'); + // invalid unicode - should not crash, and should preserve subsequent valid input + assert(p.parse("\xE2 A")); + ev = p.events(); + assert(ev.length == 1); + assert(ev[0].key.ch == 'A'); + + // valid multi-byte followed by valid input + assert(p.parse("\xE2\x82\xacB")); + ev = p.events(); + assert(ev.length == 2); + assert(ev[0].key.ch == '€'); + assert(ev[1].key.ch == 'B'); + // SOS (no event) assert(p.parse(['\x1b', 'X', 'p', '\x1b', '\\'])); assert(p.events().length == 0);