mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Process tilde in llvm::sys::path::native
Windows does not treat `~` as a reference to home directory, so the call to `llvm::sys::path::native` on, say, `~/somedir` produces `~\somedir`, which has different meaning than the original path. With this change tilde is expanded on Windows to user profile directory. Such behavior keeps original meaning of the path and is consistent with the algorithm of `llvm::sys::path::home_directory`. Differential Revision: https://reviews.llvm.org/D27527 llvm-svn: 296590
This commit is contained in:
parent
0fd5f7641d
commit
650342e8ee
@ -556,8 +556,16 @@ void native(const Twine &path, SmallVectorImpl<char> &result) {
|
||||
}
|
||||
|
||||
void native(SmallVectorImpl<char> &Path) {
|
||||
if (Path.empty())
|
||||
return;
|
||||
#ifdef LLVM_ON_WIN32
|
||||
std::replace(Path.begin(), Path.end(), '/', '\\');
|
||||
if (Path[0] == '~' && (Path.size() == 1 || is_separator(Path[1]))) {
|
||||
SmallString<128> PathHome;
|
||||
home_directory(PathHome);
|
||||
PathHome.append(Path.begin() + 1, Path.end());
|
||||
Path = PathHome;
|
||||
}
|
||||
#else
|
||||
for (auto PI = Path.begin(), PE = Path.end(); PI < PE; ++PI) {
|
||||
if (*PI == '\\') {
|
||||
|
@ -968,6 +968,33 @@ TEST(Support, NormalizePath) {
|
||||
EXPECT_PATH_IS(Path6, "a\\", "a/");
|
||||
|
||||
#undef EXPECT_PATH_IS
|
||||
|
||||
#if defined(LLVM_ON_WIN32)
|
||||
SmallString<64> PathHome;
|
||||
path::home_directory(PathHome);
|
||||
|
||||
const char *Path7a = "~/aaa";
|
||||
SmallString<64> Path7(Path7a);
|
||||
path::native(Path7);
|
||||
EXPECT_TRUE(Path7.endswith("\\aaa"));
|
||||
EXPECT_TRUE(Path7.startswith(PathHome));
|
||||
EXPECT_EQ(Path7.size(), PathHome.size() + strlen(Path7a + 1));
|
||||
|
||||
const char *Path8a = "~";
|
||||
SmallString<64> Path8(Path8a);
|
||||
path::native(Path8);
|
||||
EXPECT_EQ(Path8, PathHome);
|
||||
|
||||
const char *Path9a = "~aaa";
|
||||
SmallString<64> Path9(Path9a);
|
||||
path::native(Path9);
|
||||
EXPECT_EQ(Path9, "~aaa");
|
||||
|
||||
const char *Path10a = "aaa/~/b";
|
||||
SmallString<64> Path10(Path10a);
|
||||
path::native(Path10);
|
||||
EXPECT_EQ(Path10, "aaa\\~\\b");
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST(Support, RemoveLeadingDotSlash) {
|
||||
|
Loading…
Reference in New Issue
Block a user