diff options
Diffstat (limited to 'src/doxygen.cpp')
-rw-r--r-- | src/doxygen.cpp | 821 |
1 files changed, 461 insertions, 360 deletions
diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 03ef3ff..62ca201 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -142,31 +142,26 @@ bool Doxygen::gatherDefines = TRUE; IndexList Doxygen::indexList; int Doxygen::subpageNestingLevel = 0; bool Doxygen::userComments = FALSE; +QCString Doxygen::spaces; // locally accessible globals -static QDict<EntryNav> classEntries(1009); -static StringList inputFiles; -static StringDict excludeNameDict(1009); // sections -static QDict<void> compoundKeywordDict(7); // keywords recognised as compounds -static OutputList *outputList = 0; // list of output generating objects -static QDict<FileDef> g_usingDeclarations(1009); // used classes -static const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*"; - -FileStorage *g_storage = 0; - -QCString spaces; - -static bool g_successfulRun = FALSE; -static bool g_dumpSymbolMap = FALSE; -static bool g_dumpConfigAsXML = FALSE; +static QDict<EntryNav> g_classEntries(1009); +static StringList g_inputFiles; +static QDict<void> g_compoundKeywordDict(7); // keywords recognised as compounds +static OutputList *g_outputList = 0; // list of output generating objects +static QDict<FileDef> g_usingDeclarations(1009); // used classes +static FileStorage *g_storage = 0; +static bool g_successfulRun = FALSE; +static bool g_dumpSymbolMap = FALSE; +static bool g_dumpConfigAsXML = FALSE; void clearAll() { - inputFiles.clear(); - excludeNameDict.clear(); - delete outputList; outputList=0; + g_inputFiles.clear(); + //g_excludeNameDict.clear(); + //delete g_outputList; g_outputList=0; Doxygen::classSDict->clear(); Doxygen::namespaceSDict->clear(); @@ -198,8 +193,8 @@ void statistics() Doxygen::imageNameDict->statistics(); fprintf(stderr,"--- dotFileNameDict stats ----\n"); Doxygen::dotFileNameDict->statistics(); - fprintf(stderr,"--- excludeNameDict stats ----\n"); - excludeNameDict.statistics(); + //fprintf(stderr,"--- g_excludeNameDict stats ----\n"); + //g_excludeNameDict.statistics(); fprintf(stderr,"--- aliasDict stats ----\n"); Doxygen::aliasDict.statistics(); fprintf(stderr,"--- typedefDict stats ----\n"); @@ -211,8 +206,8 @@ void statistics() Doxygen::formulaNameDict.statistics(); fprintf(stderr,"--- tagDestinationDict stats ----\n"); Doxygen::tagDestinationDict.statistics(); - fprintf(stderr,"--- compoundKeywordDict stats ----\n"); - compoundKeywordDict.statistics(); + fprintf(stderr,"--- g_compoundKeywordDict stats ----\n"); + g_compoundKeywordDict.statistics(); fprintf(stderr,"--- expandAsDefinedDict stats ----\n"); Doxygen::expandAsDefinedDict.statistics(); fprintf(stderr,"--- memGrpInfoDict stats ----\n"); @@ -468,11 +463,11 @@ static void addRelatedPage(EntryNav *rootNav) QCString doc; if (root->brief.isEmpty()) { - doc=root->doc; + doc=root->doc+root->inbodyDocs; } else { - doc=root->brief+"\n\n"+root->doc; + doc=root->brief+"\n\n"+root->doc+root->inbodyDocs; } PageDef *pd = addRelatedPage(root->name,root->args,doc,root->anchors, root->fileName,root->startLine, @@ -503,31 +498,21 @@ static void buildGroupListFiltered(EntryNav *rootNav,bool additional) if ((gd=Doxygen::groupSDict->find(root->name))) { -#if 0 - if ( root->groupDocType==Entry::GROUPDOC_NORMAL ) + if ( !gd->hasGroupTitle() ) { - warn(root->fileName,root->startLine, - "Warning: group %s already documented. " - "Skipping documentation.", - root->name.data()); + gd->setGroupTitle( root->type ); } - else -#endif + else if ( root->type.length() > 0 && root->name != root->type && gd->groupTitle() != root->type ) { - if ( !gd->hasGroupTitle() ) - gd->setGroupTitle( root->type ); - else if ( root->type.length() > 0 && root->name != root->type && gd->groupTitle() != root->type ) - warn( root->fileName,root->startLine, - "group %s: ignoring title \"%s\" that does not match old title \"%s\"\n", - root->name.data(), root->type.data(), gd->groupTitle() ); - //if ( gd->briefDescription().isEmpty() ) - gd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - //if ( !root->doc.stripWhiteSpace().isEmpty() ) - gd->setDocumentation( root->doc, root->docFile, root->docLine ); - gd->addSectionsToDefinition(root->anchors); - gd->setRefItems(root->sli); - //addGroupToGroups(root,gd); + warn( root->fileName,root->startLine, + "group %s: ignoring title \"%s\" that does not match old title \"%s\"\n", + root->name.data(), root->type.data(), gd->groupTitle() ); } + gd->setBriefDescription(root->brief,root->briefFile,root->briefLine); + gd->setDocumentation( root->doc, root->docFile, root->docLine ); + gd->setInbodyDocumentation( root->inbodyDocs, root->inbodyFile, root->inbodyLine ); + gd->addSectionsToDefinition(root->anchors); + gd->setRefItems(root->sli); } else { @@ -542,6 +527,7 @@ static void buildGroupListFiltered(EntryNav *rootNav,bool additional) } gd->setBriefDescription(root->brief,root->briefFile,root->briefLine); gd->setDocumentation(root->doc,root->docFile,root->docLine); + gd->setInbodyDocumentation( root->inbodyDocs, root->inbodyFile, root->inbodyLine ); gd->addSectionsToDefinition(root->anchors); Doxygen::groupSDict->append(root->name,gd); gd->setRefItems(root->sli); @@ -1468,7 +1454,7 @@ static void buildNamespaceList(EntryNav *rootNav) //---------------------------------------------------------------------- -static NamespaceDef *findUsedNamespace(const NamespaceSDict *unl, +static NamespaceDef *findUsedNamespace(NamespaceSDict *unl, const QCString &name) { NamespaceDef *usingNd =0; @@ -1660,8 +1646,8 @@ static void findUsingDeclarations(EntryNav *rootNav) Entry *root = rootNav->entry(); //printf("Found using declaration %s at line %d of %s inside section %x\n", - // root->name.data(),root->startLine,root->fileName.data(), - // root->parent->section); + // root->name.data(),root->startLine,root->fileName.data(), + // rootNav->parent()->section()); if (!root->name.isEmpty()) { ClassDef *usingCd = 0; @@ -1686,9 +1672,7 @@ static void findUsingDeclarations(EntryNav *rootNav) // with the most inner scope and going to the most outer scope (i.e. // file scope). - QCString name = substitute(root->name,".","::"); - //MemberDef *mtd=0; - //usingCd = getResolvedClass(nd,fd,name,&mtd); + QCString name = substitute(root->name,".","::"); //Java/C# scope->internal usingCd = getClass(name); if (usingCd==0) { @@ -1712,22 +1696,6 @@ static void findUsingDeclarations(EntryNav *rootNav) usingCd->name().data(),nd?nd->name().data():fd->name().data()); } -#if 0 - if (mtd) // add the typedef to the correct scope - { - if (nd) - { - //printf("Inside namespace %s\n",nd->name().data()); - nd->addUsingDeclaration(mtd); - } - else if (fd) - { - //printf("Inside file %s\n",nd->name().data()); - fd->addUsingDeclaration(mtd); - } - } - else -#endif if (usingCd) // add the class to the correct scope { if (nd) @@ -1737,7 +1705,7 @@ static void findUsingDeclarations(EntryNav *rootNav) } else if (fd) { - //printf("Inside file %s\n",nd->name().data()); + //printf("Inside file %s\n",fd->name().data()); fd->addUsingDeclaration(usingCd); } } @@ -2056,16 +2024,46 @@ static MemberDef *addVariableToFile( FileDef *fd = rootNav->fileDef(); + // see if we have a typedef that should hide a struct or union + if (mtype==MemberDef::Typedef && Config_getBool("TYPEDEF_HIDES_STRUCT")) + { + QCString type = root->type; + type.stripPrefix("typedef "); + if (type.left(7)=="struct " || type.left(6)=="union ") + { + type.stripPrefix("struct "); + type.stripPrefix("union "); + static QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*"); + int l,s; + s = re.match(type,0,&l); + if (s>=0) + { + QCString typeValue = type.mid(s,l); + ClassDef *cd = getClass(typeValue); + if (cd) + { + // this typedef should hide compound name cd, so we + // change the name that is displayed from cd. + cd->setClassName(name); + cd->setDocumentation(root->doc,root->docFile,root->docLine); + cd->setBriefDescription(root->brief,root->briefFile,root->briefLine); + return 0; + } + } + } + } + // see if the function is inside a namespace NamespaceDef *nd = 0; QCString nscope; if (!scope.isEmpty()) { - nscope=removeAnonymousScopes(scope); - if (!nscope.isEmpty()) - { - nd = getResolvedNamespace(nscope); - } + if (scope.find('@')!=-1) return 0; // anonymous scope! + //nscope=removeAnonymousScopes(scope); + //if (!nscope.isEmpty()) + //{ + nd = getResolvedNamespace(scope); + //} } QCString def; @@ -2110,9 +2108,10 @@ static MemberDef *addVariableToFile( //QCString nscope=removeAnonymousScopes(scope); //NamespaceDef *nd=0; //if (!nscope.isEmpty()) - //{ - // nd = getResolvedNamespace(nscope); - //} + if (!scope.isEmpty()) + { + nd = getResolvedNamespace(scope); + } MemberNameIterator mni(*mn); MemberDef *md; for (mni.toFirst();(md=mni.current());++mni) @@ -2541,6 +2540,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1) } } } + //printf("name=`%s' scope=%s scope.right=%s\n", // name.data(),scope.data(), // scope.right(scope.length()-si).data()); @@ -2599,7 +2599,7 @@ static void buildVarList(EntryNav *rootNav) //printf("buildVarList(%s)\n",rootNav->name().data()); int isFuncPtr=-1; if (!rootNav->name().isEmpty() && - (rootNav->type().isEmpty() || compoundKeywordDict.find(rootNav->type())==0) && + (rootNav->type().isEmpty() || g_compoundKeywordDict.find(rootNav->type())==0) && ( (rootNav->section()==Entry::VARIABLE_SEC // it's a variable ) || @@ -2821,12 +2821,12 @@ static void buildFunctionList(EntryNav *rootNav) QCString rname = removeRedundantWhiteSpace(root->name); //printf("rname=%s\n",rname.data()); - if (!rname.isEmpty()) + QCString scope=rootNav->parent()->name(); //stripAnonymousNamespaceScope(root->parent->name); + if (!rname.isEmpty() && scope.find('@')==-1) { ClassDef *cd=0; // check if this function's parent is a class - QCString scope=rootNav->parent()->name(); //stripAnonymousNamespaceScope(root->parent->name); scope=stripTemplateSpecifiersFromScope(scope,FALSE); FileDef *rfd=rootNav->fileDef(); @@ -3042,7 +3042,8 @@ static void buildFunctionList(EntryNav *rootNav) // the name already (in that case nd should be non-zero already) if (nd==0 && rootNav->parent()->section() == Entry::NAMESPACE_SEC ) { - QCString nscope=removeAnonymousScopes(rootNav->parent()->name()); + //QCString nscope=removeAnonymousScopes(rootNav->parent()->name()); + QCString nscope=rootNav->parent()->name(); if (!nscope.isEmpty()) { nd = getResolvedNamespace(nscope); @@ -3845,7 +3846,7 @@ static void findBaseClassesForClass( BaseInfo *bi=0; for (bii.toFirst();(bi=bii.current());++bii) { - //printf("masterCd=%s bi->name=%s #actualArgs=%d\n", + //printf("masterCd=%s bi->name='%s' #actualArgs=%d\n", // masterCd->localName().data(),bi->name.data(),actualArgs?(int)actualArgs->count():-1); bool delTempNames=FALSE; if (templateNames==0) @@ -3924,7 +3925,7 @@ static bool findTemplateInstanceRelation(Entry *root, // search for new template instances caused by base classes of // instanceClass - EntryNav *templateRootNav = classEntries.find(templateClass->name()); + EntryNav *templateRootNav = g_classEntries.find(templateClass->name()); if (templateRootNav) { bool unloadNeeded=FALSE; @@ -4225,7 +4226,8 @@ static bool findClassRelation( } bool isATemplateArgument = templateNames!=0 && templateNames->find(biName)!=0; // make templSpec canonical - templSpec = getCanonicalTemplateSpec(cd, cd->getFileDef(), templSpec); + // Warning: the following line doesn't work for Mixin classes (see bug 560623) + // templSpec = getCanonicalTemplateSpec(cd, cd->getFileDef(), templSpec); //printf("3. found=%d\n",found); if (found) @@ -4378,7 +4380,7 @@ static void findClassEntries(EntryNav *rootNav) { if (isClassSection(rootNav)) { - classEntries.insert(rootNav->name(),rootNav); + g_classEntries.insert(rootNav->name(),rootNav); } RECURSE_ENTRYTREE(findClassEntries,rootNav); } @@ -4392,7 +4394,7 @@ static void findInheritedTemplateInstances() { ClassSDict::Iterator cli(*Doxygen::classSDict); for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE; - QDictIterator<EntryNav> edi(classEntries); + QDictIterator<EntryNav> edi(g_classEntries); EntryNav *rootNav; for (;(rootNav=edi.current());++edi) { @@ -4415,7 +4417,7 @@ static void findUsedTemplateInstances() { ClassSDict::Iterator cli(*Doxygen::classSDict); for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE; - QDictIterator<EntryNav> edi(classEntries); + QDictIterator<EntryNav> edi(g_classEntries); EntryNav *rootNav; for (;(rootNav=edi.current());++edi) { @@ -4437,7 +4439,7 @@ static void computeClassRelations() { ClassSDict::Iterator cli(*Doxygen::classSDict); for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE; - QDictIterator<EntryNav> edi(classEntries); + QDictIterator<EntryNav> edi(g_classEntries); EntryNav *rootNav; for (;(rootNav=edi.current());++edi) { @@ -4476,7 +4478,7 @@ static void computeClassRelations() static void computeTemplateClassRelations() { - QDictIterator<EntryNav> edi(classEntries); + QDictIterator<EntryNav> edi(g_classEntries); EntryNav *rootNav; for (;(rootNav=edi.current());++edi) { @@ -4901,7 +4903,7 @@ static bool findGlobalMember(EntryNav *rootNav, FileDef *fd=rootNav->fileDef(); //printf("File %s\n",fd ? fd->name().data() : "<none>"); - NamespaceSDict *nl = fd ? fd->getUsedNamespaces() : 0; + NamespaceSDict *nl = fd ? fd->getUsedNamespaces() : 0; //SDict<Definition> *cl = fd ? fd->getUsedClasses() : 0; //printf("NamespaceList %p\n",nl); @@ -5007,9 +5009,8 @@ static QCString substituteTemplatesInString( ) { QCString dst; - QRegExp re(idMask); + QRegExp re( "[A-Za-z_][A-Za-z_0-9]*"); //printf("type=%s\n",sa->type.data()); - int i,p=0,l; while ((i=re.match(src,p,&l))!=-1) // for each word in srcType { @@ -5294,7 +5295,9 @@ static void findMember(EntryNav *rootNav, //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n", // scopeName.data(),className.data(),namespaceName.data()); - namespaceName=removeAnonymousScopes(namespaceName); + //namespaceName=removeAnonymousScopes(namespaceName); + if (namespaceName.find('@')!=-1) return; // skip stuff in anonymous namespace... + //printf("namespaceName=`%s' className=`%s'\n",namespaceName.data(),className.data()); // merge class and namespace scopes again scopeName.resize(0); @@ -6104,7 +6107,7 @@ static void filterMemberDocumentation(EntryNav *rootNav) || (root->section==Entry::VARIABLE_SEC && // variable !root->type.isEmpty() && // with a type - compoundKeywordDict.find(root->type)==0 // that is not a keyword + g_compoundKeywordDict.find(root->type)==0 // that is not a keyword // (to skip forward declaration of class etc.) ) ) @@ -6552,14 +6555,33 @@ static void addEnumValuesToEnums(EntryNav *rootNav) ) ) { - // For C# enum value are only inside the enum scope, so we - // must create them here + // Unlike C++, for C# enum value are only inside the enum + // scope, so we must create them here and only add them to the + // enum e->loadEntry(g_storage); - MemberDef *fmd = addVariableToFile(e,MemberDef::EnumValue, - md->getOuterScope() ? md->getOuterScope()->name() : QCString(), - e->name(),FALSE,0); - md->insertEnumField(fmd); - fmd->setEnumScope(md); + Entry *root = e->entry(); + MemberDef *fmd=new MemberDef( + root->fileName,root->startLine, + root->type,root->name,root->args,0, + Public, Normal,root->stat,Member, + MemberDef::EnumValue,0,0); + if (md->getClassDef()) fmd->setMemberClass(md->getClassDef()); + else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef()); + else if (md->getFileDef()) fmd->setFileDef(md->getFileDef()); + fmd->setOuterScope(md->getOuterScope()); + fmd->setTagInfo(e->tagInfo()); + fmd->setDocumentation(root->doc,root->docFile,root->docLine); + fmd->setBriefDescription(root->brief,root->briefFile,root->briefLine); + fmd->addSectionsToDefinition(root->anchors); + fmd->setInitializer(root->initializer); + fmd->setMaxInitLines(root->initLines); + fmd->setMemberGroupId(root->mGrpId); + fmd->setExplicitExternal(root->explicitExternal); + if (fmd) + { + md->insertEnumField(fmd); + fmd->setEnumScope(md); + } e->releaseEntry(); } else @@ -7024,7 +7046,7 @@ static void generateFileSources() if (fd->generateSourceFile()) // sources need to be shown in the output { msg("Generating code for file %s...\n",fd->docName().data()); - fd->writeSource(*outputList); + fd->writeSource(*g_outputList); } else if (!fd->isReference() && Doxygen::parseSourcesNeeded) // we needed to parse the sources even if we do not show them @@ -7057,7 +7079,7 @@ static void generateFileDocs() if (doc) { msg("Generating docs for file %s...\n",fd->docName().data()); - fd->writeDocumentation(*outputList); + fd->writeDocumentation(*g_outputList); } } } @@ -7163,11 +7185,11 @@ static void generateClassList(ClassSDict &classSDict) { msg("Generating docs for compound %s...\n",cd->name().data()); - cd->writeDocumentation(*outputList); - cd->writeMemberList(*outputList); + cd->writeDocumentation(*g_outputList); + cd->writeMemberList(*g_outputList); } // even for undocumented classes, the inner classes can be documented. - cd->writeDocumentationForInnerClasses(*outputList); + cd->writeDocumentationForInnerClasses(*g_outputList); } } } @@ -7185,19 +7207,19 @@ static void generateClassDocs() } msg("Generating annotated compound index...\n"); - writeAnnotatedIndex(*outputList); + writeAnnotatedIndex(*g_outputList); //if (Config_getBool("ALPHABETICAL_INDEX")) //{ msg("Generating alphabetical compound index...\n"); - writeAlphabeticalIndex(*outputList); + writeAlphabeticalIndex(*g_outputList); //} msg("Generating hierarchical class index...\n"); - writeHierarchicalIndex(*outputList); + writeHierarchicalIndex(*g_outputList); msg("Generating member index...\n"); - writeClassMemberIndex(*outputList); + writeClassMemberIndex(*g_outputList); if (Doxygen::exampleSDict->count()>0) { @@ -7742,7 +7764,7 @@ static void findMainPage(EntryNav *rootNav) QCString title=root->args.stripWhiteSpace(); QCString indexName=usingTreeIndex()?"main":"index"; Doxygen::mainPage = new PageDef(root->fileName,root->startLine, - indexName, root->brief+root->doc,title); + indexName, root->brief+root->doc+root->inbodyDocs,title); //setFileNameForSections(root->anchors,"index",Doxygen::mainPage); Doxygen::mainPage->setFileName(indexName); addPageToContext(Doxygen::mainPage,rootNav); @@ -7910,7 +7932,7 @@ static void generatePageDocs() { msg("Generating docs for page %s...\n",pd->name().data()); Doxygen::insideMainPage=TRUE; - pd->writeDocumentation(*outputList); + pd->writeDocumentation(*g_outputList); Doxygen::insideMainPage=FALSE; } } @@ -7937,7 +7959,7 @@ static void buildExampleList(EntryNav *rootNav) else { PageDef *pd=new PageDef(root->fileName,root->startLine, - root->name,root->brief+root->doc,root->args); + root->name,root->brief+root->doc+root->inbodyDocs,root->args); pd->setFileName(convertNameToFile(pd->name()+"-example")); pd->addSectionsToDefinition(root->anchors); //pi->addSections(root->anchors); @@ -7976,7 +7998,7 @@ void printNavTree(EntryNav *rootNav,int indent) static void generateExampleDocs() { - outputList->disable(OutputGenerator::Man); + g_outputList->disable(OutputGenerator::Man); PageSDict::Iterator pdi(*Doxygen::exampleSDict); PageDef *pd=0; for (pdi.toFirst();(pd=pdi.current());++pdi) @@ -7984,11 +8006,11 @@ static void generateExampleDocs() msg("Generating docs for example %s...\n",pd->name().data()); resetCCodeParserState(); QCString n=pd->getOutputFileBase(); - startFile(*outputList,n,n,pd->name()); - startTitle(*outputList,n); - outputList->docify(pd->name()); - endTitle(*outputList,n,0); - outputList->parseDoc(pd->docFile(), // file + startFile(*g_outputList,n,n,pd->name()); + startTitle(*g_outputList,n); + g_outputList->docify(pd->name()); + endTitle(*g_outputList,n,0); + g_outputList->parseDoc(pd->docFile(), // file pd->docLine(), // startLine pd, // context 0, // memberDef @@ -7997,9 +8019,9 @@ static void generateExampleDocs() TRUE, // is example pd->name() ); - endFile(*outputList); + endFile(*g_outputList); } - outputList->enable(OutputGenerator::Man); + g_outputList->enable(OutputGenerator::Man); } //---------------------------------------------------------------------------- @@ -8013,7 +8035,7 @@ static void generateGroupDocs() { if (!gd->isReference()) { - gd->writeDocumentation(*outputList); + gd->writeDocumentation(*g_outputList); } } } @@ -8022,7 +8044,7 @@ static void generateGroupDocs() //static void generatePackageDocs() //{ -// writePackageIndex(*outputList); +// writePackageIndex(*g_outputList); // // if (Doxygen::packageDict.count()>0) // { @@ -8030,7 +8052,7 @@ static void generateGroupDocs() // PackageDef *pd; // for (pdi.toFirst();(pd=pdi.current());++pdi) // { -// pd->writeDocumentation(*outputList); +// pd->writeDocumentation(*g_outputList); // } // } //} @@ -8040,7 +8062,7 @@ static void generateGroupDocs() static void generateNamespaceDocs() { - writeNamespaceIndex(*outputList); + writeNamespaceIndex(*g_outputList); NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); NamespaceDef *nd; @@ -8051,7 +8073,7 @@ static void generateNamespaceDocs() if (nd->isLinkableInProject()) { msg("Generating docs for namespace %s\n",nd->name().data()); - nd->writeDocumentation(*outputList); + nd->writeDocumentation(*g_outputList); } // for each class in the namespace... @@ -8068,10 +8090,10 @@ static void generateNamespaceDocs() { msg("Generating docs for compound %s...\n",cd->name().data()); - cd->writeDocumentation(*outputList); - cd->writeMemberList(*outputList); + cd->writeDocumentation(*g_outputList); + cd->writeMemberList(*g_outputList); } - cd->writeDocumentationForInnerClasses(*outputList); + cd->writeDocumentationForInnerClasses(*g_outputList); } } } @@ -8201,14 +8223,14 @@ static QCString fixSlashes(QCString &s) // { // err("Error: Cannot open file %s for writing\n",fileName.data()); // } -// //outputList->generateExternalIndex(); -// outputList->pushGeneratorState(); -// outputList->disableAllBut(OutputGenerator::Html); -// startFile(*outputList,"header"+Doxygen::htmlFileExtension,0,"Search Engine",TRUE); -// outputList->endPlainFile(); -// outputList->startPlainFile("footer"+Doxygen::htmlFileExtension); -// endFile(*outputList,TRUE); -// outputList->popGeneratorState(); +// //g_outputList->generateExternalIndex(); +// g_outputList->pushGeneratorState(); +// g_outputList->disableAllBut(OutputGenerator::Html); +// startFile(*g_outputList,"header"+Doxygen::htmlFileExtension,0,"Search Engine",TRUE); +// g_outputList->endPlainFile(); +// g_outputList->startPlainFile("footer"+Doxygen::htmlFileExtension); +// endFile(*g_outputList,TRUE); +// g_outputList->popGeneratorState(); // } //} @@ -8513,7 +8535,7 @@ static void parseFiles(Entry *root,EntryNav *rootNav) } } - QCString *s=inputFiles.first(); + QCString *s=g_inputFiles.first(); while (s) { QCString fileName=*s; @@ -8561,10 +8583,65 @@ static void parseFiles(Entry *root,EntryNav *rootNav) ASSERT(fd!=0); root->createNavigationIndex(rootNav,g_storage,fd); - s=inputFiles.next(); + s=g_inputFiles.next(); } } +// resolves a path that may include symlinks, if a recursive symlink is +// found an empty string is returned. +static QCString resolveSymlink(QCString path) +{ + int sepPos=0; + QFileInfo fi; + QDict<void> nonSymlinks; + QDict<void> known; + QCString result = path; + do + { +#ifdef WIN32 + // UNC path, skip server and share name + if (sepPos==0 && (result.left(2)=="//" || result.left(2)=="\\\\")) + sepPos = result.find('/',2); + if (sepPos!=-1) + sepPos = result.find('/',sepPos+1); +#else + sepPos = result.find('/',sepPos+1); +#endif + QCString prefix = sepPos==-1 ? result : result.left(sepPos); + if (nonSymlinks.find(prefix)==0) + { + fi.setFile(prefix); + if (fi.isSymLink()) + { + QString target = fi.readLink(); + if (QFileInfo(target).isRelative()) + { + target = QDir::cleanDirPath(prefix+"/"+target.data()); + } + if (sepPos!=-1) + { + if (fi.isDir() && target.length()>0 && target.at(target.length()-1)!='/') + { + target+='/'; + } + target+=result.mid(sepPos); + } + result = QDir::cleanDirPath(target).data(); + sepPos = 0; + if (known.find(result)) return QCString(); // recursive symlink! + known.insert(result,(void*)0x8); + } + else + { + nonSymlinks.insert(prefix,(void*)0x8); + } + } + } + while (sepPos!=-1); + return QDir::cleanDirPath(result).data(); +} + +static QDict<void> g_pathsVisited(1009); //---------------------------------------------------------------------------- // Read all files matching at least one pattern in `patList' in the @@ -8585,7 +8662,15 @@ int readDir(QFileInfo *fi, QDict<void> *killDict ) { - QDir dir((const char *)fi->absFilePath()); + QString dirName = fi->absFilePath(); + if (fi->isSymLink()) + { + dirName = resolveSymlink(dirName.data()); + if (dirName.isEmpty()) return 0; // recusive symlink + if (g_pathsVisited.find(dirName)) return 0; // already visited path + g_pathsVisited.insert(dirName,(void*)0x8); + } + QDir dir(dirName); dir.setFilter( QDir::Files | QDir::Dirs | QDir::Hidden ); int totalSize=0; msg("Searching for files in directory %s\n", fi->absFilePath().data()); @@ -9001,6 +9086,40 @@ void initDoxygen() initClassMemberIndices(); initNamespaceMemberIndices(); initFileMemberIndices(); + + Doxygen::symbolMap = new QDict<DefinitionIntf>(1000); + Doxygen::inputNameList = new FileNameList; + Doxygen::inputNameList->setAutoDelete(TRUE); + Doxygen::memberNameSDict = new MemberNameSDict(10000); + Doxygen::memberNameSDict->setAutoDelete(TRUE); + Doxygen::functionNameSDict = new MemberNameSDict(10000); + Doxygen::functionNameSDict->setAutoDelete(TRUE); + Doxygen::groupSDict = new GroupSDict(17); + Doxygen::groupSDict->setAutoDelete(TRUE); + Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>"); + Doxygen::namespaceSDict = new NamespaceSDict(20); + Doxygen::namespaceSDict->setAutoDelete(TRUE); + Doxygen::classSDict = new ClassSDict(1009); + Doxygen::classSDict->setAutoDelete(TRUE); + Doxygen::hiddenClasses = new ClassSDict(257); + Doxygen::hiddenClasses->setAutoDelete(TRUE); + Doxygen::directories = new DirSDict(17); + Doxygen::directories->setAutoDelete(TRUE); + Doxygen::pageSDict = new PageSDict(1009); // all doc pages + Doxygen::pageSDict->setAutoDelete(TRUE); + Doxygen::exampleSDict = new PageSDict(1009); // all examples + Doxygen::exampleSDict->setAutoDelete(TRUE); + Doxygen::inputNameDict = new FileNameDict(10007); + Doxygen::includeNameDict = new FileNameDict(10007); + Doxygen::exampleNameDict = new FileNameDict(1009); + Doxygen::exampleNameDict->setAutoDelete(TRUE); + Doxygen::imageNameDict = new FileNameDict(257); + Doxygen::dotFileNameDict = new FileNameDict(257); + Doxygen::sectionDict.setAutoDelete(TRUE); + Doxygen::memGrpInfoDict.setAutoDelete(TRUE); + Doxygen::tagDestinationDict.setAutoDelete(TRUE); + Doxygen::lookupCache.setAutoDelete(TRUE); + Doxygen::dirRelations.setAutoDelete(TRUE); } void cleanUpDoxygen() @@ -9018,7 +9137,7 @@ void cleanUpDoxygen() delete Doxygen::parserManager; cleanUpPreprocessor(); delete theTranslator; - delete outputList; + delete g_outputList; Mappers::freeMappers(); codeFreeScanner(); @@ -9368,6 +9487,7 @@ void readConfiguration(int argc, char **argv) } +/** check and resolve config options */ void checkConfiguration() { @@ -9376,7 +9496,11 @@ void checkConfiguration() Config::instance()->check(); initWarningFormat(); +} +/** adjust globals that depend on configuration settings. */ +void adjustConfiguration() +{ QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE"); if (!setTranslator(outputLanguage)) { @@ -9403,7 +9527,56 @@ void checkConfiguration() Config_getBool("REFERENCES_RELATION") || Config_getBool("REFERENCED_BY_RELATION"); + /************************************************************************** + * Add custom extension mappings + **************************************************************************/ + QStrList &extMaps = Config_getList("EXTENSION_MAPPING"); + char *mapping = extMaps.first(); + while (mapping) + { + QCString mapStr = mapping; + int i; + if ((i=mapStr.find('='))!=-1) + { + QCString ext=mapStr.left(i).stripWhiteSpace().lower(); + QCString language=mapStr.mid(i+1).stripWhiteSpace().lower(); + if (!updateLanguageMapping(ext,language)) + { + err("Failed to map file extension '%s' to unsupported language '%s'.\n" + "Check the EXTENSION_MAPPING setting in the config file.\n", + ext.data(),language.data()); + } + else + { + msg("Adding custom extension mapping: .%s will be treated as language %s\n", + ext.data(),language.data()); + } + } + mapping = extMaps.next(); + } + + + // add predefined macro name to a dictionary + QStrList &expandAsDefinedList =Config_getList("EXPAND_AS_DEFINED"); + s=expandAsDefinedList.first(); + while (s) + { + if (Doxygen::expandAsDefinedDict[s]==0) + { + Doxygen::expandAsDefinedDict.insert(s,(void *)666); + } + s=expandAsDefinedList.next(); + } + + // read aliases and store them in a dictionary + readAliases(); + + // store number of spaces in a tab into Doxygen::spaces + int &tabSize = Config_getInt("TAB_SIZE"); + Doxygen::spaces.resize(tabSize+1); + int sp;for (sp=0;sp<tabSize;sp++) Doxygen::spaces.at(sp)=' '; + Doxygen::spaces.at(tabSize)='\0'; } #ifdef HAS_SIGNALS @@ -9481,39 +9654,113 @@ static QCString getQchFileName() + QCString(".qch"); } -void parseInput() +void searchInputFiles(StringList &inputFiles) { - atexit(exitDoxygen); + QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS"); + bool alwaysRecursive = Config_getBool("RECURSIVE"); + StringDict excludeNameDict(1009); + excludeNameDict.setAutoDelete(TRUE); + + // gather names of all files in the include path + msg("Searching for include files...\n"); + QStrList &includePathList = Config_getList("INCLUDE_PATH"); + char *s=includePathList.first(); + while (s) + { + QStrList &pl = Config_getList("INCLUDE_FILE_PATTERNS"); + if (pl.count()==0) + { + pl = Config_getList("FILE_PATTERNS"); + } + readFileOrDirectory(s,0,Doxygen::includeNameDict,0,&pl, + &exclPatterns,0,0, + alwaysRecursive); + s=includePathList.next(); + } + + msg("Searching for example files...\n"); + QStrList &examplePathList = Config_getList("EXAMPLE_PATH"); + s=examplePathList.first(); + while (s) + { + readFileOrDirectory(s,0,Doxygen::exampleNameDict,0, + &Config_getList("EXAMPLE_PATTERNS"), + 0,0,0, + (alwaysRecursive || Config_getBool("EXAMPLE_RECURSIVE"))); + s=examplePathList.next(); + } + + msg("Searching for images...\n"); + QStrList &imagePathList=Config_getList("IMAGE_PATH"); + s=imagePathList.first(); + while (s) + { + readFileOrDirectory(s,0,Doxygen::imageNameDict,0,0, + 0,0,0, + alwaysRecursive); + s=imagePathList.next(); + } + + msg("Searching for dot files...\n"); + QStrList &dotFileList=Config_getList("DOTFILE_DIRS"); + s=dotFileList.first(); + while (s) + { + readFileOrDirectory(s,0,Doxygen::dotFileNameDict,0,0, + 0,0,0, + alwaysRecursive); + s=dotFileList.next(); + } + + msg("Searching for files to exclude\n"); + QStrList &excludeList = Config_getList("EXCLUDE"); + s=excludeList.first(); + while (s) + { + readFileOrDirectory(s,0,0,0,&Config_getList("FILE_PATTERNS"), + 0,0,&excludeNameDict, + alwaysRecursive, + FALSE); + s=excludeList.next(); + } /************************************************************************** - * Add custom extension mappings + * Determine Input Files * **************************************************************************/ - QStrList &extMaps = Config_getList("EXTENSION_MAPPING"); - char *mapping = extMaps.first(); - while (mapping) + msg("Searching for files to process...\n"); + QDict<void> *killDict = new QDict<void>(10007); + int inputSize=0; + QStrList &inputList=Config_getList("INPUT"); + inputFiles.setAutoDelete(TRUE); + s=inputList.first(); + while (s) { - QCString mapStr = mapping; - int i; - if ((i=mapStr.find('='))!=-1) - { - QCString ext=mapStr.left(i).stripWhiteSpace().lower(); - QCString language=mapStr.mid(i+1).stripWhiteSpace().lower(); - if (!updateLanguageMapping(ext,language)) - { - err("Failed to map file extension '%s' to unsupported language '%s'.\n" - "Check the EXTENSION_MAPPING setting in the config file.\n", - ext.data(),language.data()); - } - else - { - msg("Adding custom extension mapping: .%s will be treated as language %s\n", - ext.data(),language.data()); - } - } - mapping = extMaps.next(); + QCString path=s; + uint l = path.length(); + // strip trailing slashes + if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1); + + inputSize+=readFileOrDirectory( + path, + Doxygen::inputNameList, + Doxygen::inputNameDict, + &excludeNameDict, + &Config_getList("FILE_PATTERNS"), + &exclPatterns, + &inputFiles,0, + alwaysRecursive, + TRUE, + killDict); + s=inputList.next(); } + delete killDict; +} + +void parseInput() +{ + atexit(exitDoxygen); /************************************************************************** @@ -9551,7 +9798,6 @@ void parseInput() * Initialize global lists and dictionaries **************************************************************************/ - Doxygen::symbolMap = new QDict<DefinitionIntf>(1000); int cacheSize = Config_getInt("SYMBOL_CACHE_SIZE"); if (cacheSize<0) cacheSize=0; if (cacheSize>9) cacheSize=9; @@ -9575,58 +9821,19 @@ void parseInput() exit(1); } - Doxygen::inputNameList = new FileNameList; - Doxygen::inputNameList->setAutoDelete(TRUE); - Doxygen::memberNameSDict = new MemberNameSDict(10000); - Doxygen::memberNameSDict->setAutoDelete(TRUE); - Doxygen::functionNameSDict = new MemberNameSDict(10000); - Doxygen::functionNameSDict->setAutoDelete(TRUE); - Doxygen::groupSDict = new GroupSDict(17); - Doxygen::groupSDict->setAutoDelete(TRUE); - Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>"); - Doxygen::namespaceSDict = new NamespaceSDict(20); - Doxygen::namespaceSDict->setAutoDelete(TRUE); - Doxygen::classSDict = new ClassSDict(1009); - Doxygen::classSDict->setAutoDelete(TRUE); - Doxygen::hiddenClasses = new ClassSDict(257); - Doxygen::hiddenClasses->setAutoDelete(TRUE); - Doxygen::directories = new DirSDict(17); - Doxygen::directories->setAutoDelete(TRUE); - Doxygen::pageSDict = new PageSDict(1009); // all doc pages - Doxygen::pageSDict->setAutoDelete(TRUE); - Doxygen::exampleSDict = new PageSDict(1009); // all examples - Doxygen::exampleSDict->setAutoDelete(TRUE); - Doxygen::inputNameDict = new FileNameDict(10007); - Doxygen::includeNameDict = new FileNameDict(10007); - Doxygen::exampleNameDict = new FileNameDict(1009); - Doxygen::exampleNameDict->setAutoDelete(TRUE); - Doxygen::imageNameDict = new FileNameDict(257); - Doxygen::dotFileNameDict = new FileNameDict(257); - Doxygen::sectionDict.setAutoDelete(TRUE); - Doxygen::memGrpInfoDict.setAutoDelete(TRUE); - Doxygen::tagDestinationDict.setAutoDelete(TRUE); - Doxygen::lookupCache.setAutoDelete(TRUE); - Doxygen::dirRelations.setAutoDelete(TRUE); - excludeNameDict.setAutoDelete(TRUE); /************************************************************************** * Initialize some global constants **************************************************************************/ - int &tabSize = Config_getInt("TAB_SIZE"); - spaces.resize(tabSize+1); - int sp;for (sp=0;sp<tabSize;sp++) spaces.at(sp)=' '; - spaces.at(tabSize)='\0'; - - compoundKeywordDict.insert("template class",(void *)8); - compoundKeywordDict.insert("template struct",(void *)8); - compoundKeywordDict.insert("class",(void *)8); - compoundKeywordDict.insert("struct",(void *)8); - compoundKeywordDict.insert("union",(void *)8); - compoundKeywordDict.insert("interface",(void *)8); - compoundKeywordDict.insert("exception",(void *)8); + g_compoundKeywordDict.insert("template class",(void *)8); + g_compoundKeywordDict.insert("template struct",(void *)8); + g_compoundKeywordDict.insert("class",(void *)8); + g_compoundKeywordDict.insert("struct",(void *)8); + g_compoundKeywordDict.insert("union",(void *)8); + g_compoundKeywordDict.insert("interface",(void *)8); + g_compoundKeywordDict.insert("exception",(void *)8); - bool alwaysRecursive = Config_getBool("RECURSIVE"); /************************************************************************** * Check/create output directorties * @@ -9686,124 +9893,16 @@ void parseInput() * Read and preprocess input * **************************************************************************/ - QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS"); // prevent search in the output directories + QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS"); if (generateHtml) exclPatterns.append(htmlOutput); if (generateXml) exclPatterns.append(xmlOutput); if (generateLatex) exclPatterns.append(latexOutput); if (generateRtf) exclPatterns.append(rtfOutput); if (generateMan) exclPatterns.append(manOutput); - // gather names of all files in the include path - msg("Searching for include files...\n"); - QStrList &includePathList = Config_getList("INCLUDE_PATH"); - char *s=includePathList.first(); - while (s) - { - QStrList &pl = Config_getList("INCLUDE_FILE_PATTERNS"); - if (pl.count()==0) - { - pl = Config_getList("FILE_PATTERNS"); - } - readFileOrDirectory(s,0,Doxygen::includeNameDict,0,&pl, - &exclPatterns,0,0, - alwaysRecursive); - s=includePathList.next(); - } - - msg("Searching for example files...\n"); - QStrList &examplePathList = Config_getList("EXAMPLE_PATH"); - s=examplePathList.first(); - while (s) - { - readFileOrDirectory(s,0,Doxygen::exampleNameDict,0, - &Config_getList("EXAMPLE_PATTERNS"), - 0,0,0, - (alwaysRecursive || Config_getBool("EXAMPLE_RECURSIVE"))); - s=examplePathList.next(); - } - - msg("Searching for images...\n"); - QStrList &imagePathList=Config_getList("IMAGE_PATH"); - s=imagePathList.first(); - while (s) - { - readFileOrDirectory(s,0,Doxygen::imageNameDict,0,0, - 0,0,0, - alwaysRecursive); - s=imagePathList.next(); - } - - msg("Searching for dot files...\n"); - QStrList &dotFileList=Config_getList("DOTFILE_DIRS"); - s=dotFileList.first(); - while (s) - { - readFileOrDirectory(s,0,Doxygen::dotFileNameDict,0,0, - 0,0,0, - alwaysRecursive); - s=dotFileList.next(); - } - - msg("Searching for files to exclude\n"); - QStrList &excludeList = Config_getList("EXCLUDE"); - s=excludeList.first(); - while (s) - { - readFileOrDirectory(s,0,0,0,&Config_getList("FILE_PATTERNS"), - 0,0,&excludeNameDict, - alwaysRecursive, - FALSE); - s=excludeList.next(); - } - - /************************************************************************** - * Determine Input Files * - **************************************************************************/ - - msg("Searching for files to process...\n"); - QDict<void> *killDict = new QDict<void>(10007); - int inputSize=0; - QStrList &inputList=Config_getList("INPUT"); - inputFiles.setAutoDelete(TRUE); - s=inputList.first(); - while (s) - { - QCString path=s; - uint l = path.length(); - // strip trailing slashes - if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1); - - inputSize+=readFileOrDirectory( - path, - Doxygen::inputNameList, - Doxygen::inputNameDict, - &excludeNameDict, - &Config_getList("FILE_PATTERNS"), - &exclPatterns, - &inputFiles,0, - alwaysRecursive, - TRUE, - killDict); - s=inputList.next(); - } - delete killDict; - - // add predefined macro name to a dictionary - QStrList &expandAsDefinedList =Config_getList("EXPAND_AS_DEFINED"); - s=expandAsDefinedList.first(); - while (s) - { - if (Doxygen::expandAsDefinedDict[s]==0) - { - Doxygen::expandAsDefinedDict.insert(s,(void *)666); - } - s=expandAsDefinedList.next(); - } - - // read aliases and store them in a dictionary - readAliases(); + searchInputFiles(g_inputFiles); // Notice: the order of the function calls below is very important! @@ -9830,7 +9929,7 @@ void parseInput() msg("Reading and parsing tag files\n"); QStrList &tagFileList = Config_getList("TAGFILES"); - s=tagFileList.first(); + char *s=tagFileList.first(); while (s) { readTagFile(root,s); @@ -9888,9 +9987,6 @@ void parseInput() buildFileList(rootNav); //generateFileTree(); - msg("Searching for included using directives...\n"); - findIncludedUsingDirectives(); - msg("Building class list...\n"); buildClassList(rootNav); @@ -9904,16 +10000,12 @@ void parseInput() resolveClassNestingRelations(); // calling buildClassList may result in cached relations that - // become invalid after resolveClassNestingRelation(), that's why + // become invalid after resolveClassNestingRelations(), that's why // we need to clear the cache here Doxygen::lookupCache.clear(); // we don't need the list of using declaration anymore g_usingDeclarations.clear(); - msg("Searching for members imported via using declarations...\n"); - findUsingDeclImports(rootNav); - findUsingDeclarations(rootNav); - msg("Building example list...\n"); buildExampleList(rootNav); @@ -9927,6 +10019,15 @@ void parseInput() msg("Searching for documented typedefs...\n"); buildTypedefList(rootNav); + msg("Searching for members imported via using declarations...\n"); + findUsingDeclImports(rootNav); + // this should be after buildTypedefList in order to properly import + // used typedefs + findUsingDeclarations(rootNav); + + msg("Searching for included using directives...\n"); + findIncludedUsingDirectives(); + msg("Searching for documented variables...\n"); buildVarList(rootNav); @@ -9956,13 +10057,13 @@ void parseInput() flushUnresolvedRelations(); //if (Config_getBool("OPTIMIZE_OUTPUT_VHDL")) //{ - // VhdlDocGen::computeVhdlComponentRelations(classEntries,g_storage); + // VhdlDocGen::computeVhdlComponentRelations(g_classEntries,g_storage); //} //else //{ computeClassRelations(); //} - classEntries.clear(); + g_classEntries.clear(); msg("Add enum values to enums...\n"); addEnumValuesToEnums(rootNav); @@ -10093,10 +10194,10 @@ void generateOutput() initDocParser(); - outputList = new OutputList(TRUE); + g_outputList = new OutputList(TRUE); if (Config_getBool("GENERATE_HTML")) { - outputList->add(new HtmlGenerator); + g_outputList->add(new HtmlGenerator); HtmlGenerator::init(); if (Config_getBool("GENERATE_HTMLHELP")) Doxygen::indexList.addIndex(new HtmlHelp); if (Config_getBool("GENERATE_QHP")) Doxygen::indexList.addIndex(new Qhp); @@ -10116,17 +10217,17 @@ void generateOutput() } if (Config_getBool("GENERATE_LATEX")) { - outputList->add(new LatexGenerator); + g_outputList->add(new LatexGenerator); LatexGenerator::init(); } if (Config_getBool("GENERATE_MAN")) { - outputList->add(new ManGenerator); + g_outputList->add(new ManGenerator); ManGenerator::init(); } if (Config_getBool("GENERATE_RTF")) { - outputList->add(new RTFGenerator); + g_outputList->add(new RTFGenerator); RTFGenerator::init(); } @@ -10171,17 +10272,17 @@ void generateOutput() //printf("writing style info\n"); QCString genString = theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME")); - outputList->writeStyleInfo(0); // write first part - outputList->disableAllBut(OutputGenerator::Latex); - outputList->parseText(genString); - outputList->writeStyleInfo(1); // write second part - //parseText(*outputList,theTranslator->trWrittenBy()); - outputList->writeStyleInfo(2); // write third part - outputList->parseText(genString); - outputList->writeStyleInfo(3); // write fourth part - //parseText(*outputList,theTranslator->trWrittenBy()); - outputList->writeStyleInfo(4); // write last part - outputList->enableAll(); + g_outputList->writeStyleInfo(0); // write first part + g_outputList->disableAllBut(OutputGenerator::Latex); + g_outputList->parseText(genString); + g_outputList->writeStyleInfo(1); // write second part + //parseText(*g_outputList,theTranslator->trWrittenBy()); + g_outputList->writeStyleInfo(2); // write third part + g_outputList->parseText(genString); + g_outputList->writeStyleInfo(3); // write fourth part + //parseText(*g_outputList,theTranslator->trWrittenBy()); + g_outputList->writeStyleInfo(4); // write last part + g_outputList->enableAll(); //statistics(); @@ -10189,10 +10290,10 @@ void generateOutput() // If the result is 0 we do not generate the lists and omit the // corresponding links in the index. msg("Generating index page...\n"); - writeIndex(*outputList); + writeIndex(*g_outputList); msg("Generating page index...\n"); - writePageIndex(*outputList); + writePageIndex(*g_outputList); msg("Generating example documentation...\n"); generateExampleDocs(); @@ -10213,7 +10314,7 @@ void generateOutput() generateGroupDocs(); msg("Generating group index...\n"); - writeGroupIndex(*outputList); + writeGroupIndex(*g_outputList); msg("Generating class documentation...\n"); generateClassDocs(); @@ -10221,41 +10322,41 @@ void generateOutput() if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY")) { msg("Generating graphical class hierarchy...\n"); - writeGraphicalClassHierarchy(*outputList); + writeGraphicalClassHierarchy(*g_outputList); } msg("Generating namespace index...\n"); generateNamespaceDocs(); msg("Generating namespace member index...\n"); - writeNamespaceMemberIndex(*outputList); + writeNamespaceMemberIndex(*g_outputList); if (Config_getBool("GENERATE_LEGEND")) { msg("Generating graph info page...\n"); - writeGraphInfo(*outputList); + writeGraphInfo(*g_outputList); } if (Config_getBool("SHOW_DIRECTORIES")) { msg("Generating directory documentation...\n"); - generateDirDocs(*outputList); + generateDirDocs(*g_outputList); } msg("Generating file index...\n"); - writeFileIndex(*outputList); + writeFileIndex(*g_outputList); if (Config_getBool("SHOW_DIRECTORIES")) { msg("Generating directory index...\n"); - writeDirIndex(*outputList); + writeDirIndex(*g_outputList); } msg("Generating example index...\n"); - writeExampleIndex(*outputList); + writeExampleIndex(*g_outputList); msg("Generating file member index...\n"); - writeFileMemberIndex(*outputList); + writeFileMemberIndex(*g_outputList); //writeDirDependencyGraph(Config_getString("HTML_OUTPUT")); |