mirror of https://github.com/xemu-project/xemu.git
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:
parent
eddc0a7f0a
commit
00ea57fadc
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue