/* * Baltisot * Copyright (C) 1999-2007 Nicolas "Pixel" Noble * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "ConfigFile.h" #include "BRegex.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]; } ConfigSectionIterator ConfigFile::begin() { return c.begin(); } ConfigSectionIterator ConfigFile::end() { return c.end(); }