GCC Code Coverage Report


Directory: ./
File: src/parser_json.cpp
Date: 2025-11-27 16:44:16
Exec Total Coverage
Lines: 151 159 95.0%
Functions: 12 12 100.0%
Branches: 278 328 84.8%

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_json.h"
9
10 ///@brief Data used to parse a toml file
11 struct PJsonParserData{
12 ///File parser to be used
13 PFileParser parser;
14 ///True to continue the parsing, false to stop
15 bool isRun{true};
16 };
17
18 bool parser_json_list(ConfigNode & node, PJsonParserData & data);
19 bool parser_json_map(ConfigNode & node, PJsonParserData & data);
20
21 ///Print the parsing error
22 /** @param[out] parser : parser to be used
23 * @param[out] isRunning : true to continue the parsing, false to stop it
24 * @param errorMsg : error message
25 * @return true and stop the parsing with isRunning
26 */
27 11 bool parser_jsonErrorAt(PJsonParserData & data, const PString & errorMsg){
28 11 data.isRun = false;
29
3/3
✓ Branch 0 (3→4) taken 11 times.
✓ Branch 2 (4→5) taken 11 times.
✓ Branch 4 (5→6) taken 11 times.
11 std::cerr << "parser_jsonErrorAt : " << data.parser.getLocation() << std::endl;
30 11 std::cerr << "\t" << errorMsg << std::endl;
31
4/4
✓ Branch 0 (11→12) taken 11 times.
✓ Branch 2 (12→13) taken 11 times.
✓ Branch 4 (13→14) taken 11 times.
✓ Branch 6 (14→15) taken 11 times.
11 std::cerr << "Wrong token : '"<<data.parser.getNextToken()<<"'" << std::endl;
32 11 return true;
33 }
34
35 ///Parse a JSON string
36 /** @param[out] str : parsed string
37 * @param[out] data : parsing data
38 * @return true on success, false otherwise
39 */
40 46 bool parser_jsonString(PString & str, PJsonParserData & data){
41
4/4
✓ Branch 0 (2→3) taken 46 times.
✓ Branch 2 (3→4) taken 46 times.
✓ Branch 4 (5→6) taken 41 times.
✓ Branch 5 (5→14) taken 5 times.
46 if(data.parser.isMatch("\"")){
42
4/4
✓ Branch 0 (6→7) taken 41 times.
✓ Branch 2 (7→8) taken 41 times.
✓ Branch 4 (8→9) taken 41 times.
✓ Branch 6 (9→10) taken 41 times.
41 str = "\"" + data.parser.getUntilKey("\"");
43 41 return true;
44 }
45 5 return false;
46 }
47
48
49 ///Parse a json
50 /** @param[out] node : ConfigNode of values
51 * @param data : PJsonParserData to be used
52 * @return true on success, false otherwise
53 */
54 28 bool parser_json_value(PString & value, PJsonParserData & data){
55 28 PFileParser & parser = data.parser;
56 28 parser.pushPosition();
57
2/2
✓ Branch 0 (4→5) taken 5 times.
✓ Branch 1 (4→15) taken 23 times.
28 if(!parser_jsonString(value, data)){
58
3/3
✓ Branch 0 (5→6) taken 5 times.
✓ Branch 2 (6→7) taken 5 times.
✓ Branch 4 (7→8) taken 5 times.
5 value = parser.getStrComposedOf("abcdefghijklmnopqsrtuvwxyzABCDEFGHIJKLMNOPQSRTUVWXYZ0123456789._-+");
59
2/2
✓ Branch 0 (11→12) taken 3 times.
✓ Branch 1 (11→15) taken 2 times.
5 if(value == ""){
60 3 parser.popPosition();
61 3 parser.clearPosition();
62 3 return false;
63 }
64 }
65
4/4
✓ Branch 0 (15→16) taken 25 times.
✓ Branch 2 (16→17) taken 25 times.
✓ Branch 4 (18→19) taken 8 times.
✓ Branch 5 (18→21) taken 17 times.
25 if(parser.isMatchRewind(":")){
66 8 parser.popPosition();
67 8 return false;
68 }
69 17 parser.clearPosition();
70 17 return true;
71 }
72
73 ///Parse a json
74 /** @param[out] node : ConfigNode of values
75 * @param data : PJsonParserData to be used
76 * @return true on success, false otherwise
77 */
78 24 bool parser_json_value(ConfigNode & node, PJsonParserData & data){
79
1/1
✓ Branch 0 (2→3) taken 24 times.
24 PString value;
80
3/3
✓ Branch 0 (3→4) taken 24 times.
✓ Branch 2 (4→5) taken 13 times.
✓ Branch 3 (4→10) taken 11 times.
24 if(parser_json_value(value, data)){
81
1/1
✓ Branch 0 (5→6) taken 13 times.
13 node.setValue(value);
82
2/2
✓ Branch 0 (6→7) taken 13 times.
✓ Branch 2 (7→8) taken 13 times.
13 node.setLineCol(data.parser.getLocation());
83 13 return true;
84 }
85 11 return false;
86 24 }
87
88 ///Parse a json
89 /** @param[out] node : ConfigNode of values
90 * @param data : PJsonParserData to be used
91 * @return true on success, false otherwise
92 */
93 18 bool parser_json_key(ConfigNode & node, PJsonParserData & data){
94
1/1
✓ Branch 0 (2→3) taken 18 times.
18 PString key;
95
2/3
✓ Branch 0 (3→4) taken 18 times.
✓ Branch 2 (4→5) taken 18 times.
✗ Branch 3 (4→64) not taken.
18 if(parser_jsonString(key, data)){
96
1/1
✓ Branch 0 (5→6) taken 18 times.
18 ConfigNode * child = node.addChild(key);
97
2/2
✓ Branch 0 (6→7) taken 2 times.
✓ Branch 1 (6→32) taken 16 times.
18 if(child == NULL){ //If the child is NULL, there is already a child named key
98
3/3
✓ Branch 0 (7→8) taken 2 times.
✓ Branch 2 (8→9) taken 2 times.
✓ Branch 4 (9→10) taken 2 times.
2 ConfigNode * prevChild = node.getChild(key.eraseFirstLastChar("\"'"));
99
1/1
✓ Branch 0 (12→13) taken 2 times.
2 std::stringstream location;
100
1/2
✓ Branch 0 (13→14) taken 2 times.
✗ Branch 1 (13→18) not taken.
2 if(prevChild != NULL){
101
2/2
✓ Branch 0 (14→15) taken 2 times.
✓ Branch 2 (15→16) taken 2 times.
2 location << prevChild->getLocation();
102 }
103
6/6
✓ Branch 0 (18→19) taken 2 times.
✓ Branch 2 (19→20) taken 2 times.
✓ Branch 4 (20→21) taken 2 times.
✓ Branch 6 (21→22) taken 2 times.
✓ Branch 8 (22→23) taken 2 times.
✓ Branch 10 (23→24) taken 2 times.
2 return parser_jsonErrorAt(data, "key '"+key+"' already defined at " + location.str());
104 2 }
105
3/4
✓ Branch 0 (32→33) taken 16 times.
✓ Branch 2 (33→34) taken 16 times.
✓ Branch 4 (35→36) taken 16 times.
✗ Branch 5 (35→55) not taken.
16 if(data.parser.isMatch(":")){
106
2/2
✓ Branch 0 (36→37) taken 16 times.
✓ Branch 2 (37→38) taken 16 times.
16 child->setLineCol(data.parser.getLocation());
107 //Let's parse the value of this child (map or list or value)
108
3/3
✓ Branch 0 (39→40) taken 16 times.
✓ Branch 2 (40→41) taken 13 times.
✓ Branch 3 (40→54) taken 3 times.
16 if(parser_json_map(*child, data)){}
109
3/3
✓ Branch 0 (41→42) taken 13 times.
✓ Branch 2 (42→43) taken 12 times.
✓ Branch 3 (42→54) taken 1 times.
13 else if(parser_json_list(*child, data)){}
110
3/3
✓ Branch 0 (43→44) taken 12 times.
✓ Branch 2 (44→45) taken 1 times.
✓ Branch 3 (44→54) taken 11 times.
12 else if(parser_json_value(*child, data)){}
111 else{
112
4/4
✓ Branch 0 (45→46) taken 1 times.
✓ Branch 2 (46→47) taken 1 times.
✓ Branch 4 (47→48) taken 1 times.
✓ Branch 6 (48→49) taken 1 times.
1 return parser_jsonErrorAt(data, "Cannot parse json value of key '"+key+"'");
113 }
114 15 return data.isRun;
115 }else{
116 return parser_jsonErrorAt(data, "Expect ':' after key '"+key+"'");
117 }
118 }else{
119 return parser_jsonErrorAt(data, "Expect \"key\"': ...");
120 }
121 return false;
122 18 }
123
124 ///Parse a json
125 /** @param[out] node : ConfigNode of values
126 * @param data : PJsonParserData to be used
127 * @return true on success, false otherwise
128 */
129 33 bool parser_json_map(ConfigNode & node, PJsonParserData & data){
130 33 PFileParser & parser = data.parser;
131
4/4
✓ Branch 0 (2→3) taken 33 times.
✓ Branch 2 (3→4) taken 33 times.
✓ Branch 4 (5→6) taken 30 times.
✓ Branch 5 (5→7) taken 3 times.
33 if(!parser.isMatch("{")){return false;}
132
2/2
✓ Branch 0 (7→8) taken 3 times.
✓ Branch 2 (8→9) taken 3 times.
3 node.setLineCol(parser.getLocation());
133
10/15
✓ Branch 0 (34→35) taken 9 times.
✓ Branch 2 (35→36) taken 9 times.
✗ Branch 3 (35→41) not taken.
✓ Branch 4 (36→37) taken 9 times.
✓ Branch 6 (37→38) taken 9 times.
✓ Branch 8 (38→39) taken 6 times.
✓ Branch 9 (38→41) taken 3 times.
✓ Branch 10 (39→40) taken 6 times.
✗ Branch 11 (39→41) not taken.
✓ Branch 12 (42→43) taken 9 times.
✗ Branch 13 (42→44) not taken.
✓ Branch 14 (44→11) taken 6 times.
✓ Branch 15 (44→45) taken 3 times.
✗ Branch 16 (65→66) not taken.
✗ Branch 17 (65→67) not taken.
12 while(!parser.isEndOfFile() && !parser.isMatch("}") && data.isRun){
134 //key:Map or key:list or key:value
135
1/2
✗ Branch 0 (12→13) not taken.
✓ Branch 1 (12→18) taken 6 times.
6 if(!parser_json_key(node, data)){
136 return parser_jsonErrorAt(data, "Expect \"key\"");
137 }
138
4/4
✓ Branch 0 (18→19) taken 6 times.
✓ Branch 2 (19→20) taken 6 times.
✓ Branch 4 (21→22) taken 3 times.
✓ Branch 5 (21→23) taken 3 times.
6 if(parser.isMatch(",")){}
139
3/4
✓ Branch 0 (23→24) taken 3 times.
✓ Branch 2 (24→25) taken 3 times.
✗ Branch 4 (26→27) not taken.
✓ Branch 5 (26→32) taken 3 times.
3 else if(parser.isMatchRewind("}")){}
140 else{
141 return parser_jsonErrorAt(data, "Expect ',' or '}' after key");
142 }
143 }
144 3 return data.isRun;
145 }
146
147 ///Parse a json
148 /** @param[out] node : ConfigNode of values
149 * @param data : PJsonParserData to be used
150 * @return true on success, false otherwise
151 */
152 30 bool parser_json_list(ConfigNode & node, PJsonParserData & data){
153 30 PFileParser & parser = data.parser;
154
4/4
✓ Branch 0 (2→3) taken 30 times.
✓ Branch 2 (3→4) taken 30 times.
✓ Branch 4 (5→6) taken 28 times.
✓ Branch 5 (5→7) taken 2 times.
30 if(!parser.isMatch("[")){return false;}
155
2/2
✓ Branch 0 (7→8) taken 2 times.
✓ Branch 2 (8→9) taken 2 times.
2 node.setLineCol(parser.getLocation());
156
10/15
✓ Branch 0 (44→45) taken 5 times.
✓ Branch 2 (45→46) taken 5 times.
✗ Branch 3 (45→51) not taken.
✓ Branch 4 (46→47) taken 5 times.
✓ Branch 6 (47→48) taken 5 times.
✓ Branch 8 (48→49) taken 4 times.
✓ Branch 9 (48→51) taken 1 times.
✓ Branch 10 (49→50) taken 4 times.
✗ Branch 11 (49→51) not taken.
✓ Branch 12 (52→53) taken 5 times.
✗ Branch 13 (52→54) not taken.
✓ Branch 14 (54→11) taken 4 times.
✓ Branch 15 (54→55) taken 1 times.
✗ Branch 16 (81→82) not taken.
✗ Branch 17 (81→83) not taken.
7 while(!parser.isEndOfFile() && !parser.isMatch("]") && data.isRun){
157 // On crée un enfant anonyme pour chaque élément du tableau
158
2/2
✓ Branch 0 (11→12) taken 4 times.
✓ Branch 2 (12→13) taken 4 times.
4 ConfigNode * child = node.addChild("");
159
1/2
✓ Branch 0 (15→16) taken 4 times.
✗ Branch 1 (15→28) not taken.
4 if(parser_json_map(*child, data)){}
160
1/2
✓ Branch 0 (17→18) taken 4 times.
✗ Branch 1 (17→28) not taken.
4 else if(parser_json_list(*child, data)){}
161 else{
162
1/1
✓ Branch 0 (18→19) taken 4 times.
4 PString value;
163
2/3
✓ Branch 0 (19→20) taken 4 times.
✓ Branch 2 (20→21) taken 4 times.
✗ Branch 3 (20→26) not taken.
4 if(parser_json_value(value, data)){
164
1/1
✓ Branch 0 (21→22) taken 4 times.
4 child->setValue(value);
165
2/2
✓ Branch 0 (22→23) taken 4 times.
✓ Branch 2 (23→24) taken 4 times.
4 child->setLineCol(data.parser.getLocation());
166 }
167 4 }
168
4/4
✓ Branch 0 (28→29) taken 4 times.
✓ Branch 2 (29→30) taken 4 times.
✓ Branch 4 (31→32) taken 2 times.
✓ Branch 5 (31→33) taken 2 times.
4 if(parser.isMatch(",")){}
169
4/4
✓ Branch 0 (33→34) taken 2 times.
✓ Branch 2 (34→35) taken 2 times.
✓ Branch 4 (36→37) taken 1 times.
✓ Branch 5 (36→42) taken 1 times.
2 else if(parser.isMatchRewind("]")){}
170 else{
171
2/2
✓ Branch 0 (37→38) taken 1 times.
✓ Branch 2 (38→39) taken 1 times.
1 return parser_jsonErrorAt(data, "Expect ',' or ']' after value");
172 }
173 }
174 1 return data.isRun;
175 }
176
177 ///Parse a json file
178 /** @param[out] node : ConfigNode of values
179 * @param data : PJsonParserData to be used
180 * @return true on success, false otherwise
181 */
182 14 bool parser_json_fileParser(ConfigNode & node, PJsonParserData & data){
183 14 PFileParser & parser = data.parser;
184
2/2
✓ Branch 0 (2→3) taken 14 times.
✓ Branch 2 (3→4) taken 14 times.
14 parser.getStrComposedOf(" \t\n"); //Skip all blank characters
185
4/4
✓ Branch 0 (6→7) taken 14 times.
✓ Branch 2 (7→8) taken 14 times.
✓ Branch 4 (9→10) taken 1 times.
✓ Branch 5 (9→15) taken 13 times.
14 if(!parser.isMatch("{")){ //It has to start as JSON
186
2/2
✓ Branch 0 (10→11) taken 1 times.
✓ Branch 2 (11→12) taken 1 times.
1 return !parser_jsonErrorAt(data, "JSON configuration has to start with a {");
187 }
188
2/2
✓ Branch 0 (15→16) taken 13 times.
✓ Branch 2 (16→17) taken 13 times.
13 node.setLineCol(data.parser.getLocation());
189 //Call the Node Parsing
190 //Map or list or value or set of keys
191
1/2
✓ Branch 0 (19→20) taken 13 times.
✗ Branch 1 (19→59) not taken.
13 if(parser_json_map(node, data)){}
192
2/2
✓ Branch 0 (21→22) taken 12 times.
✓ Branch 1 (21→59) taken 1 times.
13 else if(parser_json_list(node, data)){}
193
2/2
✓ Branch 0 (23→24) taken 10 times.
✓ Branch 1 (23→59) taken 2 times.
12 else if(parser_json_value(node, data)){}
194 else{
195
12/15
✓ Branch 0 (48→49) taken 19 times.
✓ Branch 2 (49→50) taken 18 times.
✓ Branch 3 (49→55) taken 1 times.
✓ Branch 4 (50→51) taken 18 times.
✓ Branch 6 (51→52) taken 18 times.
✓ Branch 8 (52→53) taken 12 times.
✓ Branch 9 (52→55) taken 6 times.
✓ Branch 10 (53→54) taken 12 times.
✗ Branch 11 (53→55) not taken.
✓ Branch 12 (56→57) taken 18 times.
✓ Branch 13 (56→58) taken 1 times.
✓ Branch 14 (58→25) taken 12 times.
✓ Branch 15 (58→59) taken 7 times.
✗ Branch 16 (95→96) not taken.
✗ Branch 17 (95→97) not taken.
29 while(!parser.isEndOfFile() && !parser.isMatchRewind("}") && data.isRun){
196 //key:Map or key:list or key:value
197
1/2
✗ Branch 0 (26→27) not taken.
✓ Branch 1 (26→32) taken 12 times.
12 if(!parser_json_key(node, data)){
198 return !parser_jsonErrorAt(data, "Expect \"key\"");
199 }
200
4/4
✓ Branch 0 (32→33) taken 12 times.
✓ Branch 2 (33→34) taken 12 times.
✓ Branch 4 (35→36) taken 4 times.
✓ Branch 5 (35→37) taken 8 times.
12 if(parser.isMatch(",")){}
201
4/4
✓ Branch 0 (37→38) taken 8 times.
✓ Branch 2 (38→39) taken 8 times.
✓ Branch 4 (40→41) taken 3 times.
✓ Branch 5 (40→46) taken 5 times.
8 else if(parser.isMatchRewind("}")){}
202 else{
203
2/2
✓ Branch 0 (41→42) taken 3 times.
✓ Branch 2 (42→43) taken 3 times.
3 return !parser_jsonErrorAt(data, "Expect ',' or '}' after key");
204 }
205 }
206 }
207
208
4/4
✓ Branch 0 (59→60) taken 10 times.
✓ Branch 2 (60→61) taken 10 times.
✓ Branch 4 (62→63) taken 3 times.
✓ Branch 5 (62→68) taken 7 times.
10 if(!parser.isMatch("}")){ //It has to start as JSON
209
2/2
✓ Branch 0 (63→64) taken 3 times.
✓ Branch 2 (64→65) taken 3 times.
3 return !parser_jsonErrorAt(data, "JSON configuration has to end with a }");
210 }
211 7 return data.isRun;
212 }
213
214 ///Load a JSON file
215 /** @param[out] main : ConfigNode to be updated
216 * @param fileName : name of the file to be loaded
217 * @return true on success, false otherwise
218 */
219 1 bool parser_json(ConfigNode & main, const PPath & fileName){
220
1/1
✓ Branch 0 (2→3) taken 1 times.
1 PJsonParserData data;
221 1 PFileParser & parser = data.parser;
222
2/2
✓ Branch 0 (3→4) taken 1 times.
✓ Branch 2 (4→5) taken 1 times.
1 parser.setWhiteSpace(" \n\t");
223
2/2
✓ Branch 0 (6→7) taken 1 times.
✓ Branch 2 (7→8) taken 1 times.
1 parser.setSeparator(":-'\",{}[]>|");
224
1/1
✓ Branch 0 (9→10) taken 1 times.
1 parser.setEscapeChar('\\');
225
2/3
✓ Branch 0 (10→11) taken 1 times.
✗ Branch 2 (11→12) not taken.
✓ Branch 3 (11→17) taken 1 times.
1 if(!parser.open(fileName)){
226 std::cerr << "parser_json : cannot open file '"<<fileName<<"'" << std::endl;
227 return false;
228 }
229
1/1
✓ Branch 0 (17→18) taken 1 times.
1 main.setFileName(fileName);
230
1/1
✓ Branch 0 (18→19) taken 1 times.
1 bool b(parser_json_fileParser(main, data));
231 1 return b;
232 1 }
233
234 ///Load a JSON string
235 /** @param[out] main : ConfigNode to be updated
236 * @param fileContent : string to be loaded
237 * @return true on success, false otherwise
238 */
239 13 bool parser_jsonString(ConfigNode & main, const PString & fileContent){
240
1/1
✓ Branch 0 (2→3) taken 13 times.
13 PJsonParserData data;
241 13 PFileParser & parser = data.parser;
242
2/2
✓ Branch 0 (3→4) taken 13 times.
✓ Branch 2 (4→5) taken 13 times.
13 parser.setWhiteSpace(" \n\t");
243
2/2
✓ Branch 0 (6→7) taken 13 times.
✓ Branch 2 (7→8) taken 13 times.
13 parser.setSeparator(":-'\",{}[]>|");
244
1/1
✓ Branch 0 (9→10) taken 13 times.
13 parser.setEscapeChar('\\');
245
1/1
✓ Branch 0 (10→11) taken 13 times.
13 parser.setFileContent(fileContent);
246
1/1
✓ Branch 0 (11→12) taken 13 times.
13 bool b(parser_json_fileParser(main, data));
247 13 return b;
248 13 }
249
250
251 ///Convert the ConfigNode in a PString
252 /** @param node : ConfigNode to be saved
253 * @param indentation : indentation of the current ConfigNode
254 * @param baseIndentation : indentation character(s) to be used
255 * @param baseNewLine : new line character(s) to be used
256 * @param isInList : true if the dico value is in a list
257 * @return file content
258 */
259 18 PString toJsonSaveRecurse(const ConfigNode & node, const PString & indentation, const PString & baseIndentation, const PString & baseNewLine, bool isInList){
260
2/2
✓ Branch 0 (2→3) taken 18 times.
✓ Branch 2 (3→4) taken 18 times.
18 PString out(""), newIndentation(indentation);
261
1/1
✓ Branch 0 (4→5) taken 18 times.
18 const PString & name = node.getName();
262
7/7
✓ Branch 0 (5→6) taken 18 times.
✓ Branch 2 (6→7) taken 8 times.
✓ Branch 3 (6→8) taken 10 times.
✓ Branch 4 (7→8) taken 3 times.
✓ Branch 5 (7→9) taken 5 times.
✓ Branch 6 (10→11) taken 13 times.
✓ Branch 7 (10→15) taken 5 times.
18 if(name != "" || isInList){
263
2/2
✓ Branch 0 (11→12) taken 13 times.
✓ Branch 2 (12→13) taken 13 times.
13 newIndentation = indentation + baseIndentation;
264 }
265
1/1
✓ Branch 0 (15→16) taken 18 times.
18 const VecConfigNode & vecChild = node.getVecChild();
266
1/1
✓ Branch 0 (16→17) taken 18 times.
18 const MapConfigNode & mapChild = node.getMapChild();
267
2/2
✓ Branch 0 (18→19) taken 6 times.
✓ Branch 1 (18→79) taken 12 times.
18 if(mapChild.size() != 0lu){
268
10/10
✓ Branch 0 (19→20) taken 6 times.
✓ Branch 2 (20→21) taken 2 times.
✓ Branch 3 (20→35) taken 4 times.
✓ Branch 4 (21→22) taken 2 times.
✓ Branch 6 (22→23) taken 2 times.
✓ Branch 8 (23→24) taken 2 times.
✓ Branch 10 (24→25) taken 2 times.
✓ Branch 12 (25→26) taken 2 times.
✓ Branch 14 (26→27) taken 2 times.
✓ Branch 16 (27→28) taken 2 times.
6 if(name != ""){out += baseNewLine + indentation + name.addPrefixSuffix("\"","\"") + ": {";}
269
1/5
✗ Branch 0 (35→36) not taken.
✓ Branch 1 (35→42) taken 4 times.
✗ Branch 2 (36→37) not taken.
✗ Branch 4 (37→38) not taken.
✗ Branch 6 (38→39) not taken.
4 else if(isInList){out += baseNewLine+indentation+"{";}
270
1/1
✓ Branch 0 (42→43) taken 6 times.
6 PString comma("");
271
2/2
✓ Branch 0 (61→44) taken 10 times.
✓ Branch 1 (61→62) taken 6 times.
32 for(VecConfigNode::const_iterator it(vecChild.begin()); it != vecChild.end(); ++it){
272
1/1
✓ Branch 0 (44→45) taken 10 times.
10 out += comma;
273
2/2
✓ Branch 0 (47→48) taken 10 times.
✓ Branch 2 (48→49) taken 10 times.
10 out += toJsonSaveRecurse(**it, newIndentation, baseIndentation, baseNewLine, false);
274
1/1
✓ Branch 0 (50→51) taken 10 times.
10 comma = ",";
275 }
276
6/6
✓ Branch 0 (62→63) taken 6 times.
✓ Branch 2 (63→64) taken 2 times.
✓ Branch 3 (63→70) taken 4 times.
✓ Branch 4 (64→65) taken 2 times.
✓ Branch 6 (65→66) taken 2 times.
✓ Branch 8 (66→67) taken 2 times.
6 if(name != ""){out += baseNewLine+indentation+"}";}
277
1/5
✗ Branch 0 (70→71) not taken.
✓ Branch 1 (70→77) taken 4 times.
✗ Branch 2 (71→72) not taken.
✗ Branch 4 (72→73) not taken.
✗ Branch 6 (73→74) not taken.
4 else if(isInList){out += baseNewLine+indentation+"}";}
278
2/2
✓ Branch 0 (80→81) taken 1 times.
✓ Branch 1 (80→122) taken 11 times.
18 }else if(vecChild.size() != 0lu){
279
9/10
✓ Branch 0 (81→82) taken 1 times.
✓ Branch 2 (82→83) taken 1 times.
✗ Branch 3 (82→97) not taken.
✓ Branch 4 (83→84) taken 1 times.
✓ Branch 6 (84→85) taken 1 times.
✓ Branch 8 (85→86) taken 1 times.
✓ Branch 10 (86→87) taken 1 times.
✓ Branch 12 (87→88) taken 1 times.
✓ Branch 14 (88→89) taken 1 times.
✓ Branch 16 (89→90) taken 1 times.
1 if(name != ""){out += baseNewLine + indentation + name.addPrefixSuffix("\"","\"") + ": [";}
280
1/1
✓ Branch 0 (97→98) taken 1 times.
1 PString comma("");
281
2/2
✓ Branch 0 (116→99) taken 3 times.
✓ Branch 1 (116→117) taken 1 times.
8 for(VecConfigNode::const_iterator it(vecChild.begin()); it != vecChild.end(); ++it){
282
1/1
✓ Branch 0 (99→100) taken 3 times.
3 out += comma;
283
2/2
✓ Branch 0 (102→103) taken 3 times.
✓ Branch 2 (103→104) taken 3 times.
3 out += toJsonSaveRecurse(**it, newIndentation, baseIndentation, baseNewLine, true);
284
1/1
✓ Branch 0 (105→106) taken 3 times.
3 comma = ", ";
285 }
286
3/4
✓ Branch 0 (117→118) taken 1 times.
✓ Branch 2 (118→119) taken 1 times.
✗ Branch 3 (118→120) not taken.
✓ Branch 4 (119→120) taken 1 times.
1 if(name != ""){out += "]";}
287 1 }else{
288
15/15
✓ Branch 0 (122→123) taken 11 times.
✓ Branch 2 (123→124) taken 7 times.
✓ Branch 3 (123→147) taken 4 times.
✓ Branch 4 (124→125) taken 7 times.
✓ Branch 6 (125→126) taken 7 times.
✓ Branch 8 (126→127) taken 7 times.
✓ Branch 10 (127→128) taken 7 times.
✓ Branch 12 (128→129) taken 7 times.
✓ Branch 14 (129→130) taken 7 times.
✓ Branch 16 (130→131) taken 7 times.
✓ Branch 18 (131→132) taken 7 times.
✓ Branch 20 (132→133) taken 7 times.
✓ Branch 22 (133→134) taken 7 times.
✓ Branch 24 (134→135) taken 7 times.
✓ Branch 26 (135→136) taken 7 times.
11 if(name != ""){out += baseNewLine + indentation + name.addPrefixSuffix("\"","\"") + ": " + node.getValue().addPrefixSuffix("\"","\"");}
289
5/5
✓ Branch 0 (147→148) taken 4 times.
✓ Branch 2 (148→149) taken 4 times.
✓ Branch 4 (149→150) taken 4 times.
✓ Branch 6 (150→151) taken 4 times.
✓ Branch 8 (151→152) taken 4 times.
4 else{out += node.getValue().addPrefixSuffix("\"","\"");}
290 }
291 18 return out;
292 18 }
293
294 ///Convert the current ConfigNode to a JSON string
295 /** @param main : ConfigNode to be converted
296 * @param baseIndentation : indentation to be used
297 * @param baseNewLine : new line to be used
298 * @return corresponding PString
299 */
300 5 PString toJsonString(const ConfigNode & main, const PString & baseIndentation, const PString & baseNewLine){
301 5 PString out("{");
302
2/2
✓ Branch 0 (3→4) taken 5 times.
✓ Branch 2 (4→5) taken 5 times.
5 out += toJsonSaveRecurse(main, baseIndentation, baseIndentation, baseNewLine, false);
303
2/2
✓ Branch 0 (6→7) taken 5 times.
✓ Branch 2 (7→8) taken 5 times.
5 out += baseNewLine + "}";
304 5 return out;
305 }
306
307
308