1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <qapi/qmp/qstring.h>
15#include <stdbool.h>
16#include <glib.h>
17#include <qjson.h>
18#include <qemu/module.h>
19#include <qom/object.h>
20
21struct QJSON {
22 Object obj;
23 QString *str;
24 bool omit_comma;
25};
26
27static void json_emit_element(QJSON *json, const char *name)
28{
29
30 if (json->omit_comma) {
31 json->omit_comma = false;
32 } else {
33 qstring_append(json->str, ", ");
34 }
35
36 if (name) {
37 qstring_append(json->str, "\"");
38 qstring_append(json->str, name);
39 qstring_append(json->str, "\" : ");
40 }
41}
42
43void json_start_object(QJSON *json, const char *name)
44{
45 json_emit_element(json, name);
46 qstring_append(json->str, "{ ");
47 json->omit_comma = true;
48}
49
50void json_end_object(QJSON *json)
51{
52 qstring_append(json->str, " }");
53 json->omit_comma = false;
54}
55
56void json_start_array(QJSON *json, const char *name)
57{
58 json_emit_element(json, name);
59 qstring_append(json->str, "[ ");
60 json->omit_comma = true;
61}
62
63void json_end_array(QJSON *json)
64{
65 qstring_append(json->str, " ]");
66 json->omit_comma = false;
67}
68
69void json_prop_int(QJSON *json, const char *name, int64_t val)
70{
71 json_emit_element(json, name);
72 qstring_append_int(json->str, val);
73}
74
75void json_prop_str(QJSON *json, const char *name, const char *str)
76{
77 json_emit_element(json, name);
78 qstring_append_chr(json->str, '"');
79 qstring_append(json->str, str);
80 qstring_append_chr(json->str, '"');
81}
82
83const char *qjson_get_str(QJSON *json)
84{
85 return qstring_get_str(json->str);
86}
87
88QJSON *qjson_new(void)
89{
90 QJSON *json = (QJSON *)object_new(TYPE_QJSON);
91 return json;
92}
93
94void qjson_finish(QJSON *json)
95{
96 json_end_object(json);
97}
98
99static void qjson_initfn(Object *obj)
100{
101 QJSON *json = (QJSON *)object_dynamic_cast(obj, TYPE_QJSON);
102 assert(json);
103
104 json->str = qstring_from_str("{ ");
105 json->omit_comma = true;
106}
107
108static void qjson_finalizefn(Object *obj)
109{
110 QJSON *json = (QJSON *)object_dynamic_cast(obj, TYPE_QJSON);
111
112 assert(json);
113 qobject_decref(QOBJECT(json->str));
114}
115
116static const TypeInfo qjson_type_info = {
117 .name = TYPE_QJSON,
118 .parent = TYPE_OBJECT,
119 .instance_size = sizeof(QJSON),
120 .instance_init = qjson_initfn,
121 .instance_finalize = qjson_finalizefn,
122};
123
124static void qjson_register_types(void)
125{
126 type_register_static(&qjson_type_info);
127}
128
129type_init(qjson_register_types)
130