From f44db86693c747eb85073c3e068ebdc75b88f639 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Thu, 7 May 2020 14:56:06 +0200 Subject: [PATCH] lib-json: json-generator - Add support for writing directly to the underlying stream --- src/lib-json/json-generator.c | 39 +++++++++++++++++++++++++++++++++-- src/lib-json/json-generator.h | 5 +++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/lib-json/json-generator.c b/src/lib-json/json-generator.c index 571a067479..225574ddd6 100644 --- a/src/lib-json/json-generator.c +++ b/src/lib-json/json-generator.c @@ -24,6 +24,7 @@ enum json_generator_state { JSON_GENERATOR_STATE_OBJECT_VALUE, JSON_GENERATOR_STATE_STRING, JSON_GENERATOR_STATE_TEXT, + JSON_GENERATOR_STATE_SPACE, JSON_GENERATOR_STATE_END, }; @@ -286,7 +287,8 @@ int json_generator_flush(struct json_generator *generator) break; i_assert(generator->write_state != JSON_GENERATOR_STATE_STRING && - generator->write_state != JSON_GENERATOR_STATE_TEXT); + generator->write_state != JSON_GENERATOR_STATE_TEXT && + generator->write_state != JSON_GENERATOR_STATE_SPACE); if (generator->write_state == JSON_GENERATOR_STATE_VALUE_END) generator->write_state = JSON_GENERATOR_STATE_VALUE_NEXT; if (generator->write_state == JSON_GENERATOR_STATE_VALUE_NEXT) { @@ -329,7 +331,8 @@ int json_generator_flush(struct json_generator *generator) break; } if (generator->state != JSON_GENERATOR_STATE_STRING && - generator->state != JSON_GENERATOR_STATE_TEXT) + generator->state != JSON_GENERATOR_STATE_TEXT && + generator->state != JSON_GENERATOR_STATE_SPACE) break; generator->write_state = JSON_GENERATOR_STATE_VALUE_NEXT; /* Fall through */ @@ -409,6 +412,10 @@ int json_generator_flush(struct json_generator *generator) } generator->write_state = JSON_GENERATOR_STATE_VALUE_END; } + /* flush opening */ + if (generator->state == JSON_GENERATOR_STATE_SPACE && + generator->write_state != JSON_GENERATOR_STATE_SPACE) + generator->write_state = JSON_GENERATOR_STATE_SPACE; /* flush string stream */ if (generator->text_stream) { i_assert(generator->value_input != NULL); @@ -1061,6 +1068,34 @@ int json_generate_text_stream(struct json_generator *generator, return 1; } +/* + * + */ + +int json_generate_space_open(struct json_generator *generator) +{ + int ret; + + if (generator->state != JSON_GENERATOR_STATE_SPACE) { + i_assert(generator->state == JSON_GENERATOR_STATE_VALUE || + generator->state == JSON_GENERATOR_STATE_OBJECT_MEMBER); + generator->state = JSON_GENERATOR_STATE_SPACE; + } + + ret = json_generator_flush(generator); + i_assert(ret <= 0 || + generator->write_state == JSON_GENERATOR_STATE_SPACE); + return ret; +} + +void json_generate_space_close(struct json_generator *generator) +{ + i_assert(generator->state == JSON_GENERATOR_STATE_SPACE); + i_assert(generator->write_state == JSON_GENERATOR_STATE_SPACE); + + json_generator_value_end(generator); +} + /* * value */ diff --git a/src/lib-json/json-generator.h b/src/lib-json/json-generator.h index 69a1518775..d8a70864a2 100644 --- a/src/lib-json/json-generator.h +++ b/src/lib-json/json-generator.h @@ -87,6 +87,11 @@ int json_generate_text(struct json_generator *generator, const char *str); int json_generate_text_stream(struct json_generator *generator, struct istream *input); +/* */ + +int json_generate_space_open(struct json_generator *generator); +void json_generate_space_close(struct json_generator *generator); + /* value */ int json_generate_value(struct json_generator *generator, -- 2.47.3