Eric Blake <ebl...@redhat.com> writes: > On 08/27/2018 02:00 AM, Markus Armbruster wrote: >> When the lexer isn't in its start state at the end of input, it's >> working on a token. To flush it out, it needs to transit to its start >> state on "end of input" lookahead. >> >> There are two ways to the start state, depending on the current state: >> >> * If the lexer is in a TERMINAL(JSON_FOO) state, it can emit a >> JSON_FOO token. >> >> * Else, it can go to IN_ERROR state, and emit a JSON_ERROR token. >> >> There are complications, however: >> >> * The transition to IN_ERROR state consumes the input character and >> adds it to the JSON_ERROR token. The latter is inappropriate for >> the "end of input" character, so we suppress that. See also recent >> commit "json: Fix lexer to include the bad character in JSON_ERROR >> token". > > Now commit a2ec6be7
I'll update the commit message. >> >> * The transition to a TERMINAL(JSON_FOO) state doesn't consume the >> input character. In that case, the lexer normally loops until it is >> consumed. We have to suppress that for the "end of input" input >> character. If we didn't, the lexer would consume it by entering >> IN_ERROR state, emitting a bogus JSON_ERROR token. We fixed that in >> commit bd3924a33a6. >> >> However, simply breaking the loop this way assumes that the lexer >> needs exactly one state transition to reach its start state. That >> assumption is correct now, but it's unclean, and I'll soon break it. >> Clean up: instead of breaking the loop after one iteration, break it >> after it reached the start state. >> >> Signed-off-by: Markus Armbruster <arm...@redhat.com> >> --- >> qobject/json-lexer.c | 17 +++++++++-------- >> 1 file changed, 9 insertions(+), 8 deletions(-) >> >> diff --git a/qobject/json-lexer.c b/qobject/json-lexer.c >> index 4867839f66..ec3aec726f 100644 >> --- a/qobject/json-lexer.c >> +++ b/qobject/json-lexer.c >> @@ -261,7 +261,8 @@ void json_lexer_init(JSONLexer *lexer, bool >> enable_interpolation) >> static void json_lexer_feed_char(JSONLexer *lexer, char ch, bool >> flush) >> { >> - int char_consumed, new_state; >> + int new_state; >> + bool char_consumed = false; > > Yay for the switch to bool. > > Reviewed-by: Eric Blake <ebl...@redhat.com> Thanks!