On Wed, 11 Nov 2009 11:29:02 -0600 Anthony Liguori <aligu...@us.ibm.com> wrote:
> This provides a QObject interface for creating QObjects from a JSON > expression. > > Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> > --- > 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 <aligu...@us.ibm.com> > + * > + * 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.