Doxygen
Loading...
Searching...
No Matches
dirdef.cpp File Reference
#include <algorithm>
#include "dirdef.h"
#include "md5.h"
#include "filename.h"
#include "doxygen.h"
#include "util.h"
#include "outputlist.h"
#include "language.h"
#include "message.h"
#include "dot.h"
#include "dotdirdeps.h"
#include "layout.h"
#include "config.h"
#include "docparser.h"
#include "definitionimpl.h"
#include "filedef.h"
#include "trace.h"
+ Include dependency graph for dirdef.cpp:

Go to the source code of this file.

Classes

class  DirDefImpl
 

Functions

DirDefcreateDirDef (const QCString &path)
 
static QCString encodeDirName (const QCString &anchor)
 
static void writePartialDirPath (OutputList &ol, const DirDef *root, const DirDef *target)
 
static void writePartialFilePath (OutputList &ol, const DirDef *root, const FileDef *fd)
 
static void computeCommonDirPrefix ()
 In order to create stable, but unique directory names, we compute the common part of the path shared by all directories.
 
void buildDirectories ()
 
void computeDirDependencies ()
 
void generateDirDocs (OutputList &ol)
 
bool compareDirDefs (const DirDef *item1, const DirDef *item2)
 
DirDeftoDirDef (Definition *d)
 
const DirDeftoDirDef (const Definition *d)
 

Function Documentation

◆ buildDirectories()

void buildDirectories ( )

Definition at line 1055 of file dirdef.cpp.

1056{
1057 AUTO_TRACE();
1058 // for each input file
1059 for (const auto &fn : *Doxygen::inputNameLinkedMap)
1060 {
1061 for (const auto &fd : *fn)
1062 {
1063 if (fd->getReference().isEmpty())
1064 {
1065 DirDef *dir=Doxygen::dirLinkedMap->find(fd->getPath());
1066 if (dir==nullptr) // new directory
1067 {
1068 dir = DirDefImpl::mergeDirectoryInTree(fd->getPath());
1069 }
1070 if (dir && !fd->isDocumentationFile()) dir->addFile(fd.get());
1071 }
1072 else
1073 {
1074 // do something for file imported via tag files.
1075 }
1076 }
1077 }
1078
1079 // compute relations between directories => introduce container dirs.
1080 for (const auto &dir : *Doxygen::dirLinkedMap)
1081 {
1082 QCString name = dir->name();
1083 int i=name.findRev('/',static_cast<int>(name.length())-2);
1084 if (i>0)
1085 {
1086 DirDef *parent = Doxygen::dirLinkedMap->find(name.left(i+1));
1087 //if (parent==0) parent=root;
1088 if (parent)
1089 {
1090 parent->addSubDir(dir.get());
1091 AUTO_TRACE_ADD("DirDefImpl::addSubdir(): Adding subdir {} to {}",
1092 dir->displayName(), parent->displayName());
1093 }
1094 }
1095 }
1096
1097 // sort the directory contents
1098 for (const auto &dir : *Doxygen::dirLinkedMap)
1099 {
1100 dir->sort();
1101 }
1102
1103 // short the directories themselves
1104 std::stable_sort(Doxygen::dirLinkedMap->begin(),
1106 [](const auto &d1,const auto &d2)
1107 {
1108 QCString s1 = d1->shortName(), s2 = d2->shortName();
1109 int i = qstricmp_sort(s1,s2);
1110 if (i==0) // if sort name are equal, sort on full path
1111 {
1112 QCString n1 = d1->name(), n2 = d2->name();
1113 int n = qstricmp_sort(n1,n2);
1114 return n < 0;
1115 }
1116 return i < 0;
1117 });
1118
1119 // set the directory index identifier
1120 int dirIndex=0;
1121 for (const auto &dir : *Doxygen::dirLinkedMap)
1122 {
1123 dir->setDirIndex(dirIndex++);
1124 }
1125
1127}
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual const QCString & name() const =0
A model of a directory symbol.
Definition dirdef.h:110
virtual void sort()=0
virtual void addFile(FileDef *fd)=0
virtual void setDirIndex(int index)=0
static DirDef * mergeDirectoryInTree(const QCString &path)
Definition dirdef.cpp:854
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:105
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:129
This is an alternative implementation of QCString.
Definition qcstring.h:101
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:91
QCString left(size_t len) const
Definition qcstring.h:214
DirIterator begin(DirIterator it) noexcept
Definition dir.cpp:170
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
static void computeCommonDirPrefix()
In order to create stable, but unique directory names, we compute the common part of the path shared ...
Definition dirdef.cpp:978
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:47
#define AUTO_TRACE(...)
Definition docnode.cpp:46
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
Definition docnode.h:1324
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86

References DirDef::addFile(), AUTO_TRACE, AUTO_TRACE_ADD, begin(), computeCommonDirPrefix(), Doxygen::dirLinkedMap, end(), QCString::findRev(), Doxygen::inputNameLinkedMap, QCString::left(), QCString::length(), DirDefImpl::mergeDirectoryInTree(), parent(), and qstricmp_sort().

