mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:17 +00:00
Now that all calls to parse_error have a token, add the line and column to the message. As far as I can see the two important TODOs (better errors and better EOI handling) are done, and the others (token range information and "parsed size"?) do not really matter or are handled better by json-streamer.c. So remove the list, which had sat unchanged since 2009. This needs some adjustments to provide a good x and y for error messages. First of all, they switch from zero-based to one-based, which is safe because they were both sitting unused. Second, right now the x and y are those of the *last* character in the token. Modify json-lexer.c to freeze tok->x and tok->y at the first character added to the GString. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-ID: <20260626101727.1727389-7-pbonzini@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
55 lines
1.3 KiB
C
55 lines
1.3 KiB
C
/*
|
|
* JSON Parser
|
|
*
|
|
* Copyright IBM, Corp. 2009
|
|
*
|
|
* Authors:
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
* See the COPYING.LIB file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#ifndef QAPI_QMP_JSON_PARSER_H
|
|
#define QAPI_QMP_JSON_PARSER_H
|
|
|
|
typedef struct JSONLexer {
|
|
int start_state, state;
|
|
GString *token;
|
|
int cur_x, cur_y;
|
|
int x, y;
|
|
} JSONLexer;
|
|
|
|
typedef struct JSONParserContext {
|
|
Error *err;
|
|
GQueue *stack;
|
|
va_list *ap;
|
|
} JSONParserContext;
|
|
|
|
typedef struct JSONMessageParser {
|
|
void (*emit)(void *opaque, QObject *json, Error *err);
|
|
void *opaque;
|
|
JSONLexer lexer;
|
|
JSONParserContext parser;
|
|
unsigned int brace_count;
|
|
unsigned int bracket_count;
|
|
unsigned int token_count;
|
|
bool error;
|
|
uint64_t token_size;
|
|
} JSONMessageParser;
|
|
|
|
void json_message_parser_init(JSONMessageParser *parser,
|
|
void (*emit)(void *opaque, QObject *json,
|
|
Error *err),
|
|
void *opaque, va_list *ap);
|
|
|
|
void json_message_parser_feed(JSONMessageParser *parser,
|
|
const char *buffer, size_t size);
|
|
|
|
void json_message_parser_flush(JSONMessageParser *parser);
|
|
|
|
void json_message_parser_destroy(JSONMessageParser *parser);
|
|
|
|
#endif
|