Move twice-repeated clang path operation into a new function.

And make it more robust in the edge case of exactly "./" as input.

llvm-svn: 246711
This commit is contained in:
Douglas Katzman 2015-09-02 21:02:10 +00:00
parent 9550590711
commit a26be4a946
3 changed files with 26 additions and 2 deletions

View File

@ -401,6 +401,12 @@ bool is_absolute(const Twine &path);
/// @result True if the path is relative, false if it is not.
bool is_relative(const Twine &path);
/// @brief Remove redundant leading "./" pieces and consecutive separators.
///
/// @param path Input path.
/// @result The cleaned-up \a path.
StringRef remove_leading_dotslash(StringRef path);
} // end namespace path
} // end namespace sys
} // end namespace llvm

View File

@ -661,8 +661,16 @@ bool is_absolute(const Twine &path) {
return rootDir && rootName;
}
bool is_relative(const Twine &path) {
return !is_absolute(path);
bool is_relative(const Twine &path) { return !is_absolute(path); }
StringRef remove_leading_dotslash(StringRef Path) {
// Remove leading "./" (or ".//" or "././" etc.)
while (Path.size() > 2 && Path[0] == '.' && is_separator(Path[1])) {
Path = Path.substr(2);
while (Path.size() > 0 && is_separator(Path[0]))
Path = Path.substr(1);
}
return Path;
}
} // end namespace path

View File

@ -789,4 +789,14 @@ TEST(Support, NormalizePath) {
#undef EXPECT_PATH_IS
}
TEST(Support, RemoveLeadingDotSlash) {
StringRef Path1("././/foolz/wat");
StringRef Path2("./////");
Path1 = path::remove_leading_dotslash(Path1);
EXPECT_EQ(Path1, "foolz/wat");
Path2 = path::remove_leading_dotslash(Path2);
EXPECT_EQ(Path2, "");
}
} // anonymous namespace