diff options
Diffstat (limited to 'lib/ConfigFile.cc')
-rw-r--r-- | lib/ConfigFile.cc | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/ConfigFile.cc b/lib/ConfigFile.cc new file mode 100644 index 0000000..85cbb00 --- /dev/null +++ b/lib/ConfigFile.cc @@ -0,0 +1,43 @@ +#include "ConfigFile.h" +#include "Regex.h" + +ConfigFile::ConfigFile(Handle * f) throw (GeneralException) { + Regex r("^\\[.*\\]$"), comment("^#.*$"), empty("^ *$"), line("^.*=.*$"); + bool started = false; + String s, section, key, value; + ConfigSectionContents contents; + int pos; + + while (!f->IsClosed()) { + (*f) >> s; + if (comment.Match(s) || empty.Match(s)) + continue; + if (r.Match(s)) { + if (!started) { + started = true; + } else { + c[section] = contents; + contents.clear(); + } + section = s.extract(1, s.strlen() - 2); + continue; + } + if (line.Match(s)) { + if (!started) { + throw GeneralException("Config file must begin with a section"); + } + pos = s.strchr('='); + key = s.extract(0, pos - 1).trim(); + value = s.extract(pos + 1).trim(); + contents[key] = value; + continue; + } + throw GeneralException("Invalid line: " + s); + } + + c[section] = contents; +} + +ConfigSectionContents & ConfigFile::operator[](String s) { + return c[s]; +} |