1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Moving FileManager::removeDotPaths to llvm::sys::path::remove_dots

Differential Revision: http://reviews.llvm.org/D14393

llvm-svn: 252499
This commit is contained in:
Mike Aizatsky 2015-11-09 18:56:31 +00:00
parent 0d3a676058
commit e7f6232199
3 changed files with 62 additions and 0 deletions

View File

@ -423,6 +423,13 @@ bool is_relative(const Twine &path);
/// @result The cleaned-up \a path.
StringRef remove_leading_dotslash(StringRef path);
/// @brief In-place remove any './' and optionally '../' components from a path.
///
/// @param path processed path
/// @param remove_dot_dot specify if '../' should be removed
/// @result True if path was changed
bool remove_dots(SmallVectorImpl<char> &path, bool remove_dot_dot = false);
} // end namespace path
} // end namespace sys
} // end namespace llvm

View File

@ -671,6 +671,41 @@ StringRef remove_leading_dotslash(StringRef Path) {
return Path;
}
static SmallString<256> remove_dots(StringRef path, bool remove_dot_dot) {
SmallVector<StringRef, 16> components;
// Skip the root path, then look for traversal in the components.
StringRef rel = path::relative_path(path);
for (StringRef C : llvm::make_range(path::begin(rel), path::end(rel))) {
if (C == ".")
continue;
if (remove_dot_dot) {
if (C == "..") {
if (!components.empty())
components.pop_back();
continue;
}
}
components.push_back(C);
}
SmallString<256> buffer = path::root_path(path);
for (StringRef C : components)
path::append(buffer, C);
return buffer;
}
bool remove_dots(SmallVectorImpl<char> &path, bool remove_dot_dot) {
StringRef p(path.data(), path.size());
SmallString<256> result = remove_dots(p, remove_dot_dot);
if (result == path)
return false;
path.swap(result);
return true;
}
} // end namespace path
namespace fs {

View File

@ -844,4 +844,24 @@ TEST(Support, RemoveLeadingDotSlash) {
Path2 = path::remove_leading_dotslash(Path2);
EXPECT_EQ(Path2, "");
}
static std::string remove_dots(StringRef path,
bool remove_dot_dot) {
SmallString<256> buffer(path);
path::remove_dots(buffer, remove_dot_dot);
return buffer.str();
}
TEST(Support, RemoveDots) {
EXPECT_EQ("foolz/wat", remove_dots("././/foolz/wat", false));
EXPECT_EQ("", remove_dots("./////", false));
EXPECT_EQ("a/../b/c", remove_dots("./a/../b/c", false));
EXPECT_EQ("b/c", remove_dots("./a/../b/c", true));
EXPECT_EQ("c", remove_dots("././c", true));
SmallString<64> Path1("././c");
EXPECT_TRUE(path::remove_dots(Path1, true));
EXPECT_EQ("c", Path1);
}
} // anonymous namespace