Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2011-07-10 19:29:57 +0000
committerStijn Buys <ingar@osirion.org>2011-07-10 19:29:57 +0000
commitaf5404ea593d460d3ae843a23b295e3cfeade5bc (patch)
tree71b52f1700c82e970e6b49d786612825cc714887 /src/filesystem/inistream.h
parent5b9baa97e65314454005edb1231e18cf0f5bfb43 (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.h103
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__