Blame src/entry.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include <stdlib.h>
Packit 1c1d7e
#include <qfile.h>
Packit 1c1d7e
#include "entry.h"
Packit 1c1d7e
#include "marshal.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "section.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "filestorage.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
//------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
#define HEADER ('D'<<24)+('O'<<16)+('X'<<8)+'!'
Packit 1c1d7e
Packit 1c1d7e
//------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
int Entry::num=0;
Packit 1c1d7e
Packit 1c1d7e
Entry::Entry()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("Entry::Entry(%p)\n",this);
Packit 1c1d7e
  num++;
Packit 1c1d7e
  m_parent=0;
Packit 1c1d7e
  section = EMPTY_SEC;
Packit 1c1d7e
  m_sublist = new QList<Entry>;
Packit 1c1d7e
  m_sublist->setAutoDelete(TRUE);
Packit 1c1d7e
  extends = new QList<BaseInfo>;
Packit 1c1d7e
  extends->setAutoDelete(TRUE);
Packit 1c1d7e
  groups = new QList<Grouping>;
Packit 1c1d7e
  groups->setAutoDelete(TRUE);
Packit 1c1d7e
  anchors = new QList<SectionInfo>; // Doxygen::sectionDict takes ownership of the items!
Packit 1c1d7e
  argList = new ArgumentList;
Packit 1c1d7e
  argList->setAutoDelete(TRUE);
Packit 1c1d7e
  //printf("Entry::Entry() tArgList=0\n");
Packit 1c1d7e
  tArgLists = 0;
Packit 1c1d7e
  typeConstr = 0;
Packit 1c1d7e
  mGrpId = -1;
Packit 1c1d7e
  tagInfo = 0;
Packit 1c1d7e
  sli = 0;
Packit 1c1d7e
  relatesType = Simple;
Packit 1c1d7e
  hidden = FALSE;
Packit 1c1d7e
  groupDocType = GROUPDOC_NORMAL;
Packit 1c1d7e
  reset();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Entry::Entry(const Entry &e)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("Entry::Entry(%p):copy\n",this);
Packit 1c1d7e
  num++;
Packit 1c1d7e
  section     = e.section;
Packit 1c1d7e
  type        = e.type;
Packit 1c1d7e
  name        = e.name;
Packit 1c1d7e
  tagInfo     = e.tagInfo;
Packit 1c1d7e
  protection  = e.protection;
Packit 1c1d7e
  mtype       = e.mtype;
Packit 1c1d7e
  spec        = e.spec;
Packit 1c1d7e
  initLines   = e.initLines;
Packit 1c1d7e
  stat        = e.stat;
Packit 1c1d7e
  explicitExternal = e.explicitExternal;
Packit 1c1d7e
  proto       = e.proto;
Packit 1c1d7e
  subGrouping = e.subGrouping;
Packit 1c1d7e
  callGraph   = e.callGraph;
Packit 1c1d7e
  callerGraph = e.callerGraph;
Packit 1c1d7e
  virt        = e.virt;
Packit 1c1d7e
  args        = e.args;
Packit 1c1d7e
  bitfields   = e.bitfields;
Packit 1c1d7e
  argList     = e.argList->deepCopy();
Packit 1c1d7e
  tArgLists = 0;
Packit 1c1d7e
  program     = e.program;
Packit 1c1d7e
  initializer = e.initializer;
Packit 1c1d7e
  includeFile = e.includeFile;
Packit 1c1d7e
  includeName = e.includeName;
Packit 1c1d7e
  doc         = e.doc;
Packit 1c1d7e
  docLine     = e.docLine;
Packit 1c1d7e
  docFile     = e.docFile;
Packit 1c1d7e
  brief       = e.brief;
Packit 1c1d7e
  briefLine   = e.briefLine;
Packit 1c1d7e
  briefFile   = e.briefFile;
Packit 1c1d7e
  inbodyDocs  = e.inbodyDocs;
Packit 1c1d7e
  inbodyLine  = e.inbodyLine;
Packit 1c1d7e
  inbodyFile  = e.inbodyFile;
Packit 1c1d7e
  relates     = e.relates;
Packit 1c1d7e
  relatesType = e.relatesType;
Packit 1c1d7e
  read        = e.read;
Packit 1c1d7e
  write       = e.write;
Packit 1c1d7e
  inside      = e.inside;
Packit 1c1d7e
  exception   = e.exception;
Packit 1c1d7e
  typeConstr  = 0;
Packit 1c1d7e
  bodyLine    = e.bodyLine;
Packit 1c1d7e
  endBodyLine = e.endBodyLine;
Packit 1c1d7e
  mGrpId      = e.mGrpId;
Packit 1c1d7e
  extends     = new QList<BaseInfo>;
Packit 1c1d7e
  extends->setAutoDelete(TRUE);
