diff options
Diffstat (limited to 'lib/Support/Windows/Path.inc')
-rw-r--r-- | lib/Support/Windows/Path.inc | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/lib/Support/Windows/Path.inc b/lib/Support/Windows/Path.inc index 42a92f9..d8dc522 100644 --- a/lib/Support/Windows/Path.inc +++ b/lib/Support/Windows/Path.inc @@ -66,29 +66,20 @@ Path::operator=(StringRef that) { return *this; } -// push_back 0 on create, and pop_back on delete. -struct ScopedNullTerminator { - std::string &str; - ScopedNullTerminator(std::string &s) : str(s) { str.push_back(0); } - ~ScopedNullTerminator() { - // str.pop_back(); But wait, C++03 doesn't have this... - assert(!str.empty() && str[str.size() - 1] == 0 - && "Null char not present!"); - str.resize(str.size() - 1); - } -}; - bool Path::isValid() const { if (path.empty()) return false; + size_t len = path.size(); + // If there is a null character, it and all its successors are ignored. + size_t pos = path.find_first_of('\0'); + if (pos != std::string::npos) + len = pos; + // If there is a colon, it must be the second character, preceded by a letter // and followed by something. - size_t len = path.size(); - // This code assumes that path is null terminated, so make sure it is. - ScopedNullTerminator snt(path); - size_t pos = path.rfind(':',len); + pos = path.rfind(':',len); size_t rootslash = 0; if (pos != std::string::npos) { if (pos != 1 || !isalpha(path[0]) || len < 3) @@ -118,13 +109,13 @@ Path::isValid() const { for (pos = 0; pos < len; ++pos) { // A component may not end in a space. if (path[pos] == ' ') { - if (path[pos+1] == '/' || path[pos+1] == '\0') + if (pos+1 == len || path[pos+1] == '/' || path[pos+1] == '\0') return false; } // A component may not end in a period. if (path[pos] == '.') { - if (path[pos+1] == '/' || path[pos+1] == '\0') { + if (pos+1 == len || path[pos+1] == '/') { // Unless it is the pseudo-directory "."... if (pos == 0 || path[pos-1] == '/' || path[pos-1] == ':') return true; @@ -286,14 +277,6 @@ Path::GetBitcodeLibraryPaths(std::vector<sys::Path>& Paths) { } Path -Path::GetLLVMDefaultConfigDir() { - Path ret = GetUserHomeDirectory(); - if (!ret.appendComponent(".llvm")) - assert(0 && "Failed to append .llvm"); - return ret; -} - -Path Path::GetUserHomeDirectory() { char buff[MAX_PATH]; HRESULT res = SHGetFolderPathA(NULL, |