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()). */