diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-11-29 22:27:12 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-11-29 22:27:12 +0000 |
commit | fe96ee030743139063a8ba8eae5484a23e8d8dd3 (patch) | |
tree | ea5a0cf03e276dc9a0b881dd8fc36badd44c1920 /clang/lib/Lex/ModuleMap.cpp | |
parent | 0712f46f4f59abc4d5fb8629d8495f4d5b707600 (diff) | |
download | bcm5719-llvm-fe96ee030743139063a8ba8eae5484a23e8d8dd3.tar.gz bcm5719-llvm-fe96ee030743139063a8ba8eae5484a23e8d8dd3.zip |
Escape strings when printing module maps, for silly operating systems
that use \ as a separator.
llvm-svn: 145439
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 60c797c362a..984c7985e09 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -72,6 +72,31 @@ static void indent(llvm::raw_ostream &OS, unsigned Spaces) { OS << std::string(Spaces, ' '); } +static void printEscapedString(llvm::raw_ostream &OS, StringRef String) { + for (StringRef::iterator I = String.begin(), E = String.end(); I != E; ++I) { + unsigned char Char = *I; + + switch (Char) { + default: + if (isprint(Char)) + OS << (char)Char; + else // Output anything hard as an octal escape. + OS << '\\' + << (char)('0'+ ((Char >> 6) & 7)) + << (char)('0'+ ((Char >> 3) & 7)) + << (char)('0'+ ((Char >> 0) & 7)); + break; + // Handle some common non-printable cases to make dumps prettier. + case '\\': OS << "\\\\"; break; + case '"': OS << "\\\""; break; + case '\n': OS << "\\n"; break; + case '\t': OS << "\\t"; break; + case '\a': OS << "\\a"; break; + case '\b': OS << "\\b"; break; + } + } +} + void ModuleMap::Module::print(llvm::raw_ostream &OS, unsigned Indent) const { indent(OS, Indent); if (IsFramework) @@ -82,12 +107,16 @@ void ModuleMap::Module::print(llvm::raw_ostream &OS, unsigned Indent) const { if (UmbrellaHeader) { indent(OS, Indent + 2); - OS << "umbrella \"" << UmbrellaHeader->getName() << "\"\n"; + OS << "umbrella \""; + printEscapedString(OS, UmbrellaHeader->getName()); + OS << "\"\n"; } for (unsigned I = 0, N = Headers.size(); I != N; ++I) { indent(OS, Indent + 2); - OS << "header \"" << Headers[I]->getName() << "\"\n"; + OS << "header \""; + printEscapedString(OS, Headers[I]->getName()); + OS << "\"\n"; } for (llvm::StringMap<Module *>::const_iterator MI = SubModules.begin(), |