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;
}