Referenced by parseInput().

◆ compareDirDefs()

bool compareDirDefs ( const DirDef * item1,
const DirDef * item2 )

Definition at line 1168 of file dirdef.cpp.

1169{
1170 return qstricmp_sort(item1->shortName(),item2->shortName()) < 0;
1171}
virtual const QCString shortName() const =0

References qstricmp_sort(), and DirDef::shortName().

Referenced by DirDefImpl::sort(), and GroupDefImpl::sortMemberLists().

◆ computeCommonDirPrefix()

static void computeCommonDirPrefix ( )
static

In order to create stable, but unique directory names, we compute the common part of the path shared by all directories.

Definition at line 978 of file dirdef.cpp.

979{
980 AUTO_TRACE();
981 QCString path;
982 auto it = Doxygen::dirLinkedMap->begin();
983 if (!Doxygen::dirLinkedMap->empty()) // we have at least one dir
984 {
985 // start will full path of first dir
986 path=removeLongPathMarker((*it)->name());
987 int i=path.findRev('/',static_cast<int>(path.length())-2);
988 path=path.left(i+1);
989 bool done=FALSE;
990 if (i==-1)
991 {
992 path="";
993 }
994 else
995 {
996 while (!done)
997 {
998 int l = static_cast<int>(path.length());
999 size_t count=0;
1000 for (const auto &dir : *Doxygen::dirLinkedMap)
1001 {
1002 QCString dirName = removeLongPathMarker(dir->name());
1003 //printf("dirName='%s' (l=%d) path='%s' (l=%d)\n",qPrint(dirName),dirName.length(),qPrint(path),path.length());
1004 if (dirName.length()>path.length())
1005 {
1006 if (dirName.left(l)!=path) // dirName does not start with path
1007 {
1008 i = l>=2 ? path.findRev('/',l-2) : -1;
1009 if (i==-1) // no unique prefix -> stop
1010 {
1011 path="";
1012 done=TRUE;
1013 }
1014 else // restart with shorter path
1015 {
1016 path=path.left(i+1);
1017 break;
1018 }
1019 }
1020 }
1021 else // dir is shorter than path -> take path of dir as new start
1022 {
1023 path=dir->name();
1024 l=static_cast<int>(path.length());
1025 i=path.findRev('/',l-2);
1026 if (i==-1) // no unique prefix -> stop
1027 {
1028 path="";
1029 done=TRUE;
1030 }
1031 else // restart with shorter path
1032 {
1033 path=path.left(i+1);
1034 }
1035 break;
1036 }
1037 count++;
1038 }
1039 if (count==Doxygen::dirLinkedMap->size())
1040 // path matches for all directories -> found the common prefix
1041 {
1042 done=TRUE;
1043 }
1044 }
1045 }
1046 }
1047 for (const auto &dir : *Doxygen::dirLinkedMap)
1048 {
1049 QCString diskName = dir->name().right(dir->name().length()-path.length());
1050 dir->setDiskName(diskName);
1051 AUTO_TRACE_ADD("set disk name: {} -> {}",dir->name(),diskName);
1052 }
1053}
QCString right(size_t len) const
Definition qcstring.h:219
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
QCString removeLongPathMarker(QCString path)
Definition util.cpp:298

References AUTO_TRACE, AUTO_TRACE_ADD, Doxygen::dirLinkedMap, FALSE, QCString::findRev(), QCString::left(), QCString::length(), removeLongPathMarker(), QCString::right(), and TRUE.

Referenced by buildDirectories().

◆ computeDirDependencies()

void computeDirDependencies ( )

Definition at line 1129 of file dirdef.cpp.

1130{
1131 AUTO_TRACE();
1132 // compute nesting level for each directory
1133 for (const auto &dir : *Doxygen::dirLinkedMap)
1134 {
1135 dir->setLevel();
1136 }
1137
1138 // compute uses dependencies between directories
1139 for (const auto &dir : *Doxygen::dirLinkedMap)
1140 {
1141 AUTO_TRACE_ADD("computeDependencies for {}: #dirs={}",dir->name(),Doxygen::dirLinkedMap->size());
1142 dir->computeDependencies();
1143 }
1144}

References AUTO_TRACE, AUTO_TRACE_ADD, and Doxygen::dirLinkedMap.

Referenced by parseInput().

◆ createDirDef()

DirDef * createDirDef ( const QCString & path)

Definition at line 107 of file dirdef.cpp.

108{
109 return new DirDefImpl(path);
110}

Referenced by DirDefImpl::createNewDir().

◆ encodeDirName()

static QCString encodeDirName ( const QCString & anchor)
static

Definition at line 188 of file dirdef.cpp.

