X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fconfig.cpp;h=99e5981503eb35ab9780711a092cea30a3701776;hb=4f78d9f016482ce1ac7d726852e33e07c090df1b;hp=50e0de9f9a165bfd9e461c6d8a194e1a756c316c;hpb=59ac0a44d6edf179c01604c6ced744873213f855;p=builder.git diff --git a/source/config.cpp b/source/config.cpp index 50e0de9..99e5981 100644 --- a/source/config.cpp +++ b/source/config.cpp @@ -1,14 +1,28 @@ +#include #include +#include +#include #include "config.h" 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); @@ -18,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; @@ -37,12 +63,54 @@ bool Config::process(const RawOptionMap &opts) } } + if(changed) + mtime=Time::now(); + return changed; } +/** +Loads configuration from a file, if it exists. +*/ +void Config::load(const Path::Path &fn) +{ + ifstream in(fn.str().c_str()); + if(!in) return; + + 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): name(n), defv(v), 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; +}