/* 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/filesystem.h" #include "filesystem/inifile.h" namespace filesystem { IniFile::IniFile() {} IniFile::~IniFile() {} void IniFile::open(std::string const & name) { last_read_was_section = false; last_read_was_key = false; key_current = ""; value_current = ""; section_current = ""; line_number = 0; std::string inifile_name("ini/"); inifile_name.append(name); inifile_name.append(".ini"); filesystem::File *f = filesystem::open(inifile_name.c_str()); if (!f) { return; } std::string fn = f->path(); fn.append(f->name()); filesystem::close(f); inifile_ifs.open(fn.c_str()); if (!inifile_ifs.is_open()) { con_warn << "Could not stream " << fn << "!\n"; return; } } 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); } bool IniFile::getline() { char line[1024]; last_read_was_section = false; last_read_was_key = false; key_current = ""; value_current = ""; if (!inifile_ifs.is_open()) return false; if (inifile_ifs.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; return true; } 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; return true; } } } return true; } else return false; } 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; } } void IniFile::close() { inifile_ifs.close(); } } // namespace filesystem