Detect trailing commas and colons inside arrays and hashes.

This commit is contained in:
Eric Fischer
2014-02-06 12:19:33 -08:00
parent 42283ece0b
commit 948584126a
+13 -7
View File
@@ -103,7 +103,7 @@ static void string_free(struct string *s) {
} }
json_object *json_parse(FILE *f, json_object *current, char **error) { json_object *json_parse(FILE *f, json_object *current, char **error) {
int current_is_container = 0; int current_is = 0;
int c; int c;
again: again:
c = getc(f); c = getc(f);
@@ -129,7 +129,7 @@ again:
if (c == '[') { if (c == '[') {
current = add_object(JSON_ARRAY, current, error); current = add_object(JSON_ARRAY, current, error);
current_is_container = 1; current_is = '[';
goto again; goto again;
} else if (c == ']') { } else if (c == ']') {
if (current == NULL) { if (current == NULL) {
@@ -137,8 +137,11 @@ again:
return NULL; return NULL;
} }
if (current_is_container) { // Empty array if (current_is == '[') { // Empty array
return current; return current;
} else if (current_is) {
*error = "Found ] without final element";
return NULL;
} }
if (current->parent == NULL || current->parent->type != JSON_ARRAY) { if (current->parent == NULL || current->parent->type != JSON_ARRAY) {
@@ -153,7 +156,7 @@ again:
if (c == '{') { if (c == '{') {
current = add_object(JSON_HASH, current, error); current = add_object(JSON_HASH, current, error);
current_is_container = 1; current_is = '{';
goto again; goto again;
} else if (c == '}') { } else if (c == '}') {
if (current == NULL) { if (current == NULL) {
@@ -161,8 +164,11 @@ again:
return NULL; return NULL;
} }
if (current_is_container) { // Empty hash if (current_is == '{') { // Empty hash
return current; return current;
} else if (current_is) {
*error = "Found } without final element";
return NULL;
} }
if (current->parent == NULL || current->parent->type != JSON_HASH) { if (current->parent == NULL || current->parent->type != JSON_HASH) {
@@ -224,7 +230,7 @@ again:
} }
current = current->parent; current = current->parent;
current_is_container = 1; current_is = ',';
goto again; goto again;
} }
@@ -246,7 +252,7 @@ again:
} }
current = current->parent; current = current->parent;
current_is_container = 1; current_is = ':';
goto again; goto again;
} }