@@ -380,8 +380,25 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
380380 // default to --check-level=normal from CLI for now
381381 mSettings .setCheckLevel (Settings::CheckLevel::normal);
382382
383+ // TODO: this is duplicated in gui/mainwindows.cpp
384+ {
385+ // only read cppcheck.cfg if the product name has not been set yet
386+ // this is hack so we can unit test this - should never happen in production
387+ if (mSettings .cppcheckCfgProductName .empty ())
388+ {
389+ // load config to determine if we are premium - do not apply any other settings
390+ Settings s;
391+ s.exename = mSettings .exename ;
392+ Suppressions supprs;
393+ // TODO: errorhandling
394+ Settings::loadCppcheckCfg (s, supprs, mSettings .debuglookup || mSettings .debuglookupConfig );
395+ mSettings .cppcheckCfgProductName = s.cppcheckCfgProductName ;
396+ }
397+ mSettings .premium = startsWith (mSettings .cppcheckCfgProductName , " Cppcheck Premium" );
398+ }
399+
383400 if (argc <= 1 ) {
384- printHelp ();
401+ printHelp (mSettings . premium );
385402 return Result::Exit;
386403 }
387404
@@ -418,7 +435,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
418435
419436 // Print help
420437 if (std::strcmp (argv[i], " -h" ) == 0 || std::strcmp (argv[i], " --help" ) == 0 ) {
421- printHelp ();
438+ printHelp (mSettings . premium );
422439 return Result::Exit;
423440 }
424441
@@ -1086,7 +1103,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
10861103 }
10871104
10881105 // Special Cppcheck Premium options
1089- else if ((std::strncmp (argv[i], " --premium=" , 10 ) == 0 || std::strncmp (argv[i], " --premium-" , 10 ) == 0 ) && isCppcheckPremium () ) {
1106+ else if ((std::strncmp (argv[i], " --premium=" , 10 ) == 0 || std::strncmp (argv[i], " --premium-" , 10 ) == 0 ) && mSettings . premium ) {
10901107 // valid options --premium=..
10911108 const std::set<std::string> valid{
10921109 " autosar" ,
@@ -1616,13 +1633,15 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
16161633 return Result::Success;
16171634}
16181635
1619- void CmdLineParser::printHelp () const
1636+ void CmdLineParser::printHelp (bool premium ) const
16201637{
1621- const std::string manualUrl (isCppcheckPremium () ?
1622- " https://cppcheck.sourceforge.io/manual.pdf" :
1623- " https://files.cppchecksolutions.com/manual.pdf" );
1638+ // TODO: fetch URL from config like product name?
1639+ const std::string manualUrl (premium ?
1640+ " https://files.cppchecksolutions.com/manual.pdf" :
1641+ " https://cppcheck.sourceforge.io/manual.pdf" );
16241642
16251643 std::ostringstream oss;
1644+ // TODO: display product name
16261645 oss << " Cppcheck - A tool for static C/C++ code analysis\n "
16271646 " \n "
16281647 " Syntax:\n "
@@ -1820,7 +1839,7 @@ void CmdLineParser::printHelp() const
18201839 " --plist-output=<path>\n "
18211840 " Generate Clang-plist output files in folder.\n " ;
18221841
1823- if (isCppcheckPremium () ) {
1842+ if (premium ) {
18241843 oss <<
18251844 " --premium=<option>\n "
18261845 " Coding standards:\n "
@@ -1994,6 +2013,7 @@ void CmdLineParser::printHelp() const
19942013}
19952014
19962015std::string CmdLineParser::getVersion () const {
2016+ // TODO: this should not contain the version - it should set the extraVersion
19972017 if (!mSettings .cppcheckCfgProductName .empty ())
19982018 return mSettings .cppcheckCfgProductName ;
19992019 const char * const extraVersion = CppCheck::extraVersion ();
@@ -2002,12 +2022,6 @@ std::string CmdLineParser::getVersion() const {
20022022 return std::string (" Cppcheck " ) + CppCheck::version ();
20032023}
20042024
2005- bool CmdLineParser::isCppcheckPremium () const {
2006- if (mSettings .cppcheckCfgProductName .empty ())
2007- Settings::loadCppcheckCfg (mSettings , mSuppressions , mSettings .debuglookup || mSettings .debuglookupConfig );
2008- return startsWith (mSettings .cppcheckCfgProductName , " Cppcheck Premium" );
2009- }
2010-
20112025bool CmdLineParser::tryLoadLibrary (Library& destination, const std::string& basepath, const char * filename, bool debug)
20122026{
20132027 const Library::Error err = destination.load (basepath.c_str (), filename, debug);
@@ -2100,8 +2114,12 @@ bool CmdLineParser::loadAddons(Settings& settings)
21002114
21012115bool CmdLineParser::loadCppcheckCfg ()
21022116{
2103- if (!mSettings .cppcheckCfgProductName .empty ())
2104- return true ;
2117+ if (!mSettings .settingsFiles .empty ())
2118+ {
2119+ // should never happen - programming error
2120+ mLogger .printError (" cppcheck.cfg has already been loaded from " + mSettings .settingsFiles [0 ]);
2121+ return false ;
2122+ }
21052123 const std::string cfgErr = Settings::loadCppcheckCfg (mSettings , mSuppressions , mSettings .debuglookup || mSettings .debuglookupConfig );
21062124 if (!cfgErr.empty ()) {
21072125 mLogger .printError (" could not load cppcheck.cfg - " + cfgErr);
0 commit comments