From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N8Hg3-0001VI-53 for qemu-devel@nongnu.org; Wed, 11 Nov 2009 13:12:19 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N8Hfy-0001MI-Bi for qemu-devel@nongnu.org; Wed, 11 Nov 2009 13:12:18 -0500 Received: from [199.232.76.173] (port=33260 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N8Hfy-0001M7-6A for qemu-devel@nongnu.org; Wed, 11 Nov 2009 13:12:14 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36117) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N8Hfx-0000bO-Ot for qemu-devel@nongnu.org; Wed, 11 Nov 2009 13:12:14 -0500 Date: Wed, 11 Nov 2009 16:12:05 -0200 From: Luiz Capitulino Message-ID: <20091111161205.00eac61f@doriath> In-Reply-To: <1257960543-26373-10-git-send-email-aliguori@us.ibm.com> References: <1257960543-26373-1-git-send-email-aliguori@us.ibm.com> <1257960543-26373-10-git-send-email-aliguori@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 10/11] Add a QObject JSON wrapper List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org On Wed, 11 Nov 2009 11:29:02 -0600 Anthony Liguori wrote: > This provides a QObject interface for creating QObjects from a JSON expression. > > Signed-off-by: Anthony Liguori > --- > Makefile | 2 +- > qjson.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > qjson.h | 23 +++++++++++++++++++++++ > 3 files changed, 84 insertions(+), 1 deletions(-) > create mode 100644 qjson.c > create mode 100644 qjson.h > > diff --git a/Makefile b/Makefile > index 6d68a1f..3818c51 100644 > --- a/Makefile > +++ b/Makefile > @@ -136,7 +136,7 @@ obj-y += qemu-char.o aio.o savevm.o > obj-y += msmouse.o ps2.o > obj-y += qdev.o qdev-properties.o > obj-y += qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o json-lexer.o > -obj-y += json-streamer.o json-parser.o > +obj-y += json-streamer.o json-parser.o qjson.o > obj-y += qemu-config.o > > obj-$(CONFIG_BRLAPI) += baum.o > diff --git a/qjson.c b/qjson.c > new file mode 100644 > index 0000000..45207f2 > --- /dev/null > +++ b/qjson.c > @@ -0,0 +1,60 @@ > +/* > + * QObject JSON integration > + * > + * Copyright IBM, Corp. 2009 > + * > + * Authors: > + * Anthony Liguori > + * > + * 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" > + > +typedef struct JSONParsingState > +{ > + JSONMessageParser parser; > + va_list *ap; > + QObject *result; > +} JSONParsingState; > + > +static void parse_json(JSONMessageParser *parser, QList *tokens) > +{ > + JSONParsingState *s = container_of(parser, JSONParsingState, parser); > + s->result = json_parser_parse(tokens, s->ap); > +} > + > +QObject *qobject_from_json(const char *string) > +{ > + JSONParsingState state = {}; > + > + 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); > + > + return state.result; > +} > + > +QObject *qobject_from_jsonf(const char *string, ...) > +{ > + JSONParsingState state = {}; > + va_list ap; > + > + va_start(ap, string); > + state.ap = ≈ > + > + 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); > + > + va_end(ap); > + > + return state.result; I think we should abort() on error, assuming the only way to fail is a bad syntax.