|
Packit Service |
50c9f2 |
/******************************************************************************
|
|
Packit Service |
50c9f2 |
*
|
|
Packit Service |
50c9f2 |
* $Id$
|
|
Packit Service |
50c9f2 |
*
|
|
Packit Service |
50c9f2 |
*
|
|
Packit Service |
50c9f2 |
* Copyright (C) 1997-2006 by Dimitri van Heesch.
|
|
Packit Service |
50c9f2 |
*
|
|
Packit Service |
50c9f2 |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit Service |
50c9f2 |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit Service |
50c9f2 |
* granted. No representations are made about the suitability of this software
|
|
Packit Service |
50c9f2 |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit Service |
50c9f2 |
* See the GNU General Public License for more details.
|
|
Packit Service |
50c9f2 |
*
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/*! \mainpage Metrics
|
|
Packit Service |
50c9f2 |
* This is a small example that shows how to use doxygen's XML output and
|
|
Packit Service |
50c9f2 |
* the doxmlparser library. The example shows some very basic code metrics.
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#include <stdio.h>
|
|
Packit Service |
50c9f2 |
#include <stdlib.h>
|
|
Packit Service |
50c9f2 |
#include <string.h>
|
|
Packit Service |
50c9f2 |
#include <doxmlintf.h>
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
bool isDocumented(IDocRoot *brief,IDocRoot *detailed)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
bool found=false;
|
|
Packit Service |
50c9f2 |
if (brief)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
IDocIterator *docIt = brief->contents();
|
|
Packit Service |
50c9f2 |
if (docIt->current()) // method has brief description
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
found=true;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
docIt->release();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
if (detailed && !found)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
IDocIterator *docIt = detailed->contents();
|
|
Packit Service |
50c9f2 |
if (docIt->current())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
found=true;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
docIt->release();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
return found;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
int main(int argc,char **argv)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (argc!=2)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
printf("Usage: %s xml_output_dir\n",argv[0]);
|
|
Packit Service |
50c9f2 |
exit(1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
int numClasses=0;
|
|
Packit Service |
50c9f2 |
int numDocClasses=0;
|
|
Packit Service |
50c9f2 |
int numStructs=0;
|
|
Packit Service |
50c9f2 |
int numUnions=0;
|
|
Packit Service |
50c9f2 |
int numInterfaces=0;
|
|
Packit Service |
50c9f2 |
int numExceptions=0;
|
|
Packit Service |
50c9f2 |
int numNamespaces=0;
|
|
Packit Service |
50c9f2 |
int numFiles=0;
|
|
Packit Service |
50c9f2 |
int numGroups=0;
|
|
Packit Service |
50c9f2 |
int numPages=0;
|
|
Packit Service |
50c9f2 |
int numPackages=0;
|
|
Packit Service |
50c9f2 |
int numPubMethods=0;
|
|
Packit Service |
50c9f2 |
int numProMethods=0;
|
|
Packit Service |
50c9f2 |
int numPriMethods=0;
|
|
Packit Service |
50c9f2 |
int numDocPubMethods=0;
|
|
Packit Service |
50c9f2 |
int numDocProMethods=0;
|
|
Packit Service |
50c9f2 |
int numDocPriMethods=0;
|
|
Packit Service |
50c9f2 |
int numFunctions=0;
|
|
Packit Service |
50c9f2 |
int numAttributes=0;
|
|
Packit Service |
50c9f2 |
int numVariables=0;
|
|
Packit Service |
50c9f2 |
int numDocFunctions=0;
|
|
Packit Service |
50c9f2 |
int numDocAttributes=0;
|
|
Packit Service |
50c9f2 |
int numDocVariables=0;
|
|
Packit Service |
50c9f2 |
int numParams=0;
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
IDoxygen *dox = createObjectModel();
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
dox->setDebugLevel(0);
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
if (!dox->readXMLDir(argv[1]))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
printf("Error reading %s/index.xml\n",argv[1]);
|
|
Packit Service |
50c9f2 |
exit(1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
ICompoundIterator *cli = dox->compounds();
|
|
Packit Service |
50c9f2 |
ICompound *comp;
|
|
Packit Service |
50c9f2 |
for (cli->toFirst();(comp=cli->current());cli->toNext())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
printf("Processing %s...\n",comp->name()->latin1());
|
|
Packit Service |
50c9f2 |
bool hasDocs = isDocumented(comp->briefDescription(),comp->detailedDescription());
|
|
Packit Service |
50c9f2 |
switch (comp->kind())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
case ICompound::Class:
|
|
Packit Service |
50c9f2 |
numClasses++;
|
|
Packit Service |
50c9f2 |
if (hasDocs) numDocClasses++;
|
|
Packit Service |
50c9f2 |
break;
|
|
Packit Service |
50c9f2 |
case ICompound::Struct: numStructs++; break;
|
|
Packit Service |
50c9f2 |
case ICompound::Union: numUnions++; break;
|
|
Packit Service |
50c9f2 |
case ICompound::Interface: numInterfaces++; break;
|
|
Packit Service |
50c9f2 |
case ICompound::Exception: numExceptions++; break;
|
|
Packit Service |
50c9f2 |
case ICompound::Namespace: numNamespaces++; break;
|
|
Packit Service |
50c9f2 |
case ICompound::File: numFiles++; break;
|
|
Packit Service |
50c9f2 |
case ICompound::Group: numGroups++; break;
|
|
Packit Service |
50c9f2 |
case ICompound::Page: numPages++; break;
|
|
Packit Service |
50c9f2 |
default: break;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
ISectionIterator *sli = comp->sections();
|
|
Packit Service |
50c9f2 |
ISection *sec;
|
|
Packit Service |
50c9f2 |
for (sli->toFirst();(sec=sli->current());sli->toNext())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
IMemberIterator *mli = sec->members();
|
|
Packit Service |
50c9f2 |
IMember *mem;
|
|
Packit Service |
50c9f2 |
for (mli->toFirst();(mem=mli->current());mli->toNext())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
IParamIterator *pli = mem->parameters();
|
|
Packit Service |
50c9f2 |
IParam *par;
|
|
Packit Service |
50c9f2 |
if (comp->kind()==ICompound::Class ||
|
|
Packit Service |
50c9f2 |
comp->kind()==ICompound::Struct ||
|
|
Packit Service |
50c9f2 |
comp->kind()==ICompound::Interface
|
|
Packit Service |
50c9f2 |
)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (mem->kind()==IMember::Function ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Prototype ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Signal ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Slot ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::DCOP
|
|
Packit Service |
50c9f2 |
) // is a "method"
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (mem->section()->isPublic())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numPubMethods++;
|
|
Packit Service |
50c9f2 |
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numDocPubMethods++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (mem->section()->isProtected())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numProMethods++;
|
|
Packit Service |
50c9f2 |
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numDocProMethods++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (mem->section()->isPrivate())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numPriMethods++;
|
|
Packit Service |
50c9f2 |
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numDocPriMethods++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (mem->kind()==IMember::Variable ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Property
|
|
Packit Service |
50c9f2 |
) // is an "attribute"
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numAttributes++;
|
|
Packit Service |
50c9f2 |
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numDocAttributes++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (comp->kind()==ICompound::File ||
|
|
Packit Service |
50c9f2 |
comp->kind()==ICompound::Namespace
|
|
Packit Service |
50c9f2 |
)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (mem->kind()==IMember::Function ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Prototype ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Signal ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Slot ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::DCOP
|
|
Packit Service |
50c9f2 |
) // is a "method"
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numFunctions++;
|
|
Packit Service |
50c9f2 |
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numDocFunctions++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (mem->kind()==IMember::Variable ||
|
|
Packit Service |
50c9f2 |
mem->kind()==IMember::Property
|
|
Packit Service |
50c9f2 |
) // is an "attribute"
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numVariables++;
|
|
Packit Service |
50c9f2 |
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numDocVariables++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
for (pli->toFirst();(par=pli->current());pli->toNext())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numParams++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
const char *type = mem->typeString()->latin1();
|
|
Packit Service |
50c9f2 |
if (type && strcmp(type, "void"))
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
numParams++; // count non-void return types as well
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
pli->release();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
mli->release();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
sli->release();
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
comp->release();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
cli->release();
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
dox->release();
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
int numMethods = numPubMethods+numProMethods+numPriMethods;
|
|
Packit Service |
50c9f2 |
int numDocMethods = numDocPubMethods+numDocProMethods+numDocPriMethods;
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
printf("Metrics:\n");
|
|
Packit Service |
50c9f2 |
printf("-----------------------------------\n");
|
|
Packit Service |
50c9f2 |
if (numClasses>0) printf("Classes: %10d (%d documented)\n",numClasses,numDocClasses);
|
|
Packit Service |
50c9f2 |
if (numStructs>0) printf("Structs: %10d\n",numStructs);
|
|
Packit Service |
50c9f2 |
if (numUnions>0) printf("Unions: %10d\n",numUnions);
|
|
Packit Service |
50c9f2 |
if (numInterfaces>0) printf("Interfaces: %10d\n",numInterfaces);
|
|
Packit Service |
50c9f2 |
if (numExceptions>0) printf("Exceptions: %10d\n",numExceptions);
|
|
Packit Service |
50c9f2 |
if (numNamespaces>0) printf("Namespaces: %10d\n",numNamespaces);
|
|
Packit Service |
50c9f2 |
if (numFiles>0) printf("Files: %10d\n",numFiles);
|
|
Packit Service |
50c9f2 |
if (numGroups>0) printf("Groups: %10d\n",numGroups);
|
|
Packit Service |
50c9f2 |
if (numPages>0) printf("Pages: %10d\n",numPages);
|
|
Packit Service |
50c9f2 |
if (numPackages>0) printf("Packages: %10d\n",numPackages);
|
|
Packit Service |
50c9f2 |
if (numMethods>0) printf("Methods: %10d (%d documented)\n",numMethods,numDocMethods);
|
|
Packit Service |
50c9f2 |
if (numPubMethods>0) printf(" Public: %10d (%d documented)\n",numPubMethods,numDocPubMethods);
|
|
Packit Service |
50c9f2 |
if (numProMethods>0) printf(" Protected: %10d (%d documented)\n",numProMethods,numDocProMethods);
|
|
Packit Service |
50c9f2 |
if (numPriMethods>0) printf(" Private: %10d (%d documented)\n",numPriMethods,numDocPriMethods);
|
|
Packit Service |
50c9f2 |
if (numFunctions>0) printf("Functions: %10d (%d documented)\n",numFunctions,numDocFunctions);
|
|
Packit Service |
50c9f2 |
if (numAttributes>0) printf("Attributes: %10d (%d documented)\n",numAttributes,numDocAttributes);
|
|
Packit Service |
50c9f2 |
if (numVariables>0) printf("Variables: %10d (%d documented)\n",numVariables,numDocVariables);
|
|
Packit Service |
50c9f2 |
if (numParams>0) printf("Params: %10d\n",numParams);
|
|
Packit Service |
50c9f2 |
printf("-----------------------------------\n");
|
|
Packit Service |
50c9f2 |
if (numClasses>0) printf("Avg. #methods/compound: %10f\n",(double)numMethods/(double)numClasses);
|
|
Packit Service |
50c9f2 |
if (numMethods>0) printf("Avg. #params/method: %10f\n",(double)numParams/(double)numMethods);
|
|
Packit Service |
50c9f2 |
printf("-----------------------------------\n");
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
return 0;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|