diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-09-22T15·43+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-09-22T15·43+0000 |
commit | 4578a490ce5a5a6325b4ff2b8f44468464de2d94 (patch) | |
tree | 62a5118879990d20e71cccf263f4648bfa3ba253 /src | |
parent | fbedf6056eb2acb5049b0372350b2c93b8185ab7 (diff) |
* Parse multi-valued options.
Diffstat (limited to 'src')
-rw-r--r-- | src/libstore/globals.cc | 47 | ||||
-rw-r--r-- | src/libstore/globals.hh | 2 | ||||
-rw-r--r-- | src/libutil/util.cc | 15 | ||||
-rw-r--r-- | src/libutil/util.hh | 4 |
4 files changed, 53 insertions, 15 deletions
diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc index 8cbae54e20ca..9a3ac6981384 100644 --- a/src/libstore/globals.cc +++ b/src/libstore/globals.cc @@ -1,6 +1,7 @@ #include "globals.hh" #include <map> +#include <algorithm> string nixStore = "/UNINIT"; @@ -22,7 +23,15 @@ list<string> buildUsers; static bool settingsRead = false; -static map<string, string> settings; +static map<string, Strings> settings; + + +template<class T, class A> A & genericAt(T & container, unsigned int n) +{ + class T::iterator i = container.begin(); + advance(i, n); + return *i; +} static void readSettings() @@ -43,34 +52,44 @@ static void readSettings() if (hash != string::npos) line = string(line, 0, hash); - if (line.find_first_not_of(" ") == string::npos) continue; + Strings tokens = tokenizeString(line); + if (tokens.empty()) continue; - istringstream is(line); - string name, sep, value; - is >> name >> sep >> value; - if (sep != "=" || !is) + if (tokens.size() < 2 || genericAt<Strings, string>(tokens, 1) != "=") throw Error(format("illegal configuration line `%1%' in `%2%'") % line % settingsFile); - - settings[name] = value; + + string name = genericAt<Strings, string>(tokens, 0); + + Strings::iterator i = tokens.begin(); + advance(i, 2); + settings[name] = Strings(i, tokens.end()); }; settingsRead = true; } -string querySetting(const string & name, const string & def) +Strings querySetting(const string & name, const Strings & def) { if (!settingsRead) readSettings(); - map<string, string>::iterator i = settings.find(name); + map<string, Strings>::iterator i = settings.find(name); return i == settings.end() ? def : i->second; } bool queryBoolSetting(const string & name, bool def) { - string value = querySetting(name, def ? "true" : "false"); - if (value == "true") return true; - else if (value == "false") return false; + Strings defs; + if (def) defs.push_back("true"); else defs.push_back("false"); + + Strings value = querySetting(name, defs); + if (value.size() != 1) + throw Error(format("configuration option `%1%' should be either `true' or `false', not a list") + % name); + + string v = value.front(); + if (v == "true") return true; + else if (v == "false") return false; else throw Error(format("configuration option `%1%' should be either `true' or `false', not `%2%'") - % name % value); + % name % v); } diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh index 327b1bbc3de9..8ba0a030041e 100644 --- a/src/libstore/globals.hh +++ b/src/libstore/globals.hh @@ -63,7 +63,7 @@ extern bool buildAllowRoot; extern list<string> buildUsers; -string querySetting(const string & name, const string & def); +Strings querySetting(const string & name, const Strings & def); bool queryBoolSetting(const string & name, bool def); diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 574c2566b7a5..2e684e9c1441 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -665,6 +665,21 @@ Strings unpackStrings(const string & s) } +Strings tokenizeString(const string & s, const string & separators) +{ + Strings result; + string::size_type pos = s.find_first_not_of(separators, 0); + while (pos != string::npos) { + string::size_type end = s.find_first_of(separators, pos + 1); + if (end == string::npos) end = s.size(); + string token(s, pos, end - pos); + result.push_back(token); + pos = s.find_first_not_of(separators, end); + } + return result; +} + + string statusToString(int status) { if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { diff --git a/src/libutil/util.hh b/src/libutil/util.hh index beb98fe7c6e9..9e7eb11bd16d 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -261,6 +261,10 @@ string packStrings(const Strings & strings); Strings unpackStrings(const string & s); +/* String tokenizer. */ +Strings tokenizeString(const string & s, const string & separators = " \t\n\r"); + + /* Convert the exit status of a child as returned by wait() into an error string. */ string statusToString(int status); |