| 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 |