X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fconfig.cpp;h=99e5981503eb35ab9780711a092cea30a3701776;hb=4f78d9f016482ce1ac7d726852e33e07c090df1b;hp=de6b9bce34525c0f86e4dd4f2b3a306840807649;hpb=97001ddfa2463e6a3526eff772962acdad45f995;p=builder.git diff --git a/source/config.cpp b/source/config.cpp index de6b9bc..99e5981 100644 --- a/source/config.cpp +++ b/source/config.cpp @@ -7,11 +7,22 @@ using namespace std; using namespace Msp; +/** +Adds a configuration option. + +@param n Option name +@param v Default value +@param d Description +*/ void Config::add_option(const string &n, const string &v, const string &d) { options.insert(OptionMap::value_type(n, Option(n, v, d))); } +/** +Gets the given option from the configuration. If the option doesn't exist, +an Exception is thrown. +*/ const Config::Option &Config::get_option(const string &name) const { OptionMap::const_iterator i=options.find(name); @@ -21,11 +32,23 @@ const Config::Option &Config::get_option(const string &name) const return i->second; } +/** +Checks whether an option with the given name exists. +*/ bool Config::is_option(const string &name) const { return options.count(name); } +/** +Processes options from the given raw option map. Nonexistent options are +ignored. If any options were changed, the mtime of the configuration is updated +to the current time. + +@param opts A map to process options from + +@return Whether any option values were changed +*/ bool Config::process(const RawOptionMap &opts) { bool changed=false; @@ -46,6 +69,9 @@ bool Config::process(const RawOptionMap &opts) return changed; } +/** +Loads configuration from a file, if it exists. +*/ void Config::load(const Path::Path &fn) { ifstream in(fn.str().c_str()); @@ -54,6 +80,19 @@ void Config::load(const Path::Path &fn) struct stat st; Path::stat(fn, st); mtime=Time::TimeStamp::from_unixtime(st.st_mtime); + + Parser::Parser parser(in, fn.str()); + Loader loader(*this); + loader.load(parser); +} + +void Config::save(const Path::Path &fn) const +{ + ofstream out(fn.str().c_str()); + if(!out) return; + + for(OptionMap::const_iterator i=options.begin(); i!=options.end(); ++i) + out<<"option \""<second.name<<"\" \""<second.value<<"\";\n"; } Config::Option::Option(const string &n, const string &v, const string &d): @@ -62,3 +101,16 @@ Config::Option::Option(const string &n, const string &v, const string &d): descr(d), value(v) { } + +Config::Loader::Loader(Config &c): + conf(c) +{ + add("option", &Loader::option); +} + +void Config::Loader::option(const string &n, const string &v) +{ + OptionMap::iterator i=conf.options.find(n); + if(i!=conf.options.end()) + i->second.value=v; +}