forked from GitHub/gf-core
implemented escape characters when reading/printing an abstract expression with string literals
This commit is contained in:
@@ -310,7 +310,33 @@ pgf_expr_parser_token(PgfExprParser* parser)
|
|||||||
pgf_expr_parser_getc(parser);
|
pgf_expr_parser_getc(parser);
|
||||||
|
|
||||||
while (parser->ch != '"' && parser->ch != EOF) {
|
while (parser->ch != '"' && parser->ch != EOF) {
|
||||||
|
if (parser->ch == '\\') {
|
||||||
|
pgf_expr_parser_getc(parser);
|
||||||
|
switch (parser->ch) {
|
||||||
|
case '\\':
|
||||||
|
gu_buf_push(chars, char, '\\');
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
gu_buf_push(chars, char, '\"');
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
gu_buf_push(chars, char, '\n');
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
gu_buf_push(chars, char, '\r');
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
gu_buf_push(chars, char, '\b');
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
gu_buf_push(chars, char, '\t');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
gu_buf_push(chars, char, parser->ch);
|
gu_buf_push(chars, char, parser->ch);
|
||||||
|
}
|
||||||
pgf_expr_parser_getc(parser);
|
pgf_expr_parser_getc(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -999,7 +1025,32 @@ pgf_print_literal(PgfLiteral lit,
|
|||||||
case PGF_LITERAL_STR: {
|
case PGF_LITERAL_STR: {
|
||||||
PgfLiteralStr* lit = ei.data;
|
PgfLiteralStr* lit = ei.data;
|
||||||
gu_putc('"', out, err);
|
gu_putc('"', out, err);
|
||||||
gu_string_write(lit->val, out, err);
|
const uint8_t* s = (uint8_t*) lit->val;
|
||||||
|
while (*s) {
|
||||||
|
GuUCS c = gu_utf8_decode(&s);
|
||||||
|
switch (c) {
|
||||||
|
case '\\':
|
||||||
|
gu_puts("\\\\", out, err);
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
gu_puts("\\\"", out, err);
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
gu_puts("\\n", out, err);
|
||||||
|
break;
|
||||||
|
case '\r':
|
||||||
|
gu_puts("\\r", out, err);
|
||||||
|
break;
|
||||||
|
case '\b':
|
||||||
|
gu_puts("\\b", out, err);
|
||||||
|
break;
|
||||||
|
case '\t':
|
||||||
|
gu_puts("\\t", out, err);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
gu_out_utf8(c, out, err);
|
||||||
|
}
|
||||||
|
}
|
||||||
gu_putc('"', out, err);
|
gu_putc('"', out, err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user