diff mbox

[v2,09/14] Revert "qjson: Simplify by using json-output-visitor"

Message ID 1450744268-25052-10-git-send-email-eblake@redhat.com
State New
Headers show

Commit Message

Eric Blake Dec. 22, 2015, 12:31 a.m. UTC
This reverts commit 5859ad241516eed8cb9ba60889efa0ed47648b38.

The revert is here only to show the difference between two
alternatives, the final series will have just one choice of
patch 8, or of patches 10-11

---
 qjson.c | 61 +++++++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 39 insertions(+), 22 deletions(-)
diff mbox

Patch

diff --git a/qjson.c b/qjson.c
index 8874bad..8c93c1b 100644
--- a/qjson.c
+++ b/qjson.c
@@ -11,86 +11,103 @@ 
  *
  */

+#include <qapi/qmp/qstring.h>
 #include <stdbool.h>
-#include <stdint.h>
+#include <glib.h>
 #include <qjson.h>
 #include <qemu/module.h>
 #include <qom/object.h>
-#include "qapi/json-output-visitor.h"

 struct QJSON {
     Object obj;
-    JsonOutputVisitor *jov;
-    char *str;
+    QString *str;
+    bool omit_comma;
 };

 #define QJSON(obj) OBJECT_CHECK(QJSON, (obj), TYPE_QJSON)

+static void json_emit_element(QJSON *json, const char *name)
+{
+    /* Check whether we need to print a , before an element */
+    if (json->omit_comma) {
+        json->omit_comma = false;
+    } else {
+        qstring_append(json->str, ", ");
+    }
+
+    if (name) {
+        qstring_append_json_string(json->str, name);
+        qstring_append(json->str, " : ");
+    }
+}
+
 void json_start_object(QJSON *json, const char *name)
 {
-    Visitor *v = json_output_get_visitor(json->jov);
-    visit_start_struct(v, name, NULL, 0, &error_abort);
+    json_emit_element(json, name);
+    qstring_append(json->str, "{ ");
+    json->omit_comma = true;
 }

 void json_end_object(QJSON *json)
 {
-    Visitor *v = json_output_get_visitor(json->jov);
-    visit_check_struct(v, &error_abort);
-    visit_end_struct(v);
+    qstring_append(json->str, " }");
+    json->omit_comma = false;
 }

 void json_start_array(QJSON *json, const char *name)
 {
-    Visitor *v = json_output_get_visitor(json->jov);
-    visit_start_list(v, name, NULL, 0, &error_abort);
+    json_emit_element(json, name);
+    qstring_append(json->str, "[ ");
+    json->omit_comma = true;
 }

 void json_end_array(QJSON *json)
 {
-    Visitor *v = json_output_get_visitor(json->jov);
-    visit_end_list(v);
+    qstring_append(json->str, " ]");
+    json->omit_comma = false;
 }

 void json_prop_int(QJSON *json, const char *name, int64_t val)
 {
-    Visitor *v = json_output_get_visitor(json->jov);
-    visit_type_int(v, name, &val, &error_abort);
+    json_emit_element(json, name);
+    qstring_append_format(json->str, "%" PRId64, val);
 }

 void json_prop_str(QJSON *json, const char *name, const char *str)
 {
-    Visitor *v = json_output_get_visitor(json->jov);
-    visit_type_str(v, name, (char **)&str, &error_abort);
+    json_emit_element(json, name);
+    qstring_append_json_string(json->str, str);
 }

 const char *qjson_get_str(QJSON *json)
 {
-    return json->str;
+    return qstring_get_str(json->str);
 }

 QJSON *qjson_new(void)
 {
     QJSON *json = QJSON(object_new(TYPE_QJSON));
-    json_start_object(json, NULL);
     return json;
 }

 void qjson_finish(QJSON *json)
 {
     json_end_object(json);
-    json->str = json_output_get_string(json->jov);
 }

 static void qjson_initfn(Object *obj)
 {
     QJSON *json = QJSON(obj);
-    json->jov = json_output_visitor_new();
+
+    json->str = qstring_from_str("{ ");
+    json->omit_comma = true;
 }

 static void qjson_finalizefn(Object *obj)
 {
     QJSON *json = QJSON(obj);
-    g_free(json->str);
+
+    qobject_decref(QOBJECT(json->str));
 }

 static const TypeInfo qjson_type_info = {