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

1103{
1104 AUTO_TRACE();
1105 // for each input file
1106 for (const auto &fn : *Doxygen::inputNameLinkedMap)
1107 {
1108 for (const auto &fd : *fn)
1109 {
1110 if (fd->getReference().isEmpty())
1111 {
1112 DirDef *dir=Doxygen::dirLinkedMap->find(fd->getPath());
1113 if (dir==nullptr) // new directory
1114 {
1115 dir = DirDefImpl::mergeDirectoryInTree(fd->getPath());
1116 }
1117 if (dir && !fd->isDocumentationFile()) dir->addFile(fd.get());
1118 }
1119 else
1120 {
1121 // do something for file imported via tag files.
1122 }
1123 }
1124 }
1125
1126 // compute relations between directories => introduce container dirs.
1127 for (const auto &dir : *Doxygen::dirLinkedMap)
1128 {
1129 QCString name = dir->name();
1130 int i=name.findRev('/',static_cast<int>(name.length())-2);
1131 if (i>0)
1132 {
1133 DirDef *parent = Doxygen::dirLinkedMap->find(name.left(i+1));
1134 //if (parent==0) parent=root;
1135 if (parent)
1136 {
1137 parent->addSubDir(dir.get());
1138 AUTO_TRACE_ADD("DirDefImpl::addSubdir(): Adding subdir {} to {}",
1139 dir->displayName(), parent->displayName());
1140 }
1141 }
1142 }
1143
1144 // sort the directory contents
1145 for (const auto &dir : *Doxygen::dirLinkedMap)
1146 {
1147 dir->sort();
1148 }
1149
1150 // short the directories themselves
1151 std::stable_sort(Doxygen::dirLinkedMap->begin(),
1153 [](const auto &d1,const auto &d2)
1154 {
1155 QCString s1 = d1->shortName(), s2 = d2->shortName();
1156 int i = qstricmp_sort(s1,s2);
1157 if (i==0) // if sort name are equal, sort on full path
1158 {
1159 QCString n1 = d1->name(), n2 = d2->name();
1160 int n = qstricmp_sort(n1,n2);
1161 return n < 0;
1162 }
1163 return i < 0;
1164 });
1165
1166 // set the directory index identifier
1167 int dirIndex=0;
1168 for (const auto &dir : *Doxygen::dirLinkedMap)
1169 {
1170 dir->setDirIndex(dirIndex++);
1171 }
1172
1174}
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:901
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:166
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
QCString left(size_t len) const
Definition qcstring.h:229
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:1025
#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 1215 of file dirdef.cpp.

1216{
1217 return qstricmp_sort(item1->shortName(),item2->shortName()) < 0;
1218}
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 1025 of file dirdef.cpp.

1026{
1027 AUTO_TRACE();
1028 QCString path;
1029 auto it = Doxygen::dirLinkedMap->begin();
1030 if (!Doxygen::dirLinkedMap->empty()) // we have at least one dir
1031 {
1032 // start will full path of first dir
1033 path=removeLongPathMarker((*it)->name());
1034 int i=path.findRev('/',static_cast<int>(path.length())-2);
1035 path=path.left(i+1);
1036 bool done=FALSE;
1037 if (i==-1)
1038 {
1039 path="";
1040 }
1041 else
1042 {
1043 while (!done)
1044 {
1045 int l = static_cast<int>(path.length());
1046 size_t count=0;
1047 for (const auto &dir : *Doxygen::dirLinkedMap)
1048 {
1049 QCString dirName = removeLongPathMarker(dir->name());
1050 //printf("dirName='%s' (l=%d) path='%s' (l=%d)\n",qPrint(dirName),dirName.length(),qPrint(path),path.length());
1051 if (dirName.length()>path.length())
1052 {
1053 if (dirName.left(l)!=path) // dirName does not start with path
1054 {
1055 i = l>=2 ? path.findRev('/',l-2) : -1;
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 break;
1065 }
1066 }
1067 }
1068 else // dir is shorter than path -> take path of dir as new start
1069 {
1070 path=dir->name();
1071 l=static_cast<int>(path.length());
1072 i=path.findRev('/',l-2);
1073 if (i==-1) // no unique prefix -> stop
1074 {
1075 path="";
1076 done=TRUE;
1077 }
1078 else // restart with shorter path
1079 {
1080 path=path.left(i+1);
1081 }
1082 break;
1083 }
1084 count++;
1085 }
1086 if (count==Doxygen::dirLinkedMap->size())
1087 // path matches for all directories -> found the common prefix
1088 {
1089 done=TRUE;
1090 }
1091 }
1092 }
1093 }
1094 for (const auto &dir : *Doxygen::dirLinkedMap)
1095 {
1096 QCString diskName = dir->name().right(dir->name().length()-path.length());
1097 dir->setDiskName(diskName);
1098 AUTO_TRACE_ADD("set disk name: {} -> {}",dir->name(),diskName);
1099 }
1100}
QCString right(size_t len) const
Definition qcstring.h:234
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
QCString removeLongPathMarker(QCString path)
Definition util.cpp:296

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

