@@ -324,8 +324,37 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
324324 // default to --check-level=normal from CLI for now
325325 mSettings .setCheckLevel (Settings::CheckLevel::normal);
326326
327+ // read --debug-lookup early so the option is available for the cppcheck.cfg loading
328+ for (int i = 1 ; i < argc; i++) {
329+ // Show debug warnings for lookup for configuration files
330+ if (std::strcmp (argv[i], " --debug-lookup" ) == 0 )
331+ mSettings .debuglookup = true ;
332+
333+ else if (std::strncmp (argv[i], " --debug-lookup=" , 15 ) == 0 ) {
334+ const std::string lookup = argv[i] + 15 ;
335+ if (lookup == " all" )
336+ mSettings .debuglookup = true ;
337+ else if (lookup == " addon" )
338+ mSettings .debuglookupAddon = true ;
339+ else if (lookup == " config" )
340+ mSettings .debuglookupConfig = true ;
341+ else if (lookup == " library" )
342+ mSettings .debuglookupLibrary = true ;
343+ else if (lookup == " platform" )
344+ mSettings .debuglookupPlatform = true ;
345+ else
346+ {
347+ mLogger .printError (" unknown lookup '" + lookup + " '" );
348+ return Result::Fail;
349+ }
350+ }
351+ }
352+
353+ if (!loadCppcheckCfg ())
354+ return Result::Fail;
355+
327356 if (argc <= 1 ) {
328- printHelp ();
357+ printHelp (mSettings . premium );
329358 return Result::Exit;
330359 }
331360
@@ -349,8 +378,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
349378
350379 // print all possible error messages..
351380 if (std::strcmp (argv[i], " --errorlist" ) == 0 ) {
352- if (!loadCppcheckCfg ())
353- return Result::Fail;
354381 {
355382 XMLErrorMessagesLogger xmlLogger;
356383 std::cout << ErrorMessage::getXMLHeader (mSettings .cppcheckCfgProductName , 2 );
@@ -362,7 +389,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
362389
363390 // Print help
364391 if (std::strcmp (argv[i], " -h" ) == 0 || std::strcmp (argv[i], " --help" ) == 0 ) {
365- printHelp ();
392+ printHelp (mSettings . premium );
366393 return Result::Exit;
367394 }
368395
@@ -374,8 +401,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
374401 }
375402
376403 if (std::strcmp (argv[i], " --version" ) == 0 ) {
377- if (!loadCppcheckCfg ())
378- return Result::Fail;
379404 const std::string version = getVersion ();
380405 mLogger .printRaw (version); // TODO: should not include newline
381406 return Result::Exit;
@@ -617,28 +642,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
617642 std::strcmp (argv[i], " --debug-normal" ) == 0 )
618643 debug = true ;
619644
620- // Show debug warnings for lookup for configuration files
621645 else if (std::strcmp (argv[i], " --debug-lookup" ) == 0 )
622- mSettings . debuglookup = true ;
646+ continue ; // already handled above
623647
624- else if (std::strncmp (argv[i], " --debug-lookup=" , 15 ) == 0 ) {
625- const std::string lookup = argv[i] + 15 ;
626- if (lookup == " all" )
627- mSettings .debuglookup = true ;
628- else if (lookup == " addon" )
629- mSettings .debuglookupAddon = true ;
630- else if (lookup == " config" )
631- mSettings .debuglookupConfig = true ;
632- else if (lookup == " library" )
633- mSettings .debuglookupLibrary = true ;
634- else if (lookup == " platform" )
635- mSettings .debuglookupPlatform = true ;
636- else
637- {
638- mLogger .printError (" unknown lookup '" + lookup + " '" );
639- return Result::Fail;
640- }
641- }
648+ else if (std::strncmp (argv[i], " --debug-lookup=" , 15 ) == 0 )
649+ continue ; // already handled above
642650
643651 // Flag used for various purposes during debugging
644652 else if (std::strcmp (argv[i], " --debug-simplified" ) == 0 )
@@ -1090,7 +1098,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
10901098 }
10911099
10921100 // Special Cppcheck Premium options
1093- else if ((std::strncmp (argv[i], " --premium=" , 10 ) == 0 || std::strncmp (argv[i], " --premium-" , 10 ) == 0 ) && isCppcheckPremium () ) {
1101+ else if ((std::strncmp (argv[i], " --premium=" , 10 ) == 0 || std::strncmp (argv[i], " --premium-" , 10 ) == 0 ) && mSettings . premium ) {
10941102 // valid options --premium=..
10951103 const std::set<std::string> valid{
10961104 " autosar" ,
@@ -1151,7 +1159,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
11511159
11521160 mSettings .checkAllConfigurations = false ; // Can be overridden with --max-configs or --force
11531161 std::string projectFile = argv[i]+10 ;
1154- projectType = project.import (projectFile, &mSettings , &mSuppressions , isCppcheckPremium () );
1162+ projectType = project.import (projectFile, &mSettings , &mSuppressions , mSettings . premium );
11551163 if (projectType == ImportProject::Type::CPPCHECK_GUI) {
11561164 for (const std::string &lib : project.guiProject .libraries )
11571165 mSettings .libraries .emplace_back (lib);
@@ -1564,9 +1572,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
15641572 }
15651573 }
15661574
1567- if (!loadCppcheckCfg ())
1568- return Result::Fail;
1569-
15701575 // TODO: bail out?
15711576 if (!executorAuto && mSettings .useSingleJob ())
15721577 mLogger .printMessage (" '--executor' has no effect as only a single job will be used." );
@@ -1690,13 +1695,15 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
16901695 return Result::Success;
16911696}
16921697
1693- void CmdLineParser::printHelp () const
1698+ void CmdLineParser::printHelp (bool premium ) const
16941699{
1695- const std::string manualUrl (isCppcheckPremium () ?
1696- " https://cppcheck.sourceforge.io/manual.pdf" :
1697- " https://files.cppchecksolutions.com/manual.pdf" );
1700+ // TODO: fetch URL from config like product name?
1701+ const std::string manualUrl (premium ?
1702+ " https://files.cppchecksolutions.com/manual.pdf" :
1703+ " https://cppcheck.sourceforge.io/manual.pdf" );
16981704
16991705 std::ostringstream oss;
1706+ // TODO: display product name
17001707 oss << " Cppcheck - A tool for static C/C++ code analysis\n "
17011708 " \n "
17021709 " Syntax:\n "
@@ -1890,7 +1897,7 @@ void CmdLineParser::printHelp() const
18901897 " --plist-output=<path>\n "
18911898 " Generate Clang-plist output files in folder.\n " ;
18921899
1893- if (isCppcheckPremium () ) {
1900+ if (premium ) {
18941901 oss <<
18951902 " --premium=<option>\n "
18961903 " Coding standards:\n "
@@ -2073,6 +2080,7 @@ void CmdLineParser::printHelp() const
20732080}
20742081
20752082std::string CmdLineParser::getVersion () const {
2083+ // TODO: this should not contain the version - it should set the extraVersion
20762084 if (!mSettings .cppcheckCfgProductName .empty ())
20772085 return mSettings .cppcheckCfgProductName ;
20782086 const char * const extraVersion = CppCheck::extraVersion ();
@@ -2081,12 +2089,6 @@ std::string CmdLineParser::getVersion() const {
20812089 return std::string (" Cppcheck " ) + CppCheck::version ();
20822090}
20832091
2084- bool CmdLineParser::isCppcheckPremium () const {
2085- if (mSettings .cppcheckCfgProductName .empty ())
2086- Settings::loadCppcheckCfg (mSettings , mSuppressions , mSettings .debuglookup || mSettings .debuglookupConfig );
2087- return startsWith (mSettings .cppcheckCfgProductName , " Cppcheck Premium" );
2088- }
2089-
20902092bool CmdLineParser::tryLoadLibrary (Library& destination, const std::string& basepath, const char * filename, bool debug)
20912093{
20922094 const Library::Error err = destination.load (basepath.c_str (), filename, debug);
@@ -2179,13 +2181,19 @@ bool CmdLineParser::loadAddons(Settings& settings)
21792181
21802182bool CmdLineParser::loadCppcheckCfg ()
21812183{
2182- if (!mSettings .cppcheckCfgProductName .empty ())
2183- return true ;
2184+ if (!mSettings .settingsFiles .empty ())
2185+ {
2186+ // should never happen - programming error
2187+ mLogger .printError (" cppcheck.cfg has already been loaded from " + mSettings .settingsFiles [0 ]);
2188+ return false ;
2189+ }
21842190 const std::string cfgErr = Settings::loadCppcheckCfg (mSettings , mSuppressions , mSettings .debuglookup || mSettings .debuglookupConfig );
21852191 if (!cfgErr.empty ()) {
2192+ // TODO: log full path
21862193 mLogger .printError (" could not load cppcheck.cfg - " + cfgErr);
21872194 return false ;
21882195 }
2196+ mSettings .premium = startsWith (mSettings .cppcheckCfgProductName , " Cppcheck Premium" );
21892197 return true ;
21902198}
21912199
0 commit comments