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:
parent
0d3a676058
commit
e7f6232199
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user