* Parse multi-valued options.

This commit is contained in:
Eelco Dolstra 2005-09-22 15:43:22 +00:00
parent fbedf6056e
commit 4578a490ce
5 changed files with 54 additions and 16 deletions

View file

@ -77,4 +77,4 @@ build-allow-root = true
# #
# Example: # Example:
# build-users = nix-builder-1 nix-builder-2 nix-builder-3 # build-users = nix-builder-1 nix-builder-2 nix-builder-3
#build-users = build-users =

View file

@ -1,6 +1,7 @@
#include "globals.hh" #include "globals.hh"
#include <map> #include <map>
#include <algorithm>
string nixStore = "/UNINIT"; string nixStore = "/UNINIT";
@ -22,7 +23,15 @@ list<string> buildUsers;
static bool settingsRead = false; 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() static void readSettings()
@ -43,34 +52,44 @@ static void readSettings()
if (hash != string::npos) if (hash != string::npos)
line = string(line, 0, hash); 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); if (tokens.size() < 2 || genericAt<Strings, string>(tokens, 1) != "=")
string name, sep, value;
is >> name >> sep >> value;
if (sep != "=" || !is)
throw Error(format("illegal configuration line `%1%' in `%2%'") % line % settingsFile); 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; settingsRead = true;
} }
string querySetting(const string & name, const string & def) Strings querySetting(const string & name, const Strings & def)
{ {
if (!settingsRead) readSettings(); 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; return i == settings.end() ? def : i->second;
} }
bool queryBoolSetting(const string & name, bool def) bool queryBoolSetting(const string & name, bool def)
{ {
string value = querySetting(name, def ? "true" : "false"); Strings defs;
if (value == "true") return true; if (def) defs.push_back("true"); else defs.push_back("false");
else if (value == "false") return 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%'") else throw Error(format("configuration option `%1%' should be either `true' or `false', not `%2%'")
% name % value); % name % v);
} }

View file

@ -63,7 +63,7 @@ extern bool buildAllowRoot;
extern list<string> buildUsers; 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); bool queryBoolSetting(const string & name, bool def);

View file

@ -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) string statusToString(int status)
{ {
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {

View file

@ -261,6 +261,10 @@ string packStrings(const Strings & strings);
Strings unpackStrings(const string & s); 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 /* Convert the exit status of a child as returned by wait() into an
error string. */ error string. */
string statusToString(int status); string statusToString(int status);