Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
blob: e5423aa15d4c185e23f9ff580b3c59726d9cb4e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
   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 <string>
#include <fstream>

#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__