Commit 142b4807 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.5.9-20090720

parent b70a5b4f
DOXYGEN Version 1.5.9-20090622 DOXYGEN Version 1.5.9-20090720
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (22 June 2009) Dimitri van Heesch (20 July 2009)
DOXYGEN Version 1.5.9_20090622 DOXYGEN Version 1.5.9_20090720
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (22 June 2009) Dimitri van Heesch (dimitri@stack.nl) (20 July 2009)
...@@ -10,16 +10,16 @@ ...@@ -10,16 +10,16 @@
# See the GNU General Public License for more details. # See the GNU General Public License for more details.
# #
QMAKE = qmake QMAKE=qmake
all: Makefile.doxywizard all: Makefile.doxywizard
$(MAKE) -f Makefile.doxywizard $(MAKE) -f Makefile.doxywizard
Makefile.doxywizard: doxywizard.pro Makefile.doxywizard: doxywizard.pro
$(QTDIR)/bin/qmake doxywizard.pro -o Makefile.doxywizard $(QMAKE) doxywizard.pro -o Makefile.doxywizard
qmake: qmake:
$(QTDIR)/bin/qmake doxywizard.pro -o Makefile.doxywizard $(QMAKE) doxywizard.pro -o Makefile.doxywizard
clean: Makefile.doxywizard clean: Makefile.doxywizard
$(MAKE) -f Makefile.doxywizard clean $(MAKE) -f Makefile.doxywizard clean
......
...@@ -20,7 +20,7 @@ doxygen_version_minor=5 ...@@ -20,7 +20,7 @@ doxygen_version_minor=5
doxygen_version_revision=9 doxygen_version_revision=9
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package. #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20090622 doxygen_version_mmn=20090720
bin_dirs=`echo $PATH | sed -e "s/:/ /g"` bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......
...@@ -1431,6 +1431,26 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" ...@@ -1431,6 +1431,26 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
If non-empty doxygen will try to run qhelpgenerator on the generated If non-empty doxygen will try to run qhelpgenerator on the generated
.qhp file. .qhp file.
\anchor cfg_searchengine
<dt>\c SEARCHENGINE <dd>
\addindex SEARCHENGINE
The \c SEARCHENGINE tag specifies whether or not the HTML output should
contain a search function. Possible values are \c YES and \c NO.
If set to YES, doxygen will produce a search index, and a search box at
the top of each page (or in the side bar in case GENERATE_TREE is enabled).
The search engine is implemented using javascript and DHTML and should
work on any modern browser.
It is possible to search using the keyboard;
to jump to the search box use access key + S (what the access key is
depends on the OS and browser, but it is typically CTRL, ALT/option, or both).
Inside the search box use the cursor down key to jump into the search
results window, the results can be navigated using the cursor keys.
Press Enter to select an item or escape to cancel the search. The
filter options can be selected when the cursor is inside the search box
by pressing Shift+cursor down. Also here use the cursor keys to
select a filter and enter or escape to activate or cancel the filter option.
<!-- <!--
\anchor cfg_qthelp_file \anchor cfg_qthelp_file
<dt>\c QTHELP_FILE <dd> <dt>\c QTHELP_FILE <dd>
...@@ -1488,7 +1508,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" ...@@ -1488,7 +1508,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
the \ref cfg_project_name "project name". the \ref cfg_project_name "project name".
\anchor cfg_use_inline_trees \anchor cfg_use_inline_trees
<dt>\c USE_INLINE_TREES <dt>\c USE_INLINE_TREES <dd>
\addindex USE_INLINE_TREES \addindex USE_INLINE_TREES
By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
and Class Hierarchy pages using a tree view instead of an ordered list. and Class Hierarchy pages using a tree view instead of an ordered list.
...@@ -2178,21 +2198,6 @@ If the \c DOT_CLEANUP tag is set to \c YES (the default) doxygen will ...@@ -2178,21 +2198,6 @@ If the \c DOT_CLEANUP tag is set to \c YES (the default) doxygen will
remove the intermediate dot files that are used to generate the various graphs. remove the intermediate dot files that are used to generate the various graphs.
</dl>
\section config_search Search engine options
\anchor cfg_searchengine
<dl>
<dt>\c SEARCHENGINE <dd>
\addindex SEARCHENGINE
The \c SEARCHENGINE tag specifies whether or not the HTML output should
contain a search facility. Possible values are \c YES and \c NO.
If set to YES, doxygen will produce a search index and a PHP script
to search through the index. For this to work the documentation should
be viewed via a web-server running PHP version 4.1.0 or higher.
(See http://www.php.net/manual/en/installation.php for installation
instructions).
</dl> </dl>
<h2>Examples</h2> <h2>Examples</h2>
......
/*! \page dbusxml DBus XML output format
\addindex dbusxml
<p>Doxygen can generate documentation for DBus XML files. This way
DBus interfaces can be annotated with doxygen style comments, and
without writing custom XML parsers. Doxygen extracts its text from
all XML comments starting with '*' or '!'. An additional '<' can be
used to assign the documentation string to the previous entity instead
of the one following the comment.
\section dbusxml_supported Supported XML elements and attributes
<p>The following DBus XML elemets can be annotated:
<ul>
<li><b>interface</b>
<li><b>method</b> or <b>signal</b>
<li><b>arg</b>
<li><b>property</b>
</ul>
Additional elements are supported. These are available once
the xmlns "http://psiamp.org/dtd/doxygen_dbusxml.dtd" is
available.
<ul>
<li><b>namespace</b>: This can be used to group other more of the
additional elemets. This element requires a <b>name</b> attribute.
<li><b>enum</b> is used to define enums. <b>value</b> element is
then used to define the individual values in the enum. This element
requires the <b>name</b> and <b>type</b> attributes. A
optional <b>named-type</b> attribute is allowed, referrencing typed
previously defined by one of the additional elements. A enum name
can be used anywhere a type is required using the <b>named-type</b>
attribute.
<li><b>flagset</b> is used to define sets of flags. Required and
optional attributes are identical to the ones used by <b>enum</b>.
While <b>enum</b>s assume the values to be consecutive, while
a <b>flagset</b> is values suitable for flags. A flagset name
can be used anywhere a type is required using the <b>named-type</b>
attribute.
<li><b>struct</b> is used to define structures. A <b>name</b>
attribute is required.
<li><b>member</b> is used to define members of <b>structs</b>. It
is valid inside <b>struct</b> elements. This
element requires <b>name</b> and <b>type</b> attributes. In
addition to (or even instead of) the <b>type</b> attribute a
<b>named-type</b> attribute may be used to reference types defined
by <b>enum</b>, <b>flagset</b> or <b>struct</b>.
\section dbusxml_example Example
<pre>
<?xml version="1.0" ?>
<!-- Comment -->
<!--*< File comment -->
<node name="/SomeNode" xmlns:dx="http://psiamp.org/dtd/doxygen_dbusxml.dtd">
<!--* test struct outside a namespace and interface -->
<dx:struct name="StructOutsideNamespace">
<!--* member 1 -->
<dx:member name="member1" type="s"/>
<!--* complex member 1 -->
<dx:member name="complexMember1" type="(ssu)"/>
</dx:struct>
<!--* Test flag set -->
<dx:flagset name="flagset">
<!--* Flag 1 of flagset. -->
<dx:value name="FLAG1"/>
</dx:flagset>
<!--* namespace comment -->
<dx:namespace name="SomeNamespace">
<!--* struct inside a namespace -->
<dx:struct name="StructInNamespace">
<!--* member 2 -->
<dx:member name="member2" type="s"/>
</dx:struct>
</dx:namespace>
<!--* Documentation on the interface -->
<interface name="nl.stack.doxygen.test.interface">
<!--* Test Enum documentation -->
<dx:enum name="TestEnum">
<!--* key 1 with value 13 -->
<dx:value name="KEY1" value="13"/>
<!--* key 2 without a value -->
<dx:value name="KEY2"/>
</dx:enum>
<!--* struct inside a interface -->
<dx:struct name="StructInInterface">
<!--* member 3 -->
<dx:member name="member3" type="s"/>
<!--* Struct in a struct -->
<dx:struct name="StructInAStruct">
<!--* member4 -->
<dx:member name="member4" type="s"/>
</dx:struct>
<!--* struct member -->
<dx:member name="structMembor" type="(s)" named-type="StructInAStruct"/>
</dx:struct>
<!--* Document method
Some extended documentation for the method.
@param[in] input blah.
@param[out] output blub
-->
<method name="method">
<arg direction="in" name="input" type="(s(s))" named-type="::nl::stack::doxygen::test::interface::StructInInterface"/>
<arg direction="out" type="v" name="output"/>
</method>
<signal name="signal">
<!--*< Documentation for signal.
@param parameter some parameter.
-->
<arg name="parameter" type="s"/>
</signal>
<!--* property documentation -->
<property name="property" type="s" access="readwrite"/>
<!--* property documentation read-only -->
<property name="propertyRead" type="s" access="read"/>
<!--* property documentation write-only -->
<property name="propertyWrite" type="s" access="write"/>
</interface>
</node>
</pre>
*/
...@@ -18,14 +18,11 @@ ...@@ -18,14 +18,11 @@
Installdox is a perl script that is generated by doxygen whenever Installdox is a perl script that is generated by doxygen whenever
tag files are used (See \c TAGFILES tag files are used (See \c TAGFILES
in section \ref config_extref) in section \ref config_extref). The script is
or the search engine is enabled (See \c SEARCHENGINE
in section \ref config_search). The script is
located in the same directory where the HTML files are located. located in the same directory where the HTML files are located.
Its purpose is to set the location of the external documentation Its purpose is to set the location of the external documentation
for each tag file and to set the correct links to the search engine for each tag file at install time.
at install time.
Calling \c installdox with option <b>-h</b> at the command line Calling \c installdox with option <b>-h</b> at the command line
will give you a brief description of the usage of the program. will give you a brief description of the usage of the program.
......
...@@ -157,12 +157,8 @@ a browser that supports cascading style sheets (CSS) should be used ...@@ -157,12 +157,8 @@ a browser that supports cascading style sheets (CSS) should be used
generated output). generated output).
Some of the features the HTML section (such as Some of the features the HTML section (such as
\ref cfg_generate_treeview "GENERATE_TREEVIEW") require a browser that \ref cfg_generate_treeview "GENERATE_TREEVIEW" or the search engine)
supports DHTML and Javascript. require a browser that supports DHTML and Javascript.
If you plan to use the search engine (see
\ref cfg_searchengine "SEARCHENGINE"), you should view the HTML output
via a PHP-enabled web server (e.g. apache with the PHP module installed).
\subsection latex_out LaTeX output \subsection latex_out LaTeX output
\addindex LaTeX \addindex LaTeX
......
PROJECT_NAME = "DBusXMLDocs"
OUTPUT_DIRECTORY = dbusxml
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = dbusxml.xml
QUIET = YES
JAVADOC_AUTOBRIEF = YES
EXTRACT_ALL = YES
<?xml version="1.0" ?>
<!-- Comment -->
<!--*< File comment -->
<node name="/SomeNode" xmlns:dx="http://psiamp.org/dtd/doxygen_dbusxml.dtd">
<!--* test struct outside a namespace and interface -->
<dx:struct name="StructOutsideNamespace">
<!--* member 1 -->
<dx:member name="member1" type="s"/>
<!--* complex member 1 -->
<dx:member name="complexMember1" type="(ssu)"/>
</dx:struct>
<!--* Test flag set -->
<dx:flagset name="flagset">
<!--* Flag 1 of flagset. -->
<dx:value name="FLAG1"/>
</dx:flagset>
<!--* namespace comment -->
<dx:namespace name="SomeNamespace">
<!--* struct inside a namespace -->
<dx:struct name="StructInNamespace">
<!--* member 2 -->
<dx:member name="member2" type="s"/>
</dx:struct>
</dx:namespace>
<!--* Documentation on the interface -->
<interface name="nl.stack.doxygen.test.interface">
<!--* Test Enum documentation -->
<dx:enum name="TestEnum">
<!--* key 1 with value 13 -->
<dx:value name="KEY1" value="13"/>
<!--* key 2 without a value -->
<dx:value name="KEY2"/>
</dx:enum>
<!--* struct inside a interface -->
<dx:struct name="StructInInterface">
<!--* member 3 -->
<dx:member name="member3" type="s"/>
<!--* Struct in a struct -->
<dx:struct name="StructInAStruct">
<!--* member4 -->
<dx:member name="member4" type="s"/>
</dx:struct>
<!--* struct member -->
<dx:member name="structMembor" type="(s)" named-type="StructInAStruct"/>
</dx:struct>
<!--* Document method
Some extended documentation for the method.
@param[in] input blah.
@param[out] output blub
-->
<method name="method">
<arg direction="in" name="input" type="(s(s))" named-type="::nl::stack::doxygen::test::interface::StructInInterface"/>
<arg direction="out" type="v" name="output"/>
</method>
<signal name="signal">
<!--*< Documentation for signal.
@param parameter some parameter.
-->
<arg name="parameter" type="s"/>
</signal>
<!--* property documentation -->
<property name="property" type="s" access="readwrite"/>
<!--* property documentation read-only -->
<property name="propertyRead" type="s" access="read"/>
<!--* property documentation write-only -->
<property name="propertyWrite" type="s" access="write"/>
</interface>
</node>
<!-- vim:set sw=2 sts=2 et ft=xml: -->
...@@ -149,14 +149,15 @@ QHP_SECT_FILTER_ATTRS = ...@@ -149,14 +149,15 @@ QHP_SECT_FILTER_ATTRS =
QHG_LOCATION = QHG_LOCATION =
DISABLE_INDEX = NO DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4 ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES GENERATE_TREEVIEW = NO
USE_INLINE_TREES = NO USE_INLINE_TREES = NO
TREEVIEW_WIDTH = 250 TREEVIEW_WIDTH = 250
FORMULA_FONTSIZE = 10 FORMULA_FONTSIZE = 10
SEARCHENGINE = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the LaTeX output # configuration options related to the LaTeX output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_LATEX = NO GENERATE_LATEX = YES
LATEX_OUTPUT = LATEX_OUTPUT =
LATEX_CMD_NAME = latex LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex MAKEINDEX_CMD_NAME = makeindex
...@@ -164,11 +165,11 @@ COMPACT_LATEX = NO ...@@ -164,11 +165,11 @@ COMPACT_LATEX = NO
PAPER_TYPE = a4wide PAPER_TYPE = a4wide
EXTRA_PACKAGES = EXTRA_PACKAGES =
LATEX_HEADER = LATEX_HEADER =
PDF_HYPERLINKS = NO PDF_HYPERLINKS = YES
USE_PDFLATEX = NO USE_PDFLATEX = YES
LATEX_BATCHMODE = NO LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO LATEX_HIDE_INDICES = NO
LATEX_SOURCE_CODE = NO LATEX_SOURCE_CODE = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the RTF output # configuration options related to the RTF output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -254,7 +255,3 @@ DOT_TRANSPARENT = YES ...@@ -254,7 +255,3 @@ DOT_TRANSPARENT = YES
DOT_MULTI_TARGETS = NO DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES GENERATE_LEGEND = YES
DOT_CLEANUP = YES DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Options related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = YES
...@@ -348,7 +348,7 @@ void replaceComment(int offset); ...@@ -348,7 +348,7 @@ void replaceComment(int offset);
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
BEGIN(CComment); BEGIN(CComment);
} }
<Scan>"##" { <Scan>"#"("#")? {
if (g_lang!=SrcLangExt_Python) if (g_lang!=SrcLangExt_Python)
{ {
REJECT; REJECT;
......
...@@ -898,6 +898,14 @@ when you change the font size after a successful doxygen run you need ...@@ -898,6 +898,14 @@ when you change the font size after a successful doxygen run you need
to manually remove any form_*.png images from the HTML output directory to manually remove any form_*.png images from the HTML output directory
to force them to be regenerated. to force them to be regenerated.
' minval='8' maxval='50' defval='10' depends='GENERATE_HTML'/> ' minval='8' maxval='50' defval='10' depends='GENERATE_HTML'/>
<option type='bool' id='SEARCHENGINE' docs='
When the SEARCHENGINE tag is enable doxygen will generate a search box
for the HTML output. The underlying search engine uses javascript
and DHTML and should work on any modern browser. Note that when using
HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP)
there is already a search function so this one should typically
be disabled.
' defval='1' depends='GENERATE_HTML'/>
</group> </group>
<group name='LaTeX' docs='configuration options related to the LaTeX output'> <group name='LaTeX' docs='configuration options related to the LaTeX output'>
<option type='bool' id='GENERATE_LATEX' docs=' <option type='bool' id='GENERATE_LATEX' docs='
...@@ -1358,12 +1366,6 @@ If the DOT_CLEANUP tag is set to YES (the default) Doxygen will ...@@ -1358,12 +1366,6 @@ If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
remove the intermediate dot files that are used to generate remove the intermediate dot files that are used to generate
the various graphs. the various graphs.
' defval='1' depends='HAVE_DOT'/> ' defval='1' depends='HAVE_DOT'/>
</group>
<group name='Search' docs='Options related to the search engine'>
<option type='bool' id='SEARCHENGINE' docs='
The SEARCHENGINE tag specifies whether or not a search engine should be
used. If set to NO the values of all tags below this one will be ignored.
' defval='0'/>
<option type='obsolete' id='SHOW_USED_FILES'/> <option type='obsolete' id='SHOW_USED_FILES'/>
<option type='obsolete' id='USE_WINDOWS_ENCODING'/> <option type='obsolete' id='USE_WINDOWS_ENCODING'/>
<option type='obsolete' id='DETAILS_AT_TOP'/> <option type='obsolete' id='DETAILS_AT_TOP'/>
......
...@@ -1323,6 +1323,16 @@ void addConfigOptions(Config *cfg) ...@@ -1323,6 +1323,16 @@ void addConfigOptions(Config *cfg)
8,50,10 8,50,10
); );
ci->addDependency("GENERATE_HTML"); ci->addDependency("GENERATE_HTML");
//----
cb = cfg->addBool(
"SEARCHENGINE",
"When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript \n"
"and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) \n"
"there is already a search function so this one should typically \n"
"be disabled.",
TRUE
);
cb->addDependency("GENERATE_HTML");
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
cfg->addInfo("LaTeX","configuration options related to the LaTeX output"); cfg->addInfo("LaTeX","configuration options related to the LaTeX output");
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
...@@ -2072,17 +2082,6 @@ void addConfigOptions(Config *cfg) ...@@ -2072,17 +2082,6 @@ void addConfigOptions(Config *cfg)
TRUE TRUE
); );
cb->addDependency("HAVE_DOT"); cb->addDependency("HAVE_DOT");
//---------------------------------------------------------------------------
cfg->addInfo("Search","Options related to the search engine");
//---------------------------------------------------------------------------
//----
cb = cfg->addBool(
"SEARCHENGINE",
"The SEARCHENGINE tag specifies whether or not a search engine should be \n"
"used. If set to NO the values of all tags below this one will be ignored.",
FALSE
);
//---- //----
cfg->addObsolete("SHOW_USED_FILES"); cfg->addObsolete("SHOW_USED_FILES");
//---- //----
......
This diff is collapsed.
/******************************************************************************
*
*
*
* Copyright (C) 2009 by Tobias Hunger <tobias@aquazul.com>
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
* granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
* Documents produced by Doxygen are derivative works derived from the
* input used in their production; they are not affected by this license.
*
*/
#ifndef SCANNER_DBUSXML_H
#define SCANNER_DBUSXML_H
#include "parserintf.h"
/** \brief D-Bus XML parser.
*
* This is the D-Bus XML parser for doxygen.
*/
class DBusXMLScanner : public ParserInterface
{
public:
DBusXMLScanner();
virtual ~DBusXMLScanner();
void parseInput(const char *fileName,
const char *fileBuf,
Entry *root);
bool needsPreprocessing(const QCString &extension);
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
const QCString &input,
bool isExampleBlock,
const char *exampleName=0,
FileDef *fileDef=0,
int startLine=-1,
int endLine=-1,
bool inlineFragment=FALSE,
MemberDef *memberDef=0
);
void resetCodeParserState();
void parsePrototype(const char *text);
private:
};
#endif
...@@ -169,6 +169,7 @@ template<class T> class CompAccept ...@@ -169,6 +169,7 @@ template<class T> class CompAccept
{ {
public: public:
CompAccept() { m_children.setAutoDelete(TRUE); } CompAccept() { m_children.setAutoDelete(TRUE); }
virtual ~CompAccept() {}
void accept(T *obj, DocVisitor *v) void accept(T *obj, DocVisitor *v)
{ {
v->visitPre(obj); v->visitPre(obj);
......
...@@ -263,6 +263,7 @@ void DocSets::addIndexItem(const char *, const char *, ...@@ -263,6 +263,7 @@ void DocSets::addIndexItem(const char *, const char *,
case SrcLangExt_Python: lang="python"; break; // Python case SrcLangExt_Python: lang="python"; break; // Python
case SrcLangExt_F90: lang="fortran"; break; // Fortran case SrcLangExt_F90: lang="fortran"; break; // Fortran
case SrcLangExt_VHDL: lang="vhdl"; break; // VHDL case SrcLangExt_VHDL: lang="vhdl"; break; // VHDL
case SrcLangExt_XML: lang="xml"; break; // DBUS XML
} }
// determine scope // determine scope
......
...@@ -71,6 +71,7 @@ ...@@ -71,6 +71,7 @@
#include "htags.h" #include "htags.h"
#include "pyscanner.h" #include "pyscanner.h"
#include "fortranscanner.h" #include "fortranscanner.h"
#include "dbusxmlscanner.h"
#include "code.h" #include "code.h"
#include "objcache.h" #include "objcache.h"
#include "store.h" #include "store.h"
...@@ -122,7 +123,6 @@ QTextStream Doxygen::tagFile; ...@@ -122,7 +123,6 @@ QTextStream Doxygen::tagFile;
NamespaceDef *Doxygen::globalScope = 0; NamespaceDef *Doxygen::globalScope = 0;
QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross-referenced item lists QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross-referenced item lists
bool Doxygen::parseSourcesNeeded = FALSE; bool Doxygen::parseSourcesNeeded = FALSE;
double Doxygen::sysElapsedTime = 0.0;
QTime Doxygen::runningTime; QTime Doxygen::runningTime;
//SearchIndex * Doxygen::searchIndex=0; //SearchIndex * Doxygen::searchIndex=0;
QDict<DefinitionIntf> *Doxygen::symbolMap; QDict<DefinitionIntf> *Doxygen::symbolMap;
...@@ -2924,10 +2924,23 @@ static void buildFunctionList(EntryNav *rootNav) ...@@ -2924,10 +2924,23 @@ static void buildFunctionList(EntryNav *rootNav)
//printf("matching arguments for %s%s %s%s\n", //printf("matching arguments for %s%s %s%s\n",
// md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data()); // md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
LockingPtr<ArgumentList> mdAl = md->argumentList(); LockingPtr<ArgumentList> mdAl = md->argumentList();
LockingPtr<ArgumentList> mdTempl = md->templateArguments();
// in case of template functions, we need to check if the
// functions have the same number of template parameters
bool sameNumTemplateArgs = TRUE;
if (mdTempl!=0 && root->tArgLists)
{
if (mdTempl->count()!=root->tArgLists->getLast()->count())
{
sameNumTemplateArgs = FALSE;
}
}
if ( if (
matchArguments2(md->getOuterScope(),mfd,mdAl.pointer(), matchArguments2(md->getOuterScope(),mfd,mdAl.pointer(),
rnd ? rnd : Doxygen::globalScope,rfd,root->argList, rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
FALSE) FALSE) &&
sameNumTemplateArgs
) )
{ {
GroupDef *gd=0; GroupDef *gd=0;
...@@ -4931,6 +4944,22 @@ static bool findGlobalMember(EntryNav *rootNav, ...@@ -4931,6 +4944,22 @@ static bool findGlobalMember(EntryNav *rootNav,
rnd ? rnd : Doxygen::globalScope,fd,root->argList, rnd ? rnd : Doxygen::globalScope,fd,root->argList,
FALSE); FALSE);
// for template members we need to check if the number of
// template arguments is the same, otherwise we are dealing with
// different functions.
if (matching && root->tArgLists)
{
LockingPtr<ArgumentList> mdTempl = md->templateArguments();
if (mdTempl!=0)
{
if (root->tArgLists->getLast()->count()!=mdTempl->count())
{
matching=FALSE;
}
}
}
//printf("%s<->%s\n", //printf("%s<->%s\n",
// argListToString(md->argumentList()).data(), // argListToString(md->argumentList()).data(),
// argListToString(root->argList).data()); // argListToString(root->argList).data());
...@@ -6572,7 +6601,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav) ...@@ -6572,7 +6601,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
SrcLangExt sle; SrcLangExt sle;
if (rootNav->fileDef() && if (rootNav->fileDef() &&
( (sle=getLanguageFromFileName(rootNav->fileDef()->name()))==SrcLangExt_CSharp ( (sle=getLanguageFromFileName(rootNav->fileDef()->name()))==SrcLangExt_CSharp
|| sle==SrcLangExt_Java || sle==SrcLangExt_Java || sle==SrcLangExt_XML
) )
) )
{ {
...@@ -9128,6 +9157,7 @@ void initDoxygen() ...@@ -9128,6 +9157,7 @@ void initDoxygen()
Doxygen::parserManager->registerParser("python", new PythonLanguageScanner); Doxygen::parserManager->registerParser("python", new PythonLanguageScanner);
Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner); Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner);
Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner); Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner);
Doxygen::parserManager->registerParser("dbusxml", new DBusXMLScanner);
// register any additional parsers here... // register any additional parsers here...
...@@ -10539,7 +10569,7 @@ void generateOutput() ...@@ -10539,7 +10569,7 @@ void generateOutput()
{ {
msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n", msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n",
((double)Doxygen::runningTime.elapsed())/1000.0, ((double)Doxygen::runningTime.elapsed())/1000.0,
Doxygen::sysElapsedTime portable_getSysElapsedTime()
); );
} }
......
...@@ -111,7 +111,6 @@ class Doxygen ...@@ -111,7 +111,6 @@ class Doxygen
static QDict<RefList> *xrefLists; // array of xref lists: todo, test, bug, deprecated ... static QDict<RefList> *xrefLists; // array of xref lists: todo, test, bug, deprecated ...
static QCString htmlFileExtension; static QCString htmlFileExtension;
static bool parseSourcesNeeded; static bool parseSourcesNeeded;
static double sysElapsedTime;
static QTime runningTime; static QTime runningTime;
//static SearchIndex *searchIndex; //static SearchIndex *searchIndex;
static QDict<DefinitionIntf> *symbolMap; static QDict<DefinitionIntf> *symbolMap;
......
...@@ -171,7 +171,7 @@ static int yyread(char *buf,int max_size); ...@@ -171,7 +171,7 @@ static int yyread(char *buf,int max_size);
static void startCommentBlock(bool); static void startCommentBlock(bool);
static void handleCommentBlock(const QCString &doc,bool brief); static void handleCommentBlock(const QCString &doc,bool brief);
static void addCurrentEntry(); static void addCurrentEntry();
static void addModule(const char *name); static void addModule(const char *name, bool isModule=FALSE);
static void addSubprogram(const char *text); static void addSubprogram(const char *text);
static void addInterface(QCString name); static void addInterface(QCString name);
static Argument *addFortranParameter(const QCString &type,const QCString &name, const QCString docs); static Argument *addFortranParameter(const QCString &type,const QCString &name, const QCString docs);
...@@ -242,6 +242,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA ...@@ -242,6 +242,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
%x Start %x Start
%x Comment %x Comment
%x Module %x Module
%x Program
%x ModuleBody %x ModuleBody
%x ModuleBodyContains %x ModuleBodyContains
%x AttributeList %x AttributeList
...@@ -437,7 +438,10 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA ...@@ -437,7 +438,10 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
/*------ module handling ------------------------------------------------------------*/ /*------ module handling ------------------------------------------------------------*/
<Start>module|program{BS_} { // <Start>module|program{BS_} { //
yy_push_state(Module); if(yytext[0]=='m' || yytext[0]=='M')
yy_push_state(Module);
else
yy_push_state(Program);
defaultProtection = Public; defaultProtection = Public;
} }
<Start,ModuleBody,ModuleBodyContains>^{BS}"end"({BS}(module|program)({BS_}{ID})?)?{BS}/(\n|!) { // end module <Start,ModuleBody,ModuleBodyContains>^{BS}"end"({BS}(module|program)({BS_}{ID})?)?{BS}/(\n|!) { // end module
...@@ -448,7 +452,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA ...@@ -448,7 +452,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
yy_pop_state(); yy_pop_state();
} }
<Module>{ID} { <Module>{ID} {
addModule(yytext); addModule(yytext, TRUE);
BEGIN(ModuleBody);
}
<Program>{ID} {
addModule(yytext, FALSE);
BEGIN(ModuleBody); BEGIN(ModuleBody);
} }
...@@ -1468,11 +1477,15 @@ static void addCurrentEntry() ...@@ -1468,11 +1477,15 @@ static void addCurrentEntry()
static int max(int a, int b) {return a>b?a:b;} static int max(int a, int b) {return a>b?a:b;}
static void addModule(const char *name) static void addModule(const char *name, bool isModule)
{ {
//fprintf(stderr, "0=========> got module %s\n", name); //fprintf(stderr, "0=========> got module %s\n", name);
current->section = Entry::NAMESPACE_SEC; if (isModule)
current->section = Entry::NAMESPACE_SEC;
else
current->section = Entry::FUNCTION_SEC;
if (name!=NULL) if (name!=NULL)
{ {
current->name = name; current->name = name;
......
...@@ -731,10 +731,12 @@ void FTVHelp::generateTreeView(QString* OutString) ...@@ -731,10 +731,12 @@ void FTVHelp::generateTreeView(QString* OutString)
t << " --></script>\n"; t << " --></script>\n";
t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n"; t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
t << " <div class=\"MSearchBoxRow\"><span class=\"MSearchBoxLeft\">\n"; t << " <div class=\"MSearchBoxRow\"><span class=\"MSearchBoxLeft\">\n";
t << " <input type=\"text\" id=\"MSearchField\" value=\"Search\" \n"; t << " <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
<< "<img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n";
t << " <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n";
t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n"; t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
t << " onblur=\"searchBox.OnSearchFieldFocus(false)\" \n"; t << " onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
t << " onkeyup=\"searchBox.OnSearchFieldChange()\"/>\n"; t << " onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
t << " </span><span class=\"MSearchBoxRight\">\n"; t << " </span><span class=\"MSearchBoxRight\">\n";
t << " <img id=\"MSearchSelect\" src=\"search/search.png\"\n"; t << " <img id=\"MSearchSelect\" src=\"search/search.png\"\n";
t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n"; t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
......
This diff is collapsed.
...@@ -2532,6 +2532,7 @@ void writeSearchIndex() ...@@ -2532,6 +2532,7 @@ void writeSearchIndex()
SDict<QList<Definition> >::Iterator li(g_searchIndexSymbols[i][p]); SDict<QList<Definition> >::Iterator li(g_searchIndexSymbols[i][p]);
QList<Definition> *dl; QList<Definition> *dl;
int itemCount=0;
for (li.toFirst();(dl=li.current());++li) for (li.toFirst();(dl=li.current());++li)
{ {
Definition *d = dl->first(); Definition *d = dl->first();
...@@ -2544,8 +2545,18 @@ void writeSearchIndex() ...@@ -2544,8 +2545,18 @@ void writeSearchIndex()
MemberDef *md = 0; MemberDef *md = 0;
bool isMemberDef = d->definitionType()==Definition::TypeMember; bool isMemberDef = d->definitionType()==Definition::TypeMember;
if (isMemberDef) md = (MemberDef*)d; if (isMemberDef) md = (MemberDef*)d;
t << " <a class=\"SRSymbol\" href=\"../" << t << " <a id=\"Item" << itemCount << "\" "
d->getOutputFileBase() << Doxygen::htmlFileExtension; << "onkeydown=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
<< "onkeypress=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
<< "onkeyup=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
// << "onkeydown=\"return true\" "
// << "onkeypress=\""
// << "return searchResults.Nav(event," << itemCount << ")\" "
<< "class=\"SRSymbol\" href=\"../"
<< d->getOutputFileBase() << Doxygen::htmlFileExtension;
if (isMemberDef) if (isMemberDef)
{ {
t << "#" << ((MemberDef *)d)->anchor(); t << "#" << ((MemberDef *)d)->anchor();
...@@ -2575,7 +2586,18 @@ void writeSearchIndex() ...@@ -2575,7 +2586,18 @@ void writeSearchIndex()
} }
else // multiple items with the same name else // multiple items with the same name
{ {
t << " <a class=\"SRSymbol\" href=\"javascript:searchResults.Toggle('SR_" t << " <a id=\"Item" << itemCount << "\" "
<< "onkeydown=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
<< "onkeypress=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
<< "onkeyup=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
// << "onkeydown=\"return true\" "
// << "onkeypress=\""
// << "return searchResults.Nav(event," << itemCount << ")\" "
<< "class=\"SRSymbol\" "
<< "href=\"javascript:searchResults.Toggle('SR_"
<< searchId(d->localName()) << "')\">" << searchId(d->localName()) << "')\">"
<< convertToXML(d->localName()) << "</a>" << endl; << convertToXML(d->localName()) << "</a>" << endl;
t << " <div class=\"SRChildren\">" << endl; t << " <div class=\"SRChildren\">" << endl;
...@@ -2583,6 +2605,7 @@ void writeSearchIndex() ...@@ -2583,6 +2605,7 @@ void writeSearchIndex()
QListIterator<Definition> di(*dl); QListIterator<Definition> di(*dl);
bool overloadedFunction = FALSE; bool overloadedFunction = FALSE;
Definition *prevScope = 0; Definition *prevScope = 0;
int childCount=0;
for (di.toFirst();(d=di.current());) for (di.toFirst();(d=di.current());)
{ {
++di; ++di;
...@@ -2594,7 +2617,22 @@ void writeSearchIndex() ...@@ -2594,7 +2617,22 @@ void writeSearchIndex()
if (isMemberDef) md = (MemberDef*)d; if (isMemberDef) md = (MemberDef*)d;
if (next) nextScope = next->getOuterScope(); if (next) nextScope = next->getOuterScope();
t << " <a class=\"SRScope\" href=\"../" << t << " <a id=\"Item" << itemCount << "_c"
<< childCount << "\" "
<< "onkeydown=\""
<< "return searchResults.NavChild(event,"
<< itemCount << "," << childCount << ")\" "
<< "onkeypress=\""
<< "return searchResults.NavChild(event,"
<< itemCount << "," << childCount << ")\" "
<< "onkeyup=\""
<< "return searchResults.NavChild(event,"
<< itemCount << "," << childCount << ")\" "
// << "onkeydown=\"return true\" "
// << "onkeypress=\""
// << "return searchResults.NavChild(event,"
// << itemCount << "," << childCount << ")\" "
<< "class=\"SRScope\" href=\"../" <<
d->getOutputFileBase() << Doxygen::htmlFileExtension; d->getOutputFileBase() << Doxygen::htmlFileExtension;
if (isMemberDef) if (isMemberDef)
{ {
...@@ -2663,11 +2701,13 @@ void writeSearchIndex() ...@@ -2663,11 +2701,13 @@ void writeSearchIndex()
} }
t << "</a>" << endl; t << "</a>" << endl;
prevScope = scope; prevScope = scope;
childCount++;
} }
t << " </div>" << endl; // SRChildren t << " </div>" << endl; // SRChildren
} }
t << " </div>" << endl; // SREntry t << " </div>" << endl; // SREntry
t << "</div>" << endl; // SRResult t << "</div>" << endl; // SRResult
itemCount++;
} }
// TODO: translate "Searching" // TODO: translate "Searching"
t << "<div class=\"SRStatus\" id=\"Searching\">Searching...</div>" << endl; t << "<div class=\"SRStatus\" id=\"Searching\">Searching...</div>" << endl;
...@@ -2709,23 +2749,40 @@ void writeSearchIndex() ...@@ -2709,23 +2749,40 @@ void writeSearchIndex()
t << "var indexSectionsWithContent =" << endl; t << "var indexSectionsWithContent =" << endl;
t << "{" << endl; t << "{" << endl;
bool first=TRUE; bool first=TRUE;
int j=0;
for (i=0;i<NUM_SEARCH_INDICES;i++) for (i=0;i<NUM_SEARCH_INDICES;i++)
{ {
if (g_searchIndexCount[i]>0) if (g_searchIndexCount[i]>0)
{ {
if (!first) t << "," << endl; if (!first) t << "," << endl;
t << " \"" << g_searchIndexName[i] << "\": \""; t << " " << j << ": \"";
for (p=32;p<MEMBER_INDEX_ENTRIES;p++) for (p=32;p<MEMBER_INDEX_ENTRIES;p++)
{ {
t << (g_searchIndexSymbols[i][p].count()>0 ? "1" : "0"); t << (g_searchIndexSymbols[i][p].count()>0 ? "1" : "0");
} }
t << "\""; t << "\"";
first=FALSE; first=FALSE;
j++;
}
}
if (!first) t << "\n";
t << "};" << endl << endl;
t << "var indexSectionNames =" << endl;
t << "{" << endl;
first=TRUE;
j=0;
for (i=0;i<NUM_SEARCH_INDICES;i++)
{
if (g_searchIndexCount[i]>0)
{
if (!first) t << "," << endl;
t << " " << j << ": \"" << g_searchIndexName[i] << "\"";
first=FALSE;
j++;
} }
} }
if (!first) t << "\n"; if (!first) t << "\n";
t << "};" << endl << endl; t << "};" << endl << endl;
t << search_script; t << search_script;
} }
} }
...@@ -2768,8 +2825,7 @@ void writeSearchCategories(QTextStream &t) ...@@ -2768,8 +2825,7 @@ void writeSearchCategories(QTextStream &t)
if (g_searchIndexCount[i]>0) if (g_searchIndexCount[i]>0)
{ {
t << "<a class=\"SelectItem\" href=\"javascript:void(0)\" " t << "<a class=\"SelectItem\" href=\"javascript:void(0)\" "
<< "onclick=\"searchBox.OnSelectItem(" << j << ",'" << "onclick=\"searchBox.OnSelectItem(" << j << ")\">"
<< g_searchIndexName[i] << "')\">"
<< "<span class=\"SelectionMark\">&nbsp;</span>" << "<span class=\"SelectionMark\">&nbsp;</span>"
<< convertToXML(map.categoryLabel[i]) << convertToXML(map.categoryLabel[i])
<< "</a>"; << "</a>";
......
...@@ -793,9 +793,9 @@ void LatexGenerator::endIndexSection(IndexSections is) ...@@ -793,9 +793,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
if (isFirst) if (isFirst)
{ {
t << "}\n\\input{" << fd->getOutputFileBase() << "}\n"; t << "}\n\\input{" << fd->getOutputFileBase() << "}\n";
if (sourceBrowser && m_prettyCode) if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
{ {
t << "\\input{" << fd->getSourceFileBase() << "}\n"; t << "\\include{" << fd->getSourceFileBase() << "}\n";
} }
isFirst=FALSE; isFirst=FALSE;
} }
...@@ -803,10 +803,9 @@ void LatexGenerator::endIndexSection(IndexSections is) ...@@ -803,10 +803,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
{ {
if (compactLatex) t << "\\input" ; else t << "\\include"; if (compactLatex) t << "\\input" ; else t << "\\include";
t << "{" << fd->getOutputFileBase() << "}\n"; t << "{" << fd->getOutputFileBase() << "}\n";
if (sourceBrowser && m_prettyCode) if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
{ {
if (compactLatex) t << "\\input" ; else t << "\\include"; t << "\\include{" << fd->getSourceFileBase() << "}\n";
t << "{" << fd->getSourceFileBase() << "}\n";
} }
} }
} }
......
...@@ -88,6 +88,7 @@ HEADERS = bufstr.h \ ...@@ -88,6 +88,7 @@ HEADERS = bufstr.h \
pyscanner.h \ pyscanner.h \
fortrancode.h \ fortrancode.h \
fortranscanner.h \ fortranscanner.h \
dbusxmlscanner.h \
qhp.h \ qhp.h \
qhpxmlwriter.h \ qhpxmlwriter.h \
qtbc.h \ qtbc.h \
...@@ -231,6 +232,7 @@ SOURCES = ce_lex.cpp \ ...@@ -231,6 +232,7 @@ SOURCES = ce_lex.cpp \
vhdlscanner.cpp \ vhdlscanner.cpp \
xmldocvisitor.cpp \ xmldocvisitor.cpp \
xmlgen.cpp \ xmlgen.cpp \
dbusxmlscanner.cpp \
win32:TMAKE_CXXFLAGS += -DQT_NODLL win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-msvc:TMAKE_CXXFLAGS += -Zm200 win32-msvc:TMAKE_CXXFLAGS += -Zm200
......
...@@ -368,3 +368,8 @@ int portable_pclose(FILE *stream) ...@@ -368,3 +368,8 @@ int portable_pclose(FILE *stream)
return pclose(stream); return pclose(stream);
} }
double portable_getSysElapsedTime()
{
return sysElapsedTime;
}
...@@ -28,6 +28,7 @@ const char * portable_commandExtension(); ...@@ -28,6 +28,7 @@ const char * portable_commandExtension();
bool portable_fileSystemIsCaseSensitive(); bool portable_fileSystemIsCaseSensitive();
FILE * portable_popen(const char *name,const char *type); FILE * portable_popen(const char *name,const char *type);
int portable_pclose(FILE *stream); int portable_pclose(FILE *stream);
double portable_getSysElapsedTime();
extern "C" { extern "C" {
void * portable_iconv_open(const char* tocode, const char* fromcode); void * portable_iconv_open(const char* tocode, const char* fromcode);
......
...@@ -104,6 +104,7 @@ static QCString g_blockName; ...@@ -104,6 +104,7 @@ static QCString g_blockName;
static int g_condCtx; static int g_condCtx;
static bool g_skip; static bool g_skip;
static QStack<bool> g_condStack; static QStack<bool> g_condStack;
static bool g_insideCS; // C# has simpler preprocessor
static bool g_lexInit = FALSE; static bool g_lexInit = FALSE;
...@@ -118,6 +119,7 @@ static void setFileName(const char *name) ...@@ -118,6 +119,7 @@ static void setFileName(const char *name)
g_yyFileName=convertToQCString(fi.absFilePath()); g_yyFileName=convertToQCString(fi.absFilePath());
g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig); g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig);
if (g_yyFileDef && g_yyFileDef->isReference()) g_yyFileDef=0; if (g_yyFileDef && g_yyFileDef->isReference()) g_yyFileDef=0;
g_insideCS = g_yyFileName.right(3)==".cs";
} }
static void incrLevel() static void incrLevel()
...@@ -1817,7 +1819,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1817,7 +1819,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_insideComment=FALSE; g_insideComment=FALSE;
BEGIN(DefineText); BEGIN(DefineText);
} }
<DefName>{ID}/{B}*"\n" { <DefName>{ID}/{B}*"\n" { // bare define
g_argDict = 0; g_argDict = 0;
g_defArgs = -1; g_defArgs = -1;
g_defName = yytext; g_defName = yytext;
...@@ -1831,6 +1833,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1831,6 +1833,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
outputArray(tmp.data(),tmp.length()); outputArray(tmp.data(),tmp.length());
g_quoteArg=FALSE; g_quoteArg=FALSE;
g_insideComment=FALSE; g_insideComment=FALSE;
if (g_insideCS) g_defText="1"; // for C#, use "1" as define text
BEGIN(DefineText); BEGIN(DefineText);
} }
else // define is a guard => hide else // define is a guard => hide
......
...@@ -1713,6 +1713,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1713,6 +1713,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
} }
<FindMemberName>{SCOPENAME}{BN}*/"<" { <FindMemberName>{SCOPENAME}{BN}*/"<" {
sharpCount=0; sharpCount=0;
roundCount=0;
lineCount(); lineCount();
current->name+=((QCString)yytext).stripWhiteSpace(); current->name+=((QCString)yytext).stripWhiteSpace();
//current->memberSpec.resize(0); //current->memberSpec.resize(0);
...@@ -1722,7 +1723,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1722,7 +1723,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
else else
BEGIN( EndTemplate ); BEGIN( EndTemplate );
} }
<EndTemplate>"<<" { <ClassTemplSpec,EndTemplate>"<<" {
current->name+=yytext; current->name+=yytext;
// *currentTemplateSpec+=yytext; // *currentTemplateSpec+=yytext;
} }
...@@ -1731,8 +1732,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1731,8 +1732,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
// *currentTemplateSpec+='<'; // *currentTemplateSpec+='<';
sharpCount++; sharpCount++;
} }
<EndTemplate>">>" { <ClassTemplSpec,EndTemplate>">>" {
if (insideJava || insideCS || insideCli) if (insideJava || insideCS || insideCli || roundCount==0)
{ {
unput('>'); unput('>');
unput(' '); unput(' ');
...@@ -1781,6 +1782,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1781,6 +1782,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
BEGIN(FindMemberName); BEGIN(FindMemberName);
} }
} }
<ClassTemplSpec,EndTemplate>"(" { current->name+=*yytext;
roundCount++;
}
<ClassTemplSpec,EndTemplate>")" { current->name+=*yytext;
if (roundCount>0) roundCount--;
}
<EndTemplate>. { <EndTemplate>. {
current->name+=*yytext; current->name+=*yytext;
// *currentTemplateSpec+=*yytext; // *currentTemplateSpec+=*yytext;
...@@ -4132,7 +4139,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -4132,7 +4139,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
current->doc.resize(0); current->doc.resize(0);
} }
#endif #endif
if (current->sli) // copy special list items if (current->sli && previous) // copy special list items
{ {
QListIterator<ListItemInfo> li(*current->sli); QListIterator<ListItemInfo> li(*current->sli);
ListItemInfo *lii; ListItemInfo *lii;
...@@ -4315,6 +4322,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -4315,6 +4322,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
} }
else // C++ template specialization else // C++ template specialization
{ {
roundCount=0;
BEGIN( ClassTemplSpec ); BEGIN( ClassTemplSpec );
} }
} }
...@@ -4770,9 +4778,22 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -4770,9 +4778,22 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
{ {
REJECT; REJECT;
} }
else // for C++ >> is a bitshift operator and > > would end a nested template else // for C++ >> is a bitshift
// operator and > > would end
// a nested template.
// We require the bitshift to be enclosed in braces.
// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
{ {
*specName += yytext; if (roundCount>0)
{
*specName += yytext;
}
else
{
unput('>');
unput(' ');
unput('>');
}
} }
} }
<Specialization>"typename"{BN}+ { lineCount(); } <Specialization>"typename"{BN}+ { lineCount(); }
......
...@@ -17,11 +17,12 @@ ...@@ -17,11 +17,12 @@
color: #999999; color: #999999;
background-color: #FFFFFF; background-color: #FFFFFF;
font-style: normal; font-style: normal;
cursor: pointer; cursor: text;
padding: 0px 1px; padding: 0px 1px;
margin: 0px 6px 0px 0px; margin: 0px 6px 0px 0px;
border: none; border: none;
outline: none; outline: none;
vertical-align: middle;
} }
#MSearchBox.MSearchBoxInactive:hover #MSearchField { #MSearchBox.MSearchBoxInactive:hover #MSearchField {
background-color: #FFFFFF; background-color: #FFFFFF;
...@@ -41,14 +42,26 @@ ...@@ -41,14 +42,26 @@
display : inline; display : inline;
background : none; background : none;
font: 9pt Verdana, sans-serif; font: 9pt Verdana, sans-serif;
margin-right: -6px;
padding: 0;
border: none; border: none;
margin: 0px 0px 0px 6px; margin: 0px 0px 0px 6px;
vertical-align: bottom; vertical-align: middle;
padding: 0px 0px;
}
#MSearchClose {
float : none;
display : none;
background : none;
border: none;
margin: 0px 4px 0px 0px;
padding: 0px 0px; padding: 0px 0px;
background-color: #84B0C7; outline: none;
}
#MSearchCloseImg {
vertical-align: middle;
} }
.MSearchBoxLeft { .MSearchBoxLeft {
display: block; display: block;
text-align: left; text-align: left;
...@@ -108,7 +121,7 @@ a.SelectItem { ...@@ -108,7 +121,7 @@ a.SelectItem {
padding-left: 6px; padding-left: 6px;
padding-right: 12px; padding-right: 12px;
} }
a.SelectItem:visited, a.SelectItem:focus,
a.SelectItem:active { a.SelectItem:active {
color: #000000; color: #000000;
outline-style: none; outline-style: none;
...@@ -136,26 +149,6 @@ iframe#MSearchResults { ...@@ -136,26 +149,6 @@ iframe#MSearchResults {
border: 1px solid #000000; border: 1px solid #000000;
background-color: #EEF3F5; background-color: #EEF3F5;
} }
#MSearchResultsWindowClose {
font-weight: bold;
font-size: 8pt;
display: block;
padding: 0px;
margin: 0px;
text-align: right;
text-decoration: none;
outline-style: none;
}
#MSearchResultsWindowClose:link,
#MSearchResultsWindowClose:visited {
color: #8A8A8A;
background-color: #8A8A8A;
}
#MSearchResultsWindowClose:active,
#MSearchResultsWindowClose:hover {
color: #9E9E9E;
background-color: #9E9E9E;
}
/* ----------------------------------- */ /* ----------------------------------- */
...@@ -198,6 +191,11 @@ a.SRScope { ...@@ -198,6 +191,11 @@ a.SRScope {
outline: none; outline: none;
} }
a.SRSymbol:focus, a.SRSymbol:active,
a.SRScope:focus, a.SRScope:active {
text-decoration: underline;
}
.SRPage .SRStatus { .SRPage .SRStatus {
padding: 2px 5px; padding: 2px 5px;
font-size: 8pt; font-size: 8pt;
......
This diff is collapsed.
...@@ -17,11 +17,12 @@ ...@@ -17,11 +17,12 @@
" color: #999999;\n" " color: #999999;\n"
" background-color: #FFFFFF;\n" " background-color: #FFFFFF;\n"
" font-style: normal;\n" " font-style: normal;\n"
" cursor: pointer;\n" " cursor: text;\n"
" padding: 0px 1px;\n" " padding: 0px 1px;\n"
" margin: 0px 6px 0px 0px;\n" " margin: 0px 6px 0px 0px;\n"
" border: none;\n" " border: none;\n"
" outline: none;\n" " outline: none;\n"
" vertical-align: middle;\n"
"}\n" "}\n"
"#MSearchBox.MSearchBoxInactive:hover #MSearchField {\n" "#MSearchBox.MSearchBoxInactive:hover #MSearchField {\n"
" background-color: #FFFFFF;\n" " background-color: #FFFFFF;\n"
...@@ -41,14 +42,26 @@ ...@@ -41,14 +42,26 @@
" display : inline;\n" " display : inline;\n"
" background : none;\n" " background : none;\n"
" font: 9pt Verdana, sans-serif;\n" " font: 9pt Verdana, sans-serif;\n"
" margin-right: -6px;\n"
" padding: 0;\n"
" border: none;\n" " border: none;\n"
" margin: 0px 0px 0px 6px;\n" " margin: 0px 0px 0px 6px;\n"
" vertical-align: bottom;\n" " vertical-align: middle;\n"
" padding: 0px 0px;\n"
"}\n"
"\n"
"#MSearchClose {\n"
" float : none;\n"
" display : none;\n"
" background : none;\n"
" border: none;\n"
" margin: 0px 4px 0px 0px;\n"
" padding: 0px 0px;\n" " padding: 0px 0px;\n"
" background-color: #84B0C7;\n" " outline: none;\n"
"}\n"
"\n"
"#MSearchCloseImg {\n"
" vertical-align: middle;\n"
"}\n" "}\n"
"\n"
".MSearchBoxLeft {\n" ".MSearchBoxLeft {\n"
" display: block;\n" " display: block;\n"
" text-align: left;\n" " text-align: left;\n"
...@@ -108,7 +121,7 @@ ...@@ -108,7 +121,7 @@
" padding-left: 6px;\n" " padding-left: 6px;\n"
" padding-right: 12px;\n" " padding-right: 12px;\n"
"}\n" "}\n"
"a.SelectItem:visited,\n" "a.SelectItem:focus,\n"
"a.SelectItem:active {\n" "a.SelectItem:active {\n"
" color: #000000; \n" " color: #000000; \n"
" outline-style: none;\n" " outline-style: none;\n"
...@@ -136,26 +149,6 @@ ...@@ -136,26 +149,6 @@
" border: 1px solid #000000;\n" " border: 1px solid #000000;\n"
" background-color: #EEF3F5;\n" " background-color: #EEF3F5;\n"
" }\n" " }\n"
"#MSearchResultsWindowClose {\n"
" font-weight: bold;\n"
" font-size: 8pt;\n"
" display: block;\n"
" padding: 0px;\n"
" margin: 0px;\n"
" text-align: right;\n"
" text-decoration: none;\n"
" outline-style: none;\n"
" }\n"
"#MSearchResultsWindowClose:link,\n"
"#MSearchResultsWindowClose:visited {\n"
" color: #8A8A8A;\n"
" background-color: #8A8A8A;\n"
" }\n"
"#MSearchResultsWindowClose:active,\n"
"#MSearchResultsWindowClose:hover {\n"
" color: #9E9E9E;\n"
" background-color: #9E9E9E;\n"
" }\n"
"\n" "\n"
"/* ----------------------------------- */\n" "/* ----------------------------------- */\n"
"\n" "\n"
...@@ -198,6 +191,11 @@ ...@@ -198,6 +191,11 @@
" outline: none;\n" " outline: none;\n"
"}\n" "}\n"
"\n" "\n"
"a.SRSymbol:focus, a.SRSymbol:active,\n"
"a.SRScope:focus, a.SRScope:active {\n"
" text-decoration: underline;\n"
"}\n"
"\n"
".SRPage .SRStatus {\n" ".SRPage .SRStatus {\n"
" padding: 2px 5px;\n" " padding: 2px 5px;\n"
" font-size: 8pt;\n" " font-size: 8pt;\n"
......
This diff is collapsed.
...@@ -305,7 +305,8 @@ int guessSection(const char *name) ...@@ -305,7 +305,8 @@ int guessSection(const char *name)
n.right(4)==".ixx" || n.right(4)==".ixx" ||
n.right(4)==".ipp" || n.right(4)==".ipp" ||
n.right(4)==".i++" || n.right(4)==".i++" ||
n.right(4)==".inl" n.right(4)==".inl" ||
n.right(4)==".xml"
) return Entry::SOURCE_SEC; ) return Entry::SOURCE_SEC;
if (n.right(2)==".h" || // header if (n.right(2)==".h" || // header
n.right(3)==".hh" || n.right(3)==".hh" ||
...@@ -6069,22 +6070,6 @@ static void latin2ToLatex(QTextStream &t,unsigned char c) ...@@ -6069,22 +6070,6 @@ static void latin2ToLatex(QTextStream &t,unsigned char c)
void filterLatexString(QTextStream &t,const char *str, void filterLatexString(QTextStream &t,const char *str,
bool insideTabbing,bool insidePre,bool insideItem) bool insideTabbing,bool insidePre,bool insideItem)
{ {
#if 0
static bool isCzech = theTranslator->idLanguage()=="czech";
static bool isSerbian = theTranslator->idLanguage()=="serbian";
static bool isJapanese = theTranslator->idLanguage()=="japanese" ||
theTranslator->idLanguage()=="japanese-en";
static bool isKorean = theTranslator->idLanguage()=="korean" ||
theTranslator->idLanguage()=="korean-en";
static bool isRussian = theTranslator->idLanguage()=="russian";
static bool isUkrainian = theTranslator->idLanguage()=="ukrainian";
static bool isSlovene = theTranslator->idLanguage()=="solvene";
static bool isChinese = theTranslator->idLanguage()=="chinese" ||
theTranslator->idLanguage()=="chinese-traditional";
static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2";
static bool isGreek = theTranslator->idLanguage()=="greek";
//printf("filterLatexString(%s)\n",str);
#endif
if (str) if (str)
{ {
const unsigned char *p=(const unsigned char *)str; const unsigned char *p=(const unsigned char *)str;
...@@ -6104,25 +6089,6 @@ void filterLatexString(QTextStream &t,const char *str, ...@@ -6104,25 +6089,6 @@ void filterLatexString(QTextStream &t,const char *str,
case '_': t << "\\_"; break; case '_': t << "\\_"; break;
default: default:
t << (char)c; t << (char)c;
#if 0
{
// Some languages use wide characters
if (c>=128 && (isJapanese || isKorean || isChinese || isSerbian))
{
t << (char)c;
if (*p)
{
c = *p++;
t << (char)c;
}
}
else
{
t << (char)c;
}
break;
}
#endif
} }
} }
else else
...@@ -6155,10 +6121,7 @@ void filterLatexString(QTextStream &t,const char *str, ...@@ -6155,10 +6121,7 @@ void filterLatexString(QTextStream &t,const char *str,
else else
t << "]"; t << "]";
break; break;
case '-': if (*p=='>') case '-': t << "-\\/";
{ t << " $\\rightarrow$ "; p++; }
else
{ t << (char)c; }
break; break;
case '\\': if (*p=='<') case '\\': if (*p=='<')
{ t << "$<$"; p++; } { t << "$<$"; p++; }
...@@ -6445,6 +6408,7 @@ g_lang2extMap[] = ...@@ -6445,6 +6408,7 @@ g_lang2extMap[] =
{ "python", "python", SrcLangExt_Python }, { "python", "python", SrcLangExt_Python },
{ "fortran", "fortran", SrcLangExt_F90 }, { "fortran", "fortran", SrcLangExt_F90 },
{ "vhdl", "vhdl", SrcLangExt_VHDL }, { "vhdl", "vhdl", SrcLangExt_VHDL },
{ "dbusxml", "dbusxml", SrcLangExt_XML },
{ 0, 0, (SrcLangExt)0 } { 0, 0, (SrcLangExt)0 }
}; };
...@@ -6507,6 +6471,7 @@ void initDefaultExtensionMapping() ...@@ -6507,6 +6471,7 @@ void initDefaultExtensionMapping()
updateLanguageMapping(".f90", "fortran"); updateLanguageMapping(".f90", "fortran");
updateLanguageMapping(".vhd", "vhdl"); updateLanguageMapping(".vhd", "vhdl");
updateLanguageMapping(".vhdl", "vhdl"); updateLanguageMapping(".vhdl", "vhdl");
updateLanguageMapping(".xml", "dbusxml");
} }
SrcLangExt getLanguageFromFileName(const QCString fileName) SrcLangExt getLanguageFromFileName(const QCString fileName)
......
...@@ -95,7 +95,8 @@ enum SrcLangExt ...@@ -95,7 +95,8 @@ enum SrcLangExt
SrcLangExt_JS = 0x0400, SrcLangExt_JS = 0x0400,
SrcLangExt_Python = 0x0800, SrcLangExt_Python = 0x0800,
SrcLangExt_F90 = 0x1000, SrcLangExt_F90 = 0x1000,
SrcLangExt_VHDL = 0x2000 SrcLangExt_VHDL = 0x2000,
SrcLangExt_XML = 0x4000
}; };
//-------------------------------------------------------------------- //--------------------------------------------------------------------
......
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