OpenFPGA/libs/libvtrutil/src/vtr_path.cpp

88 lines
2.0 KiB
C++
Raw Normal View History

#include "vtr_path.h"
#include "vtr_util.h"
//TODO: currently this file assumes unix-like
// in the future support windows
#include <unistd.h>
#include <sstream>
namespace vtr {
const std::string PATH_DELIM = "/";
//Splits off the name and extension (including ".") of the specified filename
std::array<std::string,2> split_ext(const std::string& filename) {
std::array<std::string,2> name_ext;
auto pos = filename.find_last_of('.');
if (pos == std::string::npos) {
//No extension
pos = filename.size();
}
name_ext[0] = std::string(filename, 0, pos);
name_ext[1] = std::string(filename, pos, filename.size() - pos);
return name_ext;
}
std::string basename(const std::string& path) {
auto elements = split(path, PATH_DELIM);
std::string str;
if(elements.size() > 0) {
//Return the last path element
str = elements[elements.size() - 1];
}
return str;
}
std::string dirname(const std::string& path) {
auto elements = split(path, PATH_DELIM);
std::string str;
if(elements.size() > 0) {
//We need to start the dirname with a PATH_DELIM if path started with one
if(starts_with(path, PATH_DELIM)) {
str += PATH_DELIM;
}
//Join all except the last path element
str += join(elements.begin(), elements.end() - 1, PATH_DELIM);
//We append a final PATH_DELIM to allow clients to just append directly to the
//returned value
str += PATH_DELIM;
}
return str;
}
std::string getcwd() {
constexpr size_t BUF_SIZE = 500;
char buf [BUF_SIZE];
if (::getcwd(buf, BUF_SIZE)) {
return std::string(buf);
}
//Check the global errno
int error = errno;
switch (error) {
case EACCES:
throw std::runtime_error("Access denied");
default: {
std::stringstream str;
str << "Unrecognised error" << error;
throw std::runtime_error(str.str());
}
}
}
} //namespace