parent
3a13067557
commit
c042bf1db5
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue