From nobody Wed Nov 5 10:32:23 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1535045737261438.8271131243181; Thu, 23 Aug 2018 10:35:37 -0700 (PDT) Received: from localhost ([::1]:38008 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fstW1-00024u-BB for importer@patchew.org; Thu, 23 Aug 2018 13:35:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35589) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fsskU-0000Y4-EL for qemu-devel@nongnu.org; Thu, 23 Aug 2018 12:46:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fsskM-0006Me-6p for qemu-devel@nongnu.org; Thu, 23 Aug 2018 12:46:16 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:59570 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fsskL-0006Lf-S6 for qemu-devel@nongnu.org; Thu, 23 Aug 2018 12:46:09 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7718F804B9F5; Thu, 23 Aug 2018 16:46:09 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2FE072027047; Thu, 23 Aug 2018 16:46:09 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9E39C1169072; Thu, 23 Aug 2018 18:40:26 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 23 Aug 2018 18:40:22 +0200 Message-Id: <20180823164025.12553-56-armbru@redhat.com> In-Reply-To: <20180823164025.12553-1-armbru@redhat.com> References: <20180823164025.12553-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Thu, 23 Aug 2018 16:46:09 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Thu, 23 Aug 2018 16:46:09 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 55/58] json: Keep interpolation state in JSONParserContext X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: marcandre.lureau@redhat.com, mdroth@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RDMRC_1 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The recursive descent parser passes along a pointer to JSONParserContext. It additionally passes a pointer to interpolation state (a va_alist *) as needed to reach its consumer parse_interpolation(). Stuffing the latter pointer into JSONParserContext saves us the trouble of passing it along, so do that. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- qobject/json-parser.c | 59 ++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/qobject/json-parser.c b/qobject/json-parser.c index 7449684f1c..273f448a52 100644 --- a/qobject/json-parser.c +++ b/qobject/json-parser.c @@ -36,6 +36,7 @@ typedef struct JSONParserContext Error *err; JSONToken *current; GQueue *buf; + va_list *ap; } JSONParserContext; =20 #define BUG_ON(cond) assert(!(cond)) @@ -49,7 +50,7 @@ typedef struct JSONParserContext * 4) deal with premature EOI */ =20 -static QObject *parse_value(JSONParserContext *ctxt, va_list *ap); +static QObject *parse_value(JSONParserContext *ctxt); =20 /** * Error handler @@ -243,7 +244,7 @@ static JSONToken *parser_context_peek_token(JSONParserC= ontext *ctxt) /** * Parsing rules */ -static int parse_pair(JSONParserContext *ctxt, QDict *dict, va_list *ap) +static int parse_pair(JSONParserContext *ctxt, QDict *dict) { QObject *value; QString *key =3D NULL; @@ -255,7 +256,7 @@ static int parse_pair(JSONParserContext *ctxt, QDict *d= ict, va_list *ap) goto out; } =20 - key =3D qobject_to(QString, parse_value(ctxt, ap)); + key =3D qobject_to(QString, parse_value(ctxt)); if (!key) { parse_error(ctxt, peek, "key is not a string in object"); goto out; @@ -272,7 +273,7 @@ static int parse_pair(JSONParserContext *ctxt, QDict *d= ict, va_list *ap) goto out; } =20 - value =3D parse_value(ctxt, ap); + value =3D parse_value(ctxt); if (value =3D=3D NULL) { parse_error(ctxt, token, "Missing value in dict"); goto out; @@ -290,7 +291,7 @@ out: return -1; } =20 -static QObject *parse_object(JSONParserContext *ctxt, va_list *ap) +static QObject *parse_object(JSONParserContext *ctxt) { QDict *dict =3D NULL; JSONToken *token, *peek; @@ -307,7 +308,7 @@ static QObject *parse_object(JSONParserContext *ctxt, v= a_list *ap) } =20 if (peek->type !=3D JSON_RCURLY) { - if (parse_pair(ctxt, dict, ap) =3D=3D -1) { + if (parse_pair(ctxt, dict) =3D=3D -1) { goto out; } =20 @@ -323,7 +324,7 @@ static QObject *parse_object(JSONParserContext *ctxt, v= a_list *ap) goto out; } =20 - if (parse_pair(ctxt, dict, ap) =3D=3D -1) { + if (parse_pair(ctxt, dict) =3D=3D -1) { goto out; } =20 @@ -344,7 +345,7 @@ out: return NULL; } =20 -static QObject *parse_array(JSONParserContext *ctxt, va_list *ap) +static QObject *parse_array(JSONParserContext *ctxt) { QList *list =3D NULL; JSONToken *token, *peek; @@ -363,7 +364,7 @@ static QObject *parse_array(JSONParserContext *ctxt, va= _list *ap) if (peek->type !=3D JSON_RSQUARE) { QObject *obj; =20 - obj =3D parse_value(ctxt, ap); + obj =3D parse_value(ctxt); if (obj =3D=3D NULL) { parse_error(ctxt, token, "expecting value"); goto out; @@ -383,7 +384,7 @@ static QObject *parse_array(JSONParserContext *ctxt, va= _list *ap) goto out; } =20 - obj =3D parse_value(ctxt, ap); + obj =3D parse_value(ctxt); if (obj =3D=3D NULL) { parse_error(ctxt, token, "expecting value"); goto out; @@ -426,7 +427,7 @@ static QObject *parse_keyword(JSONParserContext *ctxt) return NULL; } =20 -static QObject *parse_interpolation(JSONParserContext *ctxt, va_list *ap) +static QObject *parse_interpolation(JSONParserContext *ctxt) { JSONToken *token; =20 @@ -434,29 +435,29 @@ static QObject *parse_interpolation(JSONParserContext= *ctxt, va_list *ap) assert(token && token->type =3D=3D JSON_INTERP); =20 if (!strcmp(token->str, "%p")) { - return va_arg(*ap, QObject *); + return va_arg(*ctxt->ap, QObject *); } else if (!strcmp(token->str, "%i")) { - return QOBJECT(qbool_from_bool(va_arg(*ap, int))); + return QOBJECT(qbool_from_bool(va_arg(*ctxt->ap, int))); } else if (!strcmp(token->str, "%d")) { - return QOBJECT(qnum_from_int(va_arg(*ap, int))); + return QOBJECT(qnum_from_int(va_arg(*ctxt->ap, int))); } else if (!strcmp(token->str, "%ld")) { - return QOBJECT(qnum_from_int(va_arg(*ap, long))); + return QOBJECT(qnum_from_int(va_arg(*ctxt->ap, long))); } else if (!strcmp(token->str, "%lld")) { - return QOBJECT(qnum_from_int(va_arg(*ap, long long))); + return QOBJECT(qnum_from_int(va_arg(*ctxt->ap, long long))); } else if (!strcmp(token->str, "%" PRId64)) { - return QOBJECT(qnum_from_int(va_arg(*ap, int64_t))); + return QOBJECT(qnum_from_int(va_arg(*ctxt->ap, int64_t))); } else if (!strcmp(token->str, "%u")) { - return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned int))); + return QOBJECT(qnum_from_uint(va_arg(*ctxt->ap, unsigned int))); } else if (!strcmp(token->str, "%lu")) { - return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned long))); + return QOBJECT(qnum_from_uint(va_arg(*ctxt->ap, unsigned long))); } else if (!strcmp(token->str, "%llu")) { - return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned long long))); + return QOBJECT(qnum_from_uint(va_arg(*ctxt->ap, unsigned long long= ))); } else if (!strcmp(token->str, "%" PRIu64)) { - return QOBJECT(qnum_from_uint(va_arg(*ap, uint64_t))); + return QOBJECT(qnum_from_uint(va_arg(*ctxt->ap, uint64_t))); } else if (!strcmp(token->str, "%s")) { - return QOBJECT(qstring_from_str(va_arg(*ap, const char *))); + return QOBJECT(qstring_from_str(va_arg(*ctxt->ap, const char *))); } else if (!strcmp(token->str, "%f")) { - return QOBJECT(qnum_from_double(va_arg(*ap, double))); + return QOBJECT(qnum_from_double(va_arg(*ctxt->ap, double))); } parse_error(ctxt, token, "invalid interpolation '%s'", token->str); return NULL; @@ -514,7 +515,7 @@ static QObject *parse_literal(JSONParserContext *ctxt) } } =20 -static QObject *parse_value(JSONParserContext *ctxt, va_list *ap) +static QObject *parse_value(JSONParserContext *ctxt) { JSONToken *token; =20 @@ -526,11 +527,11 @@ static QObject *parse_value(JSONParserContext *ctxt, = va_list *ap) =20 switch (token->type) { case JSON_LCURLY: - return parse_object(ctxt, ap); + return parse_object(ctxt); case JSON_LSQUARE: - return parse_array(ctxt, ap); + return parse_array(ctxt); case JSON_INTERP: - return parse_interpolation(ctxt, ap); + return parse_interpolation(ctxt); case JSON_INTEGER: case JSON_FLOAT: case JSON_STRING: @@ -557,10 +558,10 @@ JSONToken *json_token(JSONTokenType type, int x, int = y, GString *tokstr) =20 QObject *json_parser_parse(GQueue *tokens, va_list *ap, Error **errp) { - JSONParserContext ctxt =3D { .buf =3D tokens }; + JSONParserContext ctxt =3D { .buf =3D tokens, .ap =3D ap }; QObject *result; =20 - result =3D parse_value(&ctxt, ap); + result =3D parse_value(&ctxt); assert(ctxt.err || g_queue_is_empty(ctxt.buf)); =20 error_propagate(errp, ctxt.err); --=20 2.17.1