| 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 | 39 | PTomlParserData default_PTomlParserData(){ | |
| 22 | 39 | PTomlParserData data; | |
| 23 | 39 | data.isRun = true; | |
| 24 | 39 | 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 | 224 | bool parse_toml_isParse(const PTomlParserData & data){ | |
| 41 | 224 | 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 | 119 | bool parse_toml_varName(PString & varName, PFileParser & parser){ | |
| 50 |
3/3✓ Branch 0 (2→3) taken 119 times.
✓ Branch 2 (3→4) taken 119 times.
✓ Branch 4 (4→5) taken 119 times.
|
119 | varName = parser.getStrComposedOf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"); |
| 51 | 119 | 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 | 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 | 19 | } | |
| 129 | 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 | 64 | bool parse_tomlCompactDico(ConfigNode & parent, PTomlParserData & data){ | |
| 302 | 64 | PFileParser & parser = data.parser; | |
| 303 |
4/4✓ Branch 0 (2→3) taken 64 times.
✓ Branch 2 (3→4) taken 64 times.
✓ Branch 4 (5→6) taken 56 times.
✓ Branch 5 (5→7) taken 8 times.
|
64 | 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 | 58 | bool parse_toml_varValue(ConfigNode & var, PTomlParserData & data){ | |
| 329 | 58 | PFileParser & parser = data.parser; | |
| 330 |
4/4✓ Branch 0 (2→3) taken 58 times.
✓ Branch 2 (3→4) taken 58 times.
✓ Branch 4 (5→6) taken 9 times.
✓ Branch 5 (5→78) taken 49 times.
|
58 | if(parser.isMatch("[")){ //The value is a list |
| 331 |
11/16✓ Branch 0 (66→67) taken 24 times.
✓ Branch 2 (67→68) taken 24 times.
✗ Branch 3 (67→74) not taken.
✓ Branch 4 (68→69) taken 24 times.
✓ Branch 6 (69→70) taken 24 times.
✓ Branch 8 (70→71) taken 17 times.
✓ Branch 9 (70→74) taken 7 times.
✓ Branch 10 (71→72) taken 17 times.
✓ Branch 12 (72→73) taken 17 times.
✗ Branch 13 (72→74) not taken.
✓ Branch 14 (75→76) taken 24 times.
✗ Branch 15 (75→77) not taken.
✓ Branch 16 (77→7) taken 17 times.
✓ Branch 17 (77→126) taken 7 times.
✗ Branch 18 (162→163) not taken.
✗ Branch 19 (162→164) not taken.
|
24 | while(!parser.isEndOfFile() && !parser.isMatch("]") && parse_toml_isParse(data)){ //Let's parse the values of the Variable |
| 332 |
1/1✓ Branch 0 (8→9) taken 17 times.
|
17 | ConfigNode * subValue = var.addChild(); |
| 333 |
2/2✓ Branch 0 (11→12) taken 3 times.
✓ Branch 1 (11→32) taken 14 times.
|
17 | if(parse_tomlCompactDico(*subValue, data)){ |
| 334 |
11/18✓ Branch 0 (12→13) taken 3 times.
✓ Branch 2 (13→14) taken 3 times.
✓ Branch 4 (14→15) taken 2 times.
✓ Branch 5 (14→19) taken 1 times.
✓ Branch 6 (15→16) taken 2 times.
✓ Branch 8 (16→17) taken 2 times.
✗ Branch 10 (17→18) not taken.
✓ Branch 11 (17→19) taken 2 times.
✓ Branch 12 (20→21) taken 2 times.
✓ Branch 13 (20→22) taken 1 times.
✓ Branch 14 (22→23) taken 3 times.
✗ Branch 15 (22→24) not taken.
✗ Branch 16 (24→25) not taken.
✓ Branch 17 (24→65) taken 3 times.
✗ Branch 18 (134→135) not taken.
✗ Branch 19 (134→136) not taken.
✗ Branch 20 (138→139) not taken.
✗ Branch 21 (138→140) not taken.
|
3 | if(!parser.isMatch(",") && !parser.isMatchRewind("]")){ //We expect one element or a comma to add more |
| 335 | ✗ | std::cerr << "parse_toml_varValue : expect ',' or ']' for unclosed list of values at " << parser.getLocation() << std::endl; | |
| 336 | ✗ | parse_toml_stopParsing(data); | |
| 337 | ✗ | return false; | |
| 338 | } | ||
| 339 | } | ||
| 340 |
2/2✓ Branch 0 (33→34) taken 13 times.
✓ Branch 1 (33→54) taken 1 times.
|
14 | else if(parse_toml_varValue(*subValue, data)){ |
| 341 |
13/18✓ Branch 0 (34→35) taken 13 times.
✓ Branch 2 (35→36) taken 13 times.
✓ Branch 4 (36→37) taken 5 times.
✓ Branch 5 (36→41) taken 8 times.
✓ Branch 6 (37→38) taken 5 times.
✓ Branch 8 (38→39) taken 5 times.
✓ Branch 10 (39→40) taken 1 times.
✓ Branch 11 (39→41) taken 4 times.
✓ Branch 12 (42→43) taken 5 times.
✓ Branch 13 (42→44) taken 8 times.
✓ Branch 14 (44→45) taken 13 times.
✗ Branch 15 (44→46) not taken.
✓ Branch 16 (46→47) taken 1 times.
✓ Branch 17 (46→65) taken 12 times.
✗ Branch 18 (145→146) not taken.
✗ Branch 19 (145→147) not taken.
✗ Branch 20 (149→150) not taken.
✗ Branch 21 (149→151) not taken.
|
13 | if(!parser.isMatch(",") && !parser.isMatchRewind("]")){ //We expect one element or a comma to add more |
| 342 |
3/3✓ Branch 0 (48→49) taken 1 times.
✓ Branch 2 (49→50) taken 1 times.
✓ Branch 4 (50→51) taken 1 times.
|
1 | std::cerr << "parse_toml_varValue : expect ',' or ']' for unclosed list of values at " << parser.getLocation() << std::endl; |
| 343 | 1 | parse_toml_stopParsing(data); | |
| 344 | 1 | return false; | |
| 345 | } | ||
| 346 | }else{ | ||
| 347 |
3/4✓ Branch 0 (54→55) taken 1 times.
✓ Branch 2 (55→56) taken 1 times.
✓ Branch 4 (57→58) taken 1 times.
✗ Branch 5 (57→65) not taken.
|
1 | if(!parser.isMatch("]")){ |
| 348 |
3/3✓ Branch 0 (59→60) taken 1 times.
✓ Branch 2 (60→61) taken 1 times.
✓ Branch 4 (61→62) taken 1 times.
|
1 | std::cerr << "parse_toml_varValue : missing ']' token to close empty list of value at " << parser.getLocation() << std::endl; |
| 349 | 1 | parse_toml_stopParsing(data); | |
| 350 | 1 | return false; | |
| 351 | } | ||
| 352 | } | ||
| 353 | } | ||
| 354 | }else{ | ||
| 355 |
1/1✓ Branch 0 (78→79) taken 49 times.
|
49 | PString strValue(""); |
| 356 |
3/3✓ Branch 0 (79→80) taken 49 times.
✓ Branch 2 (80→81) taken 26 times.
✓ Branch 3 (80→82) taken 23 times.
|
49 | if(parse_generic_string(strValue, parser)){ |
| 357 |
1/1✓ Branch 0 (81→120) taken 26 times.
|
26 | var.setValue(strValue); |
| 358 |
4/4✓ Branch 0 (82→83) taken 23 times.
✓ Branch 2 (83→84) taken 23 times.
✓ Branch 4 (85→86) taken 2 times.
✓ Branch 5 (85→90) taken 21 times.
|
23 | }else if(parser.isMatch("true")){ |
| 359 |
2/2✓ Branch 0 (86→87) taken 2 times.
✓ Branch 2 (87→88) taken 2 times.
|
2 | var.setValue("true"); |
| 360 |
4/4✓ Branch 0 (90→91) taken 21 times.
✓ Branch 2 (91→92) taken 21 times.
✓ Branch 4 (93→94) taken 2 times.
✓ Branch 5 (93→98) taken 19 times.
|
21 | }else if(parser.isMatch("false")){ |
| 361 |
2/2✓ Branch 0 (94→95) taken 2 times.
✓ Branch 2 (95→96) taken 2 times.
|
2 | var.setValue("false"); |
| 362 | }else{ | ||
| 363 |
2/2✓ Branch 0 (98→99) taken 19 times.
✓ Branch 2 (99→100) taken 19 times.
|
19 | PString valueNumber(parser.getStrComposedOf("0123456789.-+e")); |
| 364 |
3/3✓ Branch 0 (101→102) taken 19 times.
✓ Branch 2 (102→103) taken 15 times.
✓ Branch 3 (102→104) taken 4 times.
|
19 | if(valueNumber != ""){ |
| 365 |
1/1✓ Branch 0 (103→114) taken 15 times.
|
15 | var.setValue(valueNumber); |
| 366 | }else{ | ||
| 367 |
7/7✓ Branch 0 (104→105) taken 4 times.
✓ Branch 2 (105→106) taken 4 times.
✓ Branch 4 (106→107) taken 4 times.
✓ Branch 6 (107→108) taken 4 times.
✓ Branch 8 (108→109) taken 4 times.
✓ Branch 10 (109→110) taken 4 times.
✓ Branch 12 (110→111) taken 4 times.
|
4 | std::cerr << "parse_toml_varValue : missing value of variable '"<<var.getName()<<"' at " << parser.getLocation() << std::endl; |
| 368 |
1/1✓ Branch 0 (112→113) taken 4 times.
|
4 | parse_toml_stopParsing(data); |
| 369 | 4 | return false; | |
| 370 | } | ||
| 371 | 19 | } | |
| 372 | 49 | } | |
| 373 | 52 | return true; | |
| 374 | } | ||
| 375 | |||
| 376 | ///Parse a toml var name | ||
| 377 | /** @param[out] parent : parent ConfigNode to be used | ||
| 378 | * @param[out] data : parser data to be used | ||
| 379 | * @return true on success, false otherwise | ||
| 380 | */ | ||
| 381 | 62 | bool parse_toml_var(ConfigNode & parent, PTomlParserData & data){ | |
| 382 | 62 | PFileParser & parser = data.parser; | |
| 383 |
1/1✓ Branch 0 (2→3) taken 62 times.
|
62 | PString varName(""); |
| 384 |
3/3✓ Branch 0 (3→4) taken 62 times.
✓ Branch 2 (4→5) taken 13 times.
✓ Branch 3 (4→6) taken 49 times.
|
62 | if(!parse_toml_varName(varName, parser)){return false;} |
| 385 |
4/4✓ Branch 0 (6→7) taken 49 times.
✓ Branch 2 (7→8) taken 49 times.
✓ Branch 4 (9→10) taken 2 times.
✓ Branch 5 (9→19) taken 47 times.
|
49 | if(!parser.isMatch("=")){ |
| 386 |
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; |
| 387 |
1/1✓ Branch 0 (17→18) taken 2 times.
|
2 | parse_toml_stopParsing(data); |
| 388 | 2 | return false; | |
| 389 | } | ||
| 390 |
1/1✓ Branch 0 (19→20) taken 47 times.
|
47 | ConfigNode * var = parent.addChild(varName); |
| 391 |
2/2✓ Branch 0 (20→21) taken 47 times.
✓ Branch 2 (21→22) taken 47 times.
|
47 | var->setLineCol(parser.getLocation()); |
| 392 | 47 | bool b(true); | |
| 393 |
3/3✓ Branch 0 (23→24) taken 47 times.
✓ Branch 2 (24→25) taken 44 times.
✓ Branch 3 (24→28) taken 3 times.
|
47 | if(parse_tomlCompactDico(*var, data)){} |
| 394 |
3/3✓ Branch 0 (25→26) taken 44 times.
✓ Branch 2 (26→27) taken 5 times.
✓ Branch 3 (26→28) taken 39 times.
|
44 | else if(parse_toml_varValue(*var, data)){} |
| 395 | 5 | else{b = false;} | |
| 396 | 47 | return b; | |
| 397 | 62 | } | |
| 398 | |||
| 399 | ///Get the parent dictionary by respect to the vecDicoName | ||
| 400 | /** @param parent : main DicoValue | ||
| 401 | * @param vecDicoName : name of the parent DicoValue of the following attributes | ||
| 402 | * @return pointer to the parent DicoValue of the following attributes | ||
| 403 | */ | ||
| 404 | 20 | ConfigNode * parse_get_parent_dico(ConfigNode & parent, const PVecString & vecDicoName){ | |
| 405 | 20 | ConfigNode * output = &parent; | |
| 406 |
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){ |
| 407 |
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("\"'")); |
| 408 |
2/2✓ Branch 0 (10→11) taken 20 times.
✓ Branch 1 (10→15) taken 1 times.
|
21 | if(next == NULL){ |
| 409 |
1/1✓ Branch 0 (13→14) taken 20 times.
|
40 | next = output->addChild(*it); |
| 410 | } | ||
| 411 | 21 | output = next; | |
| 412 |
1/1✓ Branch 0 (17→18) taken 21 times.
|
42 | output->setName(*it); |
| 413 | } | ||
| 414 | 20 | return output; | |
| 415 | } | ||
| 416 | |||
| 417 | ///Parse a dico definition | ||
| 418 | /** @param[out] parent : parent ConfigNode | ||
| 419 | * @param[out] data : parser data to be used | ||
| 420 | * @return true on success, false otherwise | ||
| 421 | */ | ||
| 422 | 19 | bool parse_toml_dico_def(ConfigNode & parent, PTomlParserData & data){ | |
| 423 | 19 | PFileParser & parser = data.parser; | |
| 424 |
4/4✓ Branch 0 (2→3) taken 19 times.
✓ Branch 2 (3→4) taken 19 times.
✓ Branch 4 (5→6) taken 1 times.
✓ Branch 5 (5→7) taken 18 times.
|
19 | if(!parser.isMatch("[")){return false;} |
| 425 |
2/2✓ Branch 0 (7→8) taken 18 times.
✓ Branch 2 (8→9) taken 18 times.
|
18 | PString dicoName(parser.getUntilKeyWithoutPatern("]")); |
| 426 |
1/1✓ Branch 0 (10→11) taken 18 times.
|
18 | PVecString vecDicoName = dicoName.split('.'); |
| 427 |
1/1✓ Branch 0 (11→12) taken 18 times.
|
18 | ConfigNode * dicoDef = parse_get_parent_dico(parent, vecDicoName); |
| 428 |
2/2✓ Branch 0 (12→13) taken 18 times.
✓ Branch 2 (13→14) taken 18 times.
|
18 | dicoDef->setLineCol(parser.getLocation()); |
| 429 |
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 |
| 430 |
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");} |
| 431 |
1/1✓ Branch 0 (25→26) taken 43 times.
|
43 | else if(parse_toml_var(*dicoDef, data)){} |
| 432 | } | ||
| 433 | 18 | return true; | |
| 434 | 18 | } | |
| 435 | |||
| 436 | ///Parse a dico definition | ||
| 437 | /** @param[out] parent : parent ConfigNode | ||
| 438 | * @param[out] data : parser data to be used | ||
| 439 | * @return true on success, false otherwise | ||
| 440 | */ | ||
| 441 | 21 | bool parse_toml_table_def(ConfigNode & parent, PTomlParserData & data){ | |
| 442 | 21 | PFileParser & parser = data.parser; | |
| 443 |
4/4✓ Branch 0 (2→3) taken 21 times.
✓ Branch 2 (3→4) taken 21 times.
✓ Branch 4 (5→6) taken 19 times.
✓ Branch 5 (5→7) taken 2 times.
|
21 | if(!parser.isMatch("[[")){return false;} |
| 444 |
2/2✓ Branch 0 (7→8) taken 2 times.
✓ Branch 2 (8→9) taken 2 times.
|
2 | PString dicoName(parser.getUntilKeyWithoutPatern("]]")); |
| 445 |
1/1✓ Branch 0 (10→11) taken 2 times.
|
2 | PVecString vecDicoName = dicoName.split('.'); |
| 446 |
1/1✓ Branch 0 (11→12) taken 2 times.
|
2 | ConfigNode * dicoDef = parse_get_parent_dico(parent, vecDicoName); |
| 447 |
2/2✓ Branch 0 (12→13) taken 2 times.
✓ Branch 2 (13→14) taken 2 times.
|
2 | dicoDef->setLineCol(parser.getLocation()); |
| 448 |
2/2✓ Branch 0 (15→16) taken 2 times.
✓ Branch 2 (16→17) taken 2 times.
|
2 | ConfigNode * table = dicoDef->addChild(); |
| 449 |
2/2✓ Branch 0 (18→19) taken 2 times.
✓ Branch 2 (19→20) taken 2 times.
|
2 | table->setLineCol(parser.getLocation()); |
| 450 |
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 |
| 451 |
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");} |
| 452 |
1/1✓ Branch 0 (31→32) taken 5 times.
|
5 | else if(parse_toml_var(*table, data)){} |
| 453 | } | ||
| 454 | 2 | return true; | |
| 455 | 2 | } | |
| 456 | |||
| 457 | ///Parse a toml file and update the given ConfigNode | ||
| 458 | /** @param[out] node : ConfigNode to be updated | ||
| 459 | * @param[out] data : parser data to be used | ||
| 460 | * @return true on success, false otherwise | ||
| 461 | */ | ||
| 462 | 19 | bool parser_toml_fileParser(ConfigNode & node, PTomlParserData & data){ | |
| 463 | 19 | PFileParser & parser = data.parser; | |
| 464 |
2/2✓ Branch 0 (2→3) taken 19 times.
✓ Branch 2 (3→4) taken 19 times.
|
19 | parser.getStrComposedOf(" \t\n"); //Skip all blank characters |
| 465 |
6/6✓ Branch 0 (37→38) taken 25 times.
✓ Branch 1 (37→41) taken 17 times.
✓ Branch 2 (39→40) taken 23 times.
✓ Branch 3 (39→41) taken 2 times.
✓ Branch 4 (42→7) taken 23 times.
✓ Branch 5 (42→43) taken 19 times.
|
42 | while(!parser.isEndOfFile() && parse_toml_isParse(data)){ |
| 466 |
6/6✓ Branch 0 (7→8) taken 23 times.
✓ Branch 2 (8→9) taken 23 times.
✓ Branch 4 (10→11) taken 2 times.
✓ Branch 5 (10→16) taken 21 times.
✓ Branch 6 (11→12) taken 2 times.
✓ Branch 8 (12→13) taken 2 times.
|
23 | if(parser.isMatch("#")){parser.getUntilKeyWithoutPatern("\n");} |
| 467 |
2/2✓ Branch 0 (17→18) taken 19 times.
✓ Branch 1 (17→35) taken 2 times.
|
21 | else if(parse_toml_table_def(node, data)){} |
| 468 |
2/2✓ Branch 0 (19→20) taken 1 times.
✓ Branch 1 (19→35) taken 18 times.
|
19 | else if(parse_toml_dico_def(node, data)){} |
| 469 | else{ | ||
| 470 |
1/1✓ Branch 0 (20→21) taken 1 times.
|
1 | PString nextToken(parser.getNextToken()); |
| 471 |
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 |
| 472 |
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; |
| 473 |
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; |
| 474 |
1/1✓ Branch 0 (32→33) taken 1 times.
|
1 | parse_toml_stopParsing(data); |
| 475 | } | ||
| 476 | 1 | } | |
| 477 | } | ||
| 478 | 19 | return data.isRun; | |
| 479 | } | ||
| 480 | |||
| 481 | ///Parse a toml file | ||
| 482 | /** @param[out] node : ConfigNode to be updated | ||
| 483 | * @param fileName : name of the file to be parsed | ||
| 484 | * @return true on success, false otherwise | ||
| 485 | */ | ||
| 486 | 19 | bool parser_toml(ConfigNode & node, const PPath & fileName){ | |
| 487 |
1/1✓ Branch 0 (2→3) taken 19 times.
|
19 | PTomlParserData data(default_PTomlParserData()); |
| 488 | 19 | PFileParser & parser = data.parser; | |
| 489 |
2/2✓ Branch 0 (3→4) taken 19 times.
✓ Branch 2 (4→5) taken 19 times.
|
19 | parser.setWhiteSpace(" \n\t"); |
| 490 |
2/2✓ Branch 0 (6→7) taken 19 times.
✓ Branch 2 (7→8) taken 19 times.
|
19 | parser.setSeparator(":-'\",{}[]>|"); |
| 491 |
1/1✓ Branch 0 (9→10) taken 19 times.
|
19 | parser.setEscapeChar('\\'); |
| 492 |
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)){ |
| 493 |
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; |
| 494 | 1 | return false; | |
| 495 | } | ||
| 496 |
1/1✓ Branch 0 (17→18) taken 18 times.
|
18 | node.setFileName(fileName); |
| 497 |
1/1✓ Branch 0 (18→19) taken 18 times.
|
18 | bool b(parser_toml_fileParser(node, data)); |
| 498 | 18 | return b; | |
| 499 | 19 | } | |
| 500 | |||
| 501 | ///Parse a toml string | ||
| 502 | /** @param[out] node : ConfigNode to be updated | ||
| 503 | * @param fileName : name of the file to be parsed | ||
| 504 | * @return true on success, false otherwise | ||
| 505 | */ | ||
| 506 | 1 | bool parser_tomlString(ConfigNode & node, const PString & fileContent){ | |
| 507 |
1/1✓ Branch 0 (2→3) taken 1 times.
|
1 | PTomlParserData data(default_PTomlParserData()); |
| 508 | 1 | PFileParser & parser = data.parser; | |
| 509 |
2/2✓ Branch 0 (3→4) taken 1 times.
✓ Branch 2 (4→5) taken 1 times.
|
1 | parser.setWhiteSpace(" \n\t"); |
| 510 |
2/2✓ Branch 0 (6→7) taken 1 times.
✓ Branch 2 (7→8) taken 1 times.
|
1 | parser.setSeparator(":-'\",{}[]>|"); |
| 511 |
1/1✓ Branch 0 (9→10) taken 1 times.
|
1 | parser.setEscapeChar('\\'); |
| 512 |
1/1✓ Branch 0 (10→11) taken 1 times.
|
1 | parser.setFileContent(fileContent); |
| 513 |
1/1✓ Branch 0 (11→12) taken 1 times.
|
1 | bool b(parser_toml_fileParser(node, data)); |
| 514 | 1 | return b; | |
| 515 | 1 | } | |
| 516 | |||
| 517 | |||
| 518 | |||
| 519 | |||
| 520 |