| 400 | } |
| 401 | |
| 402 | static std::string readcondition(const simplecpp::Token *iftok, const std::set<std::string> &defined, const std::set<std::string> &undefined) |
| 403 | { |
| 404 | const simplecpp::Token *cond = iftok->next; |
| 405 | if (!sameline(iftok,cond)) |
| 406 | return ""; |
| 407 | |
| 408 | const simplecpp::Token *next1 = cond->next; |
| 409 | const simplecpp::Token *next2 = next1 ? next1->next : nullptr; |
| 410 | const simplecpp::Token *next3 = next2 ? next2->next : nullptr; |
| 411 | |
| 412 | unsigned int len = 1; |
| 413 | if (sameline(iftok,next1)) |
| 414 | len = 2; |
| 415 | if (sameline(iftok,next2)) |
| 416 | len = 3; |
| 417 | if (sameline(iftok,next3)) |
| 418 | len = 4; |
| 419 | |
| 420 | if (len == 1 && cond->str() == "0") |
| 421 | return "0"; |
| 422 | |
| 423 | if (len == 1 && cond->name) { |
| 424 | if (defined.find(cond->str()) == defined.end()) |
| 425 | return cond->str(); |
| 426 | } |
| 427 | |
| 428 | if (len == 2 && cond->op == '!' && next1->name) { |
| 429 | if (defined.find(next1->str()) == defined.end()) |
| 430 | return next1->str() + "=0"; |
| 431 | } |
| 432 | |
| 433 | if (len == 3 && cond->op == '(' && next1->name && next2->op == ')') { |
| 434 | if (defined.find(next1->str()) == defined.end() && undefined.find(next1->str()) == undefined.end()) |
| 435 | return next1->str(); |
| 436 | } |
| 437 | |
| 438 | if (len == 3 && cond->name && (next1->str() == "==" || next1->str() == "<=" || next1->str() == ">=") && next2->number) { |
| 439 | if (defined.find(cond->str()) == defined.end()) |
| 440 | return cond->str() + '=' + next1->next->str(); |
| 441 | } |
| 442 | |
| 443 | const auto lessGreaterThanConfig = [](const simplecpp::Token* dtok, const simplecpp::Token* ctok) { |
| 444 | auto v = MathLib::toBigNumber(ctok->next->str()); |
| 445 | if (ctok->op == '<') |
| 446 | v -= 1; |
| 447 | else |
| 448 | v += 1; |
| 449 | return dtok->str() + '=' + std::to_string(v); |
| 450 | }; |
| 451 | |
| 452 | if (len == 3 && cond->name && (next1->op == '<' || next1->op == '>') && next2->number) { |
| 453 | if (defined.find(cond->str()) == defined.end()) { |
| 454 | return lessGreaterThanConfig(cond, next1); |
| 455 | } |
| 456 | } |
| 457 | |
| 458 | std::set<std::string> configset; |
| 459 | bool isNotDefinedMacro = false; |