summaryrefslogtreecommitdiff
path: root/libiberty/d-demangle.c
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2015-05-16 16:49:13 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2015-05-16 16:49:13 +0000
commiteb058b7de655251d88eee5ecce38de008e6eb90d (patch)
tree2aadcfa7449377fd2e912afa75bda2f3226800cf /libiberty/d-demangle.c
parent886faf50c7a91d8425314332974b3535c111faa0 (diff)
d-demangle.c (dlang_parse_string): Represent embedded whitespace or non-printable characters as hex or escape...
libiberty/ChangeLog: 2015-05-16 Iain Buclaw <ibuclaw@gdcproject.org> * d-demangle.c (dlang_parse_string): Represent embedded whitespace or non-printable characters as hex or escape sequences. * testsuite/d-demangle-expected: Add test for templates with tabs and newlines embedded into the signature. From-SVN: r223240
Diffstat (limited to 'libiberty/d-demangle.c')
-rw-r--r--libiberty/d-demangle.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
index bb481c0998e..10585214a9f 100644
--- a/libiberty/d-demangle.c
+++ b/libiberty/d-demangle.c
@@ -1,5 +1,5 @@
/* Demangler for the D programming language
- Copyright 2014 Free Software Foundation, Inc.
+ Copyright 2014, 2015 Free Software Foundation, Inc.
Written by Iain Buclaw (ibuclaw@gdcproject.org)
This file is part of the libiberty library.
@@ -931,7 +931,38 @@ dlang_parse_string (string *decl, const char *mangled)
char a = ascii2hex (mangled[0]);
char b = ascii2hex (mangled[1]);
char val = (a << 4) | b;
- string_appendn (decl, &val, 1);
+
+ /* Sanitize white and non-printable characters. */
+ switch (val)
+ {
+ case ' ':
+ string_append (decl, " ");
+ break;
+ case '\t':
+ string_append (decl, "\\t");
+ break;
+ case '\n':
+ string_append (decl, "\\n");
+ break;
+ case '\r':
+ string_append (decl, "\\r");
+ break;
+ case '\f':
+ string_append (decl, "\\f");
+ break;
+ case '\v':
+ string_append (decl, "\\v");
+ break;
+
+ default:
+ if (ISPRINT (val))
+ string_appendn (decl, &val, 1);
+ else
+ {
+ string_append (decl, "\\x");
+ string_appendn (decl, mangled, 2);
+ }
+ }
}
else
return NULL;