Blame addon/doxmlparser/examples/metrics/main.cpp

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