summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp3
-rw-r--r--src/classdef.h1
-rw-r--r--src/code.l15
-rw-r--r--src/doxygen.cpp185
-rw-r--r--src/doxygen.h10
-rw-r--r--src/groupdef.cpp12
-rw-r--r--src/groupdef.h8
-rw-r--r--src/htmlgen.cpp15
-rw-r--r--src/index.cpp105
-rw-r--r--src/membergroup.cpp1
-rw-r--r--src/membername.cpp11
-rw-r--r--src/membername.h28
-rw-r--r--src/pre.l7
-rw-r--r--src/scanner.l49
-rw-r--r--src/sortdict.h8
-rw-r--r--src/util.cpp21
16 files changed, 318 insertions, 161 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 511aa7b..69d15ca 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -1192,7 +1192,10 @@ void ClassDef::writeDocumentation(OutputList &ol)
endFile(ol);
+}
+void ClassDef::writeDocumentationForInnerClasses(OutputList &ol)
+{
// write inner classes after the parent, so the tag files contain
// the definition in proper order!
if (m_innerClasses)
diff --git a/src/classdef.h b/src/classdef.h
index 95450c3..5756c9f 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -100,6 +100,7 @@ class ClassDef : public Definition
MemberNameInfoSDict *memberNameInfoSDict() { return m_allMemberNameInfoSDict; }
void writeDocumentation(OutputList &ol);
+ void writeDocumentationForInnerClasses(OutputList &ol);
void writeMemberList(OutputList &ol);
void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup);
diff --git a/src/code.l b/src/code.l
index a6f0fb1..d5af17f 100644
--- a/src/code.l
+++ b/src/code.l
@@ -21,7 +21,6 @@
* includes
*/
#include <stdio.h>
-//#include <iostream.h>
#include <assert.h>
#include <ctype.h>
#include <qregexp.h>
@@ -33,6 +32,7 @@
#include "message.h"
#include "outputlist.h"
#include "util.h"
+#include "membername.h"
#define YY_NEVER_INTERACTIVE 1
@@ -450,7 +450,7 @@ static void generateClassLink(OutputDocInterface &ol,char *clName,int *clNameLen
else
{
MemberName *mn;
- if (cd==0 && (mn=Doxygen::functionNameDict[clName]))
+ if (cd==0 && (mn=Doxygen::functionNameSDict[clName]))
{
if (mn->count()==1)
{
@@ -557,8 +557,8 @@ static bool getLink(const char *className,
static bool generateClassMemberLink(OutputDocInterface &ol,ClassDef *mcd,const char *memName)
{
- //printf("generateClassMemberLink(%s,%s)\n",mcd->name().data(),memName);
- MemberName *mmn=Doxygen::memberNameDict[memName];
+ //printf("generateClassMemberLink(class=%s,member=%s)\n",mcd->name().data(),memName);
+ MemberName *mmn=Doxygen::memberNameSDict[memName];
if (mmn)
{
MemberNameIterator mmni(*mmn);
@@ -581,6 +581,7 @@ static bool generateClassMemberLink(OutputDocInterface &ol,ClassDef *mcd,const c
// extract class definition of the return type in order to resolve
// a->b()->c() like call chains
g_classVar = stripClassName(xmd->typeString());
+ //printf("g_classVar=%s->%p\n",xmd->typeString(),g_classVar);
// add usage reference
if (g_currentDefinition && g_currentMemberDef &&
@@ -665,7 +666,7 @@ static void generateMemberLink(OutputDocInterface &ol,const char *varName,
if (vcd && vcd->isLinkable())
{
//printf("Found class %s for variable `%s'\n",g_classScope.data(),varName);
- MemberName *vmn=Doxygen::memberNameDict[varName];
+ MemberName *vmn=Doxygen::memberNameSDict[varName];
if (vmn==0)
{
int vi;
@@ -675,7 +676,7 @@ static void generateMemberLink(OutputDocInterface &ol,const char *varName,
{
ClassDef *jcd = getClass(vn.left(vi));
vn=vn.right(vn.length()-vi-2);
- vmn=Doxygen::memberNameDict[vn];
+ vmn=Doxygen::memberNameSDict[vn];
//printf("Trying name `%s' scope=%s\n",vn.data(),scope.data());
if (vmn)
{
@@ -1159,6 +1160,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
BEGIN( MemberCall );
}
<MemberCall>{SCOPETNAME}/{B}*"(" {
+ //printf("g_name=`%s' g_classVar=`%s'\n",g_name.data(),g_classVar?g_classVar->name().data():"<none>");
if (!g_name.isEmpty())
{
generateMemberLink(*g_code,g_name,yytext);
@@ -1190,6 +1192,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
}
<MemberCall>{SCOPENAME}/{B}* {
+ //printf("g_name=`%s' g_classVar=`%s'\n",g_name.data(),g_classVar?g_classVar->name().data():"<none>");
if (!g_name.isEmpty())
{
generateMemberLink(*g_code,g_name,yytext);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 6f9ba95..cebde46 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -72,13 +72,15 @@ ClassSDict Doxygen::hiddenClasses(257);
//NamespaceList Doxygen::namespaceList; // all namespaces
//NamespaceDict Doxygen::namespaceDict(257);
-NamespaceSDict Doxygen::namespaceSDict(17);
+NamespaceSDict Doxygen::namespaceSDict(20);
-MemberNameList Doxygen::memberNameList; // class member + related functions
-MemberNameDict Doxygen::memberNameDict(10007);
+//MemberNameList Doxygen::memberNameList; // class member + related functions
+//MemberNameDict Doxygen::memberNameDict(10007);
+MemberNameSDict Doxygen::memberNameSDict(10000);
-MemberNameList Doxygen::functionNameList; // all global function/namespace members
-MemberNameDict Doxygen::functionNameDict(10007);
+//MemberNameList Doxygen::functionNameList; // all global function/namespace members
+//MemberNameDict Doxygen::functionNameDict(10007);
+MemberNameSDict Doxygen::functionNameSDict(10000);
FileNameList Doxygen::inputNameList; // all input files
FileNameDict *Doxygen::inputNameDict;
@@ -127,14 +129,14 @@ void clearAll()
Doxygen::namespaceSDict.clear();
Doxygen::pageSDict->clear();
Doxygen::exampleSDict->clear();
- Doxygen::memberNameList.clear();
- Doxygen::functionNameList.clear();
+ //Doxygen::memberNameList.clear();
+ //Doxygen::functionNameList.clear();
Doxygen::inputNameList.clear();
Doxygen::groupList.clear();
Doxygen::formulaList.clear();
Doxygen::classSDict.clear();
- Doxygen::memberNameDict.clear();
- Doxygen::functionNameDict.clear();
+ //Doxygen::memberNameDict.clear();
+ //Doxygen::functionNameDict.clear();
Doxygen::sectionDict.clear();
Doxygen::inputNameDict->clear();
Doxygen::includeNameDict->clear();
@@ -161,10 +163,10 @@ void statistics()
Doxygen::imageNameDict->statistics();
fprintf(stderr,"--- dotFileNameDict stats ----\n");
Doxygen::dotFileNameDict->statistics();
- fprintf(stderr,"--- memberNameDict stats ----\n");
- Doxygen::memberNameDict.statistics();
- fprintf(stderr,"--- functionNameDict stats ----\n");
- Doxygen::functionNameDict.statistics();
+ //fprintf(stderr,"--- memberNameDict stats ----\n");
+ //Doxygen::memberNameDict.statistics();
+ //fprintf(stderr,"--- functionNameDict stats ----\n");
+ //Doxygen::functionNameDict.statistics();
fprintf(stderr,"--- excludeNameDict stats ----\n");
excludeNameDict.statistics();
fprintf(stderr,"--- aliasDict stats ----\n");
@@ -1329,7 +1331,7 @@ static MemberDef *addVariableToClass(
// see if the member is already found in the same scope
// (this may be the case for a static member that is initialized
// outside the class)
- MemberName *mn=Doxygen::memberNameDict[name];
+ MemberName *mn=Doxygen::memberNameSDict[name];
if (mn)
{
MemberNameIterator mni(*mn);
@@ -1390,8 +1392,9 @@ static MemberDef *addVariableToClass(
mn = new MemberName(name);
mn->append(md);
//printf("Adding memberName=%s\n",mn->memberName());
- Doxygen::memberNameDict.insert(name,mn);
- Doxygen::memberNameList.append(mn);
+ //Doxygen::memberNameDict.insert(name,mn);
+ //Doxygen::memberNameList.append(mn);
+ Doxygen::memberNameSDict.append(name,mn);
// add the member to the class
}
cd->insertMember(md);
@@ -1469,7 +1472,7 @@ static MemberDef *addVariableToFile(
}
if (def.left(7)=="static ") def=def.right(def.length()-7);
- MemberName *mn=Doxygen::functionNameDict[name];
+ MemberName *mn=Doxygen::functionNameSDict[name];
if (mn)
{
QCString nscope=removeAnonymousScopes(scope);
@@ -1565,8 +1568,9 @@ static MemberDef *addVariableToFile(
{
mn = new MemberName(name);
mn->append(md);
- Doxygen::functionNameDict.insert(name,mn);
- Doxygen::functionNameList.append(mn);
+ //Doxygen::functionNameDict.insert(name,mn);
+ //Doxygen::functionNameList.append(mn);
+ Doxygen::functionNameSDict.append(name,mn);
}
root->section = Entry::EMPTY_SEC;
return md;
@@ -1979,7 +1983,7 @@ static void buildFunctionList(Entry *root)
// add member to the global list of all members
//printf("Adding member=%s class=%s\n",md->name().data(),cd->name().data());
MemberName *mn;
- if ((mn=Doxygen::memberNameDict[name]))
+ if ((mn=Doxygen::memberNameSDict[name]))
{
mn->append(md);
}
@@ -1987,8 +1991,9 @@ static void buildFunctionList(Entry *root)
{
mn = new MemberName(name);
mn->append(md);
- Doxygen::memberNameDict.insert(name,mn);
- Doxygen::memberNameList.append(mn);
+ //Doxygen::memberNameDict.insert(name,mn);
+ //Doxygen::memberNameList.append(mn);
+ Doxygen::memberNameSDict.append(name,mn);
}
// add member to the class cd
@@ -2016,7 +2021,7 @@ static void buildFunctionList(Entry *root)
bool found=FALSE;
MemberName *mn;
//MemberDef *fmd;
- if ((mn=Doxygen::functionNameDict[rname]))
+ if ((mn=Doxygen::functionNameSDict[rname]))
{
//printf("--> function %s already found!\n",rname.data());
MemberNameIterator mni(*mn);
@@ -2182,7 +2187,7 @@ static void buildFunctionList(Entry *root)
// add member to the list of file members
//printf("Adding member=%s\n",md->name().data());
MemberName *mn;
- if ((mn=Doxygen::functionNameDict[name]))
+ if ((mn=Doxygen::functionNameSDict[name]))
{
mn->append(md);
}
@@ -2190,8 +2195,9 @@ static void buildFunctionList(Entry *root)
{
mn = new MemberName(name);
mn->append(md);
- Doxygen::functionNameDict.insert(name,mn);
- Doxygen::functionNameList.append(mn);
+ //Doxygen::functionNameDict.insert(name,mn);
+ //Doxygen::functionNameList.append(mn);
+ Doxygen::functionNameSDict.append(name,mn);
}
addMemberToGroups(root,md);
root->section = Entry::EMPTY_SEC;
@@ -2225,13 +2231,13 @@ static void buildFunctionList(Entry *root)
static void findFriends()
{
//printf("findFriends()\n");
- MemberNameListIterator fnli(Doxygen::functionNameList);
+ MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
MemberName *fn;
for (;(fn=fnli.current());++fnli) // for each global function name
{
//printf("Function name=`%s'\n",fn->memberName());
MemberName *mn;
- if ((mn=Doxygen::memberNameDict[fn->memberName()]))
+ if ((mn=Doxygen::memberNameSDict[fn->memberName()]))
{ // there are members with the same name
//printf("Function name is also a member name\n");
MemberNameIterator fni(*fn);
@@ -2288,7 +2294,7 @@ static void transferFunctionDocumentation()
//printf("transferFunctionDocumentation()\n");
// find matching function declaration and definitions.
- MemberNameListIterator mnli(Doxygen::functionNameList);
+ MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
MemberName *mn;
for (;(mn=mnli.current());++mnli)
{
@@ -2367,7 +2373,7 @@ static void transferRelatedFunctionDocumentation()
{
// find match between function declaration and definition for
// related functions
- MemberNameListIterator mnli(Doxygen::functionNameList);
+ MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
MemberName *mn;
for (mnli.toFirst();(mn=mnli.current());++mnli)
{
@@ -2378,7 +2384,7 @@ static void transferRelatedFunctionDocumentation()
{
//printf(" Function `%s'\n",md->name().data());
MemberName *rmn;
- if ((rmn=Doxygen::memberNameDict[md->name()])) // check if there is a member with the same name
+ if ((rmn=Doxygen::memberNameSDict[md->name()])) // check if there is a member with the same name
{
//printf(" Member name found\n");
MemberDef *rmd;
@@ -3239,7 +3245,7 @@ static void computeMemberReferences()
static void addClassMemberTodoTestBugReferences(Definition *compound)
{
- MemberNameListIterator mnli(Doxygen::memberNameList);
+ MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
MemberName *mn=0;
for (mnli.toFirst();(mn=mnli.current());++mnli)
{
@@ -3272,7 +3278,7 @@ static void addClassMemberTodoTestBugReferences(Definition *compound)
static void addFileMemberTodoTestBugReferences(Definition *compound)
{
- MemberNameListIterator fnli(Doxygen::functionNameList);
+ MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
MemberName *mn=0;
for (fnli.toFirst();(mn=fnli.current());++fnli)
{
@@ -3305,7 +3311,7 @@ static void addFileMemberTodoTestBugReferences(Definition *compound)
static void addTodoTestBugReferences()
{
- MemberNameListIterator mnli(Doxygen::memberNameList);
+ MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
MemberName *mn=0;
for (mnli.toFirst();(mn=mnli.current());++mnli)
{
@@ -3316,7 +3322,7 @@ static void addTodoTestBugReferences()
md->visited=FALSE;
}
}
- MemberNameListIterator fnli(Doxygen::functionNameList);
+ MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
for (fnli.toFirst();(mn=fnli.current());++fnli)
{
MemberNameIterator mni(*mn);
@@ -3606,10 +3612,10 @@ static bool findGlobalMember(Entry *root,
Debug::print(Debug::FindMembers,0,
"2. findGlobalMember(namespace=%s,name=%s,tempArg=%s,decl=%s)\n",
namespaceName.data(),name,tempArg,decl);
- MemberName *mn=Doxygen::functionNameDict[n+tempArg]; // look in function dictionary
+ MemberName *mn=Doxygen::functionNameSDict[n+tempArg]; // look in function dictionary
if (mn==0)
{
- mn=Doxygen::functionNameDict[n]; // try without template arguments
+ mn=Doxygen::functionNameSDict[n]; // try without template arguments
}
if (mn) // function name defined
{
@@ -3897,7 +3903,16 @@ static void findMember(Entry *root,
(root->parent->section&Entry::SCOPE_MASK) &&
!root->parent->name.isEmpty())
{
- scopeName = mergeScopes(root->parent->name,scopeName);
+ QCString joinedName = root->parent->name+"::"+scopeName;
+ if (!scopeName.isEmpty() &&
+ (getClass(joinedName) || Doxygen::namespaceSDict[joinedName]))
+ {
+ scopeName = joinedName;
+ }
+ else
+ {
+ scopeName = mergeScopes(root->parent->name,scopeName);
+ }
}
scopeName=stripTemplateSpecifiersFromScope(
removeRedundantWhiteSpace(scopeName),FALSE);
@@ -4024,11 +4039,11 @@ static void findMember(Entry *root,
"1. funcName=`%s'\n",funcName.data());
if (!funcTempList.isEmpty()) // try with member specialization
{
- mn=Doxygen::memberNameDict[funcName+funcTempList];
+ mn=Doxygen::memberNameSDict[funcName+funcTempList];
}
if (mn==0) // try without specialization
{
- mn=Doxygen::memberNameDict[funcName];
+ mn=Doxygen::memberNameSDict[funcName];
}
if (!isRelated && mn) // function name already found
{
@@ -4275,12 +4290,12 @@ static void findMember(Entry *root,
{
if (className.isEmpty()) className=related.copy();
ClassDef *cd;
- //printf("scopeName=`%s'\n",scopeName.data());
+ //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
if ((cd=getClass(scopeName)))
{
bool newMember=TRUE; // assume we have a new member
bool newMemberName=FALSE;
- if ((mn=Doxygen::memberNameDict[funcName])==0)
+ if ((mn=Doxygen::memberNameSDict[funcName])==0)
{
mn=new MemberName(funcName);
newMemberName=TRUE; // we create a new member name
@@ -4335,7 +4350,7 @@ static void findMember(Entry *root,
bool found=FALSE;
if (root->bodyLine==-1)
{
- MemberName *rmn=Doxygen::functionNameDict[funcName];
+ MemberName *rmn=Doxygen::functionNameSDict[funcName];
if (rmn)
{
MemberDef *rmd=rmn->first();
@@ -4389,8 +4404,9 @@ static void findMember(Entry *root,
//printf("Adding member=%s\n",md->name().data());
if (newMemberName)
{
- Doxygen::memberNameList.append(mn);
- Doxygen::memberNameDict.insert(funcName,mn);
+ //Doxygen::memberNameList.append(mn);
+ //Doxygen::memberNameDict.insert(funcName,mn);
+ Doxygen::memberNameSDict.append(funcName,mn);
}
}
}
@@ -4547,8 +4563,9 @@ static void findEnums(Entry *root)
ClassDef *cd=0;
FileDef *fd=0;
NamespaceDef *nd=0;
- MemberNameDict *mnd=0;
- MemberNameList *mnl=0;
+ //MemberNameDict *mnd=0;
+ //MemberNameList *mnl=0;
+ MemberNameSDict *mnsd=0;
bool isGlobal;
//printf("Found enum with name `%s'\n",root->name.data());
int i;
@@ -4575,22 +4592,25 @@ static void findEnums(Entry *root)
{
//printf("Enum `%s'::`%s'\n",cd->name(),name.data());
fd=0;
- mnd=&Doxygen::memberNameDict;
- mnl=&Doxygen::memberNameList;
+ //mnd=&Doxygen::memberNameDict;
+ //mnl=&Doxygen::memberNameList;
+ mnsd=&Doxygen::memberNameSDict;
isGlobal=FALSE;
}
else if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') // found enum inside namespace
{
- mnd=&Doxygen::functionNameDict;
- mnl=&Doxygen::functionNameList;
+ //mnd=&Doxygen::functionNameDict;
+ //mnl=&Doxygen::functionNameList;
+ mnsd=&Doxygen::functionNameSDict;
isGlobal=TRUE;
}
else // found a global enum
{
bool ambig;
fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- mnd=&Doxygen::functionNameDict;
- mnl=&Doxygen::functionNameList;
+ //mnd=&Doxygen::functionNameDict;
+ //mnl=&Doxygen::functionNameList;
+ mnsd=&Doxygen::functionNameSDict;
isGlobal=TRUE;
}
if (!name.isEmpty())
@@ -4666,7 +4686,7 @@ static void findEnums(Entry *root)
//printf("Adding member=%s\n",md->name().data());
MemberName *mn;
- if ((mn=(*mnd)[name]))
+ if ((mn=(*mnsd)[name]))
{
// this is used if the same enum is in multiple namespaces/classes
mn->append(md);
@@ -4675,8 +4695,9 @@ static void findEnums(Entry *root)
{
mn = new MemberName(name);
mn->append(md);
- mnd->insert(name,mn);
- mnl->append(mn);
+ //mnd->insert(name,mn);
+ //mnl->append(mn);
+ mnsd->append(name,mn);
//printf("add %s to new memberName. Now %d members\n",
// name.data(),mn->count());
}
@@ -4687,7 +4708,7 @@ static void findEnums(Entry *root)
for (;(e=eli.current());++eli)
{
MemberName *fmn=0;
- if (!e->name.isEmpty() && (fmn=(*mnd)[e->name]))
+ if (!e->name.isEmpty() && (fmn=(*mnsd)[e->name]))
// get list of members with the same name as the field
{
MemberNameIterator fmni(*fmn);
@@ -4780,7 +4801,7 @@ static void findEnumDocumentation(Entry *root)
{
//printf("Enum: scope=`%s' name=`%s'\n",cd->name(),name.data());
QCString className=cd->name().copy();
- MemberName *mn=Doxygen::memberNameDict[name];
+ MemberName *mn=Doxygen::memberNameSDict[name];
if (mn)
{
MemberNameIterator mni(*mn);
@@ -4821,7 +4842,7 @@ static void findEnumDocumentation(Entry *root)
else // enum outside class
{
MemberDef *md;
- MemberName *mn=Doxygen::functionNameDict[name];
+ MemberName *mn=Doxygen::functionNameSDict[name];
if (mn && (md=mn->getFirst()))
{
md->setDocumentation(root->doc);
@@ -4850,10 +4871,10 @@ static void findEnumDocumentation(Entry *root)
// seach for each enum (member or function) in mnl if it has documented
// enum values.
-static void findDEV(const MemberNameList &mnl)
+static void findDEV(const MemberNameSDict &mnsd)
{
MemberName *mn;
- MemberNameListIterator mnli(mnl);
+ MemberNameSDict::Iterator mnli(mnsd);
// for each member name
for (mnli.toFirst();(mn=mnli.current());++mnli)
{
@@ -4887,8 +4908,8 @@ static void findDEV(const MemberNameList &mnl)
// values.
static void findDocumentedEnumValues()
{
- findDEV(Doxygen::memberNameList);
- findDEV(Doxygen::functionNameList);
+ findDEV(Doxygen::memberNameSDict);
+ findDEV(Doxygen::functionNameSDict);
}
@@ -4899,7 +4920,7 @@ static void findDocumentedEnumValues()
static void computeMemberRelations()
{
- MemberNameListIterator mnli(Doxygen::memberNameList);
+ MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
MemberName *mn;
for ( ; (mn=mnli.current()) ; ++mnli ) // for each member name
{
@@ -5089,7 +5110,7 @@ static void addSourceReferences()
}
// add source references for member names
- MemberNameListIterator mnli(Doxygen::memberNameList);
+ MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
MemberName *mn=0;
for (mnli.toFirst();(mn=mnli.current());++mnli)
{
@@ -5109,7 +5130,7 @@ static void addSourceReferences()
}
}
}
- MemberNameListIterator fnli(Doxygen::functionNameList);
+ MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
for (fnli.toFirst();(mn=fnli.current());++fnli)
{
MemberNameIterator mni(*mn);
@@ -5187,6 +5208,7 @@ static void generateClassDocs()
cd->writeDocumentation(*outputList);
cd->writeMemberList(*outputList);
}
+ cd->writeDocumentationForInnerClasses(*outputList);
}
}
@@ -5194,7 +5216,7 @@ static void generateClassDocs()
static void inheritDocumentation()
{
- MemberNameListIterator mnli(Doxygen::memberNameList);
+ MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
MemberName *mn;
//int count=0;
for (;(mn=mnli.current());++mnli)
@@ -5326,7 +5348,7 @@ static void findDefineDocumentation(Entry *root)
md->setFileDef(fd);
//printf("Adding member=%s\n",md->name().data());
MemberName *mn;
- if ((mn=Doxygen::functionNameDict[root->name]))
+ if ((mn=Doxygen::functionNameSDict[root->name]))
{
mn->append(md);
}
@@ -5334,11 +5356,12 @@ static void findDefineDocumentation(Entry *root)
{
mn = new MemberName(root->name);
mn->append(md);
- Doxygen::functionNameDict.insert(root->name,mn);
- Doxygen::functionNameList.append(mn);
+ //Doxygen::functionNameDict.insert(root->name,mn);
+ //Doxygen::functionNameList.append(mn);
+ Doxygen::functionNameSDict.append(root->name,mn);
}
}
- MemberName *mn=Doxygen::functionNameDict[root->name];
+ MemberName *mn=Doxygen::functionNameSDict[root->name];
if (mn)
{
int count=0;
@@ -5790,6 +5813,7 @@ static void generateNamespaceDocs()
cd->writeDocumentation(*outputList);
cd->writeMemberList(*outputList);
}
+ cd->writeDocumentationForInnerClasses(*outputList);
}
}
}
@@ -7129,8 +7153,8 @@ void parseInput()
findMainPage(root);
msg("Sorting lists...\n");
- Doxygen::memberNameList.sort();
- Doxygen::functionNameList.sort();
+ Doxygen::memberNameSDict.sort();
+ Doxygen::functionNameSDict.sort();
Doxygen::hiddenClasses.sort();
Doxygen::classSDict.sort();
@@ -7337,13 +7361,14 @@ void generateOutput()
Doxygen::formulaList.generateBitmaps(Config_getString("HTML_OUTPUT"));
}
- if (Config_getBool("SEARCHENGINE") || Config_getList("TAGFILES").count()>0)
- {
- msg("\nNow copy the file\n\n %s\n\nto the directory where the CGI binaries are "
- "located and don't forget to run\n\n",(Config_getString("HTML_OUTPUT")+"/"+Config_getString("CGI_NAME")).data());
- msg(" %s/installdox\n\nto replace any dummy links.\n\n",
- Config_getString("HTML_OUTPUT").data());
- }
+ // This is confusing people, so I removed it
+ //if (Config_getBool("SEARCHENGINE") || Config_getList("TAGFILES").count()>0)
+ //{
+ // msg("\nNow copy the file\n\n %s\n\nto the directory where the CGI binaries are "
+ // "located and don't forget to run\n\n",(Config_getString("HTML_OUTPUT")+"/"+Config_getString("CGI_NAME")).data());
+ // msg(" %s/installdox\n\nto replace any dummy links.\n\n",
+ // Config_getString("HTML_OUTPUT").data());
+ //}
if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
{
diff --git a/src/doxygen.h b/src/doxygen.h
index aa85485..913337c 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -70,10 +70,12 @@ class Doxygen
static FileNameDict *imageNameDict;
static FileNameDict *dotFileNameDict;
static QStrList tagfileList;
- static MemberNameList memberNameList;
- static MemberNameList functionNameList;
- static MemberNameDict memberNameDict;
- static MemberNameDict functionNameDict;
+ //static MemberNameList memberNameList;
+ //static MemberNameList functionNameList;
+ //static MemberNameDict memberNameDict;
+ //static MemberNameDict functionNameDict;
+ static MemberNameSDict memberNameSDict;
+ static MemberNameSDict functionNameSDict;
static FileList fileList;
static FileDict fileDict;
static ClassDef unrelatedClass;
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index bb1c2f0..3f21215 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -43,7 +43,7 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
pageDict = new PageSDict(257);
exampleDict = new PageSDict(257);
allMemberList = new MemberList;
- allMemberNameInfoDict = new MemberNameInfoDict(1009);
+ allMemberNameInfoSDict = new MemberNameInfoSDict(17);
fileName = (QCString)"group_"+na;
setGroupTitle( t );
memberGroupList = new MemberGroupList;
@@ -79,7 +79,7 @@ GroupDef::~GroupDef()
delete pageDict;
delete exampleDict;
delete allMemberList;
- delete allMemberNameInfoDict;
+ delete allMemberNameInfoSDict;
delete memberGroupList;
delete memberGroupDict;
}
@@ -170,7 +170,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
{
//fprintf(stderr, "GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data());
MemberNameInfo *mni=0;
- if ((mni=(*allMemberNameInfoDict)[md->name()]))
+ if ((mni=(*allMemberNameInfoSDict)[md->name()]))
{ // member with this name already found
MemberNameInfoIterator srcMnii(*mni);
MemberInfo *srcMi;
@@ -189,7 +189,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
{
mni = new MemberNameInfo(md->name());
mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
- allMemberNameInfoDict->insert(mni->memberName(),mni);
+ allMemberNameInfoSDict->append(mni->memberName(),mni);
}
allMemberList->append(md);
switch(md->memberType())
@@ -251,7 +251,7 @@ void GroupDef::insertMember(MemberDef *md,bool docOnly)
void GroupDef::removeMember(MemberDef *md)
{
// fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", title.data(), md->name().data());
- MemberNameInfo *mni = allMemberNameInfoDict->find(md->name());
+ MemberNameInfo *mni = allMemberNameInfoSDict->find(md->name());
if (mni)
{
MemberNameInfoIterator mnii(*mni);
@@ -266,7 +266,7 @@ void GroupDef::removeMember(MemberDef *md)
}
if( mni->isEmpty() )
{
- allMemberNameInfoDict->remove(md->name());
+ allMemberNameInfoSDict->remove(md->name());
delete mni;
}
diff --git a/src/groupdef.h b/src/groupdef.h
index b4a446e..0adc59d 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -36,7 +36,7 @@ class OutputList;
class NamespaceList;
class MemberGroupList;
class MemberGroupDict;
-class MemberNameInfoDict;
+class MemberNameInfoSDict;
class PageSDict;
class PageInfo;
@@ -64,11 +64,11 @@ class GroupDef : public Definition
int countMembers() const;
bool isLinkableInProject() const
{
- return hasDocumentation() && !isReference();
+ return !isReference();
}
bool isLinkable() const
{
- return isLinkableInProject() || isReference();
+ return TRUE;
}
bool isASubGroup() const;
void computeAnchors();
@@ -97,7 +97,7 @@ class GroupDef : public Definition
PageSDict *exampleDict; // list of examples in the group
MemberList *allMemberList;
- MemberNameInfoDict *allMemberNameInfoDict;
+ MemberNameInfoSDict *allMemberNameInfoSDict;
// members in the declaration part of the documentation
MemberList decDefineMembers;
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 8ef3df0..e3ec9e3 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -943,7 +943,7 @@ void HtmlGenerator::endMemberDocName()
void HtmlGenerator::startParameterList()
{
DBG_HTML(t << "<!-- startParameterList -->" << endl;)
- t << " <td class=\"md\">(&nbsp;</td>" << endl;
+ t << " <td class=\"md\" valign=\"top\">(&nbsp;</td>" << endl;
}
void HtmlGenerator::startParameterType(bool first)
@@ -951,7 +951,7 @@ void HtmlGenerator::startParameterType(bool first)
if (first)
{
DBG_HTML(t << "<!-- startFirstParameterType -->" << endl;)
- t << " <td class=\"md\" nowrap>";
+ t << " <td class=\"md\" nowrap valign=\"top\">";
}
else
{
@@ -973,8 +973,11 @@ void HtmlGenerator::startParameterName(bool oneArgOnly)
{
DBG_HTML(t << "<!-- startParameterName -->" << endl;)
t << " <td class=\"mdname";
- if (oneArgOnly) t << "1";
- t << "\">&nbsp;";
+ if (oneArgOnly)
+ {
+ t << "1\" valign=\"top";
+ }
+ t << "\" nowrap>&nbsp;";
}
void HtmlGenerator::endParameterName(bool last,bool emptyList)
@@ -985,8 +988,8 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList)
if (emptyList)
{
t << " </td>" << endl;
- t << " <td class=\"md\">)&nbsp;</td>" << endl;
- t << " <td class=\"md\">";
+ t << " <td class=\"md\" valign=\"top\">)&nbsp;</td>" << endl;
+ t << " <td class=\"md\" nowrap>";
}
else
{
diff --git a/src/index.cpp b/src/index.cpp
index 492c4da..5caca70 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -323,7 +323,7 @@ void endFile(OutputList &ol,bool external)
//----------------------------------------------------------------------------
-void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
+void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level)
{
HtmlHelp *htmlHelp=0;
FTVHelp *ftvHelp=0;
@@ -347,7 +347,16 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
{
if (!started)
{
- ol.startItemList();
+ {
+ // UGLY HACK!
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Latex);
+ if (level<6) ol.startIndexList();
+ ol.enableAll();
+ ol.disable(OutputGenerator::Latex);
+ ol.startItemList();
+ ol.popGeneratorState();
+ }
if (hasHtmlHelp) htmlHelp->incContentsDepth();
if (hasFtvHelp) ftvHelp->incContentsDepth();
started=TRUE;
@@ -390,13 +399,22 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
//printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
bool wasVisited=cd->visited;
cd->visited=TRUE;
- writeClassTree(ol,cd->subClasses(),wasVisited);
+ writeClassTree(ol,cd->subClasses(),wasVisited,level+1);
}
}
}
if (started)
{
- ol.endItemList();
+ {
+ // UGLY HACK!
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Latex);
+ if (level<6) ol.endIndexList();
+ ol.enableAll();
+ ol.disable(OutputGenerator::Latex);
+ ol.endItemList();
+ ol.popGeneratorState();
+ }
if (hasHtmlHelp) htmlHelp->decContentsDepth();
if (hasFtvHelp) ftvHelp->decContentsDepth();
}
@@ -406,7 +424,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
//----------------------------------------------------------------------------
/*! Generates HTML Help tree of classes */
-void writeClassTree(BaseClassList *cl)
+void writeClassTree(BaseClassList *cl,int level)
{
HtmlHelp *htmlHelp=0;
FTVHelp *ftvHelp=0;
@@ -448,7 +466,7 @@ void writeClassTree(BaseClassList *cl)
}
if (hasChildren)
{
- writeClassTree(cd->subClasses());
+ writeClassTree(cd->subClasses(),level+1);
}
cd->visited=TRUE;
}
@@ -463,7 +481,7 @@ void writeClassTree(BaseClassList *cl)
//----------------------------------------------------------------------------
/*! Generates HTML Help tree of classes */
-void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &started)
+void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &started,int level)
{
if (cd->isVisibleInHierarchy() && !cd->visited)
{
@@ -485,13 +503,13 @@ void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &star
}
if (hasChildren)
{
- writeClassTree(cd->subClasses());
+ writeClassTree(cd->subClasses(),level+1);
}
cd->visited=TRUE;
}
}
-void writeClassTree(ClassList *cl)
+void writeClassTree(ClassList *cl,int level)
{
bool &generateHtml = Config_getBool("GENERATE_HTML") ;
bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
@@ -500,11 +518,11 @@ void writeClassTree(ClassList *cl)
bool started=FALSE;
for ( ; cli.current() ; ++cli)
{
- writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started);
+ writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
}
}
-void writeClassTree(ClassSDict *d)
+void writeClassTree(ClassSDict *d,int level)
{
bool &generateHtml = Config_getBool("GENERATE_HTML") ;
bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
@@ -513,7 +531,7 @@ void writeClassTree(ClassSDict *d)
bool started=FALSE;
for ( ; cli.current() ; ++cli)
{
- writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started);
+ writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
}
}
@@ -550,7 +568,16 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started)
{
if (!started)
{
- ol.startItemList();
+ {
+ // UGLY HACK!
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Latex);
+ ol.startIndexList();
+ ol.enableAll();
+ ol.disable(OutputGenerator::Latex);
+ ol.startItemList();
+ ol.popGeneratorState();
+ }
if (hasHtmlHelp) htmlHelp->incContentsDepth();
if (hasFtvHelp) ftvHelp->incContentsDepth();
started=TRUE;
@@ -589,7 +616,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started)
}
if (hasChildren)
{
- writeClassTree(ol,cd->subClasses(),cd->visited);
+ writeClassTree(ol,cd->subClasses(),cd->visited,1);
cd->visited=TRUE;
}
}
@@ -621,7 +648,16 @@ void writeClassHierarchy(OutputList &ol)
writeClassTreeForList(ol,&Doxygen::hiddenClasses,started);
if (started)
{
- ol.endItemList();
+ {
+ // UGLY HACK!
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Latex);
+ ol.endIndexList();
+ ol.enableAll();
+ ol.disable(OutputGenerator::Latex);
+ ol.endItemList();
+ ol.popGeneratorState();
+ }
if (hasHtmlHelp) htmlHelp->decContentsDepth();
if (hasFtvHelp) ftvHelp->decContentsDepth();
}
@@ -1476,8 +1512,10 @@ void writeMemberList(OutputList &ol,bool useSections)
{
bool first = TRUE;
char lastChar = 0;
- MemberName *mn=Doxygen::memberNameList.first();
- while (mn)
+
+ MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md=mn->first();
bool found=FALSE;
@@ -1549,7 +1587,6 @@ void writeMemberList(OutputList &ol,bool useSections)
md=mn->prev();
}
}
- mn=Doxygen::memberNameList.next();
}
ol.endItemList();
}
@@ -1560,8 +1597,9 @@ int countClassMembers()
{
int i=0;for (i=0;i<256;i++) g_memberIndexLetterUsed[i]=FALSE;
int count=0;
- MemberName *mn=Doxygen::memberNameList.first();
- while (mn)
+ MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md=mn->first();
bool found=FALSE;
@@ -1584,7 +1622,6 @@ int countClassMembers()
if (!n.isEmpty()) g_memberIndexLetterUsed[tolower(n.at(0))]=TRUE;
count++;
}
- mn=Doxygen::memberNameList.next();
}
return count;
}
@@ -1661,8 +1698,9 @@ void writeFileMemberList(OutputList &ol,bool useSections)
{
char lastChar=0;
bool first=TRUE;
- MemberName *mn=Doxygen::functionNameList.first();
- while (mn)
+ MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md=mn->first();
bool found=FALSE;
@@ -1732,7 +1770,6 @@ void writeFileMemberList(OutputList &ol,bool useSections)
md=mn->prev();
}
}
- mn=Doxygen::functionNameList.next();
}
ol.endItemList();
}
@@ -1743,8 +1780,9 @@ void writeNamespaceMemberList(OutputList &ol,bool useSections)
{
char lastChar=0;
bool first=TRUE;
- MemberName *mn=Doxygen::functionNameList.first();
- while (mn)
+ MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md=mn->first();
bool found=FALSE;
@@ -1807,7 +1845,6 @@ void writeNamespaceMemberList(OutputList &ol,bool useSections)
md=mn->prev();
}
}
- mn=Doxygen::functionNameList.next();
}
if (!first) ol.endItemList();
}
@@ -1818,8 +1855,9 @@ int countNamespaceMembers()
{
int i=0;for (i=0;i<256;i++) g_namespaceIndexLetterUsed[i]=FALSE;
int count=0;
- MemberName *mn=Doxygen::functionNameList.first();
- while (mn)
+ MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md=mn->first();
bool found=FALSE;
@@ -1836,7 +1874,6 @@ int countNamespaceMembers()
md=mn->next();
}
if (found) count++;
- mn=Doxygen::functionNameList.next();
}
return count;
}
@@ -1847,8 +1884,9 @@ int countFileMembers()
{
int i=0;for (i=0;i<256;i++) g_fileIndexLetterUsed[i]=FALSE;
int count=0;
- MemberName *mn=Doxygen::functionNameList.first();
- while (mn)
+ MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md=mn->first();
FileDef *fd;
@@ -1868,7 +1906,6 @@ int countFileMembers()
md=mn->next();
}
if (found) count++;
- mn=Doxygen::functionNameList.next();
}
return count;
}
@@ -2398,7 +2435,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel)
ftvHelp->incContentsDepth();
}
- writeClassTree(gd->classSDict);
+ writeClassTree(gd->classSDict,1);
if(htmlHelp) htmlHelp->decContentsDepth();
if(ftvHelp) ftvHelp->decContentsDepth();
}
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index e124c8d..0ffe1b3 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -26,6 +26,7 @@
#include "language.h"
#include "scanner.h"
#include "groupdef.h"
+#include "doxygen.h"
//static QCString idToName(int id)
//{
diff --git a/src/membername.cpp b/src/membername.cpp
index 87b4c79..a250988 100644
--- a/src/membername.cpp
+++ b/src/membername.cpp
@@ -71,6 +71,8 @@ MemberNameIterator::MemberNameIterator(const MemberName &mnlist) :
{
}
+#if 0
+
MemberNameList::MemberNameList() : QList<MemberName>()
{
}
@@ -91,3 +93,12 @@ MemberNameListIterator::MemberNameListIterator(const MemberNameList &mnlist) :
{
}
+#endif
+
+int MemberNameSDict::compareItems(GCI item1, GCI item2)
+{
+ MemberName *n1=(MemberName *)item1;
+ MemberName *n2=(MemberName *)item2;
+ return stricmp(n1->memberName(),n2->memberName());
+}
+
diff --git a/src/membername.h b/src/membername.h
index 74f81f5..b99b1da 100644
--- a/src/membername.h
+++ b/src/membername.h
@@ -40,6 +40,7 @@ class MemberNameIterator : public QListIterator<MemberDef>
MemberNameIterator( const MemberName &list);
};
+#if 0
class MemberNameList : public QList<MemberName>
{
public:
@@ -56,6 +57,16 @@ class MemberNameListIterator : public QListIterator<MemberName>
};
typedef QDict<MemberName> MemberNameDict;
+#endif
+
+class MemberNameSDict : public SDict<MemberName>
+{
+ public:
+ MemberNameSDict(int size) : SDict<MemberName>(size) {}
+ ~MemberNameSDict() {}
+
+ int compareItems(GCI item1,GCI item2);
+};
struct MemberInfo
{
@@ -89,6 +100,7 @@ class MemberNameInfoIterator : public QListIterator<MemberInfo>
: QListIterator<MemberInfo>(mnii) {}
};
+#if 0
class MemberNameInfoList : public QList<MemberNameInfo>
{
public:
@@ -108,6 +120,15 @@ class MemberNameInfoDict : public QDict<MemberNameInfo>
~MemberNameInfoDict() {}
};
+class MemberNameInfoListIterator : public QListIterator<MemberNameInfo>
+{
+ public:
+ MemberNameInfoListIterator(const MemberNameInfoList &mil) :
+ QListIterator<MemberNameInfo>(mil) {}
+};
+#endif
+
+
class MemberNameInfoSDict : public SDict<MemberNameInfo>
{
public:
@@ -121,11 +142,4 @@ class MemberNameInfoSDict : public SDict<MemberNameInfo>
}
};
-class MemberNameInfoListIterator : public QListIterator<MemberNameInfo>
-{
- public:
- MemberNameInfoListIterator(const MemberNameInfoList &mil) :
- QListIterator<MemberNameInfo>(mil) {}
-};
-
#endif
diff --git a/src/pre.l b/src/pre.l
index 40bb394..97a5606 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -866,12 +866,13 @@ void addDefine()
md->setFileDef(g_yyFileDef);
md->setDefinition("#define "+g_defName);
- MemberName *mn=Doxygen::functionNameDict[g_defName];
+ MemberName *mn=Doxygen::functionNameSDict[g_defName];
if (mn==0)
{
mn = new MemberName(g_defName);
- Doxygen::functionNameList.append(mn);
- Doxygen::functionNameDict.insert(g_defName,mn);
+ //Doxygen::functionNameList.append(mn);
+ //Doxygen::functionNameDict.insert(g_defName,mn);
+ Doxygen::functionNameSDict.append(g_defName,mn);
}
mn->append(md);
if (g_yyFileDef) g_yyFileDef->insertMember(md);
diff --git a/src/scanner.l b/src/scanner.l
index faa8f3c..43ed58f 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -150,6 +150,8 @@ static bool needsSemi;
static int depthIf;
static int initializerSharpCount;
+static QCString memberGroupRelates;
+static QCString memberGroupInside;
//-----------------------------------------------------------------------------
@@ -166,6 +168,8 @@ static void initParser()
roundCount = 0;
curlyCount = 0;
memberGroupId = NOGROUP;
+ memberGroupRelates.resize(0);
+ memberGroupInside.resize(0);
mtype = Method;
gstat = FALSE;
virt = Normal;
@@ -185,6 +189,8 @@ static void initEntry()
current->virt = virt;
current->stat = gstat;
current->mGrpId = memberGroupId;
+ current->relates = memberGroupRelates.copy();
+ current->inside = memberGroupInside.copy();
if (!autoGroupStack.isEmpty())
{
current->groups->append(new Grouping(*autoGroupStack.top()));
@@ -1320,7 +1326,13 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
startGroup();
tmpDocType=-1;
if (current_root->section & Entry::SCOPE_MASK)
+ {
current->inside = current_root->name+"::";
+ if (current->mGrpId!=NOGROUP)
+ {
+ memberGroupInside = current->inside.copy();
+ }
+ }
if (yytext[1]=='/') // C++ style comment
{
current->brief.resize(0);
@@ -2589,14 +2601,26 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->doc.resize(0);
lastDocContext = YY_START;
if (current_root->section & Entry::SCOPE_MASK)
+ {
current->inside = current_root->name+"::";
+ if (current->mGrpId!=NOGROUP)
+ {
+ memberGroupInside = current->inside.copy();
+ }
+ }
BEGIN( Doc );
}
<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases>("//"{B}*)?"/**"/[^/*] {
removeSlashes=(yytext[1]=='/');
lastDocContext = YY_START;
if (current_root->section & Entry::SCOPE_MASK)
+ {
current->inside = current_root->name+"::";
+ if (current->mGrpId!=NOGROUP)
+ {
+ memberGroupInside = current->inside.copy();
+ }
+ }
if (!Config_getBool("JAVADOC_AUTOBRIEF")) // use the Qt style
{
tmpDocType=-1;
@@ -2629,7 +2653,13 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
tmpDocType=-1;
lastDocContext = YY_START;
if (current_root->section & Entry::SCOPE_MASK)
+ {
current->inside = current_root->name+"::";
+ if (current->mGrpId!=NOGROUP)
+ {
+ memberGroupInside = current->inside.copy();
+ }
+ }
BEGIN( LineDoc );
}
<FindMembers,FindFields,MemberSpec,FuncQual,Operator,ClassVar,Bases>"///"/[^/] {
@@ -2637,7 +2667,13 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
tmpDocType=-1;
lastDocContext = YY_START;
if (current_root->section & Entry::SCOPE_MASK)
+ {
current->inside = current_root->name+"::";
+ if (current->mGrpId!=NOGROUP)
+ {
+ memberGroupInside = current->inside.copy();
+ }
+ }
BEGIN( LineDoc );
}
<FindMembers>"extern"{BN}+"\"C"("++")?"\""{BN}*("{")? {
@@ -2997,6 +3033,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<ClassDocRelates>({ID}"::")*{ID} {
current->relates = yytext;
+ if (current->mGrpId!=NOGROUP)
+ {
+ memberGroupRelates = yytext;
+ }
BEGIN( lastDocRelContext );
}
<NameSpaceDocArg1>{SCOPENAME} {
@@ -3332,6 +3372,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
else if (current->section == Entry::MEMBERGRP_SEC)
{
memberGroupId = newMemberGroupId();
+ memberGroupRelates = current->relates.copy();
+ memberGroupInside = current->inside.copy();
current->mGrpId = memberGroupId;
lastMemberGroupLine = yyLineNr;
}
@@ -3943,6 +3985,8 @@ static void startGroup()
memberGroupHeader="[NOHEADER]";
}
memberGroupId = newMemberGroupId();
+ memberGroupRelates = current->relates.copy();
+ memberGroupInside = current->inside.copy();
current->mGrpId = memberGroupId;
lastMemberGroupLine = yyLineNr;
}
@@ -3964,9 +4008,12 @@ static void endGroup()
new QCString(memberGroupDocs)
);
memberGroupId=NOGROUP;
+ memberGroupRelates.resize(0);
+ memberGroupInside.resize(0);
if (YY_START!=ReadInitializer)
{
current->mGrpId=NOGROUP;
+ current->relates.resize(0);
}
memberGroupHeader.resize(0);
memberGroupDocs.resize(0);
@@ -4056,6 +4103,8 @@ static void parseCompounds(Entry *rt)
//printf("name=%s current->stat=%d gstat=%d\n",ce->name.data(),current->stat,gstat);
memberGroupId = NOGROUP;
+ memberGroupRelates.resize(0);
+ memberGroupInside.resize(0);
scanYYlex() ;
delete current; current=0;
diff --git a/src/sortdict.h b/src/sortdict.h
index e78d038..b716d33 100644
--- a/src/sortdict.h
+++ b/src/sortdict.h
@@ -130,6 +130,12 @@ class SDict
}
#endif
}
+ /*! Remove an item from the dictionary */
+ bool remove(const char *key)
+ {
+ T *item = m_dict->take(key);
+ return item ? m_list->remove(item) : FALSE;
+ }
/*! Sorts the members of the dictionary. First appending a number
* of members and then sorting them is faster (O(NlogN) than using
* inSort() for each member (O(N^2)).
@@ -170,7 +176,7 @@ class SDict
}
/*! Equavalent to find(). */
- T *operator[](const char *key)
+ T *operator[](const char *key) const
{
return m_dict->find(key);
}
diff --git a/src/util.cpp b/src/util.cpp
index cbc64d6..81c7916 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -370,14 +370,14 @@ QCString resolveTypeDef(Definition *d,const QCString &name)
MemberDef *md=0;
while (mContext && md==0)
{
- MemberNameDict *mnd=0;
+ MemberNameSDict *mnd=0;
if (mContext->definitionType()==Definition::TypeClass)
{
- mnd=&Doxygen::memberNameDict;
+ mnd=&Doxygen::memberNameSDict;
}
else
{
- mnd=&Doxygen::functionNameDict;
+ mnd=&Doxygen::functionNameSDict;
}
MemberName *mn=mnd->find(name);
if (mn)
@@ -1080,7 +1080,7 @@ static QCString trimTemplateSpecifiers(
QCString result=s;
int i=className.length()-1;
- if (className.at(i)=='>') // template specialization
+ if (i>=0 && className.at(i)=='>') // template specialization
{
// replace unspecialized occurrences in s, with their specialized versions.
int count=1;
@@ -2046,7 +2046,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
//printf("mScope=`%s' mName=`%s'\n",mScope.data(),mName.data());
- MemberName *mn = Doxygen::memberNameDict[mName];
+ MemberName *mn = Doxygen::memberNameSDict[mName];
if (!forceEmptyScope && mn && !(scopeName.isEmpty() && mScope.isEmpty()))
{
//printf(" >member name found\n");
@@ -2157,7 +2157,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
// maybe an namespace, file or group member ?
//printf("Testing for global function scopeName=`%s' mScope=`%s' :: mName=`%s'\n",
// scopeName.data(),mScope.data(),mName.data());
- if ((mn=Doxygen::functionNameDict[mName])) // name is known
+ if ((mn=Doxygen::functionNameSDict[mName])) // name is known
{
//printf(" >function name found\n");
NamespaceDef *fnd=0;
@@ -2239,8 +2239,8 @@ bool getDefs(const QCString &scName,const QCString &memberName,
gd=md->getGroupDef();
//printf("md->name()=`%s' md->args=`%s' fd=%p gd=%p\n",
// md->name().data(),args,fd,gd);
- if ((fd && fd->isLinkable()) ||
- (gd && gd->isLinkable())
+ if (
+ (gd && gd->isLinkable()) || (fd && fd->isLinkable())
)
{
//printf("fd=%p gd=%p inGroup=`%d' args=`%s'\n",fd,gd,inGroup,args);
@@ -2274,8 +2274,8 @@ bool getDefs(const QCString &scName,const QCString &memberName,
//printf("member is linkable md->name()=`%s'\n",md->name().data());
fd=md->getFileDef();
gd=md->getGroupDef();
- if ((fd && fd->isLinkable()) ||
- (gd && gd->isLinkable())
+ if (
+ (gd && gd->isLinkable()) || (fd && fd->isLinkable())
)
{
members.append(md);
@@ -2309,6 +2309,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
{
fd=md->getFileDef();
gd=md->getGroupDef();
+ //printf("fd=%p gd=%p gd->isLinkable()=%d\n",fd,gd,gd->isLinkable());
if (gd && gd->isLinkable()) fd=0; else gd=0;
return TRUE;
}