Path: blob/master/thirdparty/embree/common/sys/filename.cpp
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#include "filename.h"4#include "sysinfo.h"56namespace embree7{8#ifdef __WIN32__9const char path_sep = '\\';10#else11const char path_sep = '/';12#endif1314/*! create an empty filename */15FileName::FileName () {}1617/*! create a valid filename from a string */18FileName::FileName (const char* in) {19filename = in;20for (size_t i=0; i<filename.size(); i++)21if (filename[i] == '\\' || filename[i] == '/')22filename[i] = path_sep;23while (!filename.empty() && filename[filename.size()-1] == path_sep)24filename.resize(filename.size()-1);25}2627/*! create a valid filename from a string */28FileName::FileName (const std::string& in) {29filename = in;30for (size_t i=0; i<filename.size(); i++)31if (filename[i] == '\\' || filename[i] == '/')32filename[i] = path_sep;33while (!filename.empty() && filename[filename.size()-1] == path_sep)34filename.resize(filename.size()-1);35}3637/*! returns path to executable */38FileName FileName::executableFolder() {39return FileName(getExecutableFileName()).path();40}4142/*! returns the path */43FileName FileName::path() const {44size_t pos = filename.find_last_of(path_sep);45if (pos == std::string::npos) return FileName();46return filename.substr(0,pos);47}4849/*! returns the basename */50std::string FileName::base() const {51size_t pos = filename.find_last_of(path_sep);52if (pos == std::string::npos) return filename;53return filename.substr(pos+1);54}5556/*! returns the extension */57std::string FileName::ext() const {58size_t pos = filename.find_last_of('.');59if (pos == std::string::npos) return "";60return filename.substr(pos+1);61}6263/*! returns the extension */64FileName FileName::dropExt() const {65size_t pos = filename.find_last_of('.');66if (pos == std::string::npos) return filename;67return filename.substr(0,pos);68}6970/*! returns the basename without extension */71std::string FileName::name() const {72size_t start = filename.find_last_of(path_sep);73if (start == std::string::npos) start = 0; else start++;74size_t end = filename.find_last_of('.');75if (end == std::string::npos || end < start) end = filename.size();76return filename.substr(start, end - start);77}7879/*! replaces the extension */80FileName FileName::setExt(const std::string& ext) const {81size_t start = filename.find_last_of(path_sep);82if (start == std::string::npos) start = 0; else start++;83size_t end = filename.find_last_of('.');84if (end == std::string::npos || end < start) return FileName(filename+ext);85return FileName(filename.substr(0,end)+ext);86}8788/*! adds the extension */89FileName FileName::addExt(const std::string& ext) const {90return FileName(filename+ext);91}9293/*! concatenates two filenames to this/other */94FileName FileName::operator +( const FileName& other ) const {95if (filename == "") return FileName(other);96else return FileName(filename + path_sep + other.filename);97}9899/*! concatenates two filenames to this/other */100FileName FileName::operator +( const std::string& other ) const {101return operator+(FileName(other));102}103104/*! removes the base from a filename (if possible) */105FileName FileName::operator -( const FileName& base ) const {106size_t pos = filename.find_first_of(base);107if (pos == std::string::npos) return *this;108return FileName(filename.substr(pos+1));109}110111/*! == operator */112bool operator== (const FileName& a, const FileName& b) {113return a.filename == b.filename;114}115116/*! != operator */117bool operator!= (const FileName& a, const FileName& b) {118return a.filename != b.filename;119}120121/*! output operator */122std::ostream& operator<<(std::ostream& cout, const FileName& filename) {123return cout << filename.filename;124}125}126127128