* Parse multi-valued options.
This commit is contained in:
		
							parent
							
								
									fbedf6056e
								
							
						
					
					
						commit
						4578a490ce
					
				
					 5 changed files with 54 additions and 16 deletions
				
			
		|  | @ -77,4 +77,4 @@ build-allow-root = true | |||
| # | ||||
| # Example: | ||||
| #   build-users = nix-builder-1 nix-builder-2 nix-builder-3 | ||||
| #build-users = | ||||
| build-users = | ||||
|  |  | |||
|  | @ -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); | ||||
| } | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) { | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue