Thread: [Doxygen-users] grouping patches
Brought to you by:
dimitri
From: Patrick O. <Pat...@pa...> - 2001-05-17 16:03:14
|
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 * 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 .......................................................... |
From: Ronald v. E. <eij...@iq...> - 2001-05-18 09:58:28
|
DQpQYXRyaWNrIE9obHkgd3JvdGU6DQo+IE1lbWJlciBncm91cHMgKGkuZS4gZ3JvdXBpbmcgb2Yg c3RydWN0L2NsYXNzIG1lbWJlcnMpIHdvcmtzIGFzDQo+IGJlZm9yZS4NCg0KQXJlIHRoZXJlIGFu eSBwbGFucyB0byBhZGQgdGhlIGN1cnJlbnQgZ3JvdXBpbmcgZnVuY3Rpb25zIGZvciBNZW1iZXIg Z3JvdXBzIGFzd2VsbD8NCg0KQyd5YSwNCg0KICAgIFJvbmFsZA0K |
From: Patrick O. <Pat...@pa...> - 2001-05-18 10:54:15
|
On Fri, May 18, 2001 at 11:51:42AM +0200, Ronald van Eijck wrote: > > Patrick Ohly wrote: > > Member groups (i.e. grouping of struct/class members) works as > > before. > > Are there any plans to add the current grouping functions for Member groups aswell? I don't have such plans. The two concepts are completely disjunct and supporting member groups that you can refer to later would require some more rewrites. 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 .......................................................... |
From: Patrick O. <Pat...@pa...> - 2001-05-18 10:15:07
Attachments:
groupsdiff.gz
|
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] |