Commit c6b7c8e7 authored by dimitri's avatar dimitri

Release-1.1.4

parent 832e08dc
DOXYGEN Version 1.1.3-20000528
DOXYGEN Version 1.1.4
CONTENTS
--------
......@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have:
gunzip doxygen-1.1.3-20000528.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.3-20000528.src.tar # unpack it
gunzip doxygen-1.1.4.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.4.src.tar # unpack it
2. Run the configure script:
......@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (28 May 2000)
Dimitri van Heesch (04 June 2000)
DOXYGEN Version 1.1.3-20000528
DOXYGEN Version 1.1.4
Please read INSTALL for compilation instructions.
......@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (28 May 2000)
Dimitri van Heesch (04 June 2000)
1.1.3-20000528
1.1.4
The configgen tool is used to:
- generate the parser for the configuration file based on
the templates config_templ.h and config_templ.l
- generate the GUI frontend "doxywizard" for creating a configuration
file based on the templates doxywizard_templ.h and doxywizard_templ.cpp
If you want to add a new configuration option to doxygen,
then you should add a new entry the init() function in configgen.cpp
After that you can do a "make install" in this directory to update
the config.l and config.h in doxygen's source directory.
-Dimitri
......@@ -622,6 +622,39 @@ void checkConfig()
#endif
s=Config::includePath.next();
}
// check dot path
if (!Config::dotPath.isEmpty())
{
if (Config::dotPath.find('\\')!=-1)
{
if (Config::dotPath.at(Config::dotPath.length()-1)!='\\')
{
Config::dotPath+='\\';
}
}
else if (Config::dotPath.find('/')!=-1)
{
if (Config::dotPath.at(Config::dotPath.length()-1)!='/')
{
Config::dotPath+='/';
}
}
#if defined(_WIN32)
QFileInfo dp(Config::dotPath+"dot.exe");
#else
QFileInfo dp(Config::dotPath+"dot");
#endif
if (!dp.exists() || !dp.isFile())
{
err("Warning: the dot tool could not be found at %s\n",Config::dotPath.data());
}
}
else // make sure the string is empty but not null!
{
Config::dotPath="";
}
// check input
if (Config::inputSources.count()==0)
{
......@@ -646,13 +679,13 @@ void checkConfig()
// add default pattern if needed
if (Config::filePatternList.isEmpty())
{
Config::filePatternList="*";
Config::filePatternList.append("*");
}
// add default pattern if needed
if (Config::examplePatternList.isEmpty())
{
Config::examplePatternList="*";
Config::examplePatternList.append("*");
}
// add default pattern if needed
......@@ -676,18 +709,23 @@ void checkConfig()
err("Error: tag CGI_URL: no URL to cgi directory specified.\n");
exit(1);
}
else if (Config::cgiURL.left(7)!="http://")
else if (Config::cgiURL.left(7)!="http://" &&
Config::cgiURL.left(8)!="https://"
)
{
err("Error: tag CGI_URL: URL to cgi directory is invalid (must "
"start with http://).\n");
"start with http:// or https://).\n");
exit(1);
}
// check documentation URL
if (Config::docURL.isEmpty())
{
Config::docURL = Config::outputDir.copy().prepend("file://")+"html";
Config::docURL = Config::outputDir.copy().prepend("file://").append("html");
}
else if (Config::docURL.left(7)!="http://" && Config::docURL.left(7)!="file://")
else if (Config::docURL.left(7)!="http://" &&
Config::docURL.left(8)!="https://" &&
Config::docURL.left(7)!="file://"
)
{
err("Error: tag DOC_URL: URL to documentation is invalid or "
"not absolute.\n");
......
......@@ -1486,6 +1486,15 @@ void init()
"will graphical hierarchy of all classes instead of a textual one. \n"
);
addDependency("gfxHierarchyFlag","haveDotFlag");
ConfigString::add("dotPath",
"DOT_PATH",
"",
"path to the dot tool",
"This tag can be used to specify the path where the dot tool can be found. \n"
"If left blank, it is assumed the dot tool can be found on the path. \n",
ConfigString::Dir
);
addDependency("dotPath","haveDotFlag");
//-----------------------------------------------------------------------------------------------
ConfigInfo::add( "Search","Configuration::addtions related to the search engine ");
......@@ -1555,12 +1564,4 @@ void init()
addDependency("extDocPathList","searchEngineFlag");
// The IMAGE_PATTERNS tag is now officially obsolete.
//-----------------------------------------------------------------------------------------------
//ConfigInfo::add("not used");
//-----------------------------------------------------------------------------------------------
//ConfigList::add("imagePatternList",
// "IMAGE_PATTERNS",
// "",
// "list of image paths",
// "dont know\n");
}
......@@ -74,6 +74,7 @@ documentation:
<li> \refitem cmdfbrclose \f]
<li> \refitem cmdfile \file
<li> \refitem cmdfn \fn
<li> \refitem cmdhideinitializer \hideinitializer
<li> \refitem cmdhtmlonly \htmlonly
<li> \refitem cmdif \if
<li> \refitem cmdimage \image
......@@ -100,11 +101,13 @@ documentation:
<li> \refitem cmdretval \retval
<li> \refitem cmdsa \sa
<li> \refitem cmdsection \section
<li> \refitem cmdshowinitializer \showinitializer
<li> \refitem cmdskip \skip
<li> \refitem cmdskipline \skipline
<li> \refitem cmdstruct \struct
<li> \refitem cmdsubsection \subsection
<li> \refitem cmdthrow \throw
<li> \refitem cmdtodo \todo
<li> \refitem cmdtypedef \typedef
<li> \refitem cmdunion \union
<li> \refitem cmduntil \until
......@@ -300,6 +303,17 @@ Doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdvar "\\var" and \ref cmdtypedef "\\typedef".
<hr>
\subsection cmdhideinitializer \hideinitializer
\addindex \hideinitializer
By default the value of a define and the initializer of a variable
are displayed unless they are longer than 30 lines. By putting
this command in a comment block of a define or variable, the
initializer always hidden.
\sa section \ref cmdshowinitializer "\\showinitializer".
<hr>
\subsection cmdingroup \ingroup (<groupname> [<groupname> <groupname>])
......@@ -452,6 +466,17 @@ Public/Protected/Private/... section.
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
<hr>
\subsection cmdshowinitializer \showinitializer
\addindex \showinitializer
By default the value of a define and the initializer of a variable
are only displayed if they are less than 30 lines long. By putting
this command in a comment block of a define or variable, the
initializer is shown unconditionally.
\sa section \ref cmdhideinitializer "\\hideinitializer".
<hr>
\subsection cmdstruct \struct <name> [<header-file>] [<header-name>]
......@@ -757,6 +782,13 @@ Public/Protected/Private/... section.
\par Note:
the tag \\throws is a synonym for this tag.
<hr>
\subsection cmdtodo \todo ( one line todo description )
\addindex \todo
Adds a TODO item to the documentation. The item will also be added
to a TODO list. Both instances of the item will be cross-referenced.
<hr>
\subsection cmdversion \version { version number }
......
......@@ -137,6 +137,8 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_tagfiles TAGFILES
<li> \refitem cfg_verbatim_headers VERBATIM_HEADERS
<li> \refitem cfg_warnings WARNINGS
<li> \refitem cfg_warn_format WARN_FORMAT
<li> \refitem cfg_warn_if_undocumented WARN_IF_UNDOCUMENTED
\htmlonly
</ul>
</multicol>
......@@ -182,23 +184,6 @@ followed by the descriptions of the tags grouped by category.
The default language is English, other supported languages are:
Dutch, French, Italian, Czech, Swedish, German and Japanese.
\anchor cfg_quiet
<dt>\c QUIET <dd>
\addindex QUIET
The \c QUIET tag can be used to turn on/off the messages that are generated
to standard output by doxygen. Possible values are \c YES and \c NO,
where \c YES implies that the messages are off.
If left blank \c NO is used.
\anchor cfg_warnings
<dt>\c WARNINGS <dd>
\addindex WARNINGS
The \c WARNINGS tag can be used to turn on/off the warning messages that are
generated to standard error by doxygen. Possible values are \c YES and \c NO,
where \c YES implies that the warnings are on. If left blank \c NO is used.
\b Tip: Turn warnings on while writing the documentation.
\anchor cfg_disable_index
<dt>\c DISABLE_INDEX <dd>
\addindex DISABLE_INDEX
......@@ -248,14 +233,6 @@ followed by the descriptions of the tags grouped by category.
the file and class documentation (similar to JavaDoc).
Set to NO to disable this.
\anchor cfg_internal_docs
<dt>\c INTERNAL_DOCS <dd>
\addindex INTERNAL_DOCS
The \c INTERNAL_DOCS tag determines if documentation
that is typed after a \\internal command is included. If the tag is set
to \c NO (the default) then the documentation will be excluded.
Set it to \c YES to include the internal documentation.
\anchor cfg_repeat_brief
<dt>\c REPEAT_BRIEF <dd>
\addindex REPEAT_BRIEF
......@@ -288,6 +265,14 @@ followed by the descriptions of the tags grouped by category.
only done if one of the specified strings matches the left-hand part of the
path.
\anchor cfg_internal_docs
<dt>\c INTERNAL_DOCS <dd>
\addindex INTERNAL_DOCS
The \c INTERNAL_DOCS tag determines if documentation
that is typed after a \\internal command is included. If the tag is set
to \c NO (the default) then the documentation will be excluded.
Set it to \c YES to include the internal documentation.
\anchor cfg_class_diagrams
<dt>\c CLASS_DIAGRAMS <dd>
\addindex CLASS_DIAGRAMS
......@@ -382,6 +367,43 @@ followed by the descriptions of the tags grouped by category.
</dl>
\subsection messages_input Options related to warning and progress messages
\anchor cfg_quiet
<dl>
<dt>\c QUIET <dd>
\addindex QUIET
The \c QUIET tag can be used to turn on/off the messages that are generated
to standard output by doxygen. Possible values are \c YES and \c NO,
where \c YES implies that the messages are off.
If left blank \c NO is used.
\anchor cfg_warnings
<dt>\c WARNINGS <dd>
\addindex WARNINGS
The \c WARNINGS tag can be used to turn on/off the warning messages that are
generated to standard error by doxygen. Possible values are \c YES and \c NO,
where \c YES implies that the warnings are on. If left blank \c NO is used.
\b Tip: Turn warnings on while writing the documentation.
\anchor cfg_warn_if_undocumented
<dt>\c WARN_IF_UNDOCUMENTED <dd>
\addindex WARN_IF_UNDOCUMENTED
If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
for undocumented members. If EXTRACT_ALL is set to YES then this flag will
automatically be disabled.
\anchor cfg_warn_format
<dt>\c WARN_FORMAT <dd>
\addindex WARN_FORMAT
The WARN_FORMAT tag determines the format of the warning messages that
doxygen can produce. The string should contain the $file, $line, and $text
tags, which will be replaced by the file and line number from which the
warning originated and the warning text.
</dl>
\subsection config_input Input related options
\anchor cfg_input
<dl>
......@@ -464,6 +486,33 @@ followed by the descriptions of the tags grouped by category.
</dl>
\subsection alphabetical_index Alphabetical index options
\anchor cfg_alphabetical_index
<dl>
<dt>\c ALPHABETICAL_INDEX <dd>
\addindex ALPHABETICAL_INDEX
If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
of all compounds will be generated. Enable this if the project contains
a lot of classes, structs, unions or interfaces.
\anchor cfg_cols_in_alpha_index
<dt>\c COLS_IN_ALPHA_INDEX <dd>
\addindex COLS_IN_ALPHA_INDEX
If the alphabetical index is enabled
(see \c ALPHABETICAL_INDEX) then the \c COLS_IN_ALPHA_INDEX tag can be
used to specify the number of columns in which this list will be split (can be a number in the range [1..20])
\anchor cfg_ignore_prefix
<dt>\c IGNORE_PREFIX <dd>
\addindex IGNORE_PREFIX
In case all classes in a project start with a common prefix, all classes will
be put under the same header in the alphabetical index.
The \c IGNORE_PREFIX tag can be used to specify a prefix
(or a list of prefixes) that should be ignored while generating the index
headers.
</dl>
\subsection html_output HTML related options
\anchor cfg_generate_html
<dl>
......@@ -595,33 +644,6 @@ FONT.charliteral { color: #008080 }
(which basically renders \c doxysearch obsolete on Windows).
The HTML workshop also contains a viewer for compressed HTML files.
</dl>
\subsection alphabetical_index Alphabetical index options
\anchor cfg_alphabetical_index
<dl>
<dt>\c ALPHABETICAL_INDEX <dd>
\addindex ALPHABETICAL_INDEX
If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
of all compounds will be generated. Enable this if the project contains
a lot of classes, structs, unions or interfaces.
\anchor cfg_cols_in_alpha_index
<dt>\c COLS_IN_ALPHA_INDEX <dd>
\addindex COLS_IN_ALPHA_INDEX
If the alphabetical index is enabled
(see \c ALPHABETICAL_INDEX) then the \c COLS_IN_ALPHA_INDEX tag can be
used to specify the number of columns in which this list will be split (can be a number in the range [1..20])
\anchor cfg_ignore_prefix
<dt>\c IGNORE_PREFIX <dd>
\addindex IGNORE_PREFIX
In case all classes in a project start with a common prefix, all classes will
be put under the same header in the alphabetical index.
The \c IGNORE_PREFIX tag can be used to specify a prefix
(or a list of prefixes) that should be ignored while generating the index
headers.
</dl>
\subsection latex_output LaTeX related options
\anchor cfg_generate_latex
......@@ -940,6 +962,12 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
If the \c GRAPHICAL_HIERARCHY and \c HAVE_DOT tags are set to \c YES then
doxygen will graphical hierarchy of all classes instead of a textual one.
\anchor cfg_dot_path
<dt>\c DOT_PATH <dd>
\addindex DOT_PATH
This tag can be used to specify the path where the dot tool can be found.
If left blank, it is assumed the dot tool can be found on the path.
</dl>
\subsection config_search Search engine options
\anchor cfg_searchengine
......
......@@ -485,10 +485,10 @@ block if you prefer C style
comments. Note that the members of the group should be
physcially inside the member group's body.
Before the opening marker of a block a separate comment block should be
Before the opening marker of a block a separate comment block may be
placed. This block should contain the \ref cmdname "@name"
(or \ref cmdname "\name") command and is used to specify the header
of the group. Optionally, the comment block may contain more
of the group. Optionally, the comment block may also contain more
detailed information about the group.
Nesting of member groups is not allowed.
......@@ -866,6 +866,8 @@ PREDEFINED = DECLARE_REGISTRY_RESOURCEID=// \
"STDMETHOD(a)=HRESULT a" \
"ATL_NO_VTABLE= "\
"__declspec(a)= "\
BEGIN_CONNECTION_POINT_MAP=/* \
END_CONNECTION_POINT_MAP=*///
\endverbatim
As you can see doxygen's preprocessor is quite powerful, but if you want
......
......@@ -2,10 +2,8 @@
class Test
{
public:
/** @name Group1
*/
//@{
/** Function 1 in group 1. Details. */
/** Same documentation for both members. Details */
void func1InGroup1();
void func2InGroup1();
//@}
......@@ -30,3 +28,13 @@ void Test::func2InGroup2() {}
void Test::func1InGroup2() {}
//@}
/*! \file
* docs for this file
*/
//@{
//! one description for all members of this group
#define A 1
#define B 2
void glob_func();
//@}
Name: doxygen
Version: 1.1.3-20000528
Version: 1.1.4
Summary: documentation system for C, C++ and IDL
Release: 1
Source0: doxygen-%{version}.src.tar.gz
......
......@@ -131,29 +131,60 @@ void ClassDef::insertSuperClass(ClassDef *cd,Protection p,
inheritedBy->inSort(new BaseClassDef(cd,p,s,t));
}
void ClassDef::addMemberToGroup(MemberDef *md,int groupId)
void ClassDef::addMemberListToGroup(MemberList *ml)
{
if (groupId!=-1)
MemberListIterator mli(*ml);
MemberDef *md;
for (;(md=mli.current());++mli)
{
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
int groupId=md->getMemberGroupId();
if (groupId!=-1)
{
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
}
}
void ClassDef::addMembersToMemberGroup()
{
addMemberListToGroup(&pubTypes);
addMemberListToGroup(&pubMembers);
addMemberListToGroup(&pubAttribs);
addMemberListToGroup(&pubSlots);
addMemberListToGroup(&signals);
addMemberListToGroup(&pubStaticMembers);
addMemberListToGroup(&pubStaticAttribs);
addMemberListToGroup(&proTypes);
addMemberListToGroup(&proMembers);
addMemberListToGroup(&proAttribs);
addMemberListToGroup(&proSlots);
addMemberListToGroup(&proStaticMembers);
addMemberListToGroup(&proStaticAttribs);
addMemberListToGroup(&priTypes);
addMemberListToGroup(&priMembers);
addMemberListToGroup(&priAttribs);
addMemberListToGroup(&priSlots);
addMemberListToGroup(&priStaticMembers);
addMemberListToGroup(&priStaticAttribs);
addMemberListToGroup(&friends);
addMemberListToGroup(&related);
}
// adds new member definition to the class
void ClassDef::insertMember(MemberDef *md,int groupId)
void ClassDef::insertMember(MemberDef *md)
{
//printf("adding %s::%s\n",name().data(),md->name().data());
if (!isReference())
......@@ -402,7 +433,7 @@ void ClassDef::insertMember(MemberDef *md,int groupId)
/*************************************************/
// Note: this must be done AFTER inserting the member in the
// regular groups
addMemberToGroup(md,groupId);
//addMemberToGroup(md,groupId);
}
......@@ -422,26 +453,26 @@ void ClassDef::insertMember(MemberDef *md,int groupId)
}
void ClassDef::computeMemberGroups()
{
MemberNameInfoListIterator mnili(*allMemberNameInfoList);
MemberNameInfo *mni;
for (;(mni=mnili.current());++mnili)
{
MemberNameInfoIterator mnii(*mni);
MemberInfo *mi;
for (mnii.toFirst();(mi=mnii.current());++mnii)
{
MemberDef *md=mi->memberDef;
MemberGroup *mg = md->getMemberGroup();
if (mg && memberGroupDict->find(mg->groupId())==0)
{
memberGroupDict->insert(mg->groupId(),mg);
memberGroupList->append(mg);
}
}
}
}
//void ClassDef::computeMemberGroups()
//{
// MemberNameInfoListIterator mnili(*allMemberNameInfoList);
// MemberNameInfo *mni;
// for (;(mni=mnili.current());++mnili)
// {
// MemberNameInfoIterator mnii(*mni);
// MemberInfo *mi;
// for (mnii.toFirst();(mi=mnii.current());++mnii)
// {
// MemberDef *md=mi->memberDef;
// MemberGroup *mg = md->getMemberGroup();
// if (mg && memberGroupDict->find(mg->groupId())==0)
// {
// memberGroupDict->insert(mg->groupId(),mg);
// memberGroupList->append(mg);
// }
// }
// }
//}
// compute the anchors for all members
void ClassDef::computeAnchors()
......@@ -539,8 +570,6 @@ void ClassDef::writeDocumentation(OutputList &ol)
pageTitle+=pageType+" Reference";
startFile(ol,fileName,pageTitle);
startTitle(ol,getOutputFileBase());
//ol.docify(name()+" "+pageType.right(pageType.length()-1)+" ");
//parseText(ol,theTranslator->trReference());
parseText(ol,theTranslator->trCompoundReference(name(),compType));
endTitle(ol,getOutputFileBase(),name());
......@@ -1131,8 +1160,8 @@ void ClassDef::writeMemberList(OutputList &ol)
memberWritten=TRUE;
}
if ((protect!=Public || md->isStatic() || virt!=Normal ||
md->isFriend() || md->isRelated() ||
(md->isInline() && Config::inlineInfoFlag)
md->isFriend() || md->isRelated() ||
md->getMemberSpecifiers()!=0
)
&& memberWritten)
{
......@@ -1145,6 +1174,8 @@ void ClassDef::writeMemberList(OutputList &ol)
{
if (Config::inlineInfoFlag && md->isInline())
sl.append("inline");
if (md->isExplicit()) sl.append("explicit");
if (md->isMutable()) sl.append("mutable");
if (protect==Protected) sl.append("protected");
else if (protect==Private) sl.append("private");
if (virt==Virtual) sl.append("virtual");
......
......@@ -68,8 +68,7 @@ class ClassDef : public Definition
//void setIncludeName(const char *n_) { incName=n_; }
MemberNameInfoList *memberNameInfoList() { return allMemberNameInfoList; }
MemberNameInfoDict *memberNameInfoDict() { return allMemberNameInfoDict; }
void insertMember(MemberDef *,int grpId);
void addMemberToGroup(MemberDef *,int grpId);
void insertMember(MemberDef *);
void insertUsedFile(const char *);
void computeAnchors();
void computeMemberGroups();
......@@ -121,10 +120,12 @@ class ClassDef : public Definition
bool visited;
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
protected:
void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
void addMemberListToGroup(MemberList *);
private:
QCString fileName; // HTML containing the class docs
......
......@@ -1002,10 +1002,10 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<SkipCxxComment>. {
g_code->codify(yytext);
}
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)?{B}*"/*"[*!]/[^/*] {
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] {
g_yyLineNr+=QCString(yytext).contains('\n');
}
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)? {
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? {
g_yyLineNr+=QCString(yytext).contains('\n');
g_code->endCodeLine();
if (g_yyLineNr<g_inputLines)
......@@ -1046,7 +1046,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass();
}
}
<*>\n({B}*"//@"[{}]{B}*\n) { // remove one-line group marker
<*>\n({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n) { // remove one-line group marker
if (Config::stripCommentsFlag)
{
g_yyLineNr+=((QCString)yytext).contains('\n');
......@@ -1063,7 +1063,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass();
}
}
<*>^{B}*"//@"[{}]{B}*\n { // remove one-line group marker
<*>^{B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n { // remove one-line group marker
if (Config::stripCommentsFlag)
{
g_yyLineNr++;
......
......@@ -112,6 +112,7 @@ struct Config
static bool collGraphFlag; // collaboration graph
static bool includeGraphFlag; // include graph
static bool gfxHierarchyFlag; // flag to enable graphical hierarchy
static QCString dotPath; // path to the dot tool
static bool searchEngineFlag; // generate search engine flag
static QCString cgiName; // the name of the CGI binary
static QCString cgiURL; // the absolute URL to the CGI binary
......
......@@ -147,6 +147,7 @@ bool Config::classGraphFlag = TRUE;
bool Config::collGraphFlag = TRUE;
bool Config::includeGraphFlag = TRUE;
bool Config::gfxHierarchyFlag = TRUE;
QCString Config::dotPath;
bool Config::searchEngineFlag = FALSE;
QCString Config::cgiName = "search.cgi";
QCString Config::cgiURL;
......@@ -287,6 +288,7 @@ static int yyread(char *buf,int max_size)
<Start>"COLLABORATION_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::collGraphFlag; }
<Start>"INCLUDE_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::includeGraphFlag; }
<Start>"GRAPHICAL_HIERARCHY"[ \t]*"=" { BEGIN(GetBool); b=&Config::gfxHierarchyFlag; }
<Start>"DOT_PATH"[ \t]*"=" { BEGIN(GetString); s=&Config::dotPath; s->resize(0); }
<Start>"SEARCHENGINE"[ \t]*"=" { BEGIN(GetBool); b=&Config::searchEngineFlag; }
<Start>"CGI_NAME"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiName; s->resize(0); }
<Start>"CGI_URL"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiURL; s->resize(0); }
......@@ -573,6 +575,7 @@ void dumpConfig()
printf("collGraphFlag=`%d'\n",Config::collGraphFlag);
printf("includeGraphFlag=`%d'\n",Config::includeGraphFlag);
printf("gfxHierarchyFlag=`%d'\n",Config::gfxHierarchyFlag);
printf("dotPath=`%s'\n",Config::dotPath.data());
printf("# Configuration::addtions related to the search engine \n");
printf("searchEngineFlag=`%d'\n",Config::searchEngineFlag);
printf("cgiName=`%s'\n",Config::cgiName.data());
......@@ -673,6 +676,7 @@ void Config::init()
Config::collGraphFlag = TRUE;
Config::includeGraphFlag = TRUE;
Config::gfxHierarchyFlag = TRUE;
Config::dotPath.resize(0);
Config::searchEngineFlag = FALSE;
Config::cgiName = "search.cgi";
Config::cgiURL.resize(0);
......@@ -1724,6 +1728,16 @@ void writeTemplateConfig(QFile *f,bool sl)
writeBoolValue(t,Config::gfxHierarchyFlag);
t << "\n";
if (!sl)
{
t << "\n";
t << "# This tag can be used to specify the path where the dot tool can be found. \n";
t << "# If left blank, it is assumed the dot tool can be found on the path. \n";
t << "\n";
}
t << "DOT_PATH = ";
writeStringValue(t,Config::dotPath);
t << "\n";
if (!sl)
{
t << "\n";
}
......@@ -1978,6 +1992,7 @@ void substituteEnvironmentVars()
substEnvVarsInStrList( Config::tagFileList );
substEnvVarsInString( Config::genTagFile );
substEnvVarsInString( Config::perlPath );
substEnvVarsInString( Config::dotPath );
substEnvVarsInString( Config::cgiName );
substEnvVarsInString( Config::cgiURL );
substEnvVarsInString( Config::docURL );
......@@ -2187,6 +2202,39 @@ void checkConfig()
#endif
s=Config::includePath.next();
}
// check dot path
if (!Config::dotPath.isEmpty())
{
if (Config::dotPath.find('\\')!=-1)
{
if (Config::dotPath.at(Config::dotPath.length()-1)!='\\')
{
Config::dotPath+='\\';
}
}
else if (Config::dotPath.find('/')!=-1)
{
if (Config::dotPath.at(Config::dotPath.length()-1)!='/')
{
Config::dotPath+='/';
}
}
#if defined(_WIN32)
QFileInfo dp(Config::dotPath+"dot.exe");
#else
QFileInfo dp(Config::dotPath+"dot");
#endif
if (!dp.exists() || !dp.isFile())
{
err("Warning: the dot tool could not be found at %s\n",Config::dotPath.data());
}
}
else // make sure the string is empty but not null!
{
Config::dotPath="";
}
// check input
if (Config::inputSources.count()==0)
{
......@@ -2211,13 +2259,13 @@ void checkConfig()
// add default pattern if needed
if (Config::filePatternList.isEmpty())
{
Config::filePatternList="*";
Config::filePatternList.append("*");
}
// add default pattern if needed
if (Config::examplePatternList.isEmpty())
{
Config::examplePatternList="*";
Config::examplePatternList.append("*");
}
// add default pattern if needed
......@@ -2241,18 +2289,23 @@ void checkConfig()
err("Error: tag CGI_URL: no URL to cgi directory specified.\n");
exit(1);
}
else if (Config::cgiURL.left(7)!="http://")
else if (Config::cgiURL.left(7)!="http://" &&
Config::cgiURL.left(8)!="https://"
)
{
err("Error: tag CGI_URL: URL to cgi directory is invalid (must "
"start with http://).\n");
"start with http:// or https://).\n");
exit(1);
}
// check documentation URL
if (Config::docURL.isEmpty())
{
Config::docURL = Config::outputDir.copy().prepend("file://")+"html";
Config::docURL = Config::outputDir.copy().prepend("file://").append("html");
}
else if (Config::docURL.left(7)!="http://" && Config::docURL.left(7)!="file://")
else if (Config::docURL.left(7)!="http://" &&
Config::docURL.left(8)!="https://" &&
Config::docURL.left(7)!="file://"
)
{
err("Error: tag DOC_URL: URL to documentation is invalid or "
"not absolute.\n");
......
......@@ -22,6 +22,7 @@
#include "doxygen.h"
#include "message.h"
#include "util.h"
#include "config.h"
#include <qdir.h>
#include <qfile.h>
......@@ -32,7 +33,6 @@
const int maxImageWidth=1024;
const int maxImageHeight=1024;
/*! mapping from protection levels to color names */
static char *edgeColorMap[] =
{
......@@ -575,8 +575,9 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
t << "}" << endl;
f.close();
QCString dotCmd;
dotCmd.sprintf("dot -Tgif \"%s\" -o \"%s\"",dotName.data(),gifName.data());
QCString dotCmd(4096);
dotCmd.sprintf("%sdot -Tgif \"%s\" -o \"%s\"",
Config::dotPath.data(),dotName.data(),gifName.data());
//printf("Running: dot -Tgif %s -o %s\n",dotName.data(),gifName.data());
if (system(dotCmd)!=0)
{
......@@ -584,7 +585,8 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
out << "</table>" << endl;
return;
}
dotCmd.sprintf("dot -Timap \"%s\" -o \"%s\"",dotName.data(),mapName.data());
dotCmd.sprintf("%sdot -Timap \"%s\" -o \"%s\"",
Config::dotPath.data(),dotName.data(),mapName.data());
//printf("Running: dot -Timap %s -o %s\n",dotName.data(),mapName.data());
if (system(dotCmd)!=0)
{
......@@ -975,9 +977,10 @@ static void findMaximalDotGraph(DotNode *root,
{
writeDotGraph(root,format,baseName,lrRank,renderParents,curDistance);
QCString dotCmd;
QCString dotCmd(4096);
// create annotated dot file
dotCmd.sprintf("dot -Tdot \"%s.dot\" -o \"%s_tmp.dot\"",baseName.data(),baseName.data());
dotCmd.sprintf("%sdot -Tdot \"%s.dot\" -o \"%s_tmp.dot\"",
Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0)
{
err("Problems running dot. Check your installation!\n");
......@@ -1066,15 +1069,17 @@ void DotClassGraph::writeGraph(QTextStream &out,
if (format==GIF) // run dot to create a .gif image
{
QCString dotCmd;
dotCmd.sprintf("dot -Tgif \"%s.dot\" -o \"%s.gif\"",baseName.data(),baseName.data());
QCString dotCmd(4096);
dotCmd.sprintf("%sdot -Tgif \"%s.dot\" -o \"%s.gif\"",
Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0)
{
err("Error: Problems running dot. Check your installation!\n");
return;
}
// run dot again to create an image map
dotCmd.sprintf("dot -Timap \"%s.dot\" -o \"%s.map\"",baseName.data(),baseName.data());
dotCmd.sprintf("%sdot -Timap \"%s.dot\" -o \"%s.map\"",
Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0)
{
err("Error: Problems running dot. Check your installation!\n");
......@@ -1090,7 +1095,8 @@ void DotClassGraph::writeGraph(QTextStream &out,
else if (format==EPS) // run dot to create a .eps image
{
QCString dotCmd;
dotCmd.sprintf("dot -Tps \"%s.dot\" -o \"%s.eps\"",baseName.data(),baseName.data());
dotCmd.sprintf("%sdot -Tps \"%s.dot\" -o \"%s.eps\"",
Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0)
{
err("Error: Problems running dot. Check your installation!\n");
......@@ -1221,16 +1227,17 @@ void DotInclDepGraph::writeGraph(QTextStream &out,
{
// run dot to create a .gif image
QCString dotCmd;
dotCmd.sprintf("dot -Tgif \"%s.dot\" -o \"%s.gif\"",baseName.data(),baseName.data());
dotCmd.sprintf("%sdot -Tgif \"%s.dot\" -o \"%s.gif\"",
Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0)
{
err("Problems running dot. Check your installation!\n");
return;
}
//printf("dot -Tgif %s.dot -o %s.gif",baseName.data(),baseName.data());
// run dot again to create an image map
dotCmd.sprintf("dot -Timap \"%s.dot\" -o \"%s.map\"",baseName.data(),baseName.data());
dotCmd.sprintf("%sdot -Timap \"%s.dot\" -o \"%s.map\"",
Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0)
{
err("Problems running dot. Check your installation!\n");
......@@ -1249,7 +1256,8 @@ void DotInclDepGraph::writeGraph(QTextStream &out,
// run dot to create a .eps image
QCString dotCmd;
dotCmd.sprintf("dot -Tps \"%s.dot\" -o \"%s.eps\"",baseName.data(),baseName.data());
dotCmd.sprintf("%sdot -Tps \"%s.dot\" -o \"%s.eps\"",
Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0)
{
err("Problems running dot. Check your installation!\n");
......
......@@ -85,7 +85,6 @@ StringDict excludeNameDict(1009); // sections
FileNameDict includeNameDict(1009); // include names
FileNameDict exampleNameDict(1009); // examples
FileNameDict imageNameDict(257); // images
//DefineDict defineDict(10007); // all defines
StringDict typedefDict(1009); // all typedefs
GroupDict groupDict(257); // all groups
FormulaDict formulaDict(1009); // all formulas
......@@ -125,7 +124,6 @@ void clearAll()
includeNameDict.clear();
exampleNameDict.clear();
imageNameDict.clear();
//defineDict.clear();
typedefDict.clear();
groupDict.clear();
formulaDict.clear();
......@@ -153,7 +151,7 @@ int documentedIncludeFiles;
QTextStream tagFile;
void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
static void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
ArgumentList *al,bool over_load,NamespaceList *nl=0);
const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*";
......@@ -173,7 +171,7 @@ const char *getOverloadDocs()
//----------------------------------------------------------------------------
void buildGroupList(Entry *root)
static void buildGroupList(Entry *root)
{
if (root->section==Entry::GROUPDOC_SEC && !root->name.isEmpty())
{
......@@ -240,7 +238,7 @@ void buildGroupList(Entry *root)
//----------------------------------------------------------------------
void buildFileList(Entry *root)
static void buildFileList(Entry *root)
{
if (((root->section==Entry::FILEDOC_SEC) ||
((root->section & Entry::FILE_MASK) && Config::extractAllFlag)) &&
......@@ -419,7 +417,7 @@ static bool addNamespace(Entry *root,ClassDef *cd)
//----------------------------------------------------------------------
// build a list of all classes mentioned in the documentation
// and all classes that have a documentation block before their definition.
void buildClassList(Entry *root)
static void buildClassList(Entry *root)
{
if (
((root->section & Entry::COMPOUNDDOC_MASK) ||
......@@ -605,7 +603,7 @@ void buildClassList(Entry *root)
//----------------------------------------------------------------------
// build a list of all namespaces mentioned in the documentation
// and all namespaces that have a documentation block before their definition.
void buildNamespaceList(Entry *root)
static void buildNamespaceList(Entry *root)
{
if (
(root->section==Entry::NAMESPACE_SEC) ||
......@@ -698,7 +696,7 @@ void buildNamespaceList(Entry *root)
//----------------------------------------------------------------------
void findUsingDirectives(Entry *root)
static void findUsingDirectives(Entry *root)
{
if (root->section==Entry::USINGDIR_SEC)
{
......@@ -964,6 +962,8 @@ static MemberDef *addVariableToClass(
md->setIndentDepth(indentDepth);
md->setBodySegment(root->bodyLine,root->endBodyLine);
md->setInitializer(root->initializer);
md->setMaxInitLines(root->initLines);
md->setMemberGroupId(root->mGrpId);
//if (root->mGrpId!=-1)
//{
// printf("memberdef %s in memberGroup %d\n",name.data(),root->mGrpId);
......@@ -986,7 +986,7 @@ static MemberDef *addVariableToClass(
memberNameList.inSort(mn);
// add the member to the class
}
cd->insertMember(md,root->mGrpId);
cd->insertMember(md);
//TODO: insert FileDef instead of filename strings.
cd->insertUsedFile(root->fileName);
......@@ -1030,6 +1030,8 @@ static MemberDef *addVariableToFile(
md->setIndentDepth(indentDepth);
md->setBodySegment(root->bodyLine,root->endBodyLine);
md->setInitializer(root->initializer);
md->setMaxInitLines(root->initLines);
md->setMemberGroupId(root->mGrpId);
bool ambig;
FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig);
md->setBodyDef(fd);
......@@ -1050,7 +1052,7 @@ static MemberDef *addVariableToFile(
}
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{
nd->insertMember(md,root->mGrpId);
nd->insertMember(md);
md->setNamespace(nd);
}
else
......@@ -1058,7 +1060,7 @@ static MemberDef *addVariableToFile(
// find file definition
if (fd)
{
fd->insertMember(md,root->mGrpId);
fd->insertMember(md);
md->setFileDef(fd);
}
}
......@@ -1290,13 +1292,13 @@ nextMember:
// Searches the Entry tree for Function sections.
// If found they are stored in their class or in the global list.
void buildMemberList(Entry *root)
static void buildMemberList(Entry *root)
{
if (root->section==Entry::FUNCTION_SEC)
{
Debug::print(Debug::Functions,0,
"FUNCTION_SEC:\n"
" `%s' `%s'::`%s' `%s' relates=`%s' file=`%s' line=`%d' bodyLine=`%d' #targs=%d #mtargs=%d mGrpId=%d\n",
" `%s' `%s'::`%s' `%s' relates=`%s' file=`%s' line=`%d' bodyLine=`%d' #targs=%d #mtargs=%d mGrpId=%d memSpec=%d\n",
root->type.data(),
root->parent->name.data(),
root->name.data(),
......@@ -1307,7 +1309,8 @@ void buildMemberList(Entry *root)
root->bodyLine,
root->tArgList ? (int)root->tArgList->count() : -1,
root->mtArgList ? (int)root->mtArgList->count() : -1,
root->mGrpId
root->mGrpId,
root->memSpec
);
bool isFriend=root->type.find("friend ")!=-1;
......@@ -1376,7 +1379,8 @@ void buildMemberList(Entry *root)
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setBodySegment(root->bodyLine,root->endBodyLine);
md->setInline(root->inLine);
md->setMemberSpecifiers(root->memSpec);
md->setMemberGroupId(root->mGrpId);
bool ambig;
md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig));
//md->setScopeTemplateArguments(root->tArgList);
......@@ -1463,7 +1467,7 @@ void buildMemberList(Entry *root)
}
// add member to the class cd
cd->insertMember(md,root->mGrpId);
cd->insertMember(md);
// add file to list of used files
cd->insertUsedFile(root->fileName);
......@@ -1487,6 +1491,7 @@ void buildMemberList(Entry *root)
//MemberDef *fmd;
if ((mn=functionNameDict[root->name]))
{
//printf("--> function %s already found!\n",root->name.data());
MemberDef *md=mn->first();
while (md && !found)
{
......@@ -1494,13 +1499,14 @@ void buildMemberList(Entry *root)
FileDef *fd = md->getFileDef();
QCString nsName = nd ? nd->name().data() : "";
//printf("namespace `%s'\n",nsName.data());
if ((nd || (fd && fd->absFilePath()==root->fileName)) &&
if (
matchArguments(md->argumentList(),root->argList,0,nsName)
)
{
// function already found in the same file, one is probably
// a prototype.
found=TRUE;
found=nd || fd->absFilePath()==root->fileName;
mergeArguments(root->argList,md->argumentList());
if (!md->documentation() && !root->doc.isEmpty())
{
md->setDocumentation(root->doc);
......@@ -1515,11 +1521,6 @@ void buildMemberList(Entry *root)
bool ambig;
md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig));
}
//if (root->mGrpId!=-1 && md->getMemberGroup()==0)
//{
// md->setMemberGroup(memberGroupDict[root->mGrpId]);
//}
md->addSectionsToDefinition(root->anchors);
}
md=mn->next();
......@@ -1548,7 +1549,8 @@ void buildMemberList(Entry *root)
FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig);
md->setBodyDef(fd);
md->addSectionsToDefinition(root->anchors);
md->setInline(root->inLine);
md->setMemberSpecifiers(root->memSpec);
md->setMemberGroupId(root->mGrpId);
QCString def;
if (!root->type.isEmpty())
{
......@@ -1602,7 +1604,7 @@ void buildMemberList(Entry *root)
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{
nd->insertMember(md,root->mGrpId);
nd->insertMember(md);
md->setNamespace(nd);
}
else
......@@ -1616,7 +1618,7 @@ void buildMemberList(Entry *root)
if (fd)
{
// add member to the file
fd->insertMember(md,root->mGrpId);
fd->insertMember(md);
md->setFileDef(fd);
}
}
......@@ -1662,7 +1664,7 @@ void buildMemberList(Entry *root)
//----------------------------------------------------------------------
void findFriends()
static void findFriends()
{
//printf("findFriends()\n");
MemberNameListIterator fnli(functionNameList);
......@@ -1723,7 +1725,7 @@ void findFriends()
//----------------------------------------------------------------------
void transferFunctionDocumentation()
static void transferFunctionDocumentation()
{
//printf("transferFunctionDocumentation()\n");
......@@ -1774,11 +1776,15 @@ void transferFunctionDocumentation()
mdec->setBodySegment(mdef->getStartBodyLine(),mdef->getEndBodyLine());
mdec->setBodyDef(mdef->getFileDef());
}
mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
}
}
}
void transferRelatedFunctionDocumentation()
//----------------------------------------------------------------------
static void transferRelatedFunctionDocumentation()
{
// find match between function declaration and definition for
// related functions
......@@ -1976,7 +1982,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
//----------------------------------------------------------------------
// Computes the base and super classes for each class in the tree
void computeClassRelations(Entry *root)
static void computeClassRelations(Entry *root)
{
if (
(
......@@ -2040,7 +2046,7 @@ void computeClassRelations(Entry *root)
//-----------------------------------------------------------------------
// compute the references (anchors in HTML) for each function in the file
void computeMemberReferences()
static void computeMemberReferences()
{
ClassDef *cd=classList.first();
while (cd)
......@@ -2080,15 +2086,15 @@ void computeMemberReferences()
// set the function declaration of the member to `funcDecl'. If the boolean
// over_load is set the standard overload text is added.
void addMemberDocs(Entry *root,
static void addMemberDocs(Entry *root,
MemberDef *md, const char *funcDecl,
ArgumentList *al,
bool over_load,
NamespaceList *nl
)
{
//printf("addMemberDocs: `%s'::`%s' `%s' funcDecl=`%s'\n",
// root->parent->name.data(),md->name().data(),md->argsString(),funcDecl);
//printf("addMemberDocs: `%s'::`%s' `%s' funcDecl=`%s' memSpec=%d\n",
// root->parent->name.data(),md->name().data(),md->argsString(),funcDecl,root->memSpec);
QCString fDecl=funcDecl;
// strip extern specifier
if (fDecl.left(7)=="extern ") fDecl=fDecl.right(fDecl.length()-7);
......@@ -2152,6 +2158,7 @@ void addMemberDocs(Entry *root,
if (md->initializer().isEmpty() && !root->initializer.isEmpty())
{
md->setInitializer(root->initializer);
md->setMaxInitLines(root->initLines);
}
//if (md->bodyCode().isEmpty() && !root->body.isEmpty()) /* no body yet */
......@@ -2168,15 +2175,15 @@ void addMemberDocs(Entry *root,
}
//md->setDefFile(root->fileName);
//md->setDefLine(root->startLine);
if (root->inLine && !md->isInline()) md->setInline(TRUE);
md->mergeMemberSpecifiers(root->memSpec);
md->addSectionsToDefinition(root->anchors);
addMemberToGroups(root,md);
if (cd) cd->insertUsedFile(root->fileName);
if (root->mGrpId!=-1)
{
if (md->getMemberGroup())
if (md->getMemberGroupId()!=-1)
{
if (md->getMemberGroup()->groupId()!=root->mGrpId)
if (md->getMemberGroupId()!=root->mGrpId)
{
warn(
root->fileName,root->startLine,
......@@ -2188,21 +2195,23 @@ void addMemberDocs(Entry *root,
}
else // set group id
{
//md->setMemberGroup(memberGroupDict[root->mGrpId]);
if (cd)
cd->addMemberToGroup(md,root->mGrpId);
else if (nd)
nd->addMemberToGroup(md,root->mGrpId);
else
{
bool ambig;
FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig);
if (fd)
{
fd->addMemberToGroup(md,root->mGrpId);
}
}
md->setMemberGroupId(root->mGrpId);
}
//md->setMemberGroup(memberGroupDict[root->mGrpId]);
// if (cd)
// cd->addMemberToGroup(md,root->mGrpId);
// else if (nd)
// nd->addMemberToGroup(md,root->mGrpId);
// else
// {
// bool ambig;
// FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig);
// if (fd)
// {
// //fd->addMemberToGroup(md,root->mGrpId);
// }
// }
//}
}
}
......@@ -2336,8 +2345,8 @@ static bool findUnrelatedFunction(Entry *root,
bool viaUsingDirective = nl && nd && nl->find(nd)!=-1;
if ((namespaceName.isEmpty() && nd==0) || // not in a namespace
(nd && nd->name()==namespaceName) || // or in the same namespace
viaUsingDirective // member in `using' namespace
(nd && nd->name()==namespaceName) || // or in the same namespace
viaUsingDirective // member in `using' namespace
)
{
Debug::print(Debug::FindMembers,0,"4. Try to add member `%s' to scope `%s'\n",
......@@ -2360,8 +2369,20 @@ static bool findUnrelatedFunction(Entry *root,
}
if (!found) // no match
{
QCString fullFuncDecl=decl;
if (root->argList) fullFuncDecl+=argListToString(root->argList);
warn(root->fileName,root->startLine,
"Warning: no matching member found for \n%s",decl);
"Warning: no matching file member found for \n%s",fullFuncDecl.data());
if (mn->count()>0)
{
warn_cont("Possible candidates:\n");
md=mn->first();
while (md)
{
warn_cont(" %s\n",md->declaration());
md=mn->next();
}
}
}
}
else // got docs for an undefined member!
......@@ -2373,7 +2394,7 @@ static bool findUnrelatedFunction(Entry *root,
return TRUE;
}
void substituteTemplateArgNames(ArgumentList *src,
static void substituteTemplateArgNames(ArgumentList *src,
const QCString &s,
ArgumentList *tempArgs,
ArgumentList *dst)
......@@ -2468,16 +2489,16 @@ void substituteTemplateArgNames(ArgumentList *src,
// The boolean overloaded is used to specify whether or not a standard
// overload documentation line should be generated.
void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
static void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
bool isFunc)
{
Debug::print(Debug::FindMembers,0,
"findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
"isFunc=%d mGrpId=%d tArgList=%p=\"%s\" scopeSpec=%s "
"memberSpec=%s inLine=%d\n",
"memberSpec=%s memSpec=%d\n",
root,funcDecl.data(),related.data(),overloaded,isFunc,root->mGrpId,
root->tArgList,tempArgListToString(root->tArgList).data(),
root->scopeSpec.data(),root->memberSpec.data(),root->inLine
root->scopeSpec.data(),root->memberSpec.data(),root->memSpec
);
//if (Config::includeSourceFlag && !root->body.isEmpty())
//{
......@@ -2496,22 +2517,40 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
QCString exceptions;
bool isRelated=FALSE;
bool isFriend=FALSE;
if (funcDecl.left(7)=="friend ") // treat friends as related members
{
funcDecl=funcDecl.right(funcDecl.length()-7);
isFriend=TRUE;
}
if (funcDecl.left(7)=="inline ")
{
funcDecl=funcDecl.right(funcDecl.length()-7);
root->inLine=TRUE;
}
if (funcDecl.left(8)=="virtual ")
bool done;
do
{
funcDecl=funcDecl.right(funcDecl.length()-7);
root->inLine=TRUE;
}
done=TRUE;
if (funcDecl.left(7)=="friend ") // treat friends as related members
{
funcDecl=funcDecl.right(funcDecl.length()-7);
isFriend=TRUE;
done=FALSE;
}
if (funcDecl.left(7)=="inline ")
{
funcDecl=funcDecl.right(funcDecl.length()-7);
root->memSpec|=Entry::Inline;
done=FALSE;
}
if (funcDecl.left(9)=="explicit ")
{
funcDecl=funcDecl.right(funcDecl.length()-9);
root->memSpec|=Entry::Explicit;
done=FALSE;
}
if (funcDecl.left(8)=="mutable ")
{
funcDecl=funcDecl.right(funcDecl.length()-8);
root->memSpec|=Entry::Mutable;
done=FALSE;
}
if (funcDecl.left(8)=="virtual ")
{
funcDecl=funcDecl.right(funcDecl.length()-7);
done=FALSE;
}
} while (!done);
// delete any ; from the function declaration
int sep;
......@@ -2747,6 +2786,9 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
QCString fullFuncDecl=funcDecl.copy();
if (isFunc) fullFuncDecl+=argListToString(root->argList);
if (funcType=="template class" && !funcTempList.isEmpty())
return; // ignore explicit template instantiations
Debug::print(Debug::FindMembers,0,
"findMember() Parse results:\n"
......@@ -2924,37 +2966,24 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
}
}
if (count==0 && !(isFriend && funcType=="class"))
{
warn(root->fileName,root->startLine,
"Warning: no matching member found for \n%s",
"Warning: no matching class member found for \n %s",
fullFuncDecl.data()
);
#if 0
else if (count>1)
{
warn("Warning: multiple matching members for\n%s\n",funcDecl.data());
int matchCount=0;
MemberDef *md=mn->first();
while (md)
if (mn->count()>0)
{
if (md->memberClass() && className==md->memberClass()->name())
matchCount++;
md=mn->next();
}
if (matchCount>0)
{
warn("Possible candidates are:\n");
warn_cont("Possible candidates:\n");
md=mn->first();
while (md)
{
ClassDef *cd=md->memberClass();
if (cd && className==cd->name())
warn(" %s::%s%s\n",md->memberClass()->name(),
md->name(),md->argsString());
if (!cd || cd->name()==className)
warn_cont(" %s\n",md->declaration());
md=mn->next();
}
}
}
#endif
}
else if (overloaded) // check if the function belongs to only one class
{
......@@ -2993,24 +3022,16 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
doc+="<p>";
doc+=root->doc;
md->setDocumentation(doc);
//md->setDecFile(root->fileName);
//md->setDecLine(root->startLine);
//md->setDefFile(root->fileName);
//md->setDefLine(root->startLine);
md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors);
//if (root->mGrpId!=-1)
//{
// md->setMemberGroup(memberGroupDict[root->mGrpId]);
//}
//md->setBody(root->body);
md->setBodySegment(root->bodyLine,root->endBodyLine);
bool ambig;
FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig);
md->setBodyDef(fd);
md->setInline(root->inLine);
md->setMemberSpecifiers(root->memSpec);
md->setMemberGroupId(root->mGrpId);
mn->inSort(md);
cd->insertMember(md,root->mGrpId);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
}
}
......@@ -3116,7 +3137,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
// md->setMemberGroup(memberGroupDict[root->mGrpId]);
//}
md->setMemberClass(cd);
md->setInline(root->inLine);
md->setMemberSpecifiers(root->memSpec);
md->setDefinition(funcDecl);
//md->setDefFile(root->fileName);
//md->setDefLine(root->startLine);
......@@ -3124,8 +3145,9 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
md->setMemberGroupId(root->mGrpId);
mn->inSort(md);
cd->insertMember(md,root->mGrpId);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
if (newMemberName)
{
......@@ -3154,6 +3176,12 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
"be found.", funcName.data()
);
}
else if (!className.isEmpty())
{
warn(root->fileName,root->startLine,
"Warning: member %s of class %s cannot be found",
funcName.data(),className.data());
}
}
}
else
......@@ -3169,13 +3197,13 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
// find the members corresponding to the different documentation blocks
// that are extracted from the sources.
void findMemberDocumentation(Entry *root)
static void findMemberDocumentation(Entry *root)
{
int i,l;
QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*");
Debug::print(Debug::FindMembers,0,
"root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->inLine=%d\n",
root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->inLine
"root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->memSpec=%d\n",
root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->memSpec
);
bool isFunc=TRUE;
if ((i=re.match(root->type,0,&l))!=-1) // func variable/typedef to func ptr
......@@ -3216,8 +3244,8 @@ void findMemberDocumentation(Entry *root)
)
) &&
(!root->doc.isEmpty() || !root->brief.isEmpty() ||
root->bodyLine!=-1 /* || root->mGrpId!=-1 || Config::extractAllFlag*/
|| root->inLine
root->bodyLine!=-1
|| (root->memSpec&Entry::Inline)
)
)
{
......@@ -3269,7 +3297,7 @@ void findMemberDocumentation(Entry *root)
//----------------------------------------------------------------------
// find and add the enumeration to their classes, namespaces or files
void findEnums(Entry *root)
static void findEnums(Entry *root)
{
if (root->section==Entry::ENUM_SEC)
// non anonymous enumeration
......@@ -3340,6 +3368,7 @@ void findEnums(Entry *root)
//printf("Enum %s definition at line %d of %s: protection=%d\n",
// root->name.data(),root->bodyLine,root->fileName.data(),root->protection);
md->addSectionsToDefinition(root->anchors);
md->setMemberGroupId(root->mGrpId);
//if (root->mGrpId!=-1)
//{
// md->setMemberGroup(memberGroupDict[root->mGrpId]);
......@@ -3347,18 +3376,18 @@ void findEnums(Entry *root)
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{
md->setDefinition(nd->name()+"::"+name);
nd->insertMember(md,root->mGrpId);
nd->insertMember(md);
md->setNamespace(nd);
}
else if (isGlobal)
{
md->setDefinition(name);
fd->insertMember(md,root->mGrpId);
fd->insertMember(md);
}
else if (cd)
{
md->setDefinition(cd->name()+"::"+name);
cd->insertMember(md,root->mGrpId);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
}
md->setDocumentation(root->doc);
......@@ -3438,7 +3467,7 @@ void findEnums(Entry *root)
//----------------------------------------------------------------------
// find the documentation blocks for the enumerations
void findEnumDocumentation(Entry *root)
static void findEnumDocumentation(Entry *root)
{
if (root->section==Entry::ENUMDOC_SEC
&& !root->name.isEmpty()
......@@ -3495,9 +3524,10 @@ void findEnumDocumentation(Entry *root)
md->setBriefDescription(root->brief);
}
if (root->mGrpId!=-1 && md->getMemberGroup()==0)
if (root->mGrpId!=-1 && md->getMemberGroupId()==-1)
{
cd->addMemberToGroup(md,root->mGrpId);
//cd->addMemberToGroup(md,root->mGrpId);
md->setMemberGroupId(root->mGrpId);
}
md->addSectionsToDefinition(root->anchors);
......@@ -3577,7 +3607,7 @@ static void findDEV(const MemberNameList &mnl)
// seach for each enum (member or function) if it has documented enum
// values.
void findDocumentedEnumValues()
static void findDocumentedEnumValues()
{
findDEV(memberNameList);
findDEV(functionNameList);
......@@ -3589,7 +3619,7 @@ void findDocumentedEnumValues()
// the members that override the implementation of `m' are searched and
// the member that `m' overrides is searched.
void computeMemberRelations()
static void computeMemberRelations()
{
MemberName *mn=memberNameList.first();
while (mn) // for each member name
......@@ -3641,7 +3671,7 @@ void computeMemberRelations()
//----------------------------------------------------------------------------
void computeClassImplUsageRelations()
static void computeClassImplUsageRelations()
{
ClassDef *cd;
ClassListIterator cli(classList);
......@@ -3652,15 +3682,15 @@ void computeClassImplUsageRelations()
}
//----------------------------------------------------------------------------
void computeMemberGroups()
{
ClassDef *cd;
ClassListIterator cli(classList);
for (;(cd=cli.current());++cli)
{
cd->computeMemberGroups();
}
}
//static void computeMemberGroups()
//{
// ClassDef *cd;
// ClassListIterator cli(classList);
// for (;(cd=cli.current());++cli)
// {
// cd->computeMemberGroups();
// }
//}
//----------------------------------------------------------------------------
......@@ -3680,7 +3710,7 @@ void computeClassIntfUsageRelations()
// builds the list of all members for each class
void buildCompleteMemberLists()
static void buildCompleteMemberLists()
{
ClassDef *cd;
ClassListIterator cli(classList);
......@@ -3702,7 +3732,7 @@ void buildCompleteMemberLists()
//----------------------------------------------------------------------------
void generateFileDocs()
static void generateFileDocs()
{
if (documentedHtmlFiles==0) return;
writeFileIndex(*outputList);
......@@ -3764,7 +3794,7 @@ void generateFileDocs()
// }
//}
void addSourceReferences()
static void addSourceReferences()
{
ClassListIterator cli(classList);
ClassDef *cd=0;
......@@ -3789,8 +3819,6 @@ void addSourceReferences()
if (fd && cd && cd->isLinkableInProject() && md->getStartBodyLine()!=-1 &&
md->isLinkableInProject())
{
//printf("Found member `%s' in file `%s' at line `%d'\n",
// md->name().data(),fd->name().data(),md->getStartBodyLine());
Definition *d=cd;
if (d==0) d=md->getNamespace();
if (d==0) d=md->getFileDef();
......@@ -3825,16 +3853,13 @@ void addSourceReferences()
//----------------------------------------------------------------------------
// generate the documentation of all classes
void generateClassDocs()
static void generateClassDocs()
{
// write the installdox script if necessary
if (Config::generateHtml &&
(Config::tagFileList.count()>0 || Config::searchEngineFlag))
writeInstallScript();
msg("Generating index page...\n");
writeIndex(*outputList);
msg("Generating annotated compound index...\n");
writeAnnotatedIndex(*outputList);
......@@ -3872,7 +3897,7 @@ void generateClassDocs()
//----------------------------------------------------------------------------
void inheritDocumentation()
static void inheritDocumentation()
{
MemberNameListIterator mnli(memberNameList);
MemberName *mn;
......@@ -3905,7 +3930,46 @@ void inheritDocumentation()
//----------------------------------------------------------------------------
void distributeMemberGroupDocumentation()
static void addMembersToMemberGroup()
{
// for each class
ClassListIterator cli(classList);
ClassDef *cd;
for ( ; (cd=cli.current()) ; ++cli )
{
cd->addMembersToMemberGroup();
}
// for each file
FileName *fn=inputNameList.first();
while (fn)
{
FileDef *fd=fn->first();
while (fd)
{
fd->addMembersToMemberGroup();
fd=fn->next();
}
fn=inputNameList.next();
}
// for each namespace
NamespaceDef *nd=namespaceList.first();
while (nd)
{
nd->addMembersToMemberGroup();
nd=namespaceList.next();
}
// for each group
GroupDef *gd=groupList.first();
while (gd)
{
gd->addMembersToMemberGroup();
gd=groupList.next();
}
}
//----------------------------------------------------------------------------
static void distributeMemberGroupDocumentation()
{
// for each class
ClassListIterator cli(classList);
......@@ -3944,7 +4008,7 @@ void distributeMemberGroupDocumentation()
//----------------------------------------------------------------------------
void findDefineDocumentation(Entry *root)
static void findDefineDocumentation(Entry *root)
{
if ((root->section==Entry::DEFINEDOC_SEC ||
root->section==Entry::DEFINE_SEC) && !root->name.isEmpty()
......@@ -3974,19 +4038,17 @@ void findDefineDocumentation(Entry *root)
if (md->briefDescription().isEmpty())
md->setBriefDescription(root->brief);
md->setBodySegment(root->bodyLine,root->endBodyLine);
//if (root->mGrpId!=-1 && md->getMemberGroup()==0)
//{
// md->setMemberGroup(memberGroupDict[root->mGrpId]);
//}
bool ambig;
md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig));
md->addSectionsToDefinition(root->anchors);
md->setMaxInitLines(root->initLines);
if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
addMemberToGroups(root,md);
FileDef *fd=md->getFileDef();
if (fd && root->mGrpId!=-1)
{
fd->addMemberToGroup(md,root->mGrpId);
}
//FileDef *fd=md->getFileDef();
//if (fd && root->mGrpId!=-1)
//{
// fd->addMemberToGroup(md,root->mGrpId);
//}
}
md=mn->next();
}
......@@ -4021,11 +4083,12 @@ void findDefineDocumentation(Entry *root)
//{
// md->setMemberGroup(memberGroupDict[root->mGrpId]);
//}
if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
addMemberToGroups(root,md);
if (root->mGrpId!=-1)
{
fd->addMemberToGroup(md,root->mGrpId);
}
//if (root->mGrpId!=-1)
//{
// fd->addMemberToGroup(md,root->mGrpId);
//}
}
}
md=mn->next();
......@@ -4057,7 +4120,7 @@ void findDefineDocumentation(Entry *root)
//----------------------------------------------------------------------------
// create a (sorted) list of separate documentation pages
void buildPageList(Entry *root)
static void buildPageList(Entry *root)
{
if (root->section == Entry::PAGEDOC_SEC)
{
......@@ -4115,7 +4178,7 @@ void buildPageList(Entry *root)
}
}
void findMainPage(Entry *root)
static void findMainPage(Entry *root)
{
if (root->section == Entry::MAINPAGEDOC_SEC)
{
......@@ -4145,7 +4208,7 @@ void findMainPage(Entry *root)
//----------------------------------------------------------------------------
void resolveUserReferences()
static void resolveUserReferences()
{
QDictIterator<SectionInfo> sdi(sectionDict);
SectionInfo *si;
......@@ -4185,7 +4248,7 @@ void resolveUserReferences()
// }
//}
void generatePageDocs()
static void generatePageDocs()
{
PageInfo *pi=pageList.first();
while (pi)
......@@ -4217,7 +4280,7 @@ void generatePageDocs()
//----------------------------------------------------------------------------
// create a (sorted) list & dictionary of example pages
void buildExampleList(Entry *root)
static void buildExampleList(Entry *root)
{
if (root->section == Entry::EXAMPLE_SEC)
{
......@@ -4261,7 +4324,7 @@ void buildExampleList(Entry *root)
//----------------------------------------------------------------------------
// generate the example documentation
void generateExampleDocs()
static void generateExampleDocs()
{
outputList->disable(OutputGenerator::Man);
PageInfo *pi=exampleList.first();
......@@ -4283,7 +4346,7 @@ void generateExampleDocs()
//----------------------------------------------------------------------------
// generate module pages
void generateGroupDocs()
static void generateGroupDocs()
{
GroupListIterator gli(groupList);
GroupDef *gd;
......@@ -4325,7 +4388,7 @@ void generateGroupDocs()
//----------------------------------------------------------------------------
// generate module pages
void generateNamespaceDocs()
static void generateNamespaceDocs()
{
writeNamespaceIndex(*outputList);
......@@ -4366,7 +4429,7 @@ static QCString fixSlashes(QCString &s)
//----------------------------------------------------------------------------
// generate files for the search engine
void generateSearchIndex()
static void generateSearchIndex()
{
if (Config::searchEngineFlag && Config::generateHtml)
{
......@@ -4478,7 +4541,7 @@ void generateSearchIndex()
//----------------------------------------------------------------------------
// generate the configuration file
void generateConfigFile(const char *configFile,bool shortList)
static void generateConfigFile(const char *configFile,bool shortList)
{
QFile f;
bool fileOpened=FALSE;
......@@ -4524,15 +4587,17 @@ void generateConfigFile(const char *configFile,bool shortList)
//----------------------------------------------------------------------------
// read and parse a tag file
bool readLineFromFile(QFile &f,QCString &s)
{
char c=0;
s.resize(0);
while (!f.atEnd() && (c=f.getch())!='\n') s+=c;
return f.atEnd();
}
//static bool readLineFromFile(QFile &f,QCString &s)
//{
// char c=0;
// s.resize(0);
// while (!f.atEnd() && (c=f.getch())!='\n') s+=c;
// return f.atEnd();
//}
//----------------------------------------------------------------------------
void readTagFile(const char *tl)
static void readTagFile(const char *tl)
{
QCString tagLine = tl;
QCString fileName;
......@@ -4571,7 +4636,7 @@ void readTagFile(const char *tl)
// returns TRUE if the name of the file represented by `fi' matches
// one of the file patterns in the `patList' list.
bool patternMatch(QFileInfo *fi,QStrList *patList)
static bool patternMatch(QFileInfo *fi,QStrList *patList)
{
bool found=FALSE;
if (patList)
......@@ -4579,12 +4644,15 @@ bool patternMatch(QFileInfo *fi,QStrList *patList)
char *pattern=patList->first();
while (pattern && !found)
{
//printf("Matching `%s' against pattern `%s'\n",fi->fileName().data(),pattern);
#if defined(_WIN32) // windows
QRegExp re(pattern,FALSE,TRUE); // case insensitive match
#else // unix
QRegExp re(pattern,TRUE,TRUE); // case sensitive match
#endif
found = found || re.match(fi->fileName())!=-1 || re.match(fi->filePath())!=-1;
found = found || re.match(fi->fileName())!=-1 ||
re.match(fi->filePath())!=-1 ||
re.match(fi->absFilePath())!=-1;
pattern=patList->next();
}
}
......@@ -4595,7 +4663,7 @@ bool patternMatch(QFileInfo *fi,QStrList *patList)
// reads a file into an array and filters out any 0x00 and 0x06 bytes,
// because these are special for the parser.
void copyAndFilterFile(const char *fileName,BufStr &dest)
static void copyAndFilterFile(const char *fileName,BufStr &dest)
{
// try to open file
int size=0;
......@@ -4652,7 +4720,7 @@ void copyAndFilterFile(const char *fileName,BufStr &dest)
}
//----------------------------------------------------------------------------
void copyStyleSheet()
static void copyStyleSheet()
{
if (!Config::htmlStyleSheet.isEmpty())
{
......@@ -4687,8 +4755,7 @@ void copyStyleSheet()
// The name of the file is written in front of the file's contents and
// between 0x06 markers
void readFiles(BufStr &output)
static void readFiles(BufStr &output)
{
QCString *s=inputFiles.first();
// char *p=output.data();
......@@ -4743,7 +4810,7 @@ void readFiles(BufStr &output)
// The directory is read iff the recusiveFlag is set.
// The contents of all files is append to the input string
int readDir(QFileInfo *fi,
static int readDir(QFileInfo *fi,
FileNameList *fnList,
FileNameDict *fnDict,
StringDict *exclDict,
......@@ -4756,6 +4823,7 @@ int readDir(QFileInfo *fi,
QDir dir((const char *)fi->absFilePath());
dir.setFilter( QDir::Files | QDir::Dirs );
int totalSize=0;
//printf("readDir `%s'\n",fi->absFilePath().data());
const QFileInfoList *list = dir.entryInfoList();
QFileInfoListIterator it( *list );
......@@ -4775,6 +4843,7 @@ int readDir(QFileInfo *fi,
{
totalSize+=cfi->size()+cfi->absFilePath().length()+4;
QCString name=convertToQCString(cfi->fileName());
//printf("New file %s\n",name.data());
if (fnDict)
{
FileDef *fd=new FileDef(cfi->dirPath()+"/",name);
......@@ -4815,44 +4884,44 @@ int readDir(QFileInfo *fi,
//----------------------------------------------------------------------------
// read the file with name `name' into a string.
QCString readExampleFile(const char *name)
{
QCString example;
QFileInfo fi(name);
if (fi.exists())
{
QFile f((const char *)fi.absFilePath());
if (f.open(IO_ReadOnly))
{
example.resize(fi.size()+1);
if ((int)fi.size()!=f.readBlock(example.data(),fi.size()))
{
err("Error while reading file %s\n",fi.absFilePath().data());
//exit(1);
return "";
}
example.at(fi.size())='\0';
}
else
{
err("Error opening file %s\n",fi.absFilePath().data());
//exit(1);
return "";
}
}
else
{
err("Error: example file %s does not exist\n",name);
exit(1);
}
return example;
}
//static QCString readExampleFile(const char *name)
//{
// QCString example;
// QFileInfo fi(name);
// if (fi.exists())
// {
// QFile f((const char *)fi.absFilePath());
// if (f.open(IO_ReadOnly))
// {
// example.resize(fi.size()+1);
// if ((int)fi.size()!=f.readBlock(example.data(),fi.size()))
// {
// err("Error while reading file %s\n",fi.absFilePath().data());
// //exit(1);
// return "";
// }
// example.at(fi.size())='\0';
// }
// else
// {
// err("Error opening file %s\n",fi.absFilePath().data());
// //exit(1);
// return "";
// }
// }
// else
// {
// err("Error: example file %s does not exist\n",name);
// exit(1);
// }
// return example;
//}
//----------------------------------------------------------------------------
// read a file or all files in a directory and append their contents to the
// input string. The names of the files are appended to the `fiList' list.
int readFileOrDirectory(const char *s,
static int readFileOrDirectory(const char *s,
FileNameList *fnList,
FileNameDict *fnDict,
StringDict *exclDict,
......@@ -4863,6 +4932,7 @@ int readFileOrDirectory(const char *s,
)
{
QFileInfo fi(s);
//printf("readFileOrDirectory(%s)\n",s);
int totalSize=0;
{
if (exclDict==0 || exclDict->find(fi.absFilePath())==0)
......@@ -4876,6 +4946,7 @@ int readFileOrDirectory(const char *s,
totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
//fiList->inSort(new FileInfo(fi));
QCString name=convertToQCString(fi.fileName());
//printf("New file %s\n",name.data());
if (fnDict)
{
FileDef *fd=new FileDef(fi.dirPath(TRUE)+"/",name);
......@@ -4910,7 +4981,7 @@ int readFileOrDirectory(const char *s,
//----------------------------------------------------------------------------
void readFormulaRepository()
static void readFormulaRepository()
{
QFile f(Config::htmlOutputDir+"/formula.repository");
if (f.open(IO_ReadOnly)) // open repository
......@@ -4942,7 +5013,7 @@ void readFormulaRepository()
//----------------------------------------------------------------------------
// print the usage of doxygen
void usage(const char *name)
static void usage(const char *name)
{
msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2000\n\n",versionString);
msg("You can use doxygen in three ways:\n\n");
......@@ -4964,7 +5035,7 @@ void usage(const char *name)
// read the argument of option `c' from the comment argument list and
// update the option index `optind'.
const char *getArg(int argc,char **argv,int &optind)
static const char *getArg(int argc,char **argv,int &optind)
{
char *s=0;
if (strlen(&argv[optind][2])>0)
......@@ -5299,9 +5370,6 @@ int main(int argc,char **argv)
msg("Determining which enums are documented\n");
findDocumentedEnumValues();
msg("Computing member groups...\n");
computeMemberGroups();
msg("Computing member references...\n");
computeMemberReferences();
......@@ -5314,6 +5382,11 @@ int main(int argc,char **argv)
computeClassImplUsageRelations();
}
msg("Adding members to member groups.\n");
addMembersToMemberGroup();
msg("Distributing member group documentation.\n");
distributeMemberGroupDocumentation();
msg("Building full member lists recursively...\n");
buildCompleteMemberLists();
......@@ -5324,9 +5397,6 @@ int main(int argc,char **argv)
//msg("Determining member group documentation...\n");
//computeMemberGroupDocumentation();
msg("Adding source references...\n");
addSourceReferences();
//unrelatedFunctionsUsed=hasUnrelatedFunctions();
if (Config::inheritDocsFlag)
......@@ -5335,9 +5405,12 @@ int main(int argc,char **argv)
inheritDocumentation();
}
msg("Distributing member group documentation.\n");
distributeMemberGroupDocumentation();
//msg("Computing member groups...\n");
//computeMemberGroups();
msg("Adding source references...\n");
addSourceReferences();
/**************************************************************************
* Generate documentation *
**************************************************************************/
......@@ -5367,6 +5440,9 @@ int main(int argc,char **argv)
msg("Resolving user defined references...\n");
resolveUserReferences();
msg("Generating index page...\n");
writeIndex(*outputList);
msg("Generating example documentation...\n");
generateExampleDocs();
......
......@@ -69,8 +69,9 @@ Entry::Entry(const Entry &e)
mGrpId = e.mGrpId;
bodyLine = e.bodyLine;
endBodyLine = e.endBodyLine;
inLine = e.inLine;
memSpec = e.memSpec;
initializer = e.initializer;
initLines = e.initLines;
sublist = new QList<Entry>;
sublist->setAutoDelete(TRUE);
extends = new QList<BaseInfo>;
......@@ -207,6 +208,7 @@ void Entry::reset()
scopeSpec.resize(0);
memberSpec.resize(0);
initializer.resize(0);
initLines = -1;
startLine = 1;
bodyLine = -1;
endBodyLine = -1;
......@@ -217,7 +219,7 @@ void Entry::reset()
slot = FALSE;
stat = FALSE;
proto = FALSE;
inLine = FALSE;
memSpec = 0;
subGrouping = TRUE;
protection = Public;
sublist->clear();
......
......@@ -46,7 +46,7 @@ struct Argument
docs=a.docs.copy();
array=a.array.copy();
}
/* Assignment of an argument (does a deep copy of all strings). */
/*! Assignment of an argument (does a deep copy of all strings). */
Argument &operator=(const Argument &a)
{
if (this!=&a)
......@@ -144,6 +144,12 @@ class Entry
MEMBERGRP_SEC = 0x01300000,
USINGDECL_SEC = 0x01400000
};
enum MemberSpecifier
{
Inline = 0x1,
Explicit = 0x2,
Mutable = 0x4
};
Entry();
Entry(const Entry &);
......@@ -159,7 +165,8 @@ class Entry
bool slot; // a Qt slot ?
bool stat; // static ?
bool proto; // prototype ?
bool inLine; // inline ?
int memSpec; // member specifiers
int initLines; // define/variable initializer lines to show
bool subGrouping; // automatically group class members?
Specifier virt; // virtualness of the entry
Entry *parent; // parent node in the tree
......
......@@ -269,7 +269,10 @@ void FileDef::writeDocumentation(OutputList &ol)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->writeDeclarations(ol,0,0,this,0);
if (mg->header()!="[NOHEADER]")
{
mg->writeDeclarations(ol,0,0,this,0);
}
}
allMemberList.writeDeclarations(ol,0,0,this,0,0,0);
......@@ -439,44 +442,75 @@ void FileDef::writeSource(OutputList &ol)
/*! Adds a member \a md to the member group with id \a groupId.
*/
void FileDef::addMemberToGroup(MemberDef *md,int groupId)
void FileDef::addMemberListToGroup(MemberList *ml,
bool (MemberDef::*func)() const)
{
if (groupId!=-1)
MemberListIterator mli(*ml);
MemberDef *md;
for (;(md=mli.current());++mli)
{
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
int groupId=md->getMemberGroupId();
if ((md->*func)() && groupId!=-1)
{
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
}
}
void FileDef::addMembersToMemberGroup()
{
addMemberListToGroup(&allMemberList,&MemberDef::isDefine);
addMemberListToGroup(&allMemberList,&MemberDef::isTypedef);
addMemberListToGroup(&allMemberList,&MemberDef::isEnumerate);
addMemberListToGroup(&allMemberList,&MemberDef::isEnumValue);
addMemberListToGroup(&allMemberList,&MemberDef::isFunction);
addMemberListToGroup(&allMemberList,&MemberDef::isVariable);
}
/*! Adds member definition \a md to the list of all members of this file */
void FileDef::insertMember(MemberDef *md,int groupId)
void FileDef::insertMember(MemberDef *md)
{
allMemberList.append(md);
switch(md->memberType())
{
case MemberDef::Variable: varMembers.inSort(md); break;
case MemberDef::Function: funcMembers.inSort(md); break;
case MemberDef::Typedef: typedefMembers.inSort(md); break;
case MemberDef::Enumeration: enumMembers.inSort(md); break;
case MemberDef::EnumValue: enumValMembers.inSort(md); break;
case MemberDef::Prototype: protoMembers.inSort(md); break;
case MemberDef::Define: defineMembers.inSort(md); break;
case MemberDef::Variable:
varMembers.inSort(md);
break;
case MemberDef::Function:
funcMembers.inSort(md);
break;
case MemberDef::Typedef:
typedefMembers.inSort(md);
break;
case MemberDef::Enumeration:
enumMembers.inSort(md);
break;
case MemberDef::EnumValue:
enumValMembers.inSort(md);
break;
case MemberDef::Prototype:
protoMembers.inSort(md);
break;
case MemberDef::Define:
defineMembers.inSort(md);
break;
default:
err("FileDef::insertMembers(): unexpected member insert in file!\n");
}
addMemberToGroup(md,groupId);
//addMemberToGroup(md,groupId);
}
/*! Adds compound definition \a cd to the list of all compounds of this file */
......
......@@ -110,8 +110,7 @@ class FileDef : public Definition
void writeDocumentation(OutputList &ol);
void writeSource(OutputList &ol);
friend void generatedFileNames();
void insertMember(MemberDef *md,int groupId);
void addMemberToGroup(MemberDef *md,int groupId);
void insertMember(MemberDef *md);
void insertClass(ClassDef *cd);
void insertNamespace(NamespaceDef *nd);
void computeAnchors();
......@@ -127,8 +126,12 @@ class FileDef : public Definition
QList<IncludeInfo> *includeFileList() const { return includeList; }
QDict<IncludeInfo> *includeFileDict() const { return includeDict; }
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
protected:
void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
private:
MemberList allMemberList;
MemberList defineMembers;
......
......@@ -91,28 +91,49 @@ void GroupDef::addNamespace(const NamespaceDef *def)
namespaceList->append(def);
}
void GroupDef::addMemberToGroup(MemberDef *md,int groupId)
void GroupDef::addMemberListToGroup(MemberList *ml,
bool (MemberDef::*func)() const)
{
if (groupId!=-1)
if (ml==0) return;
MemberListIterator mli(*ml);
MemberDef *md;
for (;(md=mli.current());++mli)
{
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
int groupId=md->getMemberGroupId();
if ((md->*func)() && groupId!=-1)
{
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
}
}
void GroupDef::insertMember(MemberDef *md,int groupId)
void GroupDef::addMembersToMemberGroup()
{
addMemberListToGroup(allMemberList,&MemberDef::isDefine);
addMemberListToGroup(allMemberList,&MemberDef::isTypedef);
addMemberListToGroup(allMemberList,&MemberDef::isEnumerate);
addMemberListToGroup(allMemberList,&MemberDef::isEnumValue);
addMemberListToGroup(allMemberList,&MemberDef::isFunction);
addMemberListToGroup(allMemberList,&MemberDef::isSlot);
addMemberListToGroup(allMemberList,&MemberDef::isSignal);
addMemberListToGroup(allMemberList,&MemberDef::isVariable);
}
void GroupDef::insertMember(MemberDef *md)
{
QCString funcDecl=md->name()+md->argsString();
if (allMemberDict->find(funcDecl)==0)
......@@ -131,7 +152,7 @@ void GroupDef::insertMember(MemberDef *md,int groupId)
default:
err("FileDef::insertMembers(): unexpected member insert in file!\n");
}
addMemberToGroup(md,groupId);
//addMemberToGroup(md,groupId);
}
}
......@@ -432,7 +453,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
GroupDef *mgd = md->groupDef();
if (mgd==0)
{
gd->insertMember(md,root->mGrpId);
gd->insertMember(md);
md->setGroupDef(gd);
}
else if (mgd!=gd)
......
......@@ -47,8 +47,7 @@ class GroupDef : public Definition
void addClass(const ClassDef *def);
void addNamespace(const NamespaceDef *def);
void addGroup(const GroupDef *def);
void insertMember(MemberDef *def,int groupId);
void addMemberToGroup(MemberDef *def,int groupId);
void insertMember(MemberDef *def);
void writeDocumentation(OutputList &ol);
int countMembers() const;
bool isLinkableInProject()
......@@ -60,8 +59,13 @@ class GroupDef : public Definition
return isLinkableInProject() || isReference();
}
void computeAnchors();
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
protected:
void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
private:
QCString title; // title of the group
QCString fileName; // base name of the generated file
......
......@@ -853,37 +853,18 @@ void HtmlGenerator::writeGraphicalHierarchy(DotGfxHierarchyTable &g)
g.writeGraph(t,Config::htmlOutputDir);
}
void HtmlGenerator::startMemberGroupHeader()
void HtmlGenerator::startMemberGroupHeader(bool)
{
//t << "<tr><td colspan=2><img src=\"null.gif\" height=8></td></tr>" << endl;
//t << "<tr><td colspan=2>" << endl;
//t << " <div class=\"in\">" << endl;
//t << " <table border=0 cellspacing=0 cellpadding=0>" << endl;
//t << " <tr><td colspan=3 class=\"groupLine\"><img src=\"null.gif\" height=1></td></tr>" << endl;
//t << " <tr>" << endl;
//t << " <td class=\"groupLine\"><img src=\"null.gif\" width=1></td>" << endl;
//t << " <td><div class=\"groupHeader\">&nbsp;&nbsp;";
t << "<tr><td colspan=\"2\"><div class=\"groupHeader\">";
}
void HtmlGenerator::endMemberGroupHeader()
{
//t << "&nbsp;&nbsp;</div></td>" << endl;
//t << " <td class=\"groupLine\"><img src=\"null.gif\" width=1></td>" << endl;
//t << " </tr>" << endl;
//t << " <tr><td colspan=3 class=\"groupLine\"><img src=\"null.gif\" height=1></td></tr>" << endl;
//t << " </table>" << endl;
//t << " </div>" << endl;
//t << "</tr>" << endl;
//t << "<tr><td colspan=2><img src=\"null.gif\" height=4></td></tr>" << endl;
t << "</div></td></tr>" << endl;
}
void HtmlGenerator::startMemberGroupDocs()
{
//t << "<tr><td colspan=2><img src=\"null.gif\" height=4></td></tr>" << endl;
t << "<tr><td colspan=\"2\"><div class=\"groupText\">";
}
......
......@@ -98,7 +98,7 @@ class HtmlGenerator : public OutputGenerator
void endMemberList();
void startMemberItem(int);
void startMemberGroupHeader();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
void startMemberGroupDocs();
void endMemberGroupDocs();
......
......@@ -1534,10 +1534,21 @@ void writeIndex(OutputList &ol)
int defLine =
mainPage ? mainPage->defLine : 1;
QCString title;
if (!mainPage || mainPage->title.isEmpty())
ol.startFile("index","Main Index",FALSE);
{
title = "Main Index";
}
else
ol.startFile("index",mainPage->title,FALSE);
{
title = mainPage->title;
}
ol.startFile("index",title,FALSE);
if (Config::generateHtml && Config::htmlHelpFlag)
{
HtmlHelp::getInstance()->addContentsItem(title,"index");
}
if (!Config::noIndexFlag) writeQuickLinks(ol,TRUE);
ol.startTitleHead(0);
......
......@@ -855,28 +855,30 @@ void LatexGenerator::startMemberDoc(const char *clname,
const char *,
const char *title)
{
t << "\\index{";
if (clname)
if (memname && memname[0]!='@')
{
t << clname << "@{";
docify(clname);
t << "}!";
}
t << escapeLabelName(memname) << "@{";
docify(memname);
t << "}}" << endl;
t << "\\index{" << escapeLabelName(memname) << "@{";
docify(memname);
t << "}";
if (clname)
{
t << "!" << clname << "@{";
docify(clname);
t << "}";
t << "\\index{";
if (clname)
{
t << clname << "@{";
docify(clname);
t << "}!";
}
t << escapeLabelName(memname) << "@{";
docify(memname);
t << "}}" << endl;
t << "\\index{" << escapeLabelName(memname) << "@{";
docify(memname);
t << "}";
if (clname)
{
t << "!" << clname << "@{";
docify(clname);
t << "}";
}
t << "}" << endl;
}
t << "}" << endl;
//
if (Config::compactLatexFlag) t << "\\paragraph"; else t << "\\subsubsection";
if (Config::pdfHyperFlag && title) t << "[" << filterTitle(title) << "]";
t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
......@@ -956,10 +958,28 @@ void LatexGenerator::writeSection(const char *lab,const char *title,bool sub)
}
}
void LatexGenerator::writeSectionRef(const char *,const char *lab,
const char *)
void LatexGenerator::writeSectionRef(const char *fileName,const char *lab,
const char *text)
{
t << "\\ref{" << lab << "}";
if (text && Config::pdfHyperFlag)
{
t << "\\hyperlink{";
if (lab) t << lab;
t << "}{";
docify(text);
t << "}";
}
else
{
if (strcmp(lab,text)!=0) // lab!=text
{
t << "{\\bf " << text << " (\\ref " << lab << ")}}";
}
else
{
t << "\\ref{" << lab << "}";
}
}
}
void LatexGenerator::writeSectionRefItem(const char *,const char *lab,
......@@ -1265,9 +1285,10 @@ void LatexGenerator::writeImage(const char *name,const char *w,const char *h)
t << "}}" << endl;
}
void LatexGenerator::startMemberGroupHeader()
void LatexGenerator::startMemberGroupHeader(bool hasHeader)
{
t << "\\begin{Indent}{\\bf ";
if (hasHeader) t << "\\begin{Indent}";
t << "{\\bf ";
}
void LatexGenerator::endMemberGroupHeader()
......@@ -1289,9 +1310,10 @@ void LatexGenerator::startMemberGroup()
{
}
void LatexGenerator::endMemberGroup(bool)
void LatexGenerator::endMemberGroup(bool hasHeader)
{
t << "\\end{Indent}" << endl;
if (hasHeader)t << "\\end{Indent}";
t << endl;
}
void LatexGenerator::startDotGraph()
......
......@@ -95,7 +95,7 @@ class LatexGenerator : public OutputGenerator
void startMemberItem(int);
void endMemberItem(bool);
void startMemberGroupHeader();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
void startMemberGroupDocs();
void endMemberGroupDocs();
......
......@@ -385,7 +385,7 @@ void ManGenerator::endMemberList()
}
}
void ManGenerator::startMemberGroupHeader()
void ManGenerator::startMemberGroupHeader(bool)
{
t << "\n.PP\n.RI \"\\fB";
}
......
......@@ -95,7 +95,7 @@ class ManGenerator : public OutputGenerator
void startMemberItem(int);
void endMemberItem(bool);
void startMemberGroupHeader();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
void startMemberGroupDocs();
void endMemberGroupDocs();
......
......@@ -212,15 +212,17 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE)
* Members can be function/variables/enums/etc. inside a class or inside a
* file.
*
* \param t A string representing the type of the member.
* \param n A string representing the name of the member.
* \param a A string representing the arguments of the member.
* \param p The type of protection of the member, possible values are:
* \c Public, \c Protected, \c Private.
* \param v The `virtualness' of the member, possible values are:
* \c Normal, \c Virtual, \c Pure.
* \param s A boolean that is true if the member is static.
* \param r A boolean that is true if the member is only related.
* \param df File containing the definition of this member.
* \param dl Line at which the member definition was found.
* \param t A string representing the type of the member.
* \param n A string representing the name of the member.
* \param a A string representing the arguments of the member.
* \param p The type of protection of the member, possible values are:
* \c Public, \c Protected, \c Private.
* \param v The `virtualness' of the member, possible values are:
* \c Normal, \c Virtual, \c Pure.
* \param s A boolean that is true if the member is static.
* \param r A boolean that is true if the member is only related.
* \param mt The kind of member. See #MemberDef::MemberType for a list of
* all types.
*/
......@@ -241,6 +243,7 @@ MemberDef::MemberDef(const char *df,int dl,
memDef=0;
memDec=0;
group=0;
grpId=-1;
exampleList=0;
exampleDict=0;
enumFields=0;
......@@ -262,13 +265,14 @@ MemberDef::MemberDef(const char *df,int dl,
eUsed=FALSE;
proto=FALSE;
annScope=FALSE;
inLine=FALSE;
memSpec=FALSE;
annMemb=0;
annUsed=FALSE;
annShown=FALSE;
annEnumType=0;
indDepth=0;
section=0;
maxInitLines=defMaxInitLines;
docEnumValues=FALSE;
// copy function template arguments (if any)
if (tal)
......@@ -442,19 +446,6 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
{
Definition *d;
if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else if (gd) d=gd;
//if (mg)
// ol.writeObjectLink(0,mg->getOutputFileBase(),
// anchor(),name());
//else if (cd)
// ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
// anchor(),name());
//else if (nd)
// ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),
// anchor(),name());
//else if (fd)
// ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),
// anchor(),name());
//else
ol.writeObjectLink(d->getReference(),d->getOutputFileBase(),anchor(),name());
}
......@@ -749,7 +740,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.docify(excpString());
}
if (!init.isEmpty() && initLines==0) // add initializer
if (!init.isEmpty() && initLines==0 && maxInitLines>0) // add initializer
{
if (!isDefine())
{
......@@ -955,7 +946,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.startMemberDocName();
linkifyText(ol,scopeName,name(),def);
writeDefArgumentList(ol,cd,scopeName,this);
if (!init.isEmpty() && initLines==0) // add initializer
if (!init.isEmpty() && initLines==0 && maxInitLines>0) // add initializer
{
if (!isDefine())
{
......@@ -986,7 +977,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (isStatic() || protection()!=Public ||
virt!=Normal || isSignal() || isFriend() ||
isRelated() || isSlot() ||
(isInline() && Config::inlineInfoFlag)
getMemberSpecifiers()!=0
)
{
// write the member specifier list
......@@ -1000,6 +991,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
{
if (Config::inlineInfoFlag && isInline())
sl.append("inline");
if (isExplicit()) sl.append("explicit");
if (isMutable()) sl.append("mutable");
if (isStatic()) sl.append("static");
if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private");
......@@ -1340,7 +1333,6 @@ bool MemberDef::isLinkableInProject()
{
return !name().isEmpty() && name().at(0)!='@' &&
((hasDocumentation() && !isReference())
/* || (memberGroup && memberGroup->isLinkableInProject())*/
) &&
(prot!=Private || Config::extractPrivateFlag || isFriend()) && // not a private class member
(classDef!=0 || Config::extractPrivateFlag || !isStatic()); // not a private file/namespace member
......@@ -1381,3 +1373,9 @@ void MemberDef::setMemberGroup(MemberGroup *grp)
{
memberGroup = grp;
}
bool MemberDef::visibleMemberGroup(bool hideNoHeader)
{
return memberGroup!=0 &&
(!hideNoHeader || memberGroup->header()!="[NOHEADER]");
}
......@@ -55,8 +55,8 @@ class MemberDef : public Definition
enum
{
maxInitLines = 30 // maximum number of lines shown for member
// initialization
defMaxInitLines = 30 // default maximum number of lines shown for member
// initializer
};
MemberDef(const char *defFileName,int defLine,
......@@ -93,21 +93,24 @@ class MemberDef : public Definition
FileDef *getFileDec() { return fileDec; }
bool isRelated() const { return related; }
bool isStatic() const { return stat; }
bool isInline() const { return inLine; }
bool isInline() const { return (memSpec&Entry::Inline)!=0; }
bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; }
bool isMutable() const { return (memSpec&Entry::Mutable)!=0; }
MemberList *getSectionList() const { return section; }
void setMemberType(MemberType t) { mtype=t; }
void setDefinition(const char *d) { def=d; }
//void setDefFile(const char *f) { defFile=f; }
//void setDefLine(int l) { defLine=l; }
void setFileDef(FileDef *fd) { fileDef=fd; }
void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { anc=a; }
void setProtection(Protection p) { prot=p; }
void setInline(bool in) { inLine=in; }
void setMemberSpecifiers(int s) { memSpec=s; }
int getMemberSpecifiers() { return memSpec; }
void mergeMemberSpecifiers(int s) { memSpec|=s; }
void setInitializer(const char *i) { init=i;
init=init.stripWhiteSpace();
initLines=init.contains('\n');
}
void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; }
void setMemberClass(ClassDef *cd) { classDef=cd; }
void setSectionList(MemberList *sl) { section=sl; }
void makeRelated() { related=TRUE; }
......@@ -143,10 +146,6 @@ class MemberDef : public Definition
bool hasExamples();
ExampleList *getExampleList() const { return exampleList; }
// prototype related members
//void setDecFile(const char *f) { declFile=f; }
//void setDecLine(int l) { defLine=l; }
// convenience members
bool isSignal() const { return mtype==Signal; }
bool isSlot() const { return mtype==Slot; }
......@@ -162,10 +161,6 @@ class MemberDef : public Definition
void setPrototype(bool p) { proto=p; }
bool isPrototype() const { return proto; }
// tag file related members
//void setReference(const char *r) { external=r; }
//bool isReference() { return !external.isEmpty(); }
// argument related members
ArgumentList *argumentList() const { return argList; }
void setArgumentList(ArgumentList *al)
......@@ -186,6 +181,8 @@ class MemberDef : public Definition
// member group related members
void setMemberGroup(MemberGroup *grp);
MemberGroup *getMemberGroup() const { return memberGroup; }
void setMemberGroupId(int id) { grpId=id; }
int getMemberGroupId() const { return grpId; }
void setFromAnnonymousScope(bool b) { annScope=b; }
void setFromAnnonymousMember(MemberDef *m) { annMemb=m; }
......@@ -193,6 +190,8 @@ class MemberDef : public Definition
bool annonymousDeclShown() { return annUsed; }
void setIndentDepth( int i) { indDepth=i; }
int indentDepth() { return indDepth; }
bool visibleMemberGroup(bool hideNoHeader);
private:
ClassDef *classDef; // member of or related to
......@@ -225,7 +224,7 @@ class MemberDef : public Definition
Protection prot; // protection type [Public/Protected/Private]
bool related; // is this a member that is only related to a class
bool stat; // is it a static function?
bool inLine; // is it an inline function?
int memSpec; // The specifiers present for this member
MemberType mtype; // returns the kind of member
bool eUsed; // is the enumerate already placed in a list
bool proto; // is it a prototype;
......@@ -234,13 +233,14 @@ class MemberDef : public Definition
bool annUsed;
bool annShown;
int indDepth;
int maxInitLines; // when the initializer will be displayed
MemberList *section; // declation list containing this member
MemberDef *annMemb;
ArgumentList *argList; // argument list of this member
ArgumentList *tArgList; // template argument list of function template
ArgumentList *scopeTAL; // template argument list of class template
ArgumentList *membTAL; // template argument list of class template
//int grpId; // group id
int grpId; // group id
//QCString grpHeader; // group header
MemberGroup *memberGroup; // group's member definition
......
......@@ -53,7 +53,9 @@ MemberGroup::~MemberGroup()
void MemberGroup::insertMember(MemberDef *md)
{
//printf("MemberGroup::insertMember(%s)\n",md->name().data());
//printf("MemberGroup::insertMember memberList=%p count=%d"
// " member section list: %p\n",memberList,memberList->count(),
// md->getSectionList());
if (inSameSection && memberList->count()>0 &&
memberList->first()->getSectionList()!=md->getSectionList())
{
......@@ -97,11 +99,11 @@ void MemberGroup::addToDeclarationSection()
}
}
int MemberGroup::countDecMembers()
int MemberGroup::countDecMembers(bool sectionPerType)
{
if (numDeclMembers==-1) /* number of member not cached */
{
memberList->countDecMembers(TRUE,TRUE);
memberList->countDecMembers(TRUE,TRUE,sectionPerType);
numDeclMembers = memberList->totalCount();
}
return numDeclMembers;
......
......@@ -52,7 +52,7 @@ class MemberGroup /* : public Definition */
QCString documentation() { return doc; }
bool allMembersInSameSection() { return inSameSection; }
void addToDeclarationSection();
int countDecMembers();
int countDecMembers(bool sectionPerType);
void distributeMemberGroupDocumentation();
private:
......
......@@ -44,7 +44,7 @@ int MemberList::compareItems(GCI item1, GCI item2)
return strcmp(c1->name(),c2->name());
}
void MemberList::countDecMembers(bool inGroup,bool countSubGroups)
void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPerType)
{
//printf("----- countDecMembers ----\n");
varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0;
......@@ -64,7 +64,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups)
md->hasDocumentedEnumValues()
)
) &&
inGroup==(md->getMemberGroup()!=0) &&
inGroup==md->visibleMemberGroup(sectionPerType) &&
!(inGroup && md->protection()==Private && !Config::extractPrivateFlag)
)
{
......@@ -82,6 +82,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups)
case MemberDef::Prototype: protoCnt++,m_count++; break;
case MemberDef::Define: if (Config::extractAllFlag ||
md->argsString() ||
!md->initializer().isEmpty() ||
md->hasDocumentation()
) defCnt++,m_count++;
break;
......@@ -98,7 +99,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
int mgCount = mg->countDecMembers();
int mgCount = mg->countDecMembers(sectionPerType);
//printf("memberGroupList adding %d inGroup=%d\n",mgCount,inGroup);
m_count+=mgCount;
}
......@@ -155,21 +156,20 @@ void MemberList::writePlainDeclarations(OutputList &ol,
bool inGroup,bool countSubGroups
)
{
bool sectionPerType = !inGroup && (fd || nd || gd);
//printf("----- writePlainDeclaration() ----\n");
countDecMembers(inGroup,countSubGroups);
countDecMembers(inGroup,countSubGroups,sectionPerType);
if (totalCount()==0) return; // no members in this list
//printf("----> writePlainDeclaration() inGroup=%d totalCount()=%d\n",inGroup,totalCount());
ol.pushGeneratorState();
//int prevGroupId = -1;
bool sectionPerType = !inGroup && (fd || nd || gd);
if (!sectionPerType) ol.startMemberList();
MemberDef *md;
if (defineCount()>0)
{
//printf("There are %d defines\n",defineCount());
if (sectionPerType)
{
ol.startMemberHeader();
......@@ -183,8 +183,10 @@ void MemberList::writePlainDeclarations(OutputList &ol,
//printf("md->isDefined()=%d inGroup=%d md->getMemberGroup()=%p\n",
// md->isDefine(),inGroup,md->getMemberGroup());
if (md->isDefine() &&
(md->argsString() || md->hasDocumentation() || Config::extractAllFlag) &&
inGroup==(md->getMemberGroup()!=0)
(md->argsString() || md->hasDocumentation() ||
!md->initializer().isEmpty() ||
Config::extractAllFlag) &&
inGroup==md->visibleMemberGroup(sectionPerType)
)
{
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
......@@ -209,7 +211,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
MemberListIterator mli(*this);
for ( ; (md=mli.current()); ++mli )
{
if (md->isPrototype() && inGroup==(md->getMemberGroup()!=0))
if (md->isPrototype() && inGroup==md->visibleMemberGroup(sectionPerType))
{
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
}
......@@ -234,7 +236,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli )
{
if (md->isTypedef() && inGroup==(md->getMemberGroup()!=0))
if (md->isTypedef() && inGroup==md->visibleMemberGroup(sectionPerType))
{
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
}
......@@ -263,7 +265,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
type=type.stripWhiteSpace(); // TODO: is this really needed?
// filter out enums that are in a group iff inGroup holds
if (md->isEnumerate() && inGroup==(md->getMemberGroup()!=0) /*&& (hasDocs || !Config::hideMemberFlag)*/)
if (md->isEnumerate() && inGroup==md->visibleMemberGroup(sectionPerType) /*&& (hasDocs || !Config::hideMemberFlag)*/)
{
// filter out invisible enums
if ( !Config::hideMemberFlag || // do not hide undocumented members or
......@@ -409,7 +411,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (
( md->isFunction() || md->isSignal() || md->isSlot()) &&
( !md->isRelated() || md->memberClass() ) &&
inGroup==(md->getMemberGroup()!=0)
inGroup==md->visibleMemberGroup(sectionPerType)
)
{
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
......@@ -424,7 +426,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli )
{
if (md->isFriend() && inGroup==(md->getMemberGroup()!=0))
if (md->isFriend() && inGroup==md->visibleMemberGroup(sectionPerType))
{
QCString type=md->typeString();
//printf("Friend: type=%s name=%s\n",type.data(),md->name().data());
......@@ -479,7 +481,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli )
{
if (md->isVariable() && inGroup==(md->getMemberGroup()!=0))
if (md->isVariable() && inGroup==md->visibleMemberGroup(sectionPerType))
{
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
}
......@@ -495,7 +497,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
for ( ; (md=mli.current()) ; ++mli )
{
if (md->fromAnnonymousScope() && !md->annonymousDeclShown()
&& inGroup==(md->getMemberGroup()!=0))
&& inGroup==md->visibleMemberGroup(sectionPerType))
{
//printf("annonymous compound members\n");
md->setFromAnnonymousScope(FALSE);
......@@ -518,13 +520,14 @@ void MemberList::writeDeclarations(OutputList &ol,
{
//printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",title,subtitle);
//printf("----- writeDeclaration() ----\n");
countDecMembers(FALSE,countSubGroups); // count member not in group
bool sectionPerType = !inGroup && (fd || nd || gd);
countDecMembers(FALSE,countSubGroups,sectionPerType); // count member not in group
int normalMembers = totalCount();
int ingroupMembers = 0;
//printf("Normal members %d\n",normalMembers);
if (inGroup)
{
countDecMembers(TRUE,countSubGroups); // count member inside group
countDecMembers(TRUE,countSubGroups,sectionPerType); // count member inside group
ingroupMembers = totalCount();
}
int totalMembers = normalMembers + ingroupMembers;
......@@ -551,13 +554,13 @@ void MemberList::writeDeclarations(OutputList &ol,
if (memberGroupList)
{
//printf("MemberList::writeDeclarations()\n");
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
while ((mg=mgli.current()))
{
ol.startMemberGroupHeader();
if (mg->header()!="[NOHEADER]")
bool hasHeader=mg->header()!="[NOHEADER]";
ol.startMemberGroupHeader(hasHeader);
if (hasHeader)
{
parseText(ol,mg->header());
}
......@@ -566,14 +569,13 @@ void MemberList::writeDeclarations(OutputList &ol,
{
//printf("Member group has docs!\n");
ol.startMemberGroupDocs();
parseDoc(ol,"<generated>",1,
0,0,mg->documentation());
parseDoc(ol,"<generated>",1,0,0,mg->documentation());
ol.endMemberGroupDocs();
}
ol.startMemberGroup();
mg->writePlainDeclarations(ol,cd,nd,fd,gd);
++mgli;
ol.endMemberGroup(mgli.current()==0);
ol.endMemberGroup(hasHeader);
}
}
//printf("----- end writeDeclaration() ----\n");
......@@ -593,10 +595,11 @@ void MemberList::writeDocumentation(OutputList &ol,
void MemberList::addMemberGroup(MemberGroup *mg)
{
//printf("MemberList::addMemberGroup(%p)\n",mg);
if (memberGroupList==0)
{
memberGroupList=new MemberGroupList;
}
memberGroupList->append(mg);
}
......@@ -41,7 +41,7 @@ class MemberList : public QList<MemberDef>
int protoCount() const { return protoCnt; }
int defineCount() const { return defCnt; }
int friendCount() const { return friendCnt; }
void countDecMembers(bool inGroup,bool countSubGroups);
void countDecMembers(bool inGroup,bool countSubGroups,bool sectionPerType);
void countDocMembers();
int totalCount() const
{ return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+
......
......@@ -78,28 +78,44 @@ void NamespaceDef::insertClass(ClassDef *cd)
}
}
void NamespaceDef::addMemberToGroup(MemberDef *md,int groupId)
void NamespaceDef::addMemberListToGroup(MemberList *ml,
bool (MemberDef::*func)() const)
{
if (groupId!=-1)
MemberListIterator mli(*ml);
MemberDef *md;
for (;(md=mli.current());++mli)
{
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
int groupId=md->getMemberGroupId();
if ((md->*func)() && groupId!=-1)
{
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId];
if (pGrpHeader)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
MemberGroup *mg = memberGroupDict->find(groupId);
if (mg==0)
{
mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
mg->insertMember(md);
md->setMemberGroup(mg);
}
}
}
void NamespaceDef::insertMember(MemberDef *md,int groupId)
void NamespaceDef::addMembersToMemberGroup()
{
addMemberListToGroup(&allMemberList,&MemberDef::isTypedef);
addMemberListToGroup(&allMemberList,&MemberDef::isEnumerate);
addMemberListToGroup(&allMemberList,&MemberDef::isEnumValue);
addMemberListToGroup(&allMemberList,&MemberDef::isFunction);
addMemberListToGroup(&allMemberList,&MemberDef::isVariable);
}
void NamespaceDef::insertMember(MemberDef *md)
{
//memList->append(md);
allMemberList.append(md);
......@@ -115,7 +131,7 @@ void NamespaceDef::insertMember(MemberDef *md,int groupId)
default:
err("NamespaceDef::insertMembers(): unexpected member inserted in namespace!\n");
}
addMemberToGroup(md,groupId);
//addMemberToGroup(md,groupId);
}
void NamespaceDef::computeAnchors()
......
......@@ -39,33 +39,18 @@ class NamespaceDef : public Definition
NamespaceDef(const char *defFileName,int defLine,
const char *name,const char *ref=0);
~NamespaceDef();
//QCString namespaceFile() const { return fileName; }
QCString getOutputFileBase() const { return fileName; }
void insertUsedFile(const char *fname);
void writeDocumentation(OutputList &ol);
void insertClass(ClassDef *cd);
void insertMember(MemberDef *md,int groupId);
void addMemberToGroup(MemberDef *md,int groupId);
void insertMember(MemberDef *md);
void computeAnchors();
int countMembers();
void addUsingDirective(NamespaceDef *nd);
NamespaceList *getUsedNamespaces() const { return usingDirList; }
void addUsingDeclaration(ClassDef *cd);
ClassList *getUsedClasses() const { return usingDeclList; }
//const char *getReference() { return reference; }
//bool isVisible()
//{
// return !getReference() && hasDocumentation() &&
// !name().isEmpty() && name().at(0)!='@';
//}
//bool isVisibleExt()
//{
// return (getReference() || hasDocumentation()) &&
// !name().isEmpty() && name().at(0)!='@';
//}
bool isLinkableInProject()
{
int i = name().findRev("::");
......@@ -77,8 +62,12 @@ class NamespaceDef : public Definition
{
return isLinkableInProject() || isReference();
}
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
protected:
void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
private:
//QCString reference;
QCString fileName;
......
......@@ -103,7 +103,7 @@ class OutputGenerator
virtual void endMemberList() = 0;
virtual void startMemberItem(int) = 0;
virtual void endMemberItem(bool) = 0;
virtual void startMemberGroupHeader() = 0;
virtual void startMemberGroupHeader(bool) = 0;
virtual void endMemberGroupHeader() = 0;
virtual void startMemberGroupDocs() = 0;
virtual void endMemberGroupDocs() = 0;
......
......@@ -164,8 +164,8 @@ class OutputList
{ forall(&OutputGenerator::startMemberItem,i1); }
void endMemberItem(bool b2)
{ forall(&OutputGenerator::endMemberItem,b2); }
void startMemberGroupHeader()
{ forall(&OutputGenerator::startMemberGroupHeader); }
void startMemberGroupHeader(bool b)
{ forall(&OutputGenerator::startMemberGroupHeader,b); }
void endMemberGroupHeader()
{ forall(&OutputGenerator::endMemberGroupHeader); }
void startMemberGroupDocs()
......
......@@ -760,8 +760,7 @@ Define *newDefine()
void addDefine()
{
//bool ambig;
//FileDef *fd=findFileDef(&inputNameDict,g_yyFileName,ambig);
//printf("addDefine %s %s\n",g_defName.data(),g_defArgsStr.data());
MemberDef *md=new MemberDef(
g_yyFileName,g_yyLineNr,
"#define",g_defName,g_defArgsStr,0,
......@@ -789,7 +788,7 @@ void addDefine()
functionNameDict.insert(g_defName,mn);
}
mn->append(md);
if (g_yyFileDef) g_yyFileDef->insertMember(md,-1);
if (g_yyFileDef) g_yyFileDef->insertMember(md);
//Define *d;
//if ((d=defineDict[g_defName])==0) defineDict.insert(g_defName,newDefine());
......
......@@ -46,20 +46,24 @@ static ListItemInfo listItemInfo[indentLevels];
static QCString formatBmkStr(const char *name)
{
QCString result=name;
int i=0;
char c;
while ((c=result.at(i))!=0)
if (!result.isEmpty())
{
switch(c)
char c;
char *p=result.data();
while ((c=*p))
{
case '.':
case ':':
result.at(i)='_';
break;
default:
break;
switch(c)
{
case '.':
// fall through
case ':':
*p='_';
break;
default:
break;
}
p++;
}
i++;
}
return result;
}
......@@ -1146,18 +1150,16 @@ void RTFGenerator::endTitleHead(const char *fileName,const char *name)
t << "}" << endl;
// make an index entry
addToIndex(name,NULL);
addToIndex(name,0);
if (fileName)
if (name)
{
// doxygen expects different anchors for pdf and if "FULL PATHS"
writeAnchor(fileName,0);
writeAnchor(0,name);
}
else
if (Config::rtfHyperFlag && fileName)
{
// make a bookmark for referencing
writeAnchor(0,name);
writeAnchor(fileName,0);
}
}
}
......@@ -1193,8 +1195,11 @@ void RTFGenerator::startMemberDoc(const char *clname,
const char *)
{
t << "{\\comment startMemberDoc}" << endl;
addToIndex(memname,clname);
addToIndex(clname,memname);
if (memname && memname[0]!='@')
{
addToIndex(memname,clname);
addToIndex(clname,memname);
}
//t << Rtf_Style_Reset << Rtf_Style_ListBullet1;
t << Rtf_Style_Reset << Rtf_Style_Heading4;
//styleStack.push(Rtf_Style_Heading4);
......@@ -1352,7 +1357,7 @@ void RTFGenerator::startDescList()
{
t << "{\\comment (startDescList)}" << endl;
t << "{";
///*if (!m_omitParagraph)*/ newParagraph();
newParagraph();
}
void RTFGenerator::endDescTitle()
......@@ -2027,11 +2032,11 @@ bool RTFGenerator::preProcessFileInplace(const char *path,const char *name)
return TRUE;
}
void RTFGenerator::startMemberGroupHeader()
void RTFGenerator::startMemberGroupHeader(bool hasHeader)
{
t << "{\\comment startMemberGroupHeader}" << endl;
t << "{" << endl;
incrementIndentLevel();
if (hasHeader) incrementIndentLevel();
t << Rtf_Style_Reset << Rtf_Style_GroupHeader;
}
......@@ -2061,10 +2066,10 @@ void RTFGenerator::startMemberGroup()
t << Rtf_Style_Reset << Rtf_BList_DepthStyle() << endl;
}
void RTFGenerator::endMemberGroup(bool)
void RTFGenerator::endMemberGroup(bool hasHeader)
{
t << "{\\comment endMemberGroup}" << endl;
decrementIndentLevel();
if (hasHeader) decrementIndentLevel();
t << "}";
}
......@@ -197,7 +197,7 @@ class RTFGenerator : public OutputGenerator
void endInclDepGraph(DotInclDepGraph &);
void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
void startMemberGroupHeader();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
void startMemberGroupDocs();
void endMemberGroupDocs();
......
/******************************************************************************
/*****************************************************************************
*
*
*
......@@ -840,7 +840,7 @@ static QCString findAndCopyImage(const char *fileName,ImageTypes type)
else
{
result=fileName;
if (result.left(5)!="http:")
if (result.left(5)!="http:" && result.left(6)!="https:")
{
warn(yyFileName,yyLineNr,
"Warning: image file %s is not found in IMAGE_PATH: "
......@@ -1523,7 +1523,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
outDoc->docify(", ");
}
}
<DocScan>{CMD}"param"/{BN} {
<DocScan>(({B}*"\n"){2,}{B}*)?{CMD}"param"/{BN} {
endArgumentList();
if (!inParamBlock)
{
......@@ -1543,7 +1543,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
}
BEGIN(DocParam);
}
<DocScan>{CMD}"retval"/{BN} {
<DocScan>(({B}*"\n"){2,}{B}*)?{CMD}"retval"/{BN} {
endArgumentList();
if (!inRetValBlock)
{
......@@ -1563,7 +1563,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
}
BEGIN(DocParam);
}
<DocScan>{CMD}("exception"|"throw")s?/{BN} {
<DocScan>(({B}*"\n"){2,}{B}*)?{CMD}("exception"|"throw")s?/{BN} {
endArgumentList();
if (!inExceptionBlock)
{
......@@ -1602,7 +1602,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
outDoc->startDescTableData();
BEGIN(DocScan);
}
<DocScan>{CMD}"section "{ID}"\n" {
<DocScan>{CMD}"section "{ID}"\n" {
QCString secName=&yytext[9]; // skip "\section "
secName=secName.left(secName.length()-1); // remove \n
//printf("SectionName %s found\n",secName.data());
......@@ -1624,7 +1624,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
outDoc->writeAnchor(sec->fileName,sec->label);
}
}
<DocScan>{CMD}"ref" {
<DocScan>{CMD}"ref" {
BEGIN(DocRefName);
}
<DocScan>{CMD}"refitem" {
......@@ -1809,12 +1809,16 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
warn(yyFileName,yyLineNr,"Warning: \\endcode without <PRE> or \\code "
"in the documentation.");
}
<DocScan>{SCOPEMASK}"("[a-z_A-Z0-9,:\<\> \t\*\&]+")" {
<DocScan>{ID}"<"[^>\ \t\n]*">"("::"{ID})+"("?[a-z_A-Z0-9,:\<\> \t\*\&]*")"? {
generateRef(*outDoc,className,yytext,inSeeBlock);
}
<DocScan>{SCOPEMASK}"("[a-z_A-Z0-9,:\<\> \t\*\&]+")" {
generateRef(*outDoc,className,yytext,inSeeBlock);
}
<DocScan>{SCOPEMASK}("()")? {
generateRef(*outDoc,className,yytext,inSeeBlock);
}
<DocScan>{SCOPEMASK}(("()")?) {
generateRef(*outDoc,className,yytext,inSeeBlock);
}
<DocScan>({SCOPEMASK}"::")?"operator()("[a-z_A-Z0-9,\<\> \t\*\&]*")" {
QCString oName=yytext;
generateRef(*outDoc,className,
......@@ -1825,7 +1829,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
generateRef(*outDoc,className,
removeRedundantWhiteSpace(oName),inSeeBlock);
}
<DocScan>("http:"|"ftp:"|"file:"){URLMASK} { outDoc->writeHtmlLink(yytext,yytext); }
<DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK} { outDoc->writeHtmlLink(yytext,yytext); }
<DocScan>[a-zA-Z_0-9\.\-]+"@"[0-9a-z_A-Z\.\-]+ { outDoc->writeMailLink(yytext); }
<DocScan>{FILEMASK} {
generateFileRef(*outDoc,yytext);
......@@ -2292,7 +2296,13 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
current->virt = Virtual;
lineCount();
}
<FindMembers>{B}*"inline"{BN}+ { current->inLine = TRUE;
<FindMembers>{B}*"inline"{BN}+ { current->memSpec|=Entry::Inline;
lineCount();
}
<FindMembers>{B}*"mutable"{BN}+ { current->memSpec|=Entry::Mutable;
lineCount();
}
<FindMembers>{B}*"explicit"{BN}+ { current->memSpec|=Entry::Explicit;
lineCount();
}
<FindMembers>{B}*"import"{BN}+ { // IDL import keyword
......@@ -3620,7 +3630,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
if( *yytext == '{' )
{
if (current_root->section & Entry::COMPOUND_MASK)
previous->inLine = TRUE;
previous->memSpec = previous->memSpec | Entry::Inline;
//addToBody(yytext);
curlyCount=0;
BEGIN( SkipCurly ) ;
......@@ -4618,6 +4628,12 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
<ClassDoc,LineDoc,Doc,JavaDoc>{CMD}"nosubgrouping"/[^a-z_A-Z0-9] {
current->subGrouping = FALSE;
}
<ClassDoc,LineDoc,Doc,JavaDoc>{CMD}"showinitializer"/[^a-z_A-Z0-9] {
current->initLines = 100000; // ON
}
<ClassDoc,LineDoc,Doc,JavaDoc>{CMD}"hideinitializer"/[^a-z_A-Z0-9] {
current->initLines = 0; // OFF
}
<GroupName>{ID} {
current->groups->append(
new QCString(yytext)
......
......@@ -119,21 +119,21 @@ static void addMember(const char *name,const char *anchor,const char *args)
if (cd) // member of a class
{
md->setMemberClass(cd);
cd->insertMember(md,-1); /* TODO: store group info */
cd->insertMember(md);
mnd=&memberNameDict;
mnl=&memberNameList;
}
else if (nd) // member of a namespace
{
md->setNamespace(nd);
nd->insertMember(md,-1); /* TODO: store group info */
nd->insertMember(md);
mnd=&functionNameDict;
mnl=&functionNameList;
}
else // member of a file
{
md->setFileDef(fd);
fd->insertMember(md,-1); /* TODO: store group info */
fd->insertMember(md);
mnd=&functionNameDict;
mnl=&functionNameList;
}
......
......@@ -463,6 +463,10 @@ QCString argListToString(ArgumentList *al)
{
result+= a->type;
}
if (!a->defval.isEmpty())
{
result+="="+a->defval;
}
a = al->next();
if (a) result+=",";
}
......@@ -1062,6 +1066,7 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
stripIrrelevantConstVolatile(srcAType);
stripIrrelevantConstVolatile(dstAType);
if (srcA->array!=dstA->array) return FALSE;
if (srcAType!=dstAType) // check if the argument only differs on name
{
//printf("scope=`%s': `%s' <=> `%s'\n",className.data(),srcAType.data(),dstAType.data());
......@@ -1256,8 +1261,6 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl)
{
//printf("mergeArguments `%s', `%s'\n",
// argListToString(srcAl).data(),argListToString(dstAl).data());
//printArgList(srcAl);printf(" <=> ");
//printArgList(dstAl);printf("\n");
if (srcAl==0 || dstAl==0 || srcAl->count()!=dstAl->count())
{
......@@ -1795,6 +1798,15 @@ bool generateRef(OutputList &ol,const char *scName,
}
//printf("scope=`%s' name=`%s' arg=`%s' linkText=`%s'\n",
// scopeStr.data(),nameStr.data(),argsStr.data(),linkText.data());
// strip template specifier
// TODO: match against the correct partial template instantiation
int templPos=nameStr.find('<');
if (templPos!=-1 && nameStr.find("operator")==-1)
{
int endTemplPos=nameStr.findRev('>');
nameStr=nameStr.left(templPos)+nameStr.right(nameStr.length()-endTemplPos-1);
}
MemberDef *md = 0;
ClassDef *cd = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment