about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2005-09-22T15·43+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2005-09-22T15·43+0000
commit4578a490ce5a5a6325b4ff2b8f44468464de2d94 (patch)
tree62a5118879990d20e71cccf263f4648bfa3ba253 /src
parentfbedf6056eb2acb5049b0372350b2c93b8185ab7 (diff)
* Parse multi-valued options.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/globals.cc47
-rw-r--r--src/libstore/globals.hh2
-rw-r--r--src/libutil/util.cc15
-rw-r--r--src/libutil/util.hh4
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);