1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include "settings.h"
#include <map>
#include <cstdlib>
#include <regex>
namespace settings {
const std::map<std::string, std::string> dummySettings {
{"weapon", "parser/items/weapons/"},
{"armor", "parser/items/armor/"},
{"spellcasting", "parser/spells/"},
{"savedir", "~/.dmtool/"}
};
// Update the input string.
// Obtained from https://stackoverflow.com/a/23442780
void autoExpandEnvironmentVariables(std::string& text) {
std::size_t tilde;
while((tilde = text.find("~")) != std::string::npos) {
text.replace(tilde, tilde+1, "${HOME}");
}
static std::regex env("\\$(?:\\{([^}]+)\\}|([^/]+))");
std::smatch match;
while(std::regex_search(text, match, env)) {
std::string matchStr = match[1].str().empty()? match[2].str() : match[1].str();
auto s = getenv(matchStr.c_str());
const std::string var(s == NULL? "" : s);
text.replace(match[0].first, match[0].second, var);
}
}
// Returns the setting, or an empty string in the case of an error
std::string getString(const std::string& key) {
if(! dummySettings.contains(key)) {
return "";
}
std::string ret = dummySettings.at(key);
autoExpandEnvironmentVariables(ret);
return ret;
}
}
|