From: Stephan Bosch Date: Thu, 7 May 2020 12:56:06 +0000 (+0200) Subject: lib-json: json-generator - Add support for writing directly to the underlying stream X-Git-Tag: 2.4.0~2378 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f44db86693c747eb85073c3e068ebdc75b88f639;p=thirdparty%2Fdovecot%2Fcore.git lib-json: json-generator - Add support for writing directly to the underlying stream --- 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,