diff options
author | Ben Pfaff <blp@nicira.com> | 2009-12-03 16:08:34 -0800 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2009-12-03 16:08:34 -0800 |
commit | 0bdf342a8c90c821d63da05b2cc9df159af03b75 (patch) | |
tree | 924da56d3e57aadba92286c787a048891f268c01 /lib/json.c | |
parent | fa33d64a5797e59d61fd3d12257b27b5565fc587 (diff) |
json: Improve error reporting.
Diffstat (limited to 'lib/json.c')
-rw-r--r-- | lib/json.c | 21 |
1 files changed, 19 insertions, 2 deletions
@@ -99,6 +99,9 @@ struct json_parser { /* Lexical analysis. */ enum json_lex_state lex_state; struct ds buffer; /* Buffer for accumulating token text. */ + int line_number; + int column_number; + int byte_number; /* Parsing. */ enum json_parse_state parse_state; @@ -869,10 +872,18 @@ exit: } static bool -json_lex_input(struct json_parser *p, int c) +json_lex_input(struct json_parser *p, unsigned char c) { struct json_token token; + p->byte_number++; + if (c == '\n') { + p->column_number = 0; + p->line_number++; + } else { + p->column_number++; + } + switch (p->lex_state) { case JSON_LEX_START: switch (c) { @@ -1340,12 +1351,18 @@ static void json_error(struct json_parser *p, const char *format, ...) { if (!p->error) { + struct ds msg; va_list args; + ds_init(&msg); + ds_put_format(&msg, "line %d, column %d, byte %d: ", + p->line_number, p->column_number, p->byte_number); va_start(args, format); - p->error = xvasprintf(format, args); + ds_put_format_valist(&msg, format, args); va_end(args); + p->error = ds_steal_cstr(&msg); + p->done = true; } } |