Listing 2
static void onNewIssueHandler(const char* pFilename, int number) { int severity = getSeverity(number); // Update global metrics ++gIssuesCount; gSeverityScore += severity; // Obtain file object string filename(pFilename); File* pFile = 0; FILE_MAP::iterator iterFile = gFileMap.find(filename); // If unknown filename, create new file object if (iterFile == gFileMap.end()) { pFile = new File(filename); bool wasInserted = gFileMap.insert(make_pair(filename, pFile)).second; assert(wasInserted); // If known filename, retrieve existing file object } else { pFile = (*iterFile).second; } // Obtain issue object Issue* pIssue = 0; ISSUE_MAP::iterator iterIssue = gIssueMap.find(number); // If unknown issue, create new issue object if (iterIssue == gIssueMap.end()) { pIssue = new Issue(number, severity); bool wasInserted = gIssueMap.insert(make_pair(number, pIssue)).second; assert(wasInserted); // If known issue, retrieve existing issue object } else { pIssue = (*iterIssue).second; } // Update file/issue metrics pFile->addIssue(pIssue); pIssue->addFile(pFile); } static void buildMetricsLists() { // Create sorted file list FILE_MAP::iterator iterFile = gFileMap.begin(); for (; iterFile != gFileMap.end(); ++iterFile) { gFileList.push_back(*(*iterFile).second); } sort(gFileList.begin(), gFileList.end()); // Create sorted issue list ISSUE_MAP::iterator iterIssue = gIssueMap.begin(); for (; iterIssue != gIssueMap.end(); ++iterIssue) { gIssueList.push_back(*(*iterIssue).second); } sort(gIssueList.begin(), gIssueList.end()); } int main(int argc, const char* const argv[]) { try { initGlobals(); scanCommandLine(argc, argv); parseLintOutputFile(gpLintOutputFile, &onNewIssueHandler); buildMetricsLists(); reportMetrics(); } catch (const ParseFileNotFoundError& e) { reportFatalError("Cannot access " + e.getFilename()); } catch (const ParseMalformedLineError& e) { ostringstream s; s << "Malformed file: " << e.getFilename() << ", line: " << e.getLineNo(); reportFatalError(s.str()); } catch (...) { reportFatalError("Unspecified fatal error"); } return EXIT_SUCCESS; }