diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2011-10-24 03:27:19 +0000 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2011-10-24 03:27:19 +0000 |
commit | 5d0700786d53046b3d5d7fe0d8d207290a13872c (patch) | |
tree | d49a099af44ea1e1445cf0c3f611d5686ecc3697 | |
parent | b068bbbaecf338f481124551a5e6f37484fad800 (diff) | |
download | external_llvm-5d0700786d53046b3d5d7fe0d8d207290a13872c.zip external_llvm-5d0700786d53046b3d5d7fe0d8d207290a13872c.tar.gz external_llvm-5d0700786d53046b3d5d7fe0d8d207290a13872c.tar.bz2 |
Windows/Path.inc: [PR8460] Get rid of ScopedNullTerminator. Thanks to Zvi Rackover!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142785 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Support/Windows/Path.inc | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/lib/Support/Windows/Path.inc b/lib/Support/Windows/Path.inc index 42a92f9..8a5edcc 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; |