aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2018-08-23 18:39:47 +0200
committerMarkus Armbruster <armbru@redhat.com>2018-08-24 20:26:37 +0200
commit00ea57fadcb899b7e21079dacb47b6fb8af5b2fa (patch)
tree625d0703969b40598d4fbe5c66a2b80f6f3ea143
parenteddc0a7f0ad84edd0f8dd27d4a70a305ccd7bc5f (diff)
json: Tighten and simplify qstring_from_escaped_str()'s loop
Simplify loop control, and assert that the string ends with the appropriate quote (the lexer ensures it does). Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20180823164025.12553-21-armbru@redhat.com>
-rw-r--r--qobject/json-parser.c30
1 files changed, 7 insertions, 23 deletions
diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index a5aa790d62..164b86769b 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -132,65 +132,49 @@ static QString *qstring_from_escaped_str(JSONParserContext *ctxt,
{
const char *ptr = token->str;
QString *str;
- int double_quote = 1;
-
- if (*ptr == '"') {
- double_quote = 1;
- } else {
- double_quote = 0;
- }
- ptr++;
+ char quote;
+ assert(*ptr == '"' || *ptr == '\'');
+ quote = *ptr++;
str = qstring_new();
- while (*ptr &&
- ((double_quote && *ptr != '"') || (!double_quote && *ptr != '\''))) {
+
+ while (*ptr != quote) {
+ assert(*ptr);
if (*ptr == '\\') {
ptr++;
-
- switch (*ptr) {
+ switch (*ptr++) {
case '"':
qstring_append(str, "\"");
- ptr++;
break;
case '\'':
qstring_append(str, "'");
- ptr++;
break;
case '\\':
qstring_append(str, "\\");
- ptr++;
break;
case '/':
qstring_append(str, "/");
- ptr++;
break;
case 'b':
qstring_append(str, "\b");
- ptr++;
break;
case 'f':
qstring_append(str, "\f");
- ptr++;
break;
case 'n':
qstring_append(str, "\n");
- ptr++;
break;
case 'r':
qstring_append(str, "\r");
- ptr++;
break;
case 't':
qstring_append(str, "\t");
- ptr++;
break;
case 'u': {
uint16_t unicode_char = 0;
char utf8_char[4];
int i = 0;
- ptr++;
-
for (i = 0; i < 4; i++) {
if (qemu_isxdigit(*ptr)) {
unicode_char |= hex2decimal(*ptr) << ((3 - i) * 4);