From b8c1ea7f24fce8c841ca5f9170989504d1d87b11 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sun, 9 Dec 2018 20:24:28 +0100 Subject: [PATCH] lib: json-parser: Add support for skipping a value that is already partially parsed. Adds json_parse_skip(), which skips the remainder of the value parsed earlier by json_parse_next(). This is needed when values need to be skipped by their value type rather than their object member key. --- src/lib/json-parser.c | 18 ++++++++++++++++++ src/lib/json-parser.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/src/lib/json-parser.c b/src/lib/json-parser.c index 7d8ad991cb..9e0a871325 100644 --- a/src/lib/json-parser.c +++ b/src/lib/json-parser.c @@ -672,6 +672,24 @@ void json_parse_skip_next(struct json_parser *parser) parser->state = JSON_STATE_ARRAY_NEXT_SKIP; } +void json_parse_skip(struct json_parser *parser) +{ + i_assert(!parser->skipping); + i_assert(parser->strinput == NULL); + i_assert(parser->state == JSON_STATE_OBJECT_NEXT || + parser->state == JSON_STATE_OBJECT_OPEN || + parser->state == JSON_STATE_ARRAY_NEXT || + parser->state == JSON_STATE_ARRAY_OPEN); + + if (parser->state == JSON_STATE_OBJECT_OPEN || + parser->state == JSON_STATE_ARRAY_OPEN) + parser->nested_skip_count++; + + parser->skipping = TRUE; + if (parser->state == JSON_STATE_ARRAY_NEXT) + parser->state = JSON_STATE_ARRAY_NEXT_SKIP; +} + static void json_strinput_destroyed(struct json_parser *parser) { i_assert(parser->strinput != NULL); diff --git a/src/lib/json-parser.h b/src/lib/json-parser.h index 78fb448f7e..745f4a771e 100644 --- a/src/lib/json-parser.h +++ b/src/lib/json-parser.h @@ -42,6 +42,8 @@ int json_parse_next(struct json_parser *parser, enum json_type *type_r, /* Skip the next object value. If it's an object, its members are also skipped. */ void json_parse_skip_next(struct json_parser *parser); +/* Skip the remainder of the value parsed earlier by json_parse_next(). */ +void json_parse_skip(struct json_parser *parser); /* Return the following string as input stream. Returns 1 if ok, 0 if input stream is non-blocking and needs more input, -1 if the next token isn't a string (call json_parse_next()). */