diff options
Diffstat (limited to 'src/settings.cc')
-rw-r--r-- | src/settings.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/settings.cc b/src/settings.cc new file mode 100644 index 0000000..e9a6165 --- /dev/null +++ b/src/settings.cc @@ -0,0 +1,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; + } +} |