Introduce llvm::sys::path::home_directory.

This will be used by the line editor library to derive a default path to
the history file.

Differential Revision: http://llvm-reviews.chandlerc.com/D2199

llvm-svn: 200594
This commit is contained in:
Peter Collingbourne 2014-01-31 23:46:06 +00:00
parent dfbed59cc2
commit f7d4101156
4 changed files with 51 additions and 0 deletions

View File

@ -306,6 +306,12 @@ bool is_separator(char value);
/// @param result Holds the resulting path name.
void system_temp_directory(bool erasedOnReboot, SmallVectorImpl<char> &result);
/// @brief Get the user's home directory.
///
/// @param result Holds the resulting path name.
/// @result True if a home directory is set, false otherwise.
bool home_directory(SmallVectorImpl<char> &result);
/// @brief Has root name?
///
/// root_name != ""

View File

@ -797,5 +797,20 @@ error_code openFileForWrite(const Twine &Name, int &ResultFD,
}
} // end namespace fs
namespace path {
bool home_directory(SmallVectorImpl<char> &result) {
if (char *RequestedDir = getenv("HOME")) {
result.clear();
result.append(RequestedDir, RequestedDir + strlen(RequestedDir));
return true;
}
return false;
}
} // end namespace path
} // end namespace sys
} // end namespace llvm

View File

@ -19,6 +19,7 @@
#include "llvm/ADT/STLExtras.h"
#include <fcntl.h>
#include <io.h>
#include <shlobj.h>
#include <sys/stat.h>
#include <sys/types.h>
@ -1063,6 +1064,22 @@ error_code openFileForWrite(const Twine &Name, int &ResultFD,
}
} // end namespace fs
namespace path {
bool home_directory(SmallVectorImpl<char> &result) {
wchar_t Path[MAX_PATH];
if (::SHGetFolderPathW(0, CSIDL_APPDATA | CSIDL_FLAG_CREATE, 0,
SHGFP_TYPE_CURRENT, Path) != S_OK)
return false;
if (UTF16ToUTF8(Path, ::wcslen(Path), result))
return false;
return true;
}
} // end namespace path
namespace windows {
llvm::error_code UTF8ToUTF16(llvm::StringRef utf8,
llvm::SmallVectorImpl<wchar_t> &utf16) {

View File

@ -210,6 +210,19 @@ TEST(Support, AbsolutePathIteratorWin32) {
}
#endif // LLVM_ON_WIN32
TEST(Support, HomeDirectory) {
#ifdef LLVM_ON_UNIX
// This test only makes sense on Unix if $HOME is set.
if (::getenv("HOME")) {
#endif
SmallString<128> HomeDir;
EXPECT_TRUE(path::home_directory(HomeDir));
EXPECT_FALSE(HomeDir.empty());
#ifdef LLVM_ON_UNIX
}
#endif
}
class FileSystemTest : public testing::Test {
protected:
/// Unique temporary directory in which all created filesystem entities must