From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44097) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBArM-0000Vi-9J for qemu-devel@nongnu.org; Mon, 21 Dec 2015 19:31:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aBArK-00025m-3A for qemu-devel@nongnu.org; Mon, 21 Dec 2015 19:31:24 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59442) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBArJ-00025S-Si for qemu-devel@nongnu.org; Mon, 21 Dec 2015 19:31:22 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 8A5CB8F4E2 for ; Tue, 22 Dec 2015 00:31:21 +0000 (UTC) From: Eric Blake Date: Mon, 21 Dec 2015 17:31:03 -0700 Message-Id: <1450744268-25052-10-git-send-email-eblake@redhat.com> In-Reply-To: <1450744268-25052-1-git-send-email-eblake@redhat.com> References: <1450744268-25052-1-git-send-email-eblake@redhat.com> Subject: [Qemu-devel] [PATCH v2 09/14] Revert "qjson: Simplify by using json-output-visitor" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, armbru@redhat.com 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 #include -#include +#include #include #include #include -#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