Caching bin path

This commit is contained in:
Daniel Wolf 2016-09-18 22:00:08 +02:00
parent 0ab009e17a
commit cf13499158
1 changed files with 25 additions and 22 deletions

View File

@ -11,29 +11,32 @@ using boost::filesystem::path;
using std::string;
path getBinPath() {
try {
// Determine path length
int pathLength = wai_getExecutablePath(nullptr, 0, nullptr);
if (pathLength == -1) {
throw std::runtime_error("Error determining path length.");
}
static const path binPath = [] {
try {
// Determine path length
int pathLength = wai_getExecutablePath(nullptr, 0, nullptr);
if (pathLength == -1) {
throw std::runtime_error("Error determining path length.");
}
// Get path
// Note: According to documentation, pathLength does *not* include the trailing zero. Actually, it does.
// In case there are situations where it doesn't, we allocate one character more.
std::vector<char> buffer(pathLength + 1);
if (wai_getExecutablePath(buffer.data(), buffer.size(), nullptr) == -1) {
throw std::runtime_error("Error reading path.");
}
buffer[pathLength] = 0;
// Get path
// Note: According to documentation, pathLength does *not* include the trailing zero. Actually, it does.
// In case there are situations where it doesn't, we allocate one character more.
std::vector<char> buffer(pathLength + 1);
if (wai_getExecutablePath(buffer.data(), buffer.size(), nullptr) == -1) {
throw std::runtime_error("Error reading path.");
}
buffer[pathLength] = 0;
// Convert to boost::filesystem::path
string pathString(buffer.data());
static path binPath(boost::filesystem::canonical(pathString).make_preferred());
return binPath;
} catch (...) {
std::throw_with_nested(std::runtime_error("Could not determine path of bin directory.") );
}
// Convert to boost::filesystem::path
string pathString(buffer.data());
static path binPath(boost::filesystem::canonical(pathString).make_preferred());
return binPath;
} catch (...) {
std::throw_with_nested(std::runtime_error("Could not determine path of bin directory."));
}
}();
return binPath;
}
path getBinDirectory() {