Blame src/defgen.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include <stdlib.h>
Packit 1c1d7e
Packit 1c1d7e
#include "defgen.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "classlist.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "defargs.h"
Packit 1c1d7e
#include "outputgen.h"
Packit 1c1d7e
#include "dot.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
#include "memberlist.h"
Packit 1c1d7e
#include "namespacedef.h"
Packit 1c1d7e
#include "filedef.h"
Packit 1c1d7e
#include "filename.h"
Packit 1c1d7e
Packit 1c1d7e
#include <qdir.h>
Packit 1c1d7e
#include <qfile.h>
Packit 1c1d7e
#include <qtextstream.h>
Packit 1c1d7e
Packit 1c1d7e
#define DEF_DB(x)
Packit 1c1d7e
Packit 1c1d7e
inline void writeDEFString(FTextStream &t,const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  const char* p=s;
Packit 1c1d7e
  char c;
Packit 1c1d7e
Packit 1c1d7e
  t << '\'';
Packit 1c1d7e
  while ((c = *(p++)))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (c == '\'')
Packit 1c1d7e
      t << '\\';
Packit 1c1d7e
    t << c;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << '\'';
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void generateDEFForMember(MemberDef *md,
Packit 1c1d7e
    FTextStream &t,
Packit 1c1d7e
    Definition *def,
Packit 1c1d7e
    const char* Prefix)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString memPrefix;
Packit 1c1d7e
Packit 1c1d7e
  // + declaration
Packit 1c1d7e
  // - reimplements
Packit 1c1d7e
  // - reimplementedBy
Packit 1c1d7e
  // - exceptions
Packit 1c1d7e
  // - const/volatile specifiers
Packit 1c1d7e
  // - examples
Packit 1c1d7e
  // + source definition
Packit 1c1d7e
  // - source references
Packit 1c1d7e
  // - source referenced by
Packit 1c1d7e
  // - include code 
Packit 1c1d7e
Packit 1c1d7e
  if (md->memberType()==MemberType_EnumValue) return;
Packit 1c1d7e
Packit 1c1d7e
  QCString scopeName;
Packit 1c1d7e
  if (md->getClassDef()) 
Packit 1c1d7e
    scopeName=md->getClassDef()->name();
Packit 1c1d7e
  else if (md->getNamespaceDef()) 
Packit 1c1d7e
    scopeName=md->getNamespaceDef()->name();
Packit 1c1d7e
Packit 1c1d7e
  t << "    " << Prefix << "-member = {" << endl;
Packit 1c1d7e
  memPrefix = "      ";
Packit 1c1d7e
  memPrefix.append( Prefix );
Packit 1c1d7e
  memPrefix.append( "-mem-" );
Packit 1c1d7e
Packit 1c1d7e
  QCString memType;
Packit 1c1d7e
  bool isFunc=FALSE;
Packit 1c1d7e
  switch (md->memberType())
Packit 1c1d7e
  {
Packit 1c1d7e
    case MemberType_Define:      memType="define";    break;
Packit 1c1d7e
    case MemberType_EnumValue:   ASSERT(0);           break;
Packit 1c1d7e
    case MemberType_Property:    memType="property";  break;
Packit 1c1d7e
    case MemberType_Event:       memType="event";     break;
Packit 1c1d7e
    case MemberType_Variable:    memType="variable";  break;
Packit 1c1d7e
    case MemberType_Typedef:     memType="typedef";   break;
Packit 1c1d7e
    case MemberType_Enumeration: memType="enum";      break;
Packit 1c1d7e
    case MemberType_Interface:   memType="interface"; break;
Packit 1c1d7e
    case MemberType_Service:     memType="service";   break;
Packit 1c1d7e
    case MemberType_Function:    memType="function";  isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_Signal:      memType="signal";    isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_Friend:      memType="friend";    isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_DCOP:        memType="dcop";      isFunc=TRUE; break;
Packit 1c1d7e
    case MemberType_Slot:        memType="slot";      isFunc=TRUE; break;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << memPrefix << "kind = '" << memType << "';" << endl;
Packit 1c1d7e
  t << memPrefix << "id   = '"
Packit 1c1d7e
    << md->getOutputFileBase() << "_1" << md->anchor()
Packit 1c1d7e
    << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << memPrefix << "virt = ";
Packit 1c1d7e
  switch (md->virtualness())
Packit 1c1d7e
  {
Packit 1c1d7e
    case Normal:  t << "normal;"       << endl; break;
Packit 1c1d7e
    case Virtual: t << "virtual;"      << endl; break;
Packit 1c1d7e
    case Pure:    t << "pure-virtual;" << endl; break;
Packit 1c1d7e
    default: ASSERT(0);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << memPrefix << "prot = ";
Packit 1c1d7e
  switch(md->protection())
Packit 1c1d7e
  {
Packit 1c1d7e
    case Public:    t << "public;"    << endl; break;
Packit 1c1d7e
    case Protected: t << "protected;" << endl; break;
Packit 1c1d7e
    case Private:   t << "private;"   << endl; break;
Packit 1c1d7e
    case Package:   t << "package;"   << endl; break;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md->memberType()!=MemberType_Define &&
Packit 1c1d7e
      md->memberType()!=MemberType_Enumeration
Packit 1c1d7e
     )
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString typeStr = replaceAnonymousScopes(md->typeString());
Packit 1c1d7e
    t << memPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl << typeStr << endl
Packit 1c1d7e
      << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << memPrefix << "name = '" << md->name() << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
  if (isFunc) //function
Packit 1c1d7e
  {
Packit 1c1d7e
    ArgumentList *declAl = new ArgumentList;
Packit 1c1d7e
    ArgumentList *defAl = md->argumentList();
Packit 1c1d7e
    stringToArgumentList(md->argsString(),declAl);
Packit 1c1d7e
    QCString fcnPrefix = "  " + memPrefix + "param-";
Packit 1c1d7e
Packit 1c1d7e
    if (declAl->count()>0)
Packit 1c1d7e
    {
Packit 1c1d7e
      ArgumentListIterator declAli(*declAl);
Packit 1c1d7e
      ArgumentListIterator defAli(*defAl);
Packit 1c1d7e
      Argument *a;
Packit 1c1d7e
      for (declAli.toFirst();(a=declAli.current());++declAli)
Packit 1c1d7e
      {
Packit 1c1d7e
        Argument *defArg = defAli.current();
Packit 1c1d7e
        t << memPrefix << "param = {" << endl;
Packit 1c1d7e
        if (!a->attrib.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << fcnPrefix << "attributes = ";
Packit 1c1d7e
          writeDEFString(t,a->attrib);
Packit 1c1d7e
          t << ';' << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->type.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << fcnPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
            << a->type << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->name.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << fcnPrefix << "declname = ";
Packit 1c1d7e
          writeDEFString(t,a->name);
Packit 1c1d7e
          t << ';' << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
Packit 1c1d7e
        {
Packit 1c1d7e
          t << fcnPrefix << "defname = ";
Packit 1c1d7e
          writeDEFString(t,defArg->name);
Packit 1c1d7e
          t << ';' << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->array.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << fcnPrefix << "array = ";
Packit 1c1d7e
          writeDEFString(t,a->array); 
Packit 1c1d7e
          t << ';' << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (!a->defval.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << fcnPrefix << "defval = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
            << a->defval << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        if (defArg) ++defAli;
Packit 1c1d7e
        t << "      }; /*" << fcnPrefix << "-param */" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    delete declAl;
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (  md->memberType()==MemberType_Define
Packit 1c1d7e
      && md->argsString()!=0)
Packit 1c1d7e
  {
Packit 1c1d7e
    ArgumentListIterator ali(*md->argumentList());
Packit 1c1d7e
    Argument *a;
Packit 1c1d7e
    QCString defPrefix = "  " + memPrefix + "def-";
Packit 1c1d7e
Packit 1c1d7e
    for (ali.toFirst();(a=ali.current());++ali)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << memPrefix << "param  = {" << endl;
Packit 1c1d7e
      t << defPrefix << "name = '" << a->type << "';" << endl;
Packit 1c1d7e
      t << "      }; /*" << defPrefix << "-param */" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (!md->initializer().isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << memPrefix << "initializer = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
      << md->initializer() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  // TODO: exceptions, const volatile
Packit 1c1d7e
  if (md->memberType()==MemberType_Enumeration) // enum
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberList *enumList = md->enumFieldList();
Packit 1c1d7e
    if (enumList!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberListIterator emli(*enumList);
Packit 1c1d7e
      MemberDef *emd;
Packit 1c1d7e
      for (emli.toFirst();(emd=emli.current());++emli)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memPrefix << "enum = { enum-name = " << emd->name() << ';';
Packit 1c1d7e
        if (!emd->initializer().isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          t << " enum-value = ";
Packit 1c1d7e
          writeDEFString(t,emd->initializer());
Packit 1c1d7e
          t << ';';
Packit 1c1d7e
        }
Packit 1c1d7e
        t << " };" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << memPrefix << "desc-file = '" << md->getDefFileName() << "';" << endl;
Packit 1c1d7e
  t << memPrefix << "desc-line = '" << md->getDefLine()     << "';" << endl;
Packit 1c1d7e
  t << memPrefix << "briefdesc =    <<_EnD_oF_dEf_TeXt_"    << endl
Packit 1c1d7e
    << md->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
  t << memPrefix << "documentation = <<_EnD_oF_dEf_TeXt_"   << endl
Packit 1c1d7e
    << md->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
Packit 1c1d7e
  //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
Packit 1c1d7e
Packit 1c1d7e
  MemberSDict *mdict = md->getReferencesMembers();
Packit 1c1d7e
  if (mdict)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberSDict::Iterator mdi(*mdict);
Packit 1c1d7e
    MemberDef *rmd;
Packit 1c1d7e
    QCString refPrefix = "  " + memPrefix + "ref-";
Packit 1c1d7e
Packit 1c1d7e
    for (mdi.toFirst();(rmd=mdi.current());++mdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memPrefix << "referenceto = {" << endl;
Packit 1c1d7e
        t << refPrefix << "id = '"
Packit 1c1d7e
          << rmd->getBodyDef()->getOutputFileBase()
Packit 1c1d7e
          << "_1"   // encoded `:' character (see util.cpp:convertNameToFile)
Packit 1c1d7e
          << rmd->anchor() << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
        t << refPrefix << "line = '"
Packit 1c1d7e
          << rmd->getStartBodyLine() << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
        QCString scope = rmd->getScopeString();
Packit 1c1d7e
        QCString name = rmd->name();
Packit 1c1d7e
        if (!scope.isEmpty() && scope!=def->name())
Packit 1c1d7e
        {
Packit 1c1d7e
          name.prepend(scope+"::");
Packit 1c1d7e
        }
Packit 1c1d7e
Packit 1c1d7e
        t << refPrefix << "name = ";
Packit 1c1d7e
        writeDEFString(t,name);
Packit 1c1d7e
        t << ';' << endl << "    };" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    } /* for (mdi.toFirst...) */
Packit 1c1d7e
  }
Packit 1c1d7e
  mdict = md->getReferencedByMembers();
Packit 1c1d7e
  if (mdict)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberSDict::Iterator mdi(*mdict);
Packit 1c1d7e
    MemberDef *rmd;
Packit 1c1d7e
    QCString refPrefix = "  " + memPrefix + "ref-";
Packit 1c1d7e
Packit 1c1d7e
    for (mdi.toFirst();(rmd=mdi.current());++mdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memPrefix << "referenceby = {" << endl;
Packit 1c1d7e
        t << refPrefix << "id = '"
Packit 1c1d7e
          << rmd->getBodyDef()->getOutputFileBase()
Packit 1c1d7e
          << "_1"   // encoded `:' character (see util.cpp:convertNameToFile)
Packit 1c1d7e
          << rmd->anchor() << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
        t << refPrefix << "line = '"
Packit 1c1d7e
          << rmd->getStartBodyLine() << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
        QCString scope = rmd->getScopeString();
Packit 1c1d7e
        QCString name = rmd->name();
Packit 1c1d7e
        if (!scope.isEmpty() && scope!=def->name())
Packit 1c1d7e
        {
Packit 1c1d7e
          name.prepend(scope+"::");
Packit 1c1d7e
        }
Packit 1c1d7e
Packit 1c1d7e
        t << refPrefix << "name = ";
Packit 1c1d7e
        writeDEFString(t,name);
Packit 1c1d7e
        t << ';' << endl << "    };" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    } /* for (mdi.toFirst...) */
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "    }; /* " << Prefix << "-member */" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void generateDEFClassSection(ClassDef *cd,
Packit 1c1d7e
    FTextStream &t,
Packit 1c1d7e
    MemberList *ml,
Packit 1c1d7e
    const char *kind)
Packit 1c1d7e
{
Packit 1c1d7e
  if (cd && ml && ml->count()>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "  cp-section = {" << endl;
Packit 1c1d7e
    t << "    sec-kind = '" << kind << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
    MemberListIterator mli(*ml);
Packit 1c1d7e
    MemberDef *md;
Packit 1c1d7e
    for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDEFForMember(md,t,cd,"sec");
Packit 1c1d7e
    }
Packit 1c1d7e
    t << "  }; /* cp-section */" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void generateDEFForClass(ClassDef *cd,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  // + brief description
Packit 1c1d7e
  // + detailed description
Packit 1c1d7e
  // - template arguments
Packit 1c1d7e
  // - include files
Packit 1c1d7e
  // + inheritance diagram
Packit 1c1d7e
  // + list of direct super classes
Packit 1c1d7e
  // + list of direct sub classes
Packit 1c1d7e
  // + collaboration diagram
Packit 1c1d7e
  // - list of all members
Packit 1c1d7e
  // + user defined member sections
Packit 1c1d7e
  // + standard member sections
Packit 1c1d7e
  // + detailed member documentation
Packit 1c1d7e
  // - examples
Packit 1c1d7e
Packit 1c1d7e
  if (cd->isReference()) return; // skip external references.
Packit 1c1d7e
  if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
Packit 1c1d7e
  if (cd->templateMaster()!=0) return; // skip generated template instances.
Packit 1c1d7e
Packit 1c1d7e
  t << cd->compoundTypeString() << " = {" << endl;
Packit 1c1d7e
  t << "  cp-id     = '" << cd->getOutputFileBase() << "';" << endl;
Packit 1c1d7e
  t << "  cp-name   = '" << cd->name() << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
  if (cd->baseClasses())
Packit 1c1d7e
  {
Packit 1c1d7e
    BaseClassListIterator bcli(*cd->baseClasses());
Packit 1c1d7e
    BaseClassDef *bcd;
Packit 1c1d7e
    for (bcli.toFirst();(bcd=bcli.current());++bcli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "  cp-ref     = {" << endl << "    ref-type = base;" << endl;
Packit 1c1d7e
      t << "    ref-id   = '"
Packit 1c1d7e
        << bcd->classDef->getOutputFileBase() << "';" << endl;
Packit 1c1d7e
      t << "    ref-prot = ";
Packit 1c1d7e
      switch (bcd->prot)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Public:    t << "public;"    << endl; break;
Packit 1c1d7e
        case Package: // package scope is not possible
Packit 1c1d7e
        case Protected: t << "protected;" << endl; break;
Packit 1c1d7e
        case Private:   t << "private;"   << endl; break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "    ref-virt = ";
Packit 1c1d7e
      switch(bcd->virt)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Normal:  t << "non-virtual;";  break;
Packit 1c1d7e
        case Virtual: t << "virtual;";      break;
Packit 1c1d7e
        case Pure:    t << "pure-virtual;"; break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << endl << "  };" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (cd->subClasses())
Packit 1c1d7e
  {
Packit 1c1d7e
    BaseClassListIterator bcli(*cd->subClasses());
Packit 1c1d7e
    BaseClassDef *bcd;
Packit 1c1d7e
    for (bcli.toFirst();(bcd=bcli.current());++bcli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "  cp-ref     = {" << endl << "    ref-type = derived;" << endl;
Packit 1c1d7e
      t << "    ref-id   = '"
Packit 1c1d7e
        << bcd->classDef->getOutputFileBase() << "';" << endl;
Packit 1c1d7e
      t << "    ref-prot = ";
Packit 1c1d7e
      switch (bcd->prot)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Public:    t << "public;"    << endl; break;
Packit 1c1d7e
        case Package: // packet scope is not possible!
Packit 1c1d7e
        case Protected: t << "protected;" << endl; break;
Packit 1c1d7e
        case Private:   t << "private;"   << endl; break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "    ref-virt = ";
Packit 1c1d7e
      switch(bcd->virt)
Packit 1c1d7e
      {
Packit 1c1d7e
        case Normal:  t << "non-virtual;";  break;
Packit 1c1d7e
        case Virtual: t << "virtual;";      break;
Packit 1c1d7e
        case Pure:    t << "pure-virtual;"; break;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << endl << "  };" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  int numMembers = 0;
Packit 1c1d7e
  QListIterator<MemberList> mli(cd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_detailedLists)==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      numMembers+=ml->count();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (numMembers>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubTypes),"public-type");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_interfaces),"interfaces");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_services),"services");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubMethods),"public-func");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubAttribs),"public-attrib");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubSlots),"public-slot");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_signals),"signal");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_dcopMethods),"dcop-func");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_properties),"property");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubStaticMethods),"public-static-func");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubStaticAttribs),"public-static-attrib");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_proTypes),"protected-type");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_proMethods),"protected-func");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_proAttribs),"protected-attrib");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_proSlots),"protected-slot");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_proStaticMethods),"protected-static-func");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_proStaticAttribs),"protected-static-attrib");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_priTypes),"private-type");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_priMethods),"private-func");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_priAttribs),"private-attrib");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_priSlots),"private-slot");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_priStaticMethods),"private-static-func");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_priStaticAttribs),"private-static-attrib");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_friends),"signal");
