コード例 #1
0
ファイル: cibutil.cpp プロジェクト: satya-das/cib
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;
}
コード例 #2
0
ファイル: cibidmgr.cpp プロジェクト: satya-das/cib
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;
}
コード例 #3
0
ファイル: oovCppParser.cpp プロジェクト: animatedb/oovaide
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;
    }
コード例 #4
0
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;
}
コード例 #5
0
ファイル: rpcgen.cpp プロジェクト: mverzocc/psi46exp
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;
}