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] |