| /* |
| * A simple JSON writer |
| * |
| * Copyright Alexander Graf |
| * |
| * Authors: |
| * 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. |
| * |
| */ |
| |
| /* |
| * Type QJSON lets you build JSON text. Its interface mirrors (a |
| * subset of) abstract JSON syntax. |
| * |
| * It does *not* detect incorrect use. It happily produces invalid |
| * JSON then. This is what migration wants. |
| * |
| * QAPI output visitors also produce JSON text. However, they do |
| * assert their preconditions and invariants, and therefore abort on |
| * incorrect use. |
| */ |
| |
| #include "qemu/osdep.h" |
| #include "qapi/qmp/qstring.h" |
| #include "migration/qjson.h" |
| |
| struct QJSON { |
| QString *str; |
| bool omit_comma; |
| }; |
| |
| 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->str, "\""); |
| qstring_append(json->str, name); |
| qstring_append(json->str, "\" : "); |
| } |
| } |
| |
| void json_start_object(QJSON *json, const char *name) |
| { |
| json_emit_element(json, name); |
| qstring_append(json->str, "{ "); |
| json->omit_comma = true; |
| } |
| |
| void json_end_object(QJSON *json) |
| { |
| qstring_append(json->str, " }"); |
| json->omit_comma = false; |
| } |
| |
| void json_start_array(QJSON *json, const char *name) |
| { |
| json_emit_element(json, name); |
| qstring_append(json->str, "[ "); |
| json->omit_comma = true; |
| } |
| |
| void json_end_array(QJSON *json) |
| { |
| qstring_append(json->str, " ]"); |
| json->omit_comma = false; |
| } |
| |
| void json_prop_int(QJSON *json, const char *name, int64_t val) |
| { |
| json_emit_element(json, name); |
| qstring_append_int(json->str, val); |
| } |
| |
| 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, '"'); |
| } |
| |
| const char *qjson_get_str(QJSON *json) |
| { |
| return qstring_get_str(json->str); |
| } |
| |
| QJSON *qjson_new(void) |
| { |
| QJSON *json = g_new0(QJSON, 1); |
| |
| json->str = qstring_from_str("{ "); |
| json->omit_comma = true; |
| return json; |
| } |
| |
| void qjson_finish(QJSON *json) |
| { |
| json_end_object(json); |
| } |
| |
| void qjson_destroy(QJSON *json) |
| { |
| QDECREF(json->str); |
| g_free(json); |
| } |