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
77 bool hasDirectoryGraph() const override;
78 void overrideDirectoryGraph(bool e) override;
79
80 public:
81 static DirDef *mergeDirectoryInTree(const QCString &path);
82
83 private:
84
85 void writeDetailedDescription(OutputList &ol,const QCString &title);
89 void writeFileList(OutputList &ol);
92
93 static DirDef *createNewDir(const QCString &path);
94 static bool matchPath(const QCString &path,const StringVector &l);
95
100 FileList m_fileList; // list of files in the group
101 int m_dirIndex = -1;
106};
107
109{
110 return new DirDefImpl(path);
111}
112
113
114//----------------------------------------------------------------------
115// method implementation
116
118{
119 bool fullPathNames = Config_getBool(FULL_PATH_NAMES);
120 // get display name (stripping the paths mentioned in STRIP_FROM_PATH)
121 // get short name (last part of path)
122 m_shortName = path;
123 m_diskName = path;
124 if (m_shortName.at(m_shortName.length()-1)=='/')
125 { // strip trailing /
126 m_shortName = m_shortName.left(m_shortName.length()-1);
127 }
128 int pi=m_shortName.findRev('/');
129 if (pi!=-1)
130 { // remove everything till the last /
131 m_shortName = m_shortName.mid(pi+1);
132 }
134 m_dispName = fullPathNames ? stripFromPath(path) : m_shortName;
135 if (m_dispName.length()>0 && m_dispName.at(m_dispName.length()-1)=='/')
136 { // strip trailing /
137 m_dispName = m_dispName.left(m_dispName.length()-1);
138 }
139
140 m_level=-1;
141 m_parent=nullptr;
142 m_hasDirectoryGraph=Config_getBool(DIRECTORY_GRAPH);
143
144}
145
149
151{
152 return !isReference();
153}
154
156{
157 return isReference() || isLinkableInProject();
158}
159
161{
162 m_subdirs.push_back(subdir);
163 subdir->setOuterScope(this);
164 subdir->setParent(this);
165}
166
168{
169 m_parent=p;
170}
171
173{
174 m_dirIndex=index;
175}
176
178{
179 m_fileList.push_back(fd);
180 fd->setDirDef(this);
181}
182
184{
185 std::stable_sort(m_subdirs.begin(), m_subdirs.end(), compareDirDefs);
186 std::stable_sort(m_fileList.begin(), m_fileList.end(), compareFileDefs);
187}
188
189static QCString encodeDirName(const QCString &anchor)
190{
191 AUTO_TRACE();
192 // convert to md5 hash
193 uint8_t md5_sig[16];
194 char sigStr[33];
195 MD5Buffer(anchor.data(),static_cast<unsigned int>(anchor.length()),md5_sig);
196 MD5SigToString(md5_sig,sigStr);
197 AUTO_TRACE_EXIT("result={}",sigStr);
198 return sigStr;
199
200 // old algorithm
201// QCString result;
202
203// int l = anchor.length(),i;
204// for (i=0;i<l;i++)
205// {
206// char c = anchor.at(i);
207// if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
208// {
209// result+=c;
210// }
211// else
212// {
213// static char hexStr[]="0123456789ABCDEF";
214// char escChar[]={ '_', 0, 0, 0 };
215// escChar[1]=hexStr[c>>4];
216// escChar[2]=hexStr[c&0xf];
217// result+=escChar;
218// }
219// }
220// return result;
221}
222
224{
225 QCString dir = "dir_"+encodeDirName(m_diskName);
226 AUTO_TRACE("diskName={} result={}",m_diskName,dir);
227 return dir;
228}
229
231{
232 AUTO_TRACE();
233 if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF)) ||
234 !documentation().isEmpty())
235 {
238 ol.writeRuler();
242 ol.writeAnchor(QCString(),"details");
244 ol.startGroupHeader("details");
245 ol.parseText(title);
246 ol.endGroupHeader();
247
248 // repeat brief description
249 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
250 {
252 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
253 }
254 // separator between brief and details
255 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
256 !documentation().isEmpty())
257 {
261 ol.enableAll();
264 ol.writeString("\n\n");
266 }
267
268 // write documentation
269 if (!documentation().isEmpty())
270 {
271 ol.generateDoc(docFile(),docLine(),this,nullptr,documentation()+"\n",TRUE,FALSE,
272 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
273 }
274 }
275}
276
278{
279 AUTO_TRACE();
281 {
282 auto parser { createDocParser() };
283 auto ast { validatingParseDoc(
284 *parser.get(), briefFile(),briefLine(),this,nullptr,briefDescription(),TRUE,FALSE,
285 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT)) };
286 if (!ast->isEmpty())
287 {
288 ol.startParagraph();
291 ol.writeString(" - ");
293 ol.writeDoc(ast.get(),this,nullptr);
296 ol.writeString(" \n");
298
299 if (Config_getBool(REPEAT_BRIEF) ||
300 !documentation().isEmpty()
301 )
302 {
304 ol.startTextLink(QCString(),"details");
305 ol.parseText(theTranslator->trMore());
306 ol.endTextLink();
307 }
309
310 ol.endParagraph();
311 }
312 }
313 ol.writeSynopsis();
314}
315
320
322{
323 // write graph dependency graph
324 if (Config_getBool(HAVE_DOT) && m_hasDirectoryGraph /*&& Config_getBool(DIRECTORY_GRAPH)*/)
325 {
326 DotDirDeps dirDep(this);
327 if (!dirDep.isTrivial())
328 {
329 msg("Generating dependency graph for directory {}\n",displayName());
331 //ol.startParagraph();
332 ol.startDirDepGraph();
333 ol.parseText(theTranslator->trDirDepGraph(shortName()));
334 ol.endDirDepGraph(dirDep);
335 //ol.endParagraph();
336 ol.enableAll();
337 }
338 }
339}
340
342{
343 AUTO_TRACE();
344 int numSubdirs = 0;
345 for(const auto dd : m_subdirs)
346 {
347 if (dd->hasDocumentation() || !dd->getFiles().empty())
348 {
349 numSubdirs++;
350 }
351 }
352
353 AUTO_TRACE_ADD("numSubdirs={}",numSubdirs);
354 // write subdir list
355 if (numSubdirs>0)
356 {
357 ol.startMemberHeader("subdirs");
358 ol.parseText(theTranslator->trDir(TRUE,FALSE));
359 ol.endMemberHeader();
360 ol.startMemberList();
361 for(const auto dd : m_subdirs)
362 {
363 if (dd->hasDocumentation() || !dd->getFiles().empty())
364 {
366 QCString anc=dd->anchor();
367 if (anc.isEmpty()) anc=dd->shortName(); else anc.prepend(dd->shortName()+"_");
369 {
372 ol.writeString("<span class=\"iconfolder\"><div class=\"folder-icon\"></div></span>");
373 ol.enableAll();
375 ol.parseText(theTranslator->trDir(FALSE,TRUE)+" ");
377 }
379 ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),QCString(),dd->shortName());
381 if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
382 {
383 ol.startMemberDescription(dd->getOutputFileBase());
384 ol.generateDoc(briefFile(),briefLine(),dd,nullptr,dd->briefDescription(),
385 FALSE, // indexWords
386 FALSE, // isExample
387 QCString(), // exampleName
388 TRUE, // single line
389 TRUE, // link from index
390 Config_getBool(MARKDOWN_SUPPORT)
391 );
393 }
394 ol.endMemberDeclaration(dd->anchor(),QCString());
395 }
396 }
397
398 ol.endMemberList();
399 }
400}
401
403{
404 AUTO_TRACE();
405 int numFiles = 0;
406 for (const auto &fd : m_fileList)
407 {
408 bool genSourceFile=false;
409 if (fileVisibleInIndex(fd,genSourceFile))
410 {
411 numFiles++;
412 }
413 else if (genSourceFile)
414 {
415 numFiles++;
416 }
417 }
418
419 AUTO_TRACE_ADD("numFiles={}",numFiles);
420 // write file list
421 if (numFiles>0)
422 {
423 ol.startMemberHeader("files");
424 ol.parseText(theTranslator->trFile(TRUE,FALSE));
425 ol.endMemberHeader();
426 ol.startMemberList();
427 for (const auto &fd : m_fileList)
428 {
429 bool src = false;
430 bool doc = fileVisibleInIndex(fd,src);
431 if (doc || src)
432 {
434 QCString anc = fd->anchor();
435 if (anc.isEmpty()) anc=fd->displayName(); else anc.prepend(fd->displayName()+"_");
437 {
440 bool genSrc = fd->generateSourceFile();
441 if (genSrc)
442 {
443 ol.startTextLink(fd->includeName(),QCString());
444 }
445 ol.writeString("<span class=\"icondoc\"><div class=\"doc-icon\"></div></span>");
446 if (genSrc)
447 {
448 ol.endTextLink();
449 }
450 ol.enableAll();
452 ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
454 }
456 if (fd->isLinkable())
457 {
458 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),QCString(),fd->displayName());
459 }
460 else
461 {
462 ol.startBold();
463 ol.docify(fd->displayName());
464 ol.endBold();
465 }
467 if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
468 {
469 ol.startMemberDescription(fd->getOutputFileBase());
470 ol.generateDoc(briefFile(),briefLine(),fd,nullptr,fd->briefDescription(),
471 FALSE, // indexWords
472 FALSE, // isExample
473 QCString(), // exampleName
474 TRUE, // single line
475 TRUE, // link from index
476 Config_getBool(MARKDOWN_SUPPORT)
477 );
479 }
480 ol.endMemberDeclaration(fd->anchor(),QCString());
481 }
482 }
483 ol.endMemberList();
484 }
485}
486
491
496
498{
499 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
500 {
501 return m_shortName;
502 }
503 else
504 {
505 return theTranslator->trDirReference(m_shortName);
506 }
507}
508
510{
511 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
512 return (!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty();
513}
514
516{
517 tagFile << " <compound kind=\"dir\">\n";
518 tagFile << " <name>" << convertToXML(displayName()) << "</name>\n";
519 tagFile << " <path>" << convertToXML(stripFromPath(name())) << "</path>\n";
522 tagFile << " <filename>" << fn << "</filename>\n";
523 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Directory))
524 {
525 switch (lde->kind())
526 {
527 case LayoutDocEntry::DirSubDirs:
528 {
529 if (m_subdirs.size()>0)
530 {
531 for(const auto dd : m_subdirs)
532 {
533 tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>\n";
534 }
535 }
536 }
537 break;
538 case LayoutDocEntry::DirFiles:
539 {
540 for (const auto &fd : m_fileList)
541 {
542 tagFile << " <file>" << convertToXML(fd->name()) << "</file>\n";
543 }
544 }
545 break;
546 default:
547 break;
548 }
549 }
551 tagFile << " </compound>\n";
552}
553
555{
556 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
558
559 QCString title;
560 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
561 {
562 title=m_dispName;
563 }
564 else
565 {
566 title=theTranslator->trDirReference(m_dispName);
567 }
568 AUTO_TRACE("title={}",title);
569 startFile(ol,getOutputFileBase(),name(),title,HighlightedItem::Files,!generateTreeView);
570
571 if (!generateTreeView)
572 {
573 // write navigation path
575 ol.endQuickIndices();
576 }
577
581 ol.parseText(shortTitle());
582 ol.enableAll();
584 ol.parseText(title);
586 endTitle(ol,getOutputFileBase(),title);
587 ol.startContents();
588
589 //---------------------------------------- start flexible part -------------------------------
590
591 SrcLangExt lang = getLanguage();
592 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Directory))
593 {
594 switch (lde->kind())
595 {
596 case LayoutDocEntry::BriefDesc:
598 break;
599 case LayoutDocEntry::DirGraph:
601 break;
602 case LayoutDocEntry::MemberDeclStart:
604 break;
605 case LayoutDocEntry::DirSubDirs:
606 writeSubDirList(ol);
607 break;
608 case LayoutDocEntry::DirFiles:
609 writeFileList(ol);
610 break;
611 case LayoutDocEntry::MemberDeclEnd:
613 break;
614 case LayoutDocEntry::DetailedDesc:
615 {
616 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
617 if (ls)
618 {
619 writeDetailedDescription(ol,ls->title(lang));
620 }
621 }
622 break;
623 case LayoutDocEntry::ClassIncludes:
624 case LayoutDocEntry::ClassInlineClasses:
625 case LayoutDocEntry::ClassInheritanceGraph:
626 case LayoutDocEntry::ClassNestedClasses:
627 case LayoutDocEntry::ClassCollaborationGraph:
628 case LayoutDocEntry::ClassAllMembersLink:
629 case LayoutDocEntry::ClassUsedFiles:
630 case LayoutDocEntry::NamespaceNestedNamespaces:
631 case LayoutDocEntry::NamespaceNestedConstantGroups:
632 case LayoutDocEntry::NamespaceClasses:
633 case LayoutDocEntry::NamespaceConcepts:
634 case LayoutDocEntry::NamespaceInterfaces:
635 case LayoutDocEntry::NamespaceStructs:
636 case LayoutDocEntry::NamespaceExceptions:
637 case LayoutDocEntry::NamespaceInlineClasses:
638 case LayoutDocEntry::ConceptDefinition:
639 case LayoutDocEntry::FileClasses:
640 case LayoutDocEntry::FileConcepts:
641 case LayoutDocEntry::FileInterfaces:
642 case LayoutDocEntry::FileStructs:
643 case LayoutDocEntry::FileExceptions:
644 case LayoutDocEntry::FileNamespaces:
645 case LayoutDocEntry::FileConstantGroups:
646 case LayoutDocEntry::FileIncludes:
647 case LayoutDocEntry::FileIncludeGraph:
648 case LayoutDocEntry::FileIncludedByGraph:
649 case LayoutDocEntry::FileSourceLink:
650 case LayoutDocEntry::FileInlineClasses:
651 case LayoutDocEntry::GroupClasses:
652 case LayoutDocEntry::GroupConcepts:
653 case LayoutDocEntry::GroupModules:
654 case LayoutDocEntry::GroupInlineClasses:
655 case LayoutDocEntry::GroupNamespaces:
656 case LayoutDocEntry::GroupDirs:
657 case LayoutDocEntry::GroupNestedGroups:
658 case LayoutDocEntry::GroupFiles:
659 case LayoutDocEntry::GroupGraph:
660 case LayoutDocEntry::GroupPageDocs:
661 case LayoutDocEntry::ModuleExports:
662 case LayoutDocEntry::ModuleClasses:
663 case LayoutDocEntry::ModuleConcepts:
664 case LayoutDocEntry::ModuleUsedFiles:
665 case LayoutDocEntry::AuthorSection:
666 case LayoutDocEntry::MemberGroups:
667 case LayoutDocEntry::MemberDecl:
668 case LayoutDocEntry::MemberDef:
669 case LayoutDocEntry::MemberDefStart:
670 case LayoutDocEntry::MemberDefEnd:
671 err("Internal inconsistency: member '{}' should not be part of "
672 "LayoutDocManager::Directory entry list\n",qPrint(lde->entryToString()));
673 break;
674 }
675 }
676
677 //---------------------------------------- end flexible part -------------------------------
678
679 ol.endContents();
680
681 endFileWithNavPath(ol,this);
682
684}
685
687{
688 if (m_level==-1) // level not set before
689 {
690 DirDef *p = parent();
691 if (p)
692 {
693 p->setLevel();
694 m_level = p->level()+1;
695 }
696 else
697 {
698 m_level = 0;
699 }
700 }
701}
702
703/** Add as "uses" dependency between \a this dir and \a dir,
704 * that was caused by a dependency on file \a fd.
705 * srcDirect and dstDirect indicate if it is a direct dependencies (true) or if
706 * the dependencies was indirect (e.g. a parent dir that has a child dir that has the dependencies)
707 */
708void DirDefImpl::addUsesDependency(const DirDef *dir,const FileDef *srcFd,
709 const FileDef *dstFd,bool srcDirect, bool dstDirect)
710{
711 if (this==dir) return; // do not add self-dependencies
712 AUTO_TRACE("add dependency {}->{} due to {}->{}",
713 qPrint(shortName()),
714 qPrint(dir->shortName()),
715 qPrint(srcFd->name()),
716 qPrint(dstFd->name()));
717
718 // levels match => add direct dependency
719 bool added=FALSE;
720 UsedDir *usedDir = m_usedDirs.find(dir->getOutputFileBase());
721 if (usedDir) // dir dependency already present
722 {
723 const FilePair *usedPair = usedDir->findFilePair(FilePair::key(srcFd,dstFd));
724 if (usedPair==nullptr) // new file dependency
725 {
726 AUTO_TRACE_ADD("{} => {} new file dependency",srcFd->name(),dstFd->name());
727 usedDir->addFileDep(srcFd,dstFd, srcDirect, dstDirect);
728 added=TRUE;
729 }
730 else
731 {
732 // dir & file dependency already added
733 }
734 }
735 else // new directory dependency
736 {
737 AUTO_TRACE_ADD("{} => {} new file dependency",srcFd->name(),dstFd->name());
738 auto newUsedDir = std::make_unique<UsedDir>(dir);
739 newUsedDir->addFileDep(srcFd,dstFd, srcDirect, dstDirect);
740 m_usedDirs.add(dir->getOutputFileBase(),std::move(newUsedDir));
741 added=TRUE;
742 }
743 if (added)
744 {
745 if (dir->parent())
746 {
747 // add relation to parent of used dir
749 srcFd,
750 dstFd,
751 srcDirect,
752 false); // indirect dependency on dest dir
753 }
754 if (parent())
755 {
756 // add relation for the parent of this dir as well
758 srcFd,
759 dstFd,
760 false, // indirect dependency from source dir
761 dstDirect);
762 }
763 }
764}
765
766/** Computes the dependencies between directories
767 */
769{
770 AUTO_TRACE();
771 for (const auto &fd : m_fileList)
772 {
773 AUTO_TRACE_ADD("dir={} file={}",shortName(),fd->name());
774 for (const auto &ii : fd->includeFileList())
775 {
776 AUTO_TRACE_ADD("#include {}",ii.includeName);
777 if (ii.fileDef && ii.fileDef->isLinkable()) // linkable file
778 {
779 DirDef *usedDir = ii.fileDef->getDirDef();
780 if (usedDir)
781 {
782 // add dependency: thisDir->usedDir
783 AUTO_TRACE_ADD("add dependency {}->{}",name(),usedDir->name());
784 addUsesDependency(usedDir,fd,ii.fileDef,true,true);
785 }
786 }
787 }
788 }
789
790 std::stable_sort(m_usedDirs.begin(),m_usedDirs.end(),
791 [](const auto &u1,const auto &u2)
792 { return qstricmp_sort(u1->dir()->getOutputFileBase(),u2->dir()->getOutputFileBase())<0; });
793
794 for (const auto& usedDirectory : m_usedDirs)
795 {
796 usedDirectory->sort();
797 }
798}
799
800bool DirDefImpl::isParentOf(const DirDef *dir) const
801{
802 if (dir->parent()==this) // this is a parent of dir
803 return TRUE;
804 else if (dir->parent()) // repeat for the parent of dir
805 return isParentOf(dir->parent());
806 else
807 return FALSE;
808}
809
811{
812 return m_usedDirs.empty() && m_parent==nullptr;
813}
814
815//----------------------------------------------------------------------
816
818 m_dir(dir)
819{
820}
821
822void UsedDir::addFileDep(const FileDef *srcFd,const FileDef *dstFd, bool srcDirect, bool dstDirect)
823{
824 m_filePairs.add(FilePair::key(srcFd,dstFd),std::make_unique<FilePair>(srcFd,dstFd));
825 m_hasDirectDeps = m_hasDirectDeps || (srcDirect && dstDirect);
828}
829
831{
832 std::stable_sort(m_filePairs.begin(),
833 m_filePairs.end(),
834 [](const auto &left,const auto &right)
835 {
836 int orderHi = qstricmp_sort(left->source()->name(),right->source()->name());
837 if (orderHi!=0) return orderHi<0;
838 int orderLo = qstricmp_sort(left->destination()->name(),right->destination()->name());
839 return orderLo<0;
840 });
841}
842
844{
845 return m_filePairs.find(name);
846}
847
849{
850 AUTO_TRACE();
851 ASSERT(path!=nullptr);
852 DirDef *dir = Doxygen::dirLinkedMap->find(path);
853 if (dir==nullptr) // new dir
854 {
855 dir = Doxygen::dirLinkedMap->add(path,
856 std::unique_ptr<DirDef>(
857 createDirDef(path)));
858 AUTO_TRACE_ADD("Adding new dir {} shortName {}",path,dir->shortName());
859 }
860 return dir;
861}
862
864{
865 for (const auto &s : l)
866 {
867 std::string prefix = s.substr(0,path.length());
868 if (qstricmp_sort(prefix.c_str(),path)==0) // case insensitive compare
869 {
870 return TRUE;
871 }
872 }
873 return FALSE;
874}
875
876/*! strip part of \a path if it matches
877 * one of the paths in the Config_getList(STRIP_FROM_PATH) list
878 */
880{
881 AUTO_TRACE("path={}",path);
882 int p=0,i=0;
883 DirDef *dir=nullptr;
884 while ((i=path.find('/',p))!=-1)
885 {
886 QCString part=path.left(i+1);
887 if (!matchPath(part,Config_getList(STRIP_FROM_PATH)) && (part!="/" && part!="//" && part!="//?/"))
888 {
890 }
891 p=i+1;
892 }
893 return dir;
894}
895
900
902{
903 return m_hasDirectoryGraph;
904}
905
906//----------------------------------------------------------------------
907
908QCString FilePair::key(const FileDef *srcFd,const FileDef *dstFd)
909{
910 return srcFd->getOutputFileBase()+";"+dstFd->getOutputFileBase();
911}
912
913//----------------------------------------------------------------------
914
915static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
916{
917 if (target->parent()!=root)
918 {
919 writePartialDirPath(ol,root,target->parent());
920 ol.writeString("&#160;/&#160;");
921 }
922 ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),QCString(),target->shortName());
923}
924
925static void writePartialFilePath(OutputList &ol,const DirDef *root,const FileDef *fd)
926{
927 if (fd->getDirDef() && fd->getDirDef()!=root)
928 {
929 writePartialDirPath(ol,root,fd->getDirDef());
930 ol.writeString("&#160;/&#160;");
931 }
932 if (fd->isLinkable())
933 {
935 }
936 else
937 {
938 ol.startBold();
939 ol.docify(fd->name());
940 ol.endBold();
941 }
942}
943
945{
946 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
949
950 QCString shortTitle=theTranslator->trDirRelation(
951 (m_src->shortName()+" &rarr; "+m_dst->dir()->shortName()));
952 QCString title=theTranslator->trDirRelation(
953 (m_src->displayName()+" -> "+m_dst->dir()->shortName()));
954 AUTO_TRACE("title={}",title);
956 title,HighlightedItem::None,!generateTreeView,m_src->getOutputFileBase());
957
958 if (!generateTreeView)
959 {
960 // write navigation path
961 m_src->writeNavigationPath(ol);
962 ol.endQuickIndices();
963 }
964 ol.startContents();
965
966 ol.writeString("<h3>"+shortTitle+"</h3>");
967 ol.writeString("<table class=\"dirtab\">");
968 ol.writeString("<tr class=\"dirtab\">");
969 ol.writeString("<th class=\"dirtab\">");
970 ol.parseText(theTranslator->trFileIn(m_src->pathFragment()));
971 ol.writeString("</th>");
972 ol.writeString("<th class=\"dirtab\">");
973 ol.parseText(theTranslator->trIncludesFileIn(m_dst->dir()->pathFragment()));
974 ol.writeString("</th>");
975 ol.writeString("</tr>");
976
977 for (const auto &fp : m_dst->filePairs())
978 {
979 ol.writeString("<tr class=\"dirtab\">");
980 ol.writeString("<td class=\"dirtab\">");
981 writePartialFilePath(ol,m_src,fp->source());
982 ol.writeString("</td>");
983 ol.writeString("<td class=\"dirtab\">");
984 writePartialFilePath(ol,m_dst->dir(),fp->destination());
985 ol.writeString("</td>");
986 ol.writeString("</tr>");
987 }
988 ol.writeString("</table>");
989
990 ol.endContents();
991
993
995}
996
997//----------------------------------------------------------------------
998// external functions
999
1000/** In order to create stable, but unique directory names,
1001 * we compute the common part of the path shared by all directories.
1002 */
1004{
1005 AUTO_TRACE();
1006 QCString path;
1007 auto it = Doxygen::dirLinkedMap->begin();
1008 if (!Doxygen::dirLinkedMap->empty()) // we have at least one dir
1009 {
1010 // start will full path of first dir
1011 path=removeLongPathMarker((*it)->name());
1012 int i=path.findRev('/',static_cast<int>(path.length())-2);
1013 path=path.left(i+1);
1014 bool done=FALSE;
1015 if (i==-1)
1016 {
1017 path="";
1018 }
1019 else
1020 {
1021 while (!done)
1022 {
1023 int l = static_cast<int>(path.length());
1024 size_t count=0;
1025 for (const auto &dir : *Doxygen::dirLinkedMap)
1026 {
1027 QCString dirName = removeLongPathMarker(dir->name());
1028 //printf("dirName='%s' (l=%d) path='%s' (l=%d)\n",qPrint(dirName),dirName.length(),qPrint(path),path.length());
1029 if (dirName.length()>path.length())
1030 {
1031 if (dirName.left(l)!=path) // dirName does not start with path
1032 {
1033 i = l>=2 ? path.findRev('/',l-2) : -1;
1034 if (i==-1) // no unique prefix -> stop
1035 {
1036 path="";
1037 done=TRUE;
1038 }
1039 else // restart with shorter path
1040 {
1041 path=path.left(i+1);
1042 break;
1043 }
1044 }
1045 }
1046 else // dir is shorter than path -> take path of dir as new start
1047 {
1048 path=dir->name();
1049 l=static_cast<int>(path.length());
1050 i=path.findRev('/',l-2);
1051 if (i==-1) // no unique prefix -> stop
1052 {
1053 path="";
1054 done=TRUE;
1055 }
1056 else // restart with shorter path
1057 {
1058 path=path.left(i+1);
1059 }
1060 break;
1061 }
1062 count++;
1063 }
1064 if (count==Doxygen::dirLinkedMap->size())
1065 // path matches for all directories -> found the common prefix
1066 {
1067 done=TRUE;
1068 }
1069 }
1070 }
1071 }
1072 for (const auto &dir : *Doxygen::dirLinkedMap)
1073 {
1074 QCString diskName = dir->name().right(dir->name().length()-path.length());
1075 dir->setDiskName(diskName);
1076 AUTO_TRACE_ADD("set disk name: {} -> {}",dir->name(),diskName);
1077 }
1078}
1079
1081{
1082 AUTO_TRACE();
1083 // for each input file
1084 for (const auto &fn : *Doxygen::inputNameLinkedMap)
1085 {
1086 for (const auto &fd : *fn)
1087 {
1088 if (fd->getReference().isEmpty())
1089 {
1090 DirDef *dir=Doxygen::dirLinkedMap->find(fd->getPath());
1091 if (dir==nullptr) // new directory
1092 {
1093 dir = DirDefImpl::mergeDirectoryInTree(fd->getPath());
1094 }
1095 if (dir && !fd->isDocumentationFile()) dir->addFile(fd.get());
1096 }
1097 else
1098 {
1099 // do something for file imported via tag files.
1100 }
1101 }
1102 }
1103
1104 // compute relations between directories => introduce container dirs.
1105 for (const auto &dir : *Doxygen::dirLinkedMap)
1106 {
1107 QCString name = dir->name();
1108 int i=name.findRev('/',static_cast<int>(name.length())-2);
1109 if (i>0)
1110 {
1111 DirDef *parent = Doxygen::dirLinkedMap->find(name.left(i+1));
1112 //if (parent==0) parent=root;
1113 if (parent)
1114 {
1115 parent->addSubDir(dir.get());
1116 AUTO_TRACE_ADD("DirDefImpl::addSubdir(): Adding subdir {} to {}",
1117 dir->displayName(), parent->displayName());
1118 }
1119 }
1120 }
1121
1122 // sort the directory contents
1123 for (const auto &dir : *Doxygen::dirLinkedMap)
1124 {
1125 dir->sort();
1126 }
1127
1128 // short the directories themselves
1129 std::stable_sort(Doxygen::dirLinkedMap->begin(),
1131 [](const auto &d1,const auto &d2)
1132 {
1133 QCString s1 = d1->shortName(), s2 = d2->shortName();
1134 int i = qstricmp_sort(s1,s2);
1135 if (i==0) // if sort name are equal, sort on full path
1136 {
1137 QCString n1 = d1->name(), n2 = d2->name();
1138 int n = qstricmp_sort(n1,n2);
1139 return n < 0;
1140 }
1141 return i < 0;
1142 });
1143
1144 // set the directory index identifier
1145 int dirIndex=0;
1146 for (const auto &dir : *Doxygen::dirLinkedMap)
1147 {
1148 dir->setDirIndex(dirIndex++);
1149 }
1150
1152}
1153
1155{
1156 AUTO_TRACE();
1157 // compute nesting level for each directory
1158 for (const auto &dir : *Doxygen::dirLinkedMap)
1159 {
1160 dir->setLevel();
1161 }
1162
1163 // compute uses dependencies between directories
1164 for (const auto &dir : *Doxygen::dirLinkedMap)
1165 {
1166 AUTO_TRACE_ADD("computeDependencies for {}: #dirs={}",dir->name(),Doxygen::dirLinkedMap->size());
1167 dir->computeDependencies();
1168 }
1169}
1170
1172{
1173 AUTO_TRACE();
1174 for (const auto &dir : *Doxygen::dirLinkedMap)
1175 {
1176 ol.pushGeneratorState();
1177 if (!dir->hasDocumentation())
1178 {
1180 }
1181 dir->writeDocumentation(ol);
1182 ol.popGeneratorState();
1183 }
1184 //if (Config_getBool(DIRECTORY_GRAPH))
1185 {
1186 for (const auto &dr : Doxygen::dirRelations)
1187 {
1188 dr->writeDocumentation(ol);
1189 }
1190 }
1191}
1192
1193bool compareDirDefs(const DirDef *item1, const DirDef *item2)
1194{
1195 return qstricmp_sort(item1->shortName(),item2->shortName()) < 0;
1196}
1197
1198// --- Cast functions
1199
1201{
1202 if (d==nullptr) return nullptr;
1203 if (d && typeid(*d)==typeid(DirDefImpl))
1204 {
1205 return static_cast<DirDef*>(d);
1206 }
1207 else
1208 {
1209 return nullptr;
1210 }
1211}
1212
1214{
1215 if (d==nullptr) return nullptr;
1216 if (d && typeid(*d)==typeid(DirDefImpl))
1217 {
1218 return static_cast<const DirDef*>(d);
1219 }
1220 else
1221 {
1222 return nullptr;
1223 }
1224}
1225
constexpr auto prefix
Definition anchor.cpp:44
The common base class of all entity definitions found in the sources.
Definition definition.h:76
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
QCString briefFile() 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
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:554
int m_dirIndex
Definition dirdef.cpp:101
void writeSubDirList(OutputList &ol)
Definition dirdef.cpp:341
void setLevel() override
Definition dirdef.cpp:686
static DirDef * createNewDir(const QCString &path)
Definition dirdef.cpp:848
DirDef * m_parent
Definition dirdef.cpp:103
static bool matchPath(const QCString &path, const StringVector &l)
Definition dirdef.cpp:863
QCString m_diskName
Definition dirdef.cpp:99
bool hasSubdirs() const override
Definition dirdef.cpp:56
QCString m_shortName
Definition dirdef.cpp:98
void writeTagFile(TextStream &t) override
Definition dirdef.cpp:515
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:155
const UsedDirLinkedMap & usedDirs() const override
Definition dirdef.cpp:60
void addSubDir(DirDef *subdir) override
Definition dirdef.cpp:160
bool hasDetailedDescription() const override
Definition dirdef.cpp:509
DirDef * parent() const override
Definition dirdef.cpp:58
void startMemberDeclarations(OutputList &ol)
Definition dirdef.cpp:487
int level() const override
Definition dirdef.cpp:57
bool isLinkableInProject() const override
Definition dirdef.cpp:150
void writePageNavigation(OutputList &ol) const override
Definition dirdef.cpp:316
void writeDetailedDescription(OutputList &ol, const QCString &title)
Definition dirdef.cpp:230
DirList m_subdirs
Definition dirdef.cpp:96
DefType definitionType() const override
Definition dirdef.cpp:44
bool isParentOf(const DirDef *dir) const override
Definition dirdef.cpp:800
QCString getOutputFileBase() const override
Definition dirdef.cpp:223
int dirIndex() const override
Definition dirdef.cpp:59
QCString m_dispName
Definition dirdef.cpp:97
QCString anchor() const override
Definition dirdef.cpp:47
CodeSymbolType codeSymbolType() const override
Definition dirdef.cpp:45
void addFile(FileDef *fd) override
Definition dirdef.cpp:177
bool depGraphIsTrivial() const override
Definition dirdef.cpp:810
void overrideDirectoryGraph(bool e) override
Definition dirdef.cpp:896
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:708
void writeDirectoryGraph(OutputList &ol)
Definition dirdef.cpp:321
const DirList & subDirs() const override
Definition dirdef.cpp:55
UsedDirLinkedMap m_usedDirs
Definition dirdef.cpp:104
void setDiskName(const QCString &name) override
Definition dirdef.cpp:68
static DirDef * mergeDirectoryInTree(const QCString &path)
Definition dirdef.cpp:879
void writeFileList(OutputList &ol)
Definition dirdef.cpp:402
QCString shortTitle() const override
Definition dirdef.cpp:497
DirDefImpl(const QCString &path)
Definition dirdef.cpp:117
void setDirIndex(int index) override
Definition dirdef.cpp:172
void endMemberDeclarations(OutputList &ol)
Definition dirdef.cpp:492
int m_level
Definition dirdef.cpp:102
FileList m_fileList
Definition dirdef.cpp:100
void sort() override
Definition dirdef.cpp:183
~DirDefImpl() override
Definition dirdef.cpp:146
void writeBriefDescription(OutputList &ol)
Definition dirdef.cpp:277
void computeDependencies() override
Computes the dependencies between directories.
Definition dirdef.cpp:768
QCString displayName(bool=TRUE) const override
Definition dirdef.cpp:50
void setParent(DirDef *parent) override
Definition dirdef.cpp:167
bool m_hasDirectoryGraph
Definition dirdef.cpp:105
bool hasDirectoryGraph() const override
Definition dirdef.cpp:901
A list of directories.
Definition dirdef.h:177
const DirDef * m_src
Definition dirdef.h:166
UsedDir * m_dst
Definition dirdef.h:167
void writeDocumentation(OutputList &ol)
Definition dirdef.cpp:944
QCString getOutputFileBase() const
Definition dirdef.h:162
Representation of an directory dependency graph.
Definition dotdirdeps.h:26
bool isTrivial() const
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:105
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:129
static DirRelationLinkedMap dirRelations
Definition doxygen.h:130
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:908
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1435
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:314
void writeString(const QCString &text)
Definition outputlist.h:412
void startMemberDeclaration()
Definition outputlist.h:570
void disable(OutputType o)
void endDirDepGraph(DotDirDeps &g)
Definition outputlist.h:663
void writeRuler()
Definition outputlist.h:522
void startGroupHeader(const QCString &id=QCString(), int extraLevels=0)
Definition outputlist.h:454
void enable(OutputType o)
void endContents()
Definition outputlist.h:621
void endMemberDescription()
Definition outputlist.h:568
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:440
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md)
Definition outputlist.h:384
void startMemberDescription(const QCString &anchor, const QCString &inheritId=QCString(), bool typ=false)
Definition outputlist.h:566
void docify(const QCString &s)
Definition outputlist.h:438
void startParagraph(const QCString &classDef=QCString())
Definition outputlist.h:408
void endParagraph()
Definition outputlist.h:410
void startDirDepGraph()
Definition outputlist.h:661
void startMemberSections()
Definition outputlist.h:462
void startMemberList()
Definition outputlist.h:482
void endTextLink()
Definition outputlist.h:445
void startBold()
Definition outputlist.h:562
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:496
void endMemberList()
Definition outputlist.h:484
void writeSynopsis()
Definition outputlist.h:593
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
void pushGeneratorState()
void insertMemberAlign(bool templ=FALSE)
Definition outputlist.h:518
void disableAllBut(OutputType o)
void popGeneratorState()
void writeAnchor(const QCString &fileName, const QCString &name)
Definition outputlist.h:524
void endBold()
Definition outputlist.h:564
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:456
void endQuickIndices()
Definition outputlist.h:605
void writePageOutline()
Definition outputlist.h:617
void startContents()
Definition outputlist.h:619
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:572
void enableAll()
void endMemberHeader()
Definition outputlist.h:472
void startMemberItem(const QCString &anchor, OutputGenerator::MemberItemType type, const QCString &id=QCString())
Definition outputlist.h:494
void parseText(const QCString &textStr)
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:443
void startMemberHeader(const QCString &anchor, int typ=2)
Definition outputlist.h:470
void endMemberSections()
Definition outputlist.h:464
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:407
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString right(size_t len) const
Definition qcstring.h:219
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:91
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
QCString left(size_t len) const
Definition qcstring.h:214
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:830
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:822
const DirDef * dir() const
Definition dirdef.h:78
UsedDir(const DirDef *dir)
Definition dirdef.cpp:817
FilePair * findFilePair(const QCString &name)
Definition dirdef.cpp:843
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:108
static void writePartialFilePath(OutputList &ol, const DirDef *root, const FileDef *fd)
Definition dirdef.cpp:925
bool compareDirDefs(const DirDef *item1, const DirDef *item2)
Definition dirdef.cpp:1193
static void writePartialDirPath(OutputList &ol, const DirDef *root, const DirDef *target)
Definition dirdef.cpp:915
static QCString encodeDirName(const QCString &anchor)
Definition dirdef.cpp:189
void buildDirectories()
Definition dirdef.cpp:1080
void computeDirDependencies()
Definition dirdef.cpp:1154
DirDef * toDirDef(Definition *d)
Definition dirdef.cpp:1200
static void computeCommonDirPrefix()
In order to create stable, but unique directory names, we compute the common part of the path shared ...
Definition dirdef.cpp:1003
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1171
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:47
#define AUTO_TRACE(...)
Definition docnode.cpp:46
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:48
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:1325
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
static void writeTagFile()
bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
Definition filedef.cpp:1925
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, 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:672
#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:1779
CodeSymbolType
Definition types.h:481
SrcLangExt
Definition types.h:207
bool fileVisibleInIndex(const FileDef *fd, bool &genSourceFile)
Definition util.cpp:6566
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:309
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:4428
QCString removeLongPathMarker(QCString path)
Definition util.cpp:298
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:5415
A bunch of utility functions.