// Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #include "filename.h" #include "sysinfo.h" namespace embree { #ifdef __WIN32__ const char path_sep = '\\'; #else const char path_sep = '/'; #endif /*! create an empty filename */ FileName::FileName () {} /*! create a valid filename from a string */ FileName::FileName (const char* in) { filename = in; for (size_t i=0; i<filename.size(); i++) if (filename[i] == '\\' || filename[i] == '/') filename[i] = path_sep; while (!filename.empty() && filename[filename.size()-1] == path_sep) filename.resize(filename.size()-1); } /*! create a valid filename from a string */ FileName::FileName (const std::string& in) { filename = in; for (size_t i=0; i<filename.size(); i++) if (filename[i] == '\\' || filename[i] == '/') filename[i] = path_sep; while (!filename.empty() && filename[filename.size()-1] == path_sep) filename.resize(filename.size()-1); } /*! returns path to home folder */ FileName FileName::homeFolder() { #ifdef __WIN32__ const char* home = getenv("UserProfile"); #else const char* home = getenv("HOME"); #endif if (home) return home; return ""; } /*! returns path to executable */ FileName FileName::executableFolder() { return FileName(getExecutableFileName()).path(); } /*! returns the path */ FileName FileName::path() const { size_t pos = filename.find_last_of(path_sep); if (pos == std::string::npos) return FileName(); return filename.substr(0,pos); } /*! returns the basename */ std::string FileName::base() const { size_t pos = filename.find_last_of(path_sep); if (pos == std::string::npos) return filename; return filename.substr(pos+1); } /*! returns the extension */ std::string FileName::ext() const { size_t pos = filename.find_last_of('.'); if (pos == std::string::npos) return ""; return filename.substr(pos+1); } /*! returns the extension */ FileName FileName::dropExt() const { size_t pos = filename.find_last_of('.'); if (pos == std::string::npos) return filename; return filename.substr(0,pos); } /*! returns the basename without extension */ std::string FileName::name() const { size_t start = filename.find_last_of(path_sep); if (start == std::string::npos) start = 0; else start++; size_t end = filename.find_last_of('.'); if (end == std::string::npos || end < start) end = filename.size(); return filename.substr(start, end - start); } /*! replaces the extension */ FileName FileName::setExt(const std::string& ext) const { size_t start = filename.find_last_of(path_sep); if (start == std::string::npos) start = 0; else start++; size_t end = filename.find_last_of('.'); if (end == std::string::npos || end < start) return FileName(filename+ext); return FileName(filename.substr(0,end)+ext); } /*! adds the extension */ FileName FileName::addExt(const std::string& ext) const { return FileName(filename+ext); } /*! concatenates two filenames to this/other */ FileName FileName::operator +( const FileName& other ) const { if (filename == "") return FileName(other); else return FileName(filename + path_sep + other.filename); } /*! concatenates two filenames to this/other */ FileName FileName::operator +( const std::string& other ) const { return operator+(FileName(other)); } /*! removes the base from a filename (if possible) */ FileName FileName::operator -( const FileName& base ) const { size_t pos = filename.find_first_of(base); if (pos == std::string::npos) return *this; return FileName(filename.substr(pos+1)); } /*! == operator */ bool operator== (const FileName& a, const FileName& b) { return a.filename == b.filename; } /*! != operator */ bool operator!= (const FileName& a, const FileName& b) { return a.filename != b.filename; } /*! output operator */ std::ostream& operator<<(std::ostream& cout, const FileName& filename) { return cout << filename.filename; } }