changeset 19708:6d45c0bb9b30

lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 04 Feb 2016 13:31:59 +0200
parents 55397852db0a
children 31389e4b4677
files src/lib/json-parser.c src/lib/test-json-parser.c
diffstat 2 files changed, 19 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/json-parser.c	Wed Feb 03 17:56:49 2016 +0200
+++ b/src/lib/json-parser.c	Thu Feb 04 13:31:59 2016 +0200
@@ -28,6 +28,7 @@
 struct json_parser {
 	struct istream *input;
 	uoff_t highwater_offset;
+	enum json_parser_flags flags;
 
 	const unsigned char *start, *end, *data;
 	const char *error;
@@ -111,6 +112,7 @@
 
 	parser = i_new(struct json_parser, 1);
 	parser->input = input;
+	parser->flags = flags;
 	parser->value = str_new(default_pool, 128);
 	i_array_init(&parser->nesting, 8);
 	i_stream_ref(input);
@@ -356,7 +358,10 @@
 	if (count == 1) {
 		/* closing root */
 		parser->state = JSON_STATE_DONE;
-		return 0;
+		if ((parser->flags & JSON_PARSER_NO_ROOT_OBJECT) == 0)
+			return 0;
+		/* we want to return the ending "]" or "}" to caller */
+		return 1;
 	}
 
 	/* closing a nested object */
--- a/src/lib/test-json-parser.c	Wed Feb 03 17:56:49 2016 +0200
+++ b/src/lib/test-json-parser.c	Thu Feb 04 13:31:59 2016 +0200
@@ -184,21 +184,24 @@
 
 static void test_json_parser_primitive_values(void)
 {
-	static const char *test_inputs[] = {
-		"\"hello\"",
-		"null",
-		"1234",
-		"1234.1234",
-		"{}",
-		"[]",
-		"true",
-		"false"
+	static struct {
+		const char *str;
+		int ret;
+	} test_inputs[] = {
+		{ "\"hello\"", 1 },
+		{ "null", 1 },
+		{ "1234", 1 },
+		{ "1234.1234", 1 },
+		{ "{}", 2 },
+		{ "[]", 2 },
+		{ "true", 1 },
+		{ "false", 1 }
 	};
 	unsigned int i;
 
 	test_begin("json_parser (primitives)");
 	for (i = 0; i < N_ELEMENTS(test_inputs); i++)
-		test_assert_idx(test_json_parse_input(test_inputs[i], JSON_PARSER_NO_ROOT_OBJECT) == 1, i);
+		test_assert_idx(test_json_parse_input(test_inputs[i].str, JSON_PARSER_NO_ROOT_OBJECT) == test_inputs[i].ret, i);
 	test_end();
 }