/* common/inifile.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_FILESYSTEM_INIFILE_H__ #define __INCLUDED_FILESYSTEM_INIFILE_H__ #include #include #include "math/vector3f.h" #include "math/color.h" #include "filesystem/filestream.h" namespace filesystem { /// a class to read .ini files /** The IniFile class provides functions to read .ini files. A .ini file * consists of one or more [section] headers followed by one or more key=value * pairs. Lines starting with # or ; are considered comments */ class IniFile { public: IniFile(const char *ininame = 0); IniFile(std::string const & ininame); ~IniFile(); /// open an ini file for reading bool open(std::string const & ininame); /// open an ini file for reading bool open(const char *ininame); /// parse one line, returns false on end-of-file bool getline(); /// current section label inline std::string section() const { return section_current; } /// current key inline std::string key() const { return key_current; } /// current value inline std::string value() const { return value_current; } /// true if the last read statement was a section header bool got_section() const; /// true if the current section matches bool in_section(const char *sectionlabel) const; /// true if the last read statement was a certain section header bool got_section(const char * sectionlabel) const; /// true if the last read statement was a key=value pair bool got_key() const; bool got_key(const char * keylabel); /// check if the last read key=value pair matches keylabel and store the value in valuestring bool got_key_string(const char * keylabel, std::string & valuestring); bool got_key_color(const char * keylabel, math::Color & color); bool got_key_float(const char * keylabel, float & f); bool got_key_angle(const char * keylabel, float & f); bool got_key_long(const char * keylabel, long & l); bool got_key_vector3f(const char * keylabel, math::Vector3f & v); bool got_key_bool(const char * keylabel, bool & b); inline unsigned int line() const { return line_number; } /// print a default unkown value error void unknown_value() const; /// print a default unkown key error void unkown_key() const; /// print a default unkown section error void unknown_section() const; /// return true of the ini file is open for reading inline bool is_open() { return inifile_stream.is_open(); } /// return true of the ini file is open for reading inline bool good() { return inifile_stream.good(); } /// current name in the virtual filesystem inline std::string const & name() const { return inifile_stream.name(); } /// current actual filename inline std::string const & filename() const { return inifile_stream.filename(); } /// close the file void close(); private: std::string section_current; std::string key_current; std::string value_current; bool last_read_was_key; bool last_read_was_section; unsigned int line_number; IFileStream inifile_stream; }; } #endif // __INCLUDED_FILESYSTEM_INIFILE_H__