]> git.proxmox.com Git - mirror_qemu.git/blobdiff - qjson.c
s390x/skeys: Fix instance and class size
[mirror_qemu.git] / qjson.c
diff --git a/qjson.c b/qjson.c
index 45207f2433cde896ab4699b4c102888e33a2e253..e478802a461f6b5556732d8a07b5066780c1c524 100644 (file)
--- a/qjson.c
+++ b/qjson.c
 /*
- * QObject JSON integration
+ * QEMU JSON writer
  *
- * Copyright IBM, Corp. 2009
+ * Copyright Alexander Graf
  *
  * Authors:
- *  Anthony Liguori   <aliguori@us.ibm.com>
+ *  Alexander Graf <agraf@suse.de>
  *
  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
  * See the COPYING.LIB file in the top-level directory.
  *
  */
 
-#include "json-lexer.h"
-#include "json-parser.h"
-#include "json-streamer.h"
-#include "qjson.h"
+#include <qapi/qmp/qstring.h>
+#include <stdbool.h>
+#include <glib.h>
+#include <qjson.h>
+#include <qemu/module.h>
+#include <qom/object.h>
 
-typedef struct JSONParsingState
+struct QJSON {
+    Object obj;
+    QString *str;
+    bool omit_comma;
+};
+
+#define QJSON(obj) OBJECT_CHECK(QJSON, (obj), TYPE_QJSON)
+
+static void json_emit_element(QJSON *json, const char *name)
 {
-    JSONMessageParser parser;
-    va_list *ap;
-    QObject *result;
-} JSONParsingState;
+    /* 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->str, "\"");
+        qstring_append(json->str, name);
+        qstring_append(json->str, "\" : ");
+    }
+}
 
-static void parse_json(JSONMessageParser *parser, QList *tokens)
+void json_start_object(QJSON *json, const char *name)
 {
-    JSONParsingState *s = container_of(parser, JSONParsingState, parser);
-    s->result = json_parser_parse(tokens, s->ap);
+    json_emit_element(json, name);
+    qstring_append(json->str, "{ ");
+    json->omit_comma = true;
 }
 
-QObject *qobject_from_json(const char *string)
+void json_end_object(QJSON *json)
 {
-    JSONParsingState state = {};
+    qstring_append(json->str, " }");
+    json->omit_comma = false;
+}
 
-    json_message_parser_init(&state.parser, parse_json);
-    json_message_parser_feed(&state.parser, string, strlen(string));
-    json_message_parser_flush(&state.parser);
-    json_message_parser_destroy(&state.parser);
+void json_start_array(QJSON *json, const char *name)
+{
+    json_emit_element(json, name);
+    qstring_append(json->str, "[ ");
+    json->omit_comma = true;
+}
 
-    return state.result;
+void json_end_array(QJSON *json)
+{
+    qstring_append(json->str, " ]");
+    json->omit_comma = false;
 }
 
-QObject *qobject_from_jsonf(const char *string, ...)
+void json_prop_int(QJSON *json, const char *name, int64_t val)
 {
-    JSONParsingState state = {};
-    va_list ap;
+    json_emit_element(json, name);
+    qstring_append_int(json->str, val);
+}
 
-    va_start(ap, string);
-    state.ap = &ap;
+void json_prop_str(QJSON *json, const char *name, const char *str)
+{
+    json_emit_element(json, name);
+    qstring_append_chr(json->str, '"');
+    qstring_append(json->str, str);
+    qstring_append_chr(json->str, '"');
+}
 
-    json_message_parser_init(&state.parser, parse_json);
-    json_message_parser_feed(&state.parser, string, strlen(string));
-    json_message_parser_flush(&state.parser);
-    json_message_parser_destroy(&state.parser);
+const char *qjson_get_str(QJSON *json)
+{
+    return qstring_get_str(json->str);
+}
 
-    va_end(ap);
+QJSON *qjson_new(void)
+{
+    QJSON *json = QJSON(object_new(TYPE_QJSON));
+    return json;
+}
 
-    return state.result;
+void qjson_finish(QJSON *json)
+{
+    json_end_object(json);
+}
+
+static void qjson_initfn(Object *obj)
+{
+    QJSON *json = QJSON(obj);
+
+    json->str = qstring_from_str("{ ");
+    json->omit_comma = true;
+}
+
+static void qjson_finalizefn(Object *obj)
+{
+    QJSON *json = QJSON(obj);
+
+    qobject_decref(QOBJECT(json->str));
 }
+
+static const TypeInfo qjson_type_info = {
+    .name = TYPE_QJSON,
+    .parent = TYPE_OBJECT,
+    .instance_size = sizeof(QJSON),
+    .instance_init = qjson_initfn,
+    .instance_finalize = qjson_finalizefn,
+};
+
+static void qjson_register_types(void)
+{
+    type_register_static(&qjson_type_info);
+}
+
+type_init(qjson_register_types)