diff options
Diffstat (limited to 'generator/generator.cpp')
-rw-r--r-- | generator/generator.cpp | 82 |
1 files changed, 21 insertions, 61 deletions
diff --git a/generator/generator.cpp b/generator/generator.cpp index 4cc9f64..e125b4a 100644 --- a/generator/generator.cpp +++ b/generator/generator.cpp | |||
@@ -7,7 +7,6 @@ | |||
7 | #include <fstream> | 7 | #include <fstream> |
8 | #include "../lib/enums.h" | 8 | #include "../lib/enums.h" |
9 | #include "progress.h" | 9 | #include "progress.h" |
10 | #include "../lib/selrestr.h" | ||
11 | #include "role.h" | 10 | #include "role.h" |
12 | #include "part.h" | 11 | #include "part.h" |
13 | #include "field.h" | 12 | #include "field.h" |
@@ -1303,12 +1302,20 @@ namespace verbly { | |||
1303 | std::string roleName = reinterpret_cast<const char*>(key); | 1302 | std::string roleName = reinterpret_cast<const char*>(key); |
1304 | xmlFree(key); | 1303 | xmlFree(key); |
1305 | 1304 | ||
1306 | selrestr roleSelrestrs; | 1305 | std::set<std::string> roleSelrestrs; |
1307 | for (xmlNodePtr rolenode = roletopnode->xmlChildrenNode; rolenode != nullptr; rolenode = rolenode->next) | 1306 | for (xmlNodePtr rolenode = roletopnode->xmlChildrenNode; rolenode != nullptr; rolenode = rolenode->next) |
1308 | { | 1307 | { |
1309 | if (!xmlStrcmp(rolenode->name, reinterpret_cast<const xmlChar*>("SELRESTRS"))) | 1308 | if (!xmlStrcmp(rolenode->name, reinterpret_cast<const xmlChar*>("SELRESTRS"))) |
1310 | { | 1309 | { |
1311 | roleSelrestrs = parseSelrestr(rolenode); | 1310 | for (xmlNodePtr selrestrnode = rolenode->xmlChildrenNode; selrestrnode != nullptr; selrestrnode = selrestrnode->next) |
1311 | { | ||
1312 | if (!xmlStrcmp(selrestrnode->name, reinterpret_cast<const xmlChar*>("SELRESTR"))) | ||
1313 | { | ||
1314 | key = xmlGetProp(selrestrnode, reinterpret_cast<const xmlChar*>("type")); | ||
1315 | roleSelrestrs.insert(std::string(reinterpret_cast<const char*>(key))); | ||
1316 | xmlFree(key); | ||
1317 | } | ||
1318 | } | ||
1312 | } | 1319 | } |
1313 | } | 1320 | } |
1314 | 1321 | ||
@@ -1335,7 +1342,7 @@ namespace verbly { | |||
1335 | std::string partRole = reinterpret_cast<const char*>(key); | 1342 | std::string partRole = reinterpret_cast<const char*>(key); |
1336 | xmlFree(key); | 1343 | xmlFree(key); |
1337 | 1344 | ||
1338 | selrestr partSelrestrs; | 1345 | std::set<std::string> partSelrestrs; |
1339 | std::set<std::string> partSynrestrs; | 1346 | std::set<std::string> partSynrestrs; |
1340 | 1347 | ||
1341 | for (xmlNodePtr npnode = syntaxnode->xmlChildrenNode; npnode != nullptr; npnode = npnode->next) | 1348 | for (xmlNodePtr npnode = syntaxnode->xmlChildrenNode; npnode != nullptr; npnode = npnode->next) |
@@ -1351,11 +1358,17 @@ namespace verbly { | |||
1351 | xmlFree(key); | 1358 | xmlFree(key); |
1352 | } | 1359 | } |
1353 | } | 1360 | } |
1354 | } | 1361 | } else if (!xmlStrcmp(npnode->name, reinterpret_cast<const xmlChar*>("SELRESTRS"))) |
1355 | |||
1356 | if (!xmlStrcmp(npnode->name, reinterpret_cast<const xmlChar*>("SELRESTRS"))) | ||
1357 | { | 1362 | { |
1358 | partSelrestrs = parseSelrestr(npnode); | 1363 | for (xmlNodePtr selrestrnode = npnode->xmlChildrenNode; selrestrnode != nullptr; selrestrnode = selrestrnode->next) |
1364 | { | ||
1365 | if (!xmlStrcmp(selrestrnode->name, reinterpret_cast<const xmlChar*>("SELRESTR"))) | ||
1366 | { | ||
1367 | key = xmlGetProp(selrestrnode, reinterpret_cast<const xmlChar*>("type")); | ||
1368 | partSelrestrs.insert(std::string(reinterpret_cast<const char*>(key))); | ||
1369 | xmlFree(key); | ||
1370 | } | ||
1371 | } | ||
1359 | } | 1372 | } |
1360 | } | 1373 | } |
1361 | 1374 | ||
@@ -1434,58 +1447,5 @@ namespace verbly { | |||
1434 | } | 1447 | } |
1435 | } | 1448 | } |
1436 | 1449 | ||
1437 | selrestr generator::parseSelrestr(xmlNodePtr top) | ||
1438 | { | ||
1439 | xmlChar* key; | ||
1440 | |||
1441 | if (!xmlStrcmp(top->name, reinterpret_cast<const xmlChar*>("SELRESTRS"))) | ||
1442 | { | ||
1443 | if (xmlChildElementCount(top) == 0) | ||
1444 | { | ||
1445 | return {}; | ||
1446 | } else if (xmlChildElementCount(top) == 1) | ||
1447 | { | ||
1448 | return parseSelrestr(xmlFirstElementChild(top)); | ||
1449 | } else { | ||
1450 | bool orlogic = false; | ||
1451 | if (xmlHasProp(top, reinterpret_cast<const xmlChar*>("logic"))) | ||
1452 | { | ||
1453 | key = xmlGetProp(top, reinterpret_cast<const xmlChar*>("logic")); | ||
1454 | if (!xmlStrcmp(key, reinterpret_cast<const xmlChar*>("or"))) | ||
1455 | { | ||
1456 | orlogic = true; | ||
1457 | } | ||
1458 | |||
1459 | xmlFree(key); | ||
1460 | } | ||
1461 | |||
1462 | std::list<selrestr> children; | ||
1463 | for (xmlNodePtr selrestr = top->xmlChildrenNode; selrestr != nullptr; selrestr = selrestr->next) | ||
1464 | { | ||
1465 | if (!xmlStrcmp(selrestr->name, reinterpret_cast<const xmlChar*>("SELRESTRS")) | ||
1466 | || !xmlStrcmp(selrestr->name, reinterpret_cast<const xmlChar*>("SELRESTR"))) | ||
1467 | { | ||
1468 | children.push_back(parseSelrestr(selrestr)); | ||
1469 | } | ||
1470 | } | ||
1471 | |||
1472 | return selrestr(children, orlogic); | ||
1473 | } | ||
1474 | } else if (!xmlStrcmp(top->name, reinterpret_cast<const xmlChar*>("SELRESTR"))) | ||
1475 | { | ||
1476 | key = xmlGetProp(top, reinterpret_cast<const xmlChar*>("Value")); | ||
1477 | bool selPos = (std::string(reinterpret_cast<const char*>(key)) == "+"); | ||
1478 | xmlFree(key); | ||
1479 | |||
1480 | key = xmlGetProp(top, reinterpret_cast<const xmlChar*>("type")); | ||
1481 | std::string selRestriction = reinterpret_cast<const char*>(key); | ||
1482 | xmlFree(key); | ||
1483 | |||
1484 | return selrestr(selRestriction, selPos); | ||
1485 | } else { | ||
1486 | throw std::logic_error("Badly formatted selrestr"); | ||
1487 | } | ||
1488 | } | ||
1489 | |||
1490 | }; | 1450 | }; |
1491 | }; | 1451 | }; |