MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / readcondition

Function readcondition

lib/preprocessor.cpp:402–517  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

400}
401
402static 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;

Callers 1

getConfigsFunction · 0.85

Calls 5

samelineFunction · 0.70
strMethod · 0.45
findMethod · 0.45
endMethod · 0.45
emptyMethod · 0.45

Tested by

no test coverage detected