diff options
author | Stijn Buys <ingar@osirion.org> | 2011-07-10 19:29:57 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2011-07-10 19:29:57 +0000 |
commit | af5404ea593d460d3ae843a23b295e3cfeade5bc (patch) | |
tree | 71b52f1700c82e970e6b49d786612825cc714887 /src/filesystem/inistream.h | |
parent | 5b9baa97e65314454005edb1231e18cf0f5bfb43 (diff) |
Split the ini file reader into a stream decoder and a file wrapper.
Diffstat (limited to 'src/filesystem/inistream.h')
-rw-r--r-- | src/filesystem/inistream.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/filesystem/inistream.h b/src/filesystem/inistream.h new file mode 100644 index 0000000..7c99120 --- /dev/null +++ b/src/filesystem/inistream.h @@ -0,0 +1,103 @@ +/* + filesystem/inistream.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_FILESTREAM_INIFILE_H__ +#define __INCLUDED_FILESTREAM_INIFILE_H__ + +#include <string> +#include <fstream> + +#include "math/vector3f.h" +#include "math/color.h" +#include "filesystem/filestream.h" + +namespace filesystem +{ + +/// a class to read ini streams +/** + * The IniStream class is able to decode the structure of a windows-like + * .ini file from a text stream. + **/ +class IniStream +{ +public: + IniStream(); + + ~IniStream(); + + /// parse one line, returns false on end-of-file + bool getline(std::istream & istream); + + /// 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; + } + + /// current line number + inline unsigned int line() const { + return line_number; + } + + /// 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); + + /// check if the last read key=value pair matches keylabel and store the value in valuestring, converted to label + bool got_key_label(const char * keylabel, std::string & labelstring); + + 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); + +protected: + void clear(); + +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; +}; + +} + +#endif // __INCLUDED_FILESYSTEM_INISTREAM_H__ |