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
(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.
......@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (22 June 2009)
Dimitri van Heesch (dimitri@stack.nl) (20 July 2009)
......@@ -10,16 +10,16 @@
# See the GNU General Public License for more details.
#
QMAKE = qmake
QMAKE=qmake
all: Makefile.doxywizard
$(MAKE) -f Makefile.doxywizard
Makefile.doxywizard: doxywizard.pro
$(QTDIR)/bin/qmake doxywizard.pro -o Makefile.doxywizard
$(QMAKE) doxywizard.pro -o Makefile.doxywizard
qmake:
$(QTDIR)/bin/qmake doxywizard.pro -o Makefile.doxywizard
$(QMAKE) doxywizard.pro -o Makefile.doxywizard
clean: Makefile.doxywizard
$(MAKE) -f Makefile.doxywizard clean
......
......@@ -20,7 +20,7 @@ doxygen_version_minor=5
doxygen_version_revision=9
#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"`
......
......@@ -1431,6 +1431,26 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
If non-empty doxygen will try to run qhelpgenerator on the generated
.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
<dt>\c QTHELP_FILE <dd>
......@@ -1488,7 +1508,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
the \ref cfg_project_name "project name".
\anchor cfg_use_inline_trees
<dt>\c USE_INLINE_TREES
<dt>\c USE_INLINE_TREES <dd>
\addindex USE_INLINE_TREES
By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
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
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>
<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 @@
Installdox is a perl script that is generated by doxygen whenever
tag files are used (See \c TAGFILES
in section \ref config_extref)
or the search engine is enabled (See \c SEARCHENGINE
in section \ref config_search). The script is
in section \ref config_extref). The script is
located in the same directory where the HTML files are located.
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
at install time.
for each tag file at install time.
Calling \c installdox with option <b>-h</b> at the command line
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
generated output).
Some of the features the HTML section (such as
\ref cfg_generate_treeview "GENERATE_TREEVIEW") 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).
\ref cfg_generate_treeview "GENERATE_TREEVIEW" or the search engine)
require a browser that supports DHTML and Javascript.
\subsection latex_out LaTeX output
\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 =
QHG_LOCATION =
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES
GENERATE_TREEVIEW = NO
USE_INLINE_TREES = NO
TREEVIEW_WIDTH = 250
FORMULA_FONTSIZE = 10
SEARCHENGINE = YES
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = NO
GENERATE_LATEX = YES
LATEX_OUTPUT =
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
......@@ -164,11 +165,11 @@ COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
PDF_HYPERLINKS = NO
USE_PDFLATEX = NO
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
LATEX_SOURCE_CODE = NO
LATEX_SOURCE_CODE = YES
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
......@@ -254,7 +255,3 @@ DOT_TRANSPARENT = YES
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Options related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = YES
......@@ -348,7 +348,7 @@ void replaceComment(int offset);
copyToOutput(yytext,yyleng);
BEGIN(CComment);
}
<Scan>"##" {
<Scan>"#"("#")? {
if (g_lang!=SrcLangExt_Python)
{
REJECT;
......
......@@ -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 force them to be regenerated.
' 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 name='LaTeX' docs='configuration options related to the LaTeX output'>
<option type='bool' id='GENERATE_LATEX' docs='
......@@ -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
the various graphs.
' 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='USE_WINDOWS_ENCODING'/>
<option type='obsolete' id='DETAILS_AT_TOP'/>
......
......@@ -1323,6 +1323,16 @@ void addConfigOptions(Config *cfg)
8,50,10
);
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");
//---------------------------------------------------------------------------
......@@ -2072,17 +2082,6 @@ void addConfigOptions(Config *cfg)
TRUE
);
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");
//----
......
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
{
public:
CompAccept() { m_children.setAutoDelete(TRUE); }
virtual ~CompAccept() {}
void accept(T *obj, DocVisitor *v)
{
v->visitPre(obj);
......
......@@ -263,6 +263,7 @@ void DocSets::addIndexItem(const char *, const char *,
case SrcLangExt_Python: lang="python"; break; // Python
case SrcLangExt_F90: lang="fortran"; break; // Fortran
case SrcLangExt_VHDL: lang="vhdl"; break; // VHDL
case SrcLangExt_XML: lang="xml"; break; // DBUS XML
}
// determine scope
......
......@@ -71,6 +71,7 @@
#include "htags.h"
#include "pyscanner.h"
#include "fortranscanner.h"
#include "dbusxmlscanner.h"
#include "code.h"
#include "objcache.h"
#include "store.h"
......@@ -122,7 +123,6 @@ QTextStream Doxygen::tagFile;
NamespaceDef *Doxygen::globalScope = 0;
QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross-referenced item lists
bool Doxygen::parseSourcesNeeded = FALSE;
double Doxygen::sysElapsedTime = 0.0;
QTime Doxygen::runningTime;
//SearchIndex * Doxygen::searchIndex=0;
QDict<DefinitionIntf> *Doxygen::symbolMap;
......@@ -2924,10 +2924,23 @@ static void buildFunctionList(EntryNav *rootNav)
//printf("matching arguments for %s%s %s%s\n",
// md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
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 (
matchArguments2(md->getOuterScope(),mfd,mdAl.pointer(),
rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
FALSE)
FALSE) &&
sameNumTemplateArgs
)
{
GroupDef *gd=0;
......@@ -4931,6 +4944,22 @@ static bool findGlobalMember(EntryNav *rootNav,
rnd ? rnd : Doxygen::globalScope,fd,root->argList,
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",
// argListToString(md->argumentList()).data(),
// argListToString(root->argList).data());
......@@ -6572,7 +6601,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
SrcLangExt sle;
if (rootNav->fileDef() &&
( (sle=getLanguageFromFileName(rootNav->fileDef()->name()))==SrcLangExt_CSharp
|| sle==SrcLangExt_Java
|| sle==SrcLangExt_Java || sle==SrcLangExt_XML
)
)
{
......@@ -9128,6 +9157,7 @@ void initDoxygen()
Doxygen::parserManager->registerParser("python", new PythonLanguageScanner);
Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner);
Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner);
Doxygen::parserManager->registerParser("dbusxml", new DBusXMLScanner);
// register any additional parsers here...
......@@ -10539,7 +10569,7 @@ void generateOutput()
{
msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n",
((double)Doxygen::runningTime.elapsed())/1000.0,
Doxygen::sysElapsedTime
portable_getSysElapsedTime()
);
}
......
......@@ -111,7 +111,6 @@ class Doxygen
static QDict<RefList> *xrefLists; // array of xref lists: todo, test, bug, deprecated ...
static QCString htmlFileExtension;
static bool parseSourcesNeeded;
static double sysElapsedTime;
static QTime runningTime;
//static SearchIndex *searchIndex;
static QDict<DefinitionIntf> *symbolMap;
......
......@@ -171,7 +171,7 @@ static int yyread(char *buf,int max_size);
static void startCommentBlock(bool);
static void handleCommentBlock(const QCString &doc,bool brief);
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 addInterface(QCString name);
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
%x Start
%x Comment
%x Module
%x Program
%x ModuleBody
%x ModuleBodyContains
%x AttributeList
......@@ -437,7 +438,10 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
/*------ module handling ------------------------------------------------------------*/
<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;
}
<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
yy_pop_state();
}
<Module>{ID} {
addModule(yytext);
addModule(yytext, TRUE);
BEGIN(ModuleBody);
}
<Program>{ID} {
addModule(yytext, FALSE);
BEGIN(ModuleBody);
}
......@@ -1468,11 +1477,15 @@ static void addCurrentEntry()
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);
current->section = Entry::NAMESPACE_SEC;
if (isModule)
current->section = Entry::NAMESPACE_SEC;
else
current->section = Entry::FUNCTION_SEC;
if (name!=NULL)
{
current->name = name;
......
......@@ -731,10 +731,12 @@ void FTVHelp::generateTreeView(QString* OutString)
t << " --></script>\n";
t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\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 << " onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
t << " onkeyup=\"searchBox.OnSearchFieldChange()\"/>\n";
t << " onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
t << " </span><span class=\"MSearchBoxRight\">\n";
t << " <img id=\"MSearchSelect\" src=\"search/search.png\"\n";
t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
......
This diff is collapsed.
......@@ -2532,6 +2532,7 @@ void writeSearchIndex()
SDict<QList<Definition> >::Iterator li(g_searchIndexSymbols[i][p]);
QList<Definition> *dl;
int itemCount=0;
for (li.toFirst();(dl=li.current());++li)
{
Definition *d = dl->first();
......@@ -2544,8 +2545,18 @@ void writeSearchIndex()
MemberDef *md = 0;
bool isMemberDef = d->definitionType()==Definition::TypeMember;
if (isMemberDef) md = (MemberDef*)d;
t << " <a class=\"SRSymbol\" href=\"../" <<
d->getOutputFileBase() << Doxygen::htmlFileExtension;
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=\"../"
<< d->getOutputFileBase() << Doxygen::htmlFileExtension;
if (isMemberDef)
{
t << "#" << ((MemberDef *)d)->anchor();
......@@ -2575,7 +2586,18 @@ void writeSearchIndex()
}
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()) << "')\">"
<< convertToXML(d->localName()) << "</a>" << endl;
t << " <div class=\"SRChildren\">" << endl;
......@@ -2583,6 +2605,7 @@ void writeSearchIndex()
QListIterator<Definition> di(*dl);
bool overloadedFunction = FALSE;
Definition *prevScope = 0;
int childCount=0;
for (di.toFirst();(d=di.current());)
{
++di;
......@@ -2594,7 +2617,22 @@ void writeSearchIndex()
if (isMemberDef) md = (MemberDef*)d;
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;
if (isMemberDef)
{
......@@ -2663,11 +2701,13 @@ void writeSearchIndex()
}
t << "</a>" << endl;
prevScope = scope;
childCount++;
}
t << " </div>" << endl; // SRChildren
}
t << " </div>" << endl; // SREntry
t << "</div>" << endl; // SRResult
itemCount++;
}
// TODO: translate "Searching"
t << "<div class=\"SRStatus\" id=\"Searching\">Searching...</div>" << endl;
......@@ -2709,23 +2749,40 @@ void writeSearchIndex()
t << "var indexSectionsWithContent =" << endl;
t << "{" << endl;
bool first=TRUE;
int j=0;
for (i=0;i<NUM_SEARCH_INDICES;i++)
{
if (g_searchIndexCount[i]>0)
{
if (!first) t << "," << endl;
t << " \"" << g_searchIndexName[i] << "\": \"";
t << " " << j << ": \"";
for (p=32;p<MEMBER_INDEX_ENTRIES;p++)
{
t << (g_searchIndexSymbols[i][p].count()>0 ? "1" : "0");
}
t << "\"";
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";
t << "};" << endl << endl;
t << search_script;
}
}
......@@ -2768,8 +2825,7 @@ void writeSearchCategories(QTextStream &t)
if (g_searchIndexCount[i]>0)
{
t << "<a class=\"SelectItem\" href=\"javascript:void(0)\" "
<< "onclick=\"searchBox.OnSelectItem(" << j << ",'"
<< g_searchIndexName[i] << "')\">"
<< "onclick=\"searchBox.OnSelectItem(" << j << ")\">"
<< "<span class=\"SelectionMark\">&nbsp;</span>"
<< convertToXML(map.categoryLabel[i])
<< "</a>";
......
......@@ -793,9 +793,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
if (isFirst)
{
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;
}
......@@ -803,10 +803,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
if (compactLatex) t << "\\input" ; else t << "\\include";
t << "{" << fd->getOutputFileBase() << "}\n";
if (sourceBrowser && m_prettyCode)
if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
{
if (compactLatex) t << "\\input" ; else t << "\\include";
t << "{" << fd->getSourceFileBase() << "}\n";
t << "\\include{" << fd->getSourceFileBase() << "}\n";
}
}
}
......
......@@ -88,6 +88,7 @@ HEADERS = bufstr.h \
pyscanner.h \
fortrancode.h \
fortranscanner.h \
dbusxmlscanner.h \
qhp.h \
qhpxmlwriter.h \
qtbc.h \
......@@ -231,6 +232,7 @@ SOURCES = ce_lex.cpp \
vhdlscanner.cpp \
xmldocvisitor.cpp \
xmlgen.cpp \
dbusxmlscanner.cpp \
win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-msvc:TMAKE_CXXFLAGS += -Zm200
......
......@@ -368,3 +368,8 @@ int portable_pclose(FILE *stream)
return pclose(stream);
}
double portable_getSysElapsedTime()
{
return sysElapsedTime;
}
......@@ -28,6 +28,7 @@ const char * portable_commandExtension();
bool portable_fileSystemIsCaseSensitive();
FILE * portable_popen(const char *name,const char *type);
int portable_pclose(FILE *stream);
double portable_getSysElapsedTime();
extern "C" {
void * portable_iconv_open(const char* tocode, const char* fromcode);
......
......@@ -104,6 +104,7 @@ static QCString g_blockName;
static int g_condCtx;
static bool g_skip;
static QStack<bool> g_condStack;
static bool g_insideCS; // C# has simpler preprocessor
static bool g_lexInit = FALSE;
......@@ -118,6 +119,7 @@ static void setFileName(const char *name)
g_yyFileName=convertToQCString(fi.absFilePath());
g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig);
if (g_yyFileDef && g_yyFileDef->isReference()) g_yyFileDef=0;
g_insideCS = g_yyFileName.right(3)==".cs";
}
static void incrLevel()
......@@ -1817,7 +1819,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_insideComment=FALSE;
BEGIN(DefineText);
}
<DefName>{ID}/{B}*"\n" {
<DefName>{ID}/{B}*"\n" { // bare define
g_argDict = 0;
g_defArgs = -1;
g_defName = yytext;
......@@ -1831,6 +1833,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
outputArray(tmp.data(),tmp.length());
g_quoteArg=FALSE;
g_insideComment=FALSE;
if (g_insideCS) g_defText="1"; // for C#, use "1" as define text
BEGIN(DefineText);
}
else // define is a guard => hide
......
......@@ -1713,6 +1713,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
}
<FindMemberName>{SCOPENAME}{BN}*/"<" {
sharpCount=0;
roundCount=0;
lineCount();
current->name+=((QCString)yytext).stripWhiteSpace();
//current->memberSpec.resize(0);
......@@ -1722,7 +1723,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
else
BEGIN( EndTemplate );
}
<EndTemplate>"<<" {
<ClassTemplSpec,EndTemplate>"<<" {
current->name+=yytext;
// *currentTemplateSpec+=yytext;
}
......@@ -1731,8 +1732,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
// *currentTemplateSpec+='<';
sharpCount++;
}
<EndTemplate>">>" {
if (insideJava || insideCS || insideCli)
<ClassTemplSpec,EndTemplate>">>" {
if (insideJava || insideCS || insideCli || roundCount==0)
{
unput('>');
unput(' ');
......@@ -1781,6 +1782,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
BEGIN(FindMemberName);
}
}
<ClassTemplSpec,EndTemplate>"(" { current->name+=*yytext;
roundCount++;
}
<ClassTemplSpec,EndTemplate>")" { current->name+=*yytext;
if (roundCount>0) roundCount--;
}
<EndTemplate>. {
current->name+=*yytext;
// *currentTemplateSpec+=*yytext;
......@@ -4132,7 +4139,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
current->doc.resize(0);
}
#endif
if (current->sli) // copy special list items
if (current->sli && previous) // copy special list items
{
QListIterator<ListItemInfo> li(*current->sli);
ListItemInfo *lii;
......@@ -4315,6 +4322,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
}
else // C++ template specialization
{
roundCount=0;
BEGIN( ClassTemplSpec );
}
}
......@@ -4770,9 +4778,22 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
{
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(); }
......
......@@ -17,11 +17,12 @@
color: #999999;
background-color: #FFFFFF;
font-style: normal;
cursor: pointer;
cursor: text;
padding: 0px 1px;
margin: 0px 6px 0px 0px;
border: none;
outline: none;
vertical-align: middle;
}
#MSearchBox.MSearchBoxInactive:hover #MSearchField {
background-color: #FFFFFF;
......@@ -41,14 +42,26 @@
display : inline;
background : none;
font: 9pt Verdana, sans-serif;
margin-right: -6px;
padding: 0;
border: none;
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;
background-color: #84B0C7;
outline: none;
}
#MSearchCloseImg {
vertical-align: middle;
}
.MSearchBoxLeft {
display: block;
text-align: left;
......@@ -108,7 +121,7 @@ a.SelectItem {
padding-left: 6px;
padding-right: 12px;
}
a.SelectItem:visited,
a.SelectItem:focus,
a.SelectItem:active {
color: #000000;
outline-style: none;
......@@ -136,26 +149,6 @@ iframe#MSearchResults {
border: 1px solid #000000;
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 {
outline: none;
}
a.SRSymbol:focus, a.SRSymbol:active,
a.SRScope:focus, a.SRScope:active {
text-decoration: underline;
}
.SRPage .SRStatus {
padding: 2px 5px;
font-size: 8pt;
......
This diff is collapsed.
......@@ -17,11 +17,12 @@
" color: #999999;\n"
" background-color: #FFFFFF;\n"
" font-style: normal;\n"
" cursor: pointer;\n"
" cursor: text;\n"
" padding: 0px 1px;\n"
" margin: 0px 6px 0px 0px;\n"
" border: none;\n"
" outline: none;\n"
" vertical-align: middle;\n"
"}\n"
"#MSearchBox.MSearchBoxInactive:hover #MSearchField {\n"
" background-color: #FFFFFF;\n"
......@@ -41,14 +42,26 @@
" display : inline;\n"
" background : none;\n"
" font: 9pt Verdana, sans-serif;\n"
" margin-right: -6px;\n"
" padding: 0;\n"
" border: none;\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"
" background-color: #84B0C7;\n"
" outline: none;\n"
"}\n"
"\n"
"#MSearchCloseImg {\n"
" vertical-align: middle;\n"
"}\n"
"\n"
".MSearchBoxLeft {\n"
" display: block;\n"
" text-align: left;\n"
......@@ -108,7 +121,7 @@
" padding-left: 6px;\n"
" padding-right: 12px;\n"
"}\n"
"a.SelectItem:visited,\n"
"a.SelectItem:focus,\n"
"a.SelectItem:active {\n"
" color: #000000; \n"
" outline-style: none;\n"
......@@ -136,26 +149,6 @@
" border: 1px solid #000000;\n"
" background-color: #EEF3F5;\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"
......@@ -198,6 +191,11 @@
" outline: none;\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"
" padding: 2px 5px;\n"
" font-size: 8pt;\n"
......
This diff is collapsed.
......@@ -305,7 +305,8 @@ int guessSection(const char *name)
n.right(4)==".ixx" ||
n.right(4)==".ipp" ||
n.right(4)==".i++" ||
n.right(4)==".inl"
n.right(4)==".inl" ||
n.right(4)==".xml"
) return Entry::SOURCE_SEC;
if (n.right(2)==".h" || // header
n.right(3)==".hh" ||
......@@ -6069,22 +6070,6 @@ static void latin2ToLatex(QTextStream &t,unsigned char c)
void filterLatexString(QTextStream &t,const char *str,
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)
{
const unsigned char *p=(const unsigned char *)str;
......@@ -6104,25 +6089,6 @@ void filterLatexString(QTextStream &t,const char *str,
case '_': t << "\\_"; break;
default:
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
......@@ -6155,10 +6121,7 @@ void filterLatexString(QTextStream &t,const char *str,
else
t << "]";
break;
case '-': if (*p=='>')
{ t << " $\\rightarrow$ "; p++; }
else
{ t << (char)c; }
case '-': t << "-\\/";
break;
case '\\': if (*p=='<')
{ t << "$<$"; p++; }
......@@ -6445,6 +6408,7 @@ g_lang2extMap[] =
{ "python", "python", SrcLangExt_Python },
{ "fortran", "fortran", SrcLangExt_F90 },
{ "vhdl", "vhdl", SrcLangExt_VHDL },
{ "dbusxml", "dbusxml", SrcLangExt_XML },
{ 0, 0, (SrcLangExt)0 }
};
......@@ -6507,6 +6471,7 @@ void initDefaultExtensionMapping()
updateLanguageMapping(".f90", "fortran");
updateLanguageMapping(".vhd", "vhdl");
updateLanguageMapping(".vhdl", "vhdl");
updateLanguageMapping(".xml", "dbusxml");
}
SrcLangExt getLanguageFromFileName(const QCString fileName)
......
......@@ -95,7 +95,8 @@ enum SrcLangExt
SrcLangExt_JS = 0x0400,
SrcLangExt_Python = 0x0800,
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