aboutsummaryrefslogtreecommitdiff
path: root/lib/json.c
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2009-12-03 16:08:34 -0800
committerBen Pfaff <blp@nicira.com>2009-12-03 16:08:34 -0800
commit0bdf342a8c90c821d63da05b2cc9df159af03b75 (patch)
tree924da56d3e57aadba92286c787a048891f268c01 /lib/json.c
parentfa33d64a5797e59d61fd3d12257b27b5565fc587 (diff)
json: Improve error reporting.
Diffstat (limited to 'lib/json.c')
-rw-r--r--lib/json.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/json.c b/lib/json.c
index cdcfba59..c31f418a 100644
--- a/lib/json.c
+++ b/lib/json.c
@@ -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;
}
}