qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v2 09/14] Revert "qjson: Simplify by using json-outp


From: Eric Blake
Subject: [Qemu-devel] [PATCH v2 09/14] Revert "qjson: Simplify by using json-output-visitor"
Date: Mon, 21 Dec 2015 17:31:03 -0700

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 --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 = {
-- 
2.4.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]