1177{
1178 AUTO_TRACE();
1179 // compute nesting level for each directory
1180 for (const auto &dir : *Doxygen::dirLinkedMap)
1181 {
1182 dir->setLevel();
1183 }
1184
1185 // compute uses dependencies between directories
1186 for (const auto &dir : *Doxygen::dirLinkedMap)
1187 {
1188 AUTO_TRACE_ADD("computeDependencies for {}: #dirs={}",dir->name(),Doxygen::dirLinkedMap->size());
1189 dir->computeDependencies();
1190 }
1191}

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:172
#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 1193 of file dirdef.cpp.

1194{
1195 AUTO_TRACE();
1196 for (const auto &dir : *Doxygen::dirLinkedMap)
1197 {
1198 ol.pushGeneratorState();
1199 if (!dir->hasDocumentation())
1200 {
1202 }
1203 dir->writeDocumentation(ol);
1204 ol.popGeneratorState();
1205 }
1206 //if (Config_getBool(DIRECTORY_GRAPH))
1207 {
1208 for (const auto &dr : Doxygen::dirRelations)
1209 {
1210 dr->writeDocumentation(ol);
1211 }
1212 }
1213}
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 1235 of file dirdef.cpp.

1236{
1237 if (d==nullptr) return nullptr;
1238 if (d && typeid(*d)==typeid(DirDefImpl))
1239 {
1240 return static_cast<const DirDef*>(d);
1241 }
1242 else
1243 {
1244 return nullptr;
1245 }
1246}

◆ toDirDef() [2/2]

DirDef * toDirDef ( Definition * d)

Definition at line 1222 of file dirdef.cpp.

1223{
1224 if (d==nullptr) return nullptr;
1225 if (d && typeid(*d)==typeid(DirDefImpl))
1226 {
1227 return static_cast<DirDef*>(d);
1228 }
1229 else
1230 {
1231 return nullptr;
1232 }
1233}

◆ writePartialDirPath()

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

Definition at line 937 of file dirdef.cpp.

938{
939 if (target->parent()!=root)
940 {
941 writePartialDirPath(ol,root,target->parent());
942 ol.writeString("&#160;/&#160;");
943 }
944 ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),QCString(),target->shortName());
945}
virtual QCString getReference() const =0
virtual QCString getOutputFileBase() const =0
virtual DirDef * parent() const =0
void writeString(const QCString &text)
Definition outputlist.h:411
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:439
static void writePartialDirPath(OutputList &ol, const DirDef *root, const DirDef *target)
Definition dirdef.cpp:937

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

948{
949 if (fd->getDirDef() && fd->getDirDef()!=root)
950 {
951 writePartialDirPath(ol,root,fd->getDirDef());
952 ol.writeString("&#160;/&#160;");
953 }
954 if (fd->isLinkable())
955 {
957 }
958 else
959 {
960 ol.startBold();
961 ol.docify(fd->name());
962 ol.endBold();
963 }
964}
virtual bool isLinkable() const =0
virtual DirDef * getDirDef() const =0
void docify(const QCString &s)
Definition outputlist.h:437
void startBold()
Definition outputlist.h:561
void endBold()
Definition outputlist.h:563

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