diff options
author | John Hodge <tpg@mutabah.net> | 2016-03-26 08:29:26 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-03-26 08:29:26 +0800 |
commit | 210b1a17340e3ed3a8da9c29588f5a0db0d5e435 (patch) | |
tree | 892fe76050862cdc37ae80400d91fa91f29b8aab /src | |
parent | e9a844be4715db43ef4930eb0cbabd5e6219469f (diff) | |
download | mrust-210b1a17340e3ed3a8da9c29588f5a0db0d5e435.tar.gz |
Parse - Escape strings when debuging
Diffstat (limited to 'src')
-rw-r--r-- | src/expand/mod.cpp | 5 | ||||
-rw-r--r-- | src/parse/lex.cpp | 40 |
2 files changed, 39 insertions, 6 deletions
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 49fbad89..1fdf56c1 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -241,7 +241,6 @@ struct CExpandExpr: if( n_mac->m_name == "" ) cnode.reset(); } - DEBUG("replacement = " << replacement.get()); if( this->replacement ) { cnode = mv$(this->replacement); } @@ -277,7 +276,7 @@ struct CExpandExpr: void visit(::AST::ExprNode_Macro& node) override { - TRACE_FUNCTION_F("name = " << node.m_name); + TRACE_FUNCTION_F("ExprNode_Macro - name = " << node.m_name); auto& mod = this->cur_mod(); auto ttl = Expand_Macro( is_early, crate, modstack, mod, @@ -297,7 +296,7 @@ struct CExpandExpr: // And schedule it to replace the previous replacement = mv$(newexpr); } - DEBUG("replacement = " << replacement.get()); + DEBUG("ExprNode_Macro - replacement = " << replacement.get()); node.m_name = ""; } } diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp index 0e928bf2..0ed05123 100644 --- a/src/parse/lex.cpp +++ b/src/parse/lex.cpp @@ -976,6 +976,40 @@ enum eTokenType Token::typefromstr(const ::std::string& s) return TOK_NULL; } +struct EscapedString { + const ::std::string& s; + EscapedString(const ::std::string& s): s(s) {} + + friend ::std::ostream& operator<<(::std::ostream& os, const EscapedString& x) { + for(auto b : x.s) { + if( b < 0 || b >= 128 ) { + os << b; + } + else { + switch(b) + { + case '"': + os << "\\\""; + break; + case '\\': + os << "\\\\"; + break; + case '\n': + os << "\\n"; + break; + default: + if( ' ' <= b && b < 0x7F ) + os << b; + else + os << "\\u{" << ::std::hex << (unsigned int)b << "}"; + break; + } + } + } + return os; + } +}; + ::std::string Token::to_str() const { switch(m_type) @@ -993,8 +1027,8 @@ enum eTokenType Token::typefromstr(const ::std::string& s) case TOK_INTEGER: return FMT(m_intval); // TODO: suffix for type case TOK_CHAR: return FMT("'\\u{"<< ::std::hex << m_intval << "}"); case TOK_FLOAT: return FMT(m_floatval); - case TOK_STRING: return "\"" + m_str + "\""; - case TOK_BYTESTRING:return "b\"" + m_str + "\""; + case TOK_STRING: return FMT("\"" << EscapedString(m_str) << "\""); + case TOK_BYTESTRING:return FMT("b\"" << m_str << "\""); case TOK_CATTR_OPEN:return "#!["; case TOK_ATTR_OPEN: return "#["; case TOK_UNDERSCORE:return "_"; @@ -1146,7 +1180,7 @@ SERIALISE_TYPE_S(Token, { case TOK_IDENT: case TOK_MACRO: case TOK_LIFETIME: - os << "\"" << tok.str() << "\""; + os << "\"" << EscapedString(tok.str()) << "\""; break; case TOK_INTEGER: os << ":" << tok.intval(); |