GCC Code Coverage Report


Directory: ./
File: src/parser_toml.cpp
Date: 2026-04-08 18:06:43
Exec Total Coverage
Lines: 269 284 94.7%
Functions: 22 23 95.7%
Branches: 548 638 85.9%

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 ///Parser to be used
13 PFileParser parser;
14 ///True to continue the parsing, false to stop
15 bool isRun;
16 };
17
18 ///Default value of PTomlParserData
19 /** @return default PTomlParserData
20 */
21 40 PTomlParserData default_PTomlParserData(){
22 40 PTomlParserData data;
23 40 data.isRun = true;
24 40 return data;
25 }
26
27 bool parse_toml_var(DicoValue & dico, PTomlParserData & data);
28 bool parse_toml_all(DicoValue & parent, PTomlParserData & data);
29
30 ///Stop the file parsing
31 /** @param[out] data : parsing data
32 */
33 22 void parse_toml_stopParsing(PTomlParserData & data){
34 22 data.isRun = false;
35 22 }
36
37 ///Say if the file parsing is enable
38 /** @param data : parsing data
39 */
40 226 bool parse_toml_isParse(const PTomlParserData & data){
41 226 return data.isRun;
42 }
43
44 ///Parse a toml var name
45 /** @param[out] varName : variable name
46 * @param parser : parser to be used
47 * @return true on success, false otherwise
48 */
49 122 bool parse_toml_varName(PString & varName, PFileParser & parser){
50
3/3
✓ Branch 0 (2→3) taken 122 times.
✓ Branch 2 (3→4) taken 122 times.
✓ Branch 4 (4→5) taken 122 times.
122 varName = parser.getStrComposedOf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_");
51 122 return varName != "";
52 }
53
54 ///Parse a compact dico definition
55 /** @param[out] parent : parent of parsed dico
56 * @param[out] data : parser data to be used
57 * @return true on success, false otherwise
58 */
59 60 bool parse_tomlCompactDico(DicoValue & parent, PTomlParserData & data){
60 60 PFileParser & parser = data.parser;
61
4/4
✓ Branch 0 (2→3) taken 60 times.
✓ Branch 2 (3→4) taken 60 times.
✓ Branch 4 (5→6) taken 52 times.
✓ Branch 5 (5→7) taken 8 times.
60 if(!parser.isMatch("{")){return false;}
62
11/16
✓ Branch 0 (51→52) taken 21 times.
✓ Branch 2 (52→53) taken 21 times.
✗ Branch 3 (52→59) not taken.
✓ Branch 4 (53→54) taken 21 times.
✓ Branch 6 (54→55) taken 21 times.
✗ Branch 7 (54→59) not taken.
✓ Branch 8 (55→56) taken 21 times.
✓ Branch 10 (56→57) taken 21 times.
✓ Branch 12 (57→58) taken 15 times.
✓ Branch 13 (57→59) taken 6 times.
✓ Branch 14 (60→61) taken 21 times.
✗ Branch 15 (60→62) not taken.
✓ Branch 16 (62→8) taken 15 times.
✓ Branch 17 (62→63) taken 6 times.
✗ Branch 18 (92→93) not taken.
✗ Branch 19 (92→94) not taken.
21 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatch("}")){ //Let's parse the vatiables of the Dico
63
6/6
✓ Branch 0 (8→9) taken 15 times.
✓ Branch 2 (9→10) taken 15 times.
✓ Branch 4 (11→12) taken 1 times.
✓ Branch 5 (11→17) taken 14 times.
✓ Branch 6 (12→13) taken 1 times.
✓ Branch 8 (13→14) taken 1 times.
15 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
64
2/2
✓ Branch 0 (18→19) taken 12 times.
✓ Branch 1 (18→39) taken 2 times.
14 else if(parse_toml_var(parent, data)){
65
11/18
✓ Branch 0 (19→20) taken 12 times.
✓ Branch 2 (20→21) taken 12 times.
✓ Branch 4 (21→22) taken 5 times.
✓ Branch 5 (21→26) taken 7 times.
✓ Branch 6 (22→23) taken 5 times.
✓ Branch 8 (23→24) taken 5 times.
✗ Branch 10 (24→25) not taken.
✓ Branch 11 (24→26) taken 5 times.
✓ Branch 12 (27→28) taken 5 times.
✓ Branch 13 (27→29) taken 7 times.
✓ Branch 14 (29→30) taken 12 times.
✗ Branch 15 (29→31) not taken.
✗ Branch 16 (31→32) not taken.
✓ Branch 17 (31→50) taken 12 times.
✗ Branch 18 (75→76) not taken.
✗ Branch 19 (75→77) not taken.
✗ Branch 20 (79→80) not taken.
✗ Branch 21 (79→81) not taken.
12 if(!parser.isMatch(",") && !parser.isMatchRewind("}")){ //We expect one element or a comma to add more
66 std::cerr << "parse_tomlCompactDico : expect ',' or '}' for unclosed dictionary of values at " << parser.getLocation() << std::endl;
67 parse_toml_stopParsing(data);
68 return false;
69 }
70 }else{
71
3/4
✓ Branch 0 (39→40) taken 2 times.
✓ Branch 2 (40→41) taken 2 times.
✓ Branch 4 (42→43) taken 2 times.
✗ Branch 5 (42→50) not taken.
2 if(!parser.isMatch("}")){
72
3/3
✓ Branch 0 (44→45) taken 2 times.
✓ Branch 2 (45→46) taken 2 times.
✓ Branch 4 (46→47) taken 2 times.
2 std::cerr << "parse_tomlCompactDico : missing '}' token to close empty dictionary of value at " << parser.getLocation() << std::endl;
73 2 parse_toml_stopParsing(data);
74 2 return false;
75 }
76 }
77 }
78 6 return true;
79 }
80
81 ///Parse a toml var name
82 /** @param[out] var : Value to be updated
83 * @param[out] data : parser data to be used
84 * @return true on success, false otherwise
85 */
86 54 bool parse_toml_varValue(DicoValue & var, PTomlParserData & data){
87 54 PFileParser & parser = data.parser;
88
4/4
✓ Branch 0 (2→3) taken 54 times.
✓ Branch 2 (3→4) taken 54 times.
✓ Branch 4 (5→6) taken 9 times.
✓ Branch 5 (5→65) taken 45 times.
54 if(parser.isMatch("[")){ //The value is a list
89
11/16
✓ Branch 0 (53→54) taken 24 times.
✓ Branch 2 (54→55) taken 24 times.
✗ Branch 3 (54→61) not taken.
✓ Branch 4 (55→56) taken 24 times.
✓ Branch 6 (56→57) taken 24 times.
✓ Branch 8 (57→58) taken 17 times.
✓ Branch 9 (57→61) taken 7 times.
✓ Branch 10 (58→59) taken 17 times.
✓ Branch 12 (59→60) taken 17 times.
✗ Branch 13 (59→61) not taken.
✓ Branch 14 (62→63) taken 24 times.
✗ Branch 15 (62→64) not taken.
✓ Branch 16 (64→7) taken 17 times.
✓ Branch 17 (64→113) taken 7 times.
✗ Branch 18 (138→139) not taken.
✗ Branch 19 (138→140) not taken.
24 while(!parser.isEndOfFile() && !parser.isMatch("]") && parse_toml_isParse(data)){ //Let's parse the values of the Variable
90
1/1
✓ Branch 0 (7→8) taken 17 times.
17 DicoValue subValue;
91
3/3
✓ Branch 0 (8→9) taken 17 times.
✓ Branch 2 (9→10) taken 3 times.
✓ Branch 3 (9→12) taken 14 times.
17 if(parse_tomlCompactDico(subValue, data)){
92
2/2
✓ Branch 0 (10→11) taken 3 times.
✓ Branch 2 (11→27) taken 3 times.
3 var.getVecChild().push_back(subValue);
93 }
94
3/3
✓ Branch 0 (12→13) taken 14 times.
✓ Branch 2 (13→14) taken 13 times.
✓ Branch 3 (13→16) taken 1 times.
14 else if(parse_toml_varValue(subValue, data)){
95
2/2
✓ Branch 0 (14→15) taken 13 times.
✓ Branch 2 (15→27) taken 13 times.
13 var.getVecChild().push_back(subValue);
96 }
97 else{
98
3/4
✓ Branch 0 (16→17) taken 1 times.
✓ Branch 2 (17→18) taken 1 times.
✓ Branch 4 (19→20) taken 1 times.
✗ Branch 5 (19→27) not taken.
1 if(!parser.isMatch("]")){
99
4/4
✓ Branch 0 (20→21) taken 1 times.
✓ Branch 2 (21→22) taken 1 times.
✓ Branch 4 (22→23) taken 1 times.
✓ Branch 6 (23→24) taken 1 times.
1 std::cerr << "parse_toml_varBase : missing ']' token to close empty list of value at " << parser.getLocation() << std::endl;
100
1/1
✓ Branch 0 (25→26) taken 1 times.
1 parse_toml_stopParsing(data);
101 1 return false;
102 }
103 }
104
105
13/18
✓ Branch 0 (27→28) taken 16 times.
✓ Branch 2 (28→29) taken 16 times.
✓ Branch 4 (29→30) taken 7 times.
✓ Branch 5 (29→34) taken 9 times.
✓ Branch 6 (30→31) taken 7 times.
✓ Branch 8 (31→32) taken 7 times.
✓ Branch 10 (32→33) taken 1 times.
✓ Branch 11 (32→34) taken 6 times.
✓ Branch 12 (35→36) taken 7 times.
✓ Branch 13 (35→37) taken 9 times.
✓ Branch 14 (37→38) taken 16 times.
✗ Branch 15 (37→39) not taken.
✓ Branch 16 (39→40) taken 1 times.
✓ Branch 17 (39→47) taken 15 times.
✗ Branch 18 (124→125) not taken.
✗ Branch 19 (124→126) not taken.
✗ Branch 20 (128→129) not taken.
✗ Branch 21 (128→130) not taken.
16 if(!parser.isMatch(",") && !parser.isMatchRewind("]")){ //We expect one element or a comma to add more
106
4/4
✓ Branch 0 (40→41) taken 1 times.
✓ Branch 2 (41→42) taken 1 times.
✓ Branch 4 (42→43) taken 1 times.
✓ Branch 6 (43→44) taken 1 times.
1 std::cerr << "parse_toml_varValue : expect ',' or ']' forunclosed list of values at " << parser.getLocation() << std::endl;
107
1/1
✓ Branch 0 (45→46) taken 1 times.
1 parse_toml_stopParsing(data);
108 1 return false;
109 }
110
2/2
✓ Branch 0 (49→50) taken 15 times.
✓ Branch 1 (49→52) taken 2 times.
17 }
111 }else{
112
1/1
✓ Branch 0 (65→66) taken 45 times.
45 PString strValue("");
113
3/3
✓ Branch 0 (66→67) taken 45 times.
✓ Branch 2 (67→68) taken 24 times.
✓ Branch 3 (67→69) taken 21 times.
45 if(parse_generic_string(strValue, parser)){
114
1/1
✓ Branch 0 (68→107) taken 24 times.
24 var.setValue(strValue);
115
4/4
✓ Branch 0 (69→70) taken 21 times.
✓ Branch 2 (70→71) taken 21 times.
✓ Branch 4 (72→73) taken 1 times.
✓ Branch 5 (72→77) taken 20 times.
21 }else if(parser.isMatch("true")){
116
2/2
✓ Branch 0 (73→74) taken 1 times.
✓ Branch 2 (74→75) taken 1 times.
1 var.setValue("true");
117
4/4
✓ Branch 0 (77→78) taken 20 times.
✓ Branch 2 (78→79) taken 20 times.
✓ Branch 4 (80→81) taken 1 times.
✓ Branch 5 (80→85) taken 19 times.
20 }else if(parser.isMatch("false")){
118
2/2
✓ Branch 0 (81→82) taken 1 times.
✓ Branch 2 (82→83) taken 1 times.
1 var.setValue("false");
119 }else{
120
2/2
✓ Branch 0 (85→86) taken 19 times.
✓ Branch 2 (86→87) taken 19 times.
19 PString valueNumber(parser.getStrComposedOf("0123456789.-+e"));
121
3/3
✓ Branch 0 (88→89) taken 19 times.
✓ Branch 2 (89→90) taken 15 times.
✓ Branch 3 (89→91) taken 4 times.
19 if(valueNumber != ""){
122
1/1
✓ Branch 0 (90→101) taken 15 times.
15 var.setValue(valueNumber);
123 }else{
124
7/7
✓ Branch 0 (91→92) taken 4 times.
✓ Branch 2 (92→93) taken 4 times.
✓ Branch 4 (93→94) taken 4 times.
✓ Branch 6 (94→95) taken 4 times.
✓ Branch 8 (95→96) taken 4 times.
✓ Branch 10 (96→97) taken 4 times.
✓ Branch 12 (97→98) taken 4 times.
4 std::cerr << "parse_toml_varValue : missing value of variable '"<<var.getKey()<<"' at " << parser.getLocation() << std::endl;
125
1/1
✓ Branch 0 (99→100) taken 4 times.
4 parse_toml_stopParsing(data);
126 4 return false;
127 }
128
2/2
✓ Branch 0 (103→104) taken 15 times.
✓ Branch 1 (103→106) taken 4 times.
19 }
129
2/2
✓ Branch 0 (109→110) taken 41 times.
✓ Branch 1 (109→112) taken 4 times.
45 }
130 48 return true;
131 }
132
133 ///Parse a toml var name
134 /** @param[out] var : variable DicoValue to be used
135 * @param[out] data : parser data to be used
136 * @return true on success, false otherwise
137 */
138 57 bool parse_toml_varBase(DicoValue & var, PTomlParserData & data){
139 57 PFileParser & parser = data.parser;
140
1/1
✓ Branch 0 (2→3) taken 57 times.
57 PString varName("");
141
3/3
✓ Branch 0 (3→4) taken 57 times.
✓ Branch 2 (4→5) taken 12 times.
✓ Branch 3 (4→6) taken 45 times.
57 if(!parse_toml_varName(varName, parser)){return false;}
142
4/4
✓ Branch 0 (6→7) taken 45 times.
✓ Branch 2 (7→8) taken 45 times.
✓ Branch 4 (9→10) taken 2 times.
✓ Branch 5 (9→19) taken 43 times.
45 if(!parser.isMatch("=")){
143
6/6
✓ Branch 0 (10→11) taken 2 times.
✓ Branch 2 (11→12) taken 2 times.
✓ Branch 4 (12→13) taken 2 times.
✓ Branch 6 (13→14) taken 2 times.
✓ Branch 8 (14→15) taken 2 times.
✓ Branch 10 (15→16) taken 2 times.
2 std::cerr << "parse_toml_varBase : missing '=' token to define value of variable '"<<varName<<"' at " << parser.getLocation() << std::endl;
144
1/1
✓ Branch 0 (17→18) taken 2 times.
2 parse_toml_stopParsing(data);
145 2 return false;
146 }
147
1/1
✓ Branch 0 (19→20) taken 43 times.
43 var.setKey(varName);
148 43 bool b(true);
149
3/3
✓ Branch 0 (20→21) taken 43 times.
✓ Branch 2 (21→22) taken 40 times.
✓ Branch 3 (21→25) taken 3 times.
43 if(parse_tomlCompactDico(var, data)){}
150
3/3
✓ Branch 0 (22→23) taken 40 times.
✓ Branch 2 (23→24) taken 5 times.
✓ Branch 3 (23→25) taken 35 times.
40 else if(parse_toml_varValue(var, data)){}
151 5 else{b = false;}
152 43 return b;
153 57 }
154
155 ///Parse a toml var name
156 /** @param[out] dico : DicoValue to be used
157 * @param[out] data : parser data to be used
158 * @return true on success, false otherwise
159 */
160 57 bool parse_toml_var(DicoValue & dico, PTomlParserData & data){
161
1/1
✓ Branch 0 (2→3) taken 57 times.
57 DicoValue var;
162
3/3
✓ Branch 0 (3→4) taken 57 times.
✓ Branch 2 (4→5) taken 19 times.
✓ Branch 3 (4→6) taken 38 times.
57 if(!parse_toml_varBase(var, data)){return false;}
163
4/4
✓ Branch 0 (6→7) taken 38 times.
✓ Branch 2 (7→8) taken 38 times.
✓ Branch 4 (8→9) taken 38 times.
✓ Branch 6 (9→10) taken 38 times.
38 dico.getMapChild()[var.getKey()] = var;
164 38 return true;
165 57 }
166
167 ///Parse a toml var name
168 /** @param[out] dico : DicoValue to be used
169 * @param[out] data : parser data to be used
170 * @return true on success, false otherwise
171 */
172 bool parse_toml_varTable(DicoValue & dico, PTomlParserData & data){
173 DicoValue var;
174 if(!parse_toml_varBase(var, data)){return false;}
175 dico.getVecChild().push_back(var);
176 return true;
177 }
178
179 ///Get the parent dictionary by respect to the vecDicoName
180 /** @param parent : main DicoValue
181 * @param vecDicoName : name of the parent DicoValue of the following attributes
182 * @return pointer to the parent DicoValue of the following attributes
183 */
184 19 DicoValue * parse_get_parent_dico(DicoValue & parent, const PVecString & vecDicoName){
185 19 DicoValue * output = &parent;
186
2/2
✓ Branch 0 (20→3) taken 20 times.
✓ Branch 1 (20→21) taken 19 times.
78 for(PVecString::const_iterator it(vecDicoName.begin()); it != vecDicoName.end(); ++it){
187
2/2
✓ Branch 0 (3→4) taken 20 times.
✓ Branch 2 (6→7) taken 20 times.
40 output = &(output->getMapChild()[*it]);
188
1/1
✓ Branch 0 (9→10) taken 20 times.
40 output->setKey(*it);
189 }
190 19 return output;
191 }
192
193 ///Parse a dico definition
194 /** @param[out] parent : parent VecValue
195 * @param[out] data : parser data to be used
196 * @return true on success, false otherwise
197 */
198 18 bool parse_toml_dico_def(DicoValue & parent, PTomlParserData & data){
199 18 PFileParser & parser = data.parser;
200
4/4
✓ Branch 0 (2→3) taken 18 times.
✓ Branch 2 (3→4) taken 18 times.
✓ Branch 4 (5→6) taken 1 times.
✓ Branch 5 (5→7) taken 17 times.
18 if(!parser.isMatch("[")){return false;}
201
2/2
✓ Branch 0 (7→8) taken 17 times.
✓ Branch 2 (8→9) taken 17 times.
17 PString dicoName(parser.getUntilKeyWithoutPatern("]"));
202
1/1
✓ Branch 0 (10→11) taken 17 times.
17 PVecString vecDicoName = dicoName.split('.');
203
1/1
✓ Branch 0 (11→12) taken 17 times.
17 DicoValue * dicoDef = parse_get_parent_dico(parent, vecDicoName);
204
205 // dicoDef.setKey(dicoName);
206
14/16
✓ Branch 0 (25→26) taken 56 times.
✓ Branch 2 (26→27) taken 41 times.
✓ Branch 3 (26→33) taken 15 times.
✓ Branch 4 (27→28) taken 41 times.
✓ Branch 6 (28→29) taken 40 times.
✓ Branch 7 (28→33) taken 1 times.
✓ Branch 8 (29→30) taken 40 times.
✓ Branch 10 (30→31) taken 40 times.
✓ Branch 12 (31→32) taken 39 times.
✓ Branch 13 (31→33) taken 1 times.
✓ Branch 14 (34→35) taken 40 times.
✓ Branch 15 (34→36) taken 16 times.
✓ Branch 16 (36→13) taken 39 times.
✓ Branch 17 (36→37) taken 17 times.
✗ Branch 18 (54→55) not taken.
✗ Branch 19 (54→56) not taken.
56 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatchRewind("[")){ //Let's parse the vatiables of the Dico
207
6/6
✓ Branch 0 (13→14) taken 39 times.
✓ Branch 2 (14→15) taken 39 times.
✓ Branch 4 (16→17) taken 1 times.
✓ Branch 5 (16→22) taken 38 times.
✓ Branch 6 (17→18) taken 1 times.
✓ Branch 8 (18→19) taken 1 times.
39 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
208
1/1
✓ Branch 0 (22→23) taken 38 times.
38 else if(parse_toml_var(*dicoDef, data)){
209 // parent.getMapChild()[dicoName] = *dicoDef;
210 }
211 // else{
212 // std::cerr << "parse_toml_dico_def : error at " << parser.getLocation() << std::endl;
213 // std::cerr << "\tcannot parse [definition]" << std::endl;
214 // parse_toml_stopParsing(data);
215 // return true;
216 // }
217 }
218 17 return true;
219 17 }
220
221 ///Parse a dico definition
222 /** @param[out] parent : parent VecValue
223 * @param[out] data : parser data to be used
224 * @return true on success, false otherwise
225 */
226 20 bool parse_toml_table_def(DicoValue & parent, PTomlParserData & data){
227 20 PFileParser & parser = data.parser;
228
4/4
✓ Branch 0 (2→3) taken 20 times.
✓ Branch 2 (3→4) taken 20 times.
✓ Branch 4 (5→6) taken 18 times.
✓ Branch 5 (5→7) taken 2 times.
20 if(!parser.isMatch("[[")){return false;}
229
2/2
✓ Branch 0 (7→8) taken 2 times.
✓ Branch 2 (8→9) taken 2 times.
2 PString dicoName(parser.getUntilKeyWithoutPatern("]]"));
230
1/1
✓ Branch 0 (10→11) taken 2 times.
2 PVecString vecDicoName = dicoName.split('.');
231
1/1
✓ Branch 0 (11→12) taken 2 times.
2 DicoValue * dicoDef = parse_get_parent_dico(parent, vecDicoName);
232 // DicoValue dicoDef;
233 // dicoDef.setKey(dicoName);
234
1/1
✓ Branch 0 (12→13) taken 2 times.
2 DicoValue table;
235
13/16
✓ Branch 0 (26→27) taken 7 times.
✓ Branch 2 (27→28) taken 6 times.
✓ Branch 3 (27→34) taken 1 times.
✓ Branch 4 (28→29) taken 6 times.
✓ Branch 6 (29→30) taken 6 times.
✗ Branch 7 (29→34) not taken.
✓ Branch 8 (30→31) taken 6 times.
✓ Branch 10 (31→32) taken 6 times.
✓ Branch 12 (32→33) taken 5 times.
✓ Branch 13 (32→34) taken 1 times.
✓ Branch 14 (35→36) taken 6 times.
✓ Branch 15 (35→37) taken 1 times.
✓ Branch 16 (37→14) taken 5 times.
✓ Branch 17 (37→38) taken 2 times.
✗ Branch 18 (58→59) not taken.
✗ Branch 19 (58→60) not taken.
7 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatchRewind("[")){ //Let's parse the vatiables of the Dico
236
3/6
✓ Branch 0 (14→15) taken 5 times.
✓ Branch 2 (15→16) taken 5 times.
✗ Branch 4 (17→18) not taken.
✓ Branch 5 (17→23) taken 5 times.
✗ Branch 6 (18→19) not taken.
✗ Branch 8 (19→20) not taken.
5 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
237
1/1
✓ Branch 0 (23→24) taken 5 times.
5 else if(parse_toml_var(table, data)){
238 // parent.getMapChild()[dicoName] = *dicoDef;
239 }
240 // else{
241 // std::cerr << "parse_toml_table_def : error at " << parser.getLocation() << std::endl;
242 // std::cerr << "\tcannot parse [[table_definition]]" << std::endl;
243 // parse_toml_stopParsing(data);
244 // return true;
245 // }
246 }
247
2/2
✓ Branch 0 (38→39) taken 2 times.
✓ Branch 2 (39→40) taken 2 times.
2 dicoDef->getVecChild().push_back(table);
248 2 return true;
249 2 }
250
251 ///Parse a yml file and update the given VecValue
252 /** @param[out] dico : dictionary of values
253 * @param[out] data : parser data to be used
254 * @return true on success, false otherwise
255 */
256 18 bool parser_toml_fileParser(DicoValue & dico, PTomlParserData & data){
257 18 PFileParser & parser = data.parser;
258
2/2
✓ Branch 0 (2→3) taken 18 times.
✓ Branch 2 (3→4) taken 18 times.
18 parser.getStrComposedOf(" \t\n"); //Skip all blank characters
259
6/6
✓ Branch 0 (37→38) taken 24 times.
✓ Branch 1 (37→41) taken 16 times.
✓ Branch 2 (39→40) taken 22 times.
✓ Branch 3 (39→41) taken 2 times.
✓ Branch 4 (42→7) taken 22 times.
✓ Branch 5 (42→43) taken 18 times.
40 while(!parser.isEndOfFile() && parse_toml_isParse(data)){
260
6/6
✓ Branch 0 (7→8) taken 22 times.
✓ Branch 2 (8→9) taken 22 times.
✓ Branch 4 (10→11) taken 2 times.
✓ Branch 5 (10→16) taken 20 times.
✓ Branch 6 (11→12) taken 2 times.
✓ Branch 8 (12→13) taken 2 times.
22 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
261
2/2
✓ Branch 0 (17→18) taken 18 times.
✓ Branch 1 (17→35) taken 2 times.
20 else if(parse_toml_table_def(dico, data)){}
262
2/2
✓ Branch 0 (19→20) taken 1 times.
✓ Branch 1 (19→35) taken 17 times.
18 else if(parse_toml_dico_def(dico, data)){}
263 else{
264
1/1
✓ Branch 0 (20→21) taken 1 times.
1 PString nextToken(parser.getNextToken());
265
1/2
✓ Branch 0 (22→23) taken 1 times.
✗ Branch 1 (22→33) not taken.
1 if(nextToken.size() != 0lu){ //If the token is empty, we are at the end of the file
266
4/4
✓ Branch 0 (23→24) taken 1 times.
✓ Branch 2 (24→25) taken 1 times.
✓ Branch 4 (25→26) taken 1 times.
✓ Branch 6 (26→27) taken 1 times.
1 std::cerr << "parser_toml_fileParser : error at " << parser.getLocation() << std::endl;
267
4/4
✓ Branch 0 (28→29) taken 1 times.
✓ Branch 2 (29→30) taken 1 times.
✓ Branch 4 (30→31) taken 1 times.
✓ Branch 6 (31→32) taken 1 times.
1 std::cerr << "\tunexpected token '"<<nextToken<<"'" << std::endl;
268
1/1
✓ Branch 0 (32→33) taken 1 times.
1 parse_toml_stopParsing(data);
269 }
270 1 }
271 }
272 18 return data.isRun;
273 }
274
275 ///Parse a toml file and update the given DicoValue
276 /** @param[out] dico : dictionary of values
277 * @param fileName : name of the file to be parsed
278 * @return true on success, false otherwise
279 */
280 19 bool parser_toml(DicoValue & dico, const PPath & fileName){
281
1/1
✓ Branch 0 (2→3) taken 19 times.
19 PTomlParserData data(default_PTomlParserData());
282 19 PFileParser & parser = data.parser;
283
2/2
✓ Branch 0 (3→4) taken 19 times.
✓ Branch 2 (4→5) taken 19 times.
19 parser.setWhiteSpace(" \n\t");
284
2/2
✓ Branch 0 (6→7) taken 19 times.
✓ Branch 2 (7→8) taken 19 times.
19 parser.setSeparator(":-'\",{}[]>|");
285
1/1
✓ Branch 0 (9→10) taken 19 times.
19 parser.setEscapeChar('\\');
286
3/3
✓ Branch 0 (10→11) taken 19 times.
✓ Branch 2 (11→12) taken 1 times.
✓ Branch 3 (11→17) taken 18 times.
19 if(!parser.open(fileName)){
287
4/4
✓ Branch 0 (12→13) taken 1 times.
✓ Branch 2 (13→14) taken 1 times.
✓ Branch 4 (14→15) taken 1 times.
✓ Branch 6 (15→16) taken 1 times.
1 std::cerr << "parser_toml : cannot open file '"<<fileName<<"'" << std::endl;
288 1 return false;
289 }
290
1/1
✓ Branch 0 (17→18) taken 18 times.
18 bool b(parser_toml_fileParser(dico, data));
291 18 return b;
292 19 }
293
294 bool parse_toml_var(ConfigNode & parent, PTomlParserData & data);
295
296 ///Parse a compact dico definition
297 /** @param[out] parent : parent ConfigNode
298 * @param[out] data : parser data to be used
299 * @return true on success, false otherwise
300 */
301 65 bool parse_tomlCompactDico(ConfigNode & parent, PTomlParserData & data){
302 65 PFileParser & parser = data.parser;
303
4/4
✓ Branch 0 (2→3) taken 65 times.
✓ Branch 2 (3→4) taken 65 times.
✓ Branch 4 (5→6) taken 57 times.
✓ Branch 5 (5→7) taken 8 times.
65 if(!parser.isMatch("{")){return false;}
304
11/16
✓ Branch 0 (51→52) taken 21 times.
✓ Branch 2 (52→53) taken 21 times.
✗ Branch 3 (52→59) not taken.
✓ Branch 4 (53→54) taken 21 times.
✓ Branch 6 (54→55) taken 21 times.
✗ Branch 7 (54→59) not taken.
✓ Branch 8 (55→56) taken 21 times.
✓ Branch 10 (56→57) taken 21 times.
✓ Branch 12 (57→58) taken 15 times.
✓ Branch 13 (57→59) taken 6 times.
✓ Branch 14 (60→61) taken 21 times.
✗ Branch 15 (60→62) not taken.
✓ Branch 16 (62→8) taken 15 times.
✓ Branch 17 (62→63) taken 6 times.
✗ Branch 18 (92→93) not taken.
✗ Branch 19 (92→94) not taken.
21 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatch("}")){ //Let's parse the vatiables of the Dico
305
6/6
✓ Branch 0 (8→9) taken 15 times.
✓ Branch 2 (9→10) taken 15 times.
✓ Branch 4 (11→12) taken 1 times.
✓ Branch 5 (11→17) taken 14 times.
✓ Branch 6 (12→13) taken 1 times.
✓ Branch 8 (13→14) taken 1 times.
15 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
306
2/2
✓ Branch 0 (18→19) taken 12 times.
✓ Branch 1 (18→39) taken 2 times.
14 else if(parse_toml_var(parent, data)){
307
11/18
✓ Branch 0 (19→20) taken 12 times.
✓ Branch 2 (20→21) taken 12 times.
✓ Branch 4 (21→22) taken 5 times.
✓ Branch 5 (21→26) taken 7 times.
✓ Branch 6 (22→23) taken 5 times.
✓ Branch 8 (23→24) taken 5 times.
✗ Branch 10 (24→25) not taken.
✓ Branch 11 (24→26) taken 5 times.
✓ Branch 12 (27→28) taken 5 times.
✓ Branch 13 (27→29) taken 7 times.
✓ Branch 14 (29→30) taken 12 times.
✗ Branch 15 (29→31) not taken.
✗ Branch 16 (31→32) not taken.
✓ Branch 17 (31→50) taken 12 times.
✗ Branch 18 (75→76) not taken.
✗ Branch 19 (75→77) not taken.
✗ Branch 20 (79→80) not taken.
✗ Branch 21 (79→81) not taken.
12 if(!parser.isMatch(",") && !parser.isMatchRewind("}")){ //We expect one element or a comma to add more
308 std::cerr << "parse_tomlCompactDico : expect ',' or '}' for unclosed dictionary of values at " << parser.getLocation() << std::endl;
309 parse_toml_stopParsing(data);
310 return false;
311 }
312 }else{
313
3/4
✓ Branch 0 (39→40) taken 2 times.
✓ Branch 2 (40→41) taken 2 times.
✓ Branch 4 (42→43) taken 2 times.
✗ Branch 5 (42→50) not taken.
2 if(!parser.isMatch("}")){
314
3/3
✓ Branch 0 (44→45) taken 2 times.
✓ Branch 2 (45→46) taken 2 times.
✓ Branch 4 (46→47) taken 2 times.
2 std::cerr << "parse_tomlCompactDico : missing '}' token to close empty dictionary of value at " << parser.getLocation() << std::endl;
315 2 parse_toml_stopParsing(data);
316 2 return false;
317 }
318 }
319 }
320 6 return true;
321 }
322
323 ///Parse a toml var value
324 /** @param[out] var : ConfigNode to be updated
325 * @param[out] data : parser data to be used
326 * @return true on success, false otherwise
327 */
328 59 bool parse_toml_varValue(ConfigNode & var, PTomlParserData & data){
329 59 PFileParser & parser = data.parser;
330
4/4
✓ Branch 0 (2→3) taken 59 times.
✓ Branch 2 (3→4) taken 59 times.
✓ Branch 4 (5→6) taken 9 times.
✓ Branch 5 (5→87) taken 50 times.
59 if(parser.isMatch("[")){ //The value is a list
331
11/16
✓ Branch 0 (75→76) taken 24 times.
✓ Branch 2 (76→77) taken 24 times.
✗ Branch 3 (76→83) not taken.
✓ Branch 4 (77→78) taken 24 times.
✓ Branch 6 (78→79) taken 24 times.
✓ Branch 8 (79→80) taken 17 times.
✓ Branch 9 (79→83) taken 7 times.
✓ Branch 10 (80→81) taken 17 times.
✓ Branch 12 (81→82) taken 17 times.
✗ Branch 13 (81→83) not taken.
✓ Branch 14 (84→85) taken 24 times.
✗ Branch 15 (84→86) not taken.
✓ Branch 16 (86→7) taken 17 times.
✓ Branch 17 (86→135) taken 7 times.
✗ Branch 18 (178→179) not taken.
✗ Branch 19 (178→180) not taken.
24 while(!parser.isEndOfFile() && !parser.isMatch("]") && parse_toml_isParse(data)){ //Let's parse the values of the Variable
332
3/6
✓ Branch 0 (7→8) taken 17 times.
✓ Branch 2 (8→9) taken 17 times.
✗ Branch 4 (10→11) not taken.
✓ Branch 5 (10→16) taken 17 times.
✗ Branch 6 (11→12) not taken.
✗ Branch 8 (12→13) not taken.
17 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
333 else{
334
1/1
✓ Branch 0 (17→18) taken 17 times.
17 ConfigNode * subValue = var.addChild();
335
2/2
✓ Branch 0 (20→21) taken 3 times.
✓ Branch 1 (20→41) taken 14 times.
17 if(parse_tomlCompactDico(*subValue, data)){
336
11/18
✓ Branch 0 (21→22) taken 3 times.
✓ Branch 2 (22→23) taken 3 times.
✓ Branch 4 (23→24) taken 2 times.
✓ Branch 5 (23→28) taken 1 times.
✓ Branch 6 (24→25) taken 2 times.
✓ Branch 8 (25→26) taken 2 times.
✗ Branch 10 (26→27) not taken.
✓ Branch 11 (26→28) taken 2 times.
✓ Branch 12 (29→30) taken 2 times.
✓ Branch 13 (29→31) taken 1 times.
✓ Branch 14 (31→32) taken 3 times.
✗ Branch 15 (31→33) not taken.
✗ Branch 16 (33→34) not taken.
✓ Branch 17 (33→74) taken 3 times.
✗ Branch 18 (150→151) not taken.
✗ Branch 19 (150→152) not taken.
✗ Branch 20 (154→155) not taken.
✗ Branch 21 (154→156) not taken.
3 if(!parser.isMatch(",") && !parser.isMatchRewind("]")){ //We expect one element or a comma to add more
337 std::cerr << "parse_toml_varValue : expect ',' or ']' for unclosed list of values at " << parser.getLocation() << std::endl;
338 parse_toml_stopParsing(data);
339 return false;
340 }
341
2/2
✓ Branch 0 (42→43) taken 13 times.
✓ Branch 1 (42→63) taken 1 times.
14 }else if(parse_toml_varValue(*subValue, data)){
342
13/18
✓ Branch 0 (43→44) taken 13 times.
✓ Branch 2 (44→45) taken 13 times.
✓ Branch 4 (45→46) taken 5 times.
✓ Branch 5 (45→50) taken 8 times.
✓ Branch 6 (46→47) taken 5 times.
✓ Branch 8 (47→48) taken 5 times.
✓ Branch 10 (48→49) taken 1 times.
✓ Branch 11 (48→50) taken 4 times.
✓ Branch 12 (51→52) taken 5 times.
✓ Branch 13 (51→53) taken 8 times.
✓ Branch 14 (53→54) taken 13 times.
✗ Branch 15 (53→55) not taken.
✓ Branch 16 (55→56) taken 1 times.
✓ Branch 17 (55→74) taken 12 times.
✗ Branch 18 (161→162) not taken.
✗ Branch 19 (161→163) not taken.
✗ Branch 20 (165→166) not taken.
✗ Branch 21 (165→167) not taken.
13 if(!parser.isMatch(",") && !parser.isMatchRewind("]")){ //We expect one element or a comma to add more
343
3/3
✓ Branch 0 (57→58) taken 1 times.
✓ Branch 2 (58→59) taken 1 times.
✓ Branch 4 (59→60) taken 1 times.
1 std::cerr << "parse_toml_varValue : expect ',' or ']' for unclosed list of values at " << parser.getLocation() << std::endl;
344 1 parse_toml_stopParsing(data);
345 1 return false;
346 }
347 }else{
348
3/4
✓ Branch 0 (63→64) taken 1 times.
✓ Branch 2 (64→65) taken 1 times.
✓ Branch 4 (66→67) taken 1 times.
✗ Branch 5 (66→74) not taken.
1 if(!parser.isMatch("]")){
349
3/3
✓ Branch 0 (68→69) taken 1 times.
✓ Branch 2 (69→70) taken 1 times.
✓ Branch 4 (70→71) taken 1 times.
1 std::cerr << "parse_toml_varValue : missing ']' token to close empty list of value at " << parser.getLocation() << std::endl;
350 1 parse_toml_stopParsing(data);
351 1 return false;
352 }
353 }
354 }
355 }
356 }else{
357
1/1
✓ Branch 0 (87→88) taken 50 times.
50 PString strValue("");
358
3/3
✓ Branch 0 (88→89) taken 50 times.
✓ Branch 2 (89→90) taken 27 times.
✓ Branch 3 (89→91) taken 23 times.
50 if(parse_generic_string(strValue, parser)){
359
1/1
✓ Branch 0 (90→129) taken 27 times.
27 var.setValue(strValue);
360
4/4
✓ Branch 0 (91→92) taken 23 times.
✓ Branch 2 (92→93) taken 23 times.
✓ Branch 4 (94→95) taken 2 times.
✓ Branch 5 (94→99) taken 21 times.
23 }else if(parser.isMatch("true")){
361
2/2
✓ Branch 0 (95→96) taken 2 times.
✓ Branch 2 (96→97) taken 2 times.
2 var.setValue("true");
362
4/4
✓ Branch 0 (99→100) taken 21 times.
✓ Branch 2 (100→101) taken 21 times.
✓ Branch 4 (102→103) taken 2 times.
✓ Branch 5 (102→107) taken 19 times.
21 }else if(parser.isMatch("false")){
363
2/2
✓ Branch 0 (103→104) taken 2 times.
✓ Branch 2 (104→105) taken 2 times.
2 var.setValue("false");
364 }else{
365
2/2
✓ Branch 0 (107→108) taken 19 times.
✓ Branch 2 (108→109) taken 19 times.
19 PString valueNumber(parser.getStrComposedOf("0123456789.-+e"));
366
3/3
✓ Branch 0 (110→111) taken 19 times.
✓ Branch 2 (111→112) taken 15 times.
✓ Branch 3 (111→113) taken 4 times.
19 if(valueNumber != ""){
367
1/1
✓ Branch 0 (112→123) taken 15 times.
15 var.setValue(valueNumber);
368 }else{
369
7/7
✓ Branch 0 (113→114) taken 4 times.
✓ Branch 2 (114→115) taken 4 times.
✓ Branch 4 (115→116) taken 4 times.
✓ Branch 6 (116→117) taken 4 times.
✓ Branch 8 (117→118) taken 4 times.
✓ Branch 10 (118→119) taken 4 times.
✓ Branch 12 (119→120) taken 4 times.
4 std::cerr << "parse_toml_varValue : missing value of variable '"<<var.getName()<<"' at " << parser.getLocation() << std::endl;
370
1/1
✓ Branch 0 (121→122) taken 4 times.
4 parse_toml_stopParsing(data);
371 4 return false;
372 }
373
2/2
✓ Branch 0 (125→126) taken 15 times.
✓ Branch 1 (125→128) taken 4 times.
19 }
374
2/2
✓ Branch 0 (131→132) taken 46 times.
✓ Branch 1 (131→134) taken 4 times.
50 }
375 53 return true;
376 }
377
378 ///Parse a toml var name
379 /** @param[out] parent : parent ConfigNode to be used
380 * @param[out] data : parser data to be used
381 * @return true on success, false otherwise
382 */
383 65 bool parse_toml_var(ConfigNode & parent, PTomlParserData & data){
384 65 PFileParser & parser = data.parser;
385
1/1
✓ Branch 0 (2→3) taken 65 times.
65 PString varName("");
386
3/3
✓ Branch 0 (3→4) taken 65 times.
✓ Branch 2 (4→5) taken 15 times.
✓ Branch 3 (4→6) taken 50 times.
65 if(!parse_toml_varName(varName, parser)){return false;}
387
4/4
✓ Branch 0 (6→7) taken 50 times.
✓ Branch 2 (7→8) taken 50 times.
✓ Branch 4 (9→10) taken 2 times.
✓ Branch 5 (9→19) taken 48 times.
50 if(!parser.isMatch("=")){
388
6/6
✓ Branch 0 (10→11) taken 2 times.
✓ Branch 2 (11→12) taken 2 times.
✓ Branch 4 (12→13) taken 2 times.
✓ Branch 6 (13→14) taken 2 times.
✓ Branch 8 (14→15) taken 2 times.
✓ Branch 10 (15→16) taken 2 times.
2 std::cerr << "parse_toml_var : missing '=' token to define value of variable '"<<varName<<"' at " << parser.getLocation() << std::endl;
389
1/1
✓ Branch 0 (17→18) taken 2 times.
2 parse_toml_stopParsing(data);
390 2 return false;
391 }
392
1/1
✓ Branch 0 (19→20) taken 48 times.
48 ConfigNode * var = parent.addChild(varName);
393
2/2
✓ Branch 0 (20→21) taken 48 times.
✓ Branch 2 (21→22) taken 48 times.
48 var->setLineCol(parser.getLocation());
394 48 bool b(true);
395
3/3
✓ Branch 0 (23→24) taken 48 times.
✓ Branch 2 (24→25) taken 45 times.
✓ Branch 3 (24→28) taken 3 times.
48 if(parse_tomlCompactDico(*var, data)){}
396
3/3
✓ Branch 0 (25→26) taken 45 times.
✓ Branch 2 (26→27) taken 5 times.
✓ Branch 3 (26→28) taken 40 times.
45 else if(parse_toml_varValue(*var, data)){}
397 5 else{b = false;}
398 48 return b;
399 65 }
400
401 ///Get the parent dictionary by respect to the vecDicoName
402 /** @param parent : main DicoValue
403 * @param vecDicoName : name of the parent DicoValue of the following attributes
404 * @return pointer to the parent DicoValue of the following attributes
405 */
406 20 ConfigNode * parse_get_parent_dico(ConfigNode & parent, const PVecString & vecDicoName){
407 20 ConfigNode * output = &parent;
408
2/2
✓ Branch 0 (28→3) taken 21 times.
✓ Branch 1 (28→29) taken 20 times.
82 for(PVecString::const_iterator it(vecDicoName.begin()); it != vecDicoName.end(); ++it){
409
3/3
✓ Branch 0 (5→6) taken 21 times.
✓ Branch 2 (6→7) taken 21 times.
✓ Branch 4 (7→8) taken 21 times.
42 ConfigNode * next = output->getChild(it->eraseFirstLastChar("\"'"));
410
2/2
✓ Branch 0 (10→11) taken 20 times.
✓ Branch 1 (10→15) taken 1 times.
21 if(next == NULL){
411
1/1
✓ Branch 0 (13→14) taken 20 times.
40 next = output->addChild(*it);
412 }
413 21 output = next;
414
1/1
✓ Branch 0 (17→18) taken 21 times.
42 output->setName(*it);
415 }
416 20 return output;
417 }
418
419 ///Parse a dico definition
420 /** @param[out] parent : parent ConfigNode
421 * @param[out] data : parser data to be used
422 * @return true on success, false otherwise
423 */
424 21 bool parse_toml_dico_def(ConfigNode & parent, PTomlParserData & data){
425 21 PFileParser & parser = data.parser;
426
4/4
✓ Branch 0 (2→3) taken 21 times.
✓ Branch 2 (3→4) taken 21 times.
✓ Branch 4 (5→6) taken 3 times.
✓ Branch 5 (5→7) taken 18 times.
21 if(!parser.isMatch("[")){return false;}
427
2/2
✓ Branch 0 (7→8) taken 18 times.
✓ Branch 2 (8→9) taken 18 times.
18 PString dicoName(parser.getUntilKeyWithoutPatern("]"));
428
1/1
✓ Branch 0 (10→11) taken 18 times.
18 PVecString vecDicoName = dicoName.split('.');
429
1/1
✓ Branch 0 (11→12) taken 18 times.
18 ConfigNode * dicoDef = parse_get_parent_dico(parent, vecDicoName);
430
2/2
✓ Branch 0 (12→13) taken 18 times.
✓ Branch 2 (13→14) taken 18 times.
18 dicoDef->setLineCol(parser.getLocation());
431
14/16
✓ Branch 0 (28→29) taken 62 times.
✓ Branch 2 (29→30) taken 46 times.
✓ Branch 3 (29→36) taken 16 times.
✓ Branch 4 (30→31) taken 46 times.
✓ Branch 6 (31→32) taken 45 times.
✓ Branch 7 (31→36) taken 1 times.
✓ Branch 8 (32→33) taken 45 times.
✓ Branch 10 (33→34) taken 45 times.
✓ Branch 12 (34→35) taken 44 times.
✓ Branch 13 (34→36) taken 1 times.
✓ Branch 14 (37→38) taken 45 times.
✓ Branch 15 (37→39) taken 17 times.
✓ Branch 16 (39→16) taken 44 times.
✓ Branch 17 (39→40) taken 18 times.
✗ Branch 18 (60→61) not taken.
✗ Branch 19 (60→62) not taken.
62 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatchRewind("[")){ //Let's parse the vatiables of the Dico
432
6/6
✓ Branch 0 (16→17) taken 44 times.
✓ Branch 2 (17→18) taken 44 times.
✓ Branch 4 (19→20) taken 1 times.
✓ Branch 5 (19→25) taken 43 times.
✓ Branch 6 (20→21) taken 1 times.
✓ Branch 8 (21→22) taken 1 times.
44 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
433
1/1
✓ Branch 0 (25→26) taken 43 times.
43 else if(parse_toml_var(*dicoDef, data)){}
434 }
435 18 return true;
436 18 }
437
438 ///Parse a dico definition
439 /** @param[out] parent : parent ConfigNode
440 * @param[out] data : parser data to be used
441 * @return true on success, false otherwise
442 */
443 23 bool parse_toml_table_def(ConfigNode & parent, PTomlParserData & data){
444 23 PFileParser & parser = data.parser;
445
4/4
✓ Branch 0 (2→3) taken 23 times.
✓ Branch 2 (3→4) taken 23 times.
✓ Branch 4 (5→6) taken 21 times.
✓ Branch 5 (5→7) taken 2 times.
23 if(!parser.isMatch("[[")){return false;}
446
2/2
✓ Branch 0 (7→8) taken 2 times.
✓ Branch 2 (8→9) taken 2 times.
2 PString dicoName(parser.getUntilKeyWithoutPatern("]]"));
447
1/1
✓ Branch 0 (10→11) taken 2 times.
2 PVecString vecDicoName = dicoName.split('.');
448
1/1
✓ Branch 0 (11→12) taken 2 times.
2 ConfigNode * dicoDef = parse_get_parent_dico(parent, vecDicoName);
449
2/2
✓ Branch 0 (12→13) taken 2 times.
✓ Branch 2 (13→14) taken 2 times.
2 dicoDef->setLineCol(parser.getLocation());
450
2/2
✓ Branch 0 (15→16) taken 2 times.
✓ Branch 2 (16→17) taken 2 times.
2 ConfigNode * table = dicoDef->addChild();
451
2/2
✓ Branch 0 (18→19) taken 2 times.
✓ Branch 2 (19→20) taken 2 times.
2 table->setLineCol(parser.getLocation());
452
13/16
✓ Branch 0 (34→35) taken 7 times.
✓ Branch 2 (35→36) taken 6 times.
✓ Branch 3 (35→42) taken 1 times.
✓ Branch 4 (36→37) taken 6 times.
✓ Branch 6 (37→38) taken 6 times.
✗ Branch 7 (37→42) not taken.
✓ Branch 8 (38→39) taken 6 times.
✓ Branch 10 (39→40) taken 6 times.
✓ Branch 12 (40→41) taken 5 times.
✓ Branch 13 (40→42) taken 1 times.
✓ Branch 14 (43→44) taken 6 times.
✓ Branch 15 (43→45) taken 1 times.
✓ Branch 16 (45→22) taken 5 times.
✓ Branch 17 (45→46) taken 2 times.
✗ Branch 18 (72→73) not taken.
✗ Branch 19 (72→74) not taken.
7 while(!parser.isEndOfFile() && parse_toml_isParse(data) && !parser.isMatchRewind("[")){ //Let's parse the vatiables of the Dico
453
3/6
✓ Branch 0 (22→23) taken 5 times.
✓ Branch 2 (23→24) taken 5 times.
✗ Branch 4 (25→26) not taken.
✓ Branch 5 (25→31) taken 5 times.
✗ Branch 6 (26→27) not taken.
✗ Branch 8 (27→28) not taken.
5 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
454
1/1
✓ Branch 0 (31→32) taken 5 times.
5 else if(parse_toml_var(*table, data)){}
455 }
456 2 return true;
457 2 }
458
459 ///Parse a toml file and update the given ConfigNode
460 /** @param[out] node : ConfigNode to be updated
461 * @param[out] data : parser data to be used
462 * @return true on success, false otherwise
463 */
464 20 bool parser_toml_fileParser(ConfigNode & node, PTomlParserData & data){
465 20 PFileParser & parser = data.parser;
466
2/2
✓ Branch 0 (2→3) taken 20 times.
✓ Branch 2 (3→4) taken 20 times.
20 parser.getStrComposedOf(" \t\n"); //Skip all blank characters
467
6/6
✓ Branch 0 (39→40) taken 27 times.
✓ Branch 1 (39→43) taken 18 times.
✓ Branch 2 (41→42) taken 25 times.
✓ Branch 3 (41→43) taken 2 times.
✓ Branch 4 (44→7) taken 25 times.
✓ Branch 5 (44→45) taken 20 times.
45 while(!parser.isEndOfFile() && parse_toml_isParse(data)){
468
6/6
✓ Branch 0 (7→8) taken 25 times.
✓ Branch 2 (8→9) taken 25 times.
✓ Branch 4 (10→11) taken 2 times.
✓ Branch 5 (10→16) taken 23 times.
✓ Branch 6 (11→12) taken 2 times.
✓ Branch 8 (12→13) taken 2 times.
25 if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");}
469
2/2
✓ Branch 0 (17→18) taken 21 times.
✓ Branch 1 (17→37) taken 2 times.
23 else if(parse_toml_table_def(node, data)){}
470
2/2
✓ Branch 0 (19→20) taken 3 times.
✓ Branch 1 (19→37) taken 18 times.
21 else if(parse_toml_dico_def(node, data)){}
471
2/2
✓ Branch 0 (21→22) taken 2 times.
✓ Branch 1 (21→37) taken 1 times.
3 else if(parse_toml_var(node, data)){}
472 else{
473
1/1
✓ Branch 0 (22→23) taken 2 times.
2 PString nextToken(parser.getNextToken());
474
2/2
✓ Branch 0 (24→25) taken 1 times.
✓ Branch 1 (24→35) taken 1 times.
2 if(nextToken.size() != 0lu){ //If the token is empty, we are at the end of the file
475
4/4
✓ Branch 0 (25→26) taken 1 times.
✓ Branch 2 (26→27) taken 1 times.
✓ Branch 4 (27→28) taken 1 times.
✓ Branch 6 (28→29) taken 1 times.
1 std::cerr << "parser_toml_fileParser : error at " << parser.getLocation() << std::endl;
476
4/4
✓ Branch 0 (30→31) taken 1 times.
✓ Branch 2 (31→32) taken 1 times.
✓ Branch 4 (32→33) taken 1 times.
✓ Branch 6 (33→34) taken 1 times.
1 std::cerr << "\tunexpected token '"<<nextToken<<"'" << std::endl;
477
1/1
✓ Branch 0 (34→35) taken 1 times.
1 parse_toml_stopParsing(data);
478 }
479 2 }
480 }
481 20 return data.isRun;
482 }
483
484 ///Parse a toml file
485 /** @param[out] node : ConfigNode to be updated
486 * @param fileName : name of the file to be parsed
487 * @return true on success, false otherwise
488 */
489 19 bool parser_toml(ConfigNode & node, const PPath & fileName){
490
1/1
✓ Branch 0 (2→3) taken 19 times.
19 PTomlParserData data(default_PTomlParserData());
491 19 PFileParser & parser = data.parser;
492
2/2
✓ Branch 0 (3→4) taken 19 times.
✓ Branch 2 (4→5) taken 19 times.
19 parser.setWhiteSpace(" \n\t");
493
2/2
✓ Branch 0 (6→7) taken 19 times.
✓ Branch 2 (7→8) taken 19 times.
19 parser.setSeparator(":-'\",{}[]>|");
494
1/1
✓ Branch 0 (9→10) taken 19 times.
19 parser.setEscapeChar('\\');
495
3/3
✓ Branch 0 (10→11) taken 19 times.
✓ Branch 2 (11→12) taken 1 times.
✓ Branch 3 (11→17) taken 18 times.
19 if(!parser.open(fileName)){
496
4/4
✓ Branch 0 (12→13) taken 1 times.
✓ Branch 2 (13→14) taken 1 times.
✓ Branch 4 (14→15) taken 1 times.
✓ Branch 6 (15→16) taken 1 times.
1 std::cerr << "parser_toml : cannot open file '"<<fileName<<"'" << std::endl;
497 1 return false;
498 }
499
1/1
✓ Branch 0 (17→18) taken 18 times.
18 node.setFileName(fileName);
500
1/1
✓ Branch 0 (18→19) taken 18 times.
18 bool b(parser_toml_fileParser(node, data));
501 18 return b;
502 19 }
503
504 ///Parse a toml string
505 /** @param[out] node : ConfigNode to be updated
506 * @param fileName : name of the file to be parsed
507 * @return true on success, false otherwise
508 */
509 2 bool parser_tomlString(ConfigNode & node, const PString & fileContent){
510
1/1
✓ Branch 0 (2→3) taken 2 times.
2 PTomlParserData data(default_PTomlParserData());
511 2 PFileParser & parser = data.parser;
512
2/2
✓ Branch 0 (3→4) taken 2 times.
✓ Branch 2 (4→5) taken 2 times.
2 parser.setWhiteSpace(" \n\t");
513
2/2
✓ Branch 0 (6→7) taken 2 times.
✓ Branch 2 (7→8) taken 2 times.
2 parser.setSeparator(":-'\",{}[]>|");
514
1/1
✓ Branch 0 (9→10) taken 2 times.
2 parser.setEscapeChar('\\');
515
1/1
✓ Branch 0 (10→11) taken 2 times.
2 parser.setFileContent(fileContent);
516
1/1
✓ Branch 0 (11→12) taken 2 times.
2 bool b(parser_toml_fileParser(node, data));
517 2 return b;
518 2 }
519
520
521
522
523