annotate C++/Parser.cpp @ 180:2bcdee0fe8d4

Update parser
author David Demelier <markand@malikania.fr>
date Thu, 26 Sep 2013 19:39:24 +0200
parents 3648e9e6935b
children 600754c27c88
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 #include <iostream>
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <fstream>
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 "Parser.h"
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 /* --------------------------------------------------------
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 * Option public members
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 * -------------------------------------------------------- */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 bool operator==(const Option &o1, const Option &o2)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 return o1.m_key == o2.m_key &&
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 o1.m_value == o2.m_value;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 /* --------------------------------------------------------
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 * Section public members
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 * -------------------------------------------------------- */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 Section::Section()
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
39 : m_allowed(true)
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
43 const std::string &Section::getName() const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 {
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
45 return m_name;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 const std::string Section::findOption(const std::string &name) const
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 std::string ret;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 for (const Option &o : m_options)
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
53 if (o.m_key == name)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
54 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 ret = o.m_value;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 break;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 return ret;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
62 template <>
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
63 bool Section::getValue(const std::string &name) const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 bool result = false;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
67 if (hasOption(name))
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
68 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 std::string value = findOption(name);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 if (value == "yes" || value == "true"|| value == "1")
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 result = true;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 else if (value == "no" || value == "false" || value == "0")
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 result = false;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 return result;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
80 template <>
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
81 int Section::getValue(const std::string &name) const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 int result = -1;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
85 if (hasOption(name))
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 result = atoi(findOption(name).c_str());
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
87
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 return result;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
91 template <>
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
92 std::string Section::getValue(const std::string &name) const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 std::string result;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 if (hasOption(name))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 result = findOption(name);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 return result;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
102 const std::vector<Option> &Section::getOptions() const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 return m_options;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 bool Section::hasOption(const std::string &name) const
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 for (const Option &o : m_options)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 if (o.m_key == name)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 return true;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 return false;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 bool operator==(const Section &s1, const Section &s2)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 if (s1.m_name != s2.m_name)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 return false;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 return s1.m_options == s2.m_options;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 /* --------------------------------------------------------
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 * Parser private members
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 * -------------------------------------------------------- */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 void Parser::addSection(const std::string &name)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 Section section;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 section.m_name = name;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 section.m_allowed = true;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 m_sections.push_back(section);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 void Parser::addOption(const std::string &key, const std::string &value)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 Option option;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 Section &current = m_sections.back();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 option.m_key = key;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 option.m_value = value;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 current.m_options.push_back(option);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 void Parser::readSection(int lineno, const std::string &line)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 size_t end;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
153 if ((end = line.find_first_of(']')) != std::string::npos)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
154 {
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
155 if (end > 1)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
156 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 std::string name = line.substr(1, end - 1);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 /*
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 * Check if we can add a section, if redefinition is
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 * disabled, we must disable the previous section so the
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 * further read options should not be enabled until
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 * a correct section is found again.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 */
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
165 if (hasSection(name) && (m_tuning & DisableRedefinition))
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
166 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 if (!(m_tuning & DisableVerbosity))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 log(lineno, name, "redefinition not allowed");
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 m_sections.back().m_allowed = false;
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
170 }
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
171 else
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 addSection(name);
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
173 }
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
174 else if (!(m_tuning & DisableVerbosity))
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
175 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 /*
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 * Do not add options at this step because it will
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 * corrupt the previous one.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 m_sections.back().m_allowed = false;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 log(lineno, "", "empty section name");
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 void Parser::readOption(int lineno, const std::string &line)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 size_t epos;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 std::string key, value;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 Section &current = m_sections.back();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 // Error on last section?
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
193 if (!current.m_allowed)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
194 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 /*
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 * If it is the root section, this has been probably set by
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 * DisableRootSection flag, otherwise an error has occured
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 * so no need to log.
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 if (current.m_name == "" && !(m_tuning == DisableVerbosity))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 log(lineno, "", "option not allowed in that scope");
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 return;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
206 if ((epos = line.find_first_of('=')) == std::string::npos)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
207 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 if (!(m_tuning & DisableVerbosity))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 log(lineno, current.m_name, "missing `=' keyword");
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 return;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
213 if (epos > 0)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
214 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 size_t i, begin, last;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 char c;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 key = line.substr(0, epos - 1);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 value = line.substr(epos + 1);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 // clean option key
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 for (i = 0; !isspace(key[i]) && i < key.length(); ++i)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 continue;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 key = key.substr(0, i);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
225
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 // clean option value
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 for (begin = 0; isspace(value[begin]) && begin < value.length(); ++begin)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 continue;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 value = value.substr(begin);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 c = value[0];
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 begin = 0;
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
233 if (c == '\'' || c == '"')
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
234 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 for (last = begin = 1; value[last] != c && last < value.length(); ++last)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 continue;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 if (value[last] != c && !(m_tuning & DisableVerbosity))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 if (!(m_tuning & DisableVerbosity))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 log(lineno, current.m_name, "undisclosed std::string");
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
240 }
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
241 else
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
242 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 for (last = begin; !isspace(value[last]) && last < value.length(); ++last)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 continue;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 if (last - begin > 0)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 value = value.substr(begin, last - begin);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 else
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 value.clear();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
251
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 // Add the option if the key is not empty
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 if (key.length() > 0)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 addOption(key, value);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 }
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 void Parser::readLine(int lineno, const std::string &line)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 size_t i;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 std::string buffer;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
262
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 // Skip default spaces
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 for (i = 0; isspace(line[i]) && i < line.length(); ++i)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 continue;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
266
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 buffer = line.substr(i);
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
268 if (buffer.length() > 0)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
269 {
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
270 if (buffer[0] != m_commentChar)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
271 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 if (buffer[0] == '[')
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 readSection(lineno, buffer);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 else
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 readOption(lineno, buffer);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
279
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 /* --------------------------------------------------------
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 * Parser public methods
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 * -------------------------------------------------------- */
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
283
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 const char Parser::DEFAULT_COMMENT_CHAR = '#';
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
285
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
286 Parser::Parser()
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
287 {
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
288 }
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
289
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 Parser::Parser(const std::string &path, int tuning, char commentToken)
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
291 : m_path(path)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
292 , m_tuning(tuning)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
293 , m_commentChar(commentToken)
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 Section root;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
296
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 // Add a default root section
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 root.m_name = "";
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 root.m_allowed = (tuning & DisableRootSection) ? false : true;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
300
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 m_sections.push_back(root);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
303
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 Parser::~Parser()
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 {
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 bool Parser::open()
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 std::ifstream file;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 std::string line;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 int lineno = 1;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
313
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 file.open(m_path.c_str());
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
315 if (!file.is_open())
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
316 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 m_error = "could not open file " + m_path; // XXX: add a real error
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 return false;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
320
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 // Avoid use of C getline
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
322 while (std::getline(file, line))
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 readLine(lineno++, line);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
324
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 file.close();
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
326
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 return true;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
330 const std::string &Parser::getError() const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 return m_error;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
334
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
335 const std::vector<Section> &Parser::getSections() const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 return m_sections;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
339
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
340 void Parser::findSections(const std::string &name, FindFunc func) const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 {
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
342 for (const Section &s : m_sections)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
343 if (s.m_name == name)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
344 func(s);
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
346
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 bool Parser::hasSection(const std::string &name) const
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 for (const Section &s : m_sections)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 if (s.m_name == name)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 return true;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
352
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 return false;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
355
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
356 const Section &Parser::getSection(const std::string &name) const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 for (const Section &s : m_sections)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 if (s.m_name == name)
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
360 return s;
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
361
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
362 throw NotFoundException(name);
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
364
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
365 const Section &Parser::requireSection(const std::string &name) const
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 if (!hasSection(name))
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 throw NotFoundException(name);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
369
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 return getSection(name);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
372
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 void Parser::log(int number, const std::string &, const std::string &message)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 std::cout << "line " << number << ": " << message << std::endl;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
377
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 void Parser::dump()
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 {
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
380 for (auto s : m_sections)
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
381 {
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 dumpSection(s);
180
2bcdee0fe8d4 Update parser
David Demelier <markand@malikania.fr>
parents: 179
diff changeset
383
179
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 for (auto o : s.m_options)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 dumpOption(o);
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
388
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 void Parser::dumpSection(const Section &section)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 std::cout << "Section " << section.m_name << std::endl;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 }
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
393
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 void Parser::dumpOption(const Option &option)
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 {
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 std::cout << " Option " << option.m_key << " = " << option.m_value << std::endl;
3648e9e6935b Add parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 }