From: Pierre-Emmanuel Patry Date: Mon, 10 Jul 2023 11:47:37 +0000 (+0200) Subject: gccrs: dump: Output escaped character values X-Git-Tag: basepoints/gcc-15~2356 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0830ce0813e8fcac793b210ce2715712b109ce2c;p=thirdparty%2Fgcc.git gccrs: dump: Output escaped character values Output escaped character values instead of their raw values in string. gcc/rust/ChangeLog: * lex/rust-token.cc (escape_special_chars): Add a function that escape a given string. (Token::as_string): Add call to escape function for string/char representations. Signed-off-by: Pierre-Emmanuel Patry --- diff --git a/gcc/rust/lex/rust-token.cc b/gcc/rust/lex/rust-token.cc index 56177d3d3d38..1dacd167d985 100644 --- a/gcc/rust/lex/rust-token.cc +++ b/gcc/rust/lex/rust-token.cc @@ -16,6 +16,7 @@ // along with GCC; see the file COPYING3. If not see // . +#include "rust-system.h" #include "rust-token.h" #include "rust-diagnostics.h" @@ -172,6 +173,41 @@ Token::get_str () const return *str; } +namespace { +enum class Context +{ + String, + Char +}; + +const std::map matches = { + {'\t', "\\t"}, {'\n', "\\n"}, {'\r', "\\r"}, + {'\0', "\\0"}, {'\\', "\\\\"}, {'\v', "\\v"}, +}; + +std::string +escape_special_chars (const std::string &source, Context ctx) +{ + std::stringstream stream; + decltype (matches)::const_iterator result; + for (char c : source) + { + // FIXME: #2411 Also replace escaped unicode values and \x digits + if ((result = matches.find (c)) != matches.end ()) + stream << result->second; + else if (c == '\'' && ctx == Context::Char) + stream << "\\'"; + else if (c == '"' && ctx == Context::String) + stream << "\\\""; + else + stream << c; + } + + return stream.str (); +} + +} // namespace + std::string Token::as_string () const { @@ -180,13 +216,15 @@ Token::as_string () const switch (get_id ()) { case STRING_LITERAL: - return "\"" + get_str () + "\""; + return "\"" + escape_special_chars (get_str (), Context::String) + + "\""; case BYTE_STRING_LITERAL: - return "b\"" + get_str () + "\""; + return "b\"" + escape_special_chars (get_str (), Context::String) + + "\""; case CHAR_LITERAL: - return "'" + get_str () + "'"; + return "'" + escape_special_chars (get_str (), Context::Char) + "'"; case BYTE_CHAR_LITERAL: - return "b'" + get_str () + "'"; + return "b'" + escape_special_chars (get_str (), Context::Char) + "'"; case LIFETIME: return "'" + get_str (); case INT_LITERAL: