Blame src/definition.cpp

Packit Service 50c9f2
/******************************************************************************
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * 
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Copyright (C) 1997-2015 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
 * Documents produced by Doxygen are derivative works derived from the
Packit Service 50c9f2
 * input used in their production; they are not affected by this license.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 */
Packit Service 50c9f2
Packit Service 50c9f2
#include <ctype.h>
Packit Service 50c9f2
#include <qregexp.h>
Packit Service 50c9f2
#include "md5.h"
Packit Service 50c9f2
#include <stdio.h>
Packit Service 50c9f2
#include <stdlib.h>
Packit Service 50c9f2
#include <assert.h>
Packit Service 50c9f2
#include "config.h"
Packit Service 50c9f2
#include "definition.h"
Packit Service 50c9f2
#include "doxygen.h"
Packit Service 50c9f2
#include "language.h"
Packit Service 50c9f2
#include "message.h"
Packit Service 50c9f2
#include "outputlist.h"
Packit Service 50c9f2
#include "code.h"
Packit Service 50c9f2
#include "util.h"
Packit Service 50c9f2
#include "groupdef.h"
Packit Service 50c9f2
#include "pagedef.h"
Packit Service 50c9f2
#include "section.h"
Packit Service 50c9f2
#include "htags.h"
Packit Service 50c9f2
#include "parserintf.h"
Packit Service 50c9f2
#include "marshal.h"
Packit Service 50c9f2
#include "debug.h"
Packit Service 50c9f2
#include "vhdldocgen.h"
Packit Service 50c9f2
#include "memberlist.h"
Packit Service 50c9f2
#include "namespacedef.h"
Packit Service 50c9f2
#include "filedef.h"
Packit Service 50c9f2
#include "dirdef.h"
Packit Service 50c9f2
Packit Service 50c9f2
#define START_MARKER 0x4445465B // DEF[
Packit Service 50c9f2
#define END_MARKER   0x4445465D // DEF]
Packit Service 50c9f2
Packit Service 50c9f2
//-----------------------------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/** Private data associated with a Symbol Definition object. */
Packit Service 50c9f2
class DefinitionImpl
Packit Service 50c9f2
{
Packit Service 50c9f2
  public:
Packit Service 50c9f2
    DefinitionImpl();
Packit Service 50c9f2
   ~DefinitionImpl();
Packit Service 50c9f2
    void init(const char *df, const char *n);
Packit Service 50c9f2
Packit Service 50c9f2
    SectionDict *sectionDict;  // dictionary of all sections, not accessible
Packit Service 50c9f2
Packit Service 50c9f2
    MemberSDict *sourceRefByDict;
Packit Service 50c9f2
    MemberSDict *sourceRefsDict;
Packit Service 50c9f2
    QList<ListItemInfo> *xrefListItems;
Packit Service 50c9f2
    GroupList *partOfGroups;
Packit Service 50c9f2
Packit Service 50c9f2
    DocInfo   *details;    // not exported
Packit Service 50c9f2
    DocInfo   *inbodyDocs; // not exported
Packit Service 50c9f2
    BriefInfo *brief;      // not exported
Packit Service 50c9f2
    BodyInfo  *body;       // not exported
Packit Service 50c9f2
    QCString   briefSignatures;
Packit Service 50c9f2
    QCString   docSignatures;
Packit Service 50c9f2
Packit Service 50c9f2
    QCString localName;      // local (unqualified) name of the definition
Packit Service 50c9f2
                             // in the future m_name should become m_localName
Packit Service 50c9f2
    QCString qualifiedName;
Packit Service 50c9f2
    QCString ref;   // reference to external documentation
Packit Service 50c9f2
Packit Service 50c9f2
    bool hidden;
Packit Service 50c9f2
    bool isArtificial;
Packit Service 50c9f2
Packit Service 50c9f2
    Definition *outerScope;  // not owner
Packit Service 50c9f2
Packit Service 50c9f2
    // where the item was found
Packit Service 50c9f2
    QCString defFileName;
Packit Service 50c9f2
    QCString defFileExt;
Packit Service 50c9f2
Packit Service 50c9f2
    SrcLangExt lang;
Packit Service 50c9f2
Packit Service 50c9f2
    QCString id; // clang unique id
Packit Service 50c9f2
};
Packit Service 50c9f2
Packit Service 50c9f2
DefinitionImpl::DefinitionImpl()
Packit Service 50c9f2
  : sectionDict(0), sourceRefByDict(0), sourceRefsDict(0),
Packit Service 50c9f2
    xrefListItems(0), partOfGroups(0),
Packit Service 50c9f2
    details(0), inbodyDocs(0), brief(0), body(0), hidden(FALSE), isArtificial(FALSE),
Packit Service 50c9f2
    outerScope(0), lang(SrcLangExt_Unknown)
