@@ -321,8 +321,25 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
321321 // default to --check-level=normal from CLI for now
322322 mSettings .setCheckLevel (Settings::CheckLevel::normal);
323323
324+ // TODO: this is duplicated in gui/mainwindows.cpp
325+ {
326+ // only read cppcheck.cfg if the product name has not been set yet
327+ // this is hack so we can unit test this - should never happen in production
328+ if (mSettings .cppcheckCfgProductName .empty ())
329+ {
330+ // load config to determine if we are premium - do not apply any other settings
331+ Settings s;
332+ s.exename = mSettings .exename ;
333+ Suppressions supprs;
334+ // TODO: errorhandling
335+ Settings::loadCppcheckCfg (s, supprs, mSettings .debuglookup || mSettings .debuglookupConfig );
336+ mSettings .cppcheckCfgProductName = s.cppcheckCfgProductName ;
337+ }
338+ mSettings .premium = startsWith (mSettings .cppcheckCfgProductName , " Cppcheck Premium" );
339+ }
340+
324341 if (argc <= 1 ) {
325- printHelp ();
342+ printHelp (mSettings . premium );
326343 return Result::Exit;
327344 }
328345
@@ -359,7 +376,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
359376
360377 // Print help
361378 if (std::strcmp (argv[i], " -h" ) == 0 || std::strcmp (argv[i], " --help" ) == 0 ) {
362- printHelp ();
379+ printHelp (mSettings . premium );
363380 return Result::Exit;
364381 }
365382
@@ -1084,7 +1101,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
10841101 }
10851102
10861103 // Special Cppcheck Premium options
1087- else if ((std::strncmp (argv[i], " --premium=" , 10 ) == 0 || std::strncmp (argv[i], " --premium-" , 10 ) == 0 ) && isCppcheckPremium () ) {
1104+ else if ((std::strncmp (argv[i], " --premium=" , 10 ) == 0 || std::strncmp (argv[i], " --premium-" , 10 ) == 0 ) && mSettings . premium ) {
10881105 // valid options --premium=..
10891106 const std::set<std::string> valid{
10901107 " autosar" ,
@@ -1681,13 +1698,15 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
16811698 return Result::Success;
16821699}
16831700
1684- void CmdLineParser::printHelp () const
1701+ void CmdLineParser::printHelp (bool premium ) const
16851702{
1686- const std::string manualUrl (isCppcheckPremium () ?
1687- " https://cppcheck.sourceforge.io/manual.pdf" :
1688- " https://files.cppchecksolutions.com/manual.pdf" );
1703+ // TODO: fetch URL from config like product name?
1704+ const std::string manualUrl (premium ?
1705+ " https://files.cppchecksolutions.com/manual.pdf" :
1706+ " https://cppcheck.sourceforge.io/manual.pdf" );
16891707
16901708 std::ostringstream oss;
1709+ // TODO: display product name
16911710 oss << " Cppcheck - A tool for static C/C++ code analysis\n "
16921711 " \n "
16931712 " Syntax:\n "
@@ -1888,7 +1907,7 @@ void CmdLineParser::printHelp() const
18881907 " --plist-output=<path>\n "
18891908 " Generate Clang-plist output files in folder.\n " ;
18901909
1891- if (isCppcheckPremium () ) {
1910+ if (premium ) {
18921911 oss <<
18931912 " --premium=<option>\n "
18941913 " Coding standards:\n "
@@ -2071,6 +2090,7 @@ void CmdLineParser::printHelp() const
20712090}
20722091
20732092std::string CmdLineParser::getVersion () const {
2093+ // TODO: this should not contain the version - it should set the extraVersion
20742094 if (!mSettings .cppcheckCfgProductName .empty ())
20752095 return mSettings .cppcheckCfgProductName ;
20762096 const char * const extraVersion = CppCheck::extraVersion ();
@@ -2079,12 +2099,6 @@ std::string CmdLineParser::getVersion() const {
20792099 return std::string (" Cppcheck " ) + CppCheck::version ();
20802100}
20812101
2082- bool CmdLineParser::isCppcheckPremium () const {
2083- if (mSettings .cppcheckCfgProductName .empty ())
2084- Settings::loadCppcheckCfg (mSettings , mSuppressions , mSettings .debuglookup || mSettings .debuglookupConfig );
2085- return startsWith (mSettings .cppcheckCfgProductName , " Cppcheck Premium" );
2086- }
2087-
20882102bool CmdLineParser::tryLoadLibrary (Library& destination, const std::string& basepath, const char * filename, bool debug)
20892103{
20902104 const Library::Error err = destination.load (basepath.c_str (), filename, debug);
@@ -2177,10 +2191,15 @@ bool CmdLineParser::loadAddons(Settings& settings)
21772191
21782192bool CmdLineParser::loadCppcheckCfg ()
21792193{
2180- if (!mSettings .cppcheckCfgProductName .empty ())
2181- return true ;
2194+ if (!mSettings .settingsFiles .empty ())
2195+ {
2196+ // should never happen - programming error
2197+ mLogger .printError (" cppcheck.cfg has already been loaded from " + mSettings .settingsFiles [0 ]);
2198+ return false ;
2199+ }
21822200 const std::string cfgErr = Settings::loadCppcheckCfg (mSettings , mSuppressions , mSettings .debuglookup || mSettings .debuglookupConfig );
21832201 if (!cfgErr.empty ()) {
2202+ // TODO: log full path
21842203 mLogger .printError (" could not load cppcheck.cfg - " + cfgErr);
21852204 return false ;
21862205 }
0 commit comments