/* filesystem/inifile.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ // project headers #include "filesystem/inifile.h" namespace filesystem { IniFile::IniFile() {} IniFile::~IniFile() {} void IniFile::open(const char * filename, std::ios_base::openmode mode) { last_read_was_section = false; last_read_was_key = false; key_current = ""; value_current = ""; section_current = ""; line_number = 0; File::open(filename, mode); } bool IniFile::got_section() const { return last_read_was_section; } bool IniFile::got_section(const char * sectionlabel) const { return (last_read_was_section && section_current == sectionlabel); } IniFile & IniFile::getline() { char line[1024]; last_read_was_section = false; last_read_was_key = false; key_current = ""; value_current = ""; while ((*this)) { File::getline(line, 1024); std::string s(line); line_number++; if (s.size() == 0) { // empty line } else // comment if (s[0] == '#' || s[0] == ';') { // condebug << "IniFile got comment " << s << std::endl; } else // section header if (s.size() > 2 && s[0] == '[' && s[s.size()-1] == ']') { // condebug << "Inifile got section header " << s << std::endl; section_current = s.substr(1, s.size()-2); last_read_was_section = true; break; } else { // key=value pair size_t found = s.find('='); if (found !=std::string::npos) { // FIXME strip spaces, make lowercase key_current = s.substr(0, found); if (key_current.size() > 0) { value_current = s.substr(found+1, s.size() - found - 1); last_read_was_key = true; break; } } } } return (*this); } bool IniFile::got_key_string(char * const keylabel, std::string & valuestring) { //condebug << "IniFile got_value_string " << keylabel << " " << last_read_was_key << std::endl; if (last_read_was_key && key_current == keylabel) { valuestring.assign(value_current); return true; } else { return false; } } } // namespace filesystem