Skip to content

Commit

Permalink
ArgsManager: support config file sections
Browse files Browse the repository at this point in the history
  • Loading branch information
ajtowns authored and random-zebra committed Apr 19, 2021
1 parent 2658771 commit 4cf2ee6
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/chainparamsbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,5 @@ std::unique_ptr<CBaseChainParams> CreateBaseChainParams(const std::string& chain
void SelectBaseParams(const std::string& chain)
{
globalChainBaseParams = CreateBaseChainParams(chain);
gArgs.SelectConfigNetwork(chain);
}
39 changes: 37 additions & 2 deletions src/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,13 @@ class ArgsManagerHelper {
public:
typedef std::map<std::string, std::vector<std::string>> MapArgs;

/** Convert regular argument into the network-specific setting */
static inline std::string NetworkArg(const ArgsManager& am, const std::string& arg)
{
assert(arg.length() > 1 && arg[0] == '-');
return "-" + am.m_network + "." + arg.substr(1);
}

/** Find arguments in a map and add them to a vector */
static inline void AddArgs(std::vector<std::string>& res, const MapArgs& map_args, const std::string& arg)
{
Expand Down Expand Up @@ -174,6 +181,13 @@ class ArgsManagerHelper {
// But in contrast we return the first argument seen in a config file,
// so "foo=bar \n foo=baz" in the config file gives
// GetArg(am,"foo")={true,"bar"}
if (!am.m_network.empty()) {
found_result = GetArgHelper(am.m_config_args, NetworkArg(am, arg));
if (found_result.first) {
return found_result;
}
}

found_result = GetArgHelper(am.m_config_args, arg);
if (found_result.first) {
return found_result;
Expand Down Expand Up @@ -206,9 +220,17 @@ class ArgsManagerHelper {
*/
static bool InterpretNegatedOption(std::string& key, std::string& val)
{
if (key.substr(0, 3) == "-no") {
assert(key[0] == '-');

size_t option_index = key.find('.');
if (option_index == std::string::npos) {
option_index = 1;
} else {
++option_index;
}
if (key.substr(option_index, 2) == "no") {
bool bool_val = InterpretBool(val);
key.erase(1, 2);
key.erase(option_index, 2);
if (!bool_val ) {
// Double negatives like -nofoo=0 are supported (but discouraged)
LogPrintf("Warning: parsed potentially confusing double-negative %s=%s\n", key, val);
Expand All @@ -220,6 +242,11 @@ static bool InterpretNegatedOption(std::string& key, std::string& val)
return false;
}

void ArgsManager::SelectConfigNetwork(const std::string& network)
{
m_network = network;
}

void ArgsManager::ParseParameters(int argc, const char* const argv[])
{
LOCK(cs_args);
Expand Down Expand Up @@ -262,6 +289,9 @@ std::vector<std::string> ArgsManager::GetArgs(const std::string& strArg) const

LOCK(cs_args);
ArgsManagerHelper::AddArgs(result, m_override_args, strArg);
if (!m_network.empty()) {
ArgsManagerHelper::AddArgs(result, m_config_args, ArgsManagerHelper::NetworkArg(*this, strArg));
}
ArgsManagerHelper::AddArgs(result, m_config_args, strArg);
return result;
}
Expand All @@ -279,6 +309,11 @@ bool ArgsManager::IsArgNegated(const std::string& strArg) const
const auto& ov = m_override_args.find(strArg);
if (ov != m_override_args.end()) return ov->second.empty();

if (!m_network.empty()) {
const auto& cfs = m_config_args.find(ArgsManagerHelper::NetworkArg(*this, strArg));
if (cfs != m_config_args.end()) return cfs->second.empty();
}

const auto& cf = m_config_args.find(strArg);
if (cf != m_config_args.end()) return cf->second.empty();

Expand Down
6 changes: 6 additions & 0 deletions src/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,16 @@ class ArgsManager
mutable RecursiveMutex cs_args;
std::map<std::string, std::vector<std::string>> m_override_args;
std::map<std::string, std::vector<std::string>> m_config_args;
std::string m_network;

void ReadConfigStream(std::istream& stream);

public:
/**
* Select the network in use
*/
void SelectConfigNetwork(const std::string& network);

void ParseParameters(int argc, const char* const argv[]);
void ReadConfigFile(const std::string& confPath);

Expand Down

0 comments on commit 4cf2ee6

Please sign in to comment.