Blame src/dirdef.cpp

Packit Service 50c9f2
#include "md5.h"
Packit Service 50c9f2
Packit Service 50c9f2
#include "dirdef.h"
Packit Service 50c9f2
#include "filename.h"
Packit Service 50c9f2
#include "doxygen.h"
Packit Service 50c9f2
#include "util.h"
Packit Service 50c9f2
#include "outputlist.h"
Packit Service 50c9f2
#include "language.h"
Packit Service 50c9f2
#include "message.h"
Packit Service 50c9f2
#include "dot.h"
Packit Service 50c9f2
#include "layout.h"
Packit Service 50c9f2
#include "ftextstream.h"
Packit Service 50c9f2
#include "config.h"
Packit Service 50c9f2
#include "docparser.h"
Packit Service 50c9f2
Packit Service 50c9f2
//----------------------------------------------------------------------
Packit Service 50c9f2
// method implementation
Packit Service 50c9f2
Packit Service 50c9f2
static int g_dirCount=0;
Packit Service 50c9f2
Packit Service 50c9f2
DirDef::DirDef(const char *path) : Definition(path,1,1,path), visited(FALSE)
Packit Service 50c9f2
{
Packit Service 50c9f2
  bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
Packit Service 50c9f2
  // get display name (stipping the paths mentioned in STRIP_FROM_PATH)
Packit Service 50c9f2
  // get short name (last part of path)
Packit Service 50c9f2
  m_shortName = path;
Packit Service 50c9f2
  m_diskName = path;
Packit Service 50c9f2
  if (m_shortName.at(m_shortName.length()-1)=='/')
Packit Service 50c9f2
  { // strip trailing /
Packit Service 50c9f2
    m_shortName = m_shortName.left(m_shortName.length()-1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  int pi=m_shortName.findRev('/');
Packit Service 50c9f2
  if (pi!=-1) 
Packit Service 50c9f2
  { // remove everything till the last /
Packit Service 50c9f2
    m_shortName = m_shortName.mid(pi+1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  setLocalName(m_shortName);
Packit Service 50c9f2
  m_dispName = fullPathNames ? stripFromPath(path) : m_shortName;
Packit Service 50c9f2
  if (m_dispName.length()>0 && m_dispName.at(m_dispName.length()-1)=='/')
Packit Service 50c9f2
  { // strip trailing /
Packit Service 50c9f2
    m_dispName = m_dispName.left(m_dispName.length()-1);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  
Packit Service 50c9f2
  m_fileList   = new FileList;
Packit Service 50c9f2
  m_usedDirs   = new QDict<UsedDir>(257);
Packit Service 50c9f2
  m_usedDirs->setAutoDelete(TRUE);
Packit Service 50c9f2
  m_dirCount   = g_dirCount++;
Packit Service 50c9f2
  m_level=-1;
Packit Service 50c9f2
  m_parent=0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
DirDef::~DirDef()
Packit Service 50c9f2
{
Packit Service 50c9f2
  delete m_fileList;
Packit Service 50c9f2
  delete m_usedDirs;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool DirDef::isLinkableInProject() const 
Packit Service 50c9f2
{ 
Packit Service 50c9f2
  return !isReference(); 
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool DirDef::isLinkable() const 
Packit Service 50c9f2
{ 
Packit Service 50c9f2
  return isReference() || isLinkableInProject(); 
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::addSubDir(DirDef *subdir)
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_subdirs.append(subdir);
Packit Service 50c9f2
  subdir->setOuterScope(this);
Packit Service 50c9f2
  subdir->m_parent=this;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::addFile(FileDef *fd)
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_fileList->append(fd);
Packit Service 50c9f2
  fd->setDirDef(this);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::sort()
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_subdirs.sort();
Packit Service 50c9f2
  m_fileList->sort();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static QCString encodeDirName(const QCString &anchor)
Packit Service 50c9f2
{
Packit Service 50c9f2
  // convert to md5 hash
Packit Service 50c9f2
  uchar md5_sig[16];
Packit Service 50c9f2
  QCString sigStr(33);
Packit Service 50c9f2
  MD5Buffer((const unsigned char *)anchor.data(),anchor.length(),md5_sig);
Packit Service 50c9f2
  MD5SigToString(md5_sig,sigStr.rawData(),33);
Packit Service 50c9f2
  return sigStr;
Packit Service 50c9f2
Packit Service 50c9f2
  // old algorithm
Packit Service 50c9f2
//  QCString result;
Packit Service 50c9f2
Packit Service 50c9f2
//  int l = anchor.length(),i;
Packit Service 50c9f2
//  for (i=0;i
Packit Service 50c9f2
//  {
Packit Service 50c9f2
//    char c = anchor.at(i);
Packit Service 50c9f2
//    if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
Packit Service 50c9f2
//    {
Packit Service 50c9f2
//      result+=c;
Packit Service 50c9f2
//    }
Packit Service 50c9f2
//    else
Packit Service 50c9f2
//    {
Packit Service 50c9f2
//      static char hexStr[]="0123456789ABCDEF";
Packit Service 50c9f2
//      char escChar[]={ '_', 0, 0, 0 };
Packit Service 50c9f2
//      escChar[1]=hexStr[c>>4];
Packit Service 50c9f2
//      escChar[2]=hexStr[c&0xf];
Packit Service 50c9f2
//      result+=escChar;
Packit Service 50c9f2
//    }
Packit Service 50c9f2
//  }
Packit Service 50c9f2
//  return result;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString DirDef::getOutputFileBase() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("DirDef::getOutputFileBase() %s->dir_%s\n",
Packit Service 50c9f2
  //    m_diskName.data(),encodeDirName(m_diskName).data());
Packit Service 50c9f2
  return "dir_"+encodeDirName(m_diskName);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF)) || 
Packit Service 50c9f2
      !documentation().isEmpty())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ol.pushGeneratorState();
Packit Service 50c9f2
      ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
      ol.writeRuler();
Packit Service 50c9f2
    ol.popGeneratorState();
Packit Service 50c9f2
    ol.pushGeneratorState();
Packit Service 50c9f2
      ol.disableAllBut(OutputGenerator::Html);
Packit Service 50c9f2
      ol.writeAnchor(0,"details");
Packit Service 50c9f2
    ol.popGeneratorState();
Packit Service 50c9f2
    ol.startGroupHeader();
Packit Service 50c9f2
    ol.parseText(title);
Packit Service 50c9f2
    ol.endGroupHeader();
Packit Service 50c9f2
Packit Service 50c9f2
    // repeat brief description
Packit Service 50c9f2
    if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
Packit Service 50c9f2
    {
Packit Service 50c9f2
      ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    // separator between brief and details
Packit Service 50c9f2
    if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) && 
Packit Service 50c9f2
        !documentation().isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      ol.pushGeneratorState();
Packit Service 50c9f2
        ol.disable(OutputGenerator::Man);
Packit Service 50c9f2
        ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
        // ol.newParagraph();  // FIXME:PARA
Packit Service 50c9f2
        ol.enableAll();
Packit Service 50c9f2
        ol.disableAllBut(OutputGenerator::Man);
Packit Service 50c9f2
        ol.enable(OutputGenerator::Latex);
Packit Service 50c9f2
        ol.writeString("\n\n");
Packit Service 50c9f2
      ol.popGeneratorState();
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    // write documentation
Packit Service 50c9f2
    if (!documentation().isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::writeBriefDescription(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (hasBriefDescription())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    DocRoot *rootNode = validatingParseDoc(
Packit Service 50c9f2
         briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
Packit Service 50c9f2
    if (rootNode && !rootNode->isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      ol.startParagraph();
Packit Service 50c9f2
      ol.pushGeneratorState();
Packit Service 50c9f2
      ol.disableAllBut(OutputGenerator::Man);
Packit Service 50c9f2
      ol.writeString(" - ");
Packit Service 50c9f2
      ol.popGeneratorState();
Packit Service 50c9f2
      ol.writeDoc(rootNode,this,0);
Packit Service 50c9f2
      ol.pushGeneratorState();
Packit Service 50c9f2
      ol.disable(OutputGenerator::RTF);
Packit Service 50c9f2
      ol.writeString(" \n");
Packit Service 50c9f2
      ol.enable(OutputGenerator::RTF);
Packit Service 50c9f2
Packit Service 50c9f2
      if (Config_getBool(REPEAT_BRIEF) ||
Packit Service 50c9f2
          !documentation().isEmpty()
Packit Service 50c9f2
         )
Packit Service 50c9f2
      {
Packit Service 50c9f2
        ol.disableAllBut(OutputGenerator::Html);
Packit Service 50c9f2
        ol.startTextLink(0,"details");
Packit Service 50c9f2
        ol.parseText(theTranslator->trMore());
Packit Service 50c9f2
        ol.endTextLink();
Packit Service 50c9f2
      }
Packit Service 50c9f2
      ol.popGeneratorState();
Packit Service 50c9f2
Packit Service 50c9f2
      ol.endParagraph();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    delete rootNode;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  ol.writeSynopsis();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::writeDirectoryGraph(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  // write graph dependency graph
Packit Service 50c9f2
  if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    DotDirDeps dirDep(this);
Packit Service 50c9f2
    if (!dirDep.isTrivial())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      msg("Generating dependency graph for directory %s\n",displayName().data());
Packit Service 50c9f2
      ol.disable(OutputGenerator::Man);
Packit Service 50c9f2
      //ol.startParagraph();
Packit Service 50c9f2
      ol.startDirDepGraph();
Packit Service 50c9f2
      ol.parseText(theTranslator->trDirDepGraph(shortName()));
Packit Service 50c9f2
      ol.endDirDepGraph(dirDep);
Packit Service 50c9f2
      //ol.endParagraph();
Packit Service 50c9f2
      ol.enableAll();
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::writeSubDirList(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  int numSubdirs = 0;
Packit Service 50c9f2
  QListIterator<DirDef> it(m_subdirs);
Packit Service 50c9f2
  DirDef *dd;
Packit Service 50c9f2
  for (it.toFirst();(dd=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (dd->hasDocumentation() || dd->getFiles()->count()>0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      numSubdirs++;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // write subdir list
Packit Service 50c9f2
  if (numSubdirs>0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ol.startMemberHeader("subdirs");
Packit Service 50c9f2
    ol.parseText(theTranslator->trDir(TRUE,FALSE));
Packit Service 50c9f2
    ol.endMemberHeader();
Packit Service 50c9f2
    ol.startMemberList();
Packit Service 50c9f2
    for (it.toFirst();(dd=it.current());++it)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (dd->hasDocumentation() || dd->getFiles()->count()==0)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        ol.startMemberDeclaration();
Packit Service 50c9f2
        ol.startMemberItem(dd->getOutputFileBase(),0);
Packit Service 50c9f2
        ol.parseText(theTranslator->trDir(FALSE,TRUE)+" ");
Packit Service 50c9f2
        ol.insertMemberAlign();
Packit Service 50c9f2
        ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName());
Packit Service 50c9f2
        ol.endMemberItem();
Packit Service 50c9f2
        if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.startMemberDescription(dd->getOutputFileBase());
Packit Service 50c9f2
          ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
Packit Service 50c9f2
              FALSE, // indexWords
Packit Service 50c9f2
              FALSE, // isExample
Packit Service 50c9f2
              0,     // exampleName
Packit Service 50c9f2
              TRUE,  // single line
Packit Service 50c9f2
              TRUE   // link from index
Packit Service 50c9f2
              );
Packit Service 50c9f2
          ol.endMemberDescription();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        ol.endMemberDeclaration(0,0);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    ol.endMemberList();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::writeFileList(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  int numFiles = 0;
Packit Service 50c9f2
  QListIterator<FileDef> it(*m_fileList);
Packit Service 50c9f2
  FileDef *fd;
Packit Service 50c9f2
  for (it.toFirst();(fd=it.current());++it)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (fd->hasDocumentation())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      numFiles++;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // write file list
Packit Service 50c9f2
  if (numFiles>0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ol.startMemberHeader("files");
Packit Service 50c9f2
    ol.parseText(theTranslator->trFile(TRUE,FALSE));
Packit Service 50c9f2
    ol.endMemberHeader();
Packit Service 50c9f2
    ol.startMemberList();
Packit Service 50c9f2
    QListIterator<FileDef> it(*m_fileList);
Packit Service 50c9f2
    FileDef *fd;
Packit Service 50c9f2
    for (;(fd=it.current());++it)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (fd->hasDocumentation())
Packit Service 50c9f2
      {
Packit Service 50c9f2
        ol.startMemberDeclaration();
Packit Service 50c9f2
        ol.startMemberItem(fd->getOutputFileBase(),0);
Packit Service 50c9f2
        ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
Packit Service 50c9f2
        ol.insertMemberAlign();
Packit Service 50c9f2
        if (fd->isLinkable())
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.startBold();
Packit Service 50c9f2
          ol.docify(fd->name());
Packit Service 50c9f2
          ol.endBold();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (fd->generateSourceFile())
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.pushGeneratorState();
Packit Service 50c9f2
          ol.disableAllBut(OutputGenerator::Html);
Packit Service 50c9f2
          ol.docify(" ");
Packit Service 50c9f2
          ol.startTextLink(fd->includeName(),0);
Packit Service 50c9f2
          ol.docify("[");
Packit Service 50c9f2
          ol.parseText(theTranslator->trCode());
Packit Service 50c9f2
          ol.docify("]");
Packit Service 50c9f2
          ol.endTextLink();
Packit Service 50c9f2
          ol.popGeneratorState();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        ol.endMemberItem();
Packit Service 50c9f2
        if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
Packit Service 50c9f2
        {
Packit Service 50c9f2
          ol.startMemberDescription(fd->getOutputFileBase());
Packit Service 50c9f2
          ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
Packit Service 50c9f2
              FALSE, // indexWords
Packit Service 50c9f2
              FALSE, // isExample
Packit Service 50c9f2
              0,     // exampleName
Packit Service 50c9f2
              TRUE,  // single line
Packit Service 50c9f2
              TRUE   // link from index
Packit Service 50c9f2
              );
Packit Service 50c9f2
          ol.endMemberDescription();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        ol.endMemberDeclaration(0,0);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    ol.endMemberList();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::startMemberDeclarations(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  ol.startMemberSections();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::endMemberDeclarations(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  ol.endMemberSections();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
QCString DirDef::shortTitle() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  return theTranslator->trDirReference(m_shortName);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool DirDef::hasDetailedDescription() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool repeatBrief = Config_getBool(REPEAT_BRIEF);
Packit Service 50c9f2
  return (!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::writeTagFile(FTextStream &tagFile)
Packit Service 50c9f2
{
Packit Service 50c9f2
  tagFile << "  <compound kind=\"dir\">" << endl;
Packit Service 50c9f2
  tagFile << "    <name>" << convertToXML(displayName()) << "</name>" << endl;
Packit Service 50c9f2
  tagFile << "    <path>" << convertToXML(name()) << "</path>" << endl;
Packit Service 50c9f2
  tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
Packit Service 50c9f2
  QListIterator<LayoutDocEntry> eli(
Packit Service 50c9f2
      LayoutDocManager::instance().docEntries(LayoutDocManager::Directory));
Packit Service 50c9f2
  LayoutDocEntry *lde;
Packit Service 50c9f2
  for (eli.toFirst();(lde=eli.current());++eli)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    switch (lde->kind())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      case LayoutDocEntry::DirSubDirs:
Packit Service 50c9f2
        {
Packit Service 50c9f2
          if (m_subdirs.count()>0)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            DirDef *dd;
Packit Service 50c9f2
            QListIterator<DirDef> it(m_subdirs);
Packit Service 50c9f2
            for (;(dd=it.current());++it)
Packit Service 50c9f2
            {
Packit Service 50c9f2
              tagFile << "    <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
Packit Service 50c9f2
            }
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
        break;
Packit Service 50c9f2
      case LayoutDocEntry::DirFiles:
Packit Service 50c9f2
        {
Packit Service 50c9f2
          if (m_fileList->count()>0)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            QListIterator<FileDef> it(*m_fileList);
Packit Service 50c9f2
            FileDef *fd;
Packit Service 50c9f2
            for (;(fd=it.current());++it)
Packit Service 50c9f2
            {
Packit Service 50c9f2
              tagFile << "    <file>" << convertToXML(fd->name()) << "</file>" << endl;
Packit Service 50c9f2
            }
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
        break;
Packit Service 50c9f2
      default:
Packit Service 50c9f2
        break;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  writeDocAnchorsToTagFile(tagFile);
Packit Service 50c9f2
  tagFile << "  </compound>" << endl;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::writeDocumentation(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
Packit Service 50c9f2
  ol.pushGeneratorState();
Packit Service 50c9f2
  
Packit Service 50c9f2
  QCString title=theTranslator->trDirReference(m_dispName);
Packit Service 50c9f2
  startFile(ol,getOutputFileBase(),name(),title,HLI_Files,!generateTreeView);
Packit Service 50c9f2
Packit Service 50c9f2
  if (!generateTreeView)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // write navigation path
Packit Service 50c9f2
    writeNavigationPath(ol);
Packit Service 50c9f2
    ol.endQuickIndices();
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  startTitle(ol,getOutputFileBase());
Packit Service 50c9f2
  ol.pushGeneratorState();
Packit Service 50c9f2
    ol.disableAllBut(OutputGenerator::Html);
Packit Service 50c9f2
    ol.parseText(shortTitle());
Packit Service 50c9f2
    ol.enableAll();
Packit Service 50c9f2
    ol.disable(OutputGenerator::Html);
Packit Service 50c9f2
    ol.parseText(title);
Packit Service 50c9f2
  ol.popGeneratorState();
Packit Service 50c9f2
  endTitle(ol,getOutputFileBase(),title);
Packit Service 50c9f2
  ol.startContents();
Packit Service 50c9f2
Packit Service 50c9f2
  //---------------------------------------- start flexible part -------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
  SrcLangExt lang = getLanguage();
Packit Service 50c9f2
  QListIterator<LayoutDocEntry> eli(
Packit Service 50c9f2
      LayoutDocManager::instance().docEntries(LayoutDocManager::Directory));
Packit Service 50c9f2
  LayoutDocEntry *lde;
Packit Service 50c9f2
  for (eli.toFirst();(lde=eli.current());++eli)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    switch (lde->kind())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      case LayoutDocEntry::BriefDesc: 
Packit Service 50c9f2
        writeBriefDescription(ol);
Packit Service 50c9f2
        break; 
Packit Service 50c9f2
      case LayoutDocEntry::DirGraph: 
Packit Service 50c9f2
        writeDirectoryGraph(ol);
Packit Service 50c9f2
        break; 
Packit Service 50c9f2
      case LayoutDocEntry::MemberDeclStart: 
Packit Service 50c9f2
        startMemberDeclarations(ol);
Packit Service 50c9f2
        break; 
Packit Service 50c9f2
      case LayoutDocEntry::DirSubDirs: 
Packit Service 50c9f2
        writeSubDirList(ol);
Packit Service 50c9f2
        break; 
Packit Service 50c9f2
      case LayoutDocEntry::DirFiles: 
Packit Service 50c9f2
        writeFileList(ol);
Packit Service 50c9f2
        break; 
Packit Service 50c9f2
      case LayoutDocEntry::MemberDeclEnd: 
Packit Service 50c9f2
        endMemberDeclarations(ol);
Packit Service 50c9f2
        break;
Packit Service 50c9f2
      case LayoutDocEntry::DetailedDesc: 
Packit Service 50c9f2
        {
Packit Service 50c9f2
          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit Service 50c9f2
          writeDetailedDescription(ol,ls->title(lang));
Packit Service 50c9f2
        }
Packit Service 50c9f2
        break;
Packit Service 50c9f2
      case LayoutDocEntry::ClassIncludes:
Packit Service 50c9f2
      case LayoutDocEntry::ClassInlineClasses:
Packit Service 50c9f2
      case LayoutDocEntry::ClassInheritanceGraph:
Packit Service 50c9f2
      case LayoutDocEntry::ClassNestedClasses:
Packit Service 50c9f2
      case LayoutDocEntry::ClassCollaborationGraph:
Packit Service 50c9f2
      case LayoutDocEntry::ClassAllMembersLink:
Packit Service 50c9f2
      case LayoutDocEntry::ClassUsedFiles:
Packit Service 50c9f2
      case LayoutDocEntry::NamespaceNestedNamespaces:
Packit Service 50c9f2
      case LayoutDocEntry::NamespaceNestedConstantGroups:
Packit Service 50c9f2
      case LayoutDocEntry::NamespaceClasses:
Packit Service 50c9f2
      case LayoutDocEntry::NamespaceInlineClasses:
Packit Service 50c9f2
      case LayoutDocEntry::FileClasses:
Packit Service 50c9f2
      case LayoutDocEntry::FileNamespaces:
Packit Service 50c9f2
      case LayoutDocEntry::FileConstantGroups:
Packit Service 50c9f2
      case LayoutDocEntry::FileIncludes:
Packit Service 50c9f2
      case LayoutDocEntry::FileIncludeGraph:
Packit Service 50c9f2
      case LayoutDocEntry::FileIncludedByGraph: 
Packit Service 50c9f2
      case LayoutDocEntry::FileSourceLink:
Packit Service 50c9f2
      case LayoutDocEntry::FileInlineClasses:
Packit Service 50c9f2
      case LayoutDocEntry::GroupClasses: 
Packit Service 50c9f2
      case LayoutDocEntry::GroupInlineClasses: 
Packit Service 50c9f2
      case LayoutDocEntry::GroupNamespaces:
Packit Service 50c9f2
      case LayoutDocEntry::GroupDirs: 
Packit Service 50c9f2
      case LayoutDocEntry::GroupNestedGroups: 
Packit Service 50c9f2
      case LayoutDocEntry::GroupFiles:
Packit Service 50c9f2
      case LayoutDocEntry::GroupGraph: 
Packit Service 50c9f2
      case LayoutDocEntry::GroupPageDocs:
Packit Service 50c9f2
      case LayoutDocEntry::AuthorSection:
Packit Service 50c9f2
      case LayoutDocEntry::MemberGroups:
Packit Service 50c9f2
      case LayoutDocEntry::MemberDecl:
Packit Service 50c9f2
      case LayoutDocEntry::MemberDef:
Packit Service 50c9f2
      case LayoutDocEntry::MemberDefStart:
Packit Service 50c9f2
      case LayoutDocEntry::MemberDefEnd:
Packit Service 50c9f2
        err("Internal inconsistency: member %d should not be part of "
Packit Service 50c9f2
            "LayoutDocManager::Directory entry list\n",lde->kind());
Packit Service 50c9f2
        break;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  //---------------------------------------- end flexible part -------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
  ol.endContents();
Packit Service 50c9f2
Packit Service 50c9f2
  endFileWithNavPath(this,ol);
Packit Service 50c9f2
Packit Service 50c9f2
  ol.popGeneratorState();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirDef::setLevel()
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (m_level==-1) // level not set before
Packit Service 50c9f2
  {
Packit Service 50c9f2
    DirDef *p = parent();
Packit Service 50c9f2
    if (p)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      p->setLevel();
Packit Service 50c9f2
      m_level = p->level()+1;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_level = 0;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/** Add as "uses" dependency between \a this dir and \a dir,
Packit Service 50c9f2
 *  that was caused by a dependency on file \a fd.
Packit Service 50c9f2
 */ 
Packit Service 50c9f2
void DirDef::addUsesDependency(DirDef *dir,FileDef *srcFd,
Packit Service 50c9f2
                               FileDef *dstFd,bool inherited)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (this==dir) return; // do not add self-dependencies
Packit Service 50c9f2
  //static int count=0;
Packit Service 50c9f2
  //printf("  %d add dependency %s->%s due to %s->%s\n",
Packit Service 50c9f2
  //    count++,shortName().data(),
Packit Service 50c9f2
  //    dir->shortName().data(),
Packit Service 50c9f2
  //    srcFd->name().data(),
Packit Service 50c9f2
  //    dstFd->name().data());
Packit Service 50c9f2
Packit Service 50c9f2
  // levels match => add direct dependency
Packit Service 50c9f2
  bool added=FALSE;
Packit Service 50c9f2
  UsedDir *usedDir = m_usedDirs->find(dir->getOutputFileBase());
Packit Service 50c9f2
  if (usedDir) // dir dependency already present
Packit Service 50c9f2
  {
Packit Service 50c9f2
     FilePair *usedPair = usedDir->findFilePair(
Packit Service 50c9f2
         srcFd->getOutputFileBase()+dstFd->getOutputFileBase());
Packit Service 50c9f2
     if (usedPair==0) // new file dependency
Packit Service 50c9f2
     {
Packit Service 50c9f2
       //printf("  => new file\n");
Packit Service 50c9f2
       usedDir->addFileDep(srcFd,dstFd); 
Packit Service 50c9f2
       added=TRUE;
Packit Service 50c9f2
     }
Packit Service 50c9f2
     else
Packit Service 50c9f2
     {
Packit Service 50c9f2
       // dir & file dependency already added
Packit Service 50c9f2
     }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // new directory dependency
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("  => new file\n");
Packit Service 50c9f2
    usedDir = new UsedDir(dir,inherited);
Packit Service 50c9f2
    usedDir->addFileDep(srcFd,dstFd); 
Packit Service 50c9f2
    m_usedDirs->insert(dir->getOutputFileBase(),usedDir);
Packit Service 50c9f2
    added=TRUE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (added)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (dir->parent())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      // add relation to parent of used dir
Packit Service 50c9f2
      addUsesDependency(dir->parent(),srcFd,dstFd,inherited);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (parent())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      // add relation for the parent of this dir as well
Packit Service 50c9f2
      parent()->addUsesDependency(dir,srcFd,dstFd,TRUE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/** Computes the dependencies between directories
Packit Service 50c9f2
 */
Packit Service 50c9f2
void DirDef::computeDependencies()
Packit Service 50c9f2
{
Packit Service 50c9f2
  FileList *fl = m_fileList;
Packit Service 50c9f2
  if (fl) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QListIterator<FileDef> fli(*fl);
Packit Service 50c9f2
    FileDef *fd;
Packit Service 50c9f2
    for (fli.toFirst();(fd=fli.current());++fli) // foreach file in dir dd
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //printf("  File %s\n",fd->name().data());
Packit Service 50c9f2
      //printf("** dir=%s file=%s\n",shortName().data(),fd->name().data());
Packit Service 50c9f2
      QList<IncludeInfo> *ifl = fd->includeFileList();
Packit Service 50c9f2
      if (ifl)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        QListIterator<IncludeInfo> ifli(*ifl); 
Packit Service 50c9f2
        IncludeInfo *ii;
Packit Service 50c9f2
        for (ifli.toFirst();(ii=ifli.current());++ifli) // foreach include file
Packit Service 50c9f2
        {
Packit Service 50c9f2
          //printf("  > %s\n",ii->includeName.data());
Packit Service 50c9f2
          //printf("    #include %s\n",ii->includeName.data());
Packit Service 50c9f2
          if (ii->fileDef && ii->fileDef->isLinkable()) // linkable file
Packit Service 50c9f2
          {
Packit Service 50c9f2
            DirDef *usedDir = ii->fileDef->getDirDef();
Packit Service 50c9f2
            if (usedDir)
Packit Service 50c9f2
            {
Packit Service 50c9f2
              // add dependency: thisDir->usedDir
Packit Service 50c9f2
              //static int count=0;
Packit Service 50c9f2
              //printf("      %d: add dependency %s->%s\n",count++,name().data(),usedDir->name().data());
Packit Service 50c9f2
              addUsesDependency(usedDir,fd,ii->fileDef,FALSE);
Packit Service 50c9f2
            }
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (m_usedDirs)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QDictIterator<UsedDir> udi(*m_usedDirs);
Packit Service 50c9f2
    UsedDir *udir;
Packit Service 50c9f2
    for (udi.toFirst();(udir=udi.current());++udi)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      udir->sort();
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool DirDef::isParentOf(DirDef *dir) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (dir->parent()==this) // this is a parent of dir 
Packit Service 50c9f2
    return TRUE;
Packit Service 50c9f2
  else if (dir->parent()) // repeat for the parent of dir
Packit Service 50c9f2
    return isParentOf(dir->parent()); 
Packit Service 50c9f2
  else
Packit Service 50c9f2
    return FALSE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool DirDef::depGraphIsTrivial() const
Packit Service 50c9f2
{
Packit Service 50c9f2
  return m_usedDirs->count()==0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//----------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
int FilePairDict::compareValues(const FilePair *left,const FilePair *right) const
Packit Service 50c9f2
{
Packit Service 50c9f2
  int orderHi = qstricmp(left->source()->name(),right->source()->name());
Packit Service 50c9f2
  if (orderHi!=0) return orderHi;
Packit Service 50c9f2
  int orderLo = qstricmp(left->destination()->name(),right->destination()->name());
Packit Service 50c9f2
  return orderLo;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//----------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
UsedDir::UsedDir(DirDef *dir,bool inherited) :
Packit Service 50c9f2
   m_dir(dir), m_filePairs(7), m_inherited(inherited)
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_filePairs.setAutoDelete(TRUE);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
UsedDir::~UsedDir()
Packit Service 50c9f2
{
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
void UsedDir::addFileDep(FileDef *srcFd,FileDef *dstFd)
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_filePairs.append(srcFd->getOutputFileBase()+dstFd->getOutputFileBase(),
Packit Service 50c9f2
                     new FilePair(srcFd,dstFd));
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void UsedDir::sort()
Packit Service 50c9f2
{
Packit Service 50c9f2
  m_filePairs.sort();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
FilePair *UsedDir::findFilePair(const char *name)
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString n=name;
Packit Service 50c9f2
  return n.isEmpty() ? 0 : m_filePairs.find(n);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
DirDef *DirDef::createNewDir(const char *path)
Packit Service 50c9f2
{
Packit Service 50c9f2
  ASSERT(path!=0);
Packit Service 50c9f2
  DirDef *dir = Doxygen::directories->find(path);
Packit Service 50c9f2
  if (dir==0) // new dir
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("Adding new dir %s\n",path);
Packit Service 50c9f2
    dir = new DirDef(path);
Packit Service 50c9f2
    //printf("createNewDir %s short=%s\n",path,dir->shortName().data());
Packit Service 50c9f2
    Doxygen::directories->append(path,dir);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return dir;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
bool DirDef::matchPath(const QCString &path,QStrList &l)
Packit Service 50c9f2
{
Packit Service 50c9f2
  const char *s=l.first();
Packit Service 50c9f2
  while (s)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString prefix = s;
Packit Service 50c9f2
    if (qstricmp(prefix.left(path.length()),path)==0) // case insensitive compare
Packit Service 50c9f2
    {
Packit Service 50c9f2
      return TRUE;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    s = l.next();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return FALSE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*! strip part of \a path if it matches
Packit Service 50c9f2
 *  one of the paths in the Config_getList(STRIP_FROM_PATH) list
Packit Service 50c9f2
 */
Packit Service 50c9f2
DirDef *DirDef::mergeDirectoryInTree(const QCString &path)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("DirDef::mergeDirectoryInTree(%s)\n",path.data());
Packit Service 50c9f2
  int p=0,i=0;
Packit Service 50c9f2
  DirDef *dir=0;
Packit Service 50c9f2
  while ((i=path.find('/',p))!=-1)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString part=path.left(i+1);
Packit Service 50c9f2
    if (!matchPath(part,Config_getList(STRIP_FROM_PATH)) && (part!="/" && part!="//"))
Packit Service 50c9f2
    {
Packit Service 50c9f2
      dir=createNewDir(part); 
Packit Service 50c9f2
    }
Packit Service 50c9f2
    p=i+1;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return dir;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//----------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (target->parent()!=root) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    writePartialDirPath(ol,root,target->parent());
Packit Service 50c9f2
    ol.writeString(" / ");
Packit Service 50c9f2
  }
Packit Service 50c9f2
  ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),0,target->shortName());
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void writePartialFilePath(OutputList &ol,const DirDef *root,const FileDef *fd)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (fd->getDirDef() && fd->getDirDef()!=root)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    writePartialDirPath(ol,root,fd->getDirDef());
Packit Service 50c9f2
    ol.writeString(" / ");
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (fd->isLinkable())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ol.startBold();
Packit Service 50c9f2
    ol.docify(fd->name());
Packit Service 50c9f2
    ol.endBold();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void DirRelation::writeDocumentation(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
Packit Service 50c9f2
  ol.pushGeneratorState();
Packit Service 50c9f2
  ol.disableAllBut(OutputGenerator::Html);
Packit Service 50c9f2
Packit Service 50c9f2
  QCString shortTitle=theTranslator->trDirRelation(
Packit Service 50c9f2
                      m_src->shortName()+" → "+
Packit Service 50c9f2
                      m_dst->dir()->shortName());
Packit Service 50c9f2
  QCString title=theTranslator->trDirRelation(
Packit Service 50c9f2
                 m_src->displayName()+" -> "+
Packit Service 50c9f2
                 m_dst->dir()->shortName());
Packit Service 50c9f2
  startFile(ol,getOutputFileBase(),getOutputFileBase(),
Packit Service 50c9f2
            title,HLI_None,!generateTreeView,m_src->getOutputFileBase());
Packit Service 50c9f2
Packit Service 50c9f2
  if (!generateTreeView)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // write navigation path
Packit Service 50c9f2
    m_src->writeNavigationPath(ol);
Packit Service 50c9f2
    ol.endQuickIndices();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  ol.startContents();
Packit Service 50c9f2
Packit Service 50c9f2
  ol.writeString("

"+shortTitle+"

");
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
  ol.parseText(theTranslator->trFileIn(m_src->pathFragment()));
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
  ol.parseText(theTranslator->trIncludesFileIn(m_dst->dir()->pathFragment()));
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
Packit Service 50c9f2
  SDict<FilePair>::Iterator fpi(m_dst->filePairs());
Packit Service 50c9f2
  FilePair *fp;
Packit Service 50c9f2
  for (fpi.toFirst();(fp=fpi.current());++fpi)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ol.writeString("");
Packit Service 50c9f2
    ol.writeString("");
Packit Service 50c9f2
    writePartialFilePath(ol,m_src,fp->source());
Packit Service 50c9f2
    ol.writeString("");
Packit Service 50c9f2
    ol.writeString("");
Packit Service 50c9f2
    writePartialFilePath(ol,m_dst->dir(),fp->destination());
Packit Service 50c9f2
    ol.writeString("");
Packit Service 50c9f2
    ol.writeString("");
Packit Service 50c9f2
  }
Packit Service 50c9f2
  ol.writeString("");
Packit Service 50c9f2
Packit Service 50c9f2
  ol.endContents();
Packit Service 50c9f2
  
Packit Service 50c9f2
  endFileWithNavPath(m_src,ol);
Packit Service 50c9f2
Packit Service 50c9f2
  ol.popGeneratorState();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
//----------------------------------------------------------------------
Packit Service 50c9f2
// external functions
Packit Service 50c9f2
Packit Service 50c9f2
/** In order to create stable, but unique directory names,
Packit Service 50c9f2
 *  we compute the common part of the path shared by all directories.
Packit Service 50c9f2
 */
Packit Service 50c9f2
static void computeCommonDirPrefix()
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString path;
Packit Service 50c9f2
  DirDef *dir;
Packit Service 50c9f2
  DirSDict::Iterator sdi(*Doxygen::directories);
Packit Service 50c9f2
  if (Doxygen::directories->count()>0) // we have at least one dir
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // start will full path of first dir
Packit Service 50c9f2
    sdi.toFirst();
Packit Service 50c9f2
    dir=sdi.current();
Packit Service 50c9f2
    path=dir->name();
Packit Service 50c9f2
    int i=path.findRev('/',path.length()-2);
Packit Service 50c9f2
    path=path.left(i+1);
Packit Service 50c9f2
    bool done=FALSE;
Packit Service 50c9f2
    if (i==-1) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      path="";
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      while (!done)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        int l = path.length();
Packit Service 50c9f2
        int count=0;
Packit Service 50c9f2
        for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          QCString dirName = dir->name();
Packit Service 50c9f2
          if (dirName.length()>path.length())
Packit Service 50c9f2
          {
Packit Service 50c9f2
            if (qstrncmp(dirName,path,l)!=0) // dirName does not start with path
Packit Service 50c9f2
            {
Packit Service 50c9f2
              int i=path.findRev('/',l-2);
Packit Service 50c9f2
              if (i==-1) // no unique prefix -> stop
Packit Service 50c9f2
              {
Packit Service 50c9f2
                path="";
Packit Service 50c9f2
                done=TRUE;
Packit Service 50c9f2
              }
Packit Service 50c9f2
              else // restart with shorter path
Packit Service 50c9f2
              {
Packit Service 50c9f2
                path=path.left(i+1);
Packit Service 50c9f2
                break;
Packit Service 50c9f2
              }
Packit Service 50c9f2
            }
Packit Service 50c9f2
          }
Packit Service 50c9f2
          else // dir is shorter than path -> take path of dir as new start
Packit Service 50c9f2
          {
Packit Service 50c9f2
            path=dir->name();
Packit Service 50c9f2
            l=path.length();
Packit Service 50c9f2
            int i=path.findRev('/',l-2);
Packit Service 50c9f2
            if (i==-1) // no unique prefix -> stop
Packit Service 50c9f2
            {
Packit Service 50c9f2
              path="";
Packit Service 50c9f2
              done=TRUE;
Packit Service 50c9f2
            }
Packit Service 50c9f2
            else // restart with shorter path
Packit Service 50c9f2
            {
Packit Service 50c9f2
              path=path.left(i+1);
Packit Service 50c9f2
            }
Packit Service 50c9f2
            break;
Packit Service 50c9f2
          }
Packit Service 50c9f2
          count++;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (count==Doxygen::directories->count())
Packit Service 50c9f2
          // path matches for all directories -> found the common prefix
Packit Service 50c9f2
        {
Packit Service 50c9f2
          done=TRUE;
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString diskName = dir->name().right(dir->name().length()-path.length());
Packit Service 50c9f2
    dir->setDiskName(diskName);
Packit Service 50c9f2
    //printf("set disk name: %s -> %s\n",dir->name().data(),diskName.data());
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void buildDirectories()
Packit Service 50c9f2
{
Packit Service 50c9f2
  // for each input file
Packit Service 50c9f2
  FileNameListIterator fnli(*Doxygen::inputNameList); 
Packit Service 50c9f2
  FileName *fn;
Packit Service 50c9f2
  for (fnli.toFirst();(fn=fnli.current());++fnli)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    FileNameIterator fni(*fn);
Packit Service 50c9f2
    FileDef *fd;
Packit Service 50c9f2
    for (;(fd=fni.current());++fni)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //printf("buildDirectories %s\n",fd->name().data());
Packit Service 50c9f2
      if (fd->getReference().isEmpty() && !fd->isDocumentationFile())
Packit Service 50c9f2
      {
Packit Service 50c9f2
        DirDef *dir;
Packit Service 50c9f2
        if ((dir=Doxygen::directories->find(fd->getPath()))==0) // new directory
Packit Service 50c9f2
        {
Packit Service 50c9f2
          dir = DirDef::mergeDirectoryInTree(fd->getPath());
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (dir) dir->addFile(fd);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else
Packit Service 50c9f2
      {
Packit Service 50c9f2
        // do something for file imported via tag files.
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  //DirDef *root = new DirDef("root:");
Packit Service 50c9f2
  // compute relations between directories => introduce container dirs.
Packit Service 50c9f2
  DirDef *dir;
Packit Service 50c9f2
  DirSDict::Iterator sdi(*Doxygen::directories);
Packit Service 50c9f2
  for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString name = dir->name();
Packit Service 50c9f2
    int i=name.findRev('/',name.length()-2);
Packit Service 50c9f2
    if (i>0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      DirDef *parent = Doxygen::directories->find(name.left(i+1));
Packit Service 50c9f2
      //if (parent==0) parent=root;
Packit Service 50c9f2
      if (parent) 
Packit Service 50c9f2
      {
Packit Service 50c9f2
        parent->addSubDir(dir); 
Packit Service 50c9f2
        //printf("DirDef::addSubdir(): Adding subdir\n%s to\n%s\n",
Packit Service 50c9f2
        //  dir->displayName().data(), parent->displayName().data());
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    dir->sort();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  Doxygen::directories->sort();
Packit Service 50c9f2
  computeCommonDirPrefix();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void computeDirDependencies()
Packit Service 50c9f2
{
Packit Service 50c9f2
  DirDef *dir;
Packit Service 50c9f2
  DirSDict::Iterator sdi(*Doxygen::directories);
Packit Service 50c9f2
  // compute nesting level for each directory
Packit Service 50c9f2
  for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    dir->setLevel();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  // compute uses dependencies between directories
Packit Service 50c9f2
  for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("computeDependencies for %s: #dirs=%d\n",dir->name().data(),Doxygen::directories.count());
Packit Service 50c9f2
    dir->computeDependencies();
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void generateDirDocs(OutputList &ol)
Packit Service 50c9f2
{
Packit Service 50c9f2
  DirDef *dir;
Packit Service 50c9f2
  DirSDict::Iterator sdi(*Doxygen::directories);
Packit Service 50c9f2
  for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ol.pushGeneratorState();
Packit Service 50c9f2
    if (!dir->hasDocumentation())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      ol.disableAllBut(OutputGenerator::Html);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    dir->writeDocumentation(ol);
Packit Service 50c9f2
    ol.popGeneratorState();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (Config_getBool(DIRECTORY_GRAPH))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    SDict<DirRelation>::Iterator rdi(Doxygen::dirRelations);
Packit Service 50c9f2
    DirRelation *dr;
Packit Service 50c9f2
    for (rdi.toFirst();(dr=rdi.current());++rdi)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      dr->writeDocumentation(ol);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2