From b70ecf6eefb7a85892c760f72d493e9717a5dedd Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 26 Feb 2015 19:31:10 +0000 Subject: Fixed canonical path function. llvm-svn: 230665 --- clang-tools-extra/modularize/ModularizeUtilities.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'clang-tools-extra/modularize/ModularizeUtilities.cpp') diff --git a/clang-tools-extra/modularize/ModularizeUtilities.cpp b/clang-tools-extra/modularize/ModularizeUtilities.cpp index 60388006187..50dd8b1f258 100644 --- a/clang-tools-extra/modularize/ModularizeUtilities.cpp +++ b/clang-tools-extra/modularize/ModularizeUtilities.cpp @@ -341,13 +341,31 @@ bool ModularizeUtilities::collectUmbrellaHeaders(StringRef UmbrellaDirName, } return true; } + +std::string normalize(StringRef Path) { + SmallString<128> Buffer; + llvm::sys::path::const_iterator B = llvm::sys::path::begin(Path), + E = llvm::sys::path::end(Path); + while (B != E) { + if (B->compare(".") == 0) { + } + else if (B->compare("..") == 0) + llvm::sys::path::remove_filename(Buffer); + else + llvm::sys::path::append(Buffer, *B); + ++B; + } + if (Path.endswith("/") || Path.endswith("\\")) + Buffer.append(1, Path.back()); + return Buffer.c_str(); +} // Convert header path to canonical form. // The canonical form is basically just use forward slashes, and remove "./". // \param FilePath The file path, relative to the module map directory. // \returns The file path in canonical form. std::string ModularizeUtilities::getCanonicalPath(StringRef FilePath) { - std::string Tmp(FilePath); + std::string Tmp(normalize(FilePath)); std::replace(Tmp.begin(), Tmp.end(), '\\', '/'); StringRef Tmp2(Tmp); if (Tmp2.startswith("./")) -- cgit v1.2.3