Packit 1c1d7e
    generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_related),"related");
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "  cp-filename  = '" << cd->getDefFileName() << "';" << endl;
Packit 1c1d7e
  t << "  cp-fileline  = '" << cd->getDefLine()     << "';" << endl;
Packit 1c1d7e
  t << "  cp-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
    << cd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << "  cp-documentation = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
    << cd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
Packit 1c1d7e
  DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
Packit 1c1d7e
  if (!inheritanceGraph.isTrivial())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "  cp-inheritancegraph = <<_EnD_oF_dEf_TeXt_" << endl;
Packit 1c1d7e
    inheritanceGraph.writeDEF(t);
Packit 1c1d7e
    t << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
Packit 1c1d7e
  if (!collaborationGraph.isTrivial())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "  cp-collaborationgraph = <<_EnD_oF_dEf_TeXt_" << endl;
Packit 1c1d7e
    collaborationGraph.writeDEF(t);
Packit 1c1d7e
    t << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "}; /* " <<  cd->compoundTypeString() << " */" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void generateDEFSection(Definition *d,
Packit 1c1d7e
    FTextStream &t,
Packit 1c1d7e
    MemberList *ml,
Packit 1c1d7e
    const char *kind)
Packit 1c1d7e
{
Packit 1c1d7e
  if (ml && ml->count()>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    " << kind << " = {" << endl;
Packit 1c1d7e
    MemberListIterator mli(*ml);
Packit 1c1d7e
    MemberDef *md;
Packit 1c1d7e
    for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDEFForMember(md,t,d,kind);
Packit 1c1d7e
    }
Packit 1c1d7e
    t << "    };" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void generateDEFForNamespace(NamespaceDef *nd,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (nd->isReference()) return; // skip external references
Packit 1c1d7e
  t << "  namespace = {" << endl;
Packit 1c1d7e
  t << "    ns-id   = '" << nd->getOutputFileBase() << "';" << endl;
Packit 1c1d7e
  t << "    ns-name = ";
Packit 1c1d7e
  writeDEFString(t,nd->name());
Packit 1c1d7e
  t << ';' << endl;
Packit 1c1d7e
Packit 1c1d7e
  generateDEFSection(nd,t,nd->getMemberList(MemberListType_decDefineMembers),"define");
Packit 1c1d7e
  generateDEFSection(nd,t,nd->getMemberList(MemberListType_decProtoMembers),"prototype");
Packit 1c1d7e
  generateDEFSection(nd,t,nd->getMemberList(MemberListType_decTypedefMembers),"typedef");
Packit 1c1d7e
  generateDEFSection(nd,t,nd->getMemberList(MemberListType_decEnumMembers),"enum");
Packit 1c1d7e
  generateDEFSection(nd,t,nd->getMemberList(MemberListType_decFuncMembers),"func");
Packit 1c1d7e
  generateDEFSection(nd,t,nd->getMemberList(MemberListType_decVarMembers),"var");
Packit 1c1d7e
Packit 1c1d7e
  t << "  ns-filename  = '" << nd->getDefFileName() << "';" << endl;
Packit 1c1d7e
  t << "  ns-fileline  = '" << nd->getDefLine()     << "';" << endl;
Packit 1c1d7e
  t << "  ns-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
    << nd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << "  ns-documentation = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
    << nd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
  t << "  };" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void generateDEFForFile(FileDef *fd,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (fd->isReference()) return; // skip external references
Packit 1c1d7e
Packit 1c1d7e
  t << "file = {" << endl;
Packit 1c1d7e
  t << "  file-id   = '" << fd->getOutputFileBase() << "';" << endl;
Packit 1c1d7e
  t << "  file-name = ";
Packit 1c1d7e
  writeDEFString(t,fd->name());
Packit 1c1d7e
  t << ';' << endl;
Packit 1c1d7e
Packit 1c1d7e
  generateDEFSection(fd,t,fd->getMemberList(MemberListType_decDefineMembers),"define");
Packit 1c1d7e
  generateDEFSection(fd,t,fd->getMemberList(MemberListType_decProtoMembers),"prototype");
Packit 1c1d7e
  generateDEFSection(fd,t,fd->getMemberList(MemberListType_decTypedefMembers),"typedef");
Packit 1c1d7e
  generateDEFSection(fd,t,fd->getMemberList(MemberListType_decEnumMembers),"enum");
Packit 1c1d7e
  generateDEFSection(fd,t,fd->getMemberList(MemberListType_decFuncMembers),"func");
Packit 1c1d7e
  generateDEFSection(fd,t,fd->getMemberList(MemberListType_decVarMembers),"var");
Packit 1c1d7e
Packit 1c1d7e
  t << "  file-full-name  = '" << fd->getDefFileName() << "';" << endl;
Packit 1c1d7e
  t << "  file-first-line = '" << fd->getDefLine()     << "';" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << "  file-briefdesc  = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
    << fd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << "  file-documentation = <<_EnD_oF_dEf_TeXt_" << endl
Packit 1c1d7e
    << fd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << "}; /* file */" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void generateDEF()
Packit 1c1d7e
{
Packit 1c1d7e
  QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
Packit 1c1d7e
  if (outputDirectory.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    outputDirectory=QDir::currentDirPath().utf8();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    QDir dir(outputDirectory);
Packit 1c1d7e
    if (!dir.exists())
Packit 1c1d7e
    {
Packit 1c1d7e
      dir.setPath(QDir::currentDirPath());
Packit 1c1d7e
      if (!dir.mkdir(outputDirectory))
Packit 1c1d7e
      {
Packit 1c1d7e
        err("tag OUTPUT_DIRECTORY: Output directory `%s' does not "
Packit 1c1d7e
            "exist and cannot be created\n",outputDirectory.data());
Packit 1c1d7e
        exit(1);
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        msg("Notice: Output directory `%s' does not exist. "
Packit 1c1d7e
            "I have created it for you.\n", outputDirectory.data());
Packit 1c1d7e
      }
Packit 1c1d7e
      dir.cd(outputDirectory);
Packit 1c1d7e
    }
Packit 1c1d7e
    outputDirectory=dir.absPath().utf8();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QDir dir(outputDirectory);
Packit 1c1d7e
  if (!dir.exists())
Packit 1c1d7e
  {
Packit 1c1d7e
    dir.setPath(QDir::currentDirPath());
Packit 1c1d7e
    if (!dir.mkdir(outputDirectory))
Packit 1c1d7e
    {
Packit 1c1d7e
      err("Cannot create directory %s\n",outputDirectory.data());
Packit 1c1d7e
      return;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  QDir defDir(outputDirectory+"/def");
Packit 1c1d7e
  if (!defDir.exists() && !defDir.mkdir(outputDirectory+"/def"))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Could not create def directory in %s\n",outputDirectory.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QCString fileName=outputDirectory+"/def/doxygen.def";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  t << "AutoGen Definitions dummy;" << endl;
Packit 1c1d7e
Packit 1c1d7e
  if (Doxygen::classSDict->count()+Doxygen::inputNameList->count()>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassSDict::Iterator cli(*Doxygen::classSDict);
Packit 1c1d7e
    ClassDef *cd;
Packit 1c1d7e
    for (cli.toFirst();(cd=cli.current());++cli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDEFForClass(cd,t);
Packit 1c1d7e
    }
Packit 1c1d7e
    FileNameListIterator fnli(*Doxygen::inputNameList);
Packit 1c1d7e
    FileName *fn;
Packit 1c1d7e
    for (;(fn=fnli.current());++fnli)
Packit 1c1d7e
    {
Packit 1c1d7e
      FileNameIterator fni(*fn);
Packit 1c1d7e
      FileDef *fd;
Packit 1c1d7e
      for (;(fd=fni.current());++fni)
Packit 1c1d7e
      {
Packit 1c1d7e
        generateDEFForFile(fd,t);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "dummy_value = true;" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}