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>
This commit is contained in:
Markus Armbruster 2018-08-23 18:39:47 +02:00
parent eddc0a7f0a
commit 00ea57fadc
1 changed files with 7 additions and 23 deletions

View File

@ -132,65 +132,49 @@ static QString *qstring_from_escaped_str(JSONParserContext *ctxt,
{ {
const char *ptr = token->str; const char *ptr = token->str;
QString *str; QString *str;
int double_quote = 1; char quote;
if (*ptr == '"') {
double_quote = 1;
} else {
double_quote = 0;
}
ptr++;
assert(*ptr == '"' || *ptr == '\'');
quote = *ptr++;
str = qstring_new(); str = qstring_new();
while (*ptr &&
((double_quote && *ptr != '"') || (!double_quote && *ptr != '\''))) { while (*ptr != quote) {
assert(*ptr);
if (*ptr == '\\') { if (*ptr == '\\') {
ptr++; ptr++;
switch (*ptr++) {
switch (*ptr) {
case '"': case '"':
qstring_append(str, "\""); qstring_append(str, "\"");
ptr++;
break; break;
case '\'': case '\'':
qstring_append(str, "'"); qstring_append(str, "'");
ptr++;
break; break;
case '\\': case '\\':
qstring_append(str, "\\"); qstring_append(str, "\\");
ptr++;
break; break;
case '/': case '/':
qstring_append(str, "/"); qstring_append(str, "/");
ptr++;
break; break;
case 'b': case 'b':
qstring_append(str, "\b"); qstring_append(str, "\b");
ptr++;
break; break;
case 'f': case 'f':
qstring_append(str, "\f"); qstring_append(str, "\f");
ptr++;
break; break;
case 'n': case 'n':
qstring_append(str, "\n"); qstring_append(str, "\n");
ptr++;
break; break;
case 'r': case 'r':
qstring_append(str, "\r"); qstring_append(str, "\r");
ptr++;
break; break;
case 't': case 't':
qstring_append(str, "\t"); qstring_append(str, "\t");
ptr++;
break; break;
case 'u': { case 'u': {
uint16_t unicode_char = 0; uint16_t unicode_char = 0;
char utf8_char[4]; char utf8_char[4];
int i = 0; int i = 0;
ptr++;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (qemu_isxdigit(*ptr)) { if (qemu_isxdigit(*ptr)) {
unicode_char |= hex2decimal(*ptr) << ((3 - i) * 4); unicode_char |= hex2decimal(*ptr) << ((3 - i) * 4);