]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-json: json-generator - Add support for writing directly to the underlying stream
authorStephan Bosch <stephan.bosch@open-xchange.com>
Thu, 7 May 2020 12:56:06 +0000 (14:56 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Sat, 18 Nov 2023 18:58:04 +0000 (18:58 +0000)
src/lib-json/json-generator.c
src/lib-json/json-generator.h

index 571a067479d931becb7cae6cf878fe03fa4e63bd..225574ddd62cf69286b016c02e6c07aedb1a2fa7 100644 (file)
@@ -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 <space> */
+       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;
 }
 
+/*
+ * <space>
+ */
+
+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
  */
index 69a151877535f08b357b5f743d3ab2d9388d1434..d8a70864a2096faf6fa4338f72bcea404aed1384 100644 (file)
@@ -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);
 
+/* <space> */
+
+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,