diff options
| author | krasimir <krasimir@chalmers.se> | 2015-02-24 09:35:12 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2015-02-24 09:35:12 +0000 |
| commit | da11a7127f5e635a5c38b10d07a6070c88032a56 (patch) | |
| tree | 4609f83ab82e7ae6eb6a4dec34a415ddc1584079 /src/runtime | |
| parent | 218c6be0a72f9a562436e8f32b56716fdb054350 (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.c | 55 |
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; } |
