Index: tools/gn/visual_studio_writer.cc |
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc |
index 8a8cf528fc15c5ae99b1081a62b187f3c03d5ae7..f8021753247b7adcda50809e0f03fe682792cf38 100644 |
--- a/tools/gn/visual_studio_writer.cc |
+++ b/tools/gn/visual_studio_writer.cc |
@@ -37,9 +37,32 @@ |
namespace { |
+std::string EscapeString(const std::string& value) { |
+ std::string result; |
+ if (value.find_first_of("<>&\"\t\r\n") != std::string::npos) { |
brettw
2017/04/07 18:16:43
I'd delete this check and always do the loop below
kylix_rd
2017/04/07 19:18:53
Done.
|
+ for (std::string::const_iterator it = value.cbegin(); |
brettw
2017/04/07 18:16:43
I would have used a range-based for loop here whic
kylix_rd
2017/04/07 19:18:53
Yes, that's better.
Done.
|
+ it != value.cend(); |
+ ++it) { |
+ switch (*it) { |
+ case '\n': result += " "; break; |
brucedawson
2017/04/05 18:51:39
Do you have references for the \n, \r, and \t sequ
kylix_rd
2017/04/05 18:55:02
I based it off the code in libxml here: https://cs
|
+ case '\r': result += " "; break; |
+ case '\t': result += "	"; break; |
+ case '"': result += """; break; |
+ case '<': result += "<"; break; |
+ case '>': result += ">"; break; |
+ case '&': result += "&"; break; |
+ default: |
+ result += *it; |
+ } |
+ } |
+ } else |
brettw
2017/04/07 18:16:43
Google style says all arms in an if statement shou
|
+ result = value; |
+ return result; |
+} |
+ |
struct SemicolonSeparatedWriter { |
void operator()(const std::string& value, std::ostream& out) const { |
- out << value + ';'; |
+ out << EscapeString(value) + ';'; |
} |
}; |