From af5404ea593d460d3ae843a23b295e3cfeade5bc Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 10 Jul 2011 19:29:57 +0000 Subject: Split the ini file reader into a stream decoder and a file wrapper. --- src/filesystem/inifile.cc | 232 +--------------------------------------------- 1 file changed, 2 insertions(+), 230 deletions(-) (limited to 'src/filesystem/inifile.cc') diff --git a/src/filesystem/inifile.cc b/src/filesystem/inifile.cc index 5f87591..b0cab02 100644 --- a/src/filesystem/inifile.cc +++ b/src/filesystem/inifile.cc @@ -46,12 +46,7 @@ bool IniFile::open(const char *ininame) if (inifile_stream.is_open()) return false; - last_read_was_section = false; - last_read_was_key = false; - key_current = ""; - value_current = ""; - section_current = ""; - line_number = 0; + clear(); std::string inifile_name(ininame); inifile_name.append(".ini"); @@ -65,232 +60,9 @@ bool IniFile::open(const char *ininame) } -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.compare(sectionlabel) == 0)); -} - -bool IniFile::in_section(const char * sectionlabel) const -{ - return ((section_current.compare(sectionlabel) == 0)); -} - bool IniFile::getline() { - char line[1024]; - - last_read_was_section = false; - last_read_was_key = false; - key_current = ""; - value_current = ""; - - if (!inifile_stream.is_open()) - return false; - - if (inifile_stream.getline(line, 1023)) { - std::string s(line); - aux::trim(s); - line_number++; - - if (s.size() == 0) { - // empty line - } else - // strip trailing EOL / FF characters - if ( (s[s.size() -1] == 0x0a) || (s[s.size() -1] == 0x0d)) - s.erase(s.size() -1); - - // 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); - - aux::trim(section_current); - aux::to_lowercase(section_current); - - last_read_was_section = true; - return true; - } else { - // key=value pair - size_t found = s.find('='); - if (found != std::string::npos && found > 0) { - // make lowercase and strip spaces - key_current = s.substr(0, found); - - aux::trim(key_current); - aux::to_lowercase(key_current); - - if (key_current.size()) { - value_current = s.substr(found + 1, s.size() - found - 1); - aux::trim(value_current); - last_read_was_key = true; - //con_debug << "IniFile got " << key_current << "=" << value_current << std::endl; - return true; - } - - } - } - return true; - } else - return false; -} - -bool IniFile::got_key() const -{ - return last_read_was_key; -} - -bool IniFile::got_key_string(const char * keylabel, std::string & valuestring) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - valuestring.assign(value_current); - return true; - } else { - return false; - } -} - -bool IniFile::got_key_label(const char * keylabel, std::string & labelstring) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - labelstring.assign(value_current); - aux::to_label(labelstring); - return true; - } else { - return false; - } -} - -bool IniFile::got_key_vector3f(const char * keylabel, math::Vector3f & v) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - std::istringstream is(value_current); - float x, y, z; - if ((is >> x) && (is >> y) && (is >> z)) { - v = math::Vector3f(x, y, z); - } else { - v = math::Vector3f(); - } - return true; - } else { - return false; - } -} - -bool IniFile::got_key_float(const char * keylabel, float & f) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - std::istringstream is(value_current); - if (!(is >> f)) { - f = 0; - } - return true; - } else { - return false; - } -} - -bool IniFile::got_key_long(const char * keylabel, long & l) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - std::istringstream is(value_current); - if (!(is >> l)) { - l = 0; - } - return true; - } else { - return false; - } -} - -bool IniFile::got_key(const char * keylabel) -{ - return (last_read_was_key && (key_current.compare(keylabel) == 0)); -} - -bool IniFile::got_key_angle(const char * keylabel, float & f) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - std::istringstream is(value_current); - if ((is >> f)) { - f = math::degrees360f(f); - } else { - f = 0; - } - return true; - } else { - return false; - } -} - -bool IniFile::got_key_color(const char * keylabel, math::Color & color) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - std::istringstream is(value_current); - float r, g, b, a; - if ((is >> r) && (is >> g) && (is >> b)) { - if ((r > 1.0f) || (g > 1.0f) || (b > 1.0f)) { - if (is >> a) { - a /= 255.0f; - } - r /= 255.0f; - g /= 255.0f; - b /= 255.0f; - } else { - if (!(is >> a)) { - a = 1.0f; - } - } - color = math::Color(r, g, b, a); - } else { - color = math::Color(); - } - return true; - } else { - return false; - } -} - -bool IniFile::got_key_bool(const char * keylabel, bool & b) -{ - if (last_read_was_key && (key_current.compare(keylabel) == 0)) { - std::istringstream is(value_current); - - unsigned int i; - if (is >> i) { - if (i) b = true; - else b = false; - return true; - } - - std::string val(value_current); - aux::trim(val); - aux::lowercase(val); - - if (val.compare("yes") == 0) { - b = true; - return true; - } else if (val.compare("true") == 0) { - b = true; - return true; - } else if (val.compare("no") == 0) { - b = false; - return true; - } else if (val.compare("false") == 0) { - b = false; - return true; - } - } - - return false; + return IniStream::getline(inifile_stream); } void IniFile::unknown_value() const -- cgit v1.2.3