Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/inifile.cc93
-rw-r--r--src/common/inifile.h66
2 files changed, 159 insertions, 0 deletions
diff --git a/src/common/inifile.cc b/src/common/inifile.cc
new file mode 100644
index 0000000..c96b85b
--- /dev/null
+++ b/src/common/inifile.cc
@@ -0,0 +1,93 @@
+/*
+ common/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 "inifile.h"
+#include "console.h"
+
+namespace common {
+
+void IniFile::open(const char * filename, std::ios_base::openmode mode )
+{
+ last_read_was_section = false;
+ last_read_was_key = false;
+ key_current = "";
+ value_current = "";
+ section_current = "";
+ line_number = 0;
+
+ File::open(filename, mode);
+}
+
+
+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);
+}
+
+IniFile & IniFile::getline()
+{
+ char line[1024];
+
+ last_read_was_section = false;
+ last_read_was_key = false;
+ key_current = "";
+ value_current = "";
+
+ while ((*this)) {
+ File::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;
+ break;
+ } 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;
+ break;
+ }
+
+ }
+ }
+ }
+
+ return (*this);
+}
+
+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;
+ }
+}
+
+
+} // namespace common
+
diff --git a/src/common/inifile.h b/src/common/inifile.h
new file mode 100644
index 0000000..934da58
--- /dev/null
+++ b/src/common/inifile.h
@@ -0,0 +1,66 @@
+/*
+ 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_INIFILE_H__
+#define __INCLUDED_INIFILE_H__
+
+// project headers
+#include "file.h"
+
+// C++ headers
+#include <string>
+#include <fstream>
+
+namespace common {
+
+/// 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 File
+{
+public:
+ /// open the file for reading
+ virtual void open(const char * filename, std::ios_base::openmode mode = std::ios_base::in );
+
+ IniFile & 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 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
+ inline bool got_key() const { return last_read_was_key; }
+ /// check if the last read key=value pair matches keylabel and store the value in valuestring
+ bool got_key_string(char * const keylabel, std::string & valuestring);
+
+ inline unsigned int line() const { return line_number; }
+
+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;
+}; // class IniFile
+
+} // namespace common
+
+#endif // __INCLUDED_INIFILE_H__