blob: 660a98107ff1cffe028ff9393b127853654439a3 (
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
140
141
142
143
144
145
146
147
|
/*
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);
/// 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);
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 unknown_key() const;
/// print a default unkown section error
void unknown_section() const;
/// print a generic error message
void unknown_error(const char *text = 0) const;
void unknown_error(const std::string &text) 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__
|