CppVarTypePtr parseType(std::string s) { do { CppParser parser; s += " DummyVar;"; s += '\0'; s += '\0'; auto compound = parser.parseStream(&s[0], s.size()); if (compound == nullptr) break; if (compound->members().empty()) break; if (compound->members().front()->objType_ != CppObjType::kVar) break; auto obj = compound->deassocMemberAt(0); CppVarEPtr var = obj; if (var) { CppVarTypePtr ret(new CppVarType(*var->varType())); normalizeConst(ret.get()); return ret; } } while (false); return nullptr; }
bool CibIdMgr::loadIds(const std::string& idsFilePath) { CppParser cppparser; auto idCmp = cppparser.parseFile(idsFilePath.c_str()); if (idCmp == nullptr) return false; std::unordered_map<CibFullClassNsName, CibFullClassName> nsNameToNameMap; traverse(idCmp, [&](const CppObj* cppObj) -> bool { if (cppObj->objType_ == CppObjType::kEnum) { auto* enumObj = static_cast<const CppEnum*>(cppObj); if (!enumObj->itemList_) return false; static const std::string kClassIdName = "__zz_cib_classid"; static const std::string kMethodIdName = "__zz_cib_methodid"; static const std::string kNextClsIdName = "__zz_cib_next_class_id"; auto extractClassName = [](const CppCompound* classObj) -> std::string { if (!classObj->members().empty() && (classObj->members().front()->objType_ == CppObjType::kDocComment)) { static const std::string kClsNameCommentStart = "//#= FullClassName: "; const CppDocCommentEPtr cmnt = classObj->members().front(); auto startPos = cmnt->doc_.find(kClsNameCommentStart); if (startPos != std::string::npos) return cmnt->doc_.substr(startPos + kClsNameCommentStart.size()); } return ""; }; auto extractClassNsName = [](const CppCompound* classObj) -> std::string { return fullName(classObj).substr(11); // skip "__zz_cib_::" }; if (cppObj->owner()->name() == kMethodIdName) { auto classNsName = extractClassNsName(cppObj->owner()->owner()); auto itr = nsNameToNameMap.find(classNsName); if (itr != nsNameToNameMap.end()) loadMethodIds(itr->second, static_cast<const CppEnum*>(cppObj)); } else if (enumObj->itemList_->front()->name_ == kClassIdName) { auto clsName = extractClassName(enumObj->owner()); auto clsNsName = extractClassNsName(enumObj->owner()); auto clsId = parseIdExpression(enumObj->itemList_->front()->val_); if (clsId != 0) addClass(clsName, clsNsName, clsId); if (!clsName.empty() && !clsNsName.empty()) nsNameToNameMap[clsNsName] = clsName; } else if (enumObj->itemList_->front()->name_ == kNextClsIdName) { auto nextClsId = parseIdExpression(enumObj->itemList_->front()->val_); if (nextClassId_ < nextClsId) nextClassId_ = nextClsId; } } return false; }); return true; }
int main(int argc, char const *const argv[]) { CppParser::eErrorTypes et = CppParser::ET_None; OovError::setComponent(EC_OovCppParser); if(argc >= 4) { bool dupHashes = false; OovProcessChildArgs childArgs; for(int i=4; i<argc; i++) { if(strcmp(argv[i], "-dups") == 0) { dupHashes = true; } else { childArgs.addArg(argv[i]); } } // This saves the CPP info in an XMI file. // et = sCppParser.parse(dupHashes, argv[1], argv[2], argv[3], &argv[4], argc-4); et = sCppParser.parse(dupHashes, argv[1], argv[2], argv[3], childArgs.getArgv(), static_cast<int>(childArgs.getArgc())); if(et == CppParser::ET_CLangError) { fprintf(stderr, "oovCppParser: CLang error analyzing file %s.\n" "It could be an argument error (Windows spaces in path), or a bug in CLang\n", argv[1]); } else if(et != CppParser::ET_None && et != CppParser::ET_CompileWarnings) { fprintf(stderr, "oovCppParser: Error analyzing file %s\n", argv[1]); } } else { fprintf(stderr, "OovCppParser version %s\n", OOV_VERSION); fprintf(stderr, "oovCppParser args are: sourceFilePath sourceRootDir outputProjectFilesDir [cppArgs]...\n"); } int exitCode = 0; if(et != CppParser::ET_None && et != CppParser::ET_CompileWarnings) exitCode = EXIT_FAILURE; return exitCode; }
int main(int argc, char *argv[]) { string inPath, outPath; // in - source code, out - xml report if(!processCmdLineArgs(argc, argv, inPath, outPath)) return 0; // cout << "Parsing..."; CppParser cpp; Project *project = cpp.parseFile(inPath); if(cpp.errorOccured()) { cout << "Error!" << endl; return 1; } cout << "Ok." << endl; // #if YYDEBUG == 1 // // TinyXML test TiXmlDocument doc; TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "utf-8", "yes"); doc.LinkEndChild(decl); // //TiXmlStylesheetReference *style = new TiXmlStylesheetReference("text/xsl", "test.xsl"); //doc.LinkEndChild(style); // TiXmlElement *root = new TiXmlElement("ASTM"); project->dumpXml(root); doc.LinkEndChild(root); // doc.SaveFile("astm_dump.xml"); // #endif // YYDEBUG == 1 // cout << "Analysing..."; // LinesOfCode loc(project->files[0]); CommentsDensity commdens(loc); CyclomaticComplexityNumber ccn(project->files[0]); DecisionDensity decdens(loc, ccn); NPathComplexity npath(project->files[0]); TotalFunctionCalls tfc(project->files[0]); NumberOfClasses noc(project->files[0]); LorenzKidd lk(project->files[0]); // string resultsFile = (outPath.size() > 0) ? outPath : "report.xml"; ofstream fout; fout.open(resultsFile.c_str()); if(!fout.is_open()) { cout << "Error writing the results!" << endl; return 2; } fout << "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n" << "<?xml-stylesheet href=\"sw_metrics.xsl\" type=\"text/xml\"?>\n" << "<sw_stats>\n" << "\t<file>" << inPath << "</file>\n" << loc.dumpResultXml() << commdens.dumpResultXml() << ccn.dumpResultXml() << decdens.dumpResultXml() << npath.dumpResultXml() << tfc.dumpResultXml() << noc.dumpResultXml() << lk.dumpResultXml() << "</sw_stats>\n"; // fout.close(); cout << "Ok." << endl; cout << "Results written into '" << resultsFile << "'." << endl; // //delete project; return 0; }
int main(int argc, char* argv[]) { char *srcFileName = 0; char *dtbFileName = 0; char *hstFileName = 0; // --- read command line parameter -------------------------------------- if (argc < 2 || argc > 4) { Help("Wong number of arguments"); return 1; } srcFileName = argv[1]; if (srcFileName == 0) { Help(); return 1; } for (int i=2; i<argc; i++) { if (argv[i][0] != '-') Help("Wrong argument"); switch (argv[i][1]) { case 'd': dtbFileName = &(argv[i][2]); break; case 'h': hstFileName = &(argv[i][2]); break; default: Help("Wong argument opti"); return 1; } } CreateTimeStamp(); // --- analyze C++ file ------------------------------------------ FILE *f; functList cmdList; CppParser parser; try { parser.Open(srcFileName); while(true) { parser.GetRpcExport(); parser.GetFunctionDecl(); cmdList.push_back(parser.GetFname() + '$' + parser.GetFparam()); printf("%s$%s\n", parser.GetFname().c_str(), parser.GetFparam().c_str()); } } catch (CPError e) { if (e.error != CPError::END_OF_FILE) { e.What(); return 1; } } parser.Close(); // --- create server functions if (dtbFileName) { f = fopen(dtbFileName, "wt"); if (!f) { printf("ERROR: could not create DTB code file\n"); return 1; } GenerateServerCodeHeader(f); GenerateServerCode(cmdList, f); GenerateServerCodeTrailer(cmdList, f); fclose(f); } // generate host functions if (hstFileName) { f = fopen(hstFileName, "wt"); if (!f) { printf("ERROR: could not create host code file\n"); return 2; } GenerateClientCodeHeader(cmdList, f); GenerateClientCode(cmdList, f); fclose(f); } // system("pause"); return 0; }