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 1085 of file dirdef.cpp.

1086{
1087 AUTO_TRACE();
1088 // for each input file
1089 for (const auto &fn : *Doxygen::inputNameLinkedMap)
1090 {
1091 for (const auto &fd : *fn)
1092 {
1093 if (fd->getReference().isEmpty())
1094 {
1095 DirDef *dir=Doxygen::dirLinkedMap->find(fd->getPath());
1096 if (dir==nullptr) // new directory
1097 {
1098 dir = DirDefImpl::mergeDirectoryInTree(fd->getPath());
1099 }
1100 if (dir && !fd->isDocumentationFile()) dir->addFile(fd.get());
1101 }
1102 else
1103 {
1104 // do something for file imported via tag files.
1105 }
1106 }
1107 }
1108
1109 // compute relations between directories => introduce container dirs.
1110 for (const auto &dir : *Doxygen::dirLinkedMap)
1111 {
1112 QCString name = dir->name();
1113 int i=name.findRev('/',static_cast<int>(name.length())-2);
1114 if (i>0)
1115 {
1116 DirDef *parent = Doxygen::dirLinkedMap->find(name.left(i+1));
1117 //if (parent==0) parent=root;
1118 if (parent)
1119 {
1120 parent->addSubDir(dir.get());
1121 AUTO_TRACE_ADD("DirDefImpl::addSubdir(): Adding subdir {} to {}",
1122 dir->displayName(), parent->displayName());
1123 }
1124 }
1125 }
1126
1127 // sort the directory contents
1128 for (const auto &dir : *Doxygen::dirLinkedMap)
1129 {
1130 dir->sort();
1131 }
1132
1133 // short the directories themselves
1134 std::stable_sort(Doxygen::dirLinkedMap->begin(),
1136 [](const auto &d1,const auto &d2)
1137 {
1138 QCString s1 = d1->shortName(), s2 = d2->shortName();
1139 int i = qstricmp_sort(s1,s2);
1140 if (i==0) // if sort name are equal, sort on full path
1141 {
1142 QCString n1 = d1->name(), n2 = d2->name();
1143 int n = qstricmp_sort(n1,n2);
1144 return n < 0;
1145 }
1146 return i < 0;
1147 });
1148
1149 // set the directory index identifier
1150 int dirIndex=0;
1151 for (const auto &dir : *Doxygen::dirLinkedMap)
1152 {
1153 dir->setDirIndex(dirIndex++);
1154 }
1155
1157}
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:884
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:1008
#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:1330
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 1198 of file dirdef.cpp.

1199{
1200 return qstricmp_sort(item1->shortName(),item2->shortName()) < 0;
1201}
virtual const QCString shortName() const =0

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

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

◆ computeCommonDirPrefix()

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 1008 of file dirdef.cpp.

1009{
1010 AUTO_TRACE();
1011 QCString path;
1012 auto it = Doxygen::dirLinkedMap->begin();
1013 if (!Doxygen::dirLinkedMap->empty()) // we have at least one dir
1014 {
1015 // start will full path of first dir
1016 path=removeLongPathMarker((*it)->name());
1017 int i=path.findRev('/',static_cast<int>(path.length())-2);
1018 path=path.left(i+1);
1019 bool done=FALSE;
1020 if (i==-1)
1021 {
1022 path="";
1023 }
1024 else
1025 {
1026 while (!done)
1027 {
1028 int l = static_cast<int>(path.length());
1029 size_t count=0;
1030 for (const auto &dir : *Doxygen::dirLinkedMap)
1031 {
1032 QCString dirName = removeLongPathMarker(dir->name());
1033 //printf("dirName='%s' (l=%d) path='%s' (l=%d)\n",qPrint(dirName),dirName.length(),qPrint(path),path.length());
1034 if (dirName.length()>path.length())
1035 {
1036 if (dirName.left(l)!=path) // dirName does not start with path
1037 {
1038 i = l>=2 ? path.findRev('/',l-2) : -1;
1039 if (i==-1) // no unique prefix -> stop
1040 {
1041 path="";
1042 done=TRUE;
1043 }
1044 else // restart with shorter path
1045 {
1046 path=path.left(i+1);
1047 break;
1048 }
1049 }
1050 }
1051 else // dir is shorter than path -> take path of dir as new start
1052 {
1053 path=dir->name();
1054 l=static_cast<int>(path.length());
1055 i=path.findRev('/',l-2);
1056 if (i==-1) // no unique prefix -> stop
1057 {
1058 path="";
1059 done=TRUE;
1060 }
1061 else // restart with shorter path
1062 {
1063 path=path.left(i+1);
1064 }
1065 break;
1066 }
1067 count++;
1068 }
1069 if (count==Doxygen::dirLinkedMap->size())
1070 // path matches for all directories -> found the common prefix
1071 {
1072 done=TRUE;
1073 }
1074 }
1075 }
1076 }
1077 for (const auto &dir : *Doxygen::dirLinkedMap)
1078 {
1079 QCString diskName = dir->name().right(dir->name().length()-path.length());
1080 dir->setDiskName(diskName);
1081 AUTO_TRACE_ADD("set disk name: {} -> {}",dir->name(),diskName);
1082 }
1083}
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:299

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 1159 of file dirdef.cpp.

