Merge remote-tracking branch 'remotes/kraxel/tags/pull-usb-20160720-1' into staging
[qemu/ar7.git] / migration / qjson.c
blob5cae55af0775855a9c543778b52001e36a96a35a
1 /*
2 * A simple JSON writer
4 * Copyright Alexander Graf
6 * Authors:
7 * Alexander Graf <agraf@suse.de>
9 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
10 * See the COPYING.LIB file in the top-level directory.
15 * Type QJSON lets you build JSON text. Its interface mirrors (a
16 * subset of) abstract JSON syntax.
18 * It does *not* detect incorrect use. It happily produces invalid
19 * JSON then. This is what migration wants.
21 * QAPI output visitors also produce JSON text. However, they do
22 * assert their preconditions and invariants, and therefore abort on
23 * incorrect use.
26 #include "qemu/osdep.h"
27 #include "qapi/qmp/qstring.h"
28 #include "migration/qjson.h"
30 struct QJSON {
31 QString *str;
32 bool omit_comma;
35 static void json_emit_element(QJSON *json, const char *name)
37 /* Check whether we need to print a , before an element */
38 if (json->omit_comma) {
39 json->omit_comma = false;
40 } else {
41 qstring_append(json->str, ", ");
44 if (name) {
45 qstring_append(json->str, "\"");
46 qstring_append(json->str, name);
47 qstring_append(json->str, "\" : ");
51 void json_start_object(QJSON *json, const char *name)
53 json_emit_element(json, name);
54 qstring_append(json->str, "{ ");
55 json->omit_comma = true;
58 void json_end_object(QJSON *json)
60 qstring_append(json->str, " }");
61 json->omit_comma = false;
64 void json_start_array(QJSON *json, const char *name)
66 json_emit_element(json, name);
67 qstring_append(json->str, "[ ");
68 json->omit_comma = true;
71 void json_end_array(QJSON *json)
73 qstring_append(json->str, " ]");
74 json->omit_comma = false;
77 void json_prop_int(QJSON *json, const char *name, int64_t val)
79 json_emit_element(json, name);
80 qstring_append_int(json->str, val);
83 void json_prop_str(QJSON *json, const char *name, const char *str)
85 json_emit_element(json, name);
86 qstring_append_chr(json->str, '"');
87 qstring_append(json->str, str);
88 qstring_append_chr(json->str, '"');
91 const char *qjson_get_str(QJSON *json)
93 return qstring_get_str(json->str);
96 QJSON *qjson_new(void)
98 QJSON *json = g_new0(QJSON, 1);
100 json->str = qstring_from_str("{ ");
101 json->omit_comma = true;
102 return json;
105 void qjson_finish(QJSON *json)
107 json_end_object(json);
110 void qjson_destroy(QJSON *json)
112 g_free(json);