From 3d7575d7e2e8bdb6603f6754dfa86aacf1a4bbf3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 2 Sep 2015 21:02:10 +0000 Subject: [PATCH] Move twice-repeated clang path operation into a new function. And make it more robust in the edge case of exactly "./" as input. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246711 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/Path.h | 6 ++++++ lib/Support/Path.cpp | 12 ++++++++++-- unittests/Support/Path.cpp | 10 ++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/llvm/Support/Path.h b/include/llvm/Support/Path.h index 6fedb93d237..0853f916b58 100644 --- a/include/llvm/Support/Path.h +++ b/include/llvm/Support/Path.h @@ -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 diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp index 54daf24daba..aa96074554e 100644 --- a/lib/Support/Path.cpp +++ b/lib/Support/Path.cpp @@ -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 diff --git a/unittests/Support/Path.cpp b/unittests/Support/Path.cpp index 11d53c83419..cfba227dbe9 100644 --- a/unittests/Support/Path.cpp +++ b/unittests/Support/Path.cpp @@ -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 -- 2.34.1