#include "vtr_path.h" #include "vtr_util.h" //TODO: currently this file assumes unix-like // in the future support windows #include #include namespace vtr { const std::string PATH_DELIM = "/"; //Splits off the name and extension (including ".") of the specified filename std::array split_ext(const std::string& filename) { std::array 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