Commit 5ade6c6e authored by dimitri's avatar dimitri

Release-1.1.4-20000625

parent cb417a1f
DOXYGEN Version 1.1.4 DOXYGEN Version 1.1.4-20000625
CONTENTS CONTENTS
-------- --------
...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX: ...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have: 1. Unpack the archive, unless you already have:
gunzip doxygen-1.1.4.src.tar.gz # uncompress the archive gunzip doxygen-1.1.4-20000625.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.4.src.tar # unpack it tar xf doxygen-1.1.4-20000625.src.tar # unpack it
2. Run the configure script: 2. Run the configure script:
...@@ -255,4 +255,4 @@ The latest version of doxygen can be obtained at ...@@ -255,4 +255,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (18 June 2000) Dimitri van Heesch (25 June 2000)
DOXYGEN Version 1.1.4 DOXYGEN Version 1.1.4-20000625
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at ...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (18 June 2000) Dimitri van Heesch (25 June 2000)
1.1.4 1.1.4-20000625
...@@ -787,18 +787,25 @@ void init() ...@@ -787,18 +787,25 @@ void init()
ConfigBool::add( "extractAllFlag", ConfigBool::add( "extractAllFlag",
"EXTRACT_ALL", "EXTRACT_ALL",
"FALSE", "FALSE",
"gererate docs for all classes flag", "generate docs for all classes flag",
"If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n" "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n"
"documentation are documented, even if no documentation was available. \n" "documentation are documented, even if no documentation was available. \n"
"Private class members and static file members will be hidden unless \n" "Private class members and static file members will be hidden unless \n"
"the EXTRACT_PRIVATE tag is set to YES \n" "the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES \n"
); );
ConfigBool::add( "extractPrivateFlag", ConfigBool::add( "extractPrivateFlag",
"EXTRACT_PRIVATE", "EXTRACT_PRIVATE",
"FALSE", "FALSE",
"generate docs for private members flag", "generate docs for private members flag",
"If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n" "If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n"
"and the static members of a file will be included in the documentation. \n" "will be included in the documentation. \n"
);
ConfigBool::add( "extractStaticFlag",
"EXTRACT_STATIC",
"FALSE",
"generate docs for static members flag",
"If the EXTRACT_STATIC tag is set to YES all static members of a file \n"
"will be included in the documentation. \n"
); );
ConfigBool::add( "hideMemberFlag", ConfigBool::add( "hideMemberFlag",
"HIDE_UNDOC_MEMBERS", "HIDE_UNDOC_MEMBERS",
...@@ -806,6 +813,8 @@ void init() ...@@ -806,6 +813,8 @@ void init()
"hide undocumented members.", "hide undocumented members.",
"If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n" "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"
"undocumented members of documented classes, files or namespaces. \n" "undocumented members of documented classes, files or namespaces. \n"
"If set to NO (the default) these members will be included in the \n"
"various overviews, but no documentation section is generated. \n"
"This option has no effect if EXTRACT_ALL is enabled. \n" "This option has no effect if EXTRACT_ALL is enabled. \n"
); );
ConfigBool::add( "hideClassFlag", ConfigBool::add( "hideClassFlag",
...@@ -814,7 +823,8 @@ void init() ...@@ -814,7 +823,8 @@ void init()
"hide undocumented members.", "hide undocumented members.",
"If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all \n" "If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all \n"
"undocumented classes that are normally visible in the class hierarchy. \n" "undocumented classes that are normally visible in the class hierarchy. \n"
"This option has no effect if EXTRACT_ALL is enabled. \n" "If set to NO (the default) these class will be included in the various \n"
"overviews. This option has no effect if EXTRACT_ALL is enabled. \n"
); );
ConfigBool::add( "briefMemDescFlag", ConfigBool::add( "briefMemDescFlag",
"BRIEF_MEMBER_DESC", "BRIEF_MEMBER_DESC",
...@@ -1290,7 +1300,7 @@ void init() ...@@ -1290,7 +1300,7 @@ void init()
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
ConfigBool::add( "generateRTF", ConfigBool::add( "generateRTF",
"GENERATE_RTF", "GENERATE_RTF",
"FALSE", "TRUE",
"generate RTF flag", "generate RTF flag",
"If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n" "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n"
"For now this is experimental and is disabled by default. The RTF output \n" "For now this is experimental and is disabled by default. The RTF output \n"
...@@ -1490,6 +1500,15 @@ void init() ...@@ -1490,6 +1500,15 @@ void init()
"documented files. \n" "documented files. \n"
); );
addDependency("includeGraphFlag","haveDotFlag"); addDependency("includeGraphFlag","haveDotFlag");
ConfigBool::add( "includedByGraphFlag",
"INCLUDED_BY_GRAPH",
"TRUE",
"depends on include graph",
"If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to \n"
"YES then doxygen will generate a graph for each documented header file showing \n"
"the documented files that directly or indirectly include this file \n"
);
addDependency("includedByGraphFlag","haveDotFlag");
ConfigBool::add( "gfxHierarchyFlag", ConfigBool::add( "gfxHierarchyFlag",
"GRAPHICAL_HIERARCHY", "GRAPHICAL_HIERARCHY",
"TRUE", "TRUE",
...@@ -1502,11 +1521,36 @@ void init() ...@@ -1502,11 +1521,36 @@ void init()
"DOT_PATH", "DOT_PATH",
"", "",
"path to the dot tool", "path to the dot tool",
"This tag can be used to specify the path where the dot tool can be found. \n" "The tag DOT_PATH can be used to specify the path where the dot tool can be \n"
"If left blank, it is assumed the dot tool can be found on the path. \n", "found. If left blank, it is assumed the dot tool can be found on the path. \n",
ConfigString::Dir ConfigString::Dir
); );
addDependency("dotPath","haveDotFlag"); addDependency("dotPath","haveDotFlag");
ConfigInt::add( "maxDotGraphWidth",
"MAX_DOT_GRAPH_WIDTH",
"1024",
"max dot graph width",
"The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width \n"
"(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
"this value, doxygen will try to truncate the graph, so that it fits within \n"
"the specified constraint. Beware that most browsers cannot cope with very \n"
"large images. \n",
250,30000
);
addDependency("maxDotGraphWidth","haveDotFlag");
ConfigInt::add( "maxDotGraphHeight",
"MAX_DOT_GRAPH_HEIGHT",
"1024",
"max dot graph height",
"The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height \n"
"(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
"this value, doxygen will try to truncate the graph, so that it fits within \n"
"the specified constraint. Beware that most browsers cannot cope with very \n"
"large images. \n",
250,30000
);
addDependency("maxDotGraphHeight","haveDotFlag");
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
ConfigInfo::add( "Search","Configuration::addtions related to the search engine "); ConfigInfo::add( "Search","Configuration::addtions related to the search engine ");
......
Doxywizard is a graphical front-end to read/edit/write doxygen configuration
files. It requires Qt version 2.1.0 or higher.
...@@ -104,6 +104,7 @@ documentation: ...@@ -104,6 +104,7 @@ documentation:
<li> \refitem cmdsa \sa <li> \refitem cmdsa \sa
<li> \refitem cmdsection \section <li> \refitem cmdsection \section
<li> \refitem cmdshowinitializer \showinitializer <li> \refitem cmdshowinitializer \showinitializer
<li> \refitem cmdsince \since
<li> \refitem cmdskip \skip <li> \refitem cmdskip \skip
<li> \refitem cmdskipline \skipline <li> \refitem cmdskipline \skipline
<li> \refitem cmdstruct \struct <li> \refitem cmdstruct \struct
...@@ -801,6 +802,16 @@ Public/Protected/Private/... section. ...@@ -801,6 +802,16 @@ Public/Protected/Private/... section.
\sa section \ref autolink "\\autolink" for information on how to create links \sa section \ref autolink "\\autolink" for information on how to create links
to objects. to objects.
<hr>
\subsection cmdsince \since { text }
\addindex \since
This tag can be used to specify since when (version or time) an
entity is available. The paragraph that follows \\since does not have any
special internal structure. All visual enhancement commands may be
used inside the paragraph. The \\since description ends when a blank
line or some other sectioning command is encountered.
<hr> <hr>
\subsection cmdthrow \throw <exception-object> { exception description } \subsection cmdthrow \throw <exception-object> { exception description }
......
...@@ -52,8 +52,8 @@ followed by the descriptions of the tags grouped by category. ...@@ -52,8 +52,8 @@ followed by the descriptions of the tags grouped by category.
\begin{CompactList} \begin{CompactList}
\endlatexonly \endlatexonly
<li> \refitem cfg_allexternals ALLEXTERNALS <li> \refitem cfg_allexternals ALLEXTERNALS
<li> \refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC
<li> \refitem cfg_alphabetical_index ALPHABETICAL_INDEX <li> \refitem cfg_alphabetical_index ALPHABETICAL_INDEX
<li> \refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC
<li> \refitem cfg_bin_abspath BIN_ABSPATH <li> \refitem cfg_bin_abspath BIN_ABSPATH
<li> \refitem cfg_brief_member_desc BRIEF_MEMBER_DESC <li> \refitem cfg_brief_member_desc BRIEF_MEMBER_DESC
<li> \refitem cfg_case_sense_names CASE_SENSE_NAMES <li> \refitem cfg_case_sense_names CASE_SENSE_NAMES
...@@ -68,6 +68,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -68,6 +68,7 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_disable_index DISABLE_INDEX <li> \refitem cfg_disable_index DISABLE_INDEX
<li> \refitem cfg_doc_abspath DOC_ABSPATH <li> \refitem cfg_doc_abspath DOC_ABSPATH
<li> \refitem cfg_doc_url DOC_URL <li> \refitem cfg_doc_url DOC_URL
<li> \refitem cfg_dot_path DOT_PATH
<li> \refitem cfg_enable_preprocessing ENABLE_PREPROCESSING <li> \refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
<li> \refitem cfg_enabled_sections ENABLED_SECTIONS <li> \refitem cfg_enabled_sections ENABLED_SECTIONS
<li> \refitem cfg_example_path EXAMPLE_PATH <li> \refitem cfg_example_path EXAMPLE_PATH
...@@ -79,6 +80,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -79,6 +80,7 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_extra_packages EXTRA_PACKAGES <li> \refitem cfg_extra_packages EXTRA_PACKAGES
<li> \refitem cfg_extract_all EXTRACT_ALL <li> \refitem cfg_extract_all EXTRACT_ALL
<li> \refitem cfg_extract_private EXTRACT_PRIVATE <li> \refitem cfg_extract_private EXTRACT_PRIVATE
<li> \refitem cfg_extract_static EXTRACT_STATIC
<li> \refitem cfg_file_patterns FILE_PATTERNS <li> \refitem cfg_file_patterns FILE_PATTERNS
<li> \refitem cfg_full_path_names FULL_PATH_NAMES <li> \refitem cfg_full_path_names FULL_PATH_NAMES
<li> \refitem cfg_generate_html GENERATE_HTML <li> \refitem cfg_generate_html GENERATE_HTML
...@@ -114,6 +116,8 @@ followed by the descriptions of the tags grouped by category. ...@@ -114,6 +116,8 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_macro_expansion MACRO_EXPANSION <li> \refitem cfg_macro_expansion MACRO_EXPANSION
<li> \refitem cfg_man_extension MAN_EXTENSION <li> \refitem cfg_man_extension MAN_EXTENSION
<li> \refitem cfg_man_output MAN_OUTPUT <li> \refitem cfg_man_output MAN_OUTPUT
<li> \refitem cfg_max_dot_graph_height MAX_DOT_GRAPH_HEIGHT
<li> \refitem cfg_max_dot_graph_width MAX_DOT_GRAPH_WIDTH
<li> \refitem cfg_output_directory OUTPUT_DIRECTORY <li> \refitem cfg_output_directory OUTPUT_DIRECTORY
<li> \refitem cfg_output_language OUTPUT_LANGUAGE <li> \refitem cfg_output_language OUTPUT_LANGUAGE
<li> \refitem cfg_paper_type PAPER_TYPE <li> \refitem cfg_paper_type PAPER_TYPE
...@@ -125,6 +129,8 @@ followed by the descriptions of the tags grouped by category. ...@@ -125,6 +129,8 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_quiet QUIET <li> \refitem cfg_quiet QUIET
<li> \refitem cfg_recursive RECURSIVE <li> \refitem cfg_recursive RECURSIVE
<li> \refitem cfg_repeat_brief REPEAT_BRIEF <li> \refitem cfg_repeat_brief REPEAT_BRIEF
<li> \refitem cfg_rtf_hyperlinks RTF_HYPERLINKS
<li> \refitem cfg_rtf_output RTF_OUTPUT
<li> \refitem cfg_search_includes SEARCH_INCLUDES <li> \refitem cfg_search_includes SEARCH_INCLUDES
<li> \refitem cfg_searchengine SEARCHENGINE <li> \refitem cfg_searchengine SEARCHENGINE
<li> \refitem cfg_show_include_files SHOW_INCLUDE_FILES <li> \refitem cfg_show_include_files SHOW_INCLUDE_FILES
...@@ -132,14 +138,12 @@ followed by the descriptions of the tags grouped by category. ...@@ -132,14 +138,12 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_source_browser SOURCE_BROWSER <li> \refitem cfg_source_browser SOURCE_BROWSER
<li> \refitem cfg_strip_code_comments STRIP_CODE_COMMENTS <li> \refitem cfg_strip_code_comments STRIP_CODE_COMMENTS
<li> \refitem cfg_strip_from_path STRIP_FROM_PATH <li> \refitem cfg_strip_from_path STRIP_FROM_PATH
<li> \refitem cfg_rtf_hyperlinks RTF_HYPERLINKS
<li> \refitem cfg_rtf_output RTF_OUTPUT
<li> \refitem cfg_tab_size TAB_SIZE <li> \refitem cfg_tab_size TAB_SIZE
<li> \refitem cfg_tagfiles TAGFILES <li> \refitem cfg_tagfiles TAGFILES
<li> \refitem cfg_verbatim_headers VERBATIM_HEADERS <li> \refitem cfg_verbatim_headers VERBATIM_HEADERS
<li> \refitem cfg_warnings WARNINGS
<li> \refitem cfg_warn_format WARN_FORMAT <li> \refitem cfg_warn_format WARN_FORMAT
<li> \refitem cfg_warn_if_undocumented WARN_IF_UNDOCUMENTED <li> \refitem cfg_warn_if_undocumented WARN_IF_UNDOCUMENTED
<li> \refitem cfg_warnings WARNINGS
\htmlonly \htmlonly
</ul> </ul>
</multicol> </multicol>
...@@ -197,8 +201,10 @@ followed by the descriptions of the tags grouped by category. ...@@ -197,8 +201,10 @@ followed by the descriptions of the tags grouped by category.
\anchor cfg_extract_all \anchor cfg_extract_all
<dt>\c EXTRACT_ALL <dd> <dt>\c EXTRACT_ALL <dd>
\addindex EXTRACT_ALL \addindex EXTRACT_ALL
If the \c EXTRACT_ALL tag is set to \c YES all classes and functions will be If the \c EXTRACT_ALL tag is set to \c YES doxygen will assume all
included in the documentation, even if no documentation was available. entities in documentation are documented, even if no documentation was
available. Private class members and static file members will be hidden
unless the \c EXTRACT_PRIVATE and \c EXTRACT_STATIC tags are set to \c YES
\par Note: \par Note:
This will also disable the warnings about undocumented members This will also disable the warnings about undocumented members
...@@ -207,8 +213,14 @@ followed by the descriptions of the tags grouped by category. ...@@ -207,8 +213,14 @@ followed by the descriptions of the tags grouped by category.
\anchor cfg_extract_private \anchor cfg_extract_private
<dt>\c EXTRACT_PRIVATE <dd> <dt>\c EXTRACT_PRIVATE <dd>
\addindex EXTRACT_PRIVATE \addindex EXTRACT_PRIVATE
If the \c EXTRACT_PRIVATE tag is set to \c YES all If the \c EXTRACT_PRIVATE tag is set to \c YES all private members of a
documentation for private members will be extracted as well. class will be included in the documentation.
\anchor cfg_extract_static
<dt>\c EXTRACT_STATIC <dd>
\addindex EXTRACT_STATIC
If the \c EXTRACT_STATIC tag is set to \c YES all static members of a file
will be included in the documentation.
\anchor cfg_hide_undoc_members \anchor cfg_hide_undoc_members
<dt>\c HIDE_UNDOC_MEMBERS <dd> <dt>\c HIDE_UNDOC_MEMBERS <dd>
...@@ -217,6 +229,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -217,6 +229,7 @@ followed by the descriptions of the tags grouped by category.
undocumented members inside documented classes or files. undocumented members inside documented classes or files.
If set to \c NO (the default) these members will be included in the If set to \c NO (the default) these members will be included in the
various overviews, but no documentation section is generated. various overviews, but no documentation section is generated.
This option has no effect if \c EXTRACT_ALL is enabled.
\anchor cfg_hide_undoc_classes \anchor cfg_hide_undoc_classes
<dt>\c HIDE_UNDOC_CLASSES <dd> <dt>\c HIDE_UNDOC_CLASSES <dd>
...@@ -225,6 +238,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -225,6 +238,7 @@ followed by the descriptions of the tags grouped by category.
undocumented classes. undocumented classes.
If set to \c NO (the default) these classes will be included in the If set to \c NO (the default) these classes will be included in the
various overviews. various overviews.
This option has no effect if \c EXTRACT_ALL is enabled.
\anchor cfg_brief_member_desc \anchor cfg_brief_member_desc
<dt>\c BRIEF_MEMBER_DESC <dd> <dt>\c BRIEF_MEMBER_DESC <dd>
...@@ -247,6 +261,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -247,6 +261,7 @@ followed by the descriptions of the tags grouped by category.
\anchor cfg_always_detailed_sec \anchor cfg_always_detailed_sec
<dt>\c ALWAYS_DETAILED_SEC <dd> <dt>\c ALWAYS_DETAILED_SEC <dd>
\addindex ALWAYS_DETAILED_SEC
If the \c ALWAYS_DETAILED_SEC and \c REPEAT_BRIEF tags are both set to \c YES then If the \c ALWAYS_DETAILED_SEC and \c REPEAT_BRIEF tags are both set to \c YES then
Doxygen will generate a detailed section even if there is only a brief Doxygen will generate a detailed section even if there is only a brief
description. description.
...@@ -822,13 +837,13 @@ EXTRA_PACKAGES = times ...@@ -822,13 +837,13 @@ EXTRA_PACKAGES = times
put in front of it. If left blank `man' will be used as the default path. put in front of it. If left blank `man' will be used as the default path.
A directory man3 will be created inside the directory specified by A directory man3 will be created inside the directory specified by
\c MAN_OUTPUT. \c MAN_OUTPUT.
</dl>
\anchor cfg_man_extension \anchor cfg_man_extension
<dt>\c MAN_EXTENSION <dd> <dt>\c MAN_EXTENSION <dd>
\addindex MAX_EXTENSION \addindex MAX_EXTENSION
The \c MAN_EXTENSION tag determines the extension that is added to The \c MAN_EXTENSION tag determines the extension that is added to
the generated man pages (default is the subroutine's section .3) the generated man pages (default is the subroutine's section .3)
</dl>
\subsection config_prepro Preprocessor related options \subsection config_prepro Preprocessor related options
\anchor cfg_enable_preprocessing \anchor cfg_enable_preprocessing
...@@ -964,6 +979,14 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre> ...@@ -964,6 +979,14 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
showing the direct and indirect include dependencies of the file with other showing the direct and indirect include dependencies of the file with other
documented files. documented files.
\anchor cfg_included_by_graph
<dt>\c INCLUDED_BY_GRAPH <dd>
\addindex INCLUDED_BY_GRAPH
If the \c ENABLE_PREPROCESSING, \c INCLUDED_BY_GRAPH, and \c HAVE_DOT tags are
set to \c YES then doxygen will generate a graph for each documented header
file showing the documented files that directly or indirectly include this
file.
\anchor cfg_graphical_hierarchy \anchor cfg_graphical_hierarchy
<dt>\c GRAPHICAL_HIERARCHY <dd> <dt>\c GRAPHICAL_HIERARCHY <dd>
\addindex GRAPHICAL_HIERATCHY \addindex GRAPHICAL_HIERATCHY
...@@ -976,6 +999,24 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre> ...@@ -976,6 +999,24 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
This tag can be used to specify the path where the dot tool can be found. 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. If left blank, it is assumed the dot tool can be found on the path.
\anchor cfg_max_dot_graph_height
<dt>\c MAX_DOT_GRAPH_HEIGHT <dd>
\addindex MAX_DOT_GRAPH_HEIGHT
The \c MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
(in pixels) of the graphs generated by dot. If a graph becomes larger than
this value, doxygen will try to truncate the graph, so that it fits within
the specified constraint. Beware that most browsers cannot cope with very
large images.
\anchor cfg_max_dot_graph_width
<dt>\c MAX_DOT_GRAPH_WIDTH <dd>
\addindex MAX_DOT_GRAPH_WIDTH
The \c MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
(in pixels) of the graphs generated by dot. If a graph becomes larger than
this value, doxygen will try to truncate the graph, so that it fits within
the specified constraint. Beware that most browsers cannot cope with very
large images.
</dl> </dl>
\subsection config_search Search engine options \subsection config_search Search engine options
\anchor cfg_searchengine \anchor cfg_searchengine
...@@ -1007,7 +1048,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre> ...@@ -1007,7 +1048,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
\addindex DOC_URL \addindex DOC_URL
The \c DOC_URL tag should be the absolute URL to the directory where the The \c DOC_URL tag should be the absolute URL to the directory where the
documentation is located. If left blank the absolute path to the documentation is located. If left blank the absolute path to the
documentation, with <tt>file://</tt> prepended to it, will be used. documentation, with \c file:// prepended to it, will be used.
This is correct for local viewing only. This is correct for local viewing only.
\anchor cfg_doc_abspath \anchor cfg_doc_abspath
......
Name: doxygen Name: doxygen
Version: 1.1.4 Version: 1.1.4-20000625
Summary: documentation system for C, C++ and IDL Summary: documentation system for C, C++ and IDL
Release: 1 Release: 1
Source0: doxygen-%{version}.src.tar.gz Source0: doxygen-%{version}.src.tar.gz
......
...@@ -566,23 +566,44 @@ void ClassDef::setIncludeFile(FileDef *fd,const char *incName,bool local) ...@@ -566,23 +566,44 @@ void ClassDef::setIncludeFile(FileDef *fd,const char *incName,bool local)
} }
} }
ArgumentList *ClassDef::outerTemplateArguments() const
{
int ti;
ClassDef *pcd=0;
int pi=0;
// find the outer most class scope
while ((ti=name().find("::",pi))!=-1 &&
(pcd=getClass(name().left(ti)))==0
) pi=ti+2;
if (pcd)
{
return pcd->templateArguments();
}
else
{
return tempArgs;
}
}
// write all documentation for this class // write all documentation for this class
void ClassDef::writeDocumentation(OutputList &ol) void ClassDef::writeDocumentation(OutputList &ol)
{ {
// write title // write title
QCString pageTitle=name().copy(); QCString pageTitle=name().copy();
QCString pageType; QCString pageType;
ArgumentList *outerTempArgList = outerTemplateArguments();
if (outerTempArgList) pageType+=" Template";
switch(compType) switch(compType)
{ {
case Class: pageType=" Class"; break; case Class: pageType+=" Class"; break;
case Struct: pageType=" Struct"; break; case Struct: pageType+=" Struct"; break;
case Union: pageType=" Union"; break; case Union: pageType+=" Union"; break;
default: pageType=" Interface"; break; default: pageType+=" Interface"; break;
} }
pageTitle+=pageType+" Reference"; pageTitle+=pageType+" Reference";
startFile(ol,fileName,pageTitle); startFile(ol,fileName,pageTitle);
startTitle(ol,getOutputFileBase()); startTitle(ol,getOutputFileBase());
parseText(ol,theTranslator->trCompoundReference(name(),compType)); parseText(ol,theTranslator->trCompoundReference(name(),compType,outerTempArgList!=0));
endTitle(ol,getOutputFileBase(),name()); endTitle(ol,getOutputFileBase(),name());
ol.startTextBlock(); ol.startTextBlock();
...@@ -868,24 +889,7 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -868,24 +889,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.endGroupHeader(); ol.endGroupHeader();
ol.startTextBlock(); ol.startTextBlock();
ArgumentList *al=0; ArgumentList *al=outerTempArgList;
int ti;
ClassDef *pcd=0;
int pi=0;
// find the outer most class scope
while ((ti=name().find("::",pi))!=-1 &&
(pcd=getClass(name().left(ti)))==0
) pi=ti+2;
if (pcd)
{
al=pcd->templateArguments();
}
else
{
al=tempArgs;
}
if (al) // class is a template if (al) // class is a template
{ {
ol.startSubsubsection(); ol.startSubsubsection();
...@@ -894,7 +898,11 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -894,7 +898,11 @@ void ClassDef::writeDocumentation(OutputList &ol)
while (a) while (a)
{ {
ol.docify(a->type); ol.docify(a->type);
ol.docify(a->name); if (!a->name.isEmpty())
{
ol.docify(" ");
ol.docify(a->name);
}
if (a->defval.length()!=0) if (a->defval.length()!=0)
{ {
ol.docify(" = "); ol.docify(" = ");
...@@ -1583,45 +1591,48 @@ void ClassDef::determineImplUsageRelation() ...@@ -1583,45 +1591,48 @@ void ClassDef::determineImplUsageRelation()
// name().data(),type.data(),md->name().data()); // name().data(),type.data(),md->name().data());
int p=0,i,l; int p=0,i,l;
bool found=FALSE; bool found=FALSE;
while ((i=re.match(type,p,&l))!=-1 && !found) // for each class name in the type if (typeLen>0)
{ {
int ts=i+l; while ((i=re.match(type,p,&l))!=-1 && !found) // for each class name in the type
int te=ts;
while (type.at(ts)==' ' && ts<typeLen) ts++; // skip any whitespace
if (type.at(ts)=='<') // assume template instance
{ {
// locate end of template int ts=i+l;
te=ts+1; int te=ts;
int brCount=1; while (type.at(ts)==' ' && ts<typeLen) ts++; // skip any whitespace
while (te<typeLen && brCount!=0) if (type.at(ts)=='<') // assume template instance
{ {
if (type.at(te)=='<') brCount++; // locate end of template
if (type.at(te)=='>') brCount--; te=ts+1;
te++; int brCount=1;
while (te<typeLen && brCount!=0)
{
if (type.at(te)=='<') brCount++;
if (type.at(te)=='>') brCount--;
te++;
}
} }
} QCString templSpec;
QCString templSpec; if (te>ts) templSpec = type.mid(ts,te-ts);
if (te>ts) templSpec = type.mid(ts,te-ts); ClassDef *cd=getResolvedClass(name()+"::"+type.mid(i,l));
ClassDef *cd=getResolvedClass(name()+"::"+type.mid(i,l)); if (cd==0) cd=getResolvedClass(type.mid(i,l)); // TODO: also try inbetween scopes!
if (cd==0) cd=getResolvedClass(type.mid(i,l)); // TODO: also try inbetween scopes! if (cd) // class exists
if (cd) // class exists
{
found=TRUE;
if (usesImplClassDict==0) usesImplClassDict = new UsesClassDict(257);
UsesClassDef *ucd=usesImplClassDict->find(cd->name());
if (ucd==0 || ucd->templSpecifiers!=templSpec)
{ {
ucd = new UsesClassDef(cd); found=TRUE;
usesImplClassDict->insert(cd->name(),ucd); if (usesImplClassDict==0) usesImplClassDict = new UsesClassDict(257);
ucd->templSpecifiers = templSpec; UsesClassDef *ucd=usesImplClassDict->find(cd->name());
//printf("Adding used class %s to class %s\n", if (ucd==0 || ucd->templSpecifiers!=templSpec)
// cd->name().data(),name().data()); {
ucd = new UsesClassDef(cd);
usesImplClassDict->insert(cd->name(),ucd);
ucd->templSpecifiers = templSpec;
//printf("Adding used class %s to class %s\n",
// cd->name().data(),name().data());
}
ucd->addAccessor(md->name());
//printf("Adding accessor %s to class %s\n",
// md->name().data(),ucd->classDef->name().data());
} }
ucd->addAccessor(md->name()); p=i+l;
//printf("Adding accessor %s to class %s\n",
// md->name().data(),ucd->classDef->name().data());
} }
p=i+l;
} }
} }
} }
......
...@@ -99,6 +99,7 @@ class ClassDef : public Definition ...@@ -99,6 +99,7 @@ class ClassDef : public Definition
// template argument functions // template argument functions
ArgumentList *templateArguments() const { return tempArgs; } ArgumentList *templateArguments() const { return tempArgs; }
ArgumentList *outerTemplateArguments() const;
void setTemplateArguments(ArgumentList *al); void setTemplateArguments(ArgumentList *al);
//QCString getTemplateNameString(); //QCString getTemplateNameString();
void setNamespace(NamespaceDef *nd) { nspace = nd; } void setNamespace(NamespaceDef *nd) { nspace = nd; }
......
...@@ -396,6 +396,7 @@ static bool getLink(const char *className, ...@@ -396,6 +396,7 @@ static bool getLink(const char *className,
static ClassDef *stripClassName(const char *s) static ClassDef *stripClassName(const char *s)
{ {
QCString tmp=s; QCString tmp=s;
if (tmp.isEmpty()) return 0;
static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*"); static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
int p=0,i,l; int p=0,i,l;
while ((i=re.match(tmp,p,&l))!=-1) while ((i=re.match(tmp,p,&l))!=-1)
...@@ -1131,10 +1132,10 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1131,10 +1132,10 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass(); endFontClass();
} }
} }
<*>\n({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n) { // remove one-line group marker <*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
if (Config::stripCommentsFlag) if (Config::stripCommentsFlag)
{ {
g_yyLineNr+=((QCString)yytext).contains('\n'); g_yyLineNr+=2;
g_code->endCodeLine(); g_code->endCodeLine();
if (g_yyLineNr<g_inputLines) if (g_yyLineNr<g_inputLines)
{ {
...@@ -1148,7 +1149,26 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1148,7 +1149,26 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass(); endFontClass();
} }
} }
<*>^{B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n { // remove one-line group marker <*>\n{B}*"/*@"[{}] { // remove one-line group marker
if (Config::stripCommentsFlag)
{
g_lastSpecialCContext = YY_START;
g_yyLineNr++;
BEGIN(RemoveSpecialCComment);
}
else
{
// check is to prevent getting stuck in skipping C++ comments
if (YY_START != SkipCxxComment)
{
g_lastCContext = YY_START ;
}
startFontClass("comment");
codifyLines(yytext);
BEGIN(SkipComment);
}
}
<*>^{B}*"//@"[{}].*\n { // remove one-line group marker
if (Config::stripCommentsFlag) if (Config::stripCommentsFlag)
{ {
g_yyLineNr++; g_yyLineNr++;
...@@ -1165,6 +1185,20 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1165,6 +1185,20 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass(); endFontClass();
} }
} }
<*>^{B}*"/*@"[{}] { // remove multi-line group marker
if (Config::stripCommentsFlag)
{
g_lastSpecialCContext = YY_START;
BEGIN(RemoveSpecialCComment);
}
else
{
g_lastCContext = YY_START ;
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
}
}
<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment <*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
if (Config::stripCommentsFlag) if (Config::stripCommentsFlag)
{ {
......
...@@ -36,8 +36,9 @@ struct Config ...@@ -36,8 +36,9 @@ struct Config
static QCString outputDir; // the global output directory static QCString outputDir; // the global output directory
static QCString outputLanguage; // the output language static QCString outputLanguage; // the output language
static bool noIndexFlag; // generate condensed index flag static bool noIndexFlag; // generate condensed index flag
static bool extractAllFlag; // gererate docs for all classes flag static bool extractAllFlag; // generate docs for all classes flag
static bool extractPrivateFlag; // generate docs for private members flag static bool extractPrivateFlag; // generate docs for private members flag
static bool extractStaticFlag; // generate docs for static members flag
static bool hideMemberFlag; // hide undocumented members. static bool hideMemberFlag; // hide undocumented members.
static bool hideClassFlag; // hide undocumented members. static bool hideClassFlag; // hide undocumented members.
static bool briefMemDescFlag; // enable `inline' brief member descr. static bool briefMemDescFlag; // enable `inline' brief member descr.
...@@ -112,8 +113,11 @@ struct Config ...@@ -112,8 +113,11 @@ struct Config
static bool classGraphFlag; // class graph static bool classGraphFlag; // class graph
static bool collGraphFlag; // collaboration graph static bool collGraphFlag; // collaboration graph
static bool includeGraphFlag; // include graph static bool includeGraphFlag; // include graph
static bool includedByGraphFlag; // depends on include graph
static bool gfxHierarchyFlag; // flag to enable graphical hierarchy static bool gfxHierarchyFlag; // flag to enable graphical hierarchy
static QCString dotPath; // path to the dot tool static QCString dotPath; // path to the dot tool
static int maxDotGraphWidth; // max dot graph width
static int maxDotGraphHeight; // max dot graph height
static bool searchEngineFlag; // generate search engine flag static bool searchEngineFlag; // generate search engine flag
static QCString cgiName; // the name of the CGI binary static QCString cgiName; // the name of the CGI binary
static QCString cgiURL; // the absolute URL to the CGI binary static QCString cgiURL; // the absolute URL to the CGI binary
......
...@@ -73,6 +73,7 @@ QCString Config::outputLanguage = "English"; ...@@ -73,6 +73,7 @@ QCString Config::outputLanguage = "English";
bool Config::noIndexFlag = FALSE; bool Config::noIndexFlag = FALSE;
bool Config::extractAllFlag = FALSE; bool Config::extractAllFlag = FALSE;
bool Config::extractPrivateFlag = FALSE; bool Config::extractPrivateFlag = FALSE;
bool Config::extractStaticFlag = FALSE;
bool Config::hideMemberFlag = FALSE; bool Config::hideMemberFlag = FALSE;
bool Config::hideClassFlag = FALSE; bool Config::hideClassFlag = FALSE;
bool Config::briefMemDescFlag = TRUE; bool Config::briefMemDescFlag = TRUE;
...@@ -126,7 +127,7 @@ QStrList Config::extraPackageList; ...@@ -126,7 +127,7 @@ QStrList Config::extraPackageList;
QCString Config::latexHeaderFile; QCString Config::latexHeaderFile;
bool Config::pdfHyperFlag = FALSE; bool Config::pdfHyperFlag = FALSE;
bool Config::latexBatchModeFlag = FALSE; bool Config::latexBatchModeFlag = FALSE;
bool Config::generateRTF = FALSE; bool Config::generateRTF = TRUE;
QCString Config::rtfOutputDir = "rtf"; QCString Config::rtfOutputDir = "rtf";
bool Config::compactRTFFlag = FALSE; bool Config::compactRTFFlag = FALSE;
bool Config::rtfHyperFlag = FALSE; bool Config::rtfHyperFlag = FALSE;
...@@ -147,8 +148,11 @@ bool Config::haveDotFlag = FALSE; ...@@ -147,8 +148,11 @@ bool Config::haveDotFlag = FALSE;
bool Config::classGraphFlag = TRUE; bool Config::classGraphFlag = TRUE;
bool Config::collGraphFlag = TRUE; bool Config::collGraphFlag = TRUE;
bool Config::includeGraphFlag = TRUE; bool Config::includeGraphFlag = TRUE;
bool Config::includedByGraphFlag = TRUE;
bool Config::gfxHierarchyFlag = TRUE; bool Config::gfxHierarchyFlag = TRUE;
QCString Config::dotPath; QCString Config::dotPath;
int Config::maxDotGraphWidth = 1024;
int Config::maxDotGraphHeight = 1024;
bool Config::searchEngineFlag = FALSE; bool Config::searchEngineFlag = FALSE;
QCString Config::cgiName = "search.cgi"; QCString Config::cgiName = "search.cgi";
QCString Config::cgiURL; QCString Config::cgiURL;
...@@ -175,6 +179,8 @@ static QCString elemStr; ...@@ -175,6 +179,8 @@ static QCString elemStr;
//static QCString colsInAlphaIndexString; //static QCString colsInAlphaIndexString;
static QCString tabSizeString; static QCString tabSizeString;
static QCString colsInAlphaIndexString; static QCString colsInAlphaIndexString;
static QCString maxDotGraphWidthString;
static QCString maxDotGraphHeightString;
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
*/ */
...@@ -215,6 +221,7 @@ static int yyread(char *buf,int max_size) ...@@ -215,6 +221,7 @@ static int yyread(char *buf,int max_size)
<Start>"DISABLE_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::noIndexFlag; } <Start>"DISABLE_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::noIndexFlag; }
<Start>"EXTRACT_ALL"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractAllFlag; } <Start>"EXTRACT_ALL"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractAllFlag; }
<Start>"EXTRACT_PRIVATE"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractPrivateFlag; } <Start>"EXTRACT_PRIVATE"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractPrivateFlag; }
<Start>"EXTRACT_STATIC"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractStaticFlag; }
<Start>"HIDE_UNDOC_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&Config::hideMemberFlag; } <Start>"HIDE_UNDOC_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&Config::hideMemberFlag; }
<Start>"HIDE_UNDOC_CLASSES"[ \t]*"=" { BEGIN(GetBool); b=&Config::hideClassFlag; } <Start>"HIDE_UNDOC_CLASSES"[ \t]*"=" { BEGIN(GetBool); b=&Config::hideClassFlag; }
<Start>"BRIEF_MEMBER_DESC"[ \t]*"=" { BEGIN(GetBool); b=&Config::briefMemDescFlag; } <Start>"BRIEF_MEMBER_DESC"[ \t]*"=" { BEGIN(GetBool); b=&Config::briefMemDescFlag; }
...@@ -289,8 +296,11 @@ static int yyread(char *buf,int max_size) ...@@ -289,8 +296,11 @@ static int yyread(char *buf,int max_size)
<Start>"CLASS_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::classGraphFlag; } <Start>"CLASS_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::classGraphFlag; }
<Start>"COLLABORATION_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::collGraphFlag; } <Start>"COLLABORATION_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::collGraphFlag; }
<Start>"INCLUDE_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::includeGraphFlag; } <Start>"INCLUDE_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::includeGraphFlag; }
<Start>"INCLUDED_BY_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::includedByGraphFlag; }
<Start>"GRAPHICAL_HIERARCHY"[ \t]*"=" { BEGIN(GetBool); b=&Config::gfxHierarchyFlag; } <Start>"GRAPHICAL_HIERARCHY"[ \t]*"=" { BEGIN(GetBool); b=&Config::gfxHierarchyFlag; }
<Start>"DOT_PATH"[ \t]*"=" { BEGIN(GetString); s=&Config::dotPath; s->resize(0); } <Start>"DOT_PATH"[ \t]*"=" { BEGIN(GetString); s=&Config::dotPath; s->resize(0); }
<Start>"MAX_DOT_GRAPH_WIDTH"[ \t]*"=" { BEGIN(GetString); s=&maxDotGraphWidthString; s->resize(0); }
<Start>"MAX_DOT_GRAPH_HEIGHT"[ \t]*"=" { BEGIN(GetString); s=&maxDotGraphHeightString; s->resize(0); }
<Start>"SEARCHENGINE"[ \t]*"=" { BEGIN(GetBool); b=&Config::searchEngineFlag; } <Start>"SEARCHENGINE"[ \t]*"=" { BEGIN(GetBool); b=&Config::searchEngineFlag; }
<Start>"CGI_NAME"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiName; s->resize(0); } <Start>"CGI_NAME"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiName; s->resize(0); }
<Start>"CGI_URL"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiURL; s->resize(0); } <Start>"CGI_URL"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiURL; s->resize(0); }
...@@ -395,6 +405,7 @@ void dumpConfig() ...@@ -395,6 +405,7 @@ void dumpConfig()
printf("noIndexFlag=`%d'\n",Config::noIndexFlag); printf("noIndexFlag=`%d'\n",Config::noIndexFlag);
printf("extractAllFlag=`%d'\n",Config::extractAllFlag); printf("extractAllFlag=`%d'\n",Config::extractAllFlag);
printf("extractPrivateFlag=`%d'\n",Config::extractPrivateFlag); printf("extractPrivateFlag=`%d'\n",Config::extractPrivateFlag);
printf("extractStaticFlag=`%d'\n",Config::extractStaticFlag);
printf("hideMemberFlag=`%d'\n",Config::hideMemberFlag); printf("hideMemberFlag=`%d'\n",Config::hideMemberFlag);
printf("hideClassFlag=`%d'\n",Config::hideClassFlag); printf("hideClassFlag=`%d'\n",Config::hideClassFlag);
printf("briefMemDescFlag=`%d'\n",Config::briefMemDescFlag); printf("briefMemDescFlag=`%d'\n",Config::briefMemDescFlag);
...@@ -577,8 +588,11 @@ void dumpConfig() ...@@ -577,8 +588,11 @@ void dumpConfig()
printf("classGraphFlag=`%d'\n",Config::classGraphFlag); printf("classGraphFlag=`%d'\n",Config::classGraphFlag);
printf("collGraphFlag=`%d'\n",Config::collGraphFlag); printf("collGraphFlag=`%d'\n",Config::collGraphFlag);
printf("includeGraphFlag=`%d'\n",Config::includeGraphFlag); printf("includeGraphFlag=`%d'\n",Config::includeGraphFlag);
printf("includedByGraphFlag=`%d'\n",Config::includedByGraphFlag);
printf("gfxHierarchyFlag=`%d'\n",Config::gfxHierarchyFlag); printf("gfxHierarchyFlag=`%d'\n",Config::gfxHierarchyFlag);
printf("dotPath=`%s'\n",Config::dotPath.data()); printf("dotPath=`%s'\n",Config::dotPath.data());
printf("maxDotGraphWidth=`%d'\n",Config::maxDotGraphWidth);
printf("maxDotGraphHeight=`%d'\n",Config::maxDotGraphHeight);
printf("# Configuration::addtions related to the search engine \n"); printf("# Configuration::addtions related to the search engine \n");
printf("searchEngineFlag=`%d'\n",Config::searchEngineFlag); printf("searchEngineFlag=`%d'\n",Config::searchEngineFlag);
printf("cgiName=`%s'\n",Config::cgiName.data()); printf("cgiName=`%s'\n",Config::cgiName.data());
...@@ -605,6 +619,7 @@ void Config::init() ...@@ -605,6 +619,7 @@ void Config::init()
Config::noIndexFlag = FALSE; Config::noIndexFlag = FALSE;
Config::extractAllFlag = FALSE; Config::extractAllFlag = FALSE;
Config::extractPrivateFlag = FALSE; Config::extractPrivateFlag = FALSE;
Config::extractStaticFlag = FALSE;
Config::hideMemberFlag = FALSE; Config::hideMemberFlag = FALSE;
Config::hideClassFlag = FALSE; Config::hideClassFlag = FALSE;
Config::briefMemDescFlag = TRUE; Config::briefMemDescFlag = TRUE;
...@@ -658,7 +673,7 @@ void Config::init() ...@@ -658,7 +673,7 @@ void Config::init()
Config::latexHeaderFile.resize(0); Config::latexHeaderFile.resize(0);
Config::pdfHyperFlag = FALSE; Config::pdfHyperFlag = FALSE;
Config::latexBatchModeFlag = FALSE; Config::latexBatchModeFlag = FALSE;
Config::generateRTF = FALSE; Config::generateRTF = TRUE;
Config::rtfOutputDir = "rtf"; Config::rtfOutputDir = "rtf";
Config::compactRTFFlag = FALSE; Config::compactRTFFlag = FALSE;
Config::rtfHyperFlag = FALSE; Config::rtfHyperFlag = FALSE;
...@@ -679,8 +694,11 @@ void Config::init() ...@@ -679,8 +694,11 @@ void Config::init()
Config::classGraphFlag = TRUE; Config::classGraphFlag = TRUE;
Config::collGraphFlag = TRUE; Config::collGraphFlag = TRUE;
Config::includeGraphFlag = TRUE; Config::includeGraphFlag = TRUE;
Config::includedByGraphFlag = TRUE;
Config::gfxHierarchyFlag = TRUE; Config::gfxHierarchyFlag = TRUE;
Config::dotPath.resize(0); Config::dotPath.resize(0);
Config::maxDotGraphWidth = 1024;
Config::maxDotGraphHeight = 1024;
Config::searchEngineFlag = FALSE; Config::searchEngineFlag = FALSE;
Config::cgiName = "search.cgi"; Config::cgiName = "search.cgi";
Config::cgiURL.resize(0); Config::cgiURL.resize(0);
...@@ -818,8 +836,10 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -818,8 +836,10 @@ void writeTemplateConfig(QFile *f,bool sl)
if (!sl) if (!sl)
{ {
t << "\n"; t << "\n";
t << "# If the EXTRACT_ALL tag is set to YES all classes and functions will be \n"; t << "# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n";
t << "# included in the documentation, even if no documentation was available. \n"; t << "# documentation are documented, even if no documentation was available. \n";
t << "# Private class members and static file members will be hidden unless \n";
t << "# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES \n";
t << "\n"; t << "\n";
} }
t << "EXTRACT_ALL = "; t << "EXTRACT_ALL = ";
...@@ -836,10 +856,23 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -836,10 +856,23 @@ void writeTemplateConfig(QFile *f,bool sl)
writeBoolValue(t,Config::extractPrivateFlag); writeBoolValue(t,Config::extractPrivateFlag);
t << "\n"; t << "\n";
if (!sl) if (!sl)
{
t << "\n";
t << "# If the EXTRACT_STATIC tag is set to YES all static members of a file \n";
t << "# will be included in the documentation. \n";
t << "\n";
}
t << "EXTRACT_STATIC = ";
writeBoolValue(t,Config::extractStaticFlag);
t << "\n";
if (!sl)
{ {
t << "\n"; t << "\n";
t << "# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"; t << "# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n";
t << "# undocumented members inside documented classes or files. \n"; t << "# undocumented members of documented classes, files or namespaces. \n";
t << "# If set to NO (the default) these members will be included in the \n";
t << "# various overviews, but no documentation section is generated. \n";
t << "# This option has no effect if EXTRACT_ALL is enabled. \n";
t << "\n"; t << "\n";
} }
t << "HIDE_UNDOC_MEMBERS = "; t << "HIDE_UNDOC_MEMBERS = ";
...@@ -849,7 +882,9 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -849,7 +882,9 @@ void writeTemplateConfig(QFile *f,bool sl)
{ {
t << "\n"; t << "\n";
t << "# If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all \n"; t << "# If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all \n";
t << "# undocumented classes. \n"; t << "# undocumented classes that are normally visible in the class hierarchy. \n";
t << "# If set to NO (the default) these class will be included in the various \n";
t << "# overviews. This option has no effect if EXTRACT_ALL is enabled. \n";
t << "\n"; t << "\n";
} }
t << "HIDE_UNDOC_CLASSES = "; t << "HIDE_UNDOC_CLASSES = ";
...@@ -1733,6 +1768,17 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -1733,6 +1768,17 @@ void writeTemplateConfig(QFile *f,bool sl)
writeBoolValue(t,Config::includeGraphFlag); writeBoolValue(t,Config::includeGraphFlag);
t << "\n"; t << "\n";
if (!sl) if (!sl)
{
t << "\n";
t << "# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to \n";
t << "# YES then doxygen will generate a graph for each documented header file showing \n";
t << "# the documented files that directly or indirectly include this file \n";
t << "\n";
}
t << "INCLUDED_BY_GRAPH = ";
writeBoolValue(t,Config::includedByGraphFlag);
t << "\n";
if (!sl)
{ {
t << "\n"; t << "\n";
t << "# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n"; t << "# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n";
...@@ -1745,14 +1791,40 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -1745,14 +1791,40 @@ void writeTemplateConfig(QFile *f,bool sl)
if (!sl) if (!sl)
{ {
t << "\n"; t << "\n";
t << "# This tag can be used to specify the path where the dot tool can be found. \n"; t << "# The tag DOT_PATH can be used to specify the path where the dot tool can be \n";
t << "# If left blank, it is assumed the dot tool can be found on the path. \n"; t << "# found. If left blank, it is assumed the dot tool can be found on the path. \n";
t << "\n"; t << "\n";
} }
t << "DOT_PATH = "; t << "DOT_PATH = ";
writeStringValue(t,Config::dotPath); writeStringValue(t,Config::dotPath);
t << "\n"; t << "\n";
if (!sl) if (!sl)
{
t << "\n";
t << "# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width \n";
t << "# (in pixels) of the graphs generated by dot. If a graph becomes larger than \n";
t << "# this value, doxygen will try to truncate the graph, so that it fits within \n";
t << "# the specified constraint. Beware that most browsers cannot cope with very \n";
t << "# large images. \n";
t << "\n";
}
t << "MAX_DOT_GRAPH_WIDTH = ";
writeIntValue(t,Config::maxDotGraphWidth);
t << "\n";
if (!sl)
{
t << "\n";
t << "# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height \n";
t << "# (in pixels) of the graphs generated by dot. If a graph becomes larger than \n";
t << "# this value, doxygen will try to truncate the graph, so that it fits within \n";
t << "# the specified constraint. Beware that most browsers cannot cope with very \n";
t << "# large images. \n";
t << "\n";
}
t << "MAX_DOT_GRAPH_HEIGHT = ";
writeIntValue(t,Config::maxDotGraphHeight);
t << "\n";
if (!sl)
{ {
t << "\n"; t << "\n";
} }
......
...@@ -30,11 +30,8 @@ ...@@ -30,11 +30,8 @@
//-------------------------------------------------------------------- //--------------------------------------------------------------------
const int maxImageWidth=1024;
const int maxImageHeight=1024;
/*! mapping from protection levels to color names */ /*! mapping from protection levels to color names */
static char *edgeColorMap[] = static const char *edgeColorMap[] =
{ {
"midnightblue", // Public "midnightblue", // Public
"darkgreen", // Protected "darkgreen", // Protected
...@@ -43,7 +40,7 @@ static char *edgeColorMap[] = ...@@ -43,7 +40,7 @@ static char *edgeColorMap[] =
"grey" // Undocumented "grey" // Undocumented
}; };
static char *edgeStyleMap[] = static const char *edgeStyleMap[] =
{ {
"solid", // inheritance "solid", // inheritance
"dashed" // usage "dashed" // usage
...@@ -364,7 +361,8 @@ void DotNode::write(QTextStream &t, ...@@ -364,7 +361,8 @@ void DotNode::write(QTextStream &t,
GraphOutputFormat format, GraphOutputFormat format,
bool topDown, bool topDown,
bool toChildren, bool toChildren,
int distance int distance,
bool backArrows
) )
{ {
//printf("DotNode::write(%d) name=%s\n",distance,m_label.data()); //printf("DotNode::write(%d) name=%s\n",distance,m_label.data());
...@@ -394,9 +392,9 @@ void DotNode::write(QTextStream &t, ...@@ -394,9 +392,9 @@ void DotNode::write(QTextStream &t,
{ {
if (cn->m_distance<=distance) if (cn->m_distance<=distance)
{ {
writeArrow(t,format,cn,dnli2.current(),topDown); writeArrow(t,format,cn,dnli2.current(),topDown,backArrows);
} }
cn->write(t,format,topDown,toChildren,distance); cn->write(t,format,topDown,toChildren,distance,backArrows);
} }
} }
else // render parents else // render parents
...@@ -411,10 +409,11 @@ void DotNode::write(QTextStream &t, ...@@ -411,10 +409,11 @@ void DotNode::write(QTextStream &t,
format, format,
pn, pn,
pn->m_edgeInfo->at(pn->m_children->findRef(this)), pn->m_edgeInfo->at(pn->m_children->findRef(this)),
FALSE FALSE,
backArrows
); );
} }
pn->write(t,format,TRUE,FALSE,distance); pn->write(t,format,TRUE,FALSE,distance,backArrows);
} }
} }
} }
...@@ -915,11 +914,12 @@ void writeDotGraph(DotNode *root, ...@@ -915,11 +914,12 @@ void writeDotGraph(DotNode *root,
const QCString &baseName, const QCString &baseName,
bool lrRank, bool lrRank,
bool renderParents, bool renderParents,
int distance int distance,
bool backArrows
) )
{ {
// generate the graph description for dot // generate the graph description for dot
//printf("writeDotGraph(%s,%d)\n",baseName.data(),renderParents); //printf("writeDotGraph(%s,%d)\n",baseName.data(),backArrows);
QFile f; QFile f;
f.setName(baseName+".dot"); f.setName(baseName+".dot");
if (f.open(IO_WriteOnly)) if (f.open(IO_WriteOnly))
...@@ -932,7 +932,7 @@ void writeDotGraph(DotNode *root, ...@@ -932,7 +932,7 @@ void writeDotGraph(DotNode *root,
t << " rankdir=LR;" << endl; t << " rankdir=LR;" << endl;
} }
root->clearWriteFlag(); root->clearWriteFlag();
root->write(t,format,TRUE,TRUE,distance); root->write(t,format,TRUE,TRUE,distance,backArrows);
if (renderParents && root->m_parents) if (renderParents && root->m_parents)
{ {
//printf("rendering parents!\n"); //printf("rendering parents!\n");
...@@ -946,10 +946,11 @@ void writeDotGraph(DotNode *root, ...@@ -946,10 +946,11 @@ void writeDotGraph(DotNode *root,
format, format,
pn, pn,
pn->m_edgeInfo->at(pn->m_children->findRef(root)), pn->m_edgeInfo->at(pn->m_children->findRef(root)),
FALSE FALSE,
backArrows
); );
} }
pn->write(t,format,TRUE,FALSE,distance); pn->write(t,format,TRUE,FALSE,distance,backArrows);
} }
} }
t << "}" << endl; t << "}" << endl;
...@@ -963,7 +964,8 @@ static void findMaximalDotGraph(DotNode *root, ...@@ -963,7 +964,8 @@ static void findMaximalDotGraph(DotNode *root,
QDir &thisDir, QDir &thisDir,
GraphOutputFormat format, GraphOutputFormat format,
bool lrRank=FALSE, bool lrRank=FALSE,
bool renderParents=FALSE bool renderParents=FALSE,
bool backArrows=TRUE
) )
{ {
bool lastFit; bool lastFit;
...@@ -974,10 +976,11 @@ static void findMaximalDotGraph(DotNode *root, ...@@ -974,10 +976,11 @@ static void findMaximalDotGraph(DotNode *root,
int height=0; int height=0;
// binary search for the maximal inheritance depth that fits in a reasonable // binary search for the maximal inheritance depth that fits in a reasonable
// sized image (dimensions: maxImageWidth, maxImageHeight) // sized image (dimensions: Config::maxDotGraphWidth, Config::maxDotGraphHeight)
do do
{ {
writeDotGraph(root,format,baseName,lrRank,renderParents,curDistance); writeDotGraph(root,format,baseName,lrRank,renderParents,
curDistance,backArrows);
QCString dotCmd(4096); QCString dotCmd(4096);
// create annotated dot file // create annotated dot file
...@@ -995,7 +998,7 @@ static void findMaximalDotGraph(DotNode *root, ...@@ -995,7 +998,7 @@ static void findMaximalDotGraph(DotNode *root,
height = height*96/72; // 96 pixels/inch, 72 points/inch height = height*96/72; // 96 pixels/inch, 72 points/inch
//printf("Found bounding box (%d,%d)\n",width,height); //printf("Found bounding box (%d,%d)\n",width,height);
lastFit=(width<maxImageWidth && height<maxImageHeight); lastFit=(width<Config::maxDotGraphWidth && height<Config::maxDotGraphHeight);
if (lastFit) // image is small enough if (lastFit) // image is small enough
{ {
minDistance=curDistance; minDistance=curDistance;
...@@ -1020,9 +1023,10 @@ static void findMaximalDotGraph(DotNode *root, ...@@ -1020,9 +1023,10 @@ static void findMaximalDotGraph(DotNode *root,
writeDotGraph(root, writeDotGraph(root,
format, format,
baseName, baseName,
lrRank || (curDistance==1 && width>maxImageWidth), lrRank || (curDistance==1 && width>Config::maxDotGraphWidth),
renderParents, renderParents,
minDistance minDistance,
backArrows
); );
} }
} }
...@@ -1131,7 +1135,8 @@ int DotInclDepGraph::m_curNodeNumber; ...@@ -1131,7 +1135,8 @@ int DotInclDepGraph::m_curNodeNumber;
void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance) void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
{ {
QList<IncludeInfo> *includeFiles = fd->includeFileList(); QList<IncludeInfo> *includeFiles =
m_inverse ? fd->includedByFileList() : fd->includeFileList();
QListIterator<IncludeInfo> ili(*includeFiles); QListIterator<IncludeInfo> ili(*includeFiles);
IncludeInfo *ii; IncludeInfo *ii;
for (;(ii=ili.current());++ili) for (;(ii=ili.current());++ili)
...@@ -1178,9 +1183,10 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance) ...@@ -1178,9 +1183,10 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
} }
} }
DotInclDepGraph::DotInclDepGraph(FileDef *fd) DotInclDepGraph::DotInclDepGraph(FileDef *fd,bool inverse)
{ {
m_maxDistance = 0; m_maxDistance = 0;
m_inverse = inverse;
ASSERT(fd!=0); ASSERT(fd!=0);
m_diskName = fd->getOutputFileBase().copy(); m_diskName = fd->getOutputFileBase().copy();
m_startNode = new DotNode(m_curNodeNumber++, m_startNode = new DotNode(m_curNodeNumber++,
...@@ -1221,9 +1227,14 @@ void DotInclDepGraph::writeGraph(QTextStream &out, ...@@ -1221,9 +1227,14 @@ void DotInclDepGraph::writeGraph(QTextStream &out,
QDir::setCurrent(d.absPath()); QDir::setCurrent(d.absPath());
QDir thisDir; QDir thisDir;
QCString baseName=m_diskName+"_incldep"; QCString baseName=m_diskName;
if (m_inverse) baseName+="_dep";
baseName+="_incl";
QCString mapName=m_startNode->m_label.copy();
if (m_inverse) mapName+="dep";
findMaximalDotGraph(m_startNode,m_maxDistance,baseName,thisDir,format); findMaximalDotGraph(m_startNode,m_maxDistance,baseName,thisDir,format,
FALSE,FALSE,!m_inverse);
if (format==GIF) if (format==GIF)
{ {
...@@ -1247,8 +1258,8 @@ void DotInclDepGraph::writeGraph(QTextStream &out, ...@@ -1247,8 +1258,8 @@ void DotInclDepGraph::writeGraph(QTextStream &out,
} }
out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#" out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#"
<< m_startNode->m_label << "_map\"></center>" << endl; << mapName << "_map\"></center>" << endl;
out << "<map name=\"" << m_startNode->m_label << "_map\">" << endl; out << "<map name=\"" << mapName << "_map\">" << endl;
convertMapFile(out,baseName+".map"); convertMapFile(out,baseName+".map");
out << "</map><p>" << endl; out << "</map><p>" << endl;
thisDir.remove(baseName+".map"); thisDir.remove(baseName+".map");
...@@ -1257,7 +1268,6 @@ void DotInclDepGraph::writeGraph(QTextStream &out, ...@@ -1257,7 +1268,6 @@ void DotInclDepGraph::writeGraph(QTextStream &out,
{ {
// run dot to create a .eps image // run dot to create a .eps image
QCString dotCmd; QCString dotCmd;
dotCmd.sprintf("%sdot -Tps \"%s.dot\" -o \"%s.eps\"", dotCmd.sprintf("%sdot -Tps \"%s.dot\" -o \"%s.eps\"",
Config::dotPath.data(),baseName.data(),baseName.data()); Config::dotPath.data(),baseName.data(),baseName.data());
if (system(dotCmd)!=0) if (system(dotCmd)!=0)
......
...@@ -52,7 +52,9 @@ class DotNode ...@@ -52,7 +52,9 @@ class DotNode
const QCString &baseName, const QCString &baseName,
bool lrRank, bool lrRank,
bool renderParents, bool renderParents,
int distance); int distance,
bool backArrow
);
public: public:
DotNode(int n,const char *lab,const char *url,int distance = 0,bool rootNode=FALSE); DotNode(int n,const char *lab,const char *url,int distance = 0,bool rootNode=FALSE);
~DotNode(); ~DotNode();
...@@ -70,7 +72,7 @@ class DotNode ...@@ -70,7 +72,7 @@ class DotNode
void removeParent(DotNode *n); void removeParent(DotNode *n);
int number() const { return m_number; } int number() const { return m_number; }
void write(QTextStream &t,GraphOutputFormat f,bool topDown,bool toChildren, void write(QTextStream &t,GraphOutputFormat f,bool topDown,bool toChildren,
int maxDistance=1000); int maxDistance=1000,bool backArrows=TRUE);
int m_subgraphId; int m_subgraphId;
void clearWriteFlag(); void clearWriteFlag();
...@@ -137,7 +139,7 @@ class DotClassGraph ...@@ -137,7 +139,7 @@ class DotClassGraph
class DotInclDepGraph class DotInclDepGraph
{ {
public: public:
DotInclDepGraph(FileDef *fd); DotInclDepGraph(FileDef *fd,bool inverse=FALSE);
~DotInclDepGraph(); ~DotInclDepGraph();
void writeGraph(QTextStream &t, GraphOutputFormat f,const char *path); void writeGraph(QTextStream &t, GraphOutputFormat f,const char *path);
bool isTrivial() const; bool isTrivial() const;
...@@ -150,4 +152,5 @@ class DotInclDepGraph ...@@ -150,4 +152,5 @@ class DotInclDepGraph
static int m_curNodeNumber; static int m_curNodeNumber;
QCString m_diskName; QCString m_diskName;
int m_maxDistance; int m_maxDistance;
bool m_inverse;
}; };
...@@ -1165,10 +1165,9 @@ void buildVarList(Entry *root) ...@@ -1165,10 +1165,9 @@ void buildVarList(Entry *root)
root->type=root->name; root->type=root->name;
QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*"); QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*");
int l; int l;
i=re.match(root->args,0,&l); i=root->args.isEmpty() ? -1 : re.match(root->args,0,&l);
root->name=root->args.mid(i,l); root->name=root->args.mid(i,l);
root->args=root->args.mid(i+l, root->args=root->args.mid(i+l,root->args.find(')',i+l)-i-l);
root->args.find(')',i+l)-i-l);
//printf("new: type=`%s' name=`%s' args=`%s'\n", //printf("new: type=`%s' name=`%s' args=`%s'\n",
// root->type.data(),root->name.data(),root->args.data()); // root->type.data(),root->name.data(),root->args.data());
} }
...@@ -1350,7 +1349,7 @@ static void buildMemberList(Entry *root) ...@@ -1350,7 +1349,7 @@ static void buildMemberList(Entry *root)
) )
{ {
int l; int l;
if ((i=re.match(root->type,0,&l))!=-1) // function variable if (!root->type.isEmpty() && (i=re.match(root->type,0,&l))!=-1) // function variable
{ {
root->args+=root->type.right(root->type.length()-i-l); root->args+=root->type.right(root->type.length()-i-l);
root->type=root->type.left(i+l); root->type=root->type.left(i+l);
...@@ -1882,8 +1881,14 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, ...@@ -1882,8 +1881,14 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
int typeLen = baseClassName.length(); int typeLen = baseClassName.length();
while (e<typeLen && brCount!=0) while (e<typeLen && brCount!=0)
{ {
if (baseClassName.at(e)=='<') brCount++; if (baseClassName.at(e)=='<')
if (baseClassName.at(e)=='>') brCount--; {
if (e<typeLen-1 && baseClassName.at(e+1)=='<') e++; else brCount++;
}
if (baseClassName.at(e)=='>')
{
if (e<typeLen-1 && baseClassName.at(e+1)=='>') e++; else brCount--;
}
e++; e++;
} }
if (brCount==0) // end of template was found at e if (brCount==0) // end of template was found at e
...@@ -2185,6 +2190,8 @@ static void addMemberDocs(Entry *root, ...@@ -2185,6 +2190,8 @@ static void addMemberDocs(Entry *root,
FileDef *fd=findFileDef(inputNameDict,root->fileName,ambig); FileDef *fd=findFileDef(inputNameDict,root->fileName,ambig);
md->setBodyDef(fd); md->setBodyDef(fd);
} }
} }
//md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
//md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
...@@ -2192,6 +2199,7 @@ static void addMemberDocs(Entry *root, ...@@ -2192,6 +2199,7 @@ static void addMemberDocs(Entry *root,
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
addMemberToGroups(root,md); addMemberToGroups(root,md);
if (cd) cd->insertUsedFile(root->fileName); if (cd) cd->insertUsedFile(root->fileName);
//printf("root->mGrpId=%d\n",root->mGrpId);
if (root->mGrpId!=-1) if (root->mGrpId!=-1)
{ {
if (md->getMemberGroupId()!=-1) if (md->getMemberGroupId()!=-1)
...@@ -2208,23 +2216,9 @@ static void addMemberDocs(Entry *root, ...@@ -2208,23 +2216,9 @@ static void addMemberDocs(Entry *root,
} }
else // set group id else // set group id
{ {
//printf("setMemberGroupId=%d md=%s\n",root->mGrpId,md->name().data());
md->setMemberGroupId(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);
// }
// }
//}
} }
} }
...@@ -2419,24 +2413,26 @@ static void substituteTemplateArgNames(ArgumentList *src, ...@@ -2419,24 +2413,26 @@ static void substituteTemplateArgNames(ArgumentList *src,
bool isReplaced=FALSE; bool isReplaced=FALSE;
QRegExp re(idMask); QRegExp re(idMask);
int i,p=0,l,c=0; int i,p=0,l,c=0;
while ((i=re.match(s,p,&l))!=-1) // for each template name found at the while (!s.isEmpty() && (i=re.match(s,p,&l))!=-1) // for each template name found at the
// member definition // member definition
{ {
Argument *ta = c<(int)tempArgs->count() ? tempArgs->at(c) : 0; Argument *ta = c<(int)tempArgs->count() ? tempArgs->at(c) : 0;
if (ta) // get matching template argument of the class if (ta) // get matching template argument of the class
{ {
QCString dstName=s.mid(i,l); QCString dstName=s.mid(i,l);
QCString srcName=ta->type.copy(); QCString srcName=ta->name.copy();
if (srcName.isEmpty()) srcName=ta->type.copy();
//printf("1.Template Name = `%s' -> `%s'\n",srcName.data(),dstName.data());
int bi; int bi;
if ((bi=srcName.findRev(' '))!=-1) // search for separator if ((bi=srcName.findRev(' '))!=-1) // search for separator
{ {
// strip the type specifier (usuall class or typename) // strip the type specifier (usually class or typename)
srcName=srcName.right(srcName.length()-bi-1); srcName=srcName.right(srcName.length()-bi-1);
} }
//if (srcName.left(6)=="class ") srcName=srcName.right(srcName.length()-6); //if (srcName.left(6)=="class ") srcName=srcName.right(srcName.length()-6);
//if (srcName.left(9)=="typename ") srcName=srcName.right(srcName.length()-9); //if (srcName.left(9)=="typename ") srcName=srcName.right(srcName.length()-9);
//printf("Template Name = `%s' -> `%s'\n",srcName.data(),dstName.data()); //printf("2.Template Name = `%s' -> `%s'\n",srcName.data(),dstName.data());
if (srcName!=dstName) /* we need to substitute */ if (srcName!=dstName) /* we need to substitute */
{ {
int ti,tp=0; int ti,tp=0;
...@@ -2478,7 +2474,7 @@ static void substituteTemplateArgNames(ArgumentList *src, ...@@ -2478,7 +2474,7 @@ static void substituteTemplateArgNames(ArgumentList *src,
} }
dst->append(na); dst->append(na);
} }
//printf("substituteTemplateArgNames(src=`%s',tempNameStr=`%s',tempArgs=`%s',dest=`%s')\n", //printf("substituteTemplateArgNames(\nsrc=`%s',\ntempNameStr=`%s',\ntempArgs=`%s',\ndest=`%s'\n)\n",
// argListToString(src).data(), // argListToString(src).data(),
// s.data(), // s.data(),
// argListToString(tempArgs).data(), // argListToString(tempArgs).data(),
...@@ -3210,14 +3206,14 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl ...@@ -3210,14 +3206,14 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
static void findMemberDocumentation(Entry *root) static void findMemberDocumentation(Entry *root)
{ {
int i,l; int i=-1,l;
QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*"); QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*");
Debug::print(Debug::FindMembers,0, Debug::print(Debug::FindMembers,0,
"root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->memSpec=%d\n", "root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->memSpec=%d root->mGrpId=%d\n",
root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->memSpec root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->memSpec,root->mGrpId
); );
bool isFunc=TRUE; bool isFunc=TRUE;
if ((i=re.match(root->type,0,&l))!=-1) // func variable/typedef to func ptr if (!root->type.isEmpty() && (i=re.match(root->type,0,&l))!=-1) // func variable/typedef to func ptr
{ {
root->args+=root->type.right(root->type.length()-i-l); root->args+=root->type.right(root->type.length()-i-l);
root->type=root->type.left(i+l); root->type=root->type.left(i+l);
...@@ -3249,14 +3245,13 @@ static void findMemberDocumentation(Entry *root) ...@@ -3249,14 +3245,13 @@ static void findMemberDocumentation(Entry *root)
else if else if
((root->section==Entry::FUNCTION_SEC // function ((root->section==Entry::FUNCTION_SEC // function
|| ||
(root->section==Entry::VARIABLE_SEC && (root->section==Entry::VARIABLE_SEC && // variable
!root->type.isEmpty() && root->type.left(8)!="typedef " && !root->type.isEmpty() && root->type.left(8)!="typedef " &&
compoundKeywordDict.find(root->type)==0 compoundKeywordDict.find(root->type)==0
) )
) && ) &&
(!root->doc.isEmpty() || !root->brief.isEmpty() || (!root->doc.isEmpty() || !root->brief.isEmpty() || root->bodyLine!=-1 ||
root->bodyLine!=-1 (root->memSpec&Entry::Inline) || root->mGrpId!=-1
|| (root->memSpec&Entry::Inline)
) )
) )
{ {
...@@ -3386,7 +3381,14 @@ static void findEnums(Entry *root) ...@@ -3386,7 +3381,14 @@ static void findEnums(Entry *root)
//} //}
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{ {
md->setDefinition(nd->name()+"::"+name); if (Config::hideScopeNames)
{
md->setDefinition(name);
}
else
{
md->setDefinition(nd->name()+"::"+name);
}
nd->insertMember(md); nd->insertMember(md);
md->setNamespace(nd); md->setNamespace(nd);
} }
...@@ -3397,7 +3399,14 @@ static void findEnums(Entry *root) ...@@ -3397,7 +3399,14 @@ static void findEnums(Entry *root)
} }
else if (cd) else if (cd)
{ {
md->setDefinition(cd->name()+"::"+name); if (Config::hideScopeNames)
{
md->setDefinition(name);
}
else
{
md->setDefinition(cd->name()+"::"+name);
}
cd->insertMember(md); cd->insertMember(md);
cd->insertUsedFile(root->fileName); cd->insertUsedFile(root->fileName);
} }
...@@ -3538,7 +3547,6 @@ static void findEnumDocumentation(Entry *root) ...@@ -3538,7 +3547,6 @@ static void findEnumDocumentation(Entry *root)
if (root->mGrpId!=-1 && md->getMemberGroupId()==-1) if (root->mGrpId!=-1 && md->getMemberGroupId()==-1)
{ {
//cd->addMemberToGroup(md,root->mGrpId);
md->setMemberGroupId(root->mGrpId); md->setMemberGroupId(root->mGrpId);
} }
...@@ -3562,6 +3570,7 @@ static void findEnumDocumentation(Entry *root) ...@@ -3562,6 +3570,7 @@ static void findEnumDocumentation(Entry *root)
md->setDocumentation(root->doc); md->setDocumentation(root->doc);
md->setBriefDescription(root->brief); md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
md->setMemberGroupId(root->mGrpId);
found=TRUE; found=TRUE;
} }
} }
...@@ -3853,7 +3862,8 @@ static void addSourceReferences() ...@@ -3853,7 +3862,8 @@ static void addSourceReferences()
{ {
//printf("Found member `%s' in file `%s' at line `%d'\n", //printf("Found member `%s' in file `%s' at line `%d'\n",
// md->name().data(),fd->name().data(),md->getStartBodyLine()); // md->name().data(),fd->name().data(),md->getStartBodyLine());
Definition *d=gd ? gd : (nd ? nd : fd); Definition *d=gd!=0 ? (Definition *)gd :
(nd!=0 ? (Definition *)nd : (Definition *)fd);
fd->addSourceRef(md->getStartBodyLine(),d,md); fd->addSourceRef(md->getStartBodyLine(),d,md);
} }
} }
......
...@@ -46,6 +46,9 @@ FileDef::FileDef(const char *p,const char *nm,const char *ref) ...@@ -46,6 +46,9 @@ FileDef::FileDef(const char *p,const char *nm,const char *ref)
includeList = new QList<IncludeInfo>; includeList = new QList<IncludeInfo>;
includeList->setAutoDelete(TRUE); includeList->setAutoDelete(TRUE);
includeDict = new QDict<IncludeInfo>(61); includeDict = new QDict<IncludeInfo>(61);
includedByList = new QList<IncludeInfo>;
includedByList->setAutoDelete(TRUE);
includedByDict = new QDict<IncludeInfo>(61);
namespaceList = new NamespaceList; namespaceList = new NamespaceList;
namespaceDict = new NamespaceDict(7); namespaceDict = new NamespaceDict(7);
srcDefDict = 0; srcDefDict = 0;
...@@ -188,7 +191,7 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -188,7 +191,7 @@ void FileDef::writeDocumentation(OutputList &ol)
if (Config::haveDotFlag && Config::includeGraphFlag) if (Config::haveDotFlag && Config::includeGraphFlag)
{ {
//printf("Graph for file %s\n",name().data()); //printf("Graph for file %s\n",name().data());
DotInclDepGraph incDepGraph(this); DotInclDepGraph incDepGraph(this,FALSE);
if (!incDepGraph.isTrivial()) if (!incDepGraph.isTrivial())
{ {
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
...@@ -201,6 +204,22 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -201,6 +204,22 @@ void FileDef::writeDocumentation(OutputList &ol)
//incDepGraph.writeGraph(Config::htmlOutputDir,fd->getOutputFileBase()); //incDepGraph.writeGraph(Config::htmlOutputDir,fd->getOutputFileBase());
} }
if (Config::haveDotFlag && Config::includedByGraphFlag)
{
//printf("Graph for file %s\n",name().data());
DotInclDepGraph incDepGraph(this,TRUE);
if (!incDepGraph.isTrivial())
{
ol.disable(OutputGenerator::Man);
ol.newParagraph();
ol.startInclDepGraph();
parseText(ol,theTranslator->trInclByDepGraph());
ol.endInclDepGraph(incDepGraph);
ol.enableAll();
}
//incDepGraph.writeGraph(Config::htmlOutputDir,fd->getOutputFileBase());
}
if (generateSource() || (!isReference() && Config::sourceBrowseFlag)) if (generateSource() || (!isReference() && Config::sourceBrowseFlag))
{ {
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
...@@ -454,6 +473,7 @@ void FileDef::addMemberListToGroup(MemberList *ml, ...@@ -454,6 +473,7 @@ void FileDef::addMemberListToGroup(MemberList *ml,
{ {
QCString *pGrpHeader = memberHeaderDict[groupId]; QCString *pGrpHeader = memberHeaderDict[groupId];
QCString *pDocs = memberDocDict[groupId]; QCString *pDocs = memberDocDict[groupId];
//printf("Member `%s' pGrpHeader=%p\n",md->name().data(),pGrpHeader);
if (pGrpHeader) if (pGrpHeader)
{ {
MemberGroup *mg = memberGroupDict->find(groupId); MemberGroup *mg = memberGroupDict->find(groupId);
...@@ -463,6 +483,7 @@ void FileDef::addMemberListToGroup(MemberList *ml, ...@@ -463,6 +483,7 @@ void FileDef::addMemberListToGroup(MemberList *ml,
memberGroupDict->insert(groupId,mg); memberGroupDict->insert(groupId,mg);
memberGroupList->append(mg); memberGroupList->append(mg);
} }
//printf("insert member %s in group %s\n",md->name().data(),pGrpHeader->data());
mg->insertMember(md); mg->insertMember(md);
md->setMemberGroup(mg); md->setMemberGroup(mg);
} }
...@@ -595,6 +616,21 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local) ...@@ -595,6 +616,21 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local)
} }
} }
void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,bool local)
{
//printf("FileDef::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
QCString iName = fd ? fd->absFilePath().data() : incName;
if (!iName.isEmpty() && includedByDict->find(iName)==0)
{
IncludeInfo *ii = new IncludeInfo;
ii->fileDef = fd;
ii->includeName = incName;
ii->local = local;
includedByList->append(ii);
includedByDict->insert(iName,ii);
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/*! Creates a file list. */ /*! Creates a file list. */
......
...@@ -122,9 +122,11 @@ class FileDef : public Definition ...@@ -122,9 +122,11 @@ class FileDef : public Definition
void setGenerateSource(bool b) { isSource=b; } void setGenerateSource(bool b) { isSource=b; }
bool generateSource() const { return isSource; } bool generateSource() const { return isSource; }
void addIncludeDependency(FileDef *fd,const char *incName,bool local); void addIncludeDependency(FileDef *fd,const char *incName,bool local);
void addIncludedByDependency(FileDef *fd,const char *incName,bool local);
QList<IncludeInfo> *includeFileList() const { return includeList; } QList<IncludeInfo> *includeFileList() const { return includeList; }
QDict<IncludeInfo> *includeFileDict() const { return includeDict; } QList<IncludeInfo> *includedByFileList() const { return includedByList; }
void addMembersToMemberGroup(); void addMembersToMemberGroup();
void distributeMemberGroupDocumentation(); void distributeMemberGroupDocumentation();
...@@ -145,6 +147,8 @@ class FileDef : public Definition ...@@ -145,6 +147,8 @@ class FileDef : public Definition
ClassList *classList; ClassList *classList;
QDict<IncludeInfo> *includeDict; QDict<IncludeInfo> *includeDict;
QList<IncludeInfo> *includeList; QList<IncludeInfo> *includeList;
QDict<IncludeInfo> *includedByDict;
QList<IncludeInfo> *includedByList;
NamespaceDict *namespaceDict; NamespaceDict *namespaceDict;
NamespaceList *namespaceList; NamespaceList *namespaceList;
NamespaceList *usingDirList; NamespaceList *usingDirList;
......
...@@ -48,22 +48,47 @@ static QCString filterTitle(const char *s) ...@@ -48,22 +48,47 @@ static QCString filterTitle(const char *s)
return result; return result;
} }
static QCString escapeLabelName(const QCString &s) static QCString escapeLabelName(const char *s)
{ {
QCString result; QCString result;
uint i; const char *p=s;
for (i=0;i<s.length();i++) char c;
while ((c=*p++))
{ {
char c=s.at(i);
switch (c) switch (c)
{ {
case '%': result+="\\%"; break; case '%': result+="\\%"; break;
case '|': result+="\\texttt{\"|}"; break;
case '!': result+="\"!"; break;
default: result+=c; default: result+=c;
} }
} }
return result; return result;
} }
static QCString escapeMakeIndexChars(LatexGenerator *g,QTextStream &t,const char *s)
{
QCString result;
const char *p=s;
char str[2];
str[1]=0;
char c;
while ((c=*p++))
{
switch (c)
{
case '!': t << "\"!"; break;
case '"': t << "\"\""; break;
case '@': t << "\"@"; break;
case '|': t << "\\texttt{\"|}"; break;
case '[': t << "["; break;
case ']': t << "]"; break;
default: str[0]=c; g->docify(str); break;
}
}
return result;
}
LatexGenerator::LatexGenerator() : OutputGenerator() LatexGenerator::LatexGenerator() : OutputGenerator()
{ {
...@@ -178,7 +203,7 @@ void LatexGenerator::startIndexSection(IndexSections is) ...@@ -178,7 +203,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
t << "}\n"; t << "}\n";
if (Config::paperType=="a4wide") t << "\\usepackage{a4wide}\n"; if (Config::paperType=="a4wide") t << "\\usepackage{a4wide}\n";
t << "\\usepackage{makeidx}\n" t << "\\usepackage{makeidx}\n"
"\\usepackage{fancyheadings}\n" "\\usepackage{fancyhdr}\n"
"\\usepackage{epsfig}\n" "\\usepackage{epsfig}\n"
"\\usepackage{float}\n" "\\usepackage{float}\n"
"\\usepackage{doxygen}\n"; "\\usepackage{doxygen}\n";
...@@ -865,11 +890,11 @@ void LatexGenerator::startMemberDoc(const char *clname, ...@@ -865,11 +890,11 @@ void LatexGenerator::startMemberDoc(const char *clname,
t << "}!"; t << "}!";
} }
t << escapeLabelName(memname) << "@{"; t << escapeLabelName(memname) << "@{";
docify(memname); escapeMakeIndexChars(this,t,memname);
t << "}}" << endl; t << "}}" << endl;
t << "\\index{" << escapeLabelName(memname) << "@{"; t << "\\index{" << escapeLabelName(memname) << "@{";
docify(memname); escapeMakeIndexChars(this,t,memname);
t << "}"; t << "}";
if (clname) if (clname)
{ {
...@@ -934,7 +959,7 @@ void LatexGenerator::addToIndex(const char *s1,const char *s2) ...@@ -934,7 +959,7 @@ void LatexGenerator::addToIndex(const char *s1,const char *s2)
if (s1) if (s1)
{ {
t << "\\index{" << escapeLabelName(s1) << "@{"; t << "\\index{" << escapeLabelName(s1) << "@{";
docify(s1); escapeMakeIndexChars(this,t,s1);
t << "}"; t << "}";
if (s2) if (s2)
{ {
......
...@@ -475,8 +475,8 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -475,8 +475,8 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (Config::hideMemberFlag && documentation().isEmpty() && if (Config::hideMemberFlag && documentation().isEmpty() &&
!Config::briefMemDescFlag && !Config::repeatBriefFlag !Config::briefMemDescFlag && !Config::repeatBriefFlag
) return; ) return;
// hide static file & namespace members unless extract private is on // hide static file & namespace members unless extract static is on
if (cd==0 && isStatic() && !Config::extractPrivateFlag) return; if (cd==0 && isStatic() && !Config::extractStaticFlag) return;
// hide private member that are put into a member group. Non-grouped // hide private member that are put into a member group. Non-grouped
// members are not rendered anyway. // members are not rendered anyway.
...@@ -489,7 +489,8 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -489,7 +489,8 @@ void MemberDef::writeDeclaration(OutputList &ol,
// strip `friend' keyword from type // strip `friend' keyword from type
if (type.left(7)=="friend ") type=type.right(type.length()-7); if (type.left(7)=="friend ") type=type.right(type.length()-7);
static QRegExp r("@[0-9]+"); static QRegExp r("@[0-9]+");
if ((i=r.match(type,0,&l))==-1 || !enumUsed()) i=-1;
if ((type.isEmpty() || (i=r.match(type,0,&l))==-1) || !enumUsed())
{ {
if (!Config::genTagFile.isEmpty()) if (!Config::genTagFile.isEmpty())
...@@ -792,7 +793,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -792,7 +793,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
const char *scopeName) const char *scopeName)
{ {
if (memberClass()==0 && isStatic() && !Config::extractPrivateFlag) return; if (memberClass()==0 && isStatic() && !Config::extractStaticFlag) return;
bool hasDocs = detailsAreVisible(); bool hasDocs = detailsAreVisible();
//printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition()); //printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition());
if ( if (
...@@ -834,14 +835,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -834,14 +835,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
int i=0,l; int i=0,l;
static QRegExp r("@[0-9]+"); static QRegExp r("@[0-9]+");
//ENUM
if (isEnumValue()) return; if (isEnumValue()) return;
//if (isEnumValue() && def[0]=='@') def = def.right(def.length()-2);
//int dummy;
//if (isEnumerate() && r.match(def,0,&l)!=-1) return;
//MemberDef *smd;
//if (isEnumValue() && (smd = getEnumScope())
// && r.match(smd->name(),0,&dummy)==-1) return;
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -1342,7 +1336,7 @@ bool MemberDef::isLinkableInProject() ...@@ -1342,7 +1336,7 @@ bool MemberDef::isLinkableInProject()
((hasDocumentation() && !isReference()) ((hasDocumentation() && !isReference())
) && ) &&
(prot!=Private || Config::extractPrivateFlag || isFriend()) && // not a private class member (prot!=Private || Config::extractPrivateFlag || isFriend()) && // not a private class member
(classDef!=0 || Config::extractPrivateFlag || !isStatic()); // not a private file/namespace member (classDef!=0 || Config::extractStaticFlag || !isStatic()); // not a static file/namespace member
} }
bool MemberDef::isLinkable() bool MemberDef::isLinkable()
......
...@@ -111,14 +111,17 @@ int MemberGroup::countDecMembers(bool sectionPerType) ...@@ -111,14 +111,17 @@ int MemberGroup::countDecMembers(bool sectionPerType)
void MemberGroup::distributeMemberGroupDocumentation() void MemberGroup::distributeMemberGroupDocumentation()
{ {
//printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
MemberDef *md=memberList->first(); MemberDef *md=memberList->first();
if (md && md->hasDocumentation()) if (md && !(md->documentation().isEmpty() && md->briefDescription().isEmpty()))
{ {
//printf("First member %s has documentation!\n",md->name().data());
MemberDef *omd=memberList->next(); MemberDef *omd=memberList->next();
while (omd) while (omd)
{ {
if (!omd->hasDocumentation()) if (omd->documentation().isEmpty() && omd->briefDescription().isEmpty())
{ {
//printf("Copying documentation to member %s\n",omd->name().data());
omd->setBriefDescription(md->briefDescription()); omd->setBriefDescription(md->briefDescription());
omd->setDocumentation(md->documentation()); omd->setDocumentation(md->documentation());
} }
......
...@@ -54,7 +54,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe ...@@ -54,7 +54,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe
{ {
//printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n", //printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n",
// md,md->name().data(),inGroup,md->getMemberGroup()); // md,md->name().data(),inGroup,md->getMemberGroup());
if (!(md->memberClass()==0 && md->isStatic() && !Config::extractPrivateFlag) && if (!(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag) &&
(!Config::hideMemberFlag || md->hasDocumentation()) && (!Config::hideMemberFlag || md->hasDocumentation()) &&
( (
(!Config::hideMemberFlag || !md->documentation().isEmpty() || (!Config::hideMemberFlag || !md->documentation().isEmpty() ||
...@@ -119,7 +119,7 @@ void MemberList::countDocMembers() ...@@ -119,7 +119,7 @@ void MemberList::countDocMembers()
//printf("%s MemberList::countDocMembers() details=%d\n", //printf("%s MemberList::countDocMembers() details=%d\n",
// md->name().data(),md->detailsAreVisible()); // md->name().data(),md->detailsAreVisible());
bool visibleIfStatic = bool visibleIfStatic =
!(md->memberClass()==0 && md->isStatic() && !Config::extractPrivateFlag); !(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag);
if (visibleIfStatic && if (visibleIfStatic &&
(Config::extractAllFlag || md->detailsAreVisible()) (Config::extractAllFlag || md->detailsAreVisible())
......
...@@ -120,7 +120,8 @@ static void decrLevel() ...@@ -120,7 +120,8 @@ static void decrLevel()
} }
else else
{ {
err("Error: More #endif's than #if's found.\n"); err("%s:%d: Error: More #endif's than #if's found.\n",
g_yyFileName.data(),g_yyLineNr);
} }
} }
...@@ -128,7 +129,8 @@ static bool otherCaseDone() ...@@ -128,7 +129,8 @@ static bool otherCaseDone()
{ {
if (g_level==0) if (g_level==0)
{ {
err("Error: Found an #else without a preceding #if.\n"); err("%s:%d: Error: Found an #else without a preceding #if.\n",
g_yyFileName.data(),g_yyLineNr);
return TRUE; return TRUE;
} }
else else
...@@ -165,7 +167,7 @@ static FILE *findFile(const char *fileName) ...@@ -165,7 +167,7 @@ static FILE *findFile(const char *fileName)
{ {
QCString absName=(QCString)s+"/"+fileName; QCString absName=(QCString)s+"/"+fileName;
QFileInfo fi(absName); QFileInfo fi(absName);
if (fi.exists()) if (fi.exists() && fi.isFile())
{ {
FILE *f; FILE *f;
if (!Config::inputFilter.isEmpty()) if (!Config::inputFilter.isEmpty())
...@@ -279,6 +281,7 @@ static void processConcatOperators(QCString &expr) ...@@ -279,6 +281,7 @@ static void processConcatOperators(QCString &expr)
{ {
QRegExp r("[ \\t\\n]*##[ \\t\\n]*"); QRegExp r("[ \\t\\n]*##[ \\t\\n]*");
int l,n,i=0; int l,n,i=0;
if (expr.isEmpty()) return;
while ((n=r.match(expr,i,&l))!=-1) while ((n=r.match(expr,i,&l))!=-1)
{ {
if (n+l+1<(int)expr.length() && expr.at(n+l)=='@' && expr.at(n+l+1)=='-') if (n+l+1<(int)expr.length() && expr.at(n+l)=='@' && expr.at(n+l+1)=='-')
...@@ -840,6 +843,11 @@ static void readIncludeFile(const QCString &inc) ...@@ -840,6 +843,11 @@ static void readIncludeFile(const QCString &inc)
{ {
// add include dependency to the file in which the #include was found // add include dependency to the file in which the #include was found
oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude); oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude);
// add included by dependency
if (g_yyFileDef)
{
g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude);
}
} }
// store the state of the old file // store the state of the old file
FileState *fs=new FileState; FileState *fs=new FileState;
...@@ -861,6 +869,11 @@ static void readIncludeFile(const QCString &inc) ...@@ -861,6 +869,11 @@ static void readIncludeFile(const QCString &inc)
FileDef *fd = findFileDef(inputNameDict,incFileName,ambig); FileDef *fd = findFileDef(inputNameDict,incFileName,ambig);
// add include dependency to the file in which the #include was found // add include dependency to the file in which the #include was found
oldFileDef->addIncludeDependency(fd,incFileName,localInclude); oldFileDef->addIncludeDependency(fd,incFileName,localInclude);
// add included by dependency
if (fd)
{
fd->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude);
}
} }
#if SHOW_INCLUDES #if SHOW_INCLUDES
msg("#include %s: not found! skipping...\n",incFileName.data()); msg("#include %s: not found! skipping...\n",incFileName.data());
......
This diff is collapsed.
...@@ -519,9 +519,11 @@ class Translator ...@@ -519,9 +519,11 @@ class Translator
/*! used as the title of the HTML page of a class/struct/union */ /*! used as the title of the HTML page of a class/struct/union */
virtual QCString trCompoundReference(const char *clName, virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool isTemplate)
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
if (isTemplate) result+=" Template";
switch(compType) switch(compType)
{ {
case ClassDef::Class: result+=" Class"; break; case ClassDef::Class: result+=" Class"; break;
...@@ -893,6 +895,15 @@ class Translator ...@@ -893,6 +895,15 @@ class Translator
{ {
return "Attention"; return "Attention";
} }
virtual QCString trInclByDepGraph()
{
return "This graph shows which files directly or "
"indirectly include this file:";
}
virtual QCString trSince()
{
return "Since";
}
}; };
#endif #endif
...@@ -287,7 +287,8 @@ class TranslatorCzech : public Translator ...@@ -287,7 +287,8 @@ class TranslatorCzech : public Translator
/*! used as the title of the HTML page of a class/struct/union */ /*! used as the title of the HTML page of a class/struct/union */
QCString trCompoundReference(const char *clName, QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
result+=" Reference"; result+=" Reference";
......
...@@ -429,7 +429,8 @@ class TranslatorGerman : public Translator ...@@ -429,7 +429,8 @@ class TranslatorGerman : public Translator
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
QCString trCompoundReference(const char *clName, QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
// used as the title of the HTML page of a class/struct/union // used as the title of the HTML page of a class/struct/union
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
......
...@@ -524,7 +524,8 @@ class TranslatorSpanish : public Translator ...@@ -524,7 +524,8 @@ class TranslatorSpanish : public Translator
/*! used as the title of the HTML page of a class/struct/union */ /*! used as the title of the HTML page of a class/struct/union */
virtual QCString trCompoundReference(const char *clName, virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
switch(compType) switch(compType)
......
...@@ -464,7 +464,8 @@ class TranslatorFinnish : public Translator ...@@ -464,7 +464,8 @@ class TranslatorFinnish : public Translator
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
virtual QCString trCompoundReference(const char *clName, virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
// used as the title of the HTML page of a class/struct/union // used as the title of the HTML page of a class/struct/union
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
......
...@@ -491,7 +491,8 @@ class TranslatorFrench : public Translator ...@@ -491,7 +491,8 @@ class TranslatorFrench : public Translator
/*! used as the title of the HTML page of a class/struct/union */ /*! used as the title of the HTML page of a class/struct/union */
virtual QCString trCompoundReference(const char *clName, virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
{ {
QCString result="Référence de "; QCString result="Référence de ";
switch(compType) switch(compType)
......
...@@ -261,7 +261,8 @@ class TranslatorCroatian : public Translator ...@@ -261,7 +261,8 @@ class TranslatorCroatian : public Translator
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
QCString trCompoundReference(const char *clName, QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
// used as the title of the HTML page of a class/struct/union // used as the title of the HTML page of a class/struct/union
{ {
QCString result="Opis "; QCString result="Opis ";
......
...@@ -531,7 +531,8 @@ class TranslatorItalian : public Translator ...@@ -531,7 +531,8 @@ class TranslatorItalian : public Translator
/*! used as the title of the HTML page of a class/struct/union */ /*! used as the title of the HTML page of a class/struct/union */
QCString trCompoundReference(const char *clName, QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /* isTemplate */)
{ {
QCString result="Riferimenti per "; QCString result="Riferimenti per ";
switch(compType) switch(compType)
......
...@@ -511,7 +511,8 @@ class TranslatorJapanese : public Translator ...@@ -511,7 +511,8 @@ class TranslatorJapanese : public Translator
/*! used as the title of the HTML page of a class/struct/union */ /*! used as the title of the HTML page of a class/struct/union */
QCString trCompoundReference(const char *clName, QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
{ {
QCString result=""; QCString result="";
switch(compType) switch(compType)
......
...@@ -261,10 +261,12 @@ class TranslatorDutch : public Translator ...@@ -261,10 +261,12 @@ class TranslatorDutch : public Translator
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
QCString trCompoundReference(const char *clName, QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool isTemplate)
// used as the title of the HTML page of a class/struct/union // used as the title of the HTML page of a class/struct/union
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
if (isTemplate) result+=" Template";
switch(compType) switch(compType)
{ {
case ClassDef::Class: result+=" Class"; break; case ClassDef::Class: result+=" Class"; break;
......
...@@ -402,7 +402,9 @@ class TranslatorRussian : public Translator ...@@ -402,7 +402,9 @@ class TranslatorRussian : public Translator
// need translation // need translation
return " "; return " ";
} }
QCString trCompoundReference(const char* clName,ClassDef::CompoundType compType) QCString trCompoundReference(const char* clName,
ClassDef::CompoundType compType,
bool /*isTemplate*/)
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
switch(compType) switch(compType)
......
...@@ -380,7 +380,8 @@ class TranslatorSwedish : public Translator ...@@ -380,7 +380,8 @@ class TranslatorSwedish : public Translator
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
virtual QCString trCompoundReference(const char *clName, virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType,
bool /*isTemplate*/)
{ {
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
switch(compType) switch(compType)
......
...@@ -287,6 +287,7 @@ void linkifyText(OutputList &ol,const char *scName,const char *name,const char * ...@@ -287,6 +287,7 @@ void linkifyText(OutputList &ol,const char *scName,const char *name,const char *
int newIndex; int newIndex;
int skipIndex=0; int skipIndex=0;
int floatingIndex=0; int floatingIndex=0;
if (strLen==0) return;
// read a word from the text string // read a word from the text string
while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1) while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1)
{ {
...@@ -1987,6 +1988,7 @@ QCString substituteClassNames(const QCString &s) ...@@ -1987,6 +1988,7 @@ QCString substituteClassNames(const QCString &s)
{ {
int i=0,l,p; int i=0,l,p;
QCString result; QCString result;
if (s.isEmpty()) return result;
QRegExp r("[a-z_A-Z][a-z_A-Z0-9]*"); QRegExp r("[a-z_A-Z][a-z_A-Z0-9]*");
while ((p=r.match(s,i,&l))!=-1) while ((p=r.match(s,i,&l))!=-1)
{ {
......
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