Re: [Doxygen-users] grouping patches
Brought to you by:
dimitri
From: Patrick O. <Pat...@pa...> - 2001-05-18 10:15:07
|
Hi, here's the same patch, but this time against 1.2.7 20010517. On Thu, May 17, 2001 at 06:03:04PM +0200, Patrick Ohly wrote: > Hi all, > > here are patches for doxygen that enhance (or so I hope) the > grouping capabilities: > > There are now three commands to define a group: > \defgroup name title > \addtogroup name [title] > \weakgroup name [title] > > \defgroup must be used exactly once for a group, so you should > provide a title. Without the title you will get a warning and > doxygen will use the name as title (this is the old behaviour). > > /** \addtogroup name */ can be used to add documentation or > members to a group (as in 1.2.7), but the group is created if > it doesn't exist yet. You can provide the title later > with another block: > /** > * \addgroup name title ^^^^^^^^^ should be \addtogroup > * documentation > */ > > Setting different titles will trigger a warning without overwriting > the title once more. > > \weakgroup is exactly the same as \addtogroup, but if a member > was put into such a group with \weakgroup name @{ @} and into > another group with \[def|addto]group @{ @}, then it will be > placed into the other group without issuing a warning. > > Actually there is a four-level hierarchy for grouping with > (from strongest to weakest) \ingroup, \defgroup, \addtogroup, > \weakgroup. You will get warnings when putting members into > groups with commands of the same level, but only when you really > document this member. This will not trigger a warning and put > variable a into Group1: > > /** \addtogroup Group1 */ > /*@{*/ > /** this is the real group */ > extern int a; > /*@}*/ > > /** \addtogroup Group2 */ > /*@{*/ > extern int a; > /*@}*/ > > Member groups (i.e. grouping of struct/class members) works as > before. > > I have attached the diff and an example that uses the new > features and also triggers some warnings on purpose. > > Bye, Patrick > -- > // pallas GmbH ............ Patrick Ohly ............. > Hermuelheimer Str. 10 Software-Engineer > D-50321 Bruehl, Germany po...@pa... > fax +49-(0)2232-1896-29 phone +49-(0)2232-1896-30 > http://www.pallas.com > .......................................................... > Index: src//doxygen.cpp > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/doxygen.cpp,v > retrieving revision 1.1.1.10.2.1 > diff -c -r1.1.1.10.2.1 doxygen.cpp > *** src//doxygen.cpp 2001/05/09 11:42:32 1.1.1.10.2.1 > --- src//doxygen.cpp 2001/05/17 14:44:45 > *************** > *** 268,278 **** > static void addRelatedPage(Entry *root) > { > GroupDef *gd=0; > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) break; > } > addRelatedPage(root->name,root->args,root->doc,root->anchors, > root->fileName,root->startLine,root->todoId, > --- 268,278 ---- > static void addRelatedPage(Entry *root) > { > GroupDef *gd=0; > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > ! if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) break; > } > addRelatedPage(root->name,root->args,root->doc,root->anchors, > root->fileName,root->startLine,root->todoId, > *************** > *** 391,400 **** > > if ((gd=Doxygen::groupDict[root->name])) > { > ! warn(root->fileName,root->startLine, > ! "Warning: group %s already documented. " > ! "Skipping documentation.", > ! root->name.data()); > } > else > { > --- 391,420 ---- > > if ((gd=Doxygen::groupDict[root->name])) > { > ! if ( root->groupdoctype==Entry::GROUPDOC_NORMAL ) > ! { > ! warn(root->fileName,root->startLine, > ! "Warning: group %s already documented. " > ! "Skipping documentation.", > ! root->name.data()); > ! } > ! else > ! { > ! 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); > ! if ( !root->doc.stripWhiteSpace().isEmpty() ) > ! gd->setDocumentation( gd->documentation().isEmpty() ? root->doc : > ! gd->documentation() + "\n\n" + root->doc ); > ! gd->addSectionsToDefinition(root->anchors); > ! gd->setRefItems(root->todoId,root->testId,root->bugId); > ! addGroupToGroups(root,gd); > ! } > } > else > { > *************** > *** 438,467 **** > } > } > > - static void addToGroupSections(Entry *root) > - { > - if (root->section==Entry::ADDGRPDOC_SEC && !root->name.isEmpty()) > - { > - GroupDef *gd = Doxygen::groupDict[root->name]; > - if (gd) > - { > - gd->setDocumentation(gd->documentation()+"<p>"+root->brief+root->doc); > - } > - else > - { > - warn(root->fileName,root->startLine, > - "Warning: ignoring addtogroup command for undefined " > - "group `%s'.",root->name.data()); > - } > - } > - EntryListIterator eli(*root->sublist); > - Entry *e; > - for (;(e=eli.current());++eli) > - { > - addToGroupSections(e); > - } > - } > - > //---------------------------------------------------------------------- > > static void buildFileList(Entry *root) > --- 458,463 ---- > *************** > *** 494,505 **** > fd->setBriefDescription(root->brief); > fd->addSectionsToDefinition(root->anchors); > fd->setRefItems(root->todoId,root->testId,root->bugId); > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > GroupDef *gd=0; > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) > { > gd->addFile(fd); > //printf("File %s: in group %s\n",fd->name().data(),s->data()); > --- 490,501 ---- > fd->setBriefDescription(root->brief); > fd->addSectionsToDefinition(root->anchors); > fd->setRefItems(root->todoId,root->testId,root->bugId); > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > GroupDef *gd=0; > ! if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) > { > gd->addFile(fd); > //printf("File %s: in group %s\n",fd->name().data(),s->data()); > *************** > *** 1010,1021 **** > nd->setBriefDescription(root->brief); > nd->addSectionsToDefinition(root->anchors); > > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > GroupDef *gd=0; > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) > gd->addNamespace(nd); > } > > --- 1006,1017 ---- > nd->setBriefDescription(root->brief); > nd->addSectionsToDefinition(root->anchors); > > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > GroupDef *gd=0; > ! if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) > gd->addNamespace(nd); > } > > *************** > *** 1355,1366 **** > // merge ingroup specifiers > if (md->getGroupDef()==0 && root->groups->first()) > { > ! GroupDef *gd=Doxygen::groupDict[root->groups->first()->data()]; > ! md->setGroupDef(gd); > } > else if (md->getGroupDef()!=0 && root->groups->count()==0) > { > ! root->groups->append(new QCString(md->getGroupDef()->name())); > } > } > } > --- 1351,1362 ---- > // merge ingroup specifiers > if (md->getGroupDef()==0 && root->groups->first()) > { > ! GroupDef *gd=Doxygen::groupDict[root->groups->first()->groupname.data()]; > ! md->setGroupDef(gd, root->groups->first()->pri, root->fileName, root->startLine, root->doc.length() != 0); > } > else if (md->getGroupDef()!=0 && root->groups->count()==0) > { > ! root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri())); > } > } > } > *************** > *** 1906,1917 **** > // merge ingroup specifiers > if (md->getGroupDef()==0 && root->groups->first()) > { > ! GroupDef *gd=Doxygen::groupDict[root->groups->first()->data()]; > ! md->setGroupDef(gd); > } > else if (md->getGroupDef()!=0 && root->groups->count()==0) > { > ! root->groups->append(new QCString(md->getGroupDef()->name())); > } > } > } > --- 1902,1913 ---- > // merge ingroup specifiers > if (md->getGroupDef()==0 && root->groups->first()) > { > ! GroupDef *gd=Doxygen::groupDict[root->groups->first()->groupname.data()]; > ! md->setGroupDef(gd, root->groups->first()->pri, root->fileName, root->startLine, root->doc.length() != 0); > } > else if (md->getGroupDef()!=0 && root->groups->count()==0) > { > ! root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri())); > } > } > } > *************** > *** 6351,6357 **** > msg("Building group list...\n"); > buildGroupList(root); > organizeSubGroups(root); > - addToGroupSections(root); > > msg("Building namespace list...\n"); > buildNamespaceList(root); > --- 6347,6352 ---- > Index: src//entry.cpp > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/entry.cpp,v > retrieving revision 1.1.1.5 > diff -c -r1.1.1.5 entry.cpp > *** src//entry.cpp 2001/03/30 15:11:35 1.1.1.5 > --- src//entry.cpp 2001/05/17 08:44:32 > *************** > *** 29,35 **** > sublist->setAutoDelete(TRUE); > extends = new QList<BaseInfo>; > extends->setAutoDelete(TRUE); > ! groups = new QList<QCString>; > groups->setAutoDelete(TRUE); > anchors = new QList<QCString>; > anchors->setAutoDelete(TRUE); > --- 29,35 ---- > sublist->setAutoDelete(TRUE); > extends = new QList<BaseInfo>; > extends->setAutoDelete(TRUE); > ! groups = new QList<Grouping>; > groups->setAutoDelete(TRUE); > anchors = new QList<QCString>; > anchors->setAutoDelete(TRUE); > *************** > *** 40,45 **** > --- 40,46 ---- > mtArgList = 0; > mGrpId = -1; > tagInfo = 0; > + groupdoctype = GROUPDOC_NORMAL; > reset(); > } > > *************** > *** 82,88 **** > sublist->setAutoDelete(TRUE); > extends = new QList<BaseInfo>; > extends->setAutoDelete(TRUE); > ! groups = new QList<QCString>; > groups->setAutoDelete(TRUE); > anchors = new QList<QCString>; > anchors->setAutoDelete(TRUE); > --- 83,89 ---- > sublist->setAutoDelete(TRUE); > extends = new QList<BaseInfo>; > extends->setAutoDelete(TRUE); > ! groups = new QList<Grouping>; > groups->setAutoDelete(TRUE); > anchors = new QList<QCString>; > anchors->setAutoDelete(TRUE); > *************** > *** 91,96 **** > --- 92,98 ---- > //printf("Entry::Entry(copy) tArgList=0\n"); > tArgList = 0; > mtArgList = 0; > + groupdoctype = e.groupdoctype; > > // deep copy of the child entry list > QListIterator<Entry> eli(*e.sublist); > *************** > *** 109,122 **** > } > > // deep copy group list > ! QListIterator<QCString> sli(*e.groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > ! groups->append(new QCString(*s)); > } > > QListIterator<QCString> sli2(*e.anchors); > for (;(s=sli2.current());++sli2) > { > anchors->append(new QCString(*s)); > --- 111,125 ---- > } > > // deep copy group list > ! QListIterator<Grouping> gli(*e.groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > ! groups->append(new Grouping(*g)); > } > > QListIterator<QCString> sli2(*e.anchors); > + QCString *s; > for (;(s=sli2.current());++sli2) > { > anchors->append(new QCString(*s)); > *************** > *** 234,239 **** > --- 237,243 ---- > memSpec = 0; > subGrouping = TRUE; > protection = Public; > + groupdoctype = GROUPDOC_NORMAL; > sublist->clear(); > extends->clear(); > groups->clear(); > *************** > *** 270,283 **** > size+=bi->name.length()+1+sizeof(bi->prot)+sizeof(bi->virt); > bi=extends->next(); > } > ! QCString *s=groups->first(); > ! while (s) > { > size+=sizeof(QLNode); > ! size+=s->length()+1; > ! s=groups->next(); > } > ! s=anchors->first(); > while (s) > { > size+=sizeof(QLNode); > --- 274,288 ---- > size+=bi->name.length()+1+sizeof(bi->prot)+sizeof(bi->virt); > bi=extends->next(); > } > ! Grouping *g=groups->first(); > ! while (g) > { > size+=sizeof(QLNode); > ! size+=g->groupname.length()+1; > ! size+=sizeof(g->pri); > ! g=groups->next(); > } > ! QCString *s=anchors->first(); > while (s) > { > size+=sizeof(QLNode); > Index: src//entry.h > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/entry.h,v > retrieving revision 1.1.1.6 > diff -c -r1.1.1.6 entry.h > *** src//entry.h 2001/05/02 12:38:24 1.1.1.6 > --- src//entry.h 2001/05/17 08:49:30 > *************** > *** 121,126 **** > --- 121,173 ---- > QCString anchor; > }; > > + struct Grouping { > + typedef enum { > + GROUPING_LOWEST, > + GROUPING_AUTO_WEAK = > + GROUPING_LOWEST, //!< membership in group was defined via @weakgroup @{ @} > + GROUPING_AUTO_ADD, //!< membership in group was defined via @add[to]group @{ @} > + GROUPING_AUTO_DEF, //!< membership in group was defined via @defgroup @{ @} > + GROUPING_AUTO_HIGHEST = > + GROUPING_AUTO_DEF, > + GROUPING_INGROUP, //!< membership in group was defined by @ingroup > + GROUPING_HIGHEST = > + GROUPING_INGROUP > + } GroupPri_t; > + > + static const char *getGroupPriName( GroupPri_t priority ) > + { > + switch( priority ) > + { > + case GROUPING_AUTO_WEAK: > + return "@weakgroup"; > + break; > + case GROUPING_AUTO_ADD: > + return "@addtogroup"; > + break; > + case GROUPING_AUTO_DEF: > + return "@defgroup"; > + break; > + case GROUPING_INGROUP: > + return "@ingroup"; > + break; > + default: > + return "???"; > + break; > + } > + } > + > + Grouping( const char *gn, GroupPri_t p ) : > + groupname(gn), > + pri(p) {} > + Grouping( const Grouping &g ) : > + groupname(g.groupname), > + pri(g.pri) {} > + QCString groupname; //!< name of the group > + GroupPri_t pri; //!< priority of this definition > + > + }; > + > /*! \brief Represents an unstructured piece of information, about an > * entity found in the sources. > * > *************** > *** 176,183 **** > MAINPAGEDOC_SEC = 0x01200000, > MEMBERGRP_SEC = 0x01300000, > USINGDECL_SEC = 0x01400000, > ! PACKAGE_SEC = 0x01500000, > ! ADDGRPDOC_SEC = 0x01600000 > }; > enum MemberSpecifier > { > --- 223,229 ---- > MAINPAGEDOC_SEC = 0x01200000, > MEMBERGRP_SEC = 0x01300000, > USINGDECL_SEC = 0x01400000, > ! PACKAGE_SEC = 0x01500000 > }; > enum MemberSpecifier > { > *************** > *** 231,238 **** > int endBodyLine; //!< line number where the definition ends > int mGrpId; //!< member group id > QList<Entry> *sublist; //!< entries that are children of this one > ! QList<BaseInfo> *extends; //!< list of base classes > ! QList<QCString> *groups; //!< list of groups this entry belongs to > QList<QCString> *anchors; //!< list of anchors defined in this entry > QCString fileName; //!< file this entry was extracted from > int startLine; //!< start line of entry in the source > --- 277,284 ---- > int endBodyLine; //!< line number where the definition ends > int mGrpId; //!< member group id > QList<Entry> *sublist; //!< entries that are children of this one > ! QList<BaseInfo> *extends; //!< list of base classes > ! QList<Grouping> *groups; //!< list of groups this entry belongs to > QList<QCString> *anchors; //!< list of anchors defined in this entry > QCString fileName; //!< file this entry was extracted from > int startLine; //!< start line of entry in the source > *************** > *** 241,246 **** > --- 287,333 ---- > int bugId; //!< id of the bug list item of this entry > TagInfo *tagInfo; //!< tag file info > static int num; //!< counts the total number of entries > + enum { > + GROUPDOC_NORMAL, //<! @defgroup > + GROUPDOC_ADD, //<! @addgroup > + GROUPDOC_WEAK //<! @weakgroup > + } groupdoctype; //!< kind of group > + /// return the command name used to define GROUPDOC_SEC > + const char *groupdoccmd() const > + { > + switch( this->groupdoctype ) { > + case GROUPDOC_NORMAL: > + return "\\defgroup"; > + break; > + case GROUPDOC_ADD: > + return "\\addgroup"; > + break; > + case GROUPDOC_WEAK: > + return "\\weakgroup"; > + break; > + default: > + return "unknown group command"; > + } > + } > + Grouping::GroupPri_t groupingpri() const > + { > + if( this->section != GROUPDOC_SEC ) { > + return Grouping::GROUPING_LOWEST; > + } > + switch( this->groupdoctype ) { > + case GROUPDOC_NORMAL: > + return Grouping::GROUPING_AUTO_DEF; > + break; > + case GROUPDOC_ADD: > + return Grouping::GROUPING_AUTO_ADD; > + break; > + case GROUPDOC_WEAK: > + return Grouping::GROUPING_AUTO_WEAK; > + break; > + default: > + return Grouping::GROUPING_LOWEST; > + } > + } > private: > Entry &operator=(const Entry &); > } ; > Index: src//groupdef.cpp > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/groupdef.cpp,v > retrieving revision 1.1.1.10 > diff -c -r1.1.1.10 groupdef.cpp > *** src//groupdef.cpp 2001/05/02 12:38:26 1.1.1.10 > --- src//groupdef.cpp 2001/05/17 15:59:10 > *************** > *** 44,57 **** > exampleDict = new PageSDict(257); > allMemberList = new MemberList; > allMemberNameInfoDict = new MemberNameInfoDict(1009); > - if (t) > - title = t; > - else > - { > - title = na; > - title.at(0)=toupper(title.at(0)); > - } > fileName = (QCString)"group_"+na; > memberGroupList = new MemberGroupList; > memberGroupList->setAutoDelete(TRUE); > memberGroupDict = new MemberGroupDict(1009); > --- 44,51 ---- > exampleDict = new PageSDict(257); > allMemberList = new MemberList; > allMemberNameInfoDict = new MemberNameInfoDict(1009); > fileName = (QCString)"group_"+na; > + setGroupTitle( t ); > memberGroupList = new MemberGroupList; > memberGroupList->setAutoDelete(TRUE); > memberGroupDict = new MemberGroupDict(1009); > *************** > *** 90,95 **** > --- 84,105 ---- > delete memberGroupDict; > } > > + void GroupDef::setGroupTitle( const char *t ) > + { > + if ( t && strlen(t) ) > + { > + title = t; > + titleSet = true; > + } > + else > + { > + title = name(); > + title.at(0)=toupper(title.at(0)); > + titleSet = false; > + } > + } > + > + > void GroupDef::distributeMemberGroupDocumentation() > { > MemberGroupListIterator mgli(*memberGroupList); > *************** > *** 200,206 **** > > void GroupDef::insertMember(MemberDef *md) > { > ! //printf("GroupDef::insertMember(%s)\n",md->name().data()); > MemberNameInfo *mni=0; > if ((mni=(*allMemberNameInfoDict)[md->name()])) > { // member with this name already found > --- 210,216 ---- > > void GroupDef::insertMember(MemberDef *md) > { > ! // fprintf(stderr, "GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data()); > MemberNameInfo *mni=0; > if ((mni=(*allMemberNameInfoDict)[md->name()])) > { // member with this name already found > *************** > *** 279,284 **** > --- 289,358 ---- > //addMemberToGroup(md,groupId); > } > > + void GroupDef::removeMember(MemberDef *md) > + { > + // fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", title.data(), md->name().data()); > + MemberNameInfo *mni = allMemberNameInfoDict->find(md->name()); > + if (mni) > + { > + MemberNameInfoIterator mnii(*mni); > + while( mnii.current() ) > + { > + if( mnii.current()->memberDef == md ) > + { > + mni->remove(mnii.current()); > + break; > + } > + ++mnii; > + } > + if( mni->isEmpty() ) > + { > + allMemberNameInfoDict->remove(md->name()); > + delete mni; > + } > + > + allMemberList->remove(md); > + switch(md->memberType()) > + { > + case MemberDef::Variable: > + decVarMembers.remove(md); > + docVarMembers.remove(md); > + break; > + case MemberDef::Function: > + decFuncMembers.remove(md); > + docFuncMembers.remove(md); > + break; > + case MemberDef::Typedef: > + decTypedefMembers.remove(md); > + docTypedefMembers.remove(md); > + break; > + case MemberDef::Enumeration: > + decEnumMembers.remove(md); > + docEnumMembers.remove(md); > + break; > + case MemberDef::EnumValue: > + decEnumValMembers.remove(md); > + docEnumValMembers.remove(md); > + break; > + case MemberDef::Prototype: > + decProtoMembers.remove(md); > + docProtoMembers.remove(md); > + break; > + case MemberDef::Define: > + decDefineMembers.remove(md); > + docDefineMembers.remove(md); > + break; > + default: > + err("GroupDef::removeMember(): unexpected member remove in file!\n"); > + } > + } > + } > + > + bool GroupDef::containsGroup(const GroupDef *def) > + { > + return groupList->find(def) >= 0; > + } > + > void GroupDef::addGroup(const GroupDef *def) > { > if (Config_getBool("SORT_MEMBER_DOCS")) > *************** > *** 552,563 **** > > void addClassToGroups(Entry *root,ClassDef *cd) > { > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > GroupDef *gd=0; > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) > { > gd->addClass(cd); > //printf("Compound %s: in group %s\n",cd->name().data(),s->data()); > --- 626,637 ---- > > void addClassToGroups(Entry *root,ClassDef *cd) > { > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > GroupDef *gd=0; > ! if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) > { > gd->addClass(cd); > //printf("Compound %s: in group %s\n",cd->name().data(),s->data()); > *************** > *** 568,580 **** > void addNamespaceToGroups(Entry *root,NamespaceDef *nd) > { > //printf("root->groups->count()=%d\n",root->groups->count()); > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > GroupDef *gd=0; > //printf("group `%s'\n",s->data()); > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) > { > gd->addNamespace(nd); > //printf("Namespace %s: in group %s\n",nd->name().data(),s->data()); > --- 642,654 ---- > void addNamespaceToGroups(Entry *root,NamespaceDef *nd) > { > //printf("root->groups->count()=%d\n",root->groups->count()); > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > GroupDef *gd=0; > //printf("group `%s'\n",s->data()); > ! if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) > { > gd->addNamespace(nd); > //printf("Namespace %s: in group %s\n",nd->name().data(),s->data()); > *************** > *** 584,595 **** > > void addGroupToGroups(Entry *root,GroupDef *subGroup) > { > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > GroupDef *gd=0; > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) > { > gd->addGroup(subGroup); > subGroup->addParentGroup(gd); > --- 658,670 ---- > > void addGroupToGroups(Entry *root,GroupDef *subGroup) > { > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > GroupDef *gd=0; > ! if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname]) && > ! !gd->containsGroup(subGroup) ) > { > gd->addGroup(subGroup); > subGroup->addParentGroup(gd); > *************** > *** 597,627 **** > } > } > > ! /*! Add a member to all groups it is contained in */ > void addMemberToGroups(Entry *root,MemberDef *md) > { > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > ! GroupDef *gd=0; > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) > { > ! GroupDef *mgd = md->getGroupDef(); > ! if (mgd==0) > ! { > ! gd->insertMember(md); > ! md->setGroupDef(gd); > } > ! else if (mgd!=gd) > { > ! warn(mgd->getDefFileName(),mgd->getDefLine(), > ! "Warning: Member %s found in multiple groups.!\n" > ! "The member will be put in group %s, and not in group %s", > ! md->name().data(),mgd->name().data(),gd->name().data() > ! ); > } > - //printf("Member %s: in group %s\n",md->name().data(),s->data()); > } > } > } > --- 672,753 ---- > } > } > > ! /*! Add a member to the group with the highest priority */ > void addMemberToGroups(Entry *root,MemberDef *md) > { > ! //printf(" Root 0x%p = %s, md 0x%p %s\n", root, root->name.data(), md, md->name().data() ); > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! > ! // Search entry's group list for group with highest pri. > ! Grouping::GroupPri_t pri = Grouping::GROUPING_LOWEST; > ! GroupDef *fgd=0; > ! for (;(g=gli.current());++gli) > { > ! GroupDef *gd; > ! if (!g->groupname.isEmpty() && > ! (gd=Doxygen::groupDict[g->groupname]) && > ! g->pri >= pri) > { > ! if( fgd && g->pri == pri ) { > ! warn(root->fileName.data(), root->startLine, > ! "Warning: Member %s found in multiple %s groups! " > ! "The member will be put in group %s, and not in group %s", > ! md->name().data(), Grouping::getGroupPriName( pri ), > ! gd->name().data(), fgd->name().data() > ! ); > } > ! > ! fgd = gd; > ! pri = g->pri; > ! } > ! } > ! > ! // put member into group defined by this entry? > ! if( fgd ) > ! { > ! GroupDef *mgd = md->getGroupDef(); > ! if (mgd==0) > ! { > ! fgd->insertMember(md); > ! md->setGroupDef(fgd, pri, root->fileName, root->startLine, root->doc.length() != 0); > ! } > ! else if (mgd!=fgd) > ! { > ! bool moveit = false; > ! > ! // move member from one group to another if > ! // - the new one has a higher priority > ! // - the new entry has the same priority, but with docs where the old one had no docs > ! if( md->getGroupPri() < pri ) > ! moveit = true; > ! else > { > ! if( md->getGroupPri() == pri ) > ! { > ! > ! if( root->doc.length() != 0 && !md->getGroupHasDocs() ) > ! moveit = true; > ! else if( root->doc.length() != 0 && md->getGroupHasDocs() ) > ! { > ! warn(md->getGroupFileName(),md->getGroupStartLine(), > ! "Warning: Member documentation for %s found several times in %s groups!\n" > ! "%s:%d: The member will remain in group %s, and won't be put into group %s", > ! md->name().data(), Grouping::getGroupPriName( pri ), > ! root->fileName.data(), root->startLine, > ! mgd->name().data(), > ! fgd->name().data() > ! ); > ! } > ! } > ! } > ! > ! if( moveit ) > ! { > ! mgd->removeMember(md); > ! fgd->insertMember(md); > ! md->setGroupDef(fgd, pri, root->fileName, root->startLine, root->doc.length() != 0); > } > } > } > } > *************** > *** 629,640 **** > > void addExampleToGroups(Entry *root,PageInfo *eg) > { > ! QListIterator<QCString> sli(*root->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > GroupDef *gd=0; > ! if (!s->isEmpty() && (gd=Doxygen::groupDict[*s])) > { > gd->addExample(eg); > //printf("Example %s: in group %s\n",eg->name().data(),s->data()); > --- 755,766 ---- > > void addExampleToGroups(Entry *root,PageInfo *eg) > { > ! QListIterator<Grouping> gli(*root->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > GroupDef *gd=0; > ! if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) > { > gd->addExample(eg); > //printf("Example %s: in group %s\n",eg->name().data(),s->data()); > Index: src//groupdef.h > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/groupdef.h,v > retrieving revision 1.1.1.7 > diff -c -r1.1.1.7 groupdef.h > *** src//groupdef.h 2001/04/26 11:54:15 1.1.1.7 > --- src//groupdef.h 2001/05/17 14:44:26 > *************** > *** 48,53 **** > --- 48,55 ---- > DefType definitionType() { return TypeGroup; } > QCString getOutputFileBase() const; > const char *groupTitle() const { return title; } > + void setGroupTitle( const char *newtitle ); > + bool hasGroupTitle( ) { return titleSet; } > void addFile(const FileDef *def); > void addClass(const ClassDef *def); > void addNamespace(const NamespaceDef *def); > *************** > *** 55,61 **** > --- 57,65 ---- > void addParentGroup(const GroupDef *def); > void addPage(PageInfo *def); // pages in this group > void addExample(const PageInfo *def); // examples in this group > + bool containsGroup(const GroupDef *def); // true if def is already a subgroup > void insertMember(MemberDef *def); > + void removeMember(MemberDef *md); > void writeDocumentation(OutputList &ol); > int countMembers() const; > bool isLinkableInProject() > *************** > *** 82,87 **** > --- 86,92 ---- > > private: > QCString title; // title of the group > + bool titleSet; // true if title is not the same as the name > QCString fileName; // base name of the generated file > FileList *fileList; // list of files in the group > ClassList *classList; // list of classes in the group > *************** > *** 115,121 **** > /* user defined member groups */ > MemberGroupList *memberGroupList; // list of member groups in this group > MemberGroupDict *memberGroupDict; > - > }; > > class GroupList : public QList<GroupDef> > --- 120,125 ---- > Index: src//memberdef.h > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/memberdef.h,v > retrieving revision 1.1.1.6 > diff -c -r1.1.1.6 memberdef.h > *** src//memberdef.h 2001/04/26 11:54:21 1.1.1.6 > --- src//memberdef.h 2001/05/17 09:37:10 > *************** > *** 85,95 **** > > // scope query members > ClassDef *getClassDef() const { return classDef; } > - GroupDef *getGroupDef() const { return group; } > FileDef *getFileDef() const { return fileDef; } > NamespaceDef* getNamespaceDef() const { return nspace; } > //Definition *getCompoundDef() const; > > // direct kind info > Protection protection() const { return prot; } > Specifier virtualness() const { return virt; } > --- 85,101 ---- > > // scope query members > ClassDef *getClassDef() const { return classDef; } > FileDef *getFileDef() const { return fileDef; } > NamespaceDef* getNamespaceDef() const { return nspace; } > //Definition *getCompoundDef() const; > > + // querying the grouping definition > + GroupDef *getGroupDef() const { return group; } > + Grouping::GroupPri_t getGroupPri() const { return grouppri; } > + const char *getGroupFileName() const { return groupFileName; } > + int getGroupStartLine() const { return groupStartLine; } > + bool getGroupHasDocs() const { return groupHasDocs; } > + > // direct kind info > Protection protection() const { return prot; } > Specifier virtualness() const { return virt; } > *************** > *** 138,144 **** > void setMaxInitLines(int lines) { userInitLines=lines; } > void setMemberClass(ClassDef *cd) { classDef=cd; } > void setSectionList(MemberList *sl) { section=sl; } > ! void setGroupDef(GroupDef *gd) { group=gd; } > void setExplicitExternal(bool b) { explExt=b; } > > void makeRelated() { related=TRUE; } > --- 144,157 ---- > void setMaxInitLines(int lines) { userInitLines=lines; } > void setMemberClass(ClassDef *cd) { classDef=cd; } > void setSectionList(MemberList *sl) { section=sl; } > ! void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs) > ! { > ! group=gd; > ! grouppri=pri; > ! groupFileName=fileName; > ! groupStartLine=startLine; > ! groupHasDocs=hasDocs; > ! } > void setExplicitExternal(bool b) { explExt=b; } > > void makeRelated() { related=TRUE; } > *************** > *** 269,274 **** > --- 282,292 ---- > MemberGroup *memberGroup; // group's member definition > > GroupDef *group; // group in which this member is in > + Grouping::GroupPri_t grouppri; // priority of this definition > + QCString groupFileName; // file where this grouping was defined > + int groupStartLine; // line " " " " " > + bool groupHasDocs; // true if the entry that caused the grouping was documented > + > bool explExt; // member was explicitly declared external > > > Index: src//membergroup.cpp > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/membergroup.cpp,v > retrieving revision 1.1.1.4 > diff -c -r1.1.1.4 membergroup.cpp > *** src//membergroup.cpp 2001/04/26 11:54:21 1.1.1.4 > --- src//membergroup.cpp 2001/05/17 09:49:42 > *************** > *** 75,81 **** > GroupDef *gd; > if (firstMd && (gd=firstMd->getGroupDef())) > { > ! md->setGroupDef(gd); > gd->insertMember(md); > } > } > --- 75,81 ---- > GroupDef *gd; > if (firstMd && (gd=firstMd->getGroupDef())) > { > ! md->setGroupDef(gd, firstMd->getGroupPri(), firstMd->getGroupFileName(), firstMd->getGroupStartLine(), firstMd->getGroupHasDocs()); > gd->insertMember(md); > } > } > Index: src//scanner.l > =================================================================== > RCS file: /Projects/psp/local/src/CVS-Repository/doxygen/src/scanner.l,v > retrieving revision 1.1.1.11 > diff -c -r1.1.1.11 scanner.l > *** src//scanner.l 2001/05/02 12:38:35 1.1.1.11 > --- src//scanner.l 2001/05/17 13:53:04 > *************** > *** 142,149 **** > static QCString *pCopyCurlyString; > static QCString *pCopyQuotedString; > static QCString *pSkipDoc; > ! static QStack<QCString> autoGroupNameStack; > ! static QCString lastDefGroup; > > static bool insideFormula; > static bool insideTryBlock=FALSE; > --- 142,149 ---- > static QCString *pCopyCurlyString; > static QCString *pCopyQuotedString; > static QCString *pSkipDoc; > ! static QStack<Grouping> autoGroupStack; > ! static Grouping lastDefGroup( "", Grouping::GROUPING_LOWEST ); > > static bool insideFormula; > static bool insideTryBlock=FALSE; > *************** > *** 168,174 **** > virt = Normal; > baseVirt = Normal; > isTypedef = FALSE; > ! autoGroupNameStack.clear(); > insideTryBlock = FALSE; > insideIDL = FALSE; > } > --- 168,174 ---- > virt = Normal; > baseVirt = Normal; > isTypedef = FALSE; > ! autoGroupStack.clear(); > insideTryBlock = FALSE; > insideIDL = FALSE; > } > *************** > *** 180,217 **** > current->virt = virt; > current->stat = gstat; > current->mGrpId = memberGroupId; > ! if (!autoGroupNameStack.isEmpty()) > { > ! current->groups->append(new QCString(*autoGroupNameStack.top())); > } > } > > //----------------------------------------------------------------------------- > > ! /// remove old group name (if given) and add new one (if given) > ! static void setCurrentGroup( QCString *oldgroup, QCString *newgroup ) > { > ! if (oldgroup) > { > ! /* remove auto group name from current entry and discard it */ > ! QCString *s = current->groups->first(); > ! int i=0; > ! while (s) > ! { > ! if (*s==*oldgroup) > ! { > ! current->groups->remove(i); > ! break; > ! } > ! s=current->groups->next(); > ! i++; > ! } > } > > /* use new group name instead? */ > if ( newgroup ) > { > ! current->groups->append(new QCString(*newgroup)); > } > } > > --- 180,214 ---- > current->virt = virt; > current->stat = gstat; > current->mGrpId = memberGroupId; > ! if (!autoGroupStack.isEmpty()) > { > ! current->groups->append(new Grouping(*autoGroupStack.top())); > } > } > > //----------------------------------------------------------------------------- > > ! /// remove any automatic grouping and add new one (if given) > ! static void setCurrentGroup( QCString *newgroup, Grouping::GroupPri_t pri ) > { > ! /* remove auto group name from current entry and discard it */ > ! Grouping *g = current->groups->first(); > ! int i=0; > ! while (g) > { > ! if (g->pri <= Grouping::GROUPING_AUTO_DEF) > ! { > ! current->groups->remove(i); > ! i--; > ! } > ! g=current->groups->next(); > ! i++; > } > > /* use new group name instead? */ > if ( newgroup ) > { > ! current->groups->append(new Grouping(*newgroup, pri)); > } > } > > *************** > *** 474,480 **** > %x DocBaseClass > %x CppQuote > %x EndCppQuote > - %x AddGroupDocArg1 > %x GroupDocArg1 > %x GroupDocArg2 > %x GroupName > --- 471,476 ---- > *************** > *** 1690,1700 **** > varEntry->mGrpId = current->mGrpId; > > // deep copy group list > ! QListIterator<QCString> sli(*current->groups); > ! QCString *s; > ! for (;(s=sli.current());++sli) > { > ! varEntry->groups->append(new QCString(*s)); > } > > //printf("Add: type=`%s',name=`%s',args=`%s'\n", > --- 1686,1696 ---- > varEntry->mGrpId = current->mGrpId; > > // deep copy group list > ! QListIterator<Grouping> gli(*current->groups); > ! Grouping *g; > ! for (;(g=gli.current());++gli) > { > ! varEntry->groups->append(new Grouping(*g)); > } > > //printf("Add: type=`%s',name=`%s',args=`%s'\n", > *************** > *** 2685,2698 **** > current->section = Entry::GROUPDOC_SEC; > current->fileName = yyFileName; > current->startLine = yyLineNr; > BEGIN( GroupDocArg1 ); > } > <Doc,JavaDoc>{B}*{CMD}"addtogroup"{B}+ { > ! current->section = Entry::ADDGRPDOC_SEC; > current->fileName = yyFileName; > current->startLine = yyLineNr; > ! BEGIN( AddGroupDocArg1 ); > } > <Doc,JavaDoc>{B}*{CMD}"namespace"{B}+ { > current->section = Entry::NAMESPACEDOC_SEC; > current->fileName = yyFileName; > --- 2681,2703 ---- > current->section = Entry::GROUPDOC_SEC; > current->fileName = yyFileName; > current->startLine = yyLineNr; > + current->groupdoctype = Entry::GROUPDOC_NORMAL; > BEGIN( GroupDocArg1 ); > } > <Doc,JavaDoc>{B}*{CMD}"addtogroup"{B}+ { > ! current->section = Entry::GROUPDOC_SEC; > current->fileName = yyFileName; > current->startLine = yyLineNr; > ! current->groupdoctype = Entry::GROUPDOC_ADD; > ! BEGIN( GroupDocArg1 ); > } > + <Doc,JavaDoc>{B}*{CMD}"weakgroup"{B}+ { > + current->section = Entry::GROUPDOC_SEC; > + current->fileName = yyFileName; > + current->startLine = yyLineNr; > + current->groupdoctype = Entry::GROUPDOC_WEAK; > + BEGIN( GroupDocArg1 ); > + } > <Doc,JavaDoc>{B}*{CMD}"namespace"{B}+ { > current->section = Entry::NAMESPACEDOC_SEC; > current->fileName = yyFileName; > *************** > *** 2754,2760 **** > BEGIN( ExampleDocArg1 ); > } > <LineDoc>{CMD}"name"[^\n]*\n { > ! lastDefGroup.resize(0); > memberGroupHeader=&yytext[5]; > memberGroupHeader=memberGroupHeader.stripWhiteSpace(); > current->section = Entry::MEMBERGRP_SEC; > --- 2759,2765 ---- > BEGIN( ExampleDocArg1 ); > } > <LineDoc>{CMD}"name"[^\n]*\n { > ! lastDefGroup.groupname.resize(0); > memberGroupHeader=&yytext[5]; > memberGroupHeader=memberGroupHeader.stripWhiteSpace(); > current->section = Entry::MEMBERGRP_SEC; > *************** > *** 2764,2770 **** > BEGIN( lastDocContext ); > } > <Doc,JavaDoc>{CMD}"name"{B}+ { > ! lastDefGroup.resize(0); > current->section = Entry::MEMBERGRP_SEC; > current->fileName = yyFileName; > current->startLine = yyLineNr; > --- 2769,2775 ---- > BEGIN( lastDocContext ); > } > <Doc,JavaDoc>{CMD}"name"{B}+ { > ! lastDefGroup.groupname.resize(0); > current->section = Entry::MEMBERGRP_SEC; > current->fileName = yyFileName; > current->startLine = yyLineNr; > *************** > *** 2947,2976 **** > yyLineNr++; > > } > - <AddGroupDocArg1>{ID} { > - current->name = yytext; > - lastDefGroup = yytext; > - newDocState(); > - } > - <AddGroupDocArg1>"\n" { > - warn(yyFileName,yyLineNr, > - "Warning: missing argument after " > - "\\addtogroup." > - ); > - yyLineNr++; > - BEGIN( Doc ); > - } > - <GroupDocArg2>"*/" { > - unput('/');unput('*'); > - warn(yyFileName,yyLineNr, > - "Warning: missing argument after " > - "\\addtogroup." > - ); > - BEGIN( Doc ); > - } > <GroupDocArg1>{ID}(".html"?) { > current->name = yytext; > ! lastDefGroup = yytext; > // the .html stuff is for Qt compatibility > if (current->name.right(5)==".html") > current->name=current->name.left(current->name.length()-5); > --- 2952,2961 ---- > yyLineNr++; > > } > <GroupDocArg1>{ID}(".html"?) { > current->name = yytext; > ! lastDefGroup.groupname = yytext; > ! lastDefGroup.pri = current->groupingpri(); > // the .html stuff is for Qt compatibility > if (current->name.right(5)==".html") > current->name=current->name.left(current->name.length()-5); > *************** > *** 2979,3003 **** > <GroupDocArg1>"\\"{B}*"\n" { yyLineNr++; } > <GroupDocArg1>"\n" { > warn(yyFileName,yyLineNr, > ! "Warning: missing argument after " > ! "\\defgroup." > ); > yyLineNr++; > BEGIN( Doc ); > } > <GroupDocArg2>[^\n\*]+ { > current->type += yytext; > current->type = current->type.stripWhiteSpace(); > } > - <GroupDocArg2>. { > - current->type += yytext; > - } > - <GroupDocArg2>"\\"{B}*"\n" { yyLineNr++; } > - <GroupDocArg2>"*/" { > - unput('/');unput('*'); > - newDocState(); > - } > <GroupDocArg2>"\n" { > yyLineNr++; > newDocState(); > } > --- 2964,2992 ---- > <GroupDocArg1>"\\"{B}*"\n" { yyLineNr++; } > <GroupDocArg1>"\n" { > warn(yyFileName,yyLineNr, > ! "Warning: missing group name after %s", > ! current->groupdoccmd() > ); > yyLineNr++; > BEGIN( Doc ); > } > + <GroupDocArg2>{B}*"*/" { > + // fake input for end of title rule > + yyLineNr--; > + unput('/');unput('*');unput('\n'); > + } > + <GroupDocArg2>"\\"{B}*"\n" { yyLineNr++; } > <GroupDocArg2>[^\n\*]+ { > current->type += yytext; > current->type = current->type.stripWhiteSpace(); > } > <GroupDocArg2>"\n" { > + if( current->groupdoctype == Entry::GROUPDOC_NORMAL && > + current->type.length() == 0 ) > + warn(yyFileName,yyLineNr, > + "Warning: missing title after " > + "\\defgroup %s", current->name.data() > + ); > yyLineNr++; > newDocState(); > } > *************** > *** 3241,3251 **** > BEGIN( GroupName ); > } > <ClassDoc,Doc,JavaDoc>{CMD}"{" { > ! if (current->section==Entry::GROUPDOC_SEC || > ! current->section==Entry::ADDGRPDOC_SEC > ! ) > { > ! autoGroupNameStack.push(new QCString(current->name)); > } > else if (current->section == Entry::MEMBERGRP_SEC) > { > --- 3230,3240 ---- > BEGIN( GroupName ); > } > <ClassDoc,Doc,JavaDoc>{CMD}"{" { > ! if (current->section==Entry::GROUPDOC_SEC ) > { > ! autoGroupStack.push(new Grouping(current->name, > ! current->groupingpri() > ! )); > } > else if (current->section == Entry::MEMBERGRP_SEC) > { > *************** > *** 3393,3399 **** > } > <GroupName>{ID} { > current->groups->append( > ! new QCString(yytext) > ); > } > <GroupName>\n { > --- 3382,3388 ---- > } > <GroupName>{ID} { > current->groups->append( > ! new Grouping(yytext, Grouping::GROUPING_INGROUP) > ); > } > <GroupName>\n { > *************** > *** 3746,3763 **** > warn(yyFileName,yyLineNr,"Warning: ignoring nested member group. " > "Previous command was found at line %d.",lastMemberGroupLine); > } > ! else if (!lastDefGroup.isEmpty()) > { > ! setCurrentGroup( autoGroupNameStack.top(), &lastDefGroup); > ! autoGroupNameStack.push(new QCString(lastDefGroup)); > ! lastDefGroup.resize(0); > } > else > { > if (memberGroupHeader.isEmpty()) > { > ! //warn("Warning: member group does not have a header " > ! // "at line %d of %s.\n",yyLineNr,yyFileName); > memberGroupHeader="[NOHEADER]"; > } > memberGroupId = newMemberGroupId(); > --- 3735,3751 ---- > warn(yyFileName,yyLineNr,"Warning: ignoring nested member group. " > "Previous command was found at line %d.",lastMemberGroupLine); > } > ! else if (!lastDefGroup.groupname.isEmpty()) > { > ! setCurrentGroup( &lastDefGroup.groupname, lastDefGroup.pri ); > ! autoGroupStack.push(new Grouping(lastDefGroup)); > ! lastDefGroup.groupname.resize(0); > } > else > { > if (memberGroupHeader.isEmpty()) > { > ! // warn( yyFileName, yyLineNr, "Warning: member group does not have a header" ); > memberGroupHeader="[NOHEADER]"; > } > memberGroupId = newMemberGroupId(); > *************** > *** 3768,3774 **** > > static void endGroup() > { > ! if (memberGroupId==NOGROUP && autoGroupNameStack.isEmpty()) > { > warn(yyFileName,yyLineNr, > "Warning: end of group without matching begin."); > --- 3756,3762 ---- > > static void endGroup() > { > ! if (memberGroupId==NOGROUP && autoGroupStack.isEmpty()) > { > warn(yyFileName,yyLineNr, > "Warning: end of group without matching begin."); > *************** > *** 3789,3799 **** > memberGroupHeader.resize(0); > memberGroupDocs.resize(0); > } > ! else if (!autoGroupNameStack.isEmpty()) // end of group > { > ! QCString *oldName = autoGroupNameStack.pop(); > ! setCurrentGroup(oldName,autoGroupNameStack.top()); > ! delete oldName; > } > } > > --- 3777,3792 ---- > memberGroupHeader.resize(0); > memberGroupDocs.resize(0); > } > ! else if (!autoGroupStack.isEmpty()) // end of group > { > ! Grouping *current = autoGroupStack.pop(); > ! Grouping *parent = autoGroupStack.top(); > ! if( parent ) { > ! setCurrentGroup( &parent->groupname, parent->pri ); > ! } else { > ! setCurrentGroup( NULL, Grouping::GROUPING_LOWEST ); > ! } > ! delete current; > } > } > > *************** > *** 3854,3868 **** > > memberGroupId = NOGROUP; > > ! // rebuild compound's group context > ! QCString *s = ce->groups->first(); > ! if (s) > ! { > ! lastDefGroup=*s; > ! startGroup(); > ! } > > ! current->mGrpId = memberGroupId = ce->mGrpId; > > scanYYlex() ; > delete current; current=0; > --- 3847,3861 ---- > > memberGroupId = NOGROUP; > > ! // don't rebuild compound's group context > ! // Grouping *g = ce->groups->first(); > ! // if (g) > ! // { > ! // lastDefGroup=*g; > ! // startGroup(); > ! // } > > ! // current->mGrpId = memberGroupId = ce->mGrpId; > > scanYYlex() ; > delete current; current=0; > # Doxyfile 1.2.6-20010422 > > # This file describes the settings to be used by doxygen for a project > # > # All text after a hash (#) is considered a comment and will be ignored > # The format is: > # TAG = value [value, ...] > # For lists items can also be appended using: > # TAG += value [value, ...] > # Values that contain spaces should be placed between quotes (" ") > > #--------------------------------------------------------------------------- > # General configuration options > #--------------------------------------------------------------------------- > > # The PROJECT_NAME tag is a single word (or a sequence of words surrounded > # by quotes) that should identify the project. > > PROJECT_NAME = > > # The PROJECT_NUMBER tag can be used to enter a project or revision number. > # This could be handy for archiving the generated documentation or > # if some version control system is used. > > PROJECT_NUMBER = > > # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) > # base path where the generated documentation will be put. > # If a relative path is entered, it will be relative to the location > # where doxygen was started. If left blank the current directory will be used. > > OUTPUT_DIRECTORY = > > # The OUTPUT_LANGUAGE tag is used to specify the language in which all > # documentation generated by doxygen is written. Doxygen will use this > # information to generate all constant output in the proper language. > # The default language is English, other supported languages are: > # Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, > # Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian, > # Polish, Portuguese, Brazilian and Slovene. > > OUTPUT_LANGUAGE = English > > # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in > # documentation are documented, even if no documentation was available. > # Private class members and static file members will be hidden unless > # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES > > EXTRACT_ALL = YES > > # If the EXTRACT_PRIVATE tag is set to YES all private members of a class > # will be included in the documentation. > > EXTRACT_PRIVATE = YES > > # If the EXTRACT_STATIC tag is set to YES all static members of a file > # will be included in the documentation. > > EXTRACT_STATIC = YES > > # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all > # undocumented members of documented classes, files or namespaces. > # If set to NO (the default) these members will be included in the > # various overviews, but no documentation section is generated. > # This option has no effect if EXTRACT_ALL is enabled. > > HIDE_UNDOC_MEMBERS = NO > > # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all > # undocumented classes that are normally visible in the class hierarchy. > # If set to NO (the default) these class will be included in the various > # overviews. This option has no effect if EXTRACT_ALL is enabled. > > HIDE_UNDOC_CLASSES = NO > > # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will > # include brief member descriptions after the members that are listed in > # the file and class documentation (similar to JavaDoc). > # Set to NO to disable this. > > BRIEF_MEMBER_DESC = YES > > # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend > # the brief description of a member or function before the detailed description. > # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the > # brief descriptions will be completely suppressed. > > REPEAT_BRIEF = YES > > # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then > # Doxygen will generate a detailed section even if there is only a brief > # description. > > ALWAYS_DETAILED_SEC = NO > > # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full > # path before files name in the file list and in the header files. If set > # to NO the shortest path that makes the file name unique will be used. > > FULL_PATH_NAMES = NO > > # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag > # can be used to strip a user defined part of the path. Stripping is > # only done if one of the specified strings matches the left-hand part of > # the path. It is allowed to use relative paths in the argument list. > > STRIP_FROM_PATH = > > # The INTERNAL_DOCS tag determines if documentation > # that is typed after a \internal command is included. If the tag is set > # to NO (the default) then the documentation will be excluded. > # Set it to YES to include the internal documentation. > > INTERNAL_DOCS = NO > > # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will > # generate a class diagram (in Html and LaTeX) for classes with base or > # super classes. Setting the tag to NO turns the diagrams off. > > CLASS_DIAGRAMS = YES > > # If the SOURCE_BROWSER tag is set to YES then a list of source files will > # be generated. Documented entities will be cross-referenced with these sources. > > SOURCE_BROWSER = NO > > # Setting the INLINE_SOURCES tag to YES will include the body > # of functions and classes directly in the documentation. > > INLINE_SOURCES = NO > > # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct > # doxygen to hide any special comment blocks from generated source code > # fragments. Normal C and C++ comments will always remain visible. > > STRIP_CODE_COMMENTS = YES > > # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate > # file names in lower case letters. If set to YES upper case letters are also > # allowed. This is useful if you have classes or files whose names only differ > # in case and if your file system supports case sensitive file names. Windows > # users are adviced to set this option to NO. > > CASE_SENSE_NAMES = YES > > # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter > # (but less readable) file names. This can be useful is your file systems > # doesn't support long names like on DOS, Mac, or CD-ROM. > > SHORT_NAMES = NO > > # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen > # will show members with their full class and namespace scopes in the > # documentation. If set to YES the scope will be hidden. > > HIDE_SCOPE_NAMES = NO > > # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen > # will generate a verbatim copy of the header file for each class for > # which an include is specified. Set to NO to disable this. > > VERBATIM_HEADERS = YES > > # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen > # will put list of the files that are included by a file in the documentation > # of that file. > > SHOW_INCLUDE_FILES = YES > > # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen > # will interpret the first line (until the first dot) of a JavaDoc-style > # comment as the brief description. If set to NO, the JavaDoc > # comments will behave just like the Qt-style comments (thus requiring an > # explict @brief command for a brief description. > > JAVADOC_AUTOBRIEF = NO > > # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented > # member inherits the documentation from any documented member that it > # reimplements. > > INHERIT_DOCS = YES > > # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] > # is inserted in the documentation for inline members. > > INLINE_INFO = YES > > # If the SORT_MEMBER_DOCS tag... [truncated message content] |