189{
190 AUTO_TRACE();
191 // convert to md5 hash
192 uint8_t md5_sig[16];
193 char sigStr[33];
194 MD5Buffer(anchor.data(),static_cast<unsigned int>(anchor.length()),md5_sig);
195 MD5SigToString(md5_sig,sigStr);
196 AUTO_TRACE_EXIT("result={}",sigStr);
197 return sigStr;
198
199 // old algorithm
200// QCString result;
201
202// int l = anchor.length(),i;
203// for (i=0;i<l;i++)
204// {
205// char c = anchor.at(i);
206// if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
207// {
208// result+=c;
209// }
210// else
211// {
212// static char hexStr[]="0123456789ABCDEF";
213// char escChar[]={ '_', 0, 0, 0 };
214// escChar[1]=hexStr[c>>4];
215// escChar[2]=hexStr[c&0xf];
216// result+=escChar;
217// }
218// }
219// return result;
220}
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:159
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:48

References AUTO_TRACE, AUTO_TRACE_EXIT, QCString::data(), and QCString::length().

Referenced by DirDefImpl::getOutputFileBase().

◆ generateDirDocs()

void generateDirDocs ( OutputList & ol)

Definition at line 1146 of file dirdef.cpp.

1147{
1148 AUTO_TRACE();
1149 for (const auto &dir : *Doxygen::dirLinkedMap)
1150 {
1151 ol.pushGeneratorState();
1152 if (!dir->hasDocumentation())
1153 {
1155 }
1156 dir->writeDocumentation(ol);
1157 ol.popGeneratorState();
1158 }
1159 //if (Config_getBool(DIRECTORY_GRAPH))
1160 {
1161 for (const auto &dr : Doxygen::dirRelations)
1162 {
1163 dr->writeDocumentation(ol);
1164 }
1165 }
1166}
static DirRelationLinkedMap dirRelations
Definition doxygen.h:130
void pushGeneratorState()
void disableAllBut(OutputType o)
void popGeneratorState()

References AUTO_TRACE, Doxygen::dirLinkedMap, Doxygen::dirRelations, OutputList::disableAllBut(), Html, OutputList::popGeneratorState(), and OutputList::pushGeneratorState().

Referenced by generateOutput().

◆ toDirDef() [1/2]

const DirDef * toDirDef ( const Definition * d)

Definition at line 1188 of file dirdef.cpp.

1189{
1190 if (d==nullptr) return nullptr;
1191 if (d && typeid(*d)==typeid(DirDefImpl))
1192 {
1193 return static_cast<const DirDef*>(d);
1194 }
1195 else
1196 {
1197 return nullptr;
1198 }
1199}

◆ toDirDef() [2/2]

DirDef * toDirDef ( Definition * d)

Definition at line 1175 of file dirdef.cpp.

1176{
1177 if (d==nullptr) return nullptr;
1178 if (d && typeid(*d)==typeid(DirDefImpl))
1179 {
1180 return static_cast<DirDef*>(d);
1181 }
1182 else
1183 {
1184 return nullptr;
1185 }
1186}

◆ writePartialDirPath()

static void writePartialDirPath ( OutputList & ol,
const DirDef * root,
const DirDef * target )
static

Definition at line 890 of file dirdef.cpp.

891{
892 if (target->parent()!=root)
893 {
894 writePartialDirPath(ol,root,target->parent());
895 ol.writeString("&#160;/&#160;");
896 }
897 ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),QCString(),target->shortName());
898}
virtual QCString getReference() const =0
virtual QCString getOutputFileBase() const =0
virtual DirDef * parent() const =0
void writeString(const QCString &text)
Definition outputlist.h:412
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:440
static void writePartialDirPath(OutputList &ol, const DirDef *root, const DirDef *target)
Definition dirdef.cpp:890

References Definition::getOutputFileBase(), Definition::getReference(), DirDef::parent(), DirDef::shortName(), OutputList::writeObjectLink(), writePartialDirPath(), and OutputList::writeString().

Referenced by writePartialDirPath(), and writePartialFilePath().

◆ writePartialFilePath()

static void writePartialFilePath ( OutputList & ol,
const DirDef * root,
const FileDef * fd )
static

Definition at line 900 of file dirdef.cpp.

901{
902 if (fd->getDirDef() && fd->getDirDef()!=root)
903 {
904 writePartialDirPath(ol,root,fd->getDirDef());
905 ol.writeString("&#160;/&#160;");
906 }
907 if (fd->isLinkable())
908 {
910 }
911 else
912 {
913 ol.startBold();
914 ol.docify(fd->name());
915 ol.endBold();
916 }
917}
virtual bool isLinkable() const =0
virtual DirDef * getDirDef() const =0
void docify(const QCString &s)
Definition outputlist.h:438
void startBold()
Definition outputlist.h:562
void endBold()
Definition outputlist.h:564

References OutputList::docify(), OutputList::endBold(), FileDef::getDirDef(), Definition::getOutputFileBase(), Definition::getReference(), Definition::isLinkable(), Definition::name(), OutputList::startBold(), OutputList::writeObjectLink(), writePartialDirPath(), and OutputList::writeString().

Referenced by DirRelation::writeDocumentation().