Packit Service 50c9f2
{
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
DefinitionImpl::~DefinitionImpl()
Packit Service 50c9f2
{
Packit Service 50c9f2
  delete sectionDict;
Packit Service 50c9f2
  delete sourceRefByDict;
Packit Service 50c9f2
  delete sourceRefsDict;
Packit Service 50c9f2
  delete partOfGroups;
Packit Service 50c9f2
  delete xrefListItems;
Packit Service 50c9f2
  delete brief;
Packit Service 50c9f2
  delete details;
Packit Service 50c9f2
  delete body;
Packit Service 50c9f2
  delete inbodyDocs;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DefinitionImpl::init(const char *df, const char *n)
Packit Service 50c9f2
{
Packit Service 50c9f2
  defFileName = df;
Packit Service 50c9f2
  int lastDot = defFileName.findRev('.');
Packit Service 50c9f2
  if (lastDot!=-1)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    defFileExt = defFileName.mid(lastDot);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  QCString name = n;
Packit Service 50c9f2
  if (name!="<globalScope>") 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //extractNamespaceName(m_name,m_localName,ns);
Packit Service 50c9f2
    localName=stripScope(n);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    localName=n;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  //printf("m_localName=%s\n",m_localName.data());
Packit Service 50c9f2
Packit Service 50c9f2
  brief           = 0;
Packit Service 50c9f2
  details         = 0;
Packit Service 50c9f2
  body            = 0;
Packit Service 50c9f2
  inbodyDocs      = 0;
Packit Service 50c9f2
  sourceRefByDict = 0;
Packit Service 50c9f2
  sourceRefsDict  = 0;
Packit Service 50c9f2
  sectionDict     = 0, 
Packit Service 50c9f2
  outerScope      = Doxygen::globalScope;
Packit Service 50c9f2
  partOfGroups    = 0;
Packit Service 50c9f2
  xrefListItems   = 0;
Packit Service 50c9f2
  hidden          = FALSE;
Packit Service 50c9f2
  isArtificial    = FALSE;
Packit Service 50c9f2
  lang            = SrcLangExt_Unknown;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//-----------------------------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
static bool matchExcludedSymbols(const char *name)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static QStrList &exclSyms = Config_getList(EXCLUDE_SYMBOLS);
Packit Service 50c9f2
  if (exclSyms.count()==0) return FALSE; // nothing specified
Packit Service 50c9f2
  const char *pat = exclSyms.first();
Packit Service 50c9f2
  QCString symName = name;
Packit Service 50c9f2
  while (pat)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString pattern = pat;
Packit Service 50c9f2
    bool forceStart=FALSE;
Packit Service 50c9f2
    bool forceEnd=FALSE;
Packit Service 50c9f2
    if (pattern.at(0)=='^') 
Packit Service 50c9f2
      pattern=pattern.mid(1),forceStart=TRUE;
Packit Service 50c9f2
    if (pattern.at(pattern.length()-1)=='$') 
Packit Service 50c9f2
      pattern=pattern.left(pattern.length()-1),forceEnd=TRUE;
Packit Service 50c9f2
    if (pattern.find('*')!=-1) // wildcard mode
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QRegExp re(substitute(pattern,"*",".*"),TRUE);
Packit Service 50c9f2
      int i,pl;
Packit Service 50c9f2
      i = re.match(symName,0,&pl);
Packit Service 50c9f2
      //printf("  %d = re.match(%s) pattern=%s\n",i,symName.data(),pattern.data());
Packit Service 50c9f2
      if (i!=-1) // wildcard match
Packit Service 50c9f2
      {
Packit Service 50c9f2
        int sl=symName.length();
Packit Service 50c9f2
        // check if it is a whole word match
Packit Service 50c9f2
        if ((i==0     || pattern.at(0)=='*'    || (!isId(symName.at(i-1))  && !forceStart)) &&
Packit Service 50c9f2
            (i+pl==sl || pattern.at(i+pl)=='*' || (!isId(symName.at(i+pl)) && !forceEnd))
Packit Service 50c9f2
           )
Packit Service 50c9f2
        {
Packit Service 50c9f2
          //printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
Packit Service 50c9f2
          return TRUE;
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (!pattern.isEmpty()) // match words
Packit Service 50c9f2
    {
Packit Service 50c9f2
      int i = symName.find(pattern);
Packit Service 50c9f2
      if (i!=-1) // we have a match!
Packit Service 50c9f2
      {
Packit Service 50c9f2
        int pl=pattern.length();
Packit Service 50c9f2
        int sl=symName.length();
Packit Service 50c9f2
        // check if it is a whole word match
Packit Service 50c9f2
        if ((i==0     || (!isId(symName.at(i-1))  && !forceStart)) &&
Packit Service 50c9f2
            (i+pl==sl || (!isId(symName.at(i+pl)) && !forceEnd))
Packit Service 50c9f2
           )
Packit Service 50c9f2
        {
Packit Service 50c9f2
          //printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
Packit Service 50c9f2
          return TRUE; 
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    pat = exclSyms.next();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  //printf("--> name=%s: no match\n",name);
Packit Service 50c9f2
  return FALSE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::addToMap(const char *name,Definition *d)
Packit Service 50c9f2
{
Packit Service 50c9f2
  bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
Packit Service 50c9f2
  QCString symbolName = name;
Packit Service 50c9f2
  int index=computeQualifiedIndex(symbolName);
Packit Service 50c9f2
  if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
Packit Service 50c9f2
  if (!symbolName.isEmpty()) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
Packit Service 50c9f2
    DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
Packit Service 50c9f2
    //printf("  addToMap(%p): looking for symbol %s: %p\n",d,symbolName.data(),di);
Packit Service 50c9f2
    if (di==0) // new Symbol
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //printf("  new symbol!\n");
Packit Service 50c9f2
      Doxygen::symbolMap->insert(symbolName,d);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else // existing symbol
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //printf("  existing symbol: ");
Packit Service 50c9f2
      if (di->definitionType()==DefinitionIntf::TypeSymbolList) // already multiple symbols
Packit Service 50c9f2
      {
Packit Service 50c9f2
        //printf("adding to exiting list\n");
Packit Service 50c9f2
        DefinitionList *dl = (DefinitionList*)di;
Packit Service 50c9f2
        dl->append(d);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else // going from one to two symbols
Packit Service 50c9f2
      {
Packit Service 50c9f2
        Doxygen::symbolMap->take(symbolName);
Packit Service 50c9f2
        DefinitionList *dl = new DefinitionList;
Packit Service 50c9f2
        //printf("replacing symbol by list %p with elements %p and %p\n",dl,di,d);
Packit Service 50c9f2
        dl->append((Definition*)di);
Packit Service 50c9f2
        dl->append(d);
Packit Service 50c9f2
        Doxygen::symbolMap->insert(symbolName,dl);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    // auto resize if needed
Packit Service 50c9f2
    static int sizeIndex=9;
Packit Service 50c9f2
    if (Doxygen::symbolMap->size()>SDict_primes[sizeIndex])
Packit Service 50c9f2
    {
Packit Service 50c9f2
      Doxygen::symbolMap->resize(SDict_primes[++sizeIndex]);
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    d->_setSymbolName(symbolName);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::removeFromMap(Definition *d)
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString symbolName = d->m_symbolName;
Packit Service 50c9f2
  if (!symbolName.isEmpty()) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("******* removing symbol `%s' (%p)\n",symbolName.data(),d);
Packit Service 50c9f2
    DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
Packit Service 50c9f2
    if (di)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (di!=d) // symbolName not unique
Packit Service 50c9f2
      {
Packit Service 50c9f2
        //printf("  removing from list: %p!\n",di);
Packit Service 50c9f2
        DefinitionList *dl = (DefinitionList*)di;
Packit Service 50c9f2
        bool b = dl->removeRef(d);
Packit Service 50c9f2
        ASSERT(b==TRUE);
Packit Service 50c9f2
        if (dl->isEmpty())
Packit Service 50c9f2
        {
Packit Service 50c9f2
          Doxygen::symbolMap->take(symbolName);
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else // symbolName unique
Packit Service 50c9f2
      {
Packit Service 50c9f2
        //printf("  removing symbol %p\n",di);
Packit Service 50c9f2
        Doxygen::symbolMap->take(symbolName);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Definition::Definition(const char *df,int dl,int dc,
Packit Service 50c9f2
                       const char *name,const char *b,
Packit Service 50c9f2
                       const char *d,bool isSymbol) : m_cookie(0)
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_name = name;
Packit Service 50c9f2
  m_defLine = dl;
Packit Service 50c9f2
  m_defColumn = dc;
Packit Service 50c9f2
  m_impl = new DefinitionImpl;
Packit Service 50c9f2
  m_impl->init(df,name);
Packit Service 50c9f2
  m_isSymbol = isSymbol;
Packit Service 50c9f2
  if (isSymbol) addToMap(name,this);
Packit Service 50c9f2
  _setBriefDescription(b,df,dl);
Packit Service 50c9f2
  _setDocumentation(d,df,dl,TRUE,FALSE);
Packit Service 50c9f2
  if (matchExcludedSymbols(name)) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->hidden = TRUE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Definition::Definition(const Definition &d) : DefinitionIntf(), m_cookie(0)
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_name = d.m_name;
Packit Service 50c9f2
  m_defLine = d.m_defLine;
Packit Service 50c9f2
  m_impl = new DefinitionImpl;
Packit Service 50c9f2
  *m_impl = *d.m_impl;
Packit Service 50c9f2
  m_impl->sectionDict = 0;
Packit Service 50c9f2
  m_impl->sourceRefByDict = 0;
Packit Service 50c9f2
  m_impl->sourceRefsDict = 0;
Packit Service 50c9f2
  m_impl->partOfGroups = 0;
Packit Service 50c9f2
  m_impl->xrefListItems = 0;
Packit Service 50c9f2
  m_impl->brief = 0;
Packit Service 50c9f2
  m_impl->details = 0;
Packit Service 50c9f2
  m_impl->body = 0;
Packit Service 50c9f2
  m_impl->inbodyDocs = 0;
Packit Service 50c9f2
  if (d.m_impl->sectionDict)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->sectionDict = new SectionDict(17);
Packit Service 50c9f2
    SDict<SectionInfo>::Iterator it(*d.m_impl->sectionDict);
Packit Service 50c9f2
    SectionInfo *si;
Packit Service 50c9f2
    for (it.toFirst();(si=it.current());++it)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sectionDict->append(si->label,si);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->sourceRefByDict)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->sourceRefByDict = new MemberSDict;
Packit Service 50c9f2
    MemberSDict::IteratorDict it(*d.m_impl->sourceRefByDict);
Packit Service 50c9f2
    MemberDef *md;
Packit Service 50c9f2
    for (it.toFirst();(md=it.current());++it)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sourceRefByDict->append(it.currentKey(),md);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->sourceRefsDict)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->sourceRefsDict = new MemberSDict;
Packit Service 50c9f2
    MemberSDict::IteratorDict it(*d.m_impl->sourceRefsDict);
Packit Service 50c9f2
    MemberDef *md;
Packit Service 50c9f2
    for (it.toFirst();(md=it.current());++it)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sourceRefsDict->append(it.currentKey(),md);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->partOfGroups)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    GroupListIterator it(*d.m_impl->partOfGroups);
Packit Service 50c9f2
    GroupDef *gd;
Packit Service 50c9f2
    for (it.toFirst();(gd=it.current());++it)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      makePartOfGroup(gd);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->xrefListItems)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    setRefItems(d.m_impl->xrefListItems);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->brief)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->brief = new BriefInfo(*d.m_impl->brief);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->details)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->details = new DocInfo(*d.m_impl->details);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->body)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->body = new BodyInfo(*d.m_impl->body);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (d.m_impl->inbodyDocs)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->inbodyDocs = new DocInfo(*d.m_impl->inbodyDocs);
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  m_isSymbol = d.m_isSymbol;
Packit Service 50c9f2
  if (m_isSymbol) addToMap(m_name,this);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Definition::~Definition()
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_isSymbol)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    removeFromMap(this);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (m_impl)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    delete m_impl;
Packit Service 50c9f2
    m_impl=0;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  delete m_cookie;
Packit Service 50c9f2
  m_cookie=0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setName(const char *name)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (name==0) return;
Packit Service 50c9f2
  m_name = name;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setId(const char *id)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (id==0) return;
Packit Service 50c9f2
  m_impl->id = id;
Packit Service 50c9f2
  if (Doxygen::clangUsrMap) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("Definition::setId '%s'->'%s'\n",id,m_name.data());
Packit Service 50c9f2
    Doxygen::clangUsrMap->insert(id,this);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString Definition::id() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  return m_impl->id;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!anchorList) return;
Packit Service 50c9f2
  //printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
Packit Service 50c9f2
  QListIterator<SectionInfo> it(*anchorList);
Packit Service 50c9f2
  SectionInfo *si;
Packit Service 50c9f2
  for (;(si=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("Add section `%s' to definition `%s'\n",
Packit Service 50c9f2
    //    si->label.data(),name().data());
Packit Service 50c9f2
    SectionInfo *gsi=Doxygen::sectionDict->find(si->label);
Packit Service 50c9f2
    //printf("===== label=%s gsi=%p\n",si->label.data(),gsi);
Packit Service 50c9f2
    if (gsi==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      gsi = new SectionInfo(*si);
Packit Service 50c9f2
      Doxygen::sectionDict->append(si->label,gsi);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (m_impl->sectionDict==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sectionDict = new SectionDict(17);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (m_impl->sectionDict->find(gsi->label)==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sectionDict->append(gsi->label,gsi);
Packit Service 50c9f2
      gsi->definition = this;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool Definition::hasSections() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("Definition::hasSections(%s) #sections=%d\n",name().data(),
Packit Service 50c9f2
  //    m_impl->sectionDict ? m_impl->sectionDict->count() : 0);
Packit Service 50c9f2
  if (m_impl->sectionDict==0) return FALSE;
Packit Service 50c9f2
  SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
Packit Service 50c9f2
  SectionInfo *si;
Packit Service 50c9f2
  for (li.toFirst();(si=li.current());++li)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (si->type==SectionInfo::Section || 
Packit Service 50c9f2
        si->type==SectionInfo::Subsection || 
Packit Service 50c9f2
        si->type==SectionInfo::Subsubsection ||
Packit Service 50c9f2
        si->type==SectionInfo::Paragraph)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      return TRUE;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return FALSE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::addSectionsToIndex()
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_impl->sectionDict==0) return;
Packit Service 50c9f2
  //printf("Definition::addSectionsToIndex()\n");
Packit Service 50c9f2
  SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
Packit Service 50c9f2
  SectionInfo *si;
Packit Service 50c9f2
  int level=1;
Packit Service 50c9f2
  for (li.toFirst();(si=li.current());++li)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (si->type==SectionInfo::Section       || 
Packit Service 50c9f2
        si->type==SectionInfo::Subsection    || 
Packit Service 50c9f2
        si->type==SectionInfo::Subsubsection ||
Packit Service 50c9f2
        si->type==SectionInfo::Paragraph)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //printf("  level=%d title=%s\n",level,si->title.data());
Packit Service 50c9f2
      int nextLevel = (int)si->type;
Packit Service 50c9f2
      int i;
Packit Service 50c9f2
      if (nextLevel>level)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        for (i=level;i
Packit Service 50c9f2
        {
Packit Service 50c9f2
          Doxygen::indexList->incContentsDepth();
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (nextLevel
Packit Service 50c9f2
      {
Packit Service 50c9f2
        for (i=nextLevel;i
Packit Service 50c9f2
        {
Packit Service 50c9f2
          Doxygen::indexList->decContentsDepth();
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      QCString title = si->title;
Packit Service 50c9f2
      if (title.isEmpty()) title = si->label;
Packit Service 50c9f2
      // determine if there is a next level inside this item
Packit Service 50c9f2
      ++li;
Packit Service 50c9f2
      bool isDir = ((li.current()) ? (int)(li.current()->type > nextLevel):FALSE);
Packit Service 50c9f2
      --li;
Packit Service 50c9f2
      Doxygen::indexList->addContentsItem(isDir,title,
Packit Service 50c9f2
                                         getReference(),
Packit Service 50c9f2
                                         getOutputFileBase(),
Packit Service 50c9f2
                                         si->label,
Packit Service 50c9f2
                                         FALSE,
Packit Service 50c9f2
                                         TRUE);
Packit Service 50c9f2
      level = nextLevel;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  while (level>1)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    Doxygen::indexList->decContentsDepth();
Packit Service 50c9f2
    level--;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::writeDocAnchorsToTagFile(FTextStream &tagFile)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_impl->sectionDict)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_impl->sectionDict->count());
Packit Service 50c9f2
    SDict<SectionInfo>::Iterator sdi(*m_impl->sectionDict);
Packit Service 50c9f2
    SectionInfo *si;
Packit Service 50c9f2
    for (;(si=sdi.current());++sdi)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (!si->generated && si->ref.isEmpty())
Packit Service 50c9f2
      {
Packit Service 50c9f2
        //printf("write an entry!\n");
Packit Service 50c9f2
        if (definitionType()==TypeMember) tagFile << "  ";
Packit Service 50c9f2
        tagFile << "    <docanchor file=\"" << si->fileName << "\"";
Packit Service 50c9f2
        if (!si->title.isEmpty())
Packit Service 50c9f2
        {
Packit Service 50c9f2
          tagFile << " title=\"" << convertToXML(si->title) << "\"";
Packit Service 50c9f2
        }
Packit Service 50c9f2
        tagFile << ">" << si->label << "</docanchor>" << endl;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool Definition::_docsAlreadyAdded(const QCString &doc,QCString &sigList)
Packit Service 50c9f2
{
Packit Service 50c9f2
  uchar md5_sig[16];
Packit Service 50c9f2
  QCString sigStr(33);
Packit Service 50c9f2
  // to avoid mismatches due to differences in indenting, we first remove
Packit Service 50c9f2
  // double whitespaces...
Packit Service 50c9f2
  QCString docStr = doc.simplifyWhiteSpace();
Packit Service 50c9f2
  MD5Buffer((const unsigned char *)docStr.data(),docStr.length(),md5_sig);
Packit Service 50c9f2
  MD5SigToString(md5_sig,sigStr.rawData(),33);
Packit Service 50c9f2
  //printf("%s:_docsAlreadyAdded doc='%s' sig='%s' docSigs='%s'\n",
Packit Service 50c9f2
  //    name().data(),doc.data(),sigStr.data(),sigList.data());
Packit Service 50c9f2
  if (sigList.find(sigStr)==-1) // new docs, add signature to prevent re-adding it
Packit Service 50c9f2
  {
Packit Service 50c9f2
    sigList+=":"+sigStr;
Packit Service 50c9f2
    return FALSE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    return TRUE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::_setDocumentation(const char *d,const char *docFile,int docLine,
Packit Service 50c9f2
                                   bool stripWhiteSpace,bool atTop)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("%s::setDocumentation(%s,%s,%d,%d)\n",name().data(),d,docFile,docLine,stripWhiteSpace);
Packit Service 50c9f2
  if (d==0) return;
Packit Service 50c9f2
  QCString doc = d;
Packit Service 50c9f2
  if (stripWhiteSpace)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    doc = stripLeadingAndTrailingEmptyLines(doc,docLine);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // don't strip whitespace
Packit Service 50c9f2
  {
Packit Service 50c9f2
    doc=d;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (!_docsAlreadyAdded(doc,m_impl->docSignatures))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("setting docs for %s: `%s'\n",name().data(),m_doc.data());
Packit Service 50c9f2
    if (m_impl->details==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->details = new DocInfo;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (m_impl->details->doc.isEmpty()) // fresh detailed description
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->details->doc = doc;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (atTop) // another detailed description, append it to the start
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->details->doc = doc+"\n\n"+m_impl->details->doc;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else // another detailed description, append it to the end
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->details->doc += "\n\n"+doc;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (docLine!=-1) // store location if valid
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->details->file = docFile;
Packit Service 50c9f2
      m_impl->details->line = docLine;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->details->file = docFile;
Packit Service 50c9f2
      m_impl->details->line = 1;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (d==0) return;
Packit Service 50c9f2
  _setDocumentation(d,docFile,docLine,stripWhiteSpace,FALSE);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
#define uni_isupper(c) (QChar(c).category()==QChar::Letter_Uppercase)
Packit Service 50c9f2
Packit Service 50c9f2
// do a UTF-8 aware search for the last real character and return TRUE 
Packit Service 50c9f2
// if that is a multibyte one.
Packit Service 50c9f2
static bool lastCharIsMultibyte(const QCString &s)
Packit Service 50c9f2
{
Packit Service 50c9f2
  int l = s.length();
Packit Service 50c9f2
  int p = 0;
Packit Service 50c9f2
  int pp = -1;
Packit Service 50c9f2
  while ((p=nextUtf8CharPosition(s,l,p))
Packit Service 50c9f2
  if (pp==-1 || ((uchar)s[pp])<0x80) return FALSE;
Packit Service 50c9f2
  return TRUE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::_setBriefDescription(const char *b,const char *briefFile,int briefLine)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static QCString outputLanguage = Config_getEnum(OUTPUT_LANGUAGE);
Packit Service 50c9f2
  static bool needsDot = outputLanguage!="Japanese" && 
Packit Service 50c9f2
                         outputLanguage!="Chinese" &&
Packit Service 50c9f2
                         outputLanguage!="Korean";
Packit Service 50c9f2
  QCString brief = b;
Packit Service 50c9f2
  brief = brief.stripWhiteSpace();
Packit Service 50c9f2
  if (brief.isEmpty()) return;
Packit Service 50c9f2
  int bl = brief.length();
Packit Service 50c9f2
  if (bl>0 && needsDot) // add punctuation if needed
Packit Service 50c9f2
  {
Packit Service 50c9f2
    int c = brief.at(bl-1);
Packit Service 50c9f2
    switch(c)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      case '.': case '!': case '?': case '>': case ':': case ')': break;
Packit Service 50c9f2
      default: 
Packit Service 50c9f2
        if (uni_isupper(brief.at(0)) && !lastCharIsMultibyte(brief)) brief+='.'; 
Packit Service 50c9f2
        break;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  if (!_docsAlreadyAdded(brief,m_impl->briefSignatures))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (m_impl->brief && !m_impl->brief->doc.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
       //printf("adding to details\n");
Packit Service 50c9f2
       _setDocumentation(brief,briefFile,briefLine,FALSE,TRUE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //fprintf(stderr,"Definition::setBriefDescription(%s,%s,%d)\n",b,briefFile,briefLine);
Packit Service 50c9f2
      if (m_impl->brief==0)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        m_impl->brief = new BriefInfo;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      m_impl->brief->doc=brief;
Packit Service 50c9f2
      if (briefLine!=-1)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        m_impl->brief->file = briefFile;
Packit Service 50c9f2
        m_impl->brief->line = briefLine;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else
Packit Service 50c9f2
      {
Packit Service 50c9f2
        m_impl->brief->file = briefFile;
Packit Service 50c9f2
        m_impl->brief->line = 1;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("do nothing!\n");
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setBriefDescription(const char *b,const char *briefFile,int briefLine) 
Packit Service 50c9f2
{ 
Packit Service 50c9f2
  if (b==0) return;
Packit Service 50c9f2
  _setBriefDescription(b,briefFile,briefLine);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::_setInbodyDocumentation(const char *doc,const char *inbodyFile,int inbodyLine)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_impl->inbodyDocs==0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->inbodyDocs = new DocInfo;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (m_impl->inbodyDocs->doc.isEmpty()) // fresh inbody docs
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->inbodyDocs->doc  = doc;
Packit Service 50c9f2
    m_impl->inbodyDocs->file = inbodyFile;
Packit Service 50c9f2
    m_impl->inbodyDocs->line = inbodyLine;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // another inbody documentation fragment, append this to the end
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->inbodyDocs->doc += QCString("\n\n")+doc;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (d==0) return;
Packit Service 50c9f2
  _setInbodyDocumentation(d,inbodyFile,inbodyLine);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*! Reads a fragment of code from file \a fileName starting at 
Packit Service 50c9f2
 * line \a startLine and ending at line \a endLine (inclusive). The fragment is
Packit Service 50c9f2
 * stored in \a result. If FALSE is returned the code fragment could not be
Packit Service 50c9f2
 * found.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * The file is scanned for a opening bracket ('{') from \a startLine onward
Packit Service 50c9f2
 * The line actually containing the bracket is returned via startLine.
Packit Service 50c9f2
 * The file is scanned for a closing bracket ('}') from \a endLine backward.
Packit Service 50c9f2
 * The line actually containing the bracket is returned via endLine.
Packit Service 50c9f2
 * Note that for VHDL code the bracket search is not done.
Packit Service 50c9f2
 */
Packit Service 50c9f2
bool readCodeFragment(const char *fileName,
Packit Service 50c9f2
                      int &startLine,int &endLine,QCString &result)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
Packit Service 50c9f2
  static int tabSize = Config_getInt(TAB_SIZE);
Packit Service 50c9f2
  //printf("readCodeFragment(%s,%d,%d)\n",fileName,startLine,endLine);
Packit Service 50c9f2
  if (fileName==0 || fileName[0]==0) return FALSE; // not a valid file name
Packit Service 50c9f2
  QCString filter = getFileFilter(fileName,TRUE);
Packit Service 50c9f2
  FILE *f=0;
Packit Service 50c9f2
  bool usePipe = !filter.isEmpty() && filterSourceFiles;
Packit Service 50c9f2
  SrcLangExt lang = getLanguageFromFileName(fileName);
Packit Service 50c9f2
  if (!usePipe) // no filter given or wanted
Packit Service 50c9f2
  {
Packit Service 50c9f2
    f = portable_fopen(fileName,"r");
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // use filter
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString cmd=filter+" \""+fileName+"\"";
Packit Service 50c9f2
    Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd));
Packit Service 50c9f2
    f = portable_popen(cmd,"r");
Packit Service 50c9f2
  }
Packit Service 50c9f2
  bool found = lang==SrcLangExt_VHDL   || 
Packit Service 50c9f2
               lang==SrcLangExt_Tcl    || 
Packit Service 50c9f2
               lang==SrcLangExt_Python || 
Packit Service 50c9f2
               lang==SrcLangExt_Fortran;  
Packit Service 50c9f2
               // for VHDL, TCL, Python, and Fortran no bracket search is possible
Packit Service 50c9f2
  if (f)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    int c=0;
Packit Service 50c9f2
    int col=0;
Packit Service 50c9f2
    int lineNr=1;
Packit Service 50c9f2
    // skip until the startLine has reached
Packit Service 50c9f2
    while (lineNr
Packit Service 50c9f2
    {
Packit Service 50c9f2
      while ((c=fgetc(f))!='\n' && c!=EOF) /* skip */;
Packit Service 50c9f2
      lineNr++; 
Packit Service 50c9f2
      if (found && c == '\n') c = '\0';
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (!feof(f))
Packit Service 50c9f2
    {
Packit Service 50c9f2
      // skip until the opening bracket or lonely : is found
Packit Service 50c9f2
      char cn=0;
Packit Service 50c9f2
      while (lineNr<=endLine && !feof(f) && !found)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        int pc=0;
Packit Service 50c9f2
        while ((c=fgetc(f))!='{' && c!=':' && c!=EOF)  // } so vi matching brackets has no problem
Packit Service 50c9f2
        {
Packit Service 50c9f2
          //printf("parsing char `%c'\n",c);
Packit Service 50c9f2
          if (c=='\n') 
Packit Service 50c9f2
          {
Packit Service 50c9f2
            lineNr++,col=0; 
Packit Service 50c9f2
          }
Packit Service 50c9f2
          else if (c=='\t') 
Packit Service 50c9f2
          {
Packit Service 50c9f2
            col+=tabSize - (col%tabSize);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          else if (pc=='/' && c=='/') // skip single line comment
Packit Service 50c9f2
          {
Packit Service 50c9f2
            while ((c=fgetc(f))!='\n' && c!=EOF) pc=c;
Packit Service 50c9f2
            if (c=='\n') lineNr++,col=0;
Packit Service 50c9f2
          }
Packit Service 50c9f2
          else if (pc=='/' && c=='*') // skip C style comment
Packit Service 50c9f2
          {
Packit Service 50c9f2
            while (((c=fgetc(f))!='/' || pc!='*') && c!=EOF) 
Packit Service 50c9f2
            {
Packit Service 50c9f2
              if (c=='\n') lineNr++,col=0;
Packit Service 50c9f2
              pc=c;
Packit Service 50c9f2
            }
Packit Service 50c9f2
          }
Packit Service 50c9f2
          else
Packit Service 50c9f2
          {
Packit Service 50c9f2
            col++;
Packit Service 50c9f2
          }
Packit Service 50c9f2
          pc = c;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (c==':')
Packit Service 50c9f2
        {
Packit Service 50c9f2
          cn=fgetc(f);
Packit Service 50c9f2
          if (cn!=':') found=TRUE;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else if (c=='{')   // } so vi matching brackets has no problem
Packit Service 50c9f2
        {
Packit Service 50c9f2
          found=TRUE;
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      //printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
Packit Service 50c9f2
      if (found) 
Packit Service 50c9f2
      {
Packit Service 50c9f2
        // For code with more than one line,
Packit Service 50c9f2
        // fill the line with spaces until we are at the right column
Packit Service 50c9f2
        // so that the opening brace lines up with the closing brace
Packit Service 50c9f2
        if (endLine!=startLine)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          QCString spaces;
Packit Service 50c9f2
          spaces.fill(' ',col);
Packit Service 50c9f2
          result+=spaces;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // copy until end of line
Packit Service 50c9f2
        if (c) result+=c;
Packit Service 50c9f2
        startLine=lineNr;
Packit Service 50c9f2
        if (c==':') 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          result+=cn;
Packit Service 50c9f2
          if (cn=='\n') lineNr++;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        const int maxLineLength=4096;
Packit Service 50c9f2
        char lineStr[maxLineLength];
Packit Service 50c9f2
        do 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          //printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
Packit Service 50c9f2
          int size_read;
Packit Service 50c9f2
          do 
Packit Service 50c9f2
          {
Packit Service 50c9f2
            // read up to maxLineLength-1 bytes, the last byte being zero
Packit Service 50c9f2
            char *p = fgets(lineStr, maxLineLength,f);
Packit Service 50c9f2
            //printf("  read %s",p);
Packit Service 50c9f2
            if (p) 
Packit Service 50c9f2
            {
Packit Service 50c9f2
              size_read=qstrlen(p); 
Packit Service 50c9f2
            }
Packit Service 50c9f2
            else  // nothing read
Packit Service 50c9f2
            {
Packit Service 50c9f2
              size_read=-1;
Packit Service 50c9f2
              lineStr[0]='\0';
Packit Service 50c9f2
            }
Packit Service 50c9f2
            result+=lineStr;
Packit Service 50c9f2
          } while (size_read == (maxLineLength-1));
Packit Service 50c9f2
Packit Service 50c9f2
          lineNr++; 
Packit Service 50c9f2
        } while (lineNr<=endLine && !feof(f));
Packit Service 50c9f2
Packit Service 50c9f2
        // strip stuff after closing bracket
Packit Service 50c9f2
        int newLineIndex = result.findRev('\n');
Packit Service 50c9f2
        int braceIndex   = result.findRev('}');
Packit Service 50c9f2
        if (braceIndex > newLineIndex) 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          result.truncate(braceIndex+1);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        endLine=lineNr-1;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (usePipe) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      portable_pclose(f); 
Packit Service 50c9f2
      Debug::print(Debug::FilterOutput, 0, "Filter output\n");
Packit Service 50c9f2
      Debug::print(Debug::FilterOutput,0,"-------------\n%s\n-------------\n",qPrint(result));
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      fclose(f);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  result = transcodeCharacterStringToUTF8(result);
Packit Service 50c9f2
  if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
Packit Service 50c9f2
  //fprintf(stderr,"readCodeFragement(%d-%d)=%s\n",startLine,endLine,result.data());
Packit Service 50c9f2
  return found;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString Definition::getSourceFileBase() const
Packit Service 50c9f2
{ 
Packit Service 50c9f2
  ASSERT(definitionType()!=Definition::TypeFile); // file overloads this method
Packit Service 50c9f2
  QCString fn;
Packit Service 50c9f2
  static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
Packit Service 50c9f2
  if (sourceBrowser && 
Packit Service 50c9f2
      m_impl->body && m_impl->body->startLine!=-1 && m_impl->body->fileDef)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    fn = m_impl->body->fileDef->getSourceFileBase();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return fn;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString Definition::getSourceAnchor() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  const int maxAnchorStrLen = 20;
Packit Service 50c9f2
  char anchorStr[maxAnchorStrLen];
Packit Service 50c9f2
  anchorStr[0]='\0';
Packit Service 50c9f2
  if (m_impl->body && m_impl->body->startLine!=-1)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (Htags::useHtags)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      qsnprintf(anchorStr,maxAnchorStrLen,"L%d",m_impl->body->startLine);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      qsnprintf(anchorStr,maxAnchorStrLen,"l%05d",m_impl->body->startLine);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return anchorStr;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*! Write a reference to the source code defining this definition */
Packit Service 50c9f2
void Definition::writeSourceDef(OutputList &ol,const char *)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE);
Packit Service 50c9f2
  static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE);
Packit Service 50c9f2
  ol.pushGeneratorState();
Packit Service 50c9f2
  //printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
Packit Service 50c9f2
  QCString fn = getSourceFileBase();
Packit Service 50c9f2
  if (!fn.isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString refText = theTranslator->trDefinedAtLineInSourceFile();
Packit Service 50c9f2
    int lineMarkerPos = refText.find("@0");
Packit Service 50c9f2
    int fileMarkerPos = refText.find("@1");
Packit Service 50c9f2
    if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this.
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QCString lineStr;
Packit Service 50c9f2
      lineStr.sprintf("%d",m_impl->body->startLine);
Packit Service 50c9f2
      QCString anchorStr = getSourceAnchor();
Packit Service 50c9f2
      ol.startParagraph("definition");
Packit Service 50c9f2
      if (lineMarkerPos
Packit Service 50c9f2
      {
Packit Service 50c9f2
        // write text left from linePos marker
Packit Service 50c9f2
        ol.parseText(refText.left(lineMarkerPos)); 
Packit Service 50c9f2
        ol.pushGeneratorState();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Man); 
Packit Service 50c9f2
        if (!latexSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (!rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // write line link (HTML, LaTeX optionally, RTF optionally)
Packit Service 50c9f2
        ol.writeObjectLink(0,fn,anchorStr,lineStr);
Packit Service 50c9f2
        ol.enableAll();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
        if (latexSourceCode) 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // write normal text (Man, Latex optionally, RTF optionally)
Packit Service 50c9f2
        ol.docify(lineStr);
Packit Service 50c9f2
        ol.popGeneratorState();
Packit Service 50c9f2
        
Packit Service 50c9f2
        // write text between markers
Packit Service 50c9f2
        ol.parseText(refText.mid(lineMarkerPos+2,
Packit Service 50c9f2
              fileMarkerPos-lineMarkerPos-2));
Packit Service 50c9f2
Packit Service 50c9f2
        ol.pushGeneratorState();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Man); 
Packit Service 50c9f2
        if (!latexSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (!rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // write file link (HTML, LaTeX optionally, RTF optionally)
Packit Service 50c9f2
        ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
Packit Service 50c9f2
        ol.enableAll();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
        if (latexSourceCode) 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // write normal text (Man, Latex optionally, RTF optionally)
Packit Service 50c9f2
        ol.docify(m_impl->body->fileDef->name());
Packit Service 50c9f2
        ol.popGeneratorState();
Packit Service 50c9f2
        
Packit Service 50c9f2
        // write text right from file marker
Packit Service 50c9f2
        ol.parseText(refText.right(
Packit Service 50c9f2
              refText.length()-fileMarkerPos-2)); 
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else // file marker before line marker
Packit Service 50c9f2
      {
Packit Service 50c9f2
        // write text left from file marker
Packit Service 50c9f2
        ol.parseText(refText.left(fileMarkerPos)); 
Packit Service 50c9f2
        ol.pushGeneratorState();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Man); 
Packit Service 50c9f2
        if (!latexSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (!rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // write file link (HTML only)
Packit Service 50c9f2
        ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name());
Packit Service 50c9f2
        ol.enableAll();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
        if (latexSourceCode) 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // write normal text (RTF/Latex/Man only)
Packit Service 50c9f2
        ol.docify(m_impl->body->fileDef->name());
Packit Service 50c9f2
        ol.popGeneratorState();
Packit Service 50c9f2
        
Packit Service 50c9f2
        // write text between markers
Packit Service 50c9f2
        ol.parseText(refText.mid(fileMarkerPos+2,
Packit Service 50c9f2
              lineMarkerPos-fileMarkerPos-2)); 
Packit Service 50c9f2
Packit Service 50c9f2
        ol.pushGeneratorState();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Man); 
Packit Service 50c9f2
        if (!latexSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (!rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        ol.disableAllBut(OutputGenerator::Html); 
Packit Service 50c9f2
        // write line link (HTML only)
Packit Service 50c9f2
        ol.writeObjectLink(0,fn,anchorStr,lineStr);
Packit Service 50c9f2
        ol.enableAll();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
        if (latexSourceCode) 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (rtfSourceCode)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        // write normal text (Latex/Man only)
Packit Service 50c9f2
        ol.docify(lineStr);
Packit Service 50c9f2
        ol.popGeneratorState();
Packit Service 50c9f2
Packit Service 50c9f2
        // write text right from linePos marker
Packit Service 50c9f2
        ol.parseText(refText.right(
Packit Service 50c9f2
              refText.length()-lineMarkerPos-2)); 
Packit Service 50c9f2
      }
Packit Service 50c9f2
      ol.endParagraph();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      err("translation error: invalid markers in trDefinedAtLineInSourceFile()\n");
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  ol.popGeneratorState();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setBodySegment(int bls,int ble) 
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
Packit Service 50c9f2
  if (m_impl->body==0) m_impl->body = new BodyInfo;
Packit Service 50c9f2
  m_impl->body->startLine=bls; 
Packit Service 50c9f2
  m_impl->body->endLine=ble; 
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setBodyDef(FileDef *fd)         
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_impl->body==0) m_impl->body = new BodyInfo;
Packit Service 50c9f2
  m_impl->body->fileDef=fd; 
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool Definition::hasSources() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  return m_impl->body && m_impl->body->startLine!=-1 &&
Packit Service 50c9f2
         m_impl->body->endLine>=m_impl->body->startLine &&
Packit Service 50c9f2
         m_impl->body->fileDef;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*! Write code of this definition into the documentation */
Packit Service 50c9f2
void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool inlineSources = Config_getBool(INLINE_SOURCES);
Packit Service 50c9f2
  ol.pushGeneratorState();
Packit Service 50c9f2
  //printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(),
Packit Service 50c9f2
  //        m_startBodyLine,m_endBodyLine,m_bodyDef);
Packit Service 50c9f2
  if (inlineSources && hasSources())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString codeFragment;
Packit Service 50c9f2
    int actualStart=m_impl->body->startLine,actualEnd=m_impl->body->endLine;
Packit Service 50c9f2
    if (readCodeFragment(m_impl->body->fileDef->absFilePath(),
Packit Service 50c9f2
          actualStart,actualEnd,codeFragment)
Packit Service 50c9f2
       )
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //printf("Adding code fragment '%s' ext='%s'\n",
Packit Service 50c9f2
      //    codeFragment.data(),m_impl->defFileExt.data());
Packit Service 50c9f2
      ParserInterface *pIntf = Doxygen::parserManager->getParser(m_impl->defFileExt);
Packit Service 50c9f2
      pIntf->resetCodeParserState();
Packit Service 50c9f2
      //printf("Read:\n`%s'\n\n",codeFragment.data());
Packit Service 50c9f2
      MemberDef *thisMd = 0;
Packit Service 50c9f2
      if (definitionType()==TypeMember) thisMd = (MemberDef *)this;
Packit Service 50c9f2
Packit Service 50c9f2
      ol.startCodeFragment();
Packit Service 50c9f2
      pIntf->parseCode(ol,               // codeOutIntf
Packit Service 50c9f2
                       scopeName,        // scope
Packit Service 50c9f2
                       codeFragment,     // input
Packit Service 50c9f2
                       m_impl->lang,     // lang
Packit Service 50c9f2
                       FALSE,            // isExample
Packit Service 50c9f2
                       0,                // exampleName
Packit Service 50c9f2
                       m_impl->body->fileDef,  // fileDef
Packit Service 50c9f2
                       actualStart,      // startLine
Packit Service 50c9f2
                       actualEnd,        // endLine
Packit Service 50c9f2
                       TRUE,             // inlineFragment
Packit Service 50c9f2
                       thisMd,           // memberDef
Packit Service 50c9f2
                       TRUE              // show line numbers
Packit Service 50c9f2
                      );
Packit Service 50c9f2
      ol.endCodeFragment();
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  ol.popGeneratorState();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*! Write a reference to the source code fragments in which this 
Packit Service 50c9f2
 *  definition is used.
Packit Service 50c9f2
 */
Packit Service 50c9f2
void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
Packit Service 50c9f2
    const QCString &text,MemberSDict *members,bool /*funcOnly*/)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE); 
Packit Service 50c9f2
  static bool rtfSourceCode   = Config_getBool(RTF_SOURCE_CODE);
Packit Service 50c9f2
  static bool sourceBrowser   = Config_getBool(SOURCE_BROWSER);
Packit Service 50c9f2
  static bool refLinkSource   = Config_getBool(REFERENCES_LINK_SOURCE);
Packit Service 50c9f2
  ol.pushGeneratorState();
Packit Service 50c9f2
  if (members)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    members->sort();
Packit Service 50c9f2
Packit Service 50c9f2
    ol.startParagraph("reference");
Packit Service 50c9f2
    ol.parseText(text);
Packit Service 50c9f2
    ol.docify(" ");
Packit Service 50c9f2
Packit Service 50c9f2
    QCString ldefLine=theTranslator->trWriteList(members->count());
Packit Service 50c9f2
Packit Service 50c9f2
    QRegExp marker("@[0-9]+");
Packit Service 50c9f2
    int index=0,newIndex,matchLen;
Packit Service 50c9f2
    // now replace all markers in inheritLine with links to the classes
Packit Service 50c9f2
    while ((newIndex=marker.match(ldefLine,index,&matchLen))!=-1)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      bool ok;
Packit Service 50c9f2
      ol.parseText(ldefLine.mid(index,newIndex-index));
Packit Service 50c9f2
      uint entryIndex = ldefLine.mid(newIndex+1,matchLen-1).toUInt(&ok;;
Packit Service 50c9f2
      MemberDef *md=members->at(entryIndex);
Packit Service 50c9f2
      if (ok && md)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        QCString scope=md->getScopeString();
Packit Service 50c9f2
        QCString name=md->name();
Packit Service 50c9f2
        //printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName);
Packit Service 50c9f2
        if (!scope.isEmpty() && scope!=scopeName)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          name.prepend(scope+getLanguageSpecificSeparator(m_impl->lang));
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (!md->isObjCMethod() &&
Packit Service 50c9f2
            (md->isFunction() || md->isSlot() || 
Packit Service 50c9f2
             md->isPrototype() || md->isSignal()
Packit Service 50c9f2
            )
Packit Service 50c9f2
           ) 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          name+="()";
Packit Service 50c9f2
        }
Packit Service 50c9f2
        //Definition *d = md->getOutputFileBase();
Packit Service 50c9f2
        //if (d==Doxygen::globalScope) d=md->getBodyDef();
Packit Service 50c9f2
        if (sourceBrowser &&
Packit Service 50c9f2
            !(md->isLinkable() && !refLinkSource) && 
Packit Service 50c9f2
            md->getStartBodyLine()!=-1 && 
Packit Service 50c9f2
            md->getBodyDef()
Packit Service 50c9f2
           )
Packit Service 50c9f2
        {
Packit Service 50c9f2
          //printf("md->getBodyDef()=%p global=%p\n",md->getBodyDef(),Doxygen::globalScope); 
Packit Service 50c9f2
          // for HTML write a real link
Packit Service 50c9f2
          ol.pushGeneratorState();
Packit Service 50c9f2
          //ol.disableAllBut(OutputGenerator::Html);
Packit Service 50c9f2
Packit Service 50c9f2
          ol.disable(OutputGenerator::Man); 
Packit Service 50c9f2
          if (!latexSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          if (!rtfSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          const int maxLineNrStr = 10;
Packit Service 50c9f2
          char anchorStr[maxLineNrStr];
Packit Service 50c9f2
          qsnprintf(anchorStr,maxLineNrStr,"l%05d",md->getStartBodyLine());
Packit Service 50c9f2
          //printf("Write object link to %s\n",md->getBodyDef()->getSourceFileBase().data());
Packit Service 50c9f2
          ol.writeObjectLink(0,md->getBodyDef()->getSourceFileBase(),anchorStr,name);
Packit Service 50c9f2
          ol.popGeneratorState();
Packit Service 50c9f2
Packit Service 50c9f2
          // for the other output formats just mention the name
Packit Service 50c9f2
          ol.pushGeneratorState();
Packit Service 50c9f2
          ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
          if (latexSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          if (rtfSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          ol.docify(name);
Packit Service 50c9f2
          ol.popGeneratorState();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else if (md->isLinkable() /*&& d && d->isLinkable()*/)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          // for HTML write a real link
Packit Service 50c9f2
          ol.pushGeneratorState();
Packit Service 50c9f2
          //ol.disableAllBut(OutputGenerator::Html); 
Packit Service 50c9f2
          ol.disable(OutputGenerator::Man); 
Packit Service 50c9f2
          if (!latexSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          if (!rtfSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
          }
Packit Service 50c9f2
Packit Service 50c9f2
          ol.writeObjectLink(md->getReference(),
Packit Service 50c9f2
              md->getOutputFileBase(),
Packit Service 50c9f2
              md->anchor(),name);
Packit Service 50c9f2
          ol.popGeneratorState();
Packit Service 50c9f2
Packit Service 50c9f2
          // for the other output formats just mention the name
Packit Service 50c9f2
          ol.pushGeneratorState();
Packit Service 50c9f2
          ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
          if (latexSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::Latex);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          if (rtfSourceCode)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
          }
Packit Service 50c9f2
          ol.docify(name);
Packit Service 50c9f2
          ol.popGeneratorState();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.docify(name);
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      index=newIndex+matchLen;
Packit Service 50c9f2
    } 
Packit Service 50c9f2
    ol.parseText(ldefLine.right(ldefLine.length()-index));
Packit Service 50c9f2
    ol.writeString(".");
Packit Service 50c9f2
    ol.endParagraph();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  ol.popGeneratorState();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (Config_getBool(REFERENCED_BY_RELATION))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    _writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_impl->sourceRefByDict,FALSE);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (Config_getBool(REFERENCES_RELATION))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    _writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_impl->sourceRefsDict,TRUE);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool Definition::hasDocumentation() const
Packit Service 50c9f2
{ 
Packit Service 50c9f2
  static bool extractAll    = Config_getBool(EXTRACT_ALL); 
Packit Service 50c9f2
  //static bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
Packit Service 50c9f2
  bool hasDocs = 
Packit Service 50c9f2
         (m_impl->details    && !m_impl->details->doc.isEmpty())    || // has detailed docs
Packit Service 50c9f2
         (m_impl->brief      && !m_impl->brief->doc.isEmpty())      || // has brief description
Packit Service 50c9f2
         (m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty()) || // has inbody docs
Packit Service 50c9f2
         extractAll //||                   // extract everything
Packit Service 50c9f2
  //       (sourceBrowser && m_impl->body && 
Packit Service 50c9f2
  //        m_impl->body->startLine!=-1 && m_impl->body->fileDef)
Packit Service 50c9f2
         ; // link to definition
Packit Service 50c9f2
  return hasDocs;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool Definition::hasUserDocumentation() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  bool hasDocs = 
Packit Service 50c9f2
         (m_impl->details    && !m_impl->details->doc.isEmpty()) ||
Packit Service 50c9f2
         (m_impl->brief      && !m_impl->brief->doc.isEmpty())   ||
Packit Service 50c9f2
         (m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty());
Packit Service 50c9f2
  return hasDocs;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::addSourceReferencedBy(MemberDef *md)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (md)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString name  = md->name();
Packit Service 50c9f2
    QCString scope = md->getScopeString();
Packit Service 50c9f2
Packit Service 50c9f2
    if (!scope.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      name.prepend(scope+"::");
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    if (m_impl->sourceRefByDict==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sourceRefByDict = new MemberSDict;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (m_impl->sourceRefByDict->find(name)==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sourceRefByDict->append(name,md);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::addSourceReferences(MemberDef *md)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (md)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString name  = md->name();
Packit Service 50c9f2
    QCString scope = md->getScopeString();
Packit Service 50c9f2
Packit Service 50c9f2
    if (!scope.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      name.prepend(scope+"::");
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    if (m_impl->sourceRefsDict==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sourceRefsDict = new MemberSDict;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (m_impl->sourceRefsDict->find(name)==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->sourceRefsDict->append(name,md);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Definition *Definition::findInnerCompound(const char *) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  return 0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::addInnerCompound(Definition *)
Packit Service 50c9f2
{
Packit Service 50c9f2
  err("Definition::addInnerCompound() called\n");
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString Definition::qualifiedName() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  //static int count=0;
Packit Service 50c9f2
  //count++;
Packit Service 50c9f2
  if (!m_impl->qualifiedName.isEmpty()) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //count--;
Packit Service 50c9f2
    return m_impl->qualifiedName;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  
Packit Service 50c9f2
  //printf("start %s::qualifiedName() localName=%s\n",name().data(),m_impl->localName.data());
Packit Service 50c9f2
  if (m_impl->outerScope==0) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (m_impl->localName=="<globalScope>") 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //count--;
Packit Service 50c9f2
      return "";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //count--;
Packit Service 50c9f2
      return m_impl->localName; 
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  if (m_impl->outerScope->name()=="<globalScope>")
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->qualifiedName = m_impl->localName;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->qualifiedName = m_impl->outerScope->qualifiedName()+
Packit Service 50c9f2
           getLanguageSpecificSeparator(getLanguage())+
Packit Service 50c9f2
           m_impl->localName;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  //printf("end %s::qualifiedName()=%s\n",name().data(),m_impl->qualifiedName.data());
Packit Service 50c9f2
  //count--;
Packit Service 50c9f2
  return m_impl->qualifiedName;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setOuterScope(Definition *d)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("%s::setOuterScope(%s)\n",name().data(),d?d->name().data():"<none>");
Packit Service 50c9f2
  Definition *p = m_impl->outerScope;
Packit Service 50c9f2
  bool found=false;
Packit Service 50c9f2
  // make sure that we are not creating a recursive scope relation.
Packit Service 50c9f2
  while (p && !found)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    found = (p==d);
Packit Service 50c9f2
    p = p->m_impl->outerScope;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (!found)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    m_impl->qualifiedName.resize(0); // flush cached scope name
Packit Service 50c9f2
    m_impl->outerScope = d;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  m_impl->hidden = m_impl->hidden || d->isHidden();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString Definition::localName() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  return m_impl->localName;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::makePartOfGroup(GroupDef *gd)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_impl->partOfGroups==0) m_impl->partOfGroups = new GroupList;
Packit Service 50c9f2
  m_impl->partOfGroups->append(gd);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::setRefItems(const QList<ListItemInfo> *sli)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("%s::setRefItems()\n",name().data());
Packit Service 50c9f2
  if (sli)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // deep copy the list
Packit Service 50c9f2
    if (m_impl->xrefListItems==0) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->xrefListItems=new QList<ListItemInfo>;
Packit Service 50c9f2
      m_impl->xrefListItems->setAutoDelete(TRUE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    QListIterator<ListItemInfo> slii(*sli);
Packit Service 50c9f2
    ListItemInfo *lii;
Packit Service 50c9f2
    for (slii.toFirst();(lii=slii.current());++slii)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->xrefListItems->append(new ListItemInfo(*lii));
Packit Service 50c9f2
    } 
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void Definition::mergeRefItems(Definition *d)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("%s::mergeRefItems()\n",name().data());
Packit Service 50c9f2
  QList<ListItemInfo> *xrefList = d->xrefListItems();
Packit Service 50c9f2
  if (xrefList!=0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // deep copy the list
Packit Service 50c9f2
    if (m_impl->xrefListItems==0) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_impl->xrefListItems=new QList<ListItemInfo>;
Packit Service 50c9f2
      m_impl->xrefListItems->setAutoDelete(TRUE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    QListIterator<ListItemInfo> slii(*xrefList);
Packit Service 50c9f2
    ListItemInfo *lii;
Packit Service 50c9f2
    for (slii.toFirst();(lii=slii.current());++slii)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (_getXRefListId(lii->type)==-1)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        m_impl->xrefListItems->append(new ListItemInfo(*lii));
Packit Service 50c9f2
      }
Packit Service 50c9f2
    } 
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
int Definition::_getXRefListId(const char *listName) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_impl->xrefListItems)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QListIterator<ListItemInfo> slii(*m_impl->xrefListItems);
Packit Service 50c9f2
    ListItemInfo *lii;
Packit Service 50c9f2
    for (slii.toFirst();(lii=slii.current());++slii)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (qstrcmp(lii->type,listName)==0)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        return lii->itemId;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return -1;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QList<ListItemInfo> *Definition::xrefListItems() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  return m_impl->xrefListItems;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString Definition::pathFragment() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString result;
Packit Service 50c9f2
  if (m_impl->outerScope && m_impl->outerScope!=Doxygen::globalScope)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    result = m_impl->outerScope->pathFragment();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (isLinkable())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (!result.isEmpty()) result+="/";
Packit Service 50c9f2
    if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      result+=((const GroupDef*)this)->groupTitle();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      result+=((const PageDef*)this)->title();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      result+=m_impl->localName;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    result+=m_impl->localName;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return result;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//----------------------------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
// TODO: move to htmlgen
Packit Service 50c9f2
/*! Returns the string used in the footer for $navpath when 
Packit Service 50c9f2
 *  GENERATE_TREEVIEW is enabled
Packit Service 50c9f2
 */
Packit Service 50c9f2
QCString Definition::navigationPathAsString() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString result;
Packit Service 50c9f2
  Definition *outerScope = getOuterScope();
Packit Service 50c9f2
  QCString locName = localName();
Packit Service 50c9f2
  if (outerScope && outerScope!=Doxygen::globalScope)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    result+=outerScope->navigationPathAsString();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else if (definitionType()==Definition::TypeFile && ((const FileDef*)this)->getDirDef())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    result+=((const FileDef*)this)->getDirDef()->navigationPathAsString();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  result+="
  • ";
  • Packit Service 50c9f2
      if (isLinkable())
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          result+=""+
    Packit Service 50c9f2
                  convertToHtml(((const GroupDef*)this)->groupTitle())+"";
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
        else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          result+=""+
    Packit Service 50c9f2
                  convertToHtml(((const PageDef*)this)->title())+"";
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
        else if (definitionType()==Definition::TypeClass)
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          QCString name = locName;
    Packit Service 50c9f2
          if (name.right(2)=="-p" /*|| name.right(2)=="-g"*/)
    Packit Service 50c9f2
          {
    Packit Service 50c9f2
            name = name.left(name.length()-2);
    Packit Service 50c9f2
          }
    Packit Service 50c9f2
          result+="
    Packit Service 50c9f2
          if (!anchor().isEmpty()) result+="#"+anchor();
    Packit Service 50c9f2
          result+="\">"+convertToHtml(name)+"";
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
        else
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          result+=""+
    Packit Service 50c9f2
                  convertToHtml(locName)+"";
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      else
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        result+=""+convertToHtml(locName)+"";
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      result+="";
    Packit Service 50c9f2
      return result;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    // TODO: move to htmlgen
    Packit Service 50c9f2
    void Definition::writeNavigationPath(OutputList &ol) const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      ol.pushGeneratorState();
    Packit Service 50c9f2
      ol.disableAllBut(OutputGenerator::Html);
    Packit Service 50c9f2
    Packit Service 50c9f2
      QCString navPath;
    Packit Service 50c9f2
      navPath += "
    \n"
    Packit Service 50c9f2
                 "  
      \n";
    Packit Service 50c9f2
      navPath += navigationPathAsString();
    Packit Service 50c9f2
      navPath += "  \n"
    Packit Service 50c9f2
                 "\n";
    Packit Service 50c9f2
      ol.writeNavigationPath(navPath);
    Packit Service 50c9f2
    Packit Service 50c9f2
      ol.popGeneratorState();
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    // TODO: move to htmlgen
    Packit Service 50c9f2
    void Definition::writeToc(OutputList &ol)
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      SectionDict *sectionDict = m_impl->sectionDict;
    Packit Service 50c9f2
      if (sectionDict==0) return;
    Packit Service 50c9f2
      ol.pushGeneratorState();
    Packit Service 50c9f2
      ol.disableAllBut(OutputGenerator::Html);
    Packit Service 50c9f2
      ol.writeString("
    ");
    Packit Service 50c9f2
      ol.writeString("

    ");

    Packit Service 50c9f2
      ol.writeString(theTranslator->trRTFTableOfContents());
    Packit Service 50c9f2
      ol.writeString("\n");
    Packit Service 50c9f2
      ol.writeString("
      ");
    Packit Service 50c9f2
      SDict<SectionInfo>::Iterator li(*sectionDict);
    Packit Service 50c9f2
      SectionInfo *si;
    Packit Service 50c9f2
      int level=1,l;
    Packit Service 50c9f2
      char cs[2];
    Packit Service 50c9f2
      cs[1]='\0';
    Packit Service 50c9f2
      bool inLi[5]={ FALSE, FALSE, FALSE, FALSE };
    Packit Service 50c9f2
      for (li.toFirst();(si=li.current());++li)
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        if (si->type==SectionInfo::Section       || 
    Packit Service 50c9f2
            si->type==SectionInfo::Subsection    || 
    Packit Service 50c9f2
            si->type==SectionInfo::Subsubsection ||
    Packit Service 50c9f2
            si->type==SectionInfo::Paragraph)
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          //printf("  level=%d title=%s\n",level,si->title.data());
    Packit Service 50c9f2
          int nextLevel = (int)si->type;
    Packit Service 50c9f2
          if (nextLevel>level)
    Packit Service 50c9f2
          {
    Packit Service 50c9f2
            for (l=level;l
    Packit Service 50c9f2
            {
    Packit Service 50c9f2
              ol.writeString("
      ");
    Packit Service 50c9f2
            }
    Packit Service 50c9f2
          }
    Packit Service 50c9f2
          else if (nextLevel
    Packit Service 50c9f2
          {
    Packit Service 50c9f2
            for (l=level;l>nextLevel;l--)
    Packit Service 50c9f2
            {
    Packit Service 50c9f2
              if (inLi[l]) ol.writeString("\n");
    Packit Service 50c9f2
              inLi[l]=FALSE;
    Packit Service 50c9f2
              ol.writeString("\n");
    Packit Service 50c9f2
            }
    Packit Service 50c9f2
          }
    Packit Service 50c9f2
          cs[0]='0'+nextLevel;
    Packit Service 50c9f2
          if (inLi[nextLevel]) ol.writeString("\n");
    Packit Service 50c9f2
          QCString titleDoc = convertToHtml(si->title);
    Packit Service 50c9f2
          ol.writeString("
  • label+"\">"+(si->title.isEmpty()?si->label:titleDoc)+"");
  • Packit Service 50c9f2
          inLi[nextLevel]=TRUE;
    Packit Service 50c9f2
          level = nextLevel;
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      while (level>1)
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        if (inLi[level]) ol.writeString("\n");
    Packit Service 50c9f2
        inLi[level]=FALSE;
    Packit Service 50c9f2
        ol.writeString("\n");
    Packit Service 50c9f2
        level--;
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      if (inLi[level]) ol.writeString("\n");
    Packit Service 50c9f2
      inLi[level]=FALSE;
    Packit Service 50c9f2
      ol.writeString("\n");
    Packit Service 50c9f2
      ol.writeString("\n");
    Packit Service 50c9f2
      ol.popGeneratorState();
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    //----------------------------------------------------------------------------------------
    Packit Service 50c9f2
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::symbolName() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_symbolName; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    //----------------------
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::documentation() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->details ? m_impl->details->doc : QCString(""); 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    int Definition::docLine() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->details ? m_impl->details->line : 1; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::docFile() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->details ? m_impl->details->file : QCString("<"+m_name+">"); 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    //----------------------------------------------------------------------------
    Packit Service 50c9f2
    // strips w from s iff s starts with w
    Packit Service 50c9f2
    static bool stripWord(QCString &s,QCString w)
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      bool success=FALSE;
    Packit Service 50c9f2
      if (s.left(w.length())==w) 
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        success=TRUE;
    Packit Service 50c9f2
        s=s.right(s.length()-w.length());
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      return success;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    //----------------------------------------------------------------------------
    Packit Service 50c9f2
    // some quasi intelligent brief description abbreviator :^)
    Packit Service 50c9f2
    QCString abbreviate(const char *s,const char *name)
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      QCString scopelessName=name;
    Packit Service 50c9f2
      int i=scopelessName.findRev("::");
    Packit Service 50c9f2
      if (i!=-1) scopelessName=scopelessName.mid(i+2);
    Packit Service 50c9f2
      QCString result=s;
    Packit Service 50c9f2
      result=result.stripWhiteSpace();
    Packit Service 50c9f2
      // strip trailing .
    Packit Service 50c9f2
      if (!result.isEmpty() && result.at(result.length()-1)=='.') 
    Packit Service 50c9f2
        result=result.left(result.length()-1);
    Packit Service 50c9f2
    Packit Service 50c9f2
      // strip any predefined prefix
    Packit Service 50c9f2
      QStrList &briefDescAbbrev = Config_getList(ABBREVIATE_BRIEF);
    Packit Service 50c9f2
      const char *p = briefDescAbbrev.first();
    Packit Service 50c9f2
      while (p)
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        QCString s = p;
    Packit Service 50c9f2
        s.replace(QRegExp("\\$name"), scopelessName);  // replace $name with entity name
    Packit Service 50c9f2
        s += " ";
    Packit Service 50c9f2
        stripWord(result,s);
    Packit Service 50c9f2
        p = briefDescAbbrev.next();
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
    Packit Service 50c9f2
      // capitalize first word
    Packit Service 50c9f2
      if (!result.isEmpty())
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        int c=result[0];
    Packit Service 50c9f2
        if (c>='a' && c<='z') c+='A'-'a';
    Packit Service 50c9f2
        result[0]=c;
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      return result;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    Packit Service 50c9f2
    //----------------------
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::briefDescription(bool abbr) const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      //printf("%s::briefDescription(%d)='%s'\n",name().data(),abbr,m_impl->brief?m_impl->brief->doc.data():"<none>");
    Packit Service 50c9f2
      return m_impl->brief ? 
    Packit Service 50c9f2
             (abbr ? abbreviate(m_impl->brief->doc,displayName()) : m_impl->brief->doc) :
    Packit Service 50c9f2
             QCString(""); 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::briefDescriptionAsTooltip() const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      if (m_impl->brief)
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        if (m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          static bool reentering=FALSE; 
    Packit Service 50c9f2
          if (!reentering)
    Packit Service 50c9f2
          {
    Packit Service 50c9f2
            MemberDef *md = definitionType()==TypeMember ? (MemberDef*)this : 0;
    Packit Service 50c9f2
            const Definition *scope = definitionType()==TypeMember ? getOuterScope() : this;
    Packit Service 50c9f2
            reentering=TRUE; // prevent requests for tooltips while parsing a tooltip
    Packit Service 50c9f2
            m_impl->brief->tooltip = parseCommentAsText(
    Packit Service 50c9f2
                scope,md,
    Packit Service 50c9f2
                m_impl->brief->doc,
    Packit Service 50c9f2
                m_impl->brief->file,
    Packit Service 50c9f2
                m_impl->brief->line);
    Packit Service 50c9f2
            reentering=FALSE;
    Packit Service 50c9f2
          }
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
        return m_impl->brief->tooltip;
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      return QCString("");
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    int Definition::briefLine() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->brief ? m_impl->brief->line : 1; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::briefFile() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->brief ? m_impl->brief->file : QCString("<"+m_name+">"); 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    //----------------------
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::inbodyDocumentation() const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      return m_impl->inbodyDocs ? m_impl->inbodyDocs->doc : QCString(""); 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    int Definition::inbodyLine() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->inbodyDocs ? m_impl->inbodyDocs->line : 1; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::inbodyFile() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->inbodyDocs ? m_impl->inbodyDocs->file : QCString("<"+m_name+">"); 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    Packit Service 50c9f2
    //----------------------
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::getDefFileName() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->defFileName; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::getDefFileExtension() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->defFileExt; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    bool Definition::isHidden() const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      return m_impl->hidden;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    bool Definition::isVisibleInProject() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return isLinkableInProject() && !m_impl->hidden; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    bool Definition::isVisible() const
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return isLinkable() && !m_impl->hidden; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    bool Definition::isArtificial() const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      return m_impl->isArtificial;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::getReference() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->ref; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    bool Definition::isReference() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return !m_impl->ref.isEmpty(); 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    int Definition::getStartBodyLine() const         
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->body ? m_impl->body->startLine : -1; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    int Definition::getEndBodyLine() const           
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->body ? m_impl->body->endLine : -1; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    FileDef *Definition::getBodyDef() const
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->body ? m_impl->body->fileDef : 0; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    GroupList *Definition::partOfGroups() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->partOfGroups; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    bool Definition::isLinkableViaGroup() const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      GroupList *gl = partOfGroups();
    Packit Service 50c9f2
      if (gl)
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        GroupListIterator gli(*gl);
    Packit Service 50c9f2
        GroupDef *gd;
    Packit Service 50c9f2
        for (gli.toFirst();(gd=gli.current());++gli)
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          if (gd->isLinkable()) return TRUE;
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      return FALSE;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    Definition *Definition::getOuterScope() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->outerScope; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    MemberSDict *Definition::getReferencesMembers() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->sourceRefsDict; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    MemberSDict *Definition::getReferencedByMembers() const 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      return m_impl->sourceRefByDict; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    void Definition::setReference(const char *r) 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      m_impl->ref=r; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    SrcLangExt Definition::getLanguage() const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      return m_impl->lang;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    void Definition::setHidden(bool b) 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      m_impl->hidden = m_impl->hidden || b; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    void Definition::setArtificial(bool b)
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      m_impl->isArtificial = b;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    void Definition::setLocalName(const QCString name) 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      m_impl->localName=name; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    void Definition::setLanguage(SrcLangExt lang) 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      m_impl->lang=lang; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    Packit Service 50c9f2
    void Definition::_setSymbolName(const QCString &name) 
    Packit Service 50c9f2
    { 
    Packit Service 50c9f2
      m_symbolName=name; 
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    bool Definition::hasBriefDescription() const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      static bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
    Packit Service 50c9f2
      return !briefDescription().isEmpty() && briefMemberDesc;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    QCString Definition::externalReference(const QCString &relPath) const
    Packit Service 50c9f2
    {
    Packit Service 50c9f2
      QCString ref = getReference();
    Packit Service 50c9f2
      if (!ref.isEmpty())
    Packit Service 50c9f2
      {
    Packit Service 50c9f2
        QCString *dest = Doxygen::tagDestinationDict[ref];
    Packit Service 50c9f2
        if (dest)
    Packit Service 50c9f2
        {
    Packit Service 50c9f2
          QCString result = *dest;
    Packit Service 50c9f2
          int l = result.length();
    Packit Service 50c9f2
          if (!relPath.isEmpty() && l>0 && result.at(0)=='.')
    Packit Service 50c9f2
          { // relative path -> prepend relPath.
    Packit Service 50c9f2
            result.prepend(relPath);
    Packit Service 50c9f2
            l+=relPath.length();
    Packit Service 50c9f2
          }
    Packit Service 50c9f2
          if (l>0 && result.at(l-1)!='/') result+='/';
    Packit Service 50c9f2
          return result;
    Packit Service 50c9f2
        }
    Packit Service 50c9f2
      }
    Packit Service 50c9f2
      return relPath;
    Packit Service 50c9f2
    }
    Packit Service 50c9f2
    Packit Service 50c9f2
    Packit Service 50c9f2