summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2015-02-24 09:35:12 +0000
committerkrasimir <krasimir@chalmers.se>2015-02-24 09:35:12 +0000
commitda11a7127f5e635a5c38b10d07a6070c88032a56 (patch)
tree4609f83ab82e7ae6eb6a4dec34a415ddc1584079 /src/runtime
parent218c6be0a72f9a562436e8f32b56716fdb054350 (diff)
implemented escape characters when reading/printing an abstract expression with string literals
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/c/pgf/expr.c55
1 files changed, 53 insertions, 2 deletions
diff --git a/src/runtime/c/pgf/expr.c b/src/runtime/c/pgf/expr.c
index 7f0bb9eef..af849817c 100644
--- a/src/runtime/c/pgf/expr.c
+++ b/src/runtime/c/pgf/expr.c
@@ -310,7 +310,33 @@ pgf_expr_parser_token(PgfExprParser* parser)
pgf_expr_parser_getc(parser);
while (parser->ch != '"' && parser->ch != EOF) {
- gu_buf_push(chars, char, parser->ch);
+ 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);
+ }
pgf_expr_parser_getc(parser);
}
@@ -999,7 +1025,32 @@ pgf_print_literal(PgfLiteral lit,
case PGF_LITERAL_STR: {
PgfLiteralStr* lit = ei.data;
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);
break;
}