diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2009-11-11 05:51:48 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2009-11-11 05:51:48 +0000 |
commit | 936d330fa8653001600020755844509e26cf874f (patch) | |
tree | 8b3c3c3e46390c39388bb7e602173262d3c3be4d /json.c | |
parent | 65f9e5cc8fcdb18b1bd3d49b96b67c9aa43f47ca (diff) | |
download | gpsd-936d330fa8653001600020755844509e26cf874f.tar.gz |
Add post_array state to the JSON parser, fixes an error in device-list parsing.
Diffstat (limited to 'json.c')
-rw-r--r-- | json.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -100,12 +100,12 @@ static int json_internal_read_object(const char *cp, /*@null@*/const char **end) { /*@ -nullstate -nullderef -mustfreefresh -nullpass -usedef @*/ - enum {init, await_attr, in_attr, await_value, - in_val_string, in_escape, in_val_token, post_val} state = 0; + enum {init, await_attr, in_attr, await_value, in_val_string, + in_escape, in_val_token, post_val, post_array} state = 0; #ifdef JSONDEBUG char *statenames[] = { - "init", "await_attr", "in_attr", "await_value", - "in_val_string", "in_escape", "in_val_token", "post_val" + "init", "await_attr", "in_attr", "await_value", "in_val_string", + "in_escape", "in_val_token", "post_val", "post_array", }; #endif /* JSONDEBUG */ char attrbuf[JSON_ATTR_MAX+1], *pattr = NULL; @@ -231,7 +231,7 @@ static int json_internal_read_object(const char *cp, substatus = json_read_array(cp, &cursor->addr.array, &cp); if (substatus != 0) return substatus; - state = post_val; + state = post_array; } else if (cursor->type == array) { json_debug_trace(("Array element was specified, but no [.\n")); return JSON_ERR_NOBRAK; @@ -358,6 +358,8 @@ static int json_internal_read_object(const char *cp, } break; } + /* FALL THROUGH */ + case post_array: if (isspace(*cp)) continue; else if (*cp == ',') |