From: Markus Armbruster Date: Thu, 23 Aug 2018 16:40:24 +0000 (+0200) Subject: json: Support %% in JSON strings when interpolating X-Git-Tag: v3.1.0-rc0~112^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8bca4613;p=thirdparty%2Fqemu.git json: Support %% in JSON strings when interpolating The previous commit makes JSON strings containing '%' awkward to express in templates: you'd have to mask the '%' with an Unicode escape \u0025. No template currently contains such JSON strings. Support the printf conversion specification %% in JSON strings as a convenience anyway, because it's trivially easy to do. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Message-Id: <20180823164025.12553-58-armbru@redhat.com> --- diff --git a/qobject/json-parser.c b/qobject/json-parser.c index 63e9229f1ce..3318b8dad04 100644 --- a/qobject/json-parser.c +++ b/qobject/json-parser.c @@ -208,10 +208,11 @@ static QString *parse_string(JSONParserContext *ctxt, JSONToken *token) } break; case '%': - if (ctxt->ap) { + if (ctxt->ap && ptr[1] != '%') { parse_error(ctxt, token, "can't interpolate into string"); goto out; } + ptr++; /* fall through */ default: cp = mod_utf8_codepoint(ptr, 6, &end); diff --git a/tests/check-qjson.c b/tests/check-qjson.c index a1854573de9..cc13f3d41e0 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -1270,7 +1270,7 @@ static void simple_interpolation(void) QObject *obj; QLitObject decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(1), - QLIT_QNUM(2), + QLIT_QSTR("100%"), QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(32), QLIT_QNUM(42), @@ -1280,7 +1280,7 @@ static void simple_interpolation(void) embedded_obj = qobject_from_json("[32, 42]", &error_abort); g_assert(embedded_obj != NULL); - obj = qobject_from_jsonf_nofail("[%d, 2, %p]", 1, embedded_obj); + obj = qobject_from_jsonf_nofail("[%d, '100%%', %p]", 1, embedded_obj); g_assert(qlit_equal_qobject(&decoded, obj)); qobject_unref(obj);