Added method Path::getDirname().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49352 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2008-04-07 21:53:57 +00:00
parent a0562001d0
commit cf55c8e221
4 changed files with 57 additions and 2 deletions

View File

@ -269,6 +269,10 @@ namespace sys {
/// @returns std::string containing the basename of the path /// @returns std::string containing the basename of the path
/// @brief Get the base name of the path /// @brief Get the base name of the path
std::string getBasename() const; 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 /// This function strips off the path and basename(up to and
/// including the last dot) of the file or directory name and /// including the last dot) of the file or directory name and
@ -567,11 +571,19 @@ namespace sys {
/// MemoryBuffer::getFile instead. /// MemoryBuffer::getFile instead.
static void UnMapFilePages(const char *Base, uint64_t FileSize); static void UnMapFilePages(const char *Base, uint64_t FileSize);
/// @}
/// @name Internal methods.
/// @{
protected:
std::string getDirnameCharSep(char Sep) const;
/// @} /// @}
/// @name Data /// @name Data
/// @{ /// @{
protected: protected:
mutable std::string path; ///< Storage for the path name. mutable std::string path; ///< Storage for the path name.
/// @} /// @}
}; };

View File

@ -196,6 +196,45 @@ static void getPathList(const char*path, std::vector<Path>& Paths) {
Paths.push_back(tmpPath); 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. // Include the truly platform-specific parts of this class.
#if defined(LLVM_ON_UNIX) #if defined(LLVM_ON_UNIX)
#include "Unix/Path.inc" #include "Unix/Path.inc"

View File

@ -277,16 +277,18 @@ Path Path::GetMainExecutable(const char *argv0, void *MainAddr) {
} }
std::string Path::getDirname() const { return getDirnameCharSep('/'); }
std::string std::string
Path::getBasename() const { Path::getBasename() const {
// Find the last slash // Find the last slash
size_t slash = path.rfind('/'); std::string::size_type slash = path.rfind('/');
if (slash == std::string::npos) if (slash == std::string::npos)
slash = 0; slash = 0;
else else
slash++; slash++;
size_t dot = path.rfind('.'); std::string::size_type dot = path.rfind('.');
if (dot == std::string::npos || dot < slash) if (dot == std::string::npos || dot < slash)
return path.substr(slash); return path.substr(slash);
else else

View File

@ -229,6 +229,8 @@ Path::isRootDirectory() const {
return len > 0 && path[len-1] == '/'; return len > 0 && path[len-1] == '/';
} }
std::string Path::getDirname() const { return getDirnameCharSep('\\'); }
std::string std::string
Path::getBasename() const { Path::getBasename() const {
// Find the last slash // Find the last slash