aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/System/Path.h12
-rw-r--r--lib/System/Path.cpp39
-rw-r--r--lib/System/Unix/Path.inc6
-rw-r--r--lib/System/Win32/Path.inc2
4 files changed, 57 insertions, 2 deletions
diff --git a/include/llvm/System/Path.h b/include/llvm/System/Path.h
index 1178d68..5846fa9 100644
--- a/include/llvm/System/Path.h
+++ b/include/llvm/System/Path.h
@@ -269,6 +269,10 @@ namespace sys {
/// @returns std::string containing the basename of the path
/// @brief Get the base name of the path
std::string getBasename() const;
+
+ /// This function strips off the suffix of the path beginning with the
+ /// path separator ('/' on Unix, '\' on Windows) and returns the result.
+ std::string getDirname() const;
/// This function strips off the path and basename(up to and
/// including the last dot) of the file or directory name and
@@ -567,11 +571,19 @@ namespace sys {
/// MemoryBuffer::getFile instead.
static void UnMapFilePages(const char *Base, uint64_t FileSize);
+
+ /// @}
+ /// @name Internal methods.
+ /// @{
+ protected:
+ std::string getDirnameCharSep(char Sep) const;
+
/// @}
/// @name Data
/// @{
protected:
mutable std::string path; ///< Storage for the path name.
+
/// @}
};
diff --git a/lib/System/Path.cpp b/lib/System/Path.cpp
index 8a1de75..43c36d5 100644
--- a/lib/System/Path.cpp
+++ b/lib/System/Path.cpp
@@ -196,6 +196,45 @@ static void getPathList(const char*path, std::vector<Path>& Paths) {
Paths.push_back(tmpPath);
}
+std::string Path::getDirnameCharSep(char Sep) const {
+
+ if (path.empty())
+ return ".";
+
+ // If the path is all slashes, return a single slash.
+ // Otherwise, remove all trailing slashes.
+
+ signed pos = path.size() - 1;
+
+ while (pos >= 0 && path[pos] == Sep)
+ --pos;
+
+ if (pos < 0)
+ return path[0] == Sep ? std::string(1, Sep) : std::string(".");
+
+ // Any slashes left?
+ signed i = 0;
+
+ while (i < pos && path[i] != Sep)
+ ++i;
+
+ if (i == pos) // No slashes? Return "."
+ return ".";
+
+ // There is at least one slash left. Remove all trailing non-slashes.
+ while (pos >= 0 && path[pos] != Sep)
+ --pos;
+
+ // Remove any trailing slashes.
+ while (pos >= 0 && path[pos] == Sep)
+ --pos;
+
+ if (pos < 0)
+ return path[0] == Sep ? std::string(1, Sep) : std::string(".");
+
+ return path.substr(0, pos+1);
+}
+
// Include the truly platform-specific parts of this class.
#if defined(LLVM_ON_UNIX)
#include "Unix/Path.inc"
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc
index c3d06a3..fe2e3c6 100644
--- a/lib/System/Unix/Path.inc
+++ b/lib/System/Unix/Path.inc
@@ -277,16 +277,18 @@ Path Path::GetMainExecutable(const char *argv0, void *MainAddr) {
}
+std::string Path::getDirname() const { return getDirnameCharSep('/'); }
+
std::string
Path::getBasename() const {
// Find the last slash
- size_t slash = path.rfind('/');
+ std::string::size_type slash = path.rfind('/');
if (slash == std::string::npos)
slash = 0;
else
slash++;
- size_t dot = path.rfind('.');
+ std::string::size_type dot = path.rfind('.');
if (dot == std::string::npos || dot < slash)
return path.substr(slash);
else
diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc
index da29cd3..35bae33 100644
--- a/lib/System/Win32/Path.inc
+++ b/lib/System/Win32/Path.inc
@@ -229,6 +229,8 @@ Path::isRootDirectory() const {
return len > 0 && path[len-1] == '/';
}
+std::string Path::getDirname() const { return getDirnameCharSep('\\'); }
+
std::string
Path::getBasename() const {
// Find the last slash