diff options
author | Stijn Buys <ingar@osirion.org> | 2007-11-11 12:35:08 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2007-11-11 12:35:08 +0000 |
commit | 7db1598f6b18b043b474d66677a6c1c49b318694 (patch) | |
tree | 556cdd944e6b70aa2ffe1f9d8183d90739ae461b /src | |
parent | e4168305de096ed8b47308d35dbc16912a74230a (diff) |
ini file reader
Diffstat (limited to 'src')
-rw-r--r-- | src/common/inifile.cc | 93 | ||||
-rw-r--r-- | src/common/inifile.h | 66 |
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__ |