From eac144acdaca02f018bddde5f623fba3e8cd4ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Fri, 21 Apr 2017 11:19:36 +0200 Subject: Configuration options can be overridden by setting env values --- src/config/config.cpp | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) (limited to 'src/config') diff --git a/src/config/config.cpp b/src/config/config.cpp index 0db5751..0f3d639 100644 --- a/src/config/config.cpp +++ b/src/config/config.cpp @@ -1,10 +1,15 @@ #include +#include #include #include #include +using namespace std::string_literals; + +extern char** environ; + std::string Config::filename{}; std::map Config::values{}; std::vector Config::callbacks{}; @@ -71,21 +76,40 @@ bool Config::read_conf(const std::string& name) Config::clear(); + auto parse_line = [](const std::string& line, const bool env) + { + static const auto env_option_prefix = "BIBOUMI_"s; + + if (line == "" || line[0] == '#') + return; + size_t pos = line.find('='); + if (pos == std::string::npos) + return; + std::string option = line.substr(0, pos); + std::string value = line.substr(pos+1); + if (env) + { + auto a = option.substr(0, env_option_prefix.size()); + if (a == env_option_prefix) + option = utils::tolower(option.substr(env_option_prefix.size())); + else + return; + } + Config::values[option] = value; + }; + std::string line; - size_t pos; - std::string option; - std::string value; while (file.good()) { std::getline(file, line); - if (line == "" || line[0] == '#') - continue ; - pos = line.find('='); - if (pos == std::string::npos) - continue ; - option = line.substr(0, pos); - value = line.substr(pos+1); - Config::values[option] = value; + parse_line(line, false); + } + + char** env_line = environ; + while (*env_line) + { + parse_line(*env_line, true); + env_line++; } return true; } -- cgit v1.2.3