GCC Code Coverage Report


Directory: ./
File: tmp_project/PhoenixToml/src/parser_toml.cpp
Date: 2025-03-14 12:18:05
Exec Total Coverage
Lines: 126 134 94.0%
Branches: 260 309 84.1%

Line Branch Exec Source
1 /***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5 ****************************************/
6
7 #include "parse_generic_string.h"
8 #include "parser_toml.h"
9
10 ///@brief Data used to parse a toml file
11 struct PTomlParserData{
12 ///True to continue the parsing, false to stop
13 bool isRun;
14 };
15
16 ///Default value of PTomlParserData
17 /** @return default PTomlParserData
18 */
19 23 PTomlParserData default_PTomlParserData(){
20 PTomlParserData data;
21 23 data.isRun = true;
22 23 return data;
23 }
24
25 bool parse_toml_var(DicoValue & dico, PFileParser & parser, PTomlParserData & data);
26 bool parse_toml_all(DicoValue & parent, PFileParser & parser, PTomlParserData & data);
27
28 ///Stop the file parsing
29 /** @param[out] data : parsing data
30 */
31 11 void parse_toml_stopParsing(PTomlParserData & data){
32 11 data.isRun = false;
33 11 }
34
35 ///Say if the file parsing is enable
36 /** @param data : parsing data
37 */
38 177 bool parse_toml_isParse(const PTomlParserData & data){
39 177 return data.isRun;
40 }
41
42 ///Parse a toml var name
43 /** @param[out] varName : variable name
44 * @param parser : parser to be used
45 * @return true on success, false otherwise
46 */
47 116 bool parse_toml_varName(PString & varName, PFileParser & parser){
48
2/2
✓ Branch 2 taken 116 times.
✓ Branch 5 taken 116 times.
116 varName = parser.getStrComposedOf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_");
49 116 return varName != "";
50 }
51
52 ///Parse a toml var name
53 /** @param[out] var : Value to be updated
54 * @param[out] parser : parser to be used
55 * @param[out] data : extra parser data to be used
56 * @return true on success, false otherwise
57 */
58 109 bool parse_toml_varValue(DicoValue & var, PFileParser & parser, PTomlParserData & data){
59
3/3
✓ Branch 2 taken 109 times.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 102 times.
109 if(parser.isMatch("[")){ //The value is a list
60
11/16
✓ Branch 1 taken 19 times.
✓ Branch 3 taken 19 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 19 times.
✓ Branch 9 taken 19 times.
✓ Branch 11 taken 14 times.
✓ Branch 12 taken 5 times.
✓ Branch 14 taken 14 times.
✓ Branch 16 taken 14 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 19 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 14 times.
✓ Branch 22 taken 5 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
19 while(!parser.isEndOfFile() && !parser.isMatch("]") && parse_toml_isParse(data)){ //Let's parse the values of the Variable
61
1/1
✓ Branch 1 taken 14 times.
14 DicoValue subValue;
62
3/3
✓ Branch 1 taken 14 times.
✓ Branch 3 taken 13 times.
✓ Branch 4 taken 1 times.
14 if(parse_toml_varValue(subValue, parser, data)){
63
2/2
✓ Branch 1 taken 13 times.
✓ Branch 4 taken 13 times.
13 var.getVecChild().push_back(subValue);
64
65
13/18
✓ Branch 1 taken 13 times.
✓ Branch 4 taken 13 times.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 8 times.
✓ Branch 9 taken 5 times.
✓ Branch 12 taken 5 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 4 times.
✓ Branch 16 taken 5 times.
✓ Branch 17 taken 8 times.
✓ Branch 19 taken 13 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✓ Branch 23 taken 12 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
13 if(!parser.isMatch(",") && !parser.isMatchRewind("]")){ //We expect one element or a comma to add more
66
4/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
1 std::cerr << "parse_toml_varValue : expect ',' or ']' forunclosed list of values at " << parser.getLocation() << std::endl;
67
1/1
✓ Branch 1 taken 1 times.
1 parse_toml_stopParsing(data);
68 1 return false;
69 }
70 }else{
71
3/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 if(!parser.isMatch("]")){
72
4/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
1 std::cerr << "parse_toml_varBase : missing ']' token to close empty list of value at " << parser.getLocation() << std::endl;
73
1/1
✓ Branch 1 taken 1 times.
1 parse_toml_stopParsing(data);
74 1 return false;
75 }
76 }
77
2/2
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 2 times.
14 }
78 }else{
79
1/1
✓ Branch 1 taken 102 times.
102 PString strValue("");
80
3/3
✓ Branch 1 taken 102 times.
✓ Branch 3 taken 66 times.
✓ Branch 4 taken 36 times.
102 if(parse_generic_string(strValue, parser)){
81
1/1
✓ Branch 1 taken 66 times.
66 var.setValue(strValue);
82
4/4
✓ Branch 1 taken 36 times.
✓ Branch 4 taken 36 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 35 times.
36 }else if(parser.isMatch("true")){
83
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 var.setValue("true");
84
4/4
✓ Branch 1 taken 35 times.
✓ Branch 4 taken 35 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 34 times.
35 }else if(parser.isMatch("false")){
85
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 var.setValue("false");
86 }else{
87
2/2
✓ Branch 1 taken 34 times.
✓ Branch 4 taken 34 times.
34 PString valueNumber(parser.getStrComposedOf("0123456789.-+e"));
88
3/3
✓ Branch 1 taken 34 times.
✓ Branch 3 taken 30 times.
✓ Branch 4 taken 4 times.
34 if(valueNumber != ""){
89
1/1
✓ Branch 1 taken 30 times.
30 var.setValue(valueNumber);
90 }else{
91
7/7
✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 7 taken 4 times.
✓ Branch 10 taken 4 times.
✓ Branch 13 taken 4 times.
✓ Branch 16 taken 4 times.
✓ Branch 19 taken 4 times.
4 std::cerr << "parse_toml_varValue : missing value of variable '"<<var.getKey()<<"' at " << parser.getLocation() << std::endl;
92
1/1
✓ Branch 1 taken 4 times.
4 parse_toml_stopParsing(data);
93 4 return false;
94 }
95
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 4 times.
34 }
96
2/2
✓ Branch 1 taken 98 times.
✓ Branch 2 taken 4 times.
102 }
97 103 return true;
98 }
99
100 ///Parse a compact dico definition
101 /** @param[out] parent : parent of parsed dico
102 * @param[out] parser : parser to be used
103 * @param[out] data : extra parser data to be used
104 * @return true on success, false otherwise
105 */
106 98 bool parse_tomlCompactDico(DicoValue & parent, PFileParser & parser, PTomlParserData & data){
107
3/3
✓ Branch 2 taken 98 times.
✓ Branch 5 taken 93 times.
✓ Branch 6 taken 5 times.
98 if(!parser.isMatch("{")){return false;}
108
11/16
✓ Branch 1 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 9 times.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 9 times.
✓ Branch 14 taken 9 times.
✓ Branch 16 taken 6 times.
✓ Branch 17 taken 3 times.
✓ Branch 18 taken 9 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 6 times.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
9 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatch("}")){ //Let's parse the vatiables of the Dico
109
4/4
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 5 times.
✓ Branch 9 taken 1 times.
6 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
110
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
5 else if(parse_toml_var(parent, parser, data)){
111
11/18
✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 1 times.
✓ Branch 9 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 1 times.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
3 if(!parser.isMatch(",") && !parser.isMatchRewind("}")){ //We expect one element or a comma to add more
112 std::cerr << "parse_tomlCompactDico : expect ',' or '}' for unclosed dictionary of values at " << parser.getLocation() << std::endl;
113 parse_toml_stopParsing(data);
114 return false;
115 }
116 }else{
117
2/3
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 if(!parser.isMatch("}")){
118
2/2
✓ Branch 3 taken 2 times.
✓ Branch 6 taken 2 times.
2 std::cerr << "parse_tomlCompactDico : missing '}' token to close empty dictionary of value at " << parser.getLocation() << std::endl;
119 2 parse_toml_stopParsing(data);
120 2 return false;
121 }
122 }
123 }
124 3 return true;
125 }
126
127 ///Parse a toml var name
128 /** @param[out] var : variable DicoValue to be used
129 * @param[out] parser : parser to be used
130 * @param[out] data : extra parser data to be used
131 * @return true on success, false otherwise
132 */
133 116 bool parse_toml_varBase(DicoValue & var, PFileParser & parser, PTomlParserData & data){
134
1/1
✓ Branch 1 taken 116 times.
116 PString varName("");
135
3/3
✓ Branch 1 taken 116 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 100 times.
116 if(!parse_toml_varName(varName, parser)){return false;}
136
4/4
✓ Branch 1 taken 100 times.
✓ Branch 4 taken 100 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 98 times.
100 if(!parser.isMatch("=")){
137
6/6
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 13 taken 2 times.
✓ Branch 16 taken 2 times.
2 std::cerr << "parse_toml_varBase : missing '=' token to define value of variable '"<<varName<<"' at " << parser.getLocation() << std::endl;
138
1/1
✓ Branch 1 taken 2 times.
2 parse_toml_stopParsing(data);
139 2 return false;
140 }
141
1/1
✓ Branch 1 taken 98 times.
98 var.setKey(varName);
142 98 bool b(true);
143
3/3
✓ Branch 1 taken 98 times.
✓ Branch 3 taken 95 times.
✓ Branch 4 taken 3 times.
98 if(parse_tomlCompactDico(var, parser, data)){}
144
3/3
✓ Branch 1 taken 95 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 90 times.
95 else if(parse_toml_varValue(var, parser, data)){}
145 5 else{b = false;}
146 98 return b;
147 116 }
148
149 ///Parse a toml var name
150 /** @param[out] dico : DicoValue to be used
151 * @param[out] parser : parser to be used
152 * @param[out] data : extra parser data to be used
153 * @return true on success, false otherwise
154 */
155 116 bool parse_toml_var(DicoValue & dico, PFileParser & parser, PTomlParserData & data){
156
1/1
✓ Branch 1 taken 116 times.
116 DicoValue var;
157
3/3
✓ Branch 1 taken 116 times.
✓ Branch 3 taken 23 times.
✓ Branch 4 taken 93 times.
116 if(!parse_toml_varBase(var, parser, data)){return false;}
158
4/4
✓ Branch 1 taken 93 times.
✓ Branch 4 taken 93 times.
✓ Branch 7 taken 93 times.
✓ Branch 10 taken 93 times.
93 dico.getMapChild()[var.getKey()] = var;
159 93 return true;
160 116 }
161
162 ///Parse a toml var name
163 /** @param[out] dico : DicoValue to be used
164 * @param[out] parser : parser to be used
165 * @param[out] data : extra parser data to be used
166 * @return true on success, false otherwise
167 */
168 bool parse_toml_varTable(DicoValue & dico, PFileParser & parser, PTomlParserData & data){
169 DicoValue var;
170 if(!parse_toml_varBase(var, parser, data)){return false;}
171 dico.getVecChild().push_back(var);
172 return true;
173 }
174
175 ///Get the parent dictionary by respect to the vecDicoName
176 /** @param parent : main DicoValue
177 * @param vecDicoName : name of the parent DicoValue of the following attributes
178 * @return pointer to the parent DicoValue of the following attributes
179 */
180 29 DicoValue * parse_get_parent_dico(DicoValue & parent, const PVecString & vecDicoName){
181 29 DicoValue * output = &parent;
182
2/2
✓ Branch 4 taken 30 times.
✓ Branch 5 taken 29 times.
59 for(PVecString::const_iterator it(vecDicoName.begin()); it != vecDicoName.end(); ++it){
183
2/2
✓ Branch 1 taken 30 times.
✓ Branch 5 taken 30 times.
30 output = &(output->getMapChild()[*it]);
184
1/1
✓ Branch 2 taken 30 times.
30 output->setKey(*it);
185 }
186 29 return output;
187 }
188
189 ///Parse a dico definition
190 /** @param[out] parent : parent VecValue
191 * @param[out] parser : PFileParser to be used
192 * @param[out] data : extra parser data to be used
193 * @return true on success, false otherwise
194 */
195 17 bool parse_toml_dico_def(DicoValue & parent, PFileParser & parser, PTomlParserData & data){
196
4/4
✓ Branch 1 taken 17 times.
✓ Branch 4 taken 17 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 16 times.
17 if(!parser.isMatch("[")){return false;}
197
2/2
✓ Branch 1 taken 16 times.
✓ Branch 4 taken 16 times.
16 PString dicoName(parser.getUntilKeyWithoutPatern("]"));
198
1/1
✓ Branch 1 taken 16 times.
16 PVecString vecDicoName = dicoName.split('.');
199
1/1
✓ Branch 1 taken 16 times.
16 DicoValue * dicoDef = parse_get_parent_dico(parent, vecDicoName);
200
201 // dicoDef.setKey(dicoName);
202
14/16
✓ Branch 1 taken 52 times.
✓ Branch 3 taken 38 times.
✓ Branch 4 taken 14 times.
✓ Branch 6 taken 38 times.
✓ Branch 8 taken 37 times.
✓ Branch 9 taken 1 times.
✓ Branch 11 taken 37 times.
✓ Branch 14 taken 37 times.
✓ Branch 16 taken 36 times.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 37 times.
✓ Branch 19 taken 15 times.
✓ Branch 21 taken 36 times.
✓ Branch 22 taken 16 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
52 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatchRewind("[")){ //Let's parse the vatiables of the Dico
203
6/6
✓ Branch 1 taken 36 times.
✓ Branch 4 taken 36 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 35 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
36 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
204
1/1
✓ Branch 1 taken 35 times.
35 else if(parse_toml_var(*dicoDef, parser, data)){
205 // parent.getMapChild()[dicoName] = *dicoDef;
206 }
207 // else{
208 // std::cerr << "parse_toml_dico_def : error at " << parser.getLocation() << std::endl;
209 // std::cerr << "\tcannot parse [definition]" << std::endl;
210 // parse_toml_stopParsing(data);
211 // return true;
212 // }
213 }
214 16 return true;
215 16 }
216
217 ///Parse a dico definition
218 /** @param[out] parent : parent VecValue
219 * @param[out] parser : PFileParser to be used
220 * @param[out] data : extra parser data to be used
221 * @return true on success, false otherwise
222 */
223 30 bool parse_toml_table_def(DicoValue & parent, PFileParser & parser, PTomlParserData & data){
224
4/4
✓ Branch 1 taken 30 times.
✓ Branch 4 taken 30 times.
✓ Branch 7 taken 17 times.
✓ Branch 8 taken 13 times.
30 if(!parser.isMatch("[[")){return false;}
225
2/2
✓ Branch 1 taken 13 times.
✓ Branch 4 taken 13 times.
13 PString dicoName(parser.getUntilKeyWithoutPatern("]]"));
226
1/1
✓ Branch 1 taken 13 times.
13 PVecString vecDicoName = dicoName.split('.');
227
1/1
✓ Branch 1 taken 13 times.
13 DicoValue * dicoDef = parse_get_parent_dico(parent, vecDicoName);
228 // DicoValue dicoDef;
229 // dicoDef.setKey(dicoName);
230
1/1
✓ Branch 1 taken 13 times.
13 DicoValue table;
231
13/16
✓ Branch 1 taken 89 times.
✓ Branch 3 taken 82 times.
✓ Branch 4 taken 7 times.
✓ Branch 6 taken 82 times.
✓ Branch 8 taken 82 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 82 times.
✓ Branch 14 taken 82 times.
✓ Branch 16 taken 76 times.
✓ Branch 17 taken 6 times.
✓ Branch 18 taken 82 times.
✓ Branch 19 taken 7 times.
✓ Branch 21 taken 76 times.
✓ Branch 22 taken 13 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
89 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatchRewind("[")){ //Let's parse the vatiables of the Dico
232
3/8
✓ Branch 1 taken 76 times.
✓ Branch 4 taken 76 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 76 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
76 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
233
1/1
✓ Branch 1 taken 76 times.
76 else if(parse_toml_var(table, parser, data)){
234 // parent.getMapChild()[dicoName] = *dicoDef;
235 }
236 // else{
237 // std::cerr << "parse_toml_table_def : error at " << parser.getLocation() << std::endl;
238 // std::cerr << "\tcannot parse [[table_definition]]" << std::endl;
239 // parse_toml_stopParsing(data);
240 // return true;
241 // }
242 }
243
2/2
✓ Branch 1 taken 13 times.
✓ Branch 4 taken 13 times.
13 dicoDef->getVecChild().push_back(table);
244 13 return true;
245 13 }
246
247 ///Parse a yml file and update the given VecValue
248 /** @param[out] dico : dictionary of values
249 * @param parser : PFileParser to be used
250 * @return true on success, false otherwise
251 */
252 23 bool parser_toml_fileParser(DicoValue & dico, PFileParser & parser){
253
1/1
✓ Branch 1 taken 23 times.
23 PTomlParserData data(default_PTomlParserData());
254
2/2
✓ Branch 1 taken 23 times.
✓ Branch 4 taken 23 times.
23 parser.getStrComposedOf(" \t\n"); //Skip all blank characters
255
8/8
✓ Branch 1 taken 55 times.
✓ Branch 3 taken 34 times.
✓ Branch 4 taken 21 times.
✓ Branch 6 taken 34 times.
✓ Branch 8 taken 32 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 32 times.
✓ Branch 11 taken 23 times.
55 while(!parser.isEndOfFile() && parse_toml_isParse(data)){
256
6/6
✓ Branch 1 taken 32 times.
✓ Branch 4 taken 32 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 30 times.
✓ Branch 10 taken 2 times.
✓ Branch 13 taken 2 times.
32 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
257
3/3
✓ Branch 1 taken 30 times.
✓ Branch 3 taken 17 times.
✓ Branch 4 taken 13 times.
30 else if(parse_toml_table_def(dico, parser, data)){}
258
3/3
✓ Branch 1 taken 17 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 16 times.
17 else if(parse_toml_dico_def(dico, parser, data)){}
259 else{
260
1/1
✓ Branch 1 taken 1 times.
1 PString nextToken(parser.getNextToken());
261
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if(nextToken.size() != 0lu){ //If the token is empty, we are at the end of the file
262
4/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
1 std::cerr << "parser_toml_fileParser : error at " << parser.getLocation() << std::endl;
263
4/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
1 std::cerr << "\tunexpected token '"<<nextToken<<"'" << std::endl;
264
1/1
✓ Branch 1 taken 1 times.
1 parse_toml_stopParsing(data);
265 }
266 1 }
267 }
268 23 return data.isRun;
269 }
270
271 ///Parse a toml file and update the given DicoValue
272 /** @param[out] dico : dictionary of values
273 * @param fileName : name of the file to be parsed
274 * @return true on success, false otherwise
275 */
276 25 bool parser_toml(DicoValue & dico, const PPath & fileName){
277
1/1
✓ Branch 1 taken 25 times.
25 PFileParser parser;
278
2/2
✓ Branch 1 taken 25 times.
✓ Branch 4 taken 25 times.
25 parser.setWhiteSpace(" \n\t");
279
2/2
✓ Branch 1 taken 25 times.
✓ Branch 4 taken 25 times.
25 parser.setSeparator(":-'\",{}[]>|");
280
1/1
✓ Branch 1 taken 25 times.
25 parser.setEscapeChar('\\');
281
3/3
✓ Branch 1 taken 25 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 23 times.
25 if(!parser.open(fileName)){
282
4/4
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 10 taken 2 times.
2 std::cerr << "parser_toml : cannot open file '"<<fileName<<"'" << std::endl;
283 2 return false;
284 }
285
1/1
✓ Branch 1 taken 23 times.
23 bool b(parser_toml_fileParser(dico, parser));
286 23 return b;
287 25 }
288
289