summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qobject/json-lexer.c44
-rw-r--r--qobject/json-parser.c1
-rw-r--r--tests/check-qjson.c3
3 files changed, 9 insertions, 39 deletions
diff --git a/qobject/json-lexer.c b/qobject/json-lexer.c
index 7c31c2c8ff..f1a4b5a430 100644
--- a/qobject/json-lexer.c
+++ b/qobject/json-lexer.c
@@ -93,7 +93,8 @@
* (apostrophe) instead of %x22 (quotation mark), and can't contain
* unescaped apostrophe, but can contain unescaped quotation mark.
* - Interpolation, if enabled:
- * interpolation = %((l|ll|I64)[du]|[ipsf])
+ * The lexer accepts %[A-Za-z0-9]*, and leaves rejecting invalid
+ * ones to the parser.
*
* Note:
* - Input must be encoded in modified UTF-8.
@@ -116,11 +117,6 @@ enum json_lexer_state {
IN_NEG_NONZERO_NUMBER,
IN_KEYWORD,
IN_INTERP,
- IN_INTERP_L,
- IN_INTERP_LL,
- IN_INTERP_I,
- IN_INTERP_I6,
- IN_INTERP_I64,
IN_WHITESPACE,
IN_START,
IN_START_INTERP, /* must be IN_START + 1 */
@@ -224,39 +220,11 @@ static const uint8_t json_lexer[][256] = {
},
/* interpolation */
- [IN_INTERP_LL] = {
- ['d'] = JSON_INTERP,
- ['u'] = JSON_INTERP,
- },
-
- [IN_INTERP_L] = {
- ['d'] = JSON_INTERP,
- ['l'] = IN_INTERP_LL,
- ['u'] = JSON_INTERP,
- },
-
- [IN_INTERP_I64] = {
- ['d'] = JSON_INTERP,
- ['u'] = JSON_INTERP,
- },
-
- [IN_INTERP_I6] = {
- ['4'] = IN_INTERP_I64,
- },
-
- [IN_INTERP_I] = {
- ['6'] = IN_INTERP_I6,
- },
-
[IN_INTERP] = {
- ['d'] = JSON_INTERP,
- ['i'] = JSON_INTERP,
- ['p'] = JSON_INTERP,
- ['s'] = JSON_INTERP,
- ['u'] = JSON_INTERP,
- ['f'] = JSON_INTERP,
- ['l'] = IN_INTERP_L,
- ['I'] = IN_INTERP_I,
+ TERMINAL(JSON_INTERP),
+ ['A' ... 'Z'] = IN_INTERP,
+ ['a' ... 'z'] = IN_INTERP,
+ ['0' ... '9'] = IN_INTERP,
},
/*
diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index 2855eaaeca..e61cee9e8a 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -453,6 +453,7 @@ static QObject *parse_interpolation(JSONParserContext *ctxt, va_list *ap)
} else if (!strcmp(token->str, "%f")) {
return QOBJECT(qnum_from_double(va_arg(*ap, double)));
}
+ parse_error(ctxt, token, "invalid interpolation '%s'", token->str);
return NULL;
}
diff --git a/tests/check-qjson.c b/tests/check-qjson.c
index d6fda0786f..83f8a0e6e3 100644
--- a/tests/check-qjson.c
+++ b/tests/check-qjson.c
@@ -1021,7 +1021,8 @@ static void interpolation_unknown(void)
}
g_test_trap_subprocess(NULL, 0, 0);
g_test_trap_assert_failed();
- g_test_trap_assert_stderr("*Unexpected error*stray '%x'*");
+ g_test_trap_assert_stderr("*Unexpected error*"
+ "invalid interpolation '%x'*");
}
static void interpolation_string(void)