Doxygen
Loading...
Searching...
No Matches
dirdef.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2020 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#include <algorithm>
17
18#include "dirdef.h"
19#include "md5.h"
20#include "filename.h"
21#include "doxygen.h"
22#include "util.h"
23#include "outputlist.h"
24#include "language.h"
25#include "message.h"
26#include "dot.h"
27#include "dotdirdeps.h"
28#include "layout.h"
29#include "config.h"
30#include "docparser.h"
31#include "definitionimpl.h"
32#include "filedef.h"
33#include "trace.h"
34
35//----------------------------------------------------------------------
36
37class DirDefImpl : public DefinitionMixin<DirDef>
38{
39 public:
40 DirDefImpl(const QCString &path);
41 ~DirDefImpl() override;
43
44 DefType definitionType() const override { return TypeDir; }
46 QCString getOutputFileBase() const override;
47 QCString anchor() const override { return QCString(); }
48 bool isLinkableInProject() const override;
49 bool isLinkable() const override;
50 QCString displayName(bool=TRUE) const override { return m_dispName; }
51 const QCString shortName() const override { return m_shortName; }
52 void addSubDir(DirDef *subdir) override;
53 const FileList &getFiles() const override { return m_fileList; }
54 void addFile(FileDef *fd) override;
55 const DirList &subDirs() const override { return m_subdirs; }
56 bool hasSubdirs() const override { return !m_subdirs.empty(); }
57 int level() const override { return m_level; }
58 DirDef *parent() const override { return m_parent; }
59 int dirIndex() const override { return m_dirIndex; }
60 const UsedDirLinkedMap &usedDirs() const override { return m_usedDirs; }
61 bool isParentOf(const DirDef *dir) const override;
62 bool depGraphIsTrivial() const override;
63 QCString shortTitle() const override;
64 bool hasDetailedDescription() const override;
65 void writeDocumentation(OutputList &ol) override;
66 void writePageNavigation(OutputList &ol) const override;
67 void writeTagFile(TextStream &t) override;
68 void setDiskName(const QCString &name) override { m_diskName = name; }
69 void sort() override;
70 void setParent(DirDef *parent) override;
71 void setDirIndex(int index) override;
72 void setLevel() override;
73 void addUsesDependency(const DirDef *usedDir,const FileDef *srcFd,
74 const FileDef *dstFd,bool srcDirect, bool dstDirect) override;
75 void computeDependencies() override;
76 void findSectionsInDocumentation() override;
77 void addListReferences() override;
78 void addRequirementReferences() override;
79
80 bool hasDirectoryGraph() const override;
81 void overrideDirectoryGraph(bool e) override;
82
83 public:
84 static DirDef *mergeDirectoryInTree(const QCString &path);
85
86 private:
87
88 void writeDetailedDescription(OutputList &ol,const QCString &title);
92 void writeFileList(OutputList &ol);
95
96 static DirDef *createNewDir(const QCString &path);
97 static bool matchPath(const QCString &path,const StringVector &l);
98
103 FileList m_fileList; // list of files in the group
104 int m_dirIndex = -1;
109};
110
112{
113 return new DirDefImpl(path);
114}
115
116
117//----------------------------------------------------------------------
118// method implementation
119
121{
122 bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
123 // get display name (stripping the paths mentioned in STRIP_FROM_PATH)
124 // get short name (last part of path)
125 m_shortName = path;
126 m_diskName = path;
127 if (m_shortName.at(m_shortName.length()-1)=='/')
128 { // strip trailing /
129 m_shortName = m_shortName.left(m_shortName.length()-1);
130 }
131 int pi=m_shortName.findRev('/');
132 if (pi!=-1)
133 { // remove everything till the last /
134 m_shortName = m_shortName.mid(pi+1);
135 }
137 m_dispName = fullPathNames ? stripFromPath(path) : m_shortName;
138 if (m_dispName.length()>0 && m_dispName.at(m_dispName.length()-1)=='/')
139 { // strip trailing /
140 m_dispName = m_dispName.left(m_dispName.length()-1);
141 }
142
143 m_level=-1;
144 m_parent=nullptr;
145 m_hasDirectoryGraph=Config_getBool(DIRECTORY_GRAPH);
146
147}
148
152
154{
155 return !isReference() && hasDocumentation();
156}
157
159{
160 return isReference() || isLinkableInProject();
161}
162
164{
165 m_subdirs.push_back(subdir);
166 subdir->setOuterScope(this);
167 subdir->setParent(this);
168}
169
171{
172 m_parent=p;
173}
174
176{
177 m_dirIndex=index;
178}
179
181{
182 m_fileList.push_back(fd);
183 fd->setDirDef(this);
184}
185
187{
188 std::stable_sort(m_subdirs.begin(), m_subdirs.end(), compareDirDefs);
189 std::stable_sort(m_fileList.begin(), m_fileList.end(), compareFileDefs);
190}
191
192static QCString encodeDirName(const QCString &anchor)
193{
194 AUTO_TRACE();
195 // convert to md5 hash
196 uint8_t md5_sig[16];
197 char sigStr[33];
198 MD5Buffer(anchor.data(),static_cast<unsigned int>(anchor.length()),md5_sig);
199 MD5SigToString(md5_sig,sigStr);
200 AUTO_TRACE_EXIT("result={}",sigStr);
201 return sigStr;
202
203 // old algorithm
204// QCString result;
205
206// int l = anchor.length(),i;
207// for (i=0;i<l;i++)
208// {
209// char c = anchor.at(i);
210// if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
211// {
212// result+=c;
213// }
214// else
215// {
216// static char hexStr[]="0123456789ABCDEF";
217// char escChar[]={ '_', 0, 0, 0 };
218// escChar[1]=hexStr[c>>4];
219// escChar[2]=hexStr[c&0xf];
220// result+=escChar;
221// }
222// }
223// return result;
224}
225
227{
228 QCString dir = "dir_"+encodeDirName(m_diskName);
229 AUTO_TRACE("diskName={} result={}",m_diskName,dir);
230 return dir;
231}
232
234{
235 AUTO_TRACE();
237 {
240 ol.writeRuler();
244 ol.writeAnchor(QCString(),"details");
246 ol.startGroupHeader("details");
247 ol.parseText(title);
248 ol.endGroupHeader();
249
250 // repeat brief description
251 ol.startTextBlock();
252 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
253 {
255 briefLine(),
256 this,
257 nullptr,
259 DocOptions());
260 }
261 // separator between brief and details
262 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
263 !documentation().isEmpty())
264 {
268 ol.enableAll();
271 ol.writeString("\n\n");
273 }
274
275 // write documentation
276 if (!documentation().isEmpty())
277 {
278 ol.generateDoc(docFile(),
279 docLine(),
280 this,
281 nullptr,
282 documentation()+"\n",
283 DocOptions()
284 .setIndexWords(true));
285 }
287 ol.endTextBlock();
288 }
289}
290
292{
293 AUTO_TRACE();
295 {
296 auto parser { createDocParser() };
297 auto ast { validatingParseDoc(*parser.get(),
298 briefFile(),
299 briefLine(),
300 this,
301 nullptr,
303 DocOptions()
304 .setIndexWords(true))
305 };
306 if (!ast->isEmpty())
307 {
308 ol.startParagraph();
311 ol.writeString(" - ");
313 ol.writeDoc(ast.get(),this,nullptr);
316 ol.writeString(" \n");
318
319 if (Config_getBool(REPEAT_BRIEF) ||
320 !documentation().isEmpty()
321 )
322 {
324 ol.startTextLink(QCString(),"details");
325 ol.parseText(theTranslator->trMore());
326 ol.endTextLink();
327 }
329
330 ol.endParagraph();
331 }
332 }
333 ol.writeSynopsis();
334}
335
340
342{
343 // write graph dependency graph
344 if (Config_getBool(HAVE_DOT) && m_hasDirectoryGraph /*&& Config_getBool(DIRECTORY_GRAPH)*/)
345 {
346 DotDirDeps dirDep(this);
347 if (!dirDep.isTrivial())
348 {
349 msg("Generating dependency graph for directory {}\n",displayName());
351 //ol.startParagraph();
352 ol.startDirDepGraph();
353 ol.parseText(theTranslator->trDirDepGraph(shortName()));
354 ol.endDirDepGraph(dirDep);
355 //ol.endParagraph();
356 ol.enableAll();
357 }
358 }
359}
360
362{
363 AUTO_TRACE();
364 int numSubdirs = 0;
365 for(const auto dd : m_subdirs)
366 {
367 if (dd->hasDocumentation() || !dd->getFiles().empty())
368 {
369 numSubdirs++;
370 }
371 }
372
373 AUTO_TRACE_ADD("numSubdirs={}",numSubdirs);
374 // write subdir list
375 if (numSubdirs>0)
376 {
377 ol.startMemberHeader("subdirs");
378 ol.parseText(theTranslator->trDir(TRUE,FALSE));
379 ol.endMemberHeader();
380 ol.startMemberList();
381 for(const auto dd : m_subdirs)
382 {
383 if (dd->hasDocumentation() || !dd->getFiles().empty())
384 {
386 QCString anc=dd->anchor();
387 if (anc.isEmpty()) anc=dd->shortName(); else anc.prepend(dd->shortName()+"_");
389 {
392 ol.writeString("<span class=\"iconfolder\"><div class=\"folder-icon\"></div></span>");
393 ol.enableAll();
395 ol.parseText(theTranslator->trDir(FALSE,TRUE)+" ");
397 }
399 ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),QCString(),dd->shortName());
401 if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
402 {
403 ol.startMemberDescription(dd->getOutputFileBase());
405 briefLine(),
406 dd,
407 nullptr,
408 dd->briefDescription(),
409 DocOptions()
410 .setSingleLine(true)
411 .setLinkFromIndex(true));
413 }
414 ol.endMemberDeclaration(dd->anchor(),QCString());
415 }
416 }
417
418 ol.endMemberList();
419 }
420}
421
423{
424 AUTO_TRACE();
425 int numFiles = 0;
426 for (const auto &fd : m_fileList)
427 {
428 bool genSourceFile=false;
429 if (fileVisibleInIndex(fd,genSourceFile))
430 {
431 numFiles++;
432 }
433 else if (genSourceFile)
434 {
435 numFiles++;
436 }
437 }
438
439 AUTO_TRACE_ADD("numFiles={}",numFiles);
440 // write file list
441 if (numFiles>0)
442 {
443 ol.startMemberHeader("files");
444 ol.parseText(theTranslator->trFile(TRUE,FALSE));
445 ol.endMemberHeader();
446 ol.startMemberList();
447 for (const auto &fd : m_fileList)
448 {
449 bool src = false;
450 bool doc = fileVisibleInIndex(fd,src);
451 if (doc || src)
452 {
454 QCString anc = fd->anchor();
455 if (anc.isEmpty()) anc=fd->displayName(); else anc.prepend(fd->displayName()+"_");
457 {
460 bool genSrc = fd->generateSourceFile();
461 if (genSrc)
462 {
463 ol.startTextLink(fd->includeName(),QCString());
464 }
465 ol.writeString("<span class=\"icondoc\"><div class=\"doc-icon\"></div></span>");
466 if (genSrc)
467 {
468 ol.endTextLink();
469 }
470 ol.enableAll();
472 ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
474 }
476 if (fd->isLinkable())
477 {
478 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),QCString(),fd->displayName());
479 }
480 else
481 {
482 ol.startBold();
483 ol.docify(fd->displayName());
484 ol.endBold();
485 }
487 if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
488 {
489 ol.startMemberDescription(fd->getOutputFileBase());
491 briefLine(),
492 fd,
493 nullptr,
494 fd->briefDescription(),
495 DocOptions()
496 .setSingleLine(true)
497 .setLinkFromIndex(true));
499 }
500 ol.endMemberDeclaration(fd->anchor(),QCString());
501 }
502 }
503 ol.endMemberList();
504 }
505}
506
511
516
518{
519 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
520 {
521 return m_shortName;
522 }
523 else
524 {
525 return theTranslator->trDirReference(m_shortName);
526 }
527}
528
530{
531 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
532 return (!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty() || hasRequirementRefs();
533}
534
536{
537 tagFile << " <compound kind=\"dir\">\n";
538 tagFile << " <name>" << convertToXML(displayName()) << "</name>\n";
539 tagFile << " <path>" << convertToXML(stripFromPath(name())) << "</path>\n";
542 tagFile << " <filename>" << fn << "</filename>\n";
543 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Directory))
544 {
545 switch (lde->kind())
546 {
547 case LayoutDocEntry::DirSubDirs:
548 {
549 if (m_subdirs.size()>0)
550 {
551 for(const auto dd : m_subdirs)
552 {
553 tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>\n";
554 }
555 }
556 }
557 break;
558 case LayoutDocEntry::DirFiles:
559 {
560 for (const auto &fd : m_fileList)
561 {
562 tagFile << " <file>" << convertToXML(fd->name()) << "</file>\n";
563 }
564 }
565 break;
566 default:
567 break;
568 }
569 }
571 tagFile << " </compound>\n";
572}
573
575{
576 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
578
579 QCString title;
580 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
581 {
582 title=m_dispName;
583 }
584 else
585 {
586 title=theTranslator->trDirReference(m_dispName);
587 }
588 AUTO_TRACE("title={}",title);
589 startFile(ol,getOutputFileBase(),false,name(),title,HighlightedItem::Files,!generateTreeView);
590
591 if (!generateTreeView)
592 {
593 // write navigation path
595 ol.endQuickIndices();
596 }
597
601 ol.parseText(shortTitle());
602 ol.enableAll();
604 ol.parseText(title);
606 endTitle(ol,getOutputFileBase(),title);
607 ol.startContents();
608
609 //---------------------------------------- start flexible part -------------------------------
610
611 SrcLangExt lang = getLanguage();
612 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Directory))
613 {
614 switch (lde->kind())
615 {
616 case LayoutDocEntry::BriefDesc:
618 break;
619 case LayoutDocEntry::DirGraph:
621 break;
622 case LayoutDocEntry::MemberDeclStart:
624 break;
625 case LayoutDocEntry::DirSubDirs:
626 writeSubDirList(ol);
627 break;
628 case LayoutDocEntry::DirFiles:
629 writeFileList(ol);
630 break;
631 case LayoutDocEntry::MemberDeclEnd:
633 break;
634 case LayoutDocEntry::DetailedDesc:
635 {
636 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
637 if (ls)
638 {
639 writeDetailedDescription(ol,ls->title(lang));
640 }
641 }
642 break;
643 case LayoutDocEntry::ClassIncludes:
644 case LayoutDocEntry::ClassInlineClasses:
645 case LayoutDocEntry::ClassInheritanceGraph:
646 case LayoutDocEntry::ClassNestedClasses:
647 case LayoutDocEntry::ClassCollaborationGraph:
648 case LayoutDocEntry::ClassAllMembersLink:
649 case LayoutDocEntry::ClassUsedFiles:
650 case LayoutDocEntry::NamespaceNestedNamespaces:
651 case LayoutDocEntry::NamespaceNestedConstantGroups:
652 case LayoutDocEntry::NamespaceClasses:
653 case LayoutDocEntry::NamespaceConcepts:
654 case LayoutDocEntry::NamespaceInterfaces:
655 case LayoutDocEntry::NamespaceStructs:
656 case LayoutDocEntry::NamespaceExceptions:
657 case LayoutDocEntry::NamespaceInlineClasses:
658 case LayoutDocEntry::ConceptDefinition:
659 case LayoutDocEntry::FileClasses:
660 case LayoutDocEntry::FileConcepts:
661 case LayoutDocEntry::FileInterfaces:
662 case LayoutDocEntry::FileStructs:
663 case LayoutDocEntry::FileExceptions:
664 case LayoutDocEntry::FileNamespaces:
665 case LayoutDocEntry::FileConstantGroups:
666 case LayoutDocEntry::FileIncludes:
667 case LayoutDocEntry::FileIncludeGraph:
668 case LayoutDocEntry::FileIncludedByGraph:
669 case LayoutDocEntry::FileSourceLink:
670 case LayoutDocEntry::FileInlineClasses:
671 case LayoutDocEntry::GroupClasses:
672 case LayoutDocEntry::GroupConcepts:
673 case LayoutDocEntry::GroupModules:
674 case LayoutDocEntry::GroupInlineClasses:
675 case LayoutDocEntry::GroupNamespaces:
676 case LayoutDocEntry::GroupDirs:
677 case LayoutDocEntry::GroupNestedGroups:
678 case LayoutDocEntry::GroupFiles:
679 case LayoutDocEntry::GroupGraph:
680 case LayoutDocEntry::GroupPageDocs:
681 case LayoutDocEntry::ModuleExports:
682 case LayoutDocEntry::ModuleClasses:
683 case LayoutDocEntry::ModuleConcepts:
684 case LayoutDocEntry::ModuleUsedFiles:
685 case LayoutDocEntry::AuthorSection:
686 case LayoutDocEntry::MemberGroups:
687 case LayoutDocEntry::MemberDecl:
688 case LayoutDocEntry::MemberDef:
689 case LayoutDocEntry::MemberDefStart:
690 case LayoutDocEntry::MemberDefEnd:
691 err("Internal inconsistency: member '{}' should not be part of "
692 "LayoutDocManager::Directory entry list\n",qPrint(lde->entryToString()));
693 break;
694 }
695 }
696
697 //---------------------------------------- end flexible part -------------------------------
698
699 ol.endContents();
700
701 endFileWithNavPath(ol,this);
702
704}
705
707{
708 if (m_level==-1) // level not set before
709 {
710 DirDef *p = parent();
711 if (p)
712 {
713 p->setLevel();
714 m_level = p->level()+1;
715 }
716 else
717 {
718 m_level = 0;
719 }
720 }
721}
722
723/** Add as "uses" dependency between \a this dir and \a dir,
724 * that was caused by a dependency on file \a fd.
725 * srcDirect and dstDirect indicate if it is a direct dependencies (true) or if
726 * the dependencies was indirect (e.g. a parent dir that has a child dir that has the dependencies)
727 */
728void DirDefImpl::addUsesDependency(const DirDef *dir,const FileDef *srcFd,
729 const FileDef *dstFd,bool srcDirect, bool dstDirect)
730{
731 if (this==dir) return; // do not add self-dependencies
732 AUTO_TRACE("add dependency {}->{} due to {}->{}",
733 qPrint(shortName()),
734 qPrint(dir->shortName()),
735 qPrint(srcFd->name()),
736 qPrint(dstFd->name()));
737
738 // levels match => add direct dependency
739 bool added=FALSE;
740 UsedDir *usedDir = m_usedDirs.find(dir->getOutputFileBase());
741 if (usedDir) // dir dependency already present
742 {
743 const FilePair *usedPair = usedDir->findFilePair(FilePair::key(srcFd,dstFd));
744 if (usedPair==nullptr) // new file dependency
745 {
746 AUTO_TRACE_ADD("{} => {} new file dependency",srcFd->name(),dstFd->name());
747 usedDir->addFileDep(srcFd,dstFd, srcDirect, dstDirect);
748 added=TRUE;
749 }
750 else
751 {
752 // dir & file dependency already added
753 }
754 }
755 else // new directory dependency
756 {
757 AUTO_TRACE_ADD("{} => {} new file dependency",srcFd->name(),dstFd->name());
758 auto newUsedDir = std::make_unique<UsedDir>(dir);
759 newUsedDir->addFileDep(srcFd,dstFd, srcDirect, dstDirect);
760 m_usedDirs.add(dir->getOutputFileBase(),std::move(newUsedDir));
761 added=TRUE;
762 }
763 if (added)
764 {
765 if (dir->parent())
766 {
767 // add relation to parent of used dir
769 srcFd,
770 dstFd,
771 srcDirect,
772 false); // indirect dependency on dest dir
773 }
774 if (parent())
775 {
776 // add relation for the parent of this dir as well
778 srcFd,
779 dstFd,
780 false, // indirect dependency from source dir
781 dstDirect);
782 }
783 }
784}
785
791
799
804
805/** Computes the dependencies between directories
806 */
808{
809 AUTO_TRACE();
810 for (const auto &fd : m_fileList)
811 {
812 AUTO_TRACE_ADD("dir={} file={}",shortName(),fd->name());
813 for (const auto &ii : fd->includeFileList())
814 {
815 AUTO_TRACE_ADD("#include {}",ii.includeName);
816 if (ii.fileDef && ii.fileDef->isLinkable()) // linkable file
817 {
818 DirDef *usedDir = ii.fileDef->getDirDef();
819 if (usedDir)
820 {
821 // add dependency: thisDir->usedDir
822 AUTO_TRACE_ADD("add dependency {}->{}",name(),usedDir->name());
823 addUsesDependency(usedDir,fd,ii.fileDef,true,true);
824 }
825 }
826 }
827 }
828
829 std::stable_sort(m_usedDirs.begin(),m_usedDirs.end(),
830 [](const auto &u1,const auto &u2)
831 { return qstricmp_sort(u1->dir()->getOutputFileBase(),u2->dir()->getOutputFileBase())<0; });
832
833 for (const auto& usedDirectory : m_usedDirs)
834 {
835 usedDirectory->sort();
836 }
837}
838
839bool DirDefImpl::isParentOf(const DirDef *dir) const
840{
841 if (dir->parent()==this) // this is a parent of dir
842 return TRUE;
843 else if (dir->parent()) // repeat for the parent of dir
844 return isParentOf(dir->parent());
845 else
846 return FALSE;
847}
848
850{
851 return m_usedDirs.empty() && m_parent==nullptr;
852}
853
854//----------------------------------------------------------------------
855
857 m_dir(dir)
858{
859}
860
861void UsedDir::addFileDep(const FileDef *srcFd,const FileDef *dstFd, bool srcDirect, bool dstDirect)
862{
863 m_filePairs.add(FilePair::key(srcFd,dstFd),std::make_unique<FilePair>(srcFd,dstFd));
864 m_hasDirectDeps = m_hasDirectDeps || (srcDirect && dstDirect);
867}
868
870{
871 std::stable_sort(m_filePairs.begin(),
872 m_filePairs.end(),
873 [](const auto &left,const auto &right)
874 {
875 int orderHi = qstricmp_sort(left->source()->name(),right->source()->name());
876 if (orderHi!=0) return orderHi<0;
877 int orderLo = qstricmp_sort(left->destination()->name(),right->destination()->name());
878 return orderLo<0;
879 });
880}
881
883{
884 return m_filePairs.find(name);
885}
886
888{
889 AUTO_TRACE();
890 ASSERT(path!=nullptr);
891 DirDef *dir = Doxygen::dirLinkedMap->find(path);
892 if (dir==nullptr) // new dir
893 {
894 dir = Doxygen::dirLinkedMap->add(path,
895 std::unique_ptr<DirDef>(
896 createDirDef(path)));
897 AUTO_TRACE_ADD("Adding new dir {} shortName {}",path,dir->shortName());
898 }
899 return dir;
900}
901
903{
904 for (const auto &s : l)
905 {
906 std::string prefix = s.substr(0,path.length());
907 if (qstricmp_sort(prefix.c_str(),path)==0) // case insensitive compare
908 {
909 return TRUE;
910 }
911 }
912 return FALSE;
913}
914
915/*! strip part of \a path if it matches
916 * one of the paths in the Config_getList(STRIP_FROM_PATH) list
917 */
919{
920 AUTO_TRACE("path={}",path);
921 int p=0,i=0;
922 DirDef *dir=nullptr;
923 while ((i=path.find('/',p))!=-1)
924 {
925 QCString part=path.left(i+1);
926 if (!matchPath(part,Config_getList(STRIP_FROM_PATH)) && (part!="/" && part!="//" && part!="//?/"))
927 {
929 }
930 p=i+1;
931 }
932 return dir;
933}
934
939
941{
942 return m_hasDirectoryGraph;
943}
944
945//----------------------------------------------------------------------
946
947QCString FilePair::key(const FileDef *srcFd,const FileDef *dstFd)
948{
949 return srcFd->getOutputFileBase()+";"+dstFd->getOutputFileBase();
950}
951
952//----------------------------------------------------------------------
953
954static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
955{
956 if (target->parent()!=root)
957 {
958 writePartialDirPath(ol,root,target->parent());
959 ol.writeString("&#160;/&#160;");
960 }
961 ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),QCString(),target->shortName());
962}
963
964static void writePartialFilePath(OutputList &ol,const DirDef *root,const FileDef *fd)
965{
966 if (fd->getDirDef() && fd->getDirDef()!=root)
967 {
968 writePartialDirPath(ol,root,fd->getDirDef());
969 ol.writeString("&#160;/&#160;");
970 }
971 if (fd->isLinkable())
972 {
974 }
975 else
976 {
977 ol.startBold();
978 ol.docify(fd->name());
979 ol.endBold();
980 }
981}
982
984{
985 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
988
989 QCString shortTitle=theTranslator->trDirRelation(
990 (m_src->shortName()+" &rarr; "+m_dst->dir()->shortName()));
991 QCString title=theTranslator->trDirRelation(
992 (m_src->displayName()+" -> "+m_dst->dir()->shortName()));
993 AUTO_TRACE("title={}",title);
995 title,HighlightedItem::None,!generateTreeView,m_src->getOutputFileBase());
996
997 if (!generateTreeView)
998 {
999 // write navigation path
1000 m_src->writeNavigationPath(ol);
1001 ol.endQuickIndices();
1002 }
1003 ol.startContents();
1004
1005 ol.writeString("<h3>"+shortTitle+"</h3>");
1006 ol.writeString("<table class=\"dirtab\">");
1007 ol.writeString("<tr class=\"dirtab\">");
1008 ol.writeString("<th class=\"dirtab\">");
1009 ol.parseText(theTranslator->trFileIn(m_src->pathFragment()));
1010 ol.writeString("</th>");
1011 ol.writeString("<th class=\"dirtab\">");
1012 ol.parseText(theTranslator->trIncludesFileIn(m_dst->dir()->pathFragment()));
1013 ol.writeString("</th>");
1014 ol.writeString("</tr>");
1015
1016 for (const auto &fp : m_dst->filePairs())
1017 {
1018 ol.writeString("<tr class=\"dirtab\">");
1019 ol.writeString("<td class=\"dirtab\">");
1020 writePartialFilePath(ol,m_src,fp->source());
1021 ol.writeString("</td>");
1022 ol.writeString("<td class=\"dirtab\">");
1023 writePartialFilePath(ol,m_dst->dir(),fp->destination());
1024 ol.writeString("</td>");
1025 ol.writeString("</tr>");
1026 }
1027 ol.writeString("</table>");
1028
1029 ol.endContents();
1030
1032
1033 ol.popGeneratorState();
1034}
1035
1036//----------------------------------------------------------------------
1037// external functions
1038
1039/** In order to create stable, but unique directory names,
1040 * we compute the common part of the path shared by all directories.
1041 */
1043{
1044 AUTO_TRACE();
1045 QCString path;
1046 auto it = Doxygen::dirLinkedMap->begin();
1047 if (!Doxygen::dirLinkedMap->empty()) // we have at least one dir
1048 {
1049 // start will full path of first dir
1050 path=removeLongPathMarker((*it)->name());
1051 int i=path.findRev('/',static_cast<int>(path.length())-2);
1052 path=path.left(i+1);
1053 bool done=FALSE;
1054 if (i==-1)
1055 {
1056 path="";
1057 }
1058 else
1059 {
1060 while (!done)
1061 {
1062 int l = static_cast<int>(path.length());
1063 size_t count=0;
1064 for (const auto &dir : *Doxygen::dirLinkedMap)
1065 {
1066 QCString dirName = removeLongPathMarker(dir->name());
1067 //printf("dirName='%s' (l=%d) path='%s' (l=%d)\n",qPrint(dirName),dirName.length(),qPrint(path),path.length());
1068 if (dirName.length()>path.length())
1069 {
1070 if (dirName.left(l)!=path) // dirName does not start with path
1071 {
1072 i = l>=2 ? path.findRev('/',l-2) : -1;
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 break;
1082 }
1083 }
1084 }
1085 else // dir is shorter than path -> take path of dir as new start
1086 {
1087 path=dir->name();
1088 l=static_cast<int>(path.length());
1089 i=path.findRev('/',l-2);
1090 if (i==-1) // no unique prefix -> stop
1091 {
1092 path="";
1093 done=TRUE;
1094 }
1095 else // restart with shorter path
1096 {
1097 path=path.left(i+1);
1098 }
1099 break;
1100 }
1101 count++;
1102 }
1103 if (count==Doxygen::dirLinkedMap->size())
1104 // path matches for all directories -> found the common prefix
1105 {
1106 done=TRUE;
1107 }
1108 }
1109 }
1110 }
1111 for (const auto &dir : *Doxygen::dirLinkedMap)
1112 {
1113 QCString diskName = dir->name().right(dir->name().length()-path.length());
1114 dir->setDiskName(diskName);
1115 AUTO_TRACE_ADD("set disk name: {} -> {}",dir->name(),diskName);
1116 }
1117}
1118
1120{
1121 AUTO_TRACE();
1122 // for each input file
1123 for (const auto &fn : *Doxygen::inputNameLinkedMap)
1124 {
1125 for (const auto &fd : *fn)
1126 {
1127 if (fd->getReference().isEmpty())
1128 {
1129 DirDef *dir=Doxygen::dirLinkedMap->find(fd->getPath());
1130 if (dir==nullptr) // new directory
1131 {
1132 dir = DirDefImpl::mergeDirectoryInTree(fd->getPath());
1133 }
1134 if (dir && !fd->isDocumentationFile()) dir->addFile(fd.get());
1135 }
1136 else
1137 {
1138 // do something for file imported via tag files.
1139 }
1140 }
1141 }
1142
1143 // compute relations between directories => introduce container dirs.
1144 for (const auto &dir : *Doxygen::dirLinkedMap)
1145 {
1146 QCString name = dir->name();
1147 int i=name.findRev('/',static_cast<int>(name.length())-2);
1148 if (i>0)
1149 {
1150 DirDef *parent = Doxygen::dirLinkedMap->find(name.left(i+1));
1151 //if (parent==0) parent=root;
1152 if (parent)
1153 {
1154 parent->addSubDir(dir.get());
1155 AUTO_TRACE_ADD("DirDefImpl::addSubdir(): Adding subdir {} to {}",
1156 dir->displayName(), parent->displayName());
1157 }
1158 }
1159 }
1160
1161 // sort the directory contents
1162 for (const auto &dir : *Doxygen::dirLinkedMap)
1163 {
1164 dir->sort();
1165 }
1166
1167 // short the directories themselves
1168 std::stable_sort(Doxygen::dirLinkedMap->begin(),
1170 [](const auto &d1,const auto &d2)
1171 {
1172 QCString s1 = d1->shortName(), s2 = d2->shortName();
1173 int i = qstricmp_sort(s1,s2);
1174 if (i==0) // if sort name are equal, sort on full path
1175 {
1176 QCString n1 = d1->name(), n2 = d2->name();
1177 int n = qstricmp_sort(n1,n2);
1178 return n < 0;
1179 }
1180 return i < 0;
1181 });
1182
1183 // set the directory index identifier
1184 int dirIndex=0;
1185 for (const auto &dir : *Doxygen::dirLinkedMap)
1186 {
1187 dir->setDirIndex(dirIndex++);
1188 }
1189
1191}
1192
1194{
1195 AUTO_TRACE();
1196 // compute nesting level for each directory
1197 for (const auto &dir : *Doxygen::dirLinkedMap)
1198 {
1199 dir->setLevel();
1200 }
1201
1202 // compute uses dependencies between directories
1203 for (const auto &dir : *Doxygen::dirLinkedMap)
1204 {
1205 AUTO_TRACE_ADD("computeDependencies for {}: #dirs={}",dir->name(),Doxygen::dirLinkedMap->size());
1206 dir->computeDependencies();
1207 }
1208}
1209
1211{
1212 AUTO_TRACE();
1213 for (const auto &dir : *Doxygen::dirLinkedMap)
1214 {
1215 ol.pushGeneratorState();
1216 if (!dir->hasDocumentation())
1217 {
1219 }
1220 dir->writeDocumentation(ol);
1221 ol.popGeneratorState();
1222 }
1223 //if (Config_getBool(DIRECTORY_GRAPH))
1224 {
1225 for (const auto &dr : Doxygen::dirRelations)
1226 {
1227 dr->writeDocumentation(ol);
1228 }
1229 }
1230}
1231
1232bool compareDirDefs(const DirDef *item1, const DirDef *item2)
1233{
1234 return qstricmp_sort(item1->shortName(),item2->shortName()) < 0;
1235}
1236
1237// --- Cast functions
1238
1240{
1241 if (d==nullptr) return nullptr;
1242 if (d && typeid(*d)==typeid(DirDefImpl))
1243 {
1244 return static_cast<DirDef*>(d);
1245 }
1246 else
1247 {
1248 return nullptr;
1249 }
1250}
1251
1253{
1254 if (d==nullptr) return nullptr;
1255 if (d && typeid(*d)==typeid(DirDefImpl))
1256 {
1257 return static_cast<const DirDef*>(d);
1258 }
1259 else
1260 {
1261 return nullptr;
1262 }
1263}
1264
constexpr auto prefix
Definition anchor.cpp:44
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual bool isLinkable() const =0
virtual QCString getReference() const =0
virtual QCString getOutputFileBase() const =0
virtual const QCString & name() const =0
bool isReference() const override
const QCString & name() const override
void writeNavigationPath(OutputList &ol) const override
bool hasBriefDescription() const override
QCString docFile() const override
bool hasRequirementRefs() const override
QCString briefFile() const override
void writeRequirementRefs(OutputList &ol) const override
const RefItemVector & xrefListItems() const override
QCString briefDescription(bool abbreviate=FALSE) const override
DefinitionMixin(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
void setLocalName(const QCString &name) override
int docLine() const override
int briefLine() const override
QCString documentation() const override
void writeDocAnchorsToTagFile(TextStream &fs) const override
bool hasDocumentation() const override
SrcLangExt getLanguage() const override
virtual void setOuterScope(Definition *d)=0
A model of a directory symbol.
Definition dirdef.h:110
virtual int level() const =0
virtual void setLevel()=0
virtual void addFile(FileDef *fd)=0
virtual DirDef * parent() const =0
virtual void addUsesDependency(const DirDef *usedDir, const FileDef *srcFd, const FileDef *dstFd, bool srcDirect, bool dstDirect)=0
virtual void setParent(DirDef *parent)=0
virtual const QCString shortName() const =0
void writeDocumentation(OutputList &ol) override
Definition dirdef.cpp:574
int m_dirIndex
Definition dirdef.cpp:104
void writeSubDirList(OutputList &ol)
Definition dirdef.cpp:361
void setLevel() override
Definition dirdef.cpp:706
static DirDef * createNewDir(const QCString &path)
Definition dirdef.cpp:887
DirDef * m_parent
Definition dirdef.cpp:106
static bool matchPath(const QCString &path, const StringVector &l)
Definition dirdef.cpp:902
QCString m_diskName
Definition dirdef.cpp:102
bool hasSubdirs() const override
Definition dirdef.cpp:56
QCString m_shortName
Definition dirdef.cpp:101
void writeTagFile(TextStream &t) override
Definition dirdef.cpp:535
const FileList & getFiles() const override
Definition dirdef.cpp:53
const QCString shortName() const override
Definition dirdef.cpp:51
bool isLinkable() const override
Definition dirdef.cpp:158
const UsedDirLinkedMap & usedDirs() const override
Definition dirdef.cpp:60
void addSubDir(DirDef *subdir) override
Definition dirdef.cpp:163
bool hasDetailedDescription() const override
Definition dirdef.cpp:529
DirDef * parent() const override
Definition dirdef.cpp:58
void startMemberDeclarations(OutputList &ol)
Definition dirdef.cpp:507
int level() const override
Definition dirdef.cpp:57
bool isLinkableInProject() const override
Definition dirdef.cpp:153
void writePageNavigation(OutputList &ol) const override
Definition dirdef.cpp:336
void writeDetailedDescription(OutputList &ol, const QCString &title)
Definition dirdef.cpp:233
DirList m_subdirs
Definition dirdef.cpp:99
void addListReferences() override
Definition dirdef.cpp:792
DefType definitionType() const override
Definition dirdef.cpp:44
bool isParentOf(const DirDef *dir) const override
Definition dirdef.cpp:839
QCString getOutputFileBase() const override
Definition dirdef.cpp:226
int dirIndex() const override
Definition dirdef.cpp:59
QCString m_dispName
Definition dirdef.cpp:100
QCString anchor() const override
Definition dirdef.cpp:47
CodeSymbolType codeSymbolType() const override
Definition dirdef.cpp:45
void addRequirementReferences() override
Definition dirdef.cpp:800
void addFile(FileDef *fd) override
Definition dirdef.cpp:180
bool depGraphIsTrivial() const override
Definition dirdef.cpp:849
void findSectionsInDocumentation() override
Definition dirdef.cpp:786
void overrideDirectoryGraph(bool e) override
Definition dirdef.cpp:935
void addUsesDependency(const DirDef *usedDir, const FileDef *srcFd, const FileDef *dstFd, bool srcDirect, bool dstDirect) override
Add as "uses" dependency between this dir and dir, that was caused by a dependency on file fd.
Definition dirdef.cpp:728
void writeDirectoryGraph(OutputList &ol)
Definition dirdef.cpp:341
const DirList & subDirs() const override
Definition dirdef.cpp:55
UsedDirLinkedMap m_usedDirs
Definition dirdef.cpp:107
void setDiskName(const QCString &name) override
Definition dirdef.cpp:68
static DirDef * mergeDirectoryInTree(const QCString &path)
Definition dirdef.cpp:918
void writeFileList(OutputList &ol)
Definition dirdef.cpp:422
QCString shortTitle() const override
Definition dirdef.cpp:517
DirDefImpl(const QCString &path)
Definition dirdef.cpp:120
void setDirIndex(int index) override
Definition dirdef.cpp:175
void endMemberDeclarations(OutputList &ol)
Definition dirdef.cpp:512
int m_level
Definition dirdef.cpp:105
FileList m_fileList
Definition dirdef.cpp:103
void sort() override
Definition dirdef.cpp:186
~DirDefImpl() override
Definition dirdef.cpp:149
void writeBriefDescription(OutputList &ol)
Definition dirdef.cpp:291
void computeDependencies() override
Computes the dependencies between directories.
Definition dirdef.cpp:807
QCString displayName(bool=TRUE) const override
Definition dirdef.cpp:50
void setParent(DirDef *parent) override
Definition dirdef.cpp:170
bool m_hasDirectoryGraph
Definition dirdef.cpp:108
bool hasDirectoryGraph() const override
Definition dirdef.cpp:940
A list of directories.
Definition dirdef.h:180
const DirDef * m_src
Definition dirdef.h:169
UsedDir * m_dst
Definition dirdef.h:170
void writeDocumentation(OutputList &ol)
Definition dirdef.cpp:983
QCString getOutputFileBase() const
Definition dirdef.h:165
Representation of an directory dependency graph.
Definition dotdirdeps.h:26
bool isTrivial() const
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:104
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:128
static DirRelationLinkedMap dirRelations
Definition doxygen.h:129
A model of a file symbol.
Definition filedef.h:99
virtual void setDirDef(DirDef *dd)=0
virtual DirDef * getDirDef() const =0
Class representing a pair of FileDef objects.
Definition dirdef.h:42
static QCString key(const FileDef *srcFd, const FileDef *dstFd)
Definition dirdef.cpp:947
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1437
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md, int sectionLevel=-1)
Definition outputlist.h:383
void endTextBlock(bool paraBreak=FALSE)
Definition outputlist.h:672
void writeString(const QCString &text)
Definition outputlist.h:411
void startMemberDeclaration()
Definition outputlist.h:569
void disable(OutputType o)
void endDirDepGraph(DotDirDeps &g)
Definition outputlist.h:662
void writeRuler()
Definition outputlist.h:521
void startGroupHeader(const QCString &id=QCString(), int extraLevels=0)
Definition outputlist.h:453
void enable(OutputType o)
void endContents()
Definition outputlist.h:620
void endMemberDescription()
Definition outputlist.h:567
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:439
void startMemberDescription(const QCString &anchor, const QCString &inheritId=QCString(), bool typ=false)
Definition outputlist.h:565
void docify(const QCString &s)
Definition outputlist.h:437
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startParagraph(const QCString &classDef=QCString())
Definition outputlist.h:407
void startTextBlock(bool dense=FALSE)
Definition outputlist.h:670
void endParagraph()
Definition outputlist.h:409
void startDirDepGraph()
Definition outputlist.h:660
void startMemberSections()
Definition outputlist.h:461
void startMemberList()
Definition outputlist.h:481
void endTextLink()
Definition outputlist.h:444
void startBold()
Definition outputlist.h:561
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:495
void endMemberList()
Definition outputlist.h:483
void writeSynopsis()
Definition outputlist.h:592
void pushGeneratorState()
void insertMemberAlign(bool templ=FALSE)
Definition outputlist.h:517
void disableAllBut(OutputType o)
void popGeneratorState()
void writeAnchor(const QCString &fileName, const QCString &name)
Definition outputlist.h:523
void endBold()
Definition outputlist.h:563
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:455
void endQuickIndices()
Definition outputlist.h:604
void writePageOutline()
Definition outputlist.h:616
void startContents()
Definition outputlist.h:618
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:571
void enableAll()
void endMemberHeader()
Definition outputlist.h:471
void startMemberItem(const QCString &anchor, OutputGenerator::MemberItemType type, const QCString &id=QCString())
Definition outputlist.h:493
void parseText(const QCString &textStr)
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:442
void startMemberHeader(const QCString &anchor, int typ=2)
Definition outputlist.h:469
void endMemberSections()
Definition outputlist.h:463
This is an alternative implementation of QCString.
Definition qcstring.h:101
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
QCString & prepend(const char *s)
Definition qcstring.h:422
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString right(size_t len) const
Definition qcstring.h:234
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
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
QCString left(size_t len) const
Definition qcstring.h:229
static RequirementManager & instance()
void addRequirementRefsForSymbol(const Definition *symbol)
Text streaming class that buffers data.
Definition textstream.h:36
Usage information of a directory.
Definition dirdef.h:64
bool m_hasDirectDstDeps
Definition dirdef.h:103
void sort()
Definition dirdef.cpp:869
FilePairLinkedMap m_filePairs
Definition dirdef.h:99
bool m_hasDirectDeps
Definition dirdef.h:101
void addFileDep(const FileDef *srcFd, const FileDef *dstFd, bool srcDirect, bool dstDirect)
Take up dependency between files.
Definition dirdef.cpp:861
const DirDef * dir() const
Definition dirdef.h:78
UsedDir(const DirDef *dir)
Definition dirdef.cpp:856
FilePair * findFilePair(const QCString &name)
Definition dirdef.cpp:882
bool m_hasDirectSrcDeps
Definition dirdef.h:102
const DirDef * m_dir
Definition dirdef.h:98
#define Config_getList(name)
Definition config.h:38
#define Config_getBool(name)
Definition config.h:33
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
std::vector< std::string > StringVector
Definition containers.h:33
DirIterator begin(DirIterator it) noexcept
Definition dir.cpp:170
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
DirDef * createDirDef(const QCString &path)
Definition dirdef.cpp:111
static void writePartialFilePath(OutputList &ol, const DirDef *root, const FileDef *fd)
Definition dirdef.cpp:964
bool compareDirDefs(const DirDef *item1, const DirDef *item2)
Definition dirdef.cpp:1232
static void writePartialDirPath(OutputList &ol, const DirDef *root, const DirDef *target)
Definition dirdef.cpp:954
static QCString encodeDirName(const QCString &anchor)
Definition dirdef.cpp:192
void buildDirectories()
Definition dirdef.cpp:1119
void computeDirDependencies()
Definition dirdef.cpp:1193
DirDef * toDirDef(Definition *d)
Definition dirdef.cpp:1239
static void computeCommonDirPrefix()
In order to create stable, but unique directory names, we compute the common part of the path shared ...
Definition dirdef.cpp:1042
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1210
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:48
#define AUTO_TRACE(...)
Definition docnode.cpp:47
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:49
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:1328
void docFindSections(const QCString &input, const Definition *d, const QCString &fileName)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
static void writeTagFile()
bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
Definition filedef.cpp:1960
void startTitle(OutputList &ol, const QCString &fileName, const DefinitionMutable *def)
Definition index.cpp:384
void endTitle(OutputList &ol, const QCString &fileName, const QCString &name)
Definition index.cpp:394
void startFile(OutputList &ol, const QCString &name, bool isSource, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
Definition index.cpp:401
void endFileWithNavPath(OutputList &ol, const DefinitionMutable *d, bool showPageNavigation)
Definition index.cpp:448
Translator * theTranslator
Definition language.cpp:71
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:687
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
#define ASSERT(x)
Definition qcstring.h:39
Definition layout.h:102
QCString title(SrcLangExt lang) const
Definition layout.cpp:1781
CodeSymbolType
Definition types.h:481
SrcLangExt
Definition types.h:207
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
Definition util.cpp:4805
bool fileVisibleInIndex(const FileDef *fd, bool &genSourceFile)
Definition util.cpp:6089
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:299
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:3893
QCString removeLongPathMarker(QCString path)
Definition util.cpp:288
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:4902
A bunch of utility functions.