1160{
1161 AUTO_TRACE();
1162 // compute nesting level for each directory
1163 for (const auto &dir : *Doxygen::dirLinkedMap)
1164 {
1165 dir->setLevel();
1166 }
1167
1168 // compute uses dependencies between directories
1169 for (const auto &dir : *Doxygen::dirLinkedMap)
1170 {
1171 AUTO_TRACE_ADD("computeDependencies for {}: #dirs={}",dir->name(),Doxygen::dirLinkedMap->size());
1172 dir->computeDependencies();
1173 }
1174}

References AUTO_TRACE, AUTO_TRACE_ADD, and Doxygen::dirLinkedMap.

Referenced by parseInput().

◆ createDirDef()

DirDef * createDirDef ( const QCString & path)

Definition at line 109 of file dirdef.cpp.

110{
111 return new DirDefImpl(path);
112}

Referenced by DirDefImpl::createNewDir().

◆ encodeDirName()

QCString encodeDirName ( const QCString & anchor)
static

Definition at line 190 of file dirdef.cpp.

191{
192 AUTO_TRACE();
193 // convert to md5 hash
194 uint8_t md5_sig[16];
195 char sigStr[33];
196 MD5Buffer(anchor.data(),static_cast<unsigned int>(anchor.length()),md5_sig);
197 MD5SigToString(md5_sig,sigStr);
198 AUTO_TRACE_EXIT("result={}",sigStr);
199 return sigStr;
200
201 // old algorithm
202// QCString result;
203
204// int l = anchor.length(),i;
205// for (i=0;i<l;i++)
206// {
207// char c = anchor.at(i);
208// if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
209// {
210// result+=c;
211// }
212// else
213// {
214// static char hexStr[]="0123456789ABCDEF";
215// char escChar[]={ '_', 0, 0, 0 };
216// escChar[1]=hexStr[c>>4];
217// escChar[2]=hexStr[c&0xf];
218// result+=escChar;
219// }
220// }
221// return result;
222}
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 1176 of file dirdef.cpp.

1177{
1178 AUTO_TRACE();
1179 for (const auto &dir : *Doxygen::dirLinkedMap)
1180 {
1181 ol.pushGeneratorState();
1182 if (!dir->hasDocumentation())
1183 {
1185 }
1186 dir->writeDocumentation(ol);
1187 ol.popGeneratorState();
1188 }
1189 //if (Config_getBool(DIRECTORY_GRAPH))
1190 {
1191 for (const auto &dr : Doxygen::dirRelations)
1192 {
1193 dr->writeDocumentation(ol);
1194 }
1195 }
1196}
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 1218 of file dirdef.cpp.

1219{
1220 if (d==nullptr) return nullptr;
1221 if (d && typeid(*d)==typeid(DirDefImpl))
1222 {
1223 return static_cast<const DirDef*>(d);
1224 }
1225 else
1226 {
1227 return nullptr;
1228 }
1229}

◆ toDirDef() [2/2]

DirDef * toDirDef ( Definition * d)

Definition at line 1205 of file dirdef.cpp.

1206{
1207 if (d==nullptr) return nullptr;
1208 if (d && typeid(*d)==typeid(DirDefImpl))
1209 {
1210 return static_cast<DirDef*>(d);
1211 }
1212 else
1213 {
1214 return nullptr;
1215 }
1216}

◆ writePartialDirPath()

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

Definition at line 920 of file dirdef.cpp.

921{
922 if (target->parent()!=root)
923 {
924 writePartialDirPath(ol,root,target->parent());
925 ol.writeString("&#160;/&#160;");
926 }
927 ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),QCString(),target->shortName());
928}
virtual QCString getReference() const =0
virtual QCString getOutputFileBase() const =0
virtual DirDef * parent() const =0
void writeString(const QCString &text)
Definition outputlist.h:413
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:441
static void writePartialDirPath(OutputList &ol, const DirDef *root, const DirDef *target)
Definition dirdef.cpp:920

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

Referenced by writePartialDirPath(), and writePartialFilePath().

◆ writePartialFilePath()

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

Definition at line 930 of file dirdef.cpp.

931{
932 if (fd->getDirDef() && fd->getDirDef()!=root)
933 {
934 writePartialDirPath(ol,root,fd->getDirDef());
935 ol.writeString("&#160;/&#160;");
936 }
937 if (fd->isLinkable())
938 {
940 }
941 else
942 {
943 ol.startBold();
944 ol.docify(fd->name());
945 ol.endBold();
946 }
947}
virtual bool isLinkable() const =0
virtual DirDef * getDirDef() const =0
void docify(const QCString &s)
Definition outputlist.h:439
void startBold()
Definition outputlist.h:563
void endBold()
Definition outputlist.h:565

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().