annotate C++/Parser.h @ 196:274b4f216e65

DynLib: Windows support complete
author David Demelier <markand@malikania.fr>
date Thu, 28 Nov 2013 20:03:07 +0100
parents 600754c27c88
children 1ffe6d4937b7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Parser.h -- config file parser
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2011, 2012, 2013 David Demelier <markand@malikania.fr>
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _PARSER_H_
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _PARSER_H_
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <cstdlib>
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <exception>
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
24 #include <functional>
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <iostream>
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <string>
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <vector>
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 /**
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
30 * @class NotFoundException
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
31 * @brief Exception raised when a section or option is not found
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
32 *
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 * Thrown when a section or an option is not found.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 */
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
35 class NotFoundException : public std::exception {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 private:
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 std::string m_key;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 public:
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 NotFoundException(const std::string &key)
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
41 : m_key(key)
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 const std::string & which() const
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 return m_key;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 virtual const char *what() const throw()
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 return "Property not found";
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 };
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 /**
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
57 * @struct Option
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
58 * @brief A key-value pair
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
59 *
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 * An option referenced by a key and a value.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 */
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
62 struct Option {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 std::string m_key; /*! option name */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 std::string m_value; /*! option value */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 };
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 bool operator==(const Option &o1, const Option &o2);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 /**
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
70 * @class Section
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
71 * @brief The option container
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
72 *
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * A list of section found in the file. If root
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * options are allowed (default behavior), the root
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 * section is "".
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 */
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
77 class Section {
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
78 private:
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
79 const std::string findOption(const std::string &name) const;
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
80
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
81 public:
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 std::string m_name; /*! name of section */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 std::vector<Option> m_options; /*! list of options inside */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 bool m_allowed; /*! is authorized to push */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
86 /**
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
87 * Default constructor.
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
88 */
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 Section();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 * Get the section name
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * @return the section name
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 */
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
96 const std::string &getName() const;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 * Get all options from that section.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 * @return the list of options
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 */
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
103 const std::vector<Option> &getOptions() const;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 * Tells if that section has the specified option name.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 * @param name the option name
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 * @return true if has
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 bool hasOption(const std::string &name) const;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 * Template all functions for retrieving options value.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 * @param name the option name
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 * @return the value if found
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 template <typename T>
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
120 T getValue(const std::string &name) const;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 * Requires an option, this works like getOption except
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 * that if an option is not found, an exception is
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 * thrown.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 * @param name the name
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
128 * @return the value
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 * @throw NotFoundException if not found
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 template <typename T>
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
132 T requireValue(const std::string &name) const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 if (!hasOption(name))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 throw NotFoundException(name);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
137 return getValue<T>(name);
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
139
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
140 friend std::ostream &operator<<(std::ostream & stream, const Section &section)
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 stream << "[" << section.getName() << "]" << std::endl;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 for (auto p : section.getOptions())
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 stream << p.m_key << "=" << p.m_value << std::endl;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 return stream;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 };
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 bool operator==(const Section &s1, const Section &s2);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
153 /**
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
154 * @class Parser
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
155 * @brief Config file parser
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
156 *
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
157 * Open and read .ini files.
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
158 */
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
159 class Parser {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 public:
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 * Options available for the parser.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 */
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
164 enum Tuning {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 DisableRootSection = 1, /*! disable options on root */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 DisableRedefinition = 2, /*! disable multiple redefinition */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 DisableVerbosity = 4 /*! be verbose by method */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 };
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
170 using FindFunc = std::function<void (const Section &)>;
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
171
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 private:
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 std::vector<Section> m_sections; /*! list of sections found */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 std::string m_error; /*! if an error occured */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 std::string m_path; /*! path file */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 int m_tuning; /*! options for parsing */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 char m_commentChar; /*! the comment token default (#) */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
178
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 void addSection(const std::string &name);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 void addOption(const std::string &key, const std::string &value);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
181
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 void readSection(int lineno, const std::string &line);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 void readOption(int lineno, const std::string &line);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 void readLine(int lineno, const std::string &line);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
186
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 public:
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 static const char DEFAULT_COMMENT_CHAR;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
189
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 * Create a parser at the specified file path. Optional
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 * options may be added.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 * @param path the file path
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 * @param tuning optional tuning flags
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 * @param commentToken an optional comment delimiter
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 * @see Tuning
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 Parser(const std::string &path, int tuning = 0, char commentToken = Parser::DEFAULT_COMMENT_CHAR);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 * Default constructor.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 Parser();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 * Default destructor.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 virtual ~Parser();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 * Open the config file.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 * @return true on success
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 bool open();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 * Get the error message if any
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 * @return the error message
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 */
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
223 const std::string &getError() const;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * Get all sections found
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 * @return all sections
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 */
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
230 const std::vector<Section> &getSections() const;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
231
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 /**
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
233 * Find all sections matching the name.
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 * @param name the sections name
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
236 * @param func the function
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 * @return a list of section with the options
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 */
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
239 void findSections(const std::string &name, FindFunc func) const;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
240
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 * Tell if a section is existing.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 * @return true if exists
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 bool hasSection(const std::string &name) const;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
247
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 * Get a specified section.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 * @param name the section name
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 * @return a section
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
253 * @throw NotFoundException if not found
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 */
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
255 const Section &getSection(const std::string &name) const;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
256
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 * Logging function, used only if DisableVerbosity is not set. The
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 * default behavior is to print to stdout something like:
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 * line 10: syntax error
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 * line 8: missing =
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 * @param number the line number
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 * @param section the current section worked on
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 * @param message the message
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 virtual void log(int number, const std::string &section, const std::string &message);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
268
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 * Dump all sections and options.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 void dump();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
273
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 * Dump function used in the dump() method. This default method
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 * only print the section name like:
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 * Section foo
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 * @param section the current section
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 * @see dump
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 virtual void dumpSection(const Section &section);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
283
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 /**
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 * Dump the option. The default method only print the option name
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 * and value.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 *
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 * @param option the current option
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 * @see dump
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 virtual void dumpOption(const Option &option);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
292
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
293 /**
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
294 * Write the configuration to the output stream.
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
295 *
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
296 * @param stream the output
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
297 * @param parser the configuration
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
298 * @return the stream
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
299 */
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
300 friend std::ostream &operator<<(std::ostream &stream, const Parser &parser)
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 for (auto s : parser.m_sections)
187
600754c27c88 Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents: 180
diff changeset
303 stream << s;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 return stream;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 };
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
308
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 #endif // !_PARSER_H_