2021-05-20 12:49:33 +02:00
|
|
|
// Copyright 2009-2021 Intel Corporation
|
2020-12-19 14:50:20 +01:00
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
}
|