Mercurial > dovecot > core-2.2
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(); }