Packit 1c1d7e
  groups      = new QList<Grouping>;
Packit 1c1d7e
  groups->setAutoDelete(TRUE);
Packit 1c1d7e
  anchors     = new QList<SectionInfo>;
Packit 1c1d7e
  fileName    = e.fileName;
Packit 1c1d7e
  startLine   = e.startLine;
Packit 1c1d7e
  startColumn = e.startColumn;
Packit 1c1d7e
  if (e.sli)
Packit 1c1d7e
  {
Packit 1c1d7e
    sli = new QList<ListItemInfo>;
Packit 1c1d7e
    sli->setAutoDelete(TRUE);
Packit 1c1d7e
    QListIterator<ListItemInfo> slii(*e.sli);
Packit 1c1d7e
    ListItemInfo *ili;
Packit 1c1d7e
    for (slii.toFirst();(ili=slii.current());++slii)
Packit 1c1d7e
    {
Packit 1c1d7e
      sli->append(new ListItemInfo(*ili));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    sli=0;
Packit 1c1d7e
  }
Packit 1c1d7e
  lang        = e.lang;
Packit 1c1d7e
  hidden      = e.hidden;
Packit 1c1d7e
  artificial  = e.artificial;
Packit 1c1d7e
  groupDocType = e.groupDocType;
Packit 1c1d7e
  id          = e.id;
Packit 1c1d7e
Packit 1c1d7e
  m_parent    = e.m_parent;
Packit 1c1d7e
  m_sublist   = new QList<Entry>;
Packit 1c1d7e
  m_sublist->setAutoDelete(TRUE);
Packit 1c1d7e
Packit 1c1d7e
  // deep copy of the child entry list
Packit 1c1d7e
  QListIterator<Entry> eli(*e.m_sublist);
Packit 1c1d7e
  Entry *cur;
Packit 1c1d7e
  for (;(cur=eli.current());++eli)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_sublist->append(new Entry(*cur));
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  // deep copy base class list
Packit 1c1d7e
  QListIterator<BaseInfo> bli(*e.extends);
Packit 1c1d7e
  BaseInfo *bi;
Packit 1c1d7e
  for (;(bi=bli.current());++bli)
Packit 1c1d7e
  {
Packit 1c1d7e
    extends->append(new BaseInfo(*bi));
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  // deep copy group list
Packit 1c1d7e
  QListIterator<Grouping> gli(*e.groups);
Packit 1c1d7e
  Grouping *g;
Packit 1c1d7e
  for (;(g=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    groups->append(new Grouping(*g));
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  QListIterator<SectionInfo> sli2(*e.anchors);
Packit 1c1d7e
  SectionInfo *s;
Packit 1c1d7e
  for (;(s=sli2.current());++sli2)
Packit 1c1d7e
  {
Packit 1c1d7e
    anchors->append(new SectionInfo(*s));
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // deep copy type constraint list
Packit 1c1d7e
  if (e.typeConstr)
Packit 1c1d7e
  {
Packit 1c1d7e
    typeConstr  = e.typeConstr->deepCopy();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // deep copy template argument lists
Packit 1c1d7e
  if (e.tArgLists)
Packit 1c1d7e
  {
Packit 1c1d7e
    tArgLists = copyArgumentLists(e.tArgLists);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Entry::~Entry()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("Entry::~Entry(%p) num=%d\n",this,num);
Packit 1c1d7e
  //printf("Deleting entry %d name %s type %x children %d\n",
Packit 1c1d7e
  //       num,name.data(),section,sublist->count());
Packit 1c1d7e
  
Packit 1c1d7e
  delete m_sublist; // each element is now own by a EntryNav so we do no longer own
Packit 1c1d7e
                  // our children.
Packit 1c1d7e
  delete extends;
Packit 1c1d7e
  delete groups;
Packit 1c1d7e
  delete anchors;
Packit 1c1d7e
  delete argList;
Packit 1c1d7e
  delete tArgLists;
Packit 1c1d7e
  delete tagInfo;
Packit 1c1d7e
  delete typeConstr;
Packit 1c1d7e
  delete sli;
Packit 1c1d7e
  num--;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Entry::addSubEntry(Entry *current)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("Entry %d with name %s type 0x%x added to %s type 0x%x\n",
Packit 1c1d7e
  //    current->num,current->name.data(),current->section,
Packit 1c1d7e
  //    name.data(),section);
Packit 1c1d7e
  //printf("Entry::addSubEntry(%s:%p) to %s\n",current->name.data(),
Packit 1c1d7e
  //    current,name.data());
Packit 1c1d7e
  current->m_parent=this;
Packit 1c1d7e
  m_sublist->append(current);  
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Entry::reset()
Packit 1c1d7e
{
Packit 1c1d7e
  static bool entryCallGraph   = Config_getBool(CALL_GRAPH);
Packit 1c1d7e
  static bool entryCallerGraph = Config_getBool(CALLER_GRAPH);
Packit 1c1d7e
  //printf("Entry::reset()\n");
Packit 1c1d7e
  name.resize(0);
Packit 1c1d7e
  type.resize(0);
Packit 1c1d7e
  args.resize(0);
Packit 1c1d7e
  bitfields.resize(0);
Packit 1c1d7e
  exception.resize(0);
Packit 1c1d7e
  program.resize(0);
Packit 1c1d7e
  includeFile.resize(0);
Packit 1c1d7e
  includeName.resize(0);
Packit 1c1d7e
  doc.resize(0);
Packit 1c1d7e
  docFile.resize(0);
Packit 1c1d7e
  docLine=-1;
Packit 1c1d7e
  relates.resize(0);
Packit 1c1d7e
  relatesType=Simple;
Packit 1c1d7e
  brief.resize(0);
Packit 1c1d7e
  briefFile.resize(0);
Packit 1c1d7e
  briefLine=-1;
Packit 1c1d7e
  inbodyDocs.resize(0);
Packit 1c1d7e
  inbodyFile.resize(0);
Packit 1c1d7e
  inbodyLine=-1;
Packit 1c1d7e
  inside.resize(0);
Packit 1c1d7e
  fileName.resize(0);
Packit 1c1d7e
  initializer.resize(0);
Packit 1c1d7e
  initLines = -1;
Packit 1c1d7e
  startLine = 1;
Packit 1c1d7e
  startColumn = 1;
Packit 1c1d7e
  bodyLine = -1;
Packit 1c1d7e
  endBodyLine = -1;
Packit 1c1d7e
  mGrpId = -1;
Packit 1c1d7e
  callGraph   = entryCallGraph;
Packit 1c1d7e
  callerGraph = entryCallerGraph;
Packit 1c1d7e
  section = EMPTY_SEC;
Packit 1c1d7e
  mtype   = Method;
Packit 1c1d7e
  virt    = Normal;
Packit 1c1d7e
  stat    = FALSE;
Packit 1c1d7e
  proto   = FALSE;
Packit 1c1d7e
  explicitExternal = FALSE;
Packit 1c1d7e
  spec  = 0;
Packit 1c1d7e
  lang = SrcLangExt_Unknown;
Packit 1c1d7e
  hidden = FALSE;
Packit 1c1d7e
  artificial = FALSE;
Packit 1c1d7e
  subGrouping = TRUE;
Packit 1c1d7e
  protection = Public;
Packit 1c1d7e
  groupDocType = GROUPDOC_NORMAL;
Packit 1c1d7e
  id.resize(0);
Packit 1c1d7e
  m_sublist->clear();
Packit 1c1d7e
  extends->clear();
Packit 1c1d7e
  groups->clear();
Packit 1c1d7e
  anchors->clear();
Packit 1c1d7e
  argList->clear();
Packit 1c1d7e
  if (tagInfo)    { delete tagInfo; tagInfo=0; }
Packit 1c1d7e
  if (tArgLists)  { delete tArgLists; tArgLists=0; }
Packit 1c1d7e
  if (sli)        { delete sli; sli=0; }
Packit 1c1d7e
  if (typeConstr) { delete typeConstr; typeConstr=0; }
Packit 1c1d7e
  //if (mtArgList) { delete mtArgList; mtArgList=0; }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
int Entry::getSize()
Packit 1c1d7e
{
Packit 1c1d7e
  return sizeof(Entry);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Entry::createSubtreeIndex(EntryNav *nav,FileStorage *storage,FileDef *fd)
Packit 1c1d7e
{
Packit 1c1d7e
  EntryNav *childNav = new EntryNav(nav,this);
Packit 1c1d7e
  nav->addChild(childNav);
Packit 1c1d7e
  childNav->setFileDef(fd);
Packit 1c1d7e
  childNav->saveEntry(this,storage);
Packit 1c1d7e
  if (m_sublist)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("saveEntry: %d children\n",node->sublist->count());
Packit 1c1d7e
    QListIterator<Entry> eli(*m_sublist);
Packit 1c1d7e
    Entry *childNode;
Packit 1c1d7e
    for (eli.toFirst();(childNode=eli.current());++eli)
Packit 1c1d7e
    {
Packit 1c1d7e
      childNode->createSubtreeIndex(childNav,storage,fd);
Packit 1c1d7e
    }
Packit 1c1d7e
    //m_sublist->setAutoDelete(FALSE);
Packit 1c1d7e
    m_sublist->clear();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Entry::createNavigationIndex(EntryNav *rootNav,FileStorage *storage,FileDef *fd)
Packit 1c1d7e
{
Packit 1c1d7e
  createSubtreeIndex(rootNav,storage,fd);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Entry::addSpecialListItem(const char *listName,int itemId)
Packit 1c1d7e
{
Packit 1c1d7e
  if (sli==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    sli = new QList<ListItemInfo>;
Packit 1c1d7e
    sli->setAutoDelete(TRUE);
Packit 1c1d7e
  }
Packit 1c1d7e
  ListItemInfo *ili=new ListItemInfo;
Packit 1c1d7e
  ili->type = listName;
Packit 1c1d7e
  ili->itemId = itemId;
Packit 1c1d7e
  sli->append(ili);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Entry *Entry::removeSubEntry(Entry *e)
Packit 1c1d7e
{
Packit 1c1d7e
 int i = m_sublist->find(e);
Packit 1c1d7e
 return i!=-1 ? m_sublist->take(i) : 0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
EntryNav::EntryNav(EntryNav *parent, Entry *e)
Packit 1c1d7e
             : m_parent(parent), m_subList(0), m_section(e->section), m_type(e->type),
Packit 1c1d7e
              m_name(e->name), m_fileDef(0), m_lang(e->lang), 
Packit 1c1d7e
              m_info(0), m_offset(-1), m_noLoad(FALSE) 
Packit 1c1d7e
{
Packit 1c1d7e
  if (e->tagInfo)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_tagInfo = new TagInfo;
Packit 1c1d7e
    m_tagInfo->tagName  = e->tagInfo->tagName;
Packit 1c1d7e
    m_tagInfo->fileName = e->tagInfo->fileName;
Packit 1c1d7e
    m_tagInfo->anchor   = e->tagInfo->anchor;
Packit 1c1d7e
    if (e->tagInfo)
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("tagInfo %p: tagName=%s fileName=%s anchor=%s\n",
Packit 1c1d7e
      //    e->tagInfo,
Packit 1c1d7e
      //    e->tagInfo->tagName.data(),
Packit 1c1d7e
      //    e->tagInfo->fileName.data(),
Packit 1c1d7e
      //    e->tagInfo->anchor.data());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_tagInfo = 0;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
EntryNav::~EntryNav()
Packit 1c1d7e
{
Packit 1c1d7e
  delete m_subList;
Packit 1c1d7e
  delete m_info;
Packit 1c1d7e
  delete m_tagInfo;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void EntryNav::addChild(EntryNav *e)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_subList==0) 
Packit 1c1d7e
  {
Packit 1c1d7e
    m_subList = new QList<EntryNav>;
Packit 1c1d7e
    m_subList->setAutoDelete(TRUE);
Packit 1c1d7e
  }
Packit 1c1d7e
  m_subList->append(e);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool EntryNav::loadEntry(FileStorage *storage)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_noLoad)
Packit 1c1d7e
  {
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (m_offset==-1) 
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("offset not set!\n");
Packit 1c1d7e
    return FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
  //delete m_info;
Packit 1c1d7e
  //printf("EntryNav::loadEntry: new entry %p: %s\n",m_info,m_name.data());
Packit 1c1d7e
  //m_info->tagInfo = m_tagInfo;
Packit 1c1d7e
  //if (m_parent)
Packit 1c1d7e
  //{
Packit 1c1d7e
  //  m_info->parent = m_parent->m_info;
Packit 1c1d7e
  //}
Packit 1c1d7e
  //m_info->parent = 0;
Packit 1c1d7e
  //printf("load entry: seek to %llx\n",m_offset);
Packit 1c1d7e
  if (!storage->seek(m_offset)) 
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("seek failed!\n");
Packit 1c1d7e
    return FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (m_info)  delete m_info;
Packit 1c1d7e
  m_info = unmarshalEntry(storage);
Packit 1c1d7e
  m_info->name = m_name;
Packit 1c1d7e
  m_info->type = m_type;
Packit 1c1d7e
  m_info->section = m_section;
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool EntryNav::saveEntry(Entry *e,FileStorage *storage)
Packit 1c1d7e
{
Packit 1c1d7e
  m_offset = storage->pos();
Packit 1c1d7e
  //printf("EntryNav::saveEntry offset=%llx\n",m_offset);
Packit 1c1d7e
  marshalEntry(storage,e);
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void EntryNav::releaseEntry()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!m_noLoad) 
Packit 1c1d7e
  { 
Packit 1c1d7e
    //printf("EntryNav::releaseEntry %p\n",m_info);
Packit 1c1d7e
    delete m_info; 
Packit 1c1d7e
    m_info=0; 
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void EntryNav::setEntry(Entry *e) 
Packit 1c1d7e
{ 
Packit 1c1d7e
  delete m_info;
Packit 1c1d7e
  m_info = e; 
Packit 1c1d7e
  //printf("EntryNav::setEntry %p\n",e);
Packit 1c1d7e
  m_noLoad=TRUE; 
Packit 1c1d7e
}
Packit 1c1d7e