Newer
Older
* \file
* \author Lars Bilke
* \date Apr. 2010
* \brief Filename manipulation routines implementation.
*
* \copyright
* Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
*/
#include <unordered_map>
#include <typeindex>
#include "filesystem.h"
#include <boost/algorithm/string.hpp>
namespace
{
/// The directory where the prj file resides.
/// Whether the project directory has already been set.
} // anonymous namespace
namespace BaseLib
{
/**
* Returns true if given file exists. From http://www.techbytes.ca/techbyte103.html
*/
bool IsFileExisting(const std::string &strFilename)
{
std::tuple<std::string, std::string::size_type, std::string::size_type>
getParenthesizedString(std::string const& in,
char const open_char,
char const close_char,
std::string::size_type pos)
{
auto const pos_curly_brace_open = in.find_first_of(open_char, pos);
if (pos_curly_brace_open == std::string::npos)
{
return std::make_tuple("", std::string::npos, std::string::npos);
}
auto const pos_curly_brace_close =
in.find_first_of(close_char, pos_curly_brace_open);
if (pos_curly_brace_close == std::string::npos)
{
return std::make_tuple("", std::string::npos, std::string::npos);
}
return std::make_tuple(
in.substr(pos_curly_brace_open + 1,
pos_curly_brace_close - (pos_curly_brace_open + 1)),
pos_curly_brace_open, pos_curly_brace_close);
}
std::string containsKeyword(std::string const& str, std::string const& keyword)
{
auto const position = str.find(keyword);
if (position != std::string::npos)
{
return str.substr(0, position);
}
return "";
}
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
template <typename T>
bool substituteKeyword(std::string& result, std::string& parenthesized_string,
std::string::size_type begin, std::string::size_type end,
std::string const& keyword, T& data)
{
std::string precision_specification =
containsKeyword(parenthesized_string, keyword);
if (precision_specification.empty())
{
return false;
}
std::unordered_map<std::type_index, char> type_specification;
type_specification[std::type_index(typeid(int))] = 'd';
type_specification[std::type_index(typeid(double))] = 'f'; // default
type_specification[std::type_index(typeid(std::string))] = 's';
auto const& b = precision_specification.back();
// see https://fmt.dev/latest/syntax.html#formatspec
if (b == 'e' || b == 'E' || b == 'f' || b == 'F' || b == 'g' || b == 'G')
{
type_specification[std::type_index(typeid(double))] = b;
precision_specification = precision_specification.substr(
0, precision_specification.length() - 1);
}
std::string const generated_fmt_string =
"{" + precision_specification +
type_specification[std::type_index(typeid(data))] + "}";
result = result.substr(0, begin) + fmt::format(generated_fmt_string, data) +
result.substr(end + 1, result.length() - (end + 1));
return true;
}
std::string constructFileName(std::string const& prefix,
int const process_id,
int const timestep,
double const t)
{
return prefix + "_pcs_" + std::to_string(process_id) + "_ts_" +
std::to_string(timestep) + "_t_" + std::to_string(t);
}
double swapEndianness(double const& v)
{
union
{
double v;
char c[sizeof(double)];
for (unsigned short i = 0; i < sizeof(double) / 2; i++)
{
b.c[i] = a.c[sizeof(double) / 2 - i - 1];
}
for (unsigned short i = sizeof(double) / 2; i < sizeof(double); i++)
{
b.c[i] = a.c[sizeof(double) + sizeof(double) / 2 - i - 1];
}
std::string dropFileExtension(std::string const& filename)
{
auto const filename_path = fs::path(filename);
return (filename_path.parent_path() / filename_path.stem()).string();
std::string extractBaseName(std::string const& pathname)
{
}
std::string extractBaseNameWithoutExtension(std::string const& pathname)
{
std::string basename = extractBaseName(pathname);
return dropFileExtension(basename);
std::string getFileExtension(const std::string &path)
bool hasFileExtension(std::string const& extension, std::string const& filename)
{
return boost::iequals(extension, getFileExtension(filename));
std::string copyPathToFileName(const std::string &file_name,
const std::string &source)
{
auto filePath = fs::path(file_name);
if(filePath.has_parent_path())
{
return filePath.string();
}
else
{
std::string extractPath(std::string const& pathname)
}
std::string joinPaths(std::string const& pathA, std::string const& pathB)
{
return (fs::path(pathA) /= fs::path(pathB)).string();
std::string const& getProjectDirectory()
{
if (!project_directory_is_set)
{
OGS_FATAL("The project directory has not yet been set.");
}
return project_directory;
}
void setProjectDirectory(std::string const& dir)
{
if (project_directory_is_set)
{
OGS_FATAL("The project directory has already been set.");
}
project_directory = dir;
project_directory_is_set = true;
}
void removeFiles(std::vector<std::string> const& files)
{
for (auto const& file : files)
{
bool const success = fs::remove(fs::path(file));
if (success)
DBUG("Removed '{:s}'", file);