summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2021-10-15 10:51:13 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2021-10-15 10:51:13 +0900
commitb65cb2d67b946445ba89e1938cee8527969922cd (patch)
treee3aff002a9b580aef8a80eb3823786993c3a5c64 /src
parent738086af77ab085837d0044a33a5d954a3edc6f5 (diff)
downloaddoxygen-b65cb2d67b946445ba89e1938cee8527969922cd.tar.gz
doxygen-b65cb2d67b946445ba89e1938cee8527969922cd.tar.bz2
doxygen-b65cb2d67b946445ba89e1938cee8527969922cd.zip
Imported Upstream version 1.8.7upstream/1.8.7
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.in15
-rw-r--r--src/arguments.h2
-rw-r--r--src/bufstr.h2
-rw-r--r--src/cite.cpp3
-rw-r--r--src/classdef.cpp115
-rw-r--r--src/classdef.h20
-rw-r--r--src/classlist.cpp17
-rw-r--r--src/classlist.h18
-rw-r--r--src/cmdmapper.cpp5
-rw-r--r--src/cmdmapper.h7
-rw-r--r--src/code.h2
-rw-r--r--src/code.l66
-rw-r--r--src/commentcnv.h4
-rw-r--r--src/commentcnv.l50
-rw-r--r--src/commentscan.h2
-rw-r--r--src/commentscan.l120
-rw-r--r--src/compound.xsd94
-rw-r--r--src/condparser.cpp2
-rw-r--r--src/condparser.h2
-rw-r--r--src/config.h9
-rw-r--r--src/config.l91
-rw-r--r--src/config.xml59
-rwxr-xr-xsrc/configgen.py32
-rw-r--r--src/configoptions.h2
-rw-r--r--src/constexp.h2
-rw-r--r--src/constexp.l2
-rw-r--r--src/constexp.y2
-rw-r--r--src/context.cpp2452
-rw-r--r--src/context.h601
-rw-r--r--src/cppvalue.cpp2
-rw-r--r--src/cppvalue.h2
-rw-r--r--src/dbusxmlscanner.cpp24
-rw-r--r--src/debug.cpp2
-rw-r--r--src/debug.h2
-rw-r--r--src/declinfo.h2
-rw-r--r--src/declinfo.l2
-rw-r--r--src/defargs.h2
-rw-r--r--src/defargs.l2
-rw-r--r--src/defgen.cpp2
-rw-r--r--src/defgen.h2
-rw-r--r--src/define.cpp2
-rw-r--r--src/define.h21
-rw-r--r--src/definition.cpp10
-rw-r--r--src/definition.h8
-rw-r--r--src/dia.cpp2
-rw-r--r--src/dia.h2
-rw-r--r--src/diagram.cpp182
-rw-r--r--src/diagram.h2
-rw-r--r--src/dirdef.cpp23
-rw-r--r--src/dirdef.h16
-rw-r--r--src/docbookgen.cpp14
-rw-r--r--src/docbookgen.h2
-rw-r--r--src/docbookvisitor.cpp116
-rw-r--r--src/docbookvisitor.h2
-rw-r--r--src/docparser.cpp358
-rw-r--r--src/docparser.h100
-rw-r--r--src/docsets.cpp4
-rw-r--r--src/docsets.h2
-rw-r--r--src/doctokenizer.h2
-rw-r--r--src/doctokenizer.l30
-rw-r--r--src/docvisitor.h2
-rw-r--r--src/dot.cpp23
-rw-r--r--src/dot.h2
-rw-r--r--src/doxygen.cpp309
-rw-r--r--src/doxygen.css80
-rw-r--r--src/doxygen.h3
-rw-r--r--src/doxygen.pro.in5
-rw-r--r--src/doxygen.sty4
-rw-r--r--src/dynsections.js54
-rw-r--r--src/eclipsehelp.cpp2
-rw-r--r--src/eclipsehelp.h2
-rw-r--r--src/entry.cpp2
-rw-r--r--src/entry.h2
-rw-r--r--src/example.h7
-rw-r--r--src/filedef.cpp49
-rw-r--r--src/filedef.h17
-rw-r--r--src/filename.cpp48
-rw-r--r--src/filename.h9
-rw-r--r--src/filestorage.h2
-rw-r--r--src/formula.cpp2
-rw-r--r--src/formula.h2
-rw-r--r--src/fortrancode.h10
-rw-r--r--src/fortrancode.l24
-rw-r--r--src/fortranscanner.h18
-rw-r--r--src/fortranscanner.l23
-rw-r--r--src/ftextstream.cpp1
-rw-r--r--src/ftvhelp.cpp126
-rw-r--r--src/ftvhelp.h4
-rw-r--r--src/groupdef.cpp43
-rw-r--r--src/groupdef.h11
-rw-r--r--src/htags.cpp2
-rw-r--r--src/htags.h2
-rw-r--r--src/htmlattrib.h24
-rw-r--r--src/htmldocvisitor.cpp178
-rw-r--r--src/htmldocvisitor.h2
-rw-r--r--src/htmlentity.cpp500
-rw-r--r--src/htmlentity.h47
-rw-r--r--src/htmlgen.cpp121
-rw-r--r--src/htmlgen.h6
-rw-r--r--src/htmlhelp.cpp40
-rw-r--r--src/htmlhelp.h2
-rw-r--r--src/image.cpp2
-rw-r--r--src/image.h2
-rw-r--r--src/index.cpp292
-rw-r--r--src/index.h2
-rw-r--r--src/lang_cfg.h42
-rw-r--r--src/language.cpp12
-rw-r--r--src/language.h2
-rwxr-xr-xsrc/languages.py4
-rw-r--r--src/latexdocvisitor.cpp210
-rw-r--r--src/latexdocvisitor.h2
-rw-r--r--src/latexgen.cpp75
-rw-r--r--src/latexgen.h2
-rw-r--r--src/layout.cpp2
-rw-r--r--src/layout.h2
-rw-r--r--src/libdoxycfg.pro.in10
-rw-r--r--src/libdoxycfg.t.in10
-rw-r--r--src/libdoxygen.pro.in84
-rw-r--r--src/libdoxygen.t.in138
-rw-r--r--src/lodepng.cpp2
-rw-r--r--src/logos.cpp2
-rw-r--r--src/logos.h2
-rw-r--r--src/main.cpp2
-rw-r--r--src/mandocvisitor.cpp48
-rw-r--r--src/mandocvisitor.h2
-rw-r--r--src/mangen.cpp22
-rw-r--r--src/mangen.h2
-rw-r--r--src/markdown.cpp138
-rw-r--r--src/markdown.h4
-rw-r--r--src/marshal.cpp4
-rw-r--r--src/marshal.h2
-rw-r--r--src/memberdef.cpp84
-rw-r--r--src/memberdef.h5
-rw-r--r--src/membergroup.cpp19
-rw-r--r--src/membergroup.h7
-rw-r--r--src/memberlist.cpp100
-rw-r--r--src/memberlist.h7
-rw-r--r--src/membername.cpp18
-rw-r--r--src/membername.h22
-rw-r--r--src/message.cpp11
-rw-r--r--src/message.h4
-rw-r--r--src/msc.cpp2
-rw-r--r--src/msc.h2
-rw-r--r--src/namespacedef.cpp108
-rw-r--r--src/namespacedef.h26
-rw-r--r--src/navtree.js60
-rw-r--r--src/objcache.cpp2
-rw-r--r--src/objcache.h2
-rw-r--r--src/outputgen.cpp2
-rw-r--r--src/outputgen.h2
-rw-r--r--src/outputlist.cpp150
-rw-r--r--src/outputlist.h28
-rw-r--r--src/pagedef.cpp2
-rw-r--r--src/pagedef.h7
-rw-r--r--src/parserintf.h4
-rw-r--r--src/perlmodgen.cpp204
-rw-r--r--src/perlmodgen.h2
-rw-r--r--src/pre.h2
-rw-r--r--src/pre.l2
-rw-r--r--src/printdocvisitor.h110
-rw-r--r--src/pycode.h2
-rw-r--r--src/pycode.l2
-rw-r--r--src/pyscanner.h2
-rw-r--r--src/pyscanner.l4
-rw-r--r--src/qtbc.h2
-rw-r--r--src/reflist.cpp2
-rw-r--r--src/reflist.h7
-rw-r--r--src/rtfdocvisitor.cpp203
-rw-r--r--src/rtfdocvisitor.h2
-rw-r--r--src/rtfgen.cpp26
-rw-r--r--src/rtfgen.h2
-rw-r--r--src/rtfstyle.cpp2
-rw-r--r--src/rtfstyle.h2
-rw-r--r--src/scanner.h2
-rw-r--r--src/scanner.l55
-rw-r--r--src/searchindex.cpp18
-rw-r--r--src/searchindex.h2
-rw-r--r--src/section.h25
-rw-r--r--src/settings.h12
-rwxr-xr-xsrc/settings.py3
-rw-r--r--src/sortdict.h20
-rw-r--r--src/sqlite3gen.cpp918
-rw-r--r--src/sqlite3gen.h2
-rw-r--r--src/store.cpp2
-rw-r--r--src/store.h2
-rw-r--r--src/tagreader.cpp87
-rw-r--r--src/tagreader.h2
-rw-r--r--src/tclscanner.h2
-rw-r--r--src/template.cpp1595
-rw-r--r--src/template.h162
-rw-r--r--src/textdocvisitor.cpp114
-rw-r--r--src/textdocvisitor.h2
-rw-r--r--src/tooltip.cpp2
-rw-r--r--src/tooltip.h2
-rw-r--r--src/translator.h2
-rw-r--r--src/translator_am.h2
-rw-r--r--src/translator_ar.h2
-rw-r--r--src/translator_br.h2
-rw-r--r--src/translator_ca.h2
-rw-r--r--src/translator_cn.h2
-rw-r--r--src/translator_cz.h2
-rw-r--r--src/translator_de.h2
-rw-r--r--src/translator_dk.h2
-rw-r--r--src/translator_en.h4
-rw-r--r--src/translator_eo.h2
-rw-r--r--src/translator_es.h2
-rw-r--r--src/translator_fa.h2
-rw-r--r--src/translator_fi.h2
-rw-r--r--src/translator_fr.h2
-rw-r--r--src/translator_gr.h2
-rw-r--r--src/translator_hr.h2
-rw-r--r--src/translator_hu.h2
-rw-r--r--src/translator_id.h2
-rw-r--r--src/translator_it.h2
-rw-r--r--src/translator_je.h2
-rw-r--r--src/translator_jp.h2
-rw-r--r--src/translator_ke.h2
-rw-r--r--src/translator_kr.h2
-rw-r--r--src/translator_lt.h2
-rw-r--r--src/translator_lv.h2
-rw-r--r--src/translator_mk.h2
-rw-r--r--src/translator_nl.h2
-rw-r--r--src/translator_no.h2
-rw-r--r--src/translator_pl.h2
-rw-r--r--src/translator_pt.h2
-rw-r--r--src/translator_ro.h2
-rw-r--r--src/translator_ru.h10
-rw-r--r--src/translator_sc.h2
-rw-r--r--src/translator_si.h2
-rw-r--r--src/translator_sk.h2
-rw-r--r--src/translator_sr.h2
-rw-r--r--src/translator_sv.h265
-rw-r--r--src/translator_tr.h2
-rw-r--r--src/translator_tw.h2
-rw-r--r--src/translator_ua.h2
-rw-r--r--src/translator_vi.h2
-rw-r--r--src/translator_za.h2
-rw-r--r--src/types.h9
-rw-r--r--src/util.cpp410
-rw-r--r--src/util.h15
-rw-r--r--src/version.h2
-rwxr-xr-xsrc/version.py3
-rw-r--r--src/vhdlcode.l10
-rw-r--r--src/vhdldocgen.cpp32
-rw-r--r--src/vhdldocgen.h2
-rw-r--r--src/vhdlparser.y4
-rw-r--r--src/vhdlscanner.h2
-rw-r--r--src/vhdlscanner.l4
-rw-r--r--src/xmldocvisitor.cpp126
-rw-r--r--src/xmldocvisitor.h2
-rw-r--r--src/xmlgen.cpp32
-rw-r--r--src/xmlgen.h2
252 files changed, 7868 insertions, 5100 deletions
diff --git a/src/Makefile.in b/src/Makefile.in
index 7d1d0d9..875cf1d 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -2,7 +2,7 @@
#
#
#
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -14,6 +14,8 @@
# input used in their production; they are not affected by this license.
#
+GENERATED_SRC = ../generated_src/doxygen
+
all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile
$(MAKE) -f Makefile.libdoxycfg $@
$(MAKE) -f Makefile.libdoxygen $@
@@ -42,20 +44,11 @@ clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen
# also clean flex/bison generated files
distclean: clean
- -$(RM) scanner.cpp code.cpp config.cpp pre.cpp constexp.cpp \
+ -cd $(GENERATED_SRC) && $(RM) scanner.cpp code.cpp config.cpp pre.cpp constexp.cpp \
ce_parse.cpp ce_parse.h tag.cpp commentscan.cpp \
declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \
pycode.cpp pyscanner.cpp fortrancode.cpp fortranscanner.cpp \
vhdlscanner.cpp vhdlcode.cpp tclscanner.cpp vhdlparser.h \
vhdlparser.cpp
-# clean also the generated files which are in SVN
-realclean: distclean
- -$(RM) index.xsd.h compound.xsd.h layout_default.xml.h \
- header.html.h footer.html.h search_functions.php.h search_opensearch.php.h \
- search.js.h search.css.h doxygen.css.h navtree.js.h resize.js.h \
- doxygen.sty.h jquery_fx.js.h jquery_p1.js.h jquery_p2.js.h \
- jquery_p3.js.h jquery_ui.js.h navtree.css.h svgpan.js.h dynsections.js.h \
- doxygen.bst.h bib2xhtml.pl.h configoptions.cpp jquery_pt.js.h extsearch.js.h
-
FORCE:
diff --git a/src/arguments.h b/src/arguments.h
index eba452c..ed09869 100644
--- a/src/arguments.h
+++ b/src/arguments.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/bufstr.h b/src/bufstr.h
index cfb89c4..7fb7d40 100644
--- a/src/bufstr.h
+++ b/src/bufstr.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/cite.cpp b/src/cite.cpp
index 3e3eb43..a3056ba 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -239,6 +239,7 @@ void CiteDict::generatePage() const
QFileInfo fi(citeListFile);
QCString input(fi.size()+1);
f.readBlock(input.data(),fi.size());
+ f.close();
input.at(fi.size())='\0';
int p=0,s;
//printf("input=[%s]\n",input.data());
@@ -310,7 +311,7 @@ void CiteDict::generatePage() const
thisDir.remove(bib2xhtmlFile);
while (!tempFiles.isEmpty())
{
- QCString *s=tempFiles.take();
+ QCString *s=tempFiles.take(0);
thisDir.remove(*s);
}
}
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 6404431..eded587 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -897,8 +897,9 @@ static void writeTemplateSpec(OutputList &ol,Definition *d,
for (spi.toFirst();(al=spi.current());++spi)
{
ol.docify("template<");
- Argument *a=al->first();
- while (a)
+ QListIterator<Argument> ali(*al);
+ Argument *a;
+ while ((a=ali.current()))
{
ol.docify(a->type);
if (!a->name.isEmpty())
@@ -911,7 +912,8 @@ static void writeTemplateSpec(OutputList &ol,Definition *d,
ol.docify(" = ");
ol.docify(a->defval);
}
- a=al->next();
+ ++ali;
+ a=ali.current();
if (a) ol.docify(", ");
}
ol.docify(">");
@@ -1084,8 +1086,9 @@ void ClassDef::showUsedFiles(OutputList &ol)
ol.parseText(generatedFromFiles());
bool first=TRUE;
- FileDef *fd = m_impl->files.first();
- while (fd)
+ QListIterator<FileDef> li(m_impl->files);
+ FileDef *fd;
+ for (;(fd=li.current());++li)
{
if (first)
{
@@ -1139,8 +1142,6 @@ void ClassDef::showUsedFiles(OutputList &ol)
ol.popGeneratorState();
ol.endItemListItem();
-
- fd=m_impl->files.next();
}
if (!first) ol.endItemList();
@@ -1153,22 +1154,20 @@ int ClassDef::countInheritanceNodes()
BaseClassDef *ibcd;
if (m_impl->inheritedBy)
{
- ibcd=m_impl->inheritedBy->first();
- while (ibcd)
+ BaseClassListIterator it(*m_impl->inheritedBy);
+ for (;(ibcd=it.current());++it)
{
ClassDef *icd=ibcd->classDef;
if ( icd->isVisibleInHierarchy()) count++;
- ibcd=m_impl->inheritedBy->next();
}
}
if (m_impl->inherits)
{
- ibcd=m_impl->inherits->first();
- while (ibcd)
+ BaseClassListIterator it(*m_impl->inherits);
+ for (;(ibcd=it.current());++it)
{
ClassDef *icd=ibcd->classDef;
if ( icd->isVisibleInHierarchy()) count++;
- ibcd=m_impl->inherits->next();
}
}
return count;
@@ -1767,20 +1766,24 @@ void ClassDef::writeMoreLink(OutputList &ol,const QCString &anchor)
}
}
+bool ClassDef::visibleInParentsDeclList() const
+{
+ static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
+ static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
+ static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
+ bool linkable = isLinkable();
+ return (name().find('@')==-1 && !isExtension() &&
+ (protection()!=::Private || extractPrivate) &&
+ (linkable || (!hideUndocClasses && (!isLocal() || extractLocalClasses)))
+ );
+}
void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *header,bool localNames)
{
//static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
//static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
- static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
- static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
- bool isLink = isLinkable();
SrcLangExt lang = getLanguage();
- if (isLink ||
- (!hideUndocClasses &&
- (!isLocal() || extractLocalClasses)
- )
- )
+ if (visibleInParentsDeclList())
{
if (!found) // first class
{
@@ -1820,7 +1823,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade
ol.writeString(" ");
ol.insertMemberAlign();
}
- if (isLink)
+ if (isLinkable())
{
ol.writeObjectLink(getReference(),
getOutputFileBase(),
@@ -2100,7 +2103,8 @@ void ClassDef::writeMemberPages(OutputList &ol)
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
{
- if (ml->listType()&MemberListType_detailedLists)
+ ml->countDocMembers();
+ if (ml->numDocMembers()>0 && (ml->listType()&MemberListType_detailedLists))
{
ml->writeDocumentationPage(ol,displayName(),this);
}
@@ -2127,7 +2131,7 @@ void ClassDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
for (mnii.toFirst();(mi=mnii.current());++mnii)
{
MemberDef *md=mi->memberDef;
- if (md->getClassDef()==this && md->isLinkable())
+ if (md->getClassDef()==this && md->isLinkable() && !md->isEnumValue())
{
ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
@@ -2224,8 +2228,9 @@ void ClassDef::writeMemberList(OutputList &ol)
MemberNameInfo *mni;
for (mnii.toFirst();(mni=mnii.current());++mnii)
{
- MemberInfo *mi=mni->first();
- while (mi)
+ MemberNameInfoIterator it(*mni);
+ MemberInfo *mi;
+ for (;(mi=it.current());++it)
{
MemberDef *md=mi->memberDef;
ClassDef *cd=md->getClassDef();
@@ -2421,7 +2426,6 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.writeString("</tr>\n");
}
}
- mi=mni->next();
}
}
//ol.endItemList();
@@ -3407,10 +3411,11 @@ QCString ClassDef::compoundTypeString() const
QCString ClassDef::getOutputFileBase() const
{
- if (!Doxygen::generatingXmlOutput)
+ static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
+ static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+ if (!Doxygen::generatingXmlOutput && !separateMemberPages)
{
- static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
- static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
Definition *scope=0;
if (inlineGroupedClasses && partOfGroups()!=0)
{
@@ -3728,7 +3733,7 @@ void ClassDef::getTemplateParameterLists(QList<ArgumentList> &lists) const
}
QCString ClassDef::qualifiedNameWithTemplateParameters(
- QList<ArgumentList> *actualParams) const
+ QList<ArgumentList> *actualParams,int *actualParamIndex) const
{
//static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
@@ -3740,7 +3745,7 @@ QCString ClassDef::qualifiedNameWithTemplateParameters(
if (d->definitionType()==Definition::TypeClass)
{
ClassDef *cd=(ClassDef *)d;
- scName = cd->qualifiedNameWithTemplateParameters(actualParams);
+ scName = cd->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex);
}
else if (!hideScopeNames)
{
@@ -3765,13 +3770,14 @@ QCString ClassDef::qualifiedNameWithTemplateParameters(
ArgumentList *al=0;
if (templateArguments())
{
- if (actualParams && (al=actualParams->current()))
+ if (actualParams && *actualParamIndex<(int)actualParams->count())
{
+ al = actualParams->at(*actualParamIndex);
if (!isSpecialization)
{
scName+=tempArgListToString(al);
}
- actualParams->next();
+ (*actualParamIndex)++;
}
else
{
@@ -3893,14 +3899,14 @@ MemberList *ClassDef::createMemberList(MemberListType lt)
MemberList *ClassDef::getMemberList(MemberListType lt)
{
- MemberList *ml = m_impl->memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
if (ml->listType()==lt)
{
return ml;
}
- ml = m_impl->memberLists.next();
}
return 0;
}
@@ -3919,11 +3925,15 @@ void ClassDef::addMemberToList(MemberListType lt,MemberDef *md,bool isBrief)
void ClassDef::sortMemberLists()
{
- MemberList *ml = m_impl->memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
- ml = m_impl->memberLists.next();
+ }
+ if (m_impl->innerClasses)
+ {
+ m_impl->innerClasses->sort();
}
}
@@ -3948,6 +3958,17 @@ int ClassDef::countMemberDeclarations(MemberListType lt,ClassDef *inheritedFrom,
count+=ml2->numDecMembers();
//printf("-> ml2=%d\n",ml2->numDecMembers());
}
+ // also include grouped members that have their own section in the class (see bug 722759)
+ if (inheritedFrom && m_impl->memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ count+=mg->countGroupedInheritedMembers(lt);
+ if (lt2!=1) count+=mg->countGroupedInheritedMembers((MemberListType)lt2);
+ }
+ }
static bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB");
if (!inlineInheritedMembers) // show inherited members as separate lists
{
@@ -4437,11 +4458,11 @@ MemberDef *ClassDef::isSmartPointer() const
void ClassDef::reclassifyMember(MemberDef *md,MemberType t)
{
md->setMemberType(t);
- MemberList *ml = m_impl->memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
ml->remove(md);
- ml = m_impl->memberLists.next();
}
insertMember(md);
}
@@ -4526,11 +4547,11 @@ void ClassDef::setTagLessReference(ClassDef *cd)
void ClassDef::removeMemberFromLists(MemberDef *md)
{
- MemberList *ml = m_impl->memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
ml->remove(md);
- ml = m_impl->memberLists.next();
}
}
diff --git a/src/classdef.h b/src/classdef.h
index 4e76117..8c5bebf 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -168,6 +168,9 @@ class ClassDef : public Definition
/** the class is visible in a class diagram, or class hierarchy */
bool isVisibleInHierarchy();
+ /** show this class in the declaration section of its parent? */
+ bool visibleInParentsDeclList() const;
+
/** Returns the template arguments of this class
* Will return 0 if not applicable.
*/
@@ -243,7 +246,7 @@ class ClassDef : public Definition
void getTemplateParameterLists(QList<ArgumentList> &lists) const;
QCString qualifiedNameWithTemplateParameters(
- QList<ArgumentList> *actualParams=0) const;
+ QList<ArgumentList> *actualParams=0,int *actualParamIndex=0) const;
/** Returns TRUE if there is at least one pure virtual member in this
* class.
@@ -310,14 +313,13 @@ class ClassDef : public Definition
QCString generatedFromFiles() const;
const FileList &usedFiles() const;
- QCString includeStatement() const;
-
const ArgumentList *typeConstraints() const;
const ExampleSDict *exampleList() const;
bool hasExamples() const;
QCString getMemberListFileName() const;
bool subGrouping() const;
+
//-----------------------------------------------------------------------------------
// --- setters ----
//-----------------------------------------------------------------------------------
@@ -432,6 +434,8 @@ class ClassDef : public Definition
QPtrDict<void> *visitedClasses);
void getTitleForMemberListType(MemberListType type,
QCString &title,QCString &subtitle);
+ QCString includeStatement() const;
+
ClassDefImpl *m_impl;
@@ -528,11 +532,11 @@ class BaseClassList : public QList<BaseClassDef>
{
public:
~BaseClassList() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ int compareValues(const BaseClassDef *item1,const BaseClassDef *item2) const
{
- ClassDef *c1=((BaseClassDef *)item1)->classDef;
- ClassDef *c2=((BaseClassDef *)item2)->classDef;
- if (c1==0 || c2==0)
+ const ClassDef *c1=item1->classDef;
+ const ClassDef *c2=item2->classDef;
+ if (c1==0 || c2==0)
return FALSE;
else
return qstricmp(c1->name(),c2->name());
diff --git a/src/classlist.cpp b/src/classlist.cpp
index f19c374..5751356 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,30 +33,25 @@ ClassList::~ClassList()
{
}
-static int compItems(void *item1,void *item2)
+static int compItems(const ClassDef *c1,const ClassDef *c2)
{
- ClassDef *c1=(ClassDef *)item1;
- ClassDef *c2=(ClassDef *)item2;
static bool b = Config_getBool("SORT_BY_SCOPE_NAME");
- //printf("compItems: %d %s<->%s\n",b,c1->name().data(),c2->name().data());
if (b)
{
- return qstricmp(c1->name(),
- c2->name());
+ return qstricmp(c1->name(), c2->name());
}
else
{
- return qstricmp(c1->className(),
- c2->className());
+ return qstricmp(c1->className(), c2->className());
}
}
-int ClassList::compareItems(QCollection::Item item1, QCollection::Item item2)
+int ClassList::compareValues(const ClassDef *item1, const ClassDef *item2) const
{
return compItems(item1,item2);
}
-int ClassSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
+int ClassSDict::compareValues(const ClassDef *item1, const ClassDef *item2) const
{
return compItems(item1,item2);
}
diff --git a/src/classlist.h b/src/classlist.h
index adc781c..3f15b3e 100644
--- a/src/classlist.h
+++ b/src/classlist.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -28,12 +28,13 @@ class Definition;
/** A list of ClassDef objects. */
class ClassList : public QList<ClassDef>
-{
+{
public:
ClassList();
~ClassList();
-
- int compareItems(QCollection::Item item1,QCollection::Item item2);
+
+ private:
+ int compareValues(const ClassDef *item1,const ClassDef *item2) const;
};
/** An iterator for ClassDef objects in a ClassList. */
@@ -57,11 +58,12 @@ class ClassSDict : public SDict<ClassDef>
public:
ClassSDict(int size=17) : SDict<ClassDef>(size) {}
~ClassSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2);
- void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
+ void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
const char *header=0,bool localNames=FALSE);
- void writeDocumentation(OutputList &ol,Definition *container=0);
- bool declVisible(const ClassDef::CompoundType *filter=0) const;
+ void writeDocumentation(OutputList &ol,Definition *container=0);
+ bool declVisible(const ClassDef::CompoundType *filter=0) const;
+ private:
+ int compareValues(const ClassDef *item1,const ClassDef *item2) const;
};
class GenericsCollection : public QIntDict<ClassDef>
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
index c728be3..45469f2 100644
--- a/src/cmdmapper.cpp
+++ b/src/cmdmapper.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -63,6 +63,7 @@ CommandMap cmdMap[] =
{ "internal", CMD_INTERNAL },
{ "invariant", CMD_INVARIANT },
{ "javalink", CMD_JAVALINK },
+ { "latexinclude", CMD_LATEXINCLUDE },
{ "latexonly", CMD_LATEXONLY },
{ "li", CMD_LI },
{ "line", CMD_LINE },
@@ -135,6 +136,8 @@ CommandMap cmdMap[] =
{ "parblock", CMD_PARBLOCK },
{ "endparblock", CMD_ENDPARBLOCK },
{ "diafile", CMD_DIAFILE },
+ { "--", CMD_NDASH },
+ { "---", CMD_MDASH },
{ 0, 0 },
};
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
index 0017c02..d89e368 100644
--- a/src/cmdmapper.h
+++ b/src/cmdmapper.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -124,7 +124,10 @@ enum CommandType
CMD_ENDINTERNAL = 94,
CMD_PARBLOCK = 95,
CMD_ENDPARBLOCK = 96,
- CMD_DIAFILE = 97
+ CMD_DIAFILE = 97,
+ CMD_LATEXINCLUDE = 98,
+ CMD_NDASH = 99,
+ CMD_MDASH = 100
};
enum HtmlTagType
diff --git a/src/code.h b/src/code.h
index 8aadc0b..72a906c 100644
--- a/src/code.h
+++ b/src/code.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/code.l b/src/code.l
index ba35f7d..0d23553 100644
--- a/src/code.l
+++ b/src/code.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -111,6 +111,7 @@ static int g_lastSkipCppContext;
static int g_lastVerbStringContext;
static int g_memCallContext;
static int g_lastCContext;
+static int g_skipInlineInitContext;
static bool g_insideObjC;
static bool g_insideJava;
@@ -299,21 +300,18 @@ ClassDef *VariableContext::findVariable(const QCString &name)
{
if (name.isEmpty()) return 0;
ClassDef *result = 0;
- //QListIterator<Scope> sli(m_scopes);
+ QListIterator<Scope> sli(m_scopes);
Scope *scope;
QCString key = name;
// search from inner to outer scope
- scope = m_scopes.last();
- //for (sli.toLast();(scope=sli.current());--sli)
- while (scope)
+ for (sli.toLast();(scope=sli.current());--sli)
{
result = scope->find(key);
- if (result)
+ if (result)
{
DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
return result;
}
- scope = m_scopes.prev();
}
// nothing found -> also try the global scope
result=m_globalScope.find(name);
@@ -671,9 +669,10 @@ static void setParameterList(MemberDef *md)
{
g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
ArgumentList *al = md->argumentList();
- if (al==0) return;
- Argument *a = al->first();
- while (a)
+ if (al==0) return;
+ ArgumentListIterator it(*al);
+ Argument *a;
+ for (;(a=it.current());++it)
{
g_parmName = a->name.copy();
g_parmType = a->type.copy();
@@ -684,7 +683,6 @@ static void setParameterList(MemberDef *md)
g_parmType.stripPrefix("const ");
g_parmType=g_parmType.stripWhiteSpace();
g_theVarContext.addVariable(g_parmType,g_parmName);
- a = al->next();
}
}
@@ -803,13 +801,14 @@ static MemberDef *setCallContextForVar(const QCString &name)
}
else if (mn->count()>1) // global defined more than once
{
- MemberDef *md=mn->first();
- while (md)
+ MemberNameIterator it(*mn);
+ MemberDef *md;
+ for (;(md=it.current());++it)
{
//printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n",
// mn,md,
// md->getBodyDef(),g_sourceFileDef);
-
+
// in case there are multiple members we could link to, we
// only link to members if defined in the same file or
// defined as external.
@@ -821,7 +820,6 @@ static MemberDef *setCallContextForVar(const QCString &name)
//printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
return md;
}
- md=mn->next();
}
return 0;
}
@@ -1801,6 +1799,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
%x OldStyleArgs
%x UsingName
%x RawString
+%x InlineInit
%%
@@ -2545,7 +2544,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_name+=yytext;
BEGIN( FuncCall );
}
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits>{RAWBEGIN} {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN} {
QCString text=yytext;
int i=text.find('R');
g_code->codify(text.left(i+1));
@@ -2557,14 +2556,14 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_delimiter=g_delimiter.left(g_delimiter.length()-1);
BEGIN( RawString );
}
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits>\" {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" {
startFontClass("stringliteral");
g_code->codify(yytext);
g_lastStringContext=YY_START;
g_inForEachExpression = FALSE;
BEGIN( SkipString );
}
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits>\' {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\' {
startFontClass("stringliteral");
g_code->codify(yytext);
g_lastStringContext=YY_START;
@@ -2918,6 +2917,35 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_theVarContext.addVariable(g_parmType,g_parmName);
g_parmType.resize(0);g_parmName.resize(0);
}
+<MemberCall2,FuncCall>"{" {
+ if (g_bracketCount>0)
+ {
+ g_code->codify(yytext);
+ g_skipInlineInitContext=YY_START;
+ g_curlyCount=0;
+ BEGIN(InlineInit);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<InlineInit>"{" { g_curlyCount++;
+ g_code->codify(yytext);
+ }
+<InlineInit>"}" {
+ g_code->codify(yytext);
+ if (--g_curlyCount<=0)
+ {
+ BEGIN(g_skipInlineInitContext);
+ }
+ }
+<InlineInit>\n {
+ codifyLines(yytext);
+ }
+<InlineInit>. {
+ g_code->codify(yytext);
+ }
<MemberCall2,FuncCall>"(" {
g_parmType.resize(0);g_parmName.resize(0);
g_code->codify(yytext);
@@ -3254,8 +3282,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
}
<SkipCPP>\n/.*\n {
- codifyLines(yytext);
endFontClass();
+ codifyLines(yytext);
BEGIN( g_lastSkipCppContext ) ;
}
<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
diff --git a/src/commentcnv.h b/src/commentcnv.h
index 1c1fcb9..6255a73 100644
--- a/src/commentcnv.h
+++ b/src/commentcnv.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -16,7 +16,7 @@
*/
#ifndef _COMMENTCNV_H
-#define _COMMNETCNV_H
+#define _COMMENTCNV_H
class BufStr;
diff --git a/src/commentcnv.l b/src/commentcnv.l
index d59ef51..4cc9da9 100644
--- a/src/commentcnv.l
+++ b/src/commentcnv.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -52,6 +52,13 @@ struct CondCtx
bool skip;
};
+struct CommentCtx
+{
+ CommentCtx(int line)
+ : lineNr(line) {}
+ int lineNr;
+};
+
static BufStr * g_inBuf;
static BufStr * g_outBuf;
static int g_inBufPos;
@@ -64,6 +71,7 @@ static QCString g_fileName;
static int g_lineNr;
static int g_condCtx;
static QStack<CondCtx> g_condStack;
+static QStack<CommentCtx> g_commentStack;
static QCString g_blockName;
static int g_lastCommentContext;
static bool g_inSpecialComment;
@@ -256,8 +264,10 @@ void replaceComment(int offset);
{
g_pythonDocString = TRUE;
g_nestingCount=0;
+ g_commentStack.clear(); /* to be on the save side */
copyToOutput(yytext,(int)yyleng);
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
}
<Scan>![><!]/.*\n {
@@ -269,7 +279,9 @@ void replaceComment(int offset);
{
copyToOutput(yytext,(int)yyleng);
g_nestingCount=0;
+ g_commentStack.clear(); /* to be on the save side */
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
}
<Scan>[Cc\*][><!]/.*\n {
@@ -284,7 +296,9 @@ void replaceComment(int offset);
{
copyToOutput(yytext,(int)yyleng);
g_nestingCount=0;
+ g_commentStack.clear(); /* to be on the save side */
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
else
{
@@ -378,8 +392,10 @@ void replaceComment(int offset);
<Scan>"/*"[*!]? { /* start of a C comment */
g_specialComment=(int)yyleng==3;
g_nestingCount=0;
+ g_commentStack.clear(); /* to be on the save side */
copyToOutput(yytext,(int)yyleng);
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
<Scan>"#"("#")? {
if (g_lang!=SrcLangExt_Python)
@@ -390,7 +406,9 @@ void replaceComment(int offset);
{
copyToOutput(yytext,(int)yyleng);
g_nestingCount=0;
+ g_commentStack.clear(); /* to be on the save side */
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
}
<Scan>"--!" {
@@ -402,7 +420,9 @@ void replaceComment(int offset);
{
copyToOutput(yytext,(int)yyleng);
g_nestingCount=0;
+ g_commentStack.clear(); /* to be on the save side */
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
}
<Scan>![><!] {
@@ -414,7 +434,9 @@ void replaceComment(int offset);
{
copyToOutput(yytext,(int)yyleng);
g_nestingCount=0;
+ g_commentStack.clear(); /* to be on the save side */
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
}
<CComment>"{@code"/[ \t\n] {
@@ -606,6 +628,7 @@ void replaceComment(int offset);
}
<CComment>"/"+"*" { /* nested C comment */
g_nestingCount++;
+ g_commentStack.push(new CommentCtx(g_lineNr));
copyToOutput(yytext,(int)yyleng);
}
<CComment>"*"+"/" { /* end of C comment */
@@ -615,14 +638,15 @@ void replaceComment(int offset);
}
else
{
+ copyToOutput(yytext,(int)yyleng);
if (g_nestingCount<=0)
{
- copyToOutput(yytext,(int)yyleng);
BEGIN(Scan);
}
else
{
g_nestingCount--;
+ delete g_commentStack.pop();
}
}
}
@@ -731,7 +755,7 @@ void replaceComment(int offset);
<CComment,ReadLine>[\\@][\\@][~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command
copyToOutput(yytext,(int)yyleng);
}
-<CComment,ReadLine>[\\@]"cond"[ \t]+ { // conditional section
+<CComment,ReadLine>[\\@]"cond"/[^a-z_A-Z0-9] { // conditional section
g_condCtx = YY_START;
BEGIN(CondLine);
}
@@ -951,6 +975,8 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
g_lineNr = 1;
g_condStack.clear();
g_condStack.setAutoDelete(TRUE);
+ g_commentStack.clear();
+ g_commentStack.setAutoDelete(TRUE);
printlex(yy_flex_debug, TRUE, __FILE__, fileName);
isFixedForm = FALSE;
@@ -963,6 +989,7 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
{
g_nestingCount=0;
BEGIN(CComment);
+ g_commentStack.push(new CommentCtx(g_lineNr));
}
else
{
@@ -977,6 +1004,23 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have "
"a corresponding \\endcond command within this file.",sectionInfo.data());
}
+ if (g_nestingCount>0 || (YY_START==CComment && g_lang!=SrcLangExt_Markdown))
+ {
+ QCString tmp= "(probable line reference: ";
+ bool first = TRUE;
+ while (!g_commentStack.isEmpty())
+ {
+ CommentCtx *ctx = g_commentStack.pop();
+ if (!first) tmp += ", ";
+ tmp += QCString().setNum(ctx->lineNr);
+ first = FALSE;
+ delete ctx;
+ }
+ tmp += ")";
+ warn(g_fileName,g_lineNr,"Reached end of file while still inside a (nested) comment. "
+ "Nesting level %d %s",g_nestingCount+1,tmp.data()); // add one for "normal" expected end of comment
+ }
+ g_commentStack.clear();
if (Debug::isFlagSet(Debug::CommentCnv))
{
g_outBuf->at(g_outBuf->curPos())='\0';
diff --git a/src/commentscan.h b/src/commentscan.h
index e296b89..ce28ea2 100644
--- a/src/commentscan.h
+++ b/src/commentscan.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/commentscan.l b/src/commentscan.l
index 0d08e5c..bd20bf0 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -1,6 +1,6 @@
/*****************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -234,6 +234,7 @@ static DocCmdMap docCmdMap[] =
{ "include", 0, TRUE },
{ "includelineno", 0, TRUE },
{ "invariant", 0, TRUE },
+ { "latexinclude", 0, FALSE },
{ "li", 0, TRUE },
{ "line", 0, TRUE },
{ "note", 0, TRUE },
@@ -553,7 +554,7 @@ static void addXRefItem(const char *listName,const char *itemTitle,
item->text += " <p>";
if (Doxygen::markdownSupport)
{
- item->text += processMarkdown(yyFileName,current,outputXRef);
+ item->text += processMarkdown(yyFileName,yyLineNr,current,outputXRef);
}
else
{
@@ -575,7 +576,7 @@ static void addXRefItem(const char *listName,const char *itemTitle,
ASSERT(item!=0);
if (Doxygen::markdownSupport)
{
- item->text = processMarkdown(yyFileName,current,outputXRef);
+ item->text = processMarkdown(yyFileName,yyLineNr,current,outputXRef);
}
else
{
@@ -593,11 +594,26 @@ static void addXRefItem(const char *listName,const char *itemTitle,
{
docEntry->doc += cmdString;
}
- SectionInfo *si=new SectionInfo(listName,anchorLabel,
- g_sectionTitle,SectionInfo::Anchor,
- g_sectionLevel);
- Doxygen::sectionDict->append(anchorLabel,si);
- docEntry->anchors->append(si);
+ SectionInfo *si = Doxygen::sectionDict->find(anchorLabel);
+ if (si)
+ {
+ if (si->lineNr != -1)
+ {
+ warn(listName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",anchorLabel,si->fileName.data(),si->lineNr);
+ }
+ else
+ {
+ warn(listName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",anchorLabel,si->fileName.data());
+ }
+ }
+ else
+ {
+ si=new SectionInfo(listName,yyLineNr,anchorLabel,
+ g_sectionTitle,SectionInfo::Anchor,
+ g_sectionLevel);
+ Doxygen::sectionDict->append(anchorLabel,si);
+ docEntry->anchors->append(si);
+ }
}
outputXRef.resize(0);
}
@@ -643,18 +659,32 @@ static SectionInfo::SectionType sectionLevelToType(int level)
static void addSection()
{
- // create a new section element
- g_sectionTitle+=yytext;
- g_sectionTitle=g_sectionTitle.stripWhiteSpace();
- SectionInfo *si = new SectionInfo(yyFileName,g_sectionLabel,
+ SectionInfo *si = Doxygen::sectionDict->find(g_sectionLabel);
+ if (si)
+ {
+ if (si->lineNr != -1)
+ {
+ warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",g_sectionLabel.data(),si->fileName.data(),si->lineNr);
+ }
+ else
+ {
+ warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",g_sectionLabel.data(),si->fileName.data());
+ }
+ }
+ else
+ {
+ // create a new section element
+ g_sectionTitle+=yytext;
+ g_sectionTitle=g_sectionTitle.stripWhiteSpace();
+ si = new SectionInfo(yyFileName,yyLineNr,g_sectionLabel,
g_sectionTitle,sectionLevelToType(g_sectionLevel),g_sectionLevel);
- // add section to this entry
- current->anchors->append(si);
-
- // add section to the global dictionary
- Doxygen::sectionDict->append(g_sectionLabel,si);
+ // add section to this entry
+ current->anchors->append(si);
+ // add section to the global dictionary
+ Doxygen::sectionDict->append(g_sectionLabel,si);
+ }
}
//-----------------------------------------------------------------------------
@@ -850,7 +880,7 @@ DCMD1 ("arg"|"attention"|"author"|"cite"|"code")
DCMD2 ("date"|"dot"|"msc"|"dotfile"|"example")
DCMD3 ("htmlinclude"|"htmlonly"|"image"|"include")
DCMD4 ("includelineno"|"internal"|"invariant")
-DCMD5 ("latexonly"|"li"|"line"|"manonly"|"name")
+DCMD5 ("latexinclude"|"latexonly"|"li"|"line"|"manonly"|"name")
DCMD6 ("note"|"par"|"paragraph"|"param"|"post")
DCMD7 ("pre"|"remarks"|(("relate"[sd])("also")?))
DCMD8 ("remarks"|("return"[s]?)|"retval"|"sa"|"section")
@@ -1170,6 +1200,12 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<Comment>^{B}*([\-:|]{B}*)*("--"|"---")({B}*[\-:|])*{B}*/\n { // horizontal line (dashed)
addOutput(yytext);
}
+<Comment>{CMD}"---" { // escaped mdash
+ addOutput(yytext);
+ }
+<Comment>{CMD}"--" { // escaped mdash
+ addOutput(yytext);
+ }
<Comment>"---" { // mdash
addOutput(insidePre || Doxygen::markdownSupport ? yytext : "&mdash;");
}
@@ -1701,9 +1737,24 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
/* ----- handle arguments of the anchor command ------- */
<AnchorLabel>{LABELID} { // found argument
- SectionInfo *si = new SectionInfo(yyFileName,yytext,0,SectionInfo::Anchor,0);
- Doxygen::sectionDict->append(yytext,si);
- current->anchors->append(si);
+ SectionInfo *si = Doxygen::sectionDict->find(yytext);
+ if (si)
+ {
+ if (si->lineNr != -1)
+ {
+ warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",yytext,si->fileName.data(),si->lineNr);
+ }
+ else
+ {
+ warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",yytext,si->fileName.data());
+ }
+ }
+ else
+ {
+ si = new SectionInfo(yyFileName,yyLineNr,yytext,0,SectionInfo::Anchor,0);
+ Doxygen::sectionDict->append(yytext,si);
+ current->anchors->append(si);
+ }
addOutput(yytext);
BEGIN( Comment );
}
@@ -1765,7 +1816,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
/* ----- handle arguments of if/ifnot commands ------- */
-<GuardParam>"(" {
+<GuardParam>{B}*"(" {
g_guardExpr=yytext;
g_roundCount=1;
BEGIN(GuardExpr);
@@ -1791,7 +1842,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
unput(*yytext);
BEGIN(GuardParam);
}
-<GuardParam>[a-z_A-Z0-9.\-]+ { // parameter of if/ifnot guard
+<GuardParam>{B}*[a-z_A-Z0-9.\-]+ { // parameter of if/ifnot guard
handleGuard(yytext);
}
<GuardParam>{DOCNL} { // end of argument
@@ -1842,8 +1893,14 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
else
{
- delete guards.pop();
- BEGIN( GuardParamEnd );
+ GuardedSection *s = guards.pop();
+ bool parentVisible = s->parentVisible();
+ delete s;
+ if (parentVisible)
+ {
+ enabledSectionFound=TRUE;
+ BEGIN( GuardParamEnd );
+ }
}
}
<SkipGuardedSection>{CMD}"else"/{NW} {
@@ -2403,6 +2460,11 @@ static bool handleParBlock(const QCString &)
warn(yyFileName,yyLineNr,
"found \\parblock command while already in a parblock!");
}
+ if (!g_spaceBeforeCmd.isEmpty())
+ {
+ addOutput(g_spaceBeforeCmd);
+ g_spaceBeforeCmd.resize(0);
+ }
addOutput("@parblock ");
g_insideParBlock = TRUE;
return FALSE;
@@ -2865,9 +2927,9 @@ bool parseCommentBlock(/* in */ ParserInterface *parser,
if (Doxygen::markdownSupport)
{
- current->brief = processMarkdown(fileName,current,current->brief);
- current->doc = processMarkdown(fileName,current,current->doc);
- current->inbodyDocs = processMarkdown(fileName,current,current->inbodyDocs);
+ current->brief = processMarkdown(fileName,lineNr,current,current->brief);
+ current->doc = processMarkdown(fileName,lineNr,current,current->doc);
+ current->inbodyDocs = processMarkdown(fileName,lineNr,current,current->inbodyDocs);
}
Debug::print(Debug::CommentScan,0,
@@ -3079,7 +3141,7 @@ static void groupAddDocs(Entry *e,const char *fileName)
static void handleGuard(const QCString &expr)
{
CondParser prs;
- bool sectionEnabled=prs.parse(yyFileName,yyLineNr,expr);
+ bool sectionEnabled=prs.parse(yyFileName,yyLineNr,expr.stripWhiteSpace());
bool parentEnabled = TRUE;
if (!guards.isEmpty()) parentEnabled = guards.top()->isEnabled();
if (parentEnabled)
diff --git a/src/compound.xsd b/src/compound.xsd
index c1eb0ab..2521a2e 100644
--- a/src/compound.xsd
+++ b/src/compound.xsd
@@ -390,94 +390,7 @@
<xsd:element name="anchor" type="docAnchorType" />
<xsd:element name="formula" type="docFormulaType" />
<xsd:element name="ref" type="docRefTextType" />
- <xsd:element name="copy" type="docEmptyType" />
- <xsd:element name="trademark" type="docEmptyType" />
- <xsd:element name="registered" type="docEmptyType" />
- <xsd:element name="lsquo" type="docEmptyType" />
- <xsd:element name="rsquo" type="docEmptyType" />
- <xsd:element name="ldquo" type="docEmptyType" />
- <xsd:element name="rdquo" type="docEmptyType" />
- <xsd:element name="ndash" type="docEmptyType" />
- <xsd:element name="mdash" type="docEmptyType" />
- <xsd:element name="umlaut" type="docCharType" />
- <xsd:element name="acute" type="docCharType" />
- <xsd:element name="grave" type="docCharType" />
- <xsd:element name="circ" type="docCharType" />
- <xsd:element name="slash" type="docCharType" />
- <xsd:element name="tilde" type="docCharType" />
- <xsd:element name="cedil" type="docCharType" />
- <xsd:element name="ring" type="docCharType" />
- <xsd:element name="szlig" type="docEmptyType" />
- <xsd:element name="nonbreakablespace" type="docEmptyType" />
- <xsd:element name="aelig" type="docEmptyType" />
- <xsd:element name="AElig" type="docEmptyType" />
- <xsd:element name="Gamma" type="docEmptyType" />
- <xsd:element name="Delta" type="docEmptyType" />
- <xsd:element name="Theta" type="docEmptyType" />
- <xsd:element name="Lambda" type="docEmptyType" />
- <xsd:element name="Xi" type="docEmptyType" />
- <xsd:element name="Pi" type="docEmptyType" />
- <xsd:element name="Sigma" type="docEmptyType" />
- <xsd:element name="Upsilon" type="docEmptyType" />
- <xsd:element name="Phi" type="docEmptyType" />
- <xsd:element name="Psi" type="docEmptyType" />
- <xsd:element name="Omega" type="docEmptyType" />
- <xsd:element name="alpha" type="docEmptyType" />
- <xsd:element name="beta" type="docEmptyType" />
- <xsd:element name="gamma" type="docEmptyType" />
- <xsd:element name="delta" type="docEmptyType" />
- <xsd:element name="epsilon" type="docEmptyType" />
- <xsd:element name="zeta" type="docEmptyType" />
- <xsd:element name="eta" type="docEmptyType" />
- <xsd:element name="theta" type="docEmptyType" />
- <xsd:element name="iota" type="docEmptyType" />
- <xsd:element name="kappa" type="docEmptyType" />
- <xsd:element name="lambda" type="docEmptyType" />
- <xsd:element name="mu" type="docEmptyType" />
- <xsd:element name="nu" type="docEmptyType" />
- <xsd:element name="xi" type="docEmptyType" />
- <xsd:element name="pi" type="docEmptyType" />
- <xsd:element name="rho" type="docEmptyType" />
- <xsd:element name="sigma" type="docEmptyType" />
- <xsd:element name="tau" type="docEmptyType" />
- <xsd:element name="upsilon" type="docEmptyType" />
- <xsd:element name="phi" type="docEmptyType" />
- <xsd:element name="chi" type="docEmptyType" />
- <xsd:element name="psi" type="docEmptyType" />
- <xsd:element name="omega" type="docEmptyType" />
- <xsd:element name="sigmaf" type="docEmptyType" />
- <xsd:element name="sect" type="docEmptyType" />
- <xsd:element name="deg" type="docEmptyType" />
- <xsd:element name="prime" type="docEmptyType" />
- <xsd:element name="Prime" type="docEmptyType" />
- <xsd:element name="infin" type="docEmptyType" />
- <xsd:element name="empty" type="docEmptyType" />
- <xsd:element name="plusmn" type="docEmptyType" />
- <xsd:element name="times" type="docEmptyType" />
- <xsd:element name="minus" type="docEmptyType" />
- <xsd:element name="sdot" type="docEmptyType" />
- <xsd:element name="part" type="docEmptyType" />
- <xsd:element name="nabla" type="docEmptyType" />
- <xsd:element name="radic" type="docEmptyType" />
- <xsd:element name="perp" type="docEmptyType" />
- <xsd:element name="sum" type="docEmptyType" />
- <xsd:element name="int" type="docEmptyType" />
- <xsd:element name="prod" type="docEmptyType" />
- <xsd:element name="sim" type="docEmptyType" />
- <xsd:element name="asymp" type="docEmptyType" />
- <xsd:element name="ne" type="docEmptyType" />
- <xsd:element name="equiv" type="docEmptyType" />
- <xsd:element name="prop" type="docEmptyType" />
- <xsd:element name="le" type="docEmptyType" />
- <xsd:element name="ge" type="docEmptyType" />
- <xsd:element name="larr" type="docEmptyType" />
- <xsd:element name="rarr" type="docEmptyType" />
- <xsd:element name="isin" type="docEmptyType" />
- <xsd:element name="notin" type="docEmptyType" />
- <xsd:element name="lceil" type="docEmptyType" />
- <xsd:element name="rceil" type="docEmptyType" />
- <xsd:element name="lfloor" type="docEmptyType" />
- <xsd:element name="rfloor" type="docEmptyType" />
+ <!-- Automatically insert here the HTML entities -->
</xsd:choice>
</xsd:group>
@@ -560,7 +473,6 @@
<xsd:element name="title" type="docTitleType" minOccurs="0" />
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="para" type="docParaType" minOccurs="1" maxOccurs="unbounded" />
- <xsd:element name="simplesectsep" type="docEmptyType" minOccurs="0"/>
</xsd:sequence>
</xsd:sequence>
<xsd:attribute name="kind" type="DoxSimpleSectKind" />
@@ -717,10 +629,6 @@
</xsd:sequence>
</xsd:complexType>
- <xsd:complexType name="docCharType">
- <xsd:attribute name="char" type="DoxCharRange"/>
- </xsd:complexType>
-
<xsd:complexType name="docEmptyType"/>
<!-- Simple types -->
diff --git a/src/condparser.cpp b/src/condparser.cpp
index c99a232..67da1e3 100644
--- a/src/condparser.cpp
+++ b/src/condparser.cpp
@@ -1,5 +1,5 @@
/**
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/condparser.h b/src/condparser.h
index a4dfee8..0310f36 100644
--- a/src/condparser.h
+++ b/src/condparser.h
@@ -2,7 +2,7 @@
#define CONDPARSER_H
/**
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/config.h b/src/config.h
index 3dcf8de..505e4d1 100644
--- a/src/config.h
+++ b/src/config.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -165,7 +165,7 @@ class ConfigEnum : public ConfigOption
class ConfigString : public ConfigOption
{
public:
- enum WidgetType { String, File, Dir };
+ enum WidgetType { String, File, Dir, Image };
ConfigString(const char *name,const char *doc)
: ConfigOption(O_String)
{
@@ -493,13 +493,14 @@ class Config
* \returns TRUE if successful, or FALSE if the string could not be
* parsed.
*/
- bool parseString(const char *fn,const char *str);
+ //bool parseString(const char *fn,const char *str);
+ bool parseString(const char *fn,const char *str,bool upd = FALSE);
/*! Parse a configuration file with name \a fn.
* \returns TRUE if successful, FALSE if the file could not be
* opened or read.
*/
- bool parse(const char *fn);
+ bool parse(const char *fn,bool upd = FALSE);
/*! Called from the constructor, will add doxygen's default options
* to the configuration object
diff --git a/src/config.l b/src/config.l
index 05df386..133bc11 100644
--- a/src/config.l
+++ b/src/config.l
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -435,6 +435,7 @@ static QCString includeName;
static QStrList includePathList;
static QStack<ConfigFileState> includeStack;
static int includeDepth;
+static bool config_upd = FALSE;
static QCString tabSizeString;
static QCString maxInitLinesString;
@@ -672,15 +673,31 @@ static void readIncludeFile(const char *incName)
BEGIN(GetString);
break;
case ConfigOption::O_Obsolete:
- config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
- "To avoid this warning please remove this line from your configuration "
- "file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
+ if (config_upd)
+ {
+ config_err("Warning: Tag `%s' at line %d of file `%s' has become obsolete.\n"
+ " This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
+ }
+ else
+ {
+ config_err("Warning: Tag `%s' at line %d of file `%s' has become obsolete.\n"
+ " To avoid this warning please remove this line from your configuration "
+ "file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
+ }
BEGIN(SkipInvalid);
break;
case ConfigOption::O_Disabled:
- config_err("Warning: Tag `%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
- "To avoid this warning please remove this line from your configuration "
- "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data());
+ if (config_upd)
+ {
+ config_err("Warning: Tag `%s' at line %d of file `%s' belongs to an option that was not enabled at compile time.\n"
+ " This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
+ }
+ else
+ {
+ config_err("Warning: Tag `%s' at line %d of file `%s' belongs to an option that was not enabled at compile time.\n"
+ " To avoid this warning please remove this line from your configuration "
+ "file or upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data());
+ }
BEGIN(SkipInvalid);
break;
}
@@ -847,11 +864,11 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
{
t << convertToComment(m_header,"");
}
- ConfigOption *option = m_options->first();
- while (option)
+ QListIterator<ConfigOption> it = iterator();
+ ConfigOption *option;
+ for (;(option=it.current());++it)
{
option->writeTemplate(t,sl,upd);
- option = m_options->next();
}
/* print last lines of user comment that were at the end of the file */
if (m_userComment)
@@ -863,11 +880,11 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
void Config::convertStrToVal()
{
- ConfigOption *option = m_options->first();
- while (option)
+ QListIterator<ConfigOption> it = iterator();
+ ConfigOption *option;
+ for (;(option=it.current());++it)
{
option->convertStrToVal();
- option = m_options->next();
}
}
@@ -1003,11 +1020,11 @@ void ConfigEnum::substEnvVars()
void Config::substituteEnvironmentVars()
{
- ConfigOption *option = m_options->first();
- while (option)
+ QListIterator<ConfigOption> it = iterator();
+ ConfigOption *option;
+ for (;(option=it.current());++it)
{
option->substEnvVars();
- option = m_options->next();
}
}
@@ -1573,20 +1590,43 @@ void Config::check()
}
checkFileName("GENERATE_TAGFILE");
+
+#if 0 // TODO: this breaks test 25; SOURCEBROWSER = NO and SOURCE_TOOLTIPS = YES.
+ // So this and other regressions should be analysed and fixed before this can be enabled
+ // disable any boolean options that depend on disabled options
+ QListIterator<ConfigOption> it = iterator();
+ ConfigOption *option;
+ for (it.toFirst();(option=it.current());++it)
+ {
+ QCString depName = option->dependsOn(); // option has a dependency
+ if (!depName.isEmpty())
+ {
+ ConfigOption * dep = Config::instance()->get(depName);
+ if (dep->kind()==ConfigOption::O_Bool &&
+ Config_getBool(depName)==FALSE) // dependent option is disabled
+ {
+ if (option->kind()==ConfigOption::O_Bool)
+ {
+ printf("disabling option %s\n",option->name().data());
+ Config_getBool(option->name())=FALSE; // also disable this option
+ }
+ }
+ }
+ }
+#endif
}
void Config::init()
{
- ConfigOption *option = m_options->first();
- while (option)
+ QListIterator<ConfigOption> it = iterator();
+ ConfigOption *option;
+ for (;(option=it.current());++it)
{
option->init();
- option = m_options->next();
}
// sanity check if all depends relations are valid
- option = m_options->first();
- while (option)
+ for (it.toFirst();(option=it.current());++it)
{
QCString depName = option->dependsOn();
if (!depName.isEmpty())
@@ -1599,7 +1639,6 @@ void Config::init()
exit(1);
}
}
- option = m_options->next();
}
}
@@ -1668,7 +1707,7 @@ static QCString configFileToString(const char *name)
return "";
}
-bool Config::parseString(const char *fn,const char *str)
+bool Config::parseString(const char *fn,const char *str,bool update)
{
config = Config::instance();
inputString = str;
@@ -1680,17 +1719,19 @@ bool Config::parseString(const char *fn,const char *str)
includeDepth = 0;
configYYrestart( configYYin );
BEGIN( Start );
+ config_upd = update;
configYYlex();
+ config_upd = FALSE;
inputString = 0;
return TRUE;
}
-bool Config::parse(const char *fn)
+bool Config::parse(const char *fn,bool update)
{
int retval;
encoding = "UTF-8";
printlex(yy_flex_debug, TRUE, __FILE__, fn);
- retval = parseString(fn,configFileToString(fn));
+ retval = parseString(fn,configFileToString(fn), update);
printlex(yy_flex_debug, FALSE, __FILE__, fn);
return retval;
}
diff --git a/src/config.xml b/src/config.xml
index eff8cff..c832112 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -6,7 +6,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -247,7 +247,7 @@ Go to the <a href="commands.html">next</a> section or return to the
</docs>
</option>
- <option type='string' id='PROJECT_LOGO' format='file' defval=''>
+ <option type='string' id='PROJECT_LOGO' format='image' defval=''>
<docs>
<![CDATA[
With the \c PROJECT_LOGO tag one can specify an logo or icon that is
@@ -279,6 +279,16 @@ Go to the <a href="commands.html">next</a> section or return to the
]]>
</docs>
</option>
+ <option type='bool' id='ALLOW_UNICODE_NAMES' defval='0'>
+ <docs>
+<![CDATA[
+ If the \c ALLOW_UNICODE_NAMES tag is set to \c YES,
+ doxygen will allow non-ASCII characters to appear in the names of generated files.
+ If set to \c NO, non-ASCII characters will be escaped, for example _xE3_x81_x84
+ will be used for Unicode U+3044.
+]]>
+ </docs>
+ </option>
<option type='enum' id='OUTPUT_LANGUAGE' defval='English'>
<docs>
<![CDATA[
@@ -578,7 +588,10 @@ Go to the <a href="commands.html">next</a> section or return to the
Doxygen has a built-in mapping, but you can override or extend it using this tag.
The format is <code>ext=language</code>, where \c ext is a file extension, and language is one of
the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
- Objective-C, Python, Fortran, VHDL.
+ Objective-C, Python, Fortran (fixed format Fortran: FortranFixed,
+ free formatted Fortran: FortranFree, unknown formatted Fortran: Fortran. In
+ the later case the parser tries to guess whether the code is fixed or free
+ formatted code, this is the default for Fortran type files), VHDL.
For instance to make doxygen treat
<code>.inc</code> files as Fortran files (default is PHP), and <code>.f</code> files as C (default is Fortran),
@@ -1553,7 +1566,7 @@ to disable this feature.
<docs>
<![CDATA[
If the \c CLANG_ASSISTED_PARSING tag is set to \c YES, then doxygen will use the
- <a href="http://clang.llvm.org/">clang parser</a> for more acurate parsing
+ <a href="http://clang.llvm.org/">clang parser</a> for more accurate parsing
at the cost of reduced performance. This can be particularly helpful with
template rich C++ code for which doxygen's built-in parser lacks the
necessary type information.
@@ -2016,7 +2029,8 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
<![CDATA[
The \c BINARY_TOC flag
controls whether a binary table of contents is generated (\c YES) or a
- normal table of contents (\c NO) in the `.chm` file.
+ normal table of contents (\c NO) in the `.chm` file. Furthermore it enables
+ the `Previous` and `Next` buttons.
]]>
</docs>
</option>
@@ -2328,7 +2342,7 @@ MATHJAX_CODEFILE = disableRenderer.js
When the \c SERVER_BASED_SEARCH tag is enabled the search engine will be
implemented using a web server instead of a web client using Javascript.
-There are two flavours of web server based searching depending on the
+There are two flavors of web server based searching depending on the
\ref cfg_external_search "EXTERNAL_SEARCH" setting. When disabled,
doxygen will generate a PHP script for searching and an index file used
by the script. When \ref cfg_external_search "EXTERNAL_SEARCH" is
@@ -2679,6 +2693,15 @@ EXTRA_PACKAGES=times
]]>
</docs>
</option>
+ <option type='string' id='MAN_SUBDIR' format='string' defval='' depends='GENERATE_MAN'>
+ <docs>
+<![CDATA[
+ The \c MAN_SUBDIR tag determines the name of the directory created within \c MAN_OUTPUT
+ in which the man pages are placed. If defaults to man followed by \c MAN_EXTENSION
+ with the initial . removed.
+]]>
+ </docs>
+ </option>
<option type='bool' id='MAN_LINKS' defval='0' depends='GENERATE_MAN'>
<docs>
<![CDATA[
@@ -2709,24 +2732,6 @@ EXTRA_PACKAGES=times
]]>
</docs>
</option>
- <option type='string' id='XML_SCHEMA' format='string' defval='' depends='GENERATE_XML'>
- <docs>
-<![CDATA[
- The \c XML_SCHEMA tag can be used to specify a XML schema,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-]]>
- </docs>
- </option>
- <option type='string' id='XML_DTD' format='string' defval='' depends='GENERATE_XML'>
- <docs>
-<![CDATA[
- The \c XML_DTD tag can be used to specify a XML DTD,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-]]>
- </docs>
- </option>
<option type='bool' id='XML_PROGRAMLISTING' defval='1' depends='GENERATE_XML'>
<docs>
<![CDATA[
@@ -2921,7 +2926,7 @@ put in front of it.
<docs>
<![CDATA[
If the \c SKIP_FUNCTION_MACROS tag is set to \c YES then
- doxygen's preprocessor will remove all refrences to function-like macros that are alone
+ doxygen's preprocessor will remove all references to function-like macros that are alone
on a line, have an all uppercase name, and do not end with a semicolon.
Such function macros are typically
used for boiler-plate code, and will confuse the parser if not removed.
@@ -2949,7 +2954,7 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs.
See the section \ref external for more information about the use of tag files.
\note
- Each tag file must have an unique name
+ Each tag file must have a unique name
(where the name does \e NOT include the path).
If a tag file is not located in the directory in which doxygen
is run, you must also specify the path to the tagfile here.
@@ -3362,5 +3367,7 @@ remove the intermediate dot files that are used to generate the various graphs.
<option type='obsolete' id='SHOW_DIRECTORIES'/>
<option type='obsolete' id='HTML_ALIGN_MEMBERS'/>
<option type='obsolete' id='SYMBOL_CACHE_SIZE'/>
+ <option type='obsolete' id='XML_SCHEMA'/>
+ <option type='obsolete' id='XML_DTD'/>
</group>
</doxygenconfig>
diff --git a/src/configgen.py b/src/configgen.py
index 4aed8bf..8ec0caa 100755
--- a/src/configgen.py
+++ b/src/configgen.py
@@ -1,7 +1,7 @@
#!/usr/bin/python
# python script to generate configoptions.cpp and config.doc from config.xml
#
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -201,6 +201,19 @@ def prepCDocs(node):
else:
if abspath == '1':
doc += "<br/>The file has to be specified with full path."
+ elif file =='image':
+ abspath = node.getAttribute('abspath')
+ if defval != '':
+ if abspath != '1':
+ doc += "<br/>The default image is: <code>%s</code>." % (
+ defval)
+ else:
+ doc += "<br/>%s: %s%s%s." % (
+ "The default image (with absolute path) is",
+ "<code>",defval,"</code>")
+ else:
+ if abspath == '1':
+ doc += "<br/>The image has to be specified with full path."
else: # format == 'string':
if defval != '':
doc += "<br/>The default value is: <code>%s</code>." % (
@@ -262,6 +275,8 @@ def parseOption(node):
print " cs->setDefaultValue(\"%s\");" % (defval)
if format == 'file':
print " cs->setWidgetType(ConfigString::File);"
+ elif format == 'image':
+ print " cs->setWidgetType(ConfigString::Image);"
elif format == 'dir':
print " cs->setWidgetType(ConfigString::Dir);"
if depends != '':
@@ -453,6 +468,21 @@ def parseOptionDoc(node, first):
if abspath == '1':
print ""
print "The file has to be specified with full path."
+ elif file =='image':
+ abspath = node.getAttribute('abspath')
+ if defval != '':
+ print ""
+ if abspath != '1':
+ print "The default image is: <code>%s</code>." % (
+ defval)
+ else:
+ print "%s: %s%s%s." % (
+ "The default image (with absolute path) is",
+ "<code>",defval,"</code>")
+ else:
+ if abspath == '1':
+ print ""
+ print "The image has to be specified with full path."
else: # format == 'string':
if defval != '':
print ""
diff --git a/src/configoptions.h b/src/configoptions.h
index 8b4fc22..be8ecf6 100644
--- a/src/configoptions.h
+++ b/src/configoptions.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/constexp.h b/src/constexp.h
index 1828b0b..27ca039 100644
--- a/src/constexp.h
+++ b/src/constexp.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/constexp.l b/src/constexp.l
index b333c72..bb4f842 100644
--- a/src/constexp.l
+++ b/src/constexp.l
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/constexp.y b/src/constexp.y
index 421e26e..1475c1c 100644
--- a/src/constexp.y
+++ b/src/constexp.y
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/context.cpp b/src/context.cpp
index e573dde..2d46c86 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -27,6 +27,8 @@
// TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other
// files as well
+#define ADD_PROPERTY(name) addProperty(#name,this,&Private::name);
+
struct ContextGlobals
{
enum OutputFormat
@@ -65,12 +67,37 @@ template<class T> class ScopedPtr
void reset(T *p=0) { if (p!=m_ptr) { delete m_ptr; m_ptr = p; } }
};
+/** @brief Reference counting smart pointer */
+template<class T> class SharedPtr
+{
+ private:
+ T *m_ptr;
+ SharedPtr(const SharedPtr &);
+ SharedPtr &operator=(const SharedPtr &p);
+ void operator==(const SharedPtr &) const;
+ void operator!=(const SharedPtr &) const;
+
+ public:
+ typedef T Type;
+ explicit SharedPtr(T *p=0) : m_ptr(p) { if (m_ptr) m_ptr->addRef(); }
+ ~SharedPtr() { if (m_ptr) m_ptr->release(); };
+ T &operator*() const { return *m_ptr; }
+ T *operator->() const { return m_ptr; }
+ T *get() const { return m_ptr; }
+ operator bool() const { return m_ptr!=0; }
+ void reset(T *p=0)
+ {
+ if (p) p->addRef();
+ if (m_ptr) m_ptr->release();
+ m_ptr = p;
+ }
+};
+
/** @brief Template List iterator support */
-template<class T>
class GenericConstIterator : public TemplateListIntf::ConstIterator
{
public:
- GenericConstIterator(const QList<T> &list)
+ GenericConstIterator(const QList<TemplateVariant> &list)
: m_it(list) { }
virtual ~GenericConstIterator() {}
void toFirst()
@@ -93,7 +120,7 @@ class GenericConstIterator : public TemplateListIntf::ConstIterator
{
if (m_it.current())
{
- v = m_it.current();
+ v = *m_it.current();
return TRUE;
}
else
@@ -103,17 +130,16 @@ class GenericConstIterator : public TemplateListIntf::ConstIterator
}
}
private:
- QListIterator<T> m_it;
+ QListIterator<TemplateVariant> m_it;
};
//------------------------------------------------------------------------
/** @brief standard template list implementation */
-template<class T>
class GenericNodeListContext : public TemplateListIntf
{
public:
- GenericNodeListContext()
+ GenericNodeListContext() : m_refCount(0)
{
m_children.setAutoDelete(TRUE);
}
@@ -128,31 +154,45 @@ class GenericNodeListContext : public TemplateListIntf
TemplateVariant result;
if (index>=0 && index<count())
{
- result = m_children.at(index);
+ result = *m_children.at(index);
}
return result;
}
TemplateListIntf::ConstIterator *createIterator() const
{
- return new GenericConstIterator<T>(m_children);
+ return new GenericConstIterator(m_children);
}
- void append(T *ctn)
+ void append(const TemplateVariant &ctn)
{
- m_children.append(ctn);
+ m_children.append(new TemplateVariant(ctn));
}
bool isEmpty() const
{
return m_children.isEmpty();
}
+ int addRef()
+ {
+ return ++m_refCount;
+ }
+ int release()
+ {
+ int count = --m_refCount;
+ if (count<=0)
+ {
+ delete this;
+ }
+ return count;
+ }
private:
- mutable QList<T> m_children;
+ mutable QList<TemplateVariant> m_children;
+ int m_refCount;
};
//------------------------------------------------------------------------
/** @brief Helper class to map a property name to a handler member function */
-class PropertyMapper
+class PropertyMapper
{
private:
struct PropertyFuncIntf
@@ -224,29 +264,34 @@ class PropertyMapper
class ConfigContext::Private
{
public:
- Private() { cachedLists.setAutoDelete(TRUE); }
+ Private() { m_cachedLists.setAutoDelete(TRUE); }
+ ~Private() { }
TemplateVariant fetchList(const QCString &name,const QStrList *list)
{
- TemplateList *tlist = cachedLists.find(name);
- if (tlist==0)
+ TemplateVariant *v = m_cachedLists.find(name);
+ if (v==0)
{
- tlist = new TemplateList;
- cachedLists.insert(name,tlist);
+ TemplateList *tlist = TemplateList::alloc();
+ m_cachedLists.insert(name,new TemplateVariant(tlist));
QStrListIterator li(*list);
char *s;
for (li.toFirst();(s=li.current());++li)
{
tlist->append(s);
}
+ return tlist;
+ }
+ else
+ {
+ return *v;
}
- return tlist;
}
private:
- QDict<TemplateList> cachedLists;
+ QDict<TemplateVariant> m_cachedLists;
};
//%% }
-ConfigContext::ConfigContext()
+ConfigContext::ConfigContext() : RefCountedContext("ConfigContext")
{
p = new Private;
}
@@ -310,7 +355,7 @@ class DoxygenContext::Private : public PropertyMapper
};
//%% }
-DoxygenContext::DoxygenContext()
+DoxygenContext::DoxygenContext() : RefCountedContext("DoxygenContext")
{
p = new Private;
}
@@ -453,6 +498,18 @@ class TranslateContext::Private : public PropertyMapper
}
return TemplateVariant();
}
+ TemplateVariant handleIncludeDependencyGraph(const QValueList<TemplateVariant> &args) const
+ {
+ if (args.count()==1)
+ {
+ return theTranslator->trInclDepGraph(args[0].toString());
+ }
+ else
+ {
+ err("tr.includeDependencyGraph should take one string argument, got %d\n",args.count());
+ }
+ return TemplateVariant();
+ }
@@ -483,11 +540,17 @@ class TranslateContext::Private : public PropertyMapper
TemplateVariant classes() const
{
return theTranslator->trClasses();
+ // TODO: VHDL: trVhdlType(VhdlDocGen::ENTITY,FALSE)
+ // TODO: Fortran: trDataTypes()
}
TemplateVariant classList() const
{
return theTranslator->trCompoundList();
}
+ TemplateVariant classListDescription() const
+ {
+ return theTranslator->trCompoundListDescription();
+ }
TemplateVariant classIndex() const
{
return theTranslator->trCompoundIndex();
@@ -669,6 +732,47 @@ class TranslateContext::Private : public PropertyMapper
{
return theTranslator->trAdditionalInheritedMembers();
}
+ TemplateVariant includeDependencyGraph() const
+ {
+ return TemplateVariant::Delegate::fromMethod<Private,&Private::handleIncludeDependencyGraph>(this);
+ }
+ TemplateVariant includedByDependencyGraph() const
+ {
+ return theTranslator->trInclByDepGraph();
+ }
+ TemplateVariant gotoSourceCode() const
+ {
+ return theTranslator->trGotoSourceCode();
+ }
+ TemplateVariant gotoDocumentation() const
+ {
+ return theTranslator->trGotoDocumentation();
+ }
+ TemplateVariant constantgroups() const
+ {
+ return theTranslator->trConstantGroups();
+ }
+ TemplateVariant classDocumentation() const
+ {
+ return theTranslator->trClassDocumentation();
+ }
+ TemplateVariant compoundMembers() const
+ {
+ return theTranslator->trCompoundMembers();
+ }
+ TemplateVariant detailLevel() const
+ {
+ return theTranslator->trDetailLevel();
+ }
+ TemplateVariant fileListDescription() const
+ {
+ bool extractAll = Config_getBool("EXTRACT_ALL");
+ return theTranslator->trFileListDescription(extractAll);
+ }
+ TemplateVariant directories() const
+ {
+ return theTranslator->trDirectories();
+ }
Private()
{
//%% string generatedBy
@@ -683,6 +787,8 @@ class TranslateContext::Private : public PropertyMapper
addProperty("classes", this,&Private::classes);
//%% string classList
addProperty("classList", this,&Private::classList);
+ //%% string classListDescription
+ addProperty("classListDescription", this,&Private::classListDescription);
//%% string classIndex
addProperty("classIndex", this,&Private::classIndex);
//%% string classHierarchy
@@ -761,6 +867,26 @@ class TranslateContext::Private : public PropertyMapper
addProperty("inheritedFrom", this,&Private::inheritedFrom);
//%% string addtionalInheritedMembers
addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers);
+ //%% string includeDependencyGraph:container_name
+ addProperty("includeDependencyGraph",this,&Private::includeDependencyGraph);
+ //%% string includedByDependencyGraph
+ addProperty("includedByDependencyGraph",this,&Private::includedByDependencyGraph);
+ //%% string gotoSourceCode
+ addProperty("gotoSourceCode", this,&Private::gotoSourceCode);
+ //%% string gotoDocumentation
+ addProperty("gotoDocumentation", this,&Private::gotoDocumentation);
+ //%% string constantgroups
+ addProperty("constantgroups", this,&Private::constantgroups);
+ //%% string classDocumentation
+ addProperty("classDocumentation", this,&Private::classDocumentation);
+ //%% string compoundMembers
+ addProperty("compoundMembers", this,&Private::compoundMembers);
+ //%% string detailLevel
+ addProperty("detailLevel", this,&Private::detailLevel);
+ //%% string fileListDescription
+ addProperty("fileListDescription",this,&Private::fileListDescription);
+ //%% string directories
+ addProperty("directories", this,&Private::directories);
m_javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
m_fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
@@ -773,7 +899,7 @@ class TranslateContext::Private : public PropertyMapper
};
//%% }
-TranslateContext::TranslateContext()
+TranslateContext::TranslateContext() : RefCountedContext("TranslateContext")
{
p = new Private;
}
@@ -823,6 +949,31 @@ static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const Q
return TemplateVariant(s.data(),TRUE);
}
+static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
+{
+ static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(fd->getDefFileExtension());
+ pIntf->resetCodeParserState();
+ QGString s;
+ FTextStream t(&s);
+ HtmlCodeGenerator codeGen(t,relPath);
+ pIntf->parseCode(codeGen,0,
+ fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
+ fd->getLanguage(), // lang
+ FALSE, // isExampleBlock
+ 0, // exampleName
+ fd, // fileDef
+ -1, // startLine
+ -1, // endLine
+ FALSE, // inlineFragment
+ 0, // memberDef
+ TRUE, // showLineNumbers
+ 0, // searchCtx
+ TRUE // collectXRefs, TODO: should become FALSE
+ );
+ return TemplateVariant(s.data(),TRUE);
+}
+
//------------------------------------------------------------------------
//%% struct Symbol: shared info for all symbols
@@ -864,29 +1015,33 @@ class DefinitionContext : public PropertyMapper
//%% list[Definition] navigationPath: Breadcrumb navigation path to this item
addProperty("navigationPath",this,&DefinitionContext::navigationPath);
+ m_cache.sourceDef.reset(TemplateList::alloc());
+ m_cache.lineLink.reset(TemplateStruct::alloc());
+ m_cache.fileLink.reset(TemplateStruct::alloc());
+
if (m_def && !m_def->getSourceFileBase().isEmpty())
{
- m_sourceDef.append(&m_lineLink);
- m_sourceDef.append(&m_fileLink);
- m_lineLink.set("text",m_def->getStartBodyLine());
- m_lineLink.set("isLinkable",TRUE);
- m_lineLink.set("fileName",m_def->getSourceFileBase());
- m_lineLink.set("anchor",m_def->getSourceAnchor());
+ m_cache.lineLink->set("text",m_def->getStartBodyLine());
+ m_cache.lineLink->set("isLinkable",TRUE);
+ m_cache.lineLink->set("fileName",m_def->getSourceFileBase());
+ m_cache.lineLink->set("anchor",m_def->getSourceAnchor());
if (m_def->definitionType()==Definition::TypeFile)
{
- m_fileLink.set("text",m_def->name());
+ m_cache.fileLink->set("text",m_def->name());
}
else if (m_def->getBodyDef())
{
- m_fileLink.set("text",m_def->getBodyDef()->name());
+ m_cache.fileLink->set("text",m_def->getBodyDef()->name());
}
else
{
- m_fileLink.set("text",name());
+ m_cache.fileLink->set("text",name());
}
- m_fileLink.set("isLinkable",TRUE);
- m_fileLink.set("fileName",m_def->getSourceFileBase());
- m_fileLink.set("anchor",QCString());
+ m_cache.fileLink->set("isLinkable",TRUE);
+ m_cache.fileLink->set("fileName",m_def->getSourceFileBase());
+ m_cache.fileLink->set("anchor",QCString());
+ m_cache.sourceDef->append(m_cache.lineLink.get());
+ m_cache.sourceDef->append(m_cache.fileLink.get());
}
}
TemplateVariant fileName() const
@@ -997,9 +1152,9 @@ class DefinitionContext : public PropertyMapper
}
TemplateVariant sourceDef() const
{
- if (m_sourceDef.count()==2)
+ if (m_cache.sourceDef->count()==2)
{
- return &m_sourceDef;
+ return m_cache.sourceDef.get();
}
else
{
@@ -1018,16 +1173,21 @@ class DefinitionContext : public PropertyMapper
{
fillPath(((const FileDef*)def)->getDirDef(),list);
}
- NavPathElemContext *elem = new NavPathElemContext(def);
- list->append(elem);
- m_cache.navPathElems.append(elem);
+ list->append(NavPathElemContext::alloc(def));
}
TemplateVariant navigationPath() const
{
if (!m_cache.navPath)
{
- TemplateList *list = new TemplateList;
- fillPath(m_def,list);
+ TemplateList *list = TemplateList::alloc();
+ if (m_def->getOuterScope() && m_def->getOuterScope()!=Doxygen::globalScope)
+ {
+ fillPath(m_def->getOuterScope(),list);
+ }
+ else if (m_def->definitionType()==Definition::TypeFile && ((const FileDef *)m_def)->getDirDef())
+ {
+ fillPath(((const FileDef *)m_def)->getDirDef(),list);
+ }
m_cache.navPath.reset(list);
}
return m_cache.navPath.get();
@@ -1037,17 +1197,16 @@ class DefinitionContext : public PropertyMapper
Definition *m_def;
struct Cachable
{
- Cachable() { navPathElems.setAutoDelete(TRUE); }
+ Cachable() { }
ScopedPtr<TemplateVariant> details;
ScopedPtr<TemplateVariant> brief;
ScopedPtr<TemplateVariant> inbodyDocs;
- ScopedPtr<TemplateList> navPath;
- QList<NavPathElemContext> navPathElems;
+ SharedPtr<TemplateList> navPath;
+ SharedPtr<TemplateList> sourceDef;
+ SharedPtr<TemplateStruct> fileLink;
+ SharedPtr<TemplateStruct> lineLink;
};
mutable Cachable m_cache;
- TemplateList m_sourceDef;
- TemplateStruct m_fileLink;
- TemplateStruct m_lineLink;
};
//%% }
@@ -1058,9 +1217,8 @@ class DefinitionContext : public PropertyMapper
class IncludeInfoContext::Private : public PropertyMapper
{
public:
- Private(IncludeInfo *info,SrcLangExt lang) :
+ Private(const IncludeInfo *info,SrcLangExt lang) :
m_info(info),
- m_fileContext(info && info->fileDef ? info->fileDef : 0),
m_lang(lang)
{
if (m_info)
@@ -1082,9 +1240,13 @@ class IncludeInfoContext::Private : public PropertyMapper
}
TemplateVariant file() const
{
- if (m_info->fileDef)
+ if (!m_fileContext && m_info && m_info->fileDef)
{
- return &m_fileContext;
+ m_fileContext.reset(FileContext::alloc(m_info->fileDef));
+ }
+ if (m_fileContext)
+ {
+ return m_fileContext.get();
}
else
{
@@ -1096,12 +1258,12 @@ class IncludeInfoContext::Private : public PropertyMapper
return m_info->includeName;
}
private:
- IncludeInfo *m_info;
- FileContext m_fileContext;
+ const IncludeInfo *m_info;
+ mutable SharedPtr<FileContext> m_fileContext;
SrcLangExt m_lang;
};
-IncludeInfoContext::IncludeInfoContext(IncludeInfo *info,SrcLangExt lang)
+IncludeInfoContext::IncludeInfoContext(const IncludeInfo *info,SrcLangExt lang) : RefCountedContext("IncludeContext")
{
p = new Private(info,lang);
}
@@ -1119,14 +1281,59 @@ TemplateVariant IncludeInfoContext::get(const char *n) const
//------------------------------------------------------------------------
+//%% list IncludeInfoList[Class] : list of nested classes
+class IncludeInfoListContext::Private : public GenericNodeListContext
+{
+ public:
+ Private(const QList<IncludeInfo> &list,SrcLangExt lang)
+ {
+ QListIterator<IncludeInfo> li(list);
+ IncludeInfo *ii;
+ for (li.toFirst();(ii=li.current());++li)
+ {
+ if (!ii->indirect)
+ {
+ append(IncludeInfoContext::alloc(ii,lang));
+ }
+ }
+ }
+};
+
+IncludeInfoListContext::IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang) : RefCountedContext("IncludeListContext")
+{
+ p = new Private(list,lang);
+}
+
+IncludeInfoListContext::~IncludeInfoListContext()
+{
+ delete p;
+}
+
+// TemplateListIntf
+int IncludeInfoListContext::count() const
+{
+ return p->count();
+}
+
+TemplateVariant IncludeInfoListContext::at(int index) const
+{
+ return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *IncludeInfoListContext::createIterator() const
+{
+ return p->createIterator();
+}
+
+//------------------------------------------------------------------------
+
//%% struct Class(Symbol): class information
//%% {
class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
public:
- Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd) ,
- m_classDef(cd), m_usedFiles(cd),
- m_includeInfo(cd ? cd->includeInfo() : 0, cd ? cd->getLanguage() : SrcLangExt_Unknown)
+ Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd),
+ m_classDef(cd)
{
addProperty("title", this,&Private::title);
addProperty("highlight", this,&Private::highlight);
@@ -1139,7 +1346,6 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
addProperty("hasCollaborationDiagram", this,&Private::hasCollaborationDiagram);
addProperty("collaborationDiagram", this,&Private::collaborationDiagram);
addProperty("includeInfo", this,&Private::includeInfo);
- addProperty("includeStatement", this,&Private::includeStatement);
addProperty("inherits", this,&Private::inherits);
addProperty("inheritedBy", this,&Private::inheritedBy);
addProperty("unoIDLServices", this,&Private::unoIDLServices);
@@ -1182,7 +1388,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
addProperty("detailedVariables", this,&Private::detailedVariables);
addProperty("detailedProperties", this,&Private::detailedProperties);
addProperty("detailedEvents", this,&Private::detailedEvents);
- addProperty("nestedClasses", this,&Private::nestedClasses);
+ addProperty("classes", this,&Private::classes);
addProperty("compoundType", this,&Private::compoundType);
addProperty("templateDecls", this,&Private::templateDecls);
addProperty("typeConstraints", this,&Private::typeConstraints);
@@ -1215,7 +1421,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
}
TemplateVariant usedFiles() const
{
- return TemplateVariant(&m_usedFiles);
+ if (!m_cache.usedFiles)
+ {
+ m_cache.usedFiles.reset(UsedFilesContext::alloc(m_classDef));
+ }
+ return m_cache.usedFiles.get();
}
DotClassGraph *getClassGraph() const
{
@@ -1317,24 +1527,24 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
TemplateVariant includeInfo() const
{
- if (m_classDef->includeInfo())
+ if (!m_cache.includeInfo && m_classDef->includeInfo())
+ {
+ m_cache.includeInfo.reset(IncludeInfoContext::alloc(m_classDef->includeInfo(),m_classDef->getLanguage()));
+ }
+ if (m_cache.includeInfo)
{
- return TemplateVariant(&m_includeInfo);
+ return m_cache.includeInfo.get();
}
else
{
return TemplateVariant(FALSE);
}
}
- TemplateVariant includeStatement() const
- {
- return m_classDef->includeStatement();
- }
TemplateVariant inherits() const
{
if (!m_cache.inheritsList)
{
- m_cache.inheritsList.reset(new InheritanceListContext(m_classDef->baseClasses(),TRUE));
+ m_cache.inheritsList.reset(InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE));
}
return m_cache.inheritsList.get();
}
@@ -1342,11 +1552,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
if (!m_cache.inheritedByList)
{
- m_cache.inheritedByList.reset(new InheritanceListContext(m_classDef->subClasses(),FALSE));
+ m_cache.inheritedByList.reset(InheritanceListContext::alloc(m_classDef->subClasses(),FALSE));
}
return m_cache.inheritedByList.get();
}
- TemplateVariant getMemberList(ScopedPtr<MemberListInfoContext> &list,
+ TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
MemberListType type,const char *title,bool detailed=FALSE) const
{
if (!list)
@@ -1354,7 +1564,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
MemberList *ml = m_classDef->getMemberList(type);
if (ml)
{
- list.reset(new MemberListInfoContext(m_classDef,relPathAsString(),ml,title,detailed));
+ list.reset(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,detailed));
}
}
if (list)
@@ -1530,34 +1740,26 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
return getMemberList(m_cache.detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE);
}
- TemplateVariant nestedClasses() const
+ TemplateVariant classes() const
{
- static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
- static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
- static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
- if (!m_cache.nestedClasses)
+ if (!m_cache.classes)
{
- NestedClassListContext *classList = new NestedClassListContext;
+ NestedClassListContext *classList = NestedClassListContext::alloc();
if (m_classDef->getClassSDict())
{
ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
ClassDef *cd;
for (sdi.toFirst();(cd=sdi.current());++sdi)
{
- bool linkable = cd->isLinkable();
- if (cd->name().find('@')==-1 && !cd->isExtension() &&
- (cd->protection()!=::Private || extractPrivate) &&
- (linkable ||
- (!hideUndocClasses && (!cd->isLocal() || extractLocalClasses)))
- )
+ if (cd->visibleInParentsDeclList())
{
classList->append(cd);
}
}
}
- m_cache.nestedClasses.reset(classList);
+ m_cache.classes.reset(classList);
}
- return m_cache.nestedClasses.get();
+ return m_cache.classes.get();
}
TemplateVariant compoundType() const
{
@@ -1575,10 +1777,9 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
ClassDef *cd=(ClassDef *)d;
if (cd->templateArguments())
{
- ArgumentListContext *al = new ArgumentListContext(cd->templateArguments(),cd,relPathAsString());
+ ArgumentListContext *al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString());
// since a TemplateVariant does take ownership of the object, we add it
// a separate list just to be able to delete it and avoid a memory leak
- m_cache.templateArgList.append(al);
tl->append(al);
}
}
@@ -1591,8 +1792,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
Example *ex;
for (it.toFirst();(ex=it.current());++it)
{
- TemplateStruct *s = new TemplateStruct;
- m_cache.exampleList.append(s);
+ TemplateStruct *s = TemplateStruct::alloc();
s->set("text",ex->name);
s->set("isLinkable",TRUE);
s->set("anchor",ex->anchor);
@@ -1605,7 +1805,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
if (!m_cache.templateDecls)
{
- TemplateList *tl = new TemplateList;
+ TemplateList *tl = TemplateList::alloc();
addTemplateDecls(m_classDef,tl);
m_cache.templateDecls.reset(tl);
}
@@ -1615,11 +1815,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
if (!m_cache.typeConstraints && m_classDef->typeConstraints())
{
- m_cache.typeConstraints.reset(new ArgumentListContext(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
+ m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
}
else
{
- m_cache.typeConstraints.reset(new ArgumentListContext);
+ m_cache.typeConstraints.reset(ArgumentListContext::alloc());
}
return m_cache.typeConstraints.get();
}
@@ -1627,7 +1827,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
if (!m_cache.examples)
{
- TemplateList *exampleList = new TemplateList;
+ TemplateList *exampleList = TemplateList::alloc();
addExamples(exampleList);
m_cache.examples.reset(exampleList);
}
@@ -1682,20 +1882,23 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
addMembers(m_classDef,MemberListType_priAttribs);
addMembers(m_classDef,MemberListType_priStaticAttribs);
addMembers(m_classDef,MemberListType_related);
- m_cache.members.reset(new MemberListContext(&m_cache.allMembers));
+ m_cache.members.reset(MemberListContext::alloc(&m_cache.allMembers));
}
return m_cache.members.get();
}
TemplateVariant allMembersList() const
{
- if (!m_cache.allMembersList && m_classDef->memberNameInfoSDict())
+ if (!m_cache.allMembersList)
{
- AllMembersListContext *ml = new AllMembersListContext(m_classDef->memberNameInfoSDict());
- m_cache.allMembersList.reset(ml);
- }
- else
- {
- m_cache.allMembersList.reset(new AllMembersListContext);
+ if (m_classDef->memberNameInfoSDict())
+ {
+ AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoSDict());
+ m_cache.allMembersList.reset(ml);
+ }
+ else
+ {
+ m_cache.allMembersList.reset(AllMembersListContext::alloc());
+ }
}
return m_cache.allMembersList.get();
}
@@ -1709,11 +1912,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
if (m_classDef->getMemberGroupSDict())
{
- m_cache.memberGroups.reset(new MemberGroupListContext(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
+ m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
}
else
{
- m_cache.memberGroups.reset(new MemberGroupListContext);
+ m_cache.memberGroups.reset(MemberGroupListContext::alloc());
}
}
return m_cache.memberGroups.get();
@@ -1722,7 +1925,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
if (!m_cache.additionalInheritedMembers)
{
- InheritedMemberInfoListContext *ctx = new InheritedMemberInfoListContext;
+ InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes());
ctx->addMemberList(m_classDef,MemberListType_services,theTranslator->trServices());
ctx->addMemberList(m_classDef,MemberListType_interfaces,theTranslator->trInterfaces());
@@ -1763,78 +1966,72 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
private:
ClassDef *m_classDef;
- UsedFilesContext m_usedFiles;
- IncludeInfoContext m_includeInfo;
struct Cachable
{
- Cachable() : inheritanceNodes(-1)
- {
- templateArgList.setAutoDelete(TRUE);
- exampleList.setAutoDelete(TRUE);
- allMembers.setAutoDelete(TRUE);
- }
- ScopedPtr<InheritanceListContext> inheritsList;
- ScopedPtr<InheritanceListContext> inheritedByList;
+ Cachable() : inheritanceNodes(-1) { }
+ SharedPtr<IncludeInfoContext> includeInfo;
+ SharedPtr<InheritanceListContext> inheritsList;
+ SharedPtr<InheritanceListContext> inheritedByList;
ScopedPtr<DotClassGraph> classGraph;
ScopedPtr<DotClassGraph> collaborationGraph;
- ScopedPtr<NestedClassListContext> nestedClasses;
- ScopedPtr<MemberListInfoContext> publicTypes;
- ScopedPtr<MemberListInfoContext> publicMethods;
- ScopedPtr<MemberListInfoContext> publicStaticMethods;
- ScopedPtr<MemberListInfoContext> publicAttributes;
- ScopedPtr<MemberListInfoContext> publicStaticAttributes;
- ScopedPtr<MemberListInfoContext> publicSlots;
- ScopedPtr<MemberListInfoContext> protectedTypes;
- ScopedPtr<MemberListInfoContext> protectedMethods;
- ScopedPtr<MemberListInfoContext> protectedStaticMethods;
- ScopedPtr<MemberListInfoContext> protectedAttributes;
- ScopedPtr<MemberListInfoContext> protectedStaticAttributes;
- ScopedPtr<MemberListInfoContext> protectedSlots;
- ScopedPtr<MemberListInfoContext> privateTypes;
- ScopedPtr<MemberListInfoContext> privateMethods;
- ScopedPtr<MemberListInfoContext> privateStaticMethods;
- ScopedPtr<MemberListInfoContext> privateAttributes;
- ScopedPtr<MemberListInfoContext> privateStaticAttributes;
- ScopedPtr<MemberListInfoContext> privateSlots;
- ScopedPtr<MemberListInfoContext> packageTypes;
- ScopedPtr<MemberListInfoContext> packageMethods;
- ScopedPtr<MemberListInfoContext> packageStaticMethods;
- ScopedPtr<MemberListInfoContext> packageAttributes;
- ScopedPtr<MemberListInfoContext> packageStaticAttributes;
- ScopedPtr<MemberListInfoContext> unoIDLServices;
- ScopedPtr<MemberListInfoContext> unoIDLInterfaces;
- ScopedPtr<MemberListInfoContext> signals;
- ScopedPtr<MemberListInfoContext> properties;
- ScopedPtr<MemberListInfoContext> events;
- ScopedPtr<MemberListInfoContext> friends;
- ScopedPtr<MemberListInfoContext> related;
- ScopedPtr<MemberListInfoContext> detailedTypedefs;
- ScopedPtr<MemberListInfoContext> detailedEnums;
- ScopedPtr<MemberListInfoContext> detailedServices;
- ScopedPtr<MemberListInfoContext> detailedInterfaces;
- ScopedPtr<MemberListInfoContext> detailedConstructors;
- ScopedPtr<MemberListInfoContext> detailedMethods;
- ScopedPtr<MemberListInfoContext> detailedRelated;
- ScopedPtr<MemberListInfoContext> detailedVariables;
- ScopedPtr<MemberListInfoContext> detailedProperties;
- ScopedPtr<MemberListInfoContext> detailedEvents;
- ScopedPtr<MemberGroupListContext> memberGroups;
- ScopedPtr<AllMembersListContext> allMembersList;
- ScopedPtr<ArgumentListContext> typeConstraints;
- ScopedPtr<TemplateList> examples;
- ScopedPtr<TemplateList> templateDecls;
- ScopedPtr<InheritedMemberInfoListContext> additionalInheritedMembers;
- ScopedPtr<MemberListContext> members;
- QList<ArgumentListContext> templateArgList;
- int inheritanceNodes;
- QList<TemplateStruct> exampleList;
- MemberList allMembers;
+ SharedPtr<NestedClassListContext> classes;
+ SharedPtr<MemberListInfoContext> publicTypes;
+ SharedPtr<MemberListInfoContext> publicMethods;
+ SharedPtr<MemberListInfoContext> publicStaticMethods;
+ SharedPtr<MemberListInfoContext> publicAttributes;
+ SharedPtr<MemberListInfoContext> publicStaticAttributes;
+ SharedPtr<MemberListInfoContext> publicSlots;
+ SharedPtr<MemberListInfoContext> protectedTypes;
+ SharedPtr<MemberListInfoContext> protectedMethods;
+ SharedPtr<MemberListInfoContext> protectedStaticMethods;
+ SharedPtr<MemberListInfoContext> protectedAttributes;
+ SharedPtr<MemberListInfoContext> protectedStaticAttributes;
+ SharedPtr<MemberListInfoContext> protectedSlots;
+ SharedPtr<MemberListInfoContext> privateTypes;
+ SharedPtr<MemberListInfoContext> privateMethods;
+ SharedPtr<MemberListInfoContext> privateStaticMethods;
+ SharedPtr<MemberListInfoContext> privateAttributes;
+ SharedPtr<MemberListInfoContext> privateStaticAttributes;
+ SharedPtr<MemberListInfoContext> privateSlots;
+ SharedPtr<MemberListInfoContext> packageTypes;
+ SharedPtr<MemberListInfoContext> packageMethods;
+ SharedPtr<MemberListInfoContext> packageStaticMethods;
+ SharedPtr<MemberListInfoContext> packageAttributes;
+ SharedPtr<MemberListInfoContext> packageStaticAttributes;
+ SharedPtr<MemberListInfoContext> unoIDLServices;
+ SharedPtr<MemberListInfoContext> unoIDLInterfaces;
+ SharedPtr<MemberListInfoContext> signals;
+ SharedPtr<MemberListInfoContext> properties;
+ SharedPtr<MemberListInfoContext> events;
+ SharedPtr<MemberListInfoContext> friends;
+ SharedPtr<MemberListInfoContext> related;
+ SharedPtr<MemberListInfoContext> detailedTypedefs;
+ SharedPtr<MemberListInfoContext> detailedEnums;
+ SharedPtr<MemberListInfoContext> detailedServices;
+ SharedPtr<MemberListInfoContext> detailedInterfaces;
+ SharedPtr<MemberListInfoContext> detailedConstructors;
+ SharedPtr<MemberListInfoContext> detailedMethods;
+ SharedPtr<MemberListInfoContext> detailedRelated;
+ SharedPtr<MemberListInfoContext> detailedVariables;
+ SharedPtr<MemberListInfoContext> detailedProperties;
+ SharedPtr<MemberListInfoContext> detailedEvents;
+ SharedPtr<MemberGroupListContext> memberGroups;
+ SharedPtr<AllMembersListContext> allMembersList;
+ SharedPtr<ArgumentListContext> typeConstraints;
+ SharedPtr<TemplateList> examples;
+ SharedPtr<TemplateList> templateDecls;
+ SharedPtr<InheritedMemberInfoListContext> additionalInheritedMembers;
+ SharedPtr<MemberListContext> members;
+ SharedPtr<UsedFilesContext> usedFiles;
+ SharedPtr<TemplateList> exampleList;
+ int inheritanceNodes;
+ MemberList allMembers;
};
mutable Cachable m_cache;
};
//%% }
-ClassContext::ClassContext(ClassDef *cd)
+ClassContext::ClassContext(ClassDef *cd) : RefCountedContext("ClassContext")
{
//printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>");
p = new Private(cd);
@@ -1862,6 +2059,8 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
addProperty("title",this,&Private::title);
addProperty("highlight",this,&Private::highlight);
addProperty("subhighlight",this,&Private::subHighlight);
+ addProperty("compoundType",this,&Private::compoundType);
+ addProperty("hasDetails",this,&Private::hasDetails);
}
TemplateVariant title() const
{
@@ -1875,12 +2074,20 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
{
return TemplateVariant("");
}
+ TemplateVariant compoundType() const
+ {
+ return m_namespaceDef->compoundTypeString();
+ }
+ TemplateVariant hasDetails() const
+ {
+ return m_namespaceDef->hasDetailedDescription();
+ }
private:
NamespaceDef *m_namespaceDef;
};
//%% }
-NamespaceContext::NamespaceContext(NamespaceDef *nd)
+NamespaceContext::NamespaceContext(NamespaceDef *nd) : RefCountedContext("NamespaceContext")
{
p = new Private(nd);
}
@@ -1904,10 +2111,36 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
public:
Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd)
{
- addProperty("title",this,&Private::title);
- addProperty("highlight",this,&Private::highlight);
- addProperty("subhighlight",this,&Private::subHighlight);
- addProperty("versionInfo",this,&Private::versionInfo);
+ if (fd==0) abort();
+ addProperty("title", this,&Private::title);
+ addProperty("highlight", this,&Private::highlight);
+ addProperty("subhighlight", this,&Private::subHighlight);
+ addProperty("versionInfo", this,&Private::versionInfo);
+ addProperty("includeList", this,&Private::includeList);
+ addProperty("hasIncludeGraph", this,&Private::hasIncludeGraph);
+ addProperty("hasIncludedByGraph", this,&Private::hasIncludedByGraph);
+ addProperty("includeGraph", this,&Private::includeGraph);
+ addProperty("includedByGraph", this,&Private::includedByGraph);
+ addProperty("hasDetails", this,&Private::hasDetails);
+ addProperty("hasSourceFile", this,&Private::hasSourceFile);
+ addProperty("sources", this,&Private::sources);
+ addProperty("version", this,&Private::version);
+ addProperty("classes", this,&Private::classes);
+ addProperty("namespaces", this,&Private::namespaces);
+ addProperty("constantgroups", this,&Private::constantgroups);
+ addProperty("macros", this,&Private::macros);
+ addProperty("typedefs", this,&Private::typedefs);
+ addProperty("enums", this,&Private::enums);
+ addProperty("functions", this,&Private::functions);
+ addProperty("variables", this,&Private::variables);
+ addProperty("memberGroups", this,&Private::memberGroups);
+ addProperty("detailedMacros", this,&Private::detailedMacros);
+ addProperty("detailedTypedefs", this,&Private::detailedTypedefs);
+ addProperty("detailedEnums", this,&Private::detailedEnums);
+ addProperty("detailedFunctions", this,&Private::detailedFunctions);
+ addProperty("detailedVariables", this,&Private::detailedVariables);
+ addProperty("inlineClasses", this,&Private::inlineClasses);
+ addProperty("compoundType", this,&Private::compoundType);
}
TemplateVariant title() const
{
@@ -1925,12 +2158,310 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
{
return m_fileDef->getVersion();
}
+ TemplateVariant includeList() const
+ {
+ if (!m_cache.includeInfoList && m_fileDef->includeFileList())
+ {
+ m_cache.includeInfoList.reset(IncludeInfoListContext::alloc(
+ *m_fileDef->includeFileList(),m_fileDef->getLanguage()));
+ }
+ if (m_cache.includeInfoList)
+ {
+ return m_cache.includeInfoList.get();
+ }
+ else
+ {
+ return TemplateVariant(FALSE);
+ }
+ }
+ DotInclDepGraph *getIncludeGraph() const
+ {
+ if (!m_cache.includeGraph)
+ {
+ m_cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
+ }
+ return m_cache.includeGraph.get();
+ }
+ TemplateVariant hasIncludeGraph() const
+ {
+ static bool haveDot = Config_getBool("HAVE_DOT");
+ DotInclDepGraph *incGraph = getIncludeGraph();
+ return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
+ }
+ TemplateVariant includeGraph() const
+ {
+ static bool haveDot = Config_getBool("HAVE_DOT");
+ QGString result;
+ if (haveDot)
+ {
+ DotInclDepGraph *cg = getIncludeGraph();
+ FTextStream t(&result);
+ cg->writeGraph(t,BITMAP,
+ g_globals.outputDir,
+ g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+ relPathAsString(),TRUE,g_globals.dynSectionId
+ );
+ }
+ g_globals.dynSectionId++;
+ return TemplateVariant(result.data(),TRUE);
+ }
+ DotInclDepGraph *getIncludedByGraph() const
+ {
+ if (!m_cache.includedByGraph)
+ {
+ m_cache.includedByGraph.reset(new DotInclDepGraph(m_fileDef,TRUE));
+ }
+ return m_cache.includedByGraph.get();
+ }
+ TemplateVariant hasIncludedByGraph() const
+ {
+ static bool haveDot = Config_getBool("HAVE_DOT");
+ DotInclDepGraph *incGraph = getIncludedByGraph();
+ return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
+ }
+ TemplateVariant includedByGraph() const
+ {
+ static bool haveDot = Config_getBool("HAVE_DOT");
+ QGString result;
+ if (haveDot)
+ {
+ DotInclDepGraph *cg = getIncludedByGraph();
+ FTextStream t(&result);
+ cg->writeGraph(t,BITMAP,
+ g_globals.outputDir,
+ g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+ relPathAsString(),TRUE,g_globals.dynSectionId
+ );
+ }
+ g_globals.dynSectionId++;
+ return TemplateVariant(result.data(),TRUE);
+ }
+ TemplateVariant hasDetails() const
+ {
+ return m_fileDef->hasDetailedDescription();
+ }
+ TemplateVariant hasSourceFile() const
+ {
+ return m_fileDef->generateSourceFile();
+ }
+ TemplateVariant sources() const
+ {
+ if (!m_cache.sources)
+ {
+ if (m_fileDef->generateSourceFile())
+ {
+ m_cache.sources.reset(new TemplateVariant(parseCode(m_fileDef,relPathAsString())));
+ }
+ else
+ {
+ m_cache.sources.reset(new TemplateVariant(""));
+ }
+ }
+ return *m_cache.sources;
+ }
+ TemplateVariant version() const
+ {
+ return m_fileDef->fileVersion();
+ }
+ TemplateVariant classes() const
+ {
+ if (!m_cache.classes)
+ {
+ NestedClassListContext *classList = NestedClassListContext::alloc();
+ if (m_fileDef->getClassSDict())
+ {
+ ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
+ ClassDef *cd;
+ for (sdi.toFirst();(cd=sdi.current());++sdi)
+ {
+ if (cd->visibleInParentsDeclList())
+ {
+ classList->append(cd);
+ }
+ }
+ }
+ m_cache.classes.reset(classList);
+ }
+ return m_cache.classes.get();
+ }
+ TemplateVariant namespaces() const
+ {
+ if (!m_cache.namespaces)
+ {
+ NestedNamespaceListContext *namespaceList = NestedNamespaceListContext::alloc();
+ if (m_fileDef->getNamespaceSDict())
+ {
+ NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
+ NamespaceDef *nd;
+ for (sdi.toFirst();(nd=sdi.current());++sdi)
+ {
+ if (nd->isLinkable() && !nd->isConstantGroup())
+ {
+ namespaceList->append(nd);
+ }
+ }
+ }
+ m_cache.namespaces.reset(namespaceList);
+ }
+ return m_cache.namespaces.get();
+ }
+ TemplateVariant constantgroups() const
+ {
+ if (!m_cache.constantgroups)
+ {
+ NestedNamespaceListContext *namespaceList = NestedNamespaceListContext::alloc();
+ if (m_fileDef->getNamespaceSDict())
+ {
+ NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
+ NamespaceDef *nd;
+ for (sdi.toFirst();(nd=sdi.current());++sdi)
+ {
+ if (nd->isLinkable() && nd->isConstantGroup())
+ {
+ namespaceList->append(nd);
+ }
+ }
+ }
+ m_cache.constantgroups.reset(namespaceList);
+ }
+ return m_cache.constantgroups.get();
+ }
+ TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
+ MemberListType type,const char *title,bool detailed=FALSE) const
+ {
+ if (!list)
+ {
+ MemberList *ml = m_fileDef->getMemberList(type);
+ if (ml)
+ {
+ list.reset(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,detailed));
+ }
+ }
+ if (list)
+ {
+ return list.get();
+ }
+ else
+ {
+ return TemplateVariant(FALSE);
+ }
+ }
+ TemplateVariant macros() const
+ {
+ return getMemberList(m_cache.macros,MemberListType_decDefineMembers,theTranslator->trDefines());
+ }
+ TemplateVariant typedefs() const
+ {
+ return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
+ }
+ TemplateVariant enums() const
+ {
+ return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
+ }
+ TemplateVariant functions() const
+ {
+ // TODO: Fortran: trSubprograms()
+ // TODO: VHDL: VhdlDocGen::trFunctionAndProc()
+ return getMemberList(m_cache.functions,MemberListType_decFuncMembers,theTranslator->trFunctions());
+ }
+ TemplateVariant variables() const
+ {
+ return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
+ }
+ TemplateVariant memberGroups() const
+ {
+ if (!m_cache.memberGroups)
+ {
+ if (m_fileDef->getMemberGroupSDict())
+ {
+ m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
+ }
+ else
+ {
+ m_cache.memberGroups.reset(MemberGroupListContext::alloc());
+ }
+ }
+ return m_cache.memberGroups.get();
+ }
+ TemplateVariant detailedMacros() const
+ {
+ return getMemberList(m_cache.detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
+ }
+ TemplateVariant detailedTypedefs() const
+ {
+ return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
+ }
+ TemplateVariant detailedEnums() const
+ {
+ return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
+ }
+ TemplateVariant detailedFunctions() const
+ {
+ // TODO: Fortran: trSubprogramDocumentation()
+ return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,theTranslator->trFunctionDocumentation());
+ }
+ TemplateVariant detailedVariables() const
+ {
+ return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
+ }
+ TemplateVariant inlineClasses() const
+ {
+ if (!m_cache.inlineClasses)
+ {
+ NestedClassListContext *classList = NestedClassListContext::alloc();
+ if (m_fileDef->getClassSDict())
+ {
+ ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
+ ClassDef *cd;
+ for (sdi.toFirst();(cd=sdi.current());++sdi)
+ {
+ if (cd->name().find('@')==-1 &&
+ cd->isLinkableInProject() &&
+ cd->isEmbeddedInOuterScope() &&
+ cd->partOfGroups()==0)
+ {
+ classList->append(cd);
+ }
+ }
+ }
+ m_cache.inlineClasses.reset(classList);
+ }
+ return m_cache.inlineClasses.get();
+ }
+ TemplateVariant compoundType() const
+ {
+ return theTranslator->trFile(FALSE,TRUE);
+ }
+
private:
FileDef *m_fileDef;
+ struct Cachable
+ {
+ SharedPtr<IncludeInfoListContext> includeInfoList;
+ ScopedPtr<DotInclDepGraph> includeGraph;
+ ScopedPtr<DotInclDepGraph> includedByGraph;
+ ScopedPtr<TemplateVariant> sources;
+ SharedPtr<NestedClassListContext> classes;
+ SharedPtr<NestedNamespaceListContext> namespaces;
+ SharedPtr<NestedNamespaceListContext> constantgroups;
+ SharedPtr<MemberListInfoContext> macros;
+ SharedPtr<MemberListInfoContext> typedefs;
+ SharedPtr<MemberListInfoContext> enums;
+ SharedPtr<MemberListInfoContext> functions;
+ SharedPtr<MemberListInfoContext> variables;
+ SharedPtr<MemberGroupListContext> memberGroups;
+ SharedPtr<MemberListInfoContext> detailedMacros;
+ SharedPtr<MemberListInfoContext> detailedTypedefs;
+ SharedPtr<MemberListInfoContext> detailedEnums;
+ SharedPtr<MemberListInfoContext> detailedFunctions;
+ SharedPtr<MemberListInfoContext> detailedVariables;
+ SharedPtr<NestedClassListContext> inlineClasses;
+ };
+ mutable Cachable m_cache;
};
//%% }
-FileContext::FileContext(FileDef *fd)
+FileContext::FileContext(FileDef *fd) : RefCountedContext("FileContext")
{
p = new Private(fd);
}
@@ -1954,10 +2485,14 @@ class DirContext::Private : public DefinitionContext<DirContext::Private>
public:
Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd)
{
- addProperty("title",this,&Private::title);
- addProperty("highlight",this,&Private::highlight);
- addProperty("subhighlight",this,&Private::subHighlight);
- addProperty("dirName",this,&Private::dirName);
+ addProperty("title", this,&Private::title);
+ addProperty("highlight", this,&Private::highlight);
+ addProperty("subhighlight", this,&Private::subHighlight);
+ addProperty("dirName", this,&Private::dirName);
+ addProperty("dirs", this,&Private::dirs);
+ addProperty("files", this,&Private::files);
+ addProperty("hasDetails", this,&Private::hasDetails);
+ addProperty("compoundType", this,&Private::compoundType);
}
TemplateVariant title() const
{
@@ -1975,12 +2510,64 @@ class DirContext::Private : public DefinitionContext<DirContext::Private>
{
return TemplateVariant(m_dirDef->shortName());
}
+ TemplateVariant dirs() const
+ {
+ if (!m_cache.dirs)
+ {
+ m_cache.dirs.reset(TemplateList::alloc());
+ const DirList &subDirs = m_dirDef->subDirs();
+ QListIterator<DirDef> it(subDirs);
+ DirDef *dd;
+ for (it.toFirst();(dd=it.current());++it)
+ {
+ DirContext *dc = new DirContext(dd);
+ m_cache.dirs->append(dc);
+ }
+ }
+ return m_cache.dirs.get();
+ }
+ TemplateVariant files() const
+ {
+ // FileList *list = m_dirDef->getFiles();
+ if (!m_cache.files)
+ {
+ m_cache.files.reset(TemplateList::alloc());
+ FileList *files = m_dirDef->getFiles();
+ if (files)
+ {
+ QListIterator<FileDef> it(*files);
+ FileDef *fd;
+ for (it.toFirst();(fd=it.current());++it)
+ {
+ FileContext *fc = FileContext::alloc(fd);
+ m_cache.files->append(fc);
+ }
+ }
+ }
+ return m_cache.files.get();
+ }
+ TemplateVariant hasDetails() const
+ {
+ return m_dirDef->hasDetailedDescription();
+ }
+ TemplateVariant compoundType() const
+ {
+ return theTranslator->trDir(FALSE,TRUE);
+ }
+
private:
DirDef *m_dirDef;
+ struct Cachable
+ {
+ Cachable() {}
+ SharedPtr<TemplateList> dirs;
+ SharedPtr<TemplateList> files;
+ };
+ mutable Cachable m_cache;
};
//%% }
-DirContext::DirContext(DirDef *fd)
+DirContext::DirContext(DirDef *fd) : RefCountedContext("DirContext")
{
p = new Private(fd);
}
@@ -1995,7 +2582,6 @@ TemplateVariant DirContext::get(const char *n) const
return p->get(n);
}
-
//------------------------------------------------------------------------
//%% struct Page(Symbol): page information
@@ -2026,7 +2612,7 @@ class PageContext::Private : public DefinitionContext<PageContext::Private>
};
//%% }
-PageContext::PageContext(PageDef *pd)
+PageContext::PageContext(PageDef *pd) : RefCountedContext("PageContext")
{
p = new Private(pd);
}
@@ -2077,7 +2663,7 @@ class TextGeneratorHtml : public TextGeneratorIntf
void writeBreak(int indent) const
{
- m_ts << "<br/>";
+ m_ts << "<br />";
for (int i=0;i<indent;i++)
{
m_ts << "&#160;";
@@ -2160,21 +2746,70 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
public:
Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
{
- addProperty("declType", this,&Private::declType);
- addProperty("declArgs", this,&Private::declArgs);
+ addProperty("isSignal", this,&Private::isSignal);
+ addProperty("isSlot", this,&Private::isSlot);
+ addProperty("isVariable", this,&Private::isVariable);
+ addProperty("isEnumeration", this,&Private::isEnumeration);
+ addProperty("isEnumValue", this,&Private::isEnumValue);
+ addProperty("isTypedef", this,&Private::isTypedef);
+ addProperty("isFunction", this,&Private::isFunction);
+ addProperty("isFunctionPtr", this,&Private::isFunctionPtr);
+ addProperty("isDefine", this,&Private::isDefine);
+ addProperty("isFriend", this,&Private::isFriend);
+ addProperty("isProperty", this,&Private::isProperty);
+ addProperty("isEvent", this,&Private::isEvent);
+ addProperty("isRelated", this,&Private::isRelated);
+ addProperty("isForeign", this,&Private::isForeign);
addProperty("isStatic", this,&Private::isStatic);
+ addProperty("isInline", this,&Private::isInline);
+ addProperty("isExplicit", this,&Private::isExplicit);
+ addProperty("isMutable", this,&Private::isMutable);
+ addProperty("isGettable", this,&Private::isGettable);
+ addProperty("isSettable", this,&Private::isSettable);
+ addProperty("isReadable", this,&Private::isReadable);
+ addProperty("isWritable", this,&Private::isWritable);
+ addProperty("isAddable", this,&Private::isAddable);
+ addProperty("isRemovable", this,&Private::isRemovable);
+ addProperty("isRaisable", this,&Private::isRaisable);
+ addProperty("isFinal", this,&Private::isFinal);
+ addProperty("isAbstract", this,&Private::isAbstract);
+ addProperty("isOverride", this,&Private::isOverride);
+ addProperty("isInitonly", this,&Private::isInitonly);
+ addProperty("isOptional", this,&Private::isOptional);
+ addProperty("isRequired", this,&Private::isRequired);
+ addProperty("isNonAtomic", this,&Private::isNonAtomic);
+ addProperty("isCopy", this,&Private::isCopy);
+ addProperty("isAssign", this,&Private::isAssign);
+ addProperty("isRetain", this,&Private::isRetain);
+ addProperty("isWeak", this,&Private::isWeak);
+ addProperty("isStrong", this,&Private::isStrong);
+ addProperty("isUnretained", this,&Private::isUnretained);
+ addProperty("isNew", this,&Private::isNew);
+ addProperty("isSealed", this,&Private::isSealed);
+ addProperty("isImplementation", this,&Private::isImplementation);
+ addProperty("isExternal", this,&Private::isExternal);
+ addProperty("isAlias", this,&Private::isAlias);
+ addProperty("isDefault", this,&Private::isDefault);
+ addProperty("isDelete", this,&Private::isDelete);
+ addProperty("isNoExcept", this,&Private::isNoExcept);
+ addProperty("isAttribute", this,&Private::isAttribute);
+ addProperty("isUNOProperty", this,&Private::isUNOProperty);
+ addProperty("isReadonly", this,&Private::isReadonly);
+ addProperty("isBound", this,&Private::isBound);
+ addProperty("isConstrained", this,&Private::isConstrained);
+ addProperty("isTransient", this,&Private::isTransient);
+ addProperty("isMaybeVoid", this,&Private::isMaybeVoid);
+ addProperty("isMaybeDefault", this,&Private::isMaybeDefault);
+ addProperty("isMaybeAmbiguous", this,&Private::isMaybeAmbiguous);
+ addProperty("isPublished", this,&Private::isPublished);
+ addProperty("isTemplateSpecialization",this,&Private::isTemplateSpecialization);
addProperty("isObjCMethod", this,&Private::isObjCMethod);
addProperty("isObjCProperty", this,&Private::isObjCProperty);
- addProperty("isDefine", this,&Private::isDefine);
- addProperty("isImplementation", this,&Private::isImplementation);
- addProperty("isEvent", this,&Private::isEvent);
- addProperty("isProperty", this,&Private::isProperty);
- addProperty("isEnumeration", this,&Private::isEnumeration);
- addProperty("isEnumValue", this,&Private::isEnumValue);
addProperty("isAnonymous", this,&Private::isAnonymous);
+ addProperty("declType", this,&Private::declType);
+ addProperty("declArgs", this,&Private::declArgs);
addProperty("anonymousType", this,&Private::anonymousType);
addProperty("anonymousMember", this,&Private::anonymousMember);
- addProperty("isRelated", this,&Private::isRelated);
addProperty("hasDetails", this,&Private::hasDetails);
addProperty("exception", this,&Private::exception);
addProperty("bitfields", this,&Private::bitfields);
@@ -2214,19 +2849,26 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
addProperty("callGraph", this,&Private::callGraph);
addProperty("hasCallerGraph", this,&Private::hasCallerGraph);
addProperty("callerGraph", this,&Private::callerGraph);
+ addProperty("fieldType", this,&Private::fieldType);
+ m_cache.propertyAttrs.reset(TemplateList::alloc());
if (md && md->isProperty())
{
- if (md->isGettable()) m_propertyAttrs.append("get");
- if (md->isSettable()) m_propertyAttrs.append("set");
+ if (md->isGettable()) m_cache.propertyAttrs->append("get");
+ if (md->isSettable()) m_cache.propertyAttrs->append("set");
}
+ m_cache.eventAttrs.reset(TemplateList::alloc());
if (md && md->isEvent())
{
- if (md->isAddable()) m_eventAttrs.append("add");
- if (md->isRemovable()) m_eventAttrs.append("remove");
- if (md->isRaisable()) m_eventAttrs.append("raise");
+ if (md->isAddable()) m_cache.eventAttrs->append("add");
+ if (md->isRemovable()) m_cache.eventAttrs->append("remove");
+ if (md->isRaisable()) m_cache.eventAttrs->append("raise");
}
}
+ TemplateVariant fieldType() const
+ {
+ return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType());
+ }
TemplateVariant declType() const
{
return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType());
@@ -2259,10 +2901,202 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
return m_memberDef->isImplementation();
}
+ TemplateVariant isSignal() const
+ {
+ return m_memberDef->isSignal();
+ }
+ TemplateVariant isSlot() const
+ {
+ return m_memberDef->isSlot();
+ }
+ TemplateVariant isTypedef() const
+ {
+ return m_memberDef->isTypedef();
+ }
+ TemplateVariant isFunction() const
+ {
+ return m_memberDef->isFunction();
+ }
+ TemplateVariant isFunctionPtr() const
+ {
+ return m_memberDef->isFunctionPtr();
+ }
+ TemplateVariant isFriend() const
+ {
+ return m_memberDef->isFriend();
+ }
+ TemplateVariant isForeign() const
+ {
+ return m_memberDef->isForeign();
+ }
TemplateVariant isEvent() const
{
return m_memberDef->isEvent();
}
+ TemplateVariant isInline() const
+ {
+ return m_memberDef->isInline();
+ }
+ TemplateVariant isExplicit() const
+ {
+ return m_memberDef->isExplicit();
+ }
+ TemplateVariant isMutable() const
+ {
+ return m_memberDef->isMutable();
+ }
+ TemplateVariant isGettable() const
+ {
+ return m_memberDef->isSettable();
+ }
+ TemplateVariant isSettable() const
+ {
+ return m_memberDef->isSettable();
+ }
+ TemplateVariant isReadable() const
+ {
+ return m_memberDef->isReadable();
+ }
+ TemplateVariant isWritable() const
+ {
+ return m_memberDef->isWritable();
+ }
+ TemplateVariant isAddable() const
+ {
+ return m_memberDef->isAddable();
+ }
+ TemplateVariant isRemovable() const
+ {
+ return m_memberDef->isRemovable();
+ }
+ TemplateVariant isRaisable() const
+ {
+ return m_memberDef->isRaisable();
+ }
+ TemplateVariant isFinal() const
+ {
+ return m_memberDef->isFinal();
+ }
+ TemplateVariant isAbstract() const
+ {
+ return m_memberDef->isAbstract();
+ }
+ TemplateVariant isOverride() const
+ {
+ return m_memberDef->isOverride();
+ }
+ TemplateVariant isInitonly() const
+ {
+ return m_memberDef->isInitonly();
+ }
+ TemplateVariant isOptional() const
+ {
+ return m_memberDef->isOptional();
+ }
+ TemplateVariant isRequired() const
+ {
+ return m_memberDef->isRequired();
+ }
+ TemplateVariant isNonAtomic() const
+ {
+ return m_memberDef->isNonAtomic();
+ }
+ TemplateVariant isCopy() const
+ {
+ return m_memberDef->isCopy();
+ }
+ TemplateVariant isAssign() const
+ {
+ return m_memberDef->isAssign();
+ }
+ TemplateVariant isRetain() const
+ {
+ return m_memberDef->isRetain();
+ }
+ TemplateVariant isWeak() const
+ {
+ return m_memberDef->isWeak();
+ }
+ TemplateVariant isStrong() const
+ {
+ return m_memberDef->isStrong();
+ }
+ TemplateVariant isUnretained() const
+ {
+ return m_memberDef->isUnretained();
+ }
+ TemplateVariant isNew() const
+ {
+ return m_memberDef->isNew();
+ }
+ TemplateVariant isSealed() const
+ {
+ return m_memberDef->isSealed();
+ }
+ TemplateVariant isExternal() const
+ {
+ return m_memberDef->isExternal();
+ }
+ TemplateVariant isAlias() const
+ {
+ return m_memberDef->isAlias();
+ }
+ TemplateVariant isDefault() const
+ {
+ return m_memberDef->isDefault();
+ }
+ TemplateVariant isDelete() const
+ {
+ return m_memberDef->isDelete();
+ }
+ TemplateVariant isNoExcept() const
+ {
+ return m_memberDef->isNoExcept();
+ }
+ TemplateVariant isAttribute() const
+ {
+ return m_memberDef->isAttribute();
+ }
+ TemplateVariant isUNOProperty() const
+ {
+ return m_memberDef->isUNOProperty();
+ }
+ TemplateVariant isReadonly() const
+ {
+ return m_memberDef->isReadonly();
+ }
+ TemplateVariant isBound() const
+ {
+ return m_memberDef->isBound();
+ }
+ TemplateVariant isConstrained() const
+ {
+ return m_memberDef->isConstrained();
+ }
+ TemplateVariant isTransient() const
+ {
+ return m_memberDef->isTransient();
+ }
+ TemplateVariant isMaybeVoid() const
+ {
+ return m_memberDef->isMaybeVoid();
+ }
+ TemplateVariant isMaybeDefault() const
+ {
+ return m_memberDef->isMaybeDefault();
+ }
+ TemplateVariant isMaybeAmbiguous() const
+ {
+ return m_memberDef->isMaybeAmbiguous();
+ }
+ TemplateVariant isPublished() const
+ {
+ return m_memberDef->isPublished();
+ }
+ TemplateVariant isTemplateSpecialization() const
+ {
+ return m_memberDef->isTemplateSpecialization();
+ }
TemplateVariant isProperty() const
{
return m_memberDef->isProperty();
@@ -2271,6 +3105,10 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
return m_memberDef->isEnumValue();
}
+ TemplateVariant isVariable() const
+ {
+ return m_memberDef->isVariable();
+ }
TemplateVariant isEnumeration() const
{
return m_memberDef->isEnumerate();
@@ -2318,7 +3156,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
ClassDef *cd = m_memberDef->getClassDefOfAnonymousType();
if (cd)
{
- m_cache.anonymousType.reset(new ClassContext(cd));
+ m_cache.anonymousType.reset(ClassContext::alloc(cd));
}
}
if (m_cache.anonymousType)
@@ -2337,7 +3175,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
MemberDef *md = m_memberDef->fromAnonymousMember();
if (md)
{
- m_cache.anonymousMember.reset(new MemberContext(md));
+ m_cache.anonymousMember.reset(MemberContext::alloc(md));
}
}
if (m_cache.anonymousMember)
@@ -2372,11 +3210,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
MemberList *ml = m_memberDef->enumFieldList();
if (ml)
{
- m_cache.enumValues.reset(new MemberListContext(ml));
+ m_cache.enumValues.reset(MemberListContext::alloc(ml));
}
else
{
- m_cache.enumValues.reset(new MemberListContext);
+ m_cache.enumValues.reset(MemberListContext::alloc());
}
}
return m_cache.enumValues.get();
@@ -2385,7 +3223,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (!m_cache.templateArgs && m_memberDef->templateArguments())
{
- m_cache.templateArgs.reset(new ArgumentListContext(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
+ m_cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
}
if (m_cache.templateArgs)
{
@@ -2407,17 +3245,17 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
}
TemplateVariant propertyAttrs() const
{
- return &m_propertyAttrs;
+ return m_cache.propertyAttrs.get();
}
TemplateVariant eventAttrs() const
{
- return &m_eventAttrs;
+ return m_cache.eventAttrs.get();
}
TemplateVariant getClass() const
{
if (!m_cache.classDef && m_memberDef->getClassDef())
{
- m_cache.classDef.reset(new ClassContext(m_memberDef->getClassDef()));
+ m_cache.classDef.reset(ClassContext::alloc(m_memberDef->getClassDef()));
}
if (m_cache.classDef)
{
@@ -2445,11 +3283,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
ArgumentList *defArgList = getDefArgList();
if (defArgList && !m_memberDef->isProperty())
{
- m_cache.arguments.reset(new ArgumentListContext(defArgList,m_memberDef,relPathAsString()));
+ m_cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()));
}
else
{
- m_cache.arguments.reset(new ArgumentListContext);
+ m_cache.arguments.reset(ArgumentListContext::alloc());
}
}
return m_cache.arguments.get();
@@ -2496,8 +3334,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (tal->count()>0)
{
- ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString());
- m_cache.templateArgList.append(al);
+ ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
tl->append(al);
}
}
@@ -2515,17 +3352,15 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (tal->count()>0)
{
- ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString());
- m_cache.templateArgList.append(al);
+ ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
tl->append(al);
}
}
}
if (m_memberDef->templateArguments()) // function template prefix
{
- ArgumentListContext *al = new ArgumentListContext(
+ ArgumentListContext *al = ArgumentListContext::alloc(
m_memberDef->templateArguments(),m_memberDef,relPathAsString());
- m_cache.templateArgList.append(al);
tl->append(al);
}
}
@@ -2534,7 +3369,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (!m_cache.templateDecls)
{
- TemplateList *tl = new TemplateList;
+ TemplateList *tl = TemplateList::alloc();
addTemplateDecls(tl);
m_cache.templateDecls.reset(tl);
}
@@ -2546,7 +3381,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
QStrList sl;
m_memberDef->getLabels(sl,m_memberDef->getOuterScope());
- TemplateList *tl = new TemplateList;
+ TemplateList *tl = TemplateList::alloc();
if (sl.count()>0)
{
QStrListIterator it(sl);
@@ -2593,14 +3428,13 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (!m_cache.implements)
{
MemberDef *md = m_memberDef->reimplements();
- m_cache.implements.reset(new TemplateList);
+ m_cache.implements.reset(TemplateList::alloc());
if (md)
{
ClassDef *cd = md->getClassDef();
if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
{
- MemberContext *mc = new MemberContext(md);
- m_cache.implementsMember.reset(mc);
+ MemberContext *mc = MemberContext::alloc(md);
m_cache.implements->append(mc);
}
}
@@ -2612,14 +3446,13 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (!m_cache.reimplements)
{
MemberDef *md = m_memberDef->reimplements();
- m_cache.reimplements.reset(new TemplateList);
+ m_cache.reimplements.reset(TemplateList::alloc());
if (md)
{
ClassDef *cd = md->getClassDef();
if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
{
- MemberContext *mc = new MemberContext(md);
- m_cache.reimplementsMember.reset(mc);
+ MemberContext *mc = MemberContext::alloc(md);
m_cache.reimplements->append(mc);
}
}
@@ -2631,7 +3464,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (!m_cache.implementedBy)
{
MemberList *ml = m_memberDef->reimplementedBy();
- m_cache.implementedBy.reset(new TemplateList);
+ m_cache.implementedBy.reset(TemplateList::alloc());
if (ml)
{
MemberListIterator mli(*ml);
@@ -2642,7 +3475,6 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
{
MemberContext *mc = new MemberContext(md);
- m_cache.implementedByMembers.append(mc);
m_cache.implementedBy->append(mc);
}
}
@@ -2654,7 +3486,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (!m_cache.reimplementedBy)
{
- m_cache.reimplementedBy.reset(new TemplateList);
+ m_cache.reimplementedBy.reset(TemplateList::alloc());
MemberList *ml = m_memberDef->reimplementedBy();
if (ml)
{
@@ -2666,7 +3498,6 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
{
MemberContext *mc = new MemberContext(md);
- m_cache.reimplementedByMembers.append(mc);
m_cache.reimplementedBy->append(mc);
}
}
@@ -2682,8 +3513,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
Example *ex;
for (it.toFirst();(ex=it.current());++it)
{
- TemplateStruct *s = new TemplateStruct;
- m_cache.exampleList.append(s);
+ TemplateStruct *s = TemplateStruct::alloc();
s->set("text",ex->name);
s->set("isLinkable",TRUE);
s->set("anchor",ex->anchor);
@@ -2696,7 +3526,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (!m_cache.examples)
{
- TemplateList *exampleList = new TemplateList;
+ TemplateList *exampleList = TemplateList::alloc();
addExamples(exampleList);
m_cache.examples.reset(exampleList);
}
@@ -2706,21 +3536,21 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (!m_cache.typeConstraints && m_memberDef->typeConstraints())
{
- m_cache.typeConstraints.reset(new ArgumentListContext(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
+ m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
}
else
{
- m_cache.typeConstraints.reset(new ArgumentListContext);
+ m_cache.typeConstraints.reset(ArgumentListContext::alloc());
}
return m_cache.typeConstraints.get();
}
TemplateVariant functionQualifier() const
{
if (!m_memberDef->isObjCMethod() &&
- (m_memberDef->isFunction() || m_memberDef->isSlot() ||
+ (m_memberDef->isFunction() || m_memberDef->isSlot() ||
m_memberDef->isPrototype() || m_memberDef->isSignal()
)
- )
+ )
{
return "()";
}
@@ -2733,7 +3563,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (!m_cache.sourceRefs)
{
- m_cache.sourceRefs.reset(new MemberListContext(m_memberDef->getReferencesMembers(),TRUE));
+ m_cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
}
return m_cache.sourceRefs.get();
}
@@ -2741,7 +3571,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
if (!m_cache.sourceRefBys)
{
- m_cache.sourceRefBys.reset(new MemberListContext(m_memberDef->getReferencedByMembers(),TRUE));
+ m_cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
}
return m_cache.sourceRefBys.get();
}
@@ -2862,48 +3692,39 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
{
Cachable() : initializerParsed(FALSE), sourceCodeParsed(FALSE)
{
- implementedByMembers.setAutoDelete(TRUE);
- reimplementedByMembers.setAutoDelete(TRUE);
- templateArgList.setAutoDelete(TRUE);
- exampleList.setAutoDelete(TRUE);
- }
- ScopedPtr<ArgumentListContext> templateArgs;
- ScopedPtr<ArgumentListContext> arguments;
- ScopedPtr<MemberListContext> enumValues;
- ScopedPtr<ClassContext> classDef;
- ScopedPtr<ClassContext> anonymousType;
- ScopedPtr<TemplateList> templateDecls;
+ }
+ SharedPtr<ArgumentListContext> templateArgs;
+ SharedPtr<ArgumentListContext> arguments;
+ SharedPtr<MemberListContext> enumValues;
+ SharedPtr<ClassContext> classDef;
+ SharedPtr<ClassContext> anonymousType;
+ SharedPtr<TemplateList> templateDecls;
ScopedPtr<TemplateVariant> paramDocs;
- ScopedPtr<TemplateList> implements;
- ScopedPtr<MemberContext> implementsMember;
- ScopedPtr<TemplateList> reimplements;
- ScopedPtr<MemberContext> reimplementsMember;
- ScopedPtr<TemplateList> implementedBy;
- ScopedPtr<MemberListContext> sourceRefs;
- ScopedPtr<MemberListContext> sourceRefBys;
+ SharedPtr<TemplateList> implements;
+ SharedPtr<TemplateList> reimplements;
+ SharedPtr<TemplateList> implementedBy;
+ SharedPtr<MemberListContext> sourceRefs;
+ SharedPtr<MemberListContext> sourceRefBys;
ScopedPtr<DotCallGraph> callGraph;
ScopedPtr<DotCallGraph> callerGraph;
- ScopedPtr<MemberContext> anonymousMember;
- QList<MemberContext> implementedByMembers;
- ScopedPtr<TemplateList> reimplementedBy;
- QList<MemberContext> reimplementedByMembers;
- QList<ArgumentListContext> templateArgList;
- ScopedPtr<TemplateList> labels;
+ SharedPtr<MemberContext> anonymousMember;
+ SharedPtr<TemplateList> reimplementedBy;
+ SharedPtr<TemplateList> labels;
TemplateVariant initializer;
bool initializerParsed;
TemplateVariant sourceCode;
bool sourceCodeParsed;
- ScopedPtr<TemplateList> examples;
- QList<TemplateStruct> exampleList;
- ScopedPtr<ArgumentListContext> typeConstraints;
+ SharedPtr<TemplateList> examples;
+ SharedPtr<TemplateList> exampleList;
+ SharedPtr<ArgumentListContext> typeConstraints;
+ SharedPtr<TemplateList> propertyAttrs;
+ SharedPtr<TemplateList> eventAttrs;
};
mutable Cachable m_cache;
- TemplateList m_propertyAttrs;
- TemplateList m_eventAttrs;
};
//%% }
-MemberContext::MemberContext(MemberDef *md)
+MemberContext::MemberContext(MemberDef *md) : RefCountedContext("MemberContext")
{
p = new Private(md);
}
@@ -2949,7 +3770,7 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
};
//%% }
-ModuleContext::ModuleContext(GroupDef *gd)
+ModuleContext::ModuleContext(GroupDef *gd) : RefCountedContext("ModuleContext")
{
p = new Private(gd);
}
@@ -2967,11 +3788,11 @@ TemplateVariant ModuleContext::get(const char *n) const
//------------------------------------------------------------------------
//%% list NestedClassList[Class] : list of nested classes
-class NestedClassListContext::Private : public GenericNodeListContext<ClassContext>
+class NestedClassListContext::Private : public GenericNodeListContext
{
};
-NestedClassListContext::NestedClassListContext()
+NestedClassListContext::NestedClassListContext() : RefCountedContext("NestedClassListContext")
{
p = new Private;
}
@@ -3001,14 +3822,55 @@ void NestedClassListContext::append(ClassDef *cd)
{
if (cd)
{
- p->append(new ClassContext(cd));
+ p->append(ClassContext::alloc(cd));
+ }
+}
+
+//------------------------------------------------------------------------
+
+//%% list NestedClassList[Class] : list of nested namespaces
+class NestedNamespaceListContext::Private : public GenericNodeListContext
+{
+};
+
+NestedNamespaceListContext::NestedNamespaceListContext() : RefCountedContext("NestedNamespaceListContext")
+{
+ p = new Private;
+}
+
+NestedNamespaceListContext::~NestedNamespaceListContext()
+{
+ delete p;
+}
+
+// TemplateListIntf
+int NestedNamespaceListContext::count() const
+{
+ return p->count();
+}
+
+TemplateVariant NestedNamespaceListContext::at(int index) const
+{
+ return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *NestedNamespaceListContext::createIterator() const
+{
+ return p->createIterator();
+}
+
+void NestedNamespaceListContext::append(NamespaceDef *cd)
+{
+ if (cd)
+ {
+ p->append(NamespaceContext::alloc(cd));
}
}
//------------------------------------------------------------------------
//%% list ClassList[Class] : list of classes
-class ClassListContext::Private : public GenericNodeListContext<ClassContext>
+class ClassListContext::Private : public GenericNodeListContext
{
public:
void addClasses(const ClassSDict &classSDict)
@@ -3026,13 +3888,13 @@ class ClassListContext::Private : public GenericNodeListContext<ClassContext>
}
if (cd->isLinkableInProject() && cd->templateMaster()==0)
{
- append(new ClassContext(cd));
+ append(ClassContext::alloc(cd));
}
}
}
};
-ClassListContext::ClassListContext()
+ClassListContext::ClassListContext() : RefCountedContext("ClassListContext")
{
p = new Private;
p->addClasses(*Doxygen::classSDict);
@@ -3067,7 +3929,7 @@ TemplateListIntf::ConstIterator *ClassListContext::createIterator() const
class ClassInheritanceNodeContext::Private : public PropertyMapper
{
public:
- Private(ClassDef *cd) : m_classContext(cd)
+ Private(ClassDef *cd) : m_classDef(cd)
{
//%% bool is_leaf_node: true if this node does not have any children
addProperty("is_leaf_node",this,&Private::isLeafNode);
@@ -3131,15 +3993,24 @@ class ClassInheritanceNodeContext::Private : public PropertyMapper
}
TemplateVariant getClass() const
{
- return TemplateVariant(&m_classContext);
+ if (!m_cache.classContext)
+ {
+ m_cache.classContext.reset(ClassContext::alloc(m_classDef));
+ }
+ return m_cache.classContext.get();
}
private:
- GenericNodeListContext<ClassInheritanceNodeContext> m_children;
- ClassContext m_classContext;
+ ClassDef *m_classDef;
+ GenericNodeListContext m_children;
+ struct Cachable
+ {
+ SharedPtr<ClassContext> classContext;
+ };
+ mutable Cachable m_cache;
};
//%% }
-ClassInheritanceNodeContext::ClassInheritanceNodeContext(ClassDef *cd)
+ClassInheritanceNodeContext::ClassInheritanceNodeContext(ClassDef *cd) : RefCountedContext("ClassInheritanceNodeContext")
{
p = new Private(cd);
}
@@ -3162,8 +4033,7 @@ void ClassInheritanceNodeContext::addChildren(const BaseClassList *bcl,bool hide
//------------------------------------------------------------------------
//%% list ClassInheritance[ClassInheritanceNode]: list of classes
-class ClassInheritanceContext::Private : public
- GenericNodeListContext<ClassInheritanceNodeContext>
+class ClassInheritanceContext::Private : public GenericNodeListContext
{
public:
void addClasses(const ClassSDict &classSDict)
@@ -3175,7 +4045,7 @@ class ClassInheritanceContext::Private : public
bool b;
if (cd->getLanguage()==SrcLangExt_VHDL)
{
- if (!(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)
+ if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
{
continue;
}
@@ -3190,7 +4060,7 @@ class ClassInheritanceContext::Private : public
if (cd->isVisibleInHierarchy()) // should it be visible
{
// new root level class
- ClassInheritanceNodeContext *tnc = new ClassInheritanceNodeContext(cd);
+ ClassInheritanceNodeContext *tnc = ClassInheritanceNodeContext::alloc(cd);
append(tnc);
bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren)
@@ -3209,7 +4079,7 @@ class ClassInheritanceContext::Private : public
}
};
-ClassInheritanceContext::ClassInheritanceContext()
+ClassInheritanceContext::ClassInheritanceContext() : RefCountedContext("ClassInheritanceContext")
{
p = new Private;
initClassHierarchy(Doxygen::classSDict);
@@ -3253,7 +4123,11 @@ class ClassHierarchyContext::Private : public PropertyMapper
public:
TemplateVariant tree() const
{
- return TemplateVariant(&m_classTree);
+ if (!m_cache.classTree)
+ {
+ m_cache.classTree.reset(ClassInheritanceContext::alloc());
+ }
+ return m_cache.classTree.get();
}
TemplateVariant fileName() const
{
@@ -3294,11 +4168,15 @@ class ClassHierarchyContext::Private : public PropertyMapper
addProperty("title",this,&Private::title);
}
private:
- ClassInheritanceContext m_classTree;
+ struct Cachable
+ {
+ SharedPtr<ClassInheritanceContext> classTree;
+ };
+ mutable Cachable m_cache;
};
//%% }
-ClassHierarchyContext::ClassHierarchyContext()
+ClassHierarchyContext::ClassHierarchyContext() : RefCountedContext("ClassHierarchyContext")
{
p = new Private;
}
@@ -3320,10 +4198,11 @@ TemplateVariant ClassHierarchyContext::get(const char *name) const
class NestingNodeContext::Private : public PropertyMapper
{
public:
- Private(Definition *d,bool addCls) : m_def(d),
- m_classContext(m_def->definitionType()==Definition::TypeClass?(ClassDef*)d:0),
- m_namespaceContext(m_def->definitionType()==Definition::TypeNamespace?(NamespaceDef*)d:0)
+ Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
+ Definition *d,int index,int level,bool addCls)
+ : m_parent(parent), m_def(d), m_level(level), m_index(index)
{
+ m_children.reset(NestingContext::alloc(thisNode,level+1));
//%% bool is_leaf_node: true if this node does not have any children
addProperty("is_leaf_node",this,&Private::isLeafNode);
//%% Nesting children: list of nested classes/namespaces
@@ -3332,22 +4211,44 @@ class NestingNodeContext::Private : public PropertyMapper
addProperty("class",this,&Private::getClass);
//%% [optional] Namespace namespace: namespace info (if this node represents a namespace)
addProperty("namespace",this,&Private::getNamespace);
+ //%% [optional] File file: file info (if this node represents a file)
+ addProperty("file",this,&Private::getFile);
+ //%% [optional] Dir dir: directory info (if this node represents a directory)
+ addProperty("dir",this,&Private::getDir);
+ //%% int id
+ addProperty("id",this,&Private::id);
+ //%% string level
+ addProperty("level",this,&Private::level);
+ //%% string name
+ addProperty("name",this,&Private::name);
+ //%% string brief
+ addProperty("brief",this,&Private::brief);
+ //%% bool isLinkable
+ addProperty("isLinkable",this,&Private::isLinkable);
+ addProperty("anchor",this,&Private::anchor);
+ addProperty("fileName",this,&Private::fileName);
+
addNamespaces(addCls);
addClasses();
+ addDirFiles();
}
TemplateVariant isLeafNode() const
{
- return m_children.count()==0;
+ return m_children->count()==0;
}
TemplateVariant children() const
{
- return TemplateVariant(&m_children);
+ return m_children.get();
}
TemplateVariant getClass() const
{
- if (m_def->definitionType()==Definition::TypeClass)
+ if (!m_cache.classContext && m_def->definitionType()==Definition::TypeClass)
{
- return TemplateVariant(&m_classContext);
+ m_cache.classContext.reset(ClassContext::alloc((ClassDef*)m_def));
+ }
+ if (m_cache.classContext)
+ {
+ return m_cache.classContext.get();
}
else
{
@@ -3356,21 +4257,104 @@ class NestingNodeContext::Private : public PropertyMapper
}
TemplateVariant getNamespace() const
{
- if (m_def->definitionType()==Definition::TypeNamespace)
+ if (!m_cache.namespaceContext && m_def->definitionType()==Definition::TypeNamespace)
+ {
+ m_cache.namespaceContext.reset(NamespaceContext::alloc((NamespaceDef*)m_def));
+ }
+ if (m_cache.namespaceContext)
+ {
+ return m_cache.namespaceContext.get();
+ }
+ else
+ {
+ return TemplateVariant(FALSE);
+ }
+ }
+ TemplateVariant getDir() const
+ {
+ if (!m_cache.dirContext && m_def->definitionType()==Definition::TypeDir)
+ {
+ m_cache.dirContext.reset(DirContext::alloc((DirDef*)m_def));
+ }
+ if (m_cache.dirContext)
{
- return TemplateVariant(&m_namespaceContext);
+ return m_cache.dirContext.get();
}
else
{
return TemplateVariant(FALSE);
}
}
+ TemplateVariant getFile() const
+ {
+ if (!m_cache.fileContext && m_def->definitionType()==Definition::TypeFile)
+ {
+ m_cache.fileContext.reset(FileContext::alloc((FileDef*)m_def));
+ }
+ if (m_cache.fileContext)
+ {
+ return m_cache.fileContext.get();
+ }
+ else
+ {
+ return TemplateVariant(FALSE);
+ }
+ }
+ TemplateVariant level() const
+ {
+ return m_level;
+ }
+ TemplateVariant id() const
+ {
+ QCString result;
+ if (m_parent) result=m_parent->id();
+ result+=QCString().setNum(m_index)+"_";
+ return result;
+ }
+ TemplateVariant name() const
+ {
+ return m_def->displayName(FALSE);
+ }
+ QCString relPathAsString() const
+ {
+ static bool createSubdirs = Config_getBool("CREATE_SUBDIRS");
+ return createSubdirs ? QCString("../../") : QCString("");
+ }
+ TemplateVariant brief() const
+ {
+ if (!m_cache.brief)
+ {
+ if (m_def->hasBriefDescription())
+ {
+ m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
+ "",m_def->briefDescription(),TRUE)));
+ }
+ else
+ {
+ m_cache.brief.reset(new TemplateVariant(""));
+ }
+ }
+ return *m_cache.brief;
+ }
+ TemplateVariant isLinkable() const
+ {
+ return m_def->isLinkable();
+ }
+ TemplateVariant anchor() const
+ {
+ return m_def->anchor();
+ }
+ TemplateVariant fileName() const
+ {
+ return m_def->getOutputFileBase();
+ }
+
void addClasses()
{
ClassDef *cd = m_def->definitionType()==Definition::TypeClass ? (ClassDef*)m_def : 0;
if (cd && cd->getClassSDict())
{
- m_children.addClasses(*cd->getClassSDict(),FALSE);
+ m_children->addClasses(*cd->getClassSDict(),FALSE);
}
}
void addNamespaces(bool addClasses)
@@ -3378,24 +4362,47 @@ class NestingNodeContext::Private : public PropertyMapper
NamespaceDef *nd = m_def->definitionType()==Definition::TypeNamespace ? (NamespaceDef*)m_def : 0;
if (nd && nd->getNamespaceSDict())
{
- m_children.addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
+ m_children->addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
}
if (addClasses && nd && nd->getClassSDict())
{
- m_children.addClasses(*nd->getClassSDict(),FALSE);
+ m_children->addClasses(*nd->getClassSDict(),FALSE);
+ }
+ }
+ void addDirFiles()
+ {
+ DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0;
+ if (dd)
+ {
+ m_children->addDirs(dd->subDirs());
+ if (dd && dd->getFiles())
+ {
+ m_children->addFiles(*dd->getFiles());
+ }
}
}
- Definition *m_def;
private:
- NestingContext m_children;
- ClassContext m_classContext;
- NamespaceContext m_namespaceContext;
+ const NestingNodeContext *m_parent;
+ Definition *m_def;
+ SharedPtr<NestingContext> m_children;
+ int m_level;
+ int m_index;
+ struct Cachable
+ {
+ SharedPtr<ClassContext> classContext;
+ SharedPtr<NamespaceContext> namespaceContext;
+ SharedPtr<DirContext> dirContext;
+ SharedPtr<FileContext> fileContext;
+ ScopedPtr<TemplateVariant> brief;
+ };
+ mutable Cachable m_cache;
};
//%% }
-NestingNodeContext::NestingNodeContext(Definition *d,bool addClass)
+NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent,
+ Definition *d,int index,int level,bool addClass) : RefCountedContext("NestingNodeContext")
{
- p = new Private(d,addClass);
+ p = new Private(parent,this,d,index,level,addClass);
}
NestingNodeContext::~NestingNodeContext()
@@ -3408,12 +4415,20 @@ TemplateVariant NestingNodeContext::get(const char *n) const
return p->get(n);
}
+QCString NestingNodeContext::id() const
+{
+ return p->id().toString();
+}
+
//------------------------------------------------------------------------
//%% list Nesting[NestingNode]: namespace and class nesting relations
-class NestingContext::Private : public GenericNodeListContext<NestingNodeContext>
+class NestingContext::Private : public GenericNodeListContext
{
public:
+ Private(const NestingNodeContext *parent,int level)
+ : m_parent(parent), m_level(level), m_index(0) {}
+
void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
{
NamespaceSDict::Iterator nli(nsDict);
@@ -3427,8 +4442,9 @@ class NestingContext::Private : public GenericNodeListContext<NestingNodeContext
bool isLinkable = nd->isLinkableInProject();
if (isLinkable || hasChildren)
{
- NestingNodeContext *nnc = new NestingNodeContext(nd,addClasses);
+ NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses);
append(nnc);
+ m_index++;
}
}
}
@@ -3455,17 +4471,73 @@ class NestingContext::Private : public GenericNodeListContext<NestingNodeContext
{
if (classVisibleInIndex(cd) && cd->templateMaster()==0)
{
- NestingNodeContext *nnc = new NestingNodeContext(cd,TRUE);
+ NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE);
append(nnc);
+ m_index++;
}
}
}
}
+ void addDirs(const DirSDict &dirDict)
+ {
+ SDict<DirDef>::Iterator dli(dirDict);
+ DirDef *dd;
+ for (dli.toFirst();(dd=dli.current());++dli)
+ {
+ if (dd->getOuterScope()==Doxygen::globalScope)
+ {
+ append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE));
+ m_index++;
+ }
+ }
+ }
+ void addDirs(const DirList &dirList)
+ {
+ QListIterator<DirDef> li(dirList);
+ DirDef *dd;
+ for (li.toFirst();(dd=li.current());++li)
+ {
+ append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE));
+ m_index++;
+ }
+ }
+ void addFiles(const FileNameList &fnList)
+ {
+ FileNameListIterator fnli(fnList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ if (fd->getDirDef()==0) // top level file
+ {
+ append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE));
+ m_index++;
+ }
+ }
+ }
+ }
+ void addFiles(const FileList &fList)
+ {
+ QListIterator<FileDef> li(fList);
+ FileDef *fd;
+ for (li.toFirst();(fd=li.current());++li)
+ {
+ append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE));
+ m_index++;
+ }
+ }
+ private:
+ const NestingNodeContext *m_parent;
+ int m_level;
+ int m_index;
};
-NestingContext::NestingContext()
+NestingContext::NestingContext(const NestingNodeContext *parent,int level) : RefCountedContext("NestingContext")
{
- p = new Private;
+ p = new Private(parent,level);
}
NestingContext::~NestingContext()
@@ -3499,16 +4571,129 @@ void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bo
p->addNamespaces(nsDict,rootOnly,addClasses);
}
+void NestingContext::addDirs(const DirSDict &dirs)
+{
+ p->addDirs(dirs);
+}
+
+void NestingContext::addDirs(const DirList &dirs)
+{
+ p->addDirs(dirs);
+}
+
+void NestingContext::addFiles(const FileNameList &files)
+{
+ p->addFiles(files);
+}
+
+void NestingContext::addFiles(const FileList &files)
+{
+ p->addFiles(files);
+}
+
+
//------------------------------------------------------------------------
+static int computeMaxDepth(const TemplateListIntf *list)
+{
+ int maxDepth=0;
+ if (list)
+ {
+ TemplateListIntf::ConstIterator *it = list->createIterator();
+ TemplateVariant v;
+ for (it->toFirst();it->current(v);it->toNext())
+ {
+ const TemplateStructIntf *s = v.toStruct();
+ TemplateVariant child = s->get("children");
+ int d = computeMaxDepth(child.toList())+1;
+ if (d>maxDepth) maxDepth=d;
+ }
+ delete it;
+ }
+ return maxDepth;
+}
+
+static int computeNumNodesAtLevel(const TemplateStructIntf *s,int level,int maxLevel)
+{
+ int num=0;
+ if (level<maxLevel)
+ {
+ num++;
+ TemplateVariant child = s->get("children");
+ if (child.toList())
+ {
+ TemplateListIntf::ConstIterator *it = child.toList()->createIterator();
+ TemplateVariant v;
+ for (it->toFirst();it->current(v);it->toNext())
+ {
+ num+=computeNumNodesAtLevel(v.toStruct(),level+1,maxLevel);
+ }
+ delete it;
+ }
+ }
+ return num;
+}
+
+static int computePreferredDepth(const TemplateListIntf *list,int maxDepth)
+{
+ int preferredNumEntries = Config_getInt("HTML_INDEX_NUM_ENTRIES");
+ int preferredDepth=1;
+ if (preferredNumEntries>0)
+ {
+ int depth = maxDepth;
+ for (int i=1;i<=depth;i++)
+ {
+ int num=0;
+ TemplateListIntf::ConstIterator *it = list->createIterator();
+ TemplateVariant v;
+ for (it->toFirst();it->current(v);it->toNext())
+ {
+ num+=computeNumNodesAtLevel(v.toStruct(),0,i);
+ }
+ delete it;
+ if (num<=preferredNumEntries)
+ {
+ preferredDepth=i;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ return preferredDepth;
+}
+
+
//%% struct ClassTree: Class nesting relations
//%% {
class ClassTreeContext::Private : public PropertyMapper
{
public:
+ Private()
+ {
+ m_classTree.reset(NestingContext::alloc(0,0));
+ if (Doxygen::namespaceSDict)
+ {
+ m_classTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
+ }
+ if (Doxygen::classSDict)
+ {
+ m_classTree->addClasses(*Doxygen::classSDict,TRUE);
+ }
+ //%% Nesting tree
+ addProperty("tree",this,&Private::tree);
+ addProperty("fileName",this,&Private::fileName);
+ addProperty("relPath",this,&Private::relPath);
+ addProperty("highlight",this,&Private::highlight);
+ addProperty("subhighlight",this,&Private::subhighlight);
+ addProperty("title",this,&Private::title);
+ addProperty("preferredDepth",this,&Private::preferredDepth);
+ addProperty("maxDepth",this,&Private::maxDepth);
+ }
TemplateVariant tree() const
{
- return TemplateVariant(&m_classTree);
+ return m_classTree.get();
}
TemplateVariant fileName() const
{
@@ -3543,30 +4728,39 @@ class ClassTreeContext::Private : public PropertyMapper
return theTranslator->trClasses();
}
}
- Private()
+ TemplateVariant maxDepth() const
{
- if (Doxygen::namespaceSDict)
+ if (!m_cache.maxDepthComputed)
{
- m_classTree.addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
+ m_cache.maxDepth = computeMaxDepth(m_classTree.get());
+ m_cache.maxDepthComputed=TRUE;
}
- if (Doxygen::classSDict)
+ return m_cache.maxDepth;
+ }
+ TemplateVariant preferredDepth() const
+ {
+ if (!m_cache.preferredDepthComputed)
{
- m_classTree.addClasses(*Doxygen::classSDict,TRUE);
+ m_cache.preferredDepth = computePreferredDepth(m_classTree.get(),maxDepth().toInt());
+ m_cache.preferredDepthComputed=TRUE;
}
- //%% Nesting tree
- addProperty("tree",this,&Private::tree);
- addProperty("fileName",this,&Private::fileName);
- addProperty("relPath",this,&Private::relPath);
- addProperty("highlight",this,&Private::highlight);
- addProperty("subhighlight",this,&Private::subhighlight);
- addProperty("title",this,&Private::title);
+ return m_cache.preferredDepth;
}
private:
- NestingContext m_classTree;
+ SharedPtr<NestingContext> m_classTree;
+ struct Cachable
+ {
+ Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+ int maxDepth;
+ bool maxDepthComputed;
+ int preferredDepth;
+ bool preferredDepthComputed;
+ };
+ mutable Cachable m_cache;
};
//%% }
-ClassTreeContext::ClassTreeContext()
+ClassTreeContext::ClassTreeContext() : RefCountedContext("ClassTreeContext")
{
p = new Private;
}
@@ -3584,7 +4778,7 @@ TemplateVariant ClassTreeContext::get(const char *name) const
//------------------------------------------------------------------------
//%% list NamespaceList[Namespace] : list of namespaces
-class NamespaceListContext::Private : public GenericNodeListContext<NamespaceContext>
+class NamespaceListContext::Private : public GenericNodeListContext
{
public:
void addNamespaces(const NamespaceSDict &nsDict)
@@ -3595,13 +4789,13 @@ class NamespaceListContext::Private : public GenericNodeListContext<NamespaceCon
{
if (nd->isLinkableInProject())
{
- append(new NamespaceContext(nd));
+ append(NamespaceContext::alloc(nd));
}
}
}
};
-NamespaceListContext::NamespaceListContext()
+NamespaceListContext::NamespaceListContext() : RefCountedContext("NamespaceListContext")
{
p = new Private;
p->addNamespaces(*Doxygen::namespaceSDict);
@@ -3675,9 +4869,10 @@ class NamespaceTreeContext::Private : public PropertyMapper
}
Private()
{
+ m_namespaceTree.reset(NestingContext::alloc(0,0));
if (Doxygen::namespaceSDict)
{
- m_namespaceTree.addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
+ m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
}
//%% Nesting tree
addProperty("tree",this,&Private::tree);
@@ -3688,11 +4883,11 @@ class NamespaceTreeContext::Private : public PropertyMapper
addProperty("title",this,&Private::title);
}
private:
- NestingContext m_namespaceTree;
+ SharedPtr<NestingContext> m_namespaceTree;
};
//%% }
-NamespaceTreeContext::NamespaceTreeContext()
+NamespaceTreeContext::NamespaceTreeContext() : RefCountedContext("NamespaceTreeContext")
{
p = new Private;
}
@@ -3710,7 +4905,7 @@ TemplateVariant NamespaceTreeContext::get(const char *name) const
//------------------------------------------------------------------------
//%% list FileList[File] : list of files
-class FileListContext::Private : public GenericNodeListContext<FileContext>
+class FileListContext::Private : public GenericNodeListContext
{
public:
void addFiles(const FileNameList &fnList)
@@ -3729,14 +4924,14 @@ class FileListContext::Private : public GenericNodeListContext<FileContext>
bool nameOk = !fd->isDocumentationFile();
if (nameOk && (doc || src) && !fd->isReference())
{
- append(new FileContext(fd));
+ append(FileContext::alloc(fd));
}
}
}
}
};
-FileListContext::FileListContext()
+FileListContext::FileListContext() : RefCountedContext("FileListContext")
{
p = new Private;
if (Doxygen::inputNameList) p->addFiles(*Doxygen::inputNameList);
@@ -3765,246 +4960,100 @@ TemplateListIntf::ConstIterator *FileListContext::createIterator() const
//------------------------------------------------------------------------
-//%% list UsedFiles[File] : list of files
-class UsedFilesContext::Private : public GenericNodeListContext<FileContext>
+//%% list DirList[Dir] : list of files
+class DirListContext::Private : public GenericNodeListContext
{
public:
- void addFile(FileDef *fd)
+ Private()
{
- append(new FileContext(fd));
+ DirDef *dir;
+ DirSDict::Iterator sdi(*Doxygen::directories);
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ append(DirContext::alloc(dir));
+ }
}
};
-UsedFilesContext::UsedFilesContext(ClassDef *cd)
+DirListContext::DirListContext() : RefCountedContext("DirListContext")
{
p = new Private;
- if (cd)
- {
- QListIterator<FileDef> li(cd->usedFiles());
- FileDef *fd;
- for (li.toFirst();(fd=li.current());++li)
- {
- p->addFile(fd);
- }
- }
}
-UsedFilesContext::~UsedFilesContext()
+DirListContext::~DirListContext()
{
delete p;
}
// TemplateListIntf
-int UsedFilesContext::count() const
+int DirListContext::count() const
{
return p->count();
}
-TemplateVariant UsedFilesContext::at(int index) const
+TemplateVariant DirListContext::at(int index) const
{
return p->at(index);
}
-TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const
+TemplateListIntf::ConstIterator *DirListContext::createIterator() const
{
return p->createIterator();
}
-void UsedFilesContext::addFile(FileDef *fd)
-{
- p->addFile(fd);
-}
//------------------------------------------------------------------------
-
-//%% struct DirFileNode: node is a directory hierarchy
-//%% {
-class DirFileNodeContext::Private : public PropertyMapper
+//%% list UsedFiles[File] : list of files
+class UsedFilesContext::Private : public GenericNodeListContext
{
public:
- Private(Definition *d) : m_def(d),
- m_dirContext (m_def->definitionType()==Definition::TypeDir ? (DirDef*)d : 0),
- m_fileContext(m_def->definitionType()==Definition::TypeFile ? (FileDef*)d : 0)
- {
- //%% bool is_leaf_node: true if this node does not have any children
- addProperty("is_leaf_node",this,&Private::isLeafNode);
- //%% DirFile children: list of nested classes/namespaces
- addProperty("children",this,&Private::children);
- //%% [optional] Dir dir: directory info (if this node represents a directory)
- addProperty("dir",this,&Private::getDir);
- //%% [optional] File file: file info (if this node represents a file)
- addProperty("file",this,&Private::getFile);
- addDirFiles();
- }
- TemplateVariant isLeafNode() const
- {
- return m_children.count()==0;
- }
- TemplateVariant children() const
- {
- return TemplateVariant(&m_children);
- }
- TemplateVariant getDir() const
- {
- if (m_def->definitionType()==Definition::TypeDir)
- {
- return TemplateVariant(&m_dirContext);
- }
- else
- {
- return TemplateVariant(FALSE);
- }
- }
- TemplateVariant getFile() const
- {
- if (m_def->definitionType()==Definition::TypeFile)
- {
- return TemplateVariant(&m_fileContext);
- }
- else
- {
- return TemplateVariant(FALSE);
- }
- }
- void addDirFiles()
+ void addFile(FileDef *fd)
{
- DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0;
- if (dd)
- {
- m_children.addDirs(dd->subDirs());
- if (dd && dd->getFiles())
- {
- m_children.addFiles(*dd->getFiles());
- }
- }
+ append(FileContext::alloc(fd));
}
- private:
- Definition *m_def;
- DirFileContext m_children;
- DirContext m_dirContext;
- FileContext m_fileContext;
};
-//%% }
-
-DirFileNodeContext::DirFileNodeContext(Definition *d)
-{
- p = new Private(d);
-}
-
-DirFileNodeContext::~DirFileNodeContext()
-{
- delete p;
-}
-
-TemplateVariant DirFileNodeContext::get(const char *n) const
-{
- return p->get(n);
-}
-
-//------------------------------------------------------------------------
-
-//%% list DirFile[DirFileNode]: list of directories and/or files
-class DirFileContext::Private : public GenericNodeListContext<DirFileNodeContext>
+UsedFilesContext::UsedFilesContext(ClassDef *cd) : RefCountedContext("UsedFilesContext")
{
- public:
- void addDirs(const DirSDict &dirDict)
- {
- SDict<DirDef>::Iterator dli(dirDict);
- DirDef *dd;
- for (dli.toFirst();(dd=dli.current());++dli)
- {
- if (dd->getOuterScope()==Doxygen::globalScope)
- {
- append(new DirFileNodeContext(dd));
- }
- }
- }
- void addDirs(const DirList &dirList)
- {
- QListIterator<DirDef> li(dirList);
- DirDef *dd;
- for (li.toFirst();(dd=li.current());++li)
- {
- append(new DirFileNodeContext(dd));
- }
- }
- void addFiles(const FileNameList &fnList)
- {
- FileNameListIterator fnli(fnList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- if (fd->getDirDef()==0) // top level file
- {
- append(new DirFileNodeContext(fd));
- }
- }
- }
- }
- void addFiles(const FileList &fList)
+ p = new Private;
+ if (cd)
+ {
+ QListIterator<FileDef> li(cd->usedFiles());
+ FileDef *fd;
+ for (li.toFirst();(fd=li.current());++li)
{
- QListIterator<FileDef> li(fList);
- FileDef *fd;
- for (li.toFirst();(fd=li.current());++li)
- {
- append(new DirFileNodeContext(fd));
- }
+ p->addFile(fd);
}
-};
-
-DirFileContext::DirFileContext()
-{
- p = new Private;
+ }
}
-DirFileContext::~DirFileContext()
+UsedFilesContext::~UsedFilesContext()
{
delete p;
}
// TemplateListIntf
-int DirFileContext::count() const
+int UsedFilesContext::count() const
{
return p->count();
}
-TemplateVariant DirFileContext::at(int index) const
+TemplateVariant UsedFilesContext::at(int index) const
{
return p->at(index);
}
-TemplateListIntf::ConstIterator *DirFileContext::createIterator() const
+TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const
{
return p->createIterator();
}
-void DirFileContext::addDirs(const DirSDict &dirs)
-{
- p->addDirs(dirs);
-}
-
-void DirFileContext::addDirs(const DirList &dirs)
-{
- p->addDirs(dirs);
-}
-
-void DirFileContext::addFiles(const FileNameList &files)
-{
- p->addFiles(files);
-}
-
-void DirFileContext::addFiles(const FileList &files)
+void UsedFilesContext::addFile(FileDef *fd)
{
- p->addFiles(files);
+ p->addFile(fd);
}
-
//------------------------------------------------------------------------
//%% struct FileTree: tree of directories and files
@@ -4012,6 +5061,28 @@ void DirFileContext::addFiles(const FileList &files)
class FileTreeContext::Private : public PropertyMapper
{
public:
+ Private()
+ {
+ // Add dirs tree
+ m_dirFileTree.reset(NestingContext::alloc(0,0));
+ if (Doxygen::directories)
+ {
+ m_dirFileTree->addDirs(*Doxygen::directories);
+ }
+ if (Doxygen::inputNameList)
+ {
+ m_dirFileTree->addFiles(*Doxygen::inputNameList);
+ }
+ //%% DirFile tree:
+ addProperty("tree",this,&Private::tree);
+ addProperty("fileName",this,&Private::fileName);
+ addProperty("relPath",this,&Private::relPath);
+ addProperty("highlight",this,&Private::highlight);
+ addProperty("subhighlight",this,&Private::subhighlight);
+ addProperty("title",this,&Private::title);
+ addProperty("preferredDepth",this,&Private::preferredDepth);
+ addProperty("maxDepth",this,&Private::maxDepth);
+ }
TemplateVariant tree() const
{
return TemplateVariant(&m_dirFileTree);
@@ -4036,31 +5107,39 @@ class FileTreeContext::Private : public PropertyMapper
{
return theTranslator->trFileList();
}
- Private()
+ TemplateVariant maxDepth() const
{
- // Add dirs tree
- if (Doxygen::directories)
+ if (!m_cache.maxDepthComputed)
{
- m_dirFileTree.addDirs(*Doxygen::directories);
+ m_cache.maxDepth = computeMaxDepth(m_dirFileTree.get());
+ m_cache.maxDepthComputed=TRUE;
}
- if (Doxygen::inputNameList)
+ return m_cache.maxDepth;
+ }
+ TemplateVariant preferredDepth() const
+ {
+ if (!m_cache.preferredDepthComputed)
{
- m_dirFileTree.addFiles(*Doxygen::inputNameList);
+ m_cache.preferredDepth = computePreferredDepth(m_dirFileTree.get(),maxDepth().toInt());
+ m_cache.preferredDepthComputed=TRUE;
}
- //%% DirFile tree:
- addProperty("tree",this,&Private::tree);
- addProperty("fileName",this,&Private::fileName);
- addProperty("relPath",this,&Private::relPath);
- addProperty("highlight",this,&Private::highlight);
- addProperty("subhighlight",this,&Private::subhighlight);
- addProperty("title",this,&Private::title);
+ return m_cache.preferredDepth;
}
private:
- DirFileContext m_dirFileTree;
+ SharedPtr<NestingContext> m_dirFileTree;
+ struct Cachable
+ {
+ Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+ int maxDepth;
+ bool maxDepthComputed;
+ int preferredDepth;
+ bool preferredDepthComputed;
+ };
+ mutable Cachable m_cache;
};
//%% }
-FileTreeContext::FileTreeContext()
+FileTreeContext::FileTreeContext() : RefCountedContext("FileTreeContext")
{
p = new Private;
}
@@ -4082,8 +5161,10 @@ TemplateVariant FileTreeContext::get(const char *name) const
class PageNodeContext::Private : public PropertyMapper
{
public:
- Private(PageDef *pd) : m_pageDef(pd), m_pageContext(pd)
+ Private(PageDef *pd) : m_pageDef(pd)
{
+ m_children.reset(PageNodeListContext::alloc());
+ m_pageContext.reset(PageContext::alloc(pd));
//%% bool is_leaf_node: true if this node does not have any children
addProperty("is_leaf_node",this,&Private::isLeafNode);
//%% PageList children: list of nested classes/namespaces
@@ -4094,31 +5175,31 @@ class PageNodeContext::Private : public PropertyMapper
}
TemplateVariant isLeafNode() const
{
- return m_children.count()==0;
+ return m_children->count()==0;
}
TemplateVariant children() const
{
- return TemplateVariant(&m_children);
+ return m_children.get();
}
TemplateVariant getPage() const
{
- return TemplateVariant(&m_pageContext);
+ return m_pageContext.get();
}
void addPages()
{
if (m_pageDef->getSubPages())
{
- m_children.addPages(*m_pageDef->getSubPages(),FALSE);
+ m_children->addPages(*m_pageDef->getSubPages(),FALSE);
}
}
private:
- PageDef *m_pageDef;
- PageNodeListContext m_children;
- PageContext m_pageContext;
+ PageDef *m_pageDef;
+ SharedPtr<PageNodeListContext> m_children;
+ SharedPtr<PageContext> m_pageContext;
};
//%% }
-PageNodeContext::PageNodeContext(PageDef *pd)
+PageNodeContext::PageNodeContext(PageDef *pd) : RefCountedContext("PageNodeContext")
{
p = new Private(pd);
}
@@ -4136,7 +5217,7 @@ TemplateVariant PageNodeContext::get(const char *n) const
//------------------------------------------------------------------------
//%% list PageList[PageNode]: list of directories and/or files
-class PageNodeListContext::Private : public GenericNodeListContext<PageNodeContext>
+class PageNodeListContext::Private : public GenericNodeListContext
{
public:
void addPages(const PageSDict &pages,bool rootOnly)
@@ -4149,13 +5230,13 @@ class PageNodeListContext::Private : public GenericNodeListContext<PageNodeConte
pd->getOuterScope()==0 ||
pd->getOuterScope()->definitionType()!=Definition::TypePage)
{
- append(new PageNodeContext(pd));
+ append(PageNodeContext::alloc(pd));
}
}
}
};
-PageNodeListContext::PageNodeListContext()
+PageNodeListContext::PageNodeListContext() : RefCountedContext("PageNodeListContext")
{
p = new Private;
}
@@ -4195,7 +5276,7 @@ class PageTreeContext::Private : public PropertyMapper
public:
TemplateVariant tree() const
{
- return TemplateVariant(&m_pageList);
+ return m_pageList.get();
}
TemplateVariant fileName() const
{
@@ -4219,10 +5300,11 @@ class PageTreeContext::Private : public PropertyMapper
}
Private()
{
+ m_pageList.reset(PageNodeListContext::alloc());
// Add pages
if (Doxygen::pageSDict)
{
- m_pageList.addPages(*Doxygen::pageSDict,TRUE);
+ m_pageList->addPages(*Doxygen::pageSDict,TRUE);
}
//%% PageNodeList tree:
@@ -4234,11 +5316,11 @@ class PageTreeContext::Private : public PropertyMapper
addProperty("title",this,&Private::title);
}
private:
- PageNodeListContext m_pageList;
+ SharedPtr<PageNodeListContext> m_pageList;
};
//%% }
-PageTreeContext::PageTreeContext()
+PageTreeContext::PageTreeContext() : RefCountedContext("PageTreeContext")
{
p = new Private;
}
@@ -4262,7 +5344,7 @@ class PageListContext::Private : public PropertyMapper
public:
TemplateVariant items() const
{
- return TemplateVariant(&m_pageList);
+ return m_pageList.get();
}
TemplateVariant fileName() const
{
@@ -4286,6 +5368,7 @@ class PageListContext::Private : public PropertyMapper
}
Private()
{
+ m_pageList.reset(new GenericNodeListContext);
// Add pages
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageDef *pd=0;
@@ -4293,7 +5376,7 @@ class PageListContext::Private : public PropertyMapper
{
if (!pd->getGroupDef() && !pd->isReference())
{
- m_pageList.append(new PageContext(pd));
+ m_pageList->append(PageContext::alloc(pd));
}
}
@@ -4306,11 +5389,11 @@ class PageListContext::Private : public PropertyMapper
addProperty("title",this,&Private::title);
}
private:
- GenericNodeListContext<PageContext> m_pageList;
+ SharedPtr<GenericNodeListContext> m_pageList;
};
//%% }
-PageListContext::PageListContext()
+PageListContext::PageListContext() : RefCountedContext("PageListContext")
{
p = new Private;
}
@@ -4333,8 +5416,10 @@ TemplateVariant PageListContext::get(const char *name) const
class ModuleNodeContext::Private : public PropertyMapper
{
public:
- Private(GroupDef *gd) : m_groupDef(gd), m_moduleContext(gd)
+ Private(GroupDef *gd) : m_groupDef(gd)
{
+ m_children.reset(ModuleListContext::alloc());
+ m_moduleContext.reset(ModuleContext::alloc(gd));
//%% bool is_leaf_node: true if this node does not have any children
addProperty("is_leaf_node",this,&Private::isLeafNode);
//%% ModuleList children: list of submodules
@@ -4345,31 +5430,31 @@ class ModuleNodeContext::Private : public PropertyMapper
}
TemplateVariant isLeafNode() const
{
- return m_children.count()==0;
+ return m_children->count()==0;
}
TemplateVariant children() const
{
- return TemplateVariant(&m_children);
+ return m_children.get();
}
TemplateVariant getModule() const
{
- return TemplateVariant(&m_moduleContext);
+ return m_moduleContext.get();
}
void addModules()
{
if (m_groupDef->getSubGroups())
{
- m_children.addModules(*m_groupDef->getSubGroups());
+ m_children->addModules(*m_groupDef->getSubGroups());
}
}
private:
- GroupDef *m_groupDef;
- ModuleListContext m_children;
- ModuleContext m_moduleContext;
+ GroupDef *m_groupDef;
+ SharedPtr<ModuleListContext> m_children;
+ SharedPtr<ModuleContext> m_moduleContext;
};
//%% }
-ModuleNodeContext::ModuleNodeContext(GroupDef *gd)
+ModuleNodeContext::ModuleNodeContext(GroupDef *gd) : RefCountedContext("ModuleNodeContext")
{
p = new Private(gd);
}
@@ -4387,7 +5472,7 @@ TemplateVariant ModuleNodeContext::get(const char *n) const
//------------------------------------------------------------------------
//%% list ModuleList[ModuleNode]: list of directories and/or files
-class ModuleListContext::Private : public GenericNodeListContext<ModuleNodeContext>
+class ModuleListContext::Private : public GenericNodeListContext
{
public:
void addModules(const GroupSDict &modules)
@@ -4399,7 +5484,7 @@ class ModuleListContext::Private : public GenericNodeListContext<ModuleNodeConte
{
if (!gd->isASubGroup() && gd->isVisible() && (!gd->isReference() || externalGroups))
{
- append(new ModuleNodeContext(gd));
+ append(ModuleNodeContext::alloc(gd));
}
}
}
@@ -4409,12 +5494,12 @@ class ModuleListContext::Private : public GenericNodeListContext<ModuleNodeConte
GroupDef *gd;
for (gli.toFirst();(gd=gli.current());++gli)
{
- append(new ModuleNodeContext(gd));
+ append(ModuleNodeContext::alloc(gd));
}
}
};
-ModuleListContext::ModuleListContext()
+ModuleListContext::ModuleListContext() : RefCountedContext("ModuleListContext")
{
p = new Private;
}
@@ -4484,10 +5569,11 @@ class ModuleTreeContext::Private : public PropertyMapper
}
Private()
{
+ m_moduleList.reset(ModuleListContext::alloc());
// Add modules
if (Doxygen::groupSDict)
{
- m_moduleList.addModules(*Doxygen::groupSDict);
+ m_moduleList->addModules(*Doxygen::groupSDict);
}
//%% ModuleList tree:
@@ -4499,11 +5585,11 @@ class ModuleTreeContext::Private : public PropertyMapper
addProperty("title",this,&Private::title);
}
private:
- ModuleListContext m_moduleList;
+ SharedPtr<ModuleListContext> m_moduleList;
};
//%% }
-ModuleTreeContext::ModuleTreeContext()
+ModuleTreeContext::ModuleTreeContext() : RefCountedContext("ModuleTreeContext")
{
p = new Private;
}
@@ -4570,7 +5656,7 @@ class NavPathElemContext::Private : public PropertyMapper
};
//%% }
-NavPathElemContext::NavPathElemContext(Definition *def)
+NavPathElemContext::NavPathElemContext(Definition *def) : RefCountedContext("NavPathElemContext")
{
p = new Private(def);
}
@@ -4619,10 +5705,11 @@ class ExampleListContext::Private : public PropertyMapper
}
Private()
{
+ m_pageList.reset(PageNodeListContext::alloc());
// Add pages
if (Doxygen::exampleSDict)
{
- m_pageList.addPages(*Doxygen::exampleSDict,FALSE);
+ m_pageList->addPages(*Doxygen::exampleSDict,FALSE);
}
//%% PageNodeList items:
@@ -4634,11 +5721,11 @@ class ExampleListContext::Private : public PropertyMapper
addProperty("title",this,&Private::title);
}
private:
- PageNodeListContext m_pageList;
+ SharedPtr<PageNodeListContext> m_pageList;
};
//%% }
-ExampleListContext::ExampleListContext()
+ExampleListContext::ExampleListContext() : RefCountedContext("ExampleListContext")
{
p = new Private;
}
@@ -4661,26 +5748,31 @@ TemplateVariant ExampleListContext::get(const char *name) const
class InheritanceNodeContext::Private : public PropertyMapper
{
public:
- Private(ClassDef *cd,const QCString &name) : m_classContext(cd), m_name(name)
+ Private(ClassDef *cd,const QCString &name) : m_classDef(cd), m_name(name)
{
addProperty("class",this,&Private::getClass);
addProperty("name",this,&Private::name);
}
TemplateVariant getClass() const
{
- return &m_classContext;
+ if (!m_classContext)
+ {
+ m_classContext.reset(ClassContext::alloc(m_classDef));
+ }
+ return m_classContext.get();
}
TemplateVariant name() const
{
return m_name;
}
private:
- ClassContext m_classContext;
+ ClassDef *m_classDef;
+ mutable SharedPtr<ClassContext> m_classContext;
QCString m_name;
};
//%% }
-InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name)
+InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) : RefCountedContext("InheritanceNodeContext")
{
p = new Private(cd,name);
}
@@ -4698,16 +5790,16 @@ TemplateVariant InheritanceNodeContext::get(const char *name) const
//------------------------------------------------------------------------
//%% list InheritanceList[InheritanceNode] : list of inherited classes
-class InheritanceListContext::Private : public GenericNodeListContext<InheritanceNodeContext>
+class InheritanceListContext::Private : public GenericNodeListContext
{
public:
void addClass(ClassDef *cd,const QCString &name)
{
- append(new InheritanceNodeContext(cd,name));
+ append(InheritanceNodeContext::alloc(cd,name));
}
};
-InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses)
+InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
{
p = new Private;
if (list)
@@ -4757,21 +5849,21 @@ TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const
//------------------------------------------------------------------------
//%% list MemberList[Member] : list of inherited classes
-class MemberListContext::Private : public GenericNodeListContext<MemberContext>
+class MemberListContext::Private : public GenericNodeListContext
{
public:
void addMember(MemberDef *md)
{
- append(new MemberContext(md));
+ append(MemberContext::alloc(md));
}
};
-MemberListContext::MemberListContext()
+MemberListContext::MemberListContext() : RefCountedContext("MemberListContext")
{
p = new Private;
}
-MemberListContext::MemberListContext(const MemberList *list)
+MemberListContext::MemberListContext(const MemberList *list) : RefCountedContext("MemberListContext")
{
p = new Private;
if (list)
@@ -4791,7 +5883,7 @@ MemberListContext::MemberListContext(const MemberList *list)
}
}
-MemberListContext::MemberListContext(MemberSDict *list,bool doSort)
+MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext")
{
p = new Private;
if (list)
@@ -4877,7 +5969,7 @@ class MemberInfoContext::Private : public PropertyMapper
{
if (!m_member && m_memberInfo->memberDef)
{
- m_member.reset(new MemberContext(m_memberInfo->memberDef));
+ m_member.reset(MemberContext::alloc(m_memberInfo->memberDef));
}
if (m_member)
{
@@ -4890,11 +5982,11 @@ class MemberInfoContext::Private : public PropertyMapper
}
private:
const MemberInfo *m_memberInfo;
- mutable ScopedPtr<MemberContext> m_member;
+ mutable SharedPtr<MemberContext> m_member;
};
//%% }
-MemberInfoContext::MemberInfoContext(const MemberInfo *mi)
+MemberInfoContext::MemberInfoContext(const MemberInfo *mi) : RefCountedContext("MemberInfoContext")
{
p = new Private(mi);
}
@@ -4913,7 +6005,7 @@ TemplateVariant MemberInfoContext::get(const char *name) const
//------------------------------------------------------------------------
//%% list AllMembersList[MemberList] : list of inherited classes
-class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoContext>
+class AllMembersListContext::Private : public GenericNodeListContext
{
public:
Private(const MemberNameInfoSDict *ml)
@@ -4939,7 +6031,7 @@ class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoC
)
)
{
- append(new MemberInfoContext(mi));
+ append(MemberInfoContext::alloc(mi));
}
}
}
@@ -4948,12 +6040,12 @@ class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoC
}
};
-AllMembersListContext::AllMembersListContext()
+AllMembersListContext::AllMembersListContext() : RefCountedContext("AllMembersListContext")
{
p = new Private(0);
}
-AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml)
+AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml) : RefCountedContext("AllMembersListContext")
{
p = new Private(ml);
}
@@ -4989,8 +6081,7 @@ class MemberGroupInfoContext::Private : public PropertyMapper
Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
m_def(def),
m_relPath(relPath),
- m_memberListContext(mg->members()),
- m_memberGroups(def,relPath,0), m_memberGroup(mg)
+ m_memberGroup(mg)
{
addProperty("members", this,&Private::members);
addProperty("title", this,&Private::groupTitle);
@@ -5002,7 +6093,11 @@ class MemberGroupInfoContext::Private : public PropertyMapper
}
TemplateVariant members() const
{
- return &m_memberListContext;
+ if (!m_cache.memberListContext)
+ {
+ m_cache.memberListContext.reset(MemberListContext::alloc(m_memberGroup->members()));
+ }
+ return m_cache.memberListContext.get();
}
TemplateVariant groupTitle() const
{
@@ -5018,26 +6113,30 @@ class MemberGroupInfoContext::Private : public PropertyMapper
}
TemplateVariant memberGroups() const
{
- return &m_memberGroups;
+ if (!m_cache.memberGroups)
+ {
+ m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,0));
+ }
+ return m_cache.memberGroups.get();
}
TemplateVariant docs() const
{
- if (!m_docs)
+ if (!m_cache.docs)
{
QCString docs = m_memberGroup->documentation();
if (!docs.isEmpty())
{
- m_docs.reset(new TemplateVariant(
+ m_cache.docs.reset(new TemplateVariant(
parseDoc(m_def,"[@name docs]",-1, // TODO store file & line
m_relPath,
m_memberGroup->documentation()+"\n",FALSE)));
}
else
{
- m_docs.reset(new TemplateVariant(""));
+ m_cache.docs.reset(new TemplateVariant(""));
}
}
- return *m_docs;
+ return *m_cache.docs;
}
TemplateVariant inherited() const
{
@@ -5046,15 +6145,19 @@ class MemberGroupInfoContext::Private : public PropertyMapper
private:
Definition *m_def;
QCString m_relPath;
- MemberListContext m_memberListContext;
- MemberGroupListContext m_memberGroups;
const MemberGroup *m_memberGroup;
- mutable ScopedPtr<TemplateVariant> m_docs;
+ struct Cachable
+ {
+ SharedPtr<MemberListContext> memberListContext;
+ SharedPtr<MemberGroupListContext> memberGroups;
+ ScopedPtr<TemplateVariant> docs;
+ };
+ mutable Cachable m_cache;
};
//%% }
MemberGroupInfoContext::MemberGroupInfoContext(Definition *def,
- const QCString &relPath,const MemberGroup *mg)
+ const QCString &relPath,const MemberGroup *mg) : RefCountedContext("MemberGroupInfoContext")
{
p = new Private(def,relPath,mg);
}
@@ -5072,21 +6175,21 @@ TemplateVariant MemberGroupInfoContext::get(const char *name) const
//------------------------------------------------------------------------
//%% list MemberGroupList[MemberGroupInfo] : list of member groups
-class MemberGroupListContext::Private : public GenericNodeListContext<MemberGroupInfoContext>
+class MemberGroupListContext::Private : public GenericNodeListContext
{
public:
void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg)
{
- append(new MemberGroupInfoContext(def,relPath,mg));
+ append(MemberGroupInfoContext::alloc(def,relPath,mg));
}
};
-MemberGroupListContext::MemberGroupListContext()
+MemberGroupListContext::MemberGroupListContext() : RefCountedContext("MemberGroupListContext")
{
p = new Private;
}
-MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list)
+MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list) : RefCountedContext("MemberGroupListContext")
{
p = new Private;
if (list)
@@ -5100,7 +6203,7 @@ MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &r
}
}
-MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping)
+MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) : RefCountedContext("MemberGroupListContext")
{
p = new Private;
if (dict)
@@ -5148,9 +6251,8 @@ class MemberListInfoContext::Private : public PropertyMapper
public:
Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
m_def(def),
- m_memberListContext(ml),
- m_memberGroups(def,relPath,ml ? ml->getMemberGroupList() : 0),
m_memberList(ml),
+ m_relPath(relPath),
m_title(title),
m_subtitle(subtitle)
{
@@ -5163,7 +6265,11 @@ class MemberListInfoContext::Private : public PropertyMapper
}
TemplateVariant members() const
{
- return &m_memberListContext;
+ if (!m_cache.memberListContext)
+ {
+ m_cache.memberListContext.reset(MemberListContext::alloc(m_memberList));
+ }
+ return m_cache.memberListContext.get();
}
TemplateVariant title() const
{
@@ -5179,20 +6285,24 @@ class MemberListInfoContext::Private : public PropertyMapper
}
TemplateVariant memberGroups() const
{
- return &m_memberGroups;
+ if (!m_cache.memberGroups)
+ {
+ m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,m_memberList->getMemberGroupList()));
+ }
+ return m_cache.memberGroups.get();
}
TemplateVariant inherited() const
{
- if (!m_inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 &&
+ if (!m_cache.inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 &&
m_def->definitionType()==Definition::TypeClass)
{
- InheritedMemberInfoListContext *ctx = new InheritedMemberInfoListContext;
+ InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
ctx->addMemberList((ClassDef*)m_def,m_memberList->listType(),m_title,FALSE);
- m_inherited.reset(ctx);
+ m_cache.inherited.reset(ctx);
}
- if (m_inherited)
+ if (m_cache.inherited)
{
- return m_inherited.get();
+ return m_cache.inherited.get();
}
else
{
@@ -5201,18 +6311,23 @@ class MemberListInfoContext::Private : public PropertyMapper
}
private:
Definition *m_def;
- MemberListContext m_memberListContext;
- MemberGroupListContext m_memberGroups;
const MemberList *m_memberList;
+ QCString m_relPath;
QCString m_title;
QCString m_subtitle;
- mutable ScopedPtr<InheritedMemberInfoListContext> m_inherited;
+ struct Cachable
+ {
+ SharedPtr<MemberListContext> memberListContext;
+ SharedPtr<MemberGroupListContext> memberGroups;
+ SharedPtr<InheritedMemberInfoListContext> inherited;
+ };
+ mutable Cachable m_cache;
};
//%% }
MemberListInfoContext::MemberListInfoContext(
Definition *def,const QCString &relPath,const MemberList *ml,
- const QCString &title,const QCString &subtitle)
+ const QCString &title,const QCString &subtitle) : RefCountedContext("MemberListInfoContext")
{
p = new Private(def,relPath,ml,title,subtitle);
}
@@ -5251,7 +6366,7 @@ class InheritedMemberInfoContext::Private : public PropertyMapper
{
if (!m_classCtx)
{
- m_classCtx.reset(new ClassContext(m_class));
+ m_classCtx.reset(ClassContext::alloc(m_class));
}
return m_classCtx.get();
}
@@ -5263,7 +6378,7 @@ class InheritedMemberInfoContext::Private : public PropertyMapper
{
if (!m_memberListCtx)
{
- m_memberListCtx.reset(new MemberListContext(m_memberList));
+ m_memberListCtx.reset(MemberListContext::alloc(m_memberList));
}
return m_memberListCtx.get();
}
@@ -5274,26 +6389,27 @@ class InheritedMemberInfoContext::Private : public PropertyMapper
}
TemplateVariant inheritedFrom() const
{
- if (m_inheritedFrom.count()==0)
+ if (!m_inheritedFrom)
{
- m_inheritedFrom.append(title());
- m_inheritedFrom.append(getClass());
+ m_inheritedFrom.reset(TemplateList::alloc());
+ m_inheritedFrom->append(title());
+ m_inheritedFrom->append(getClass());
}
- return &m_inheritedFrom;
+ return m_inheritedFrom.get();
}
private:
ClassDef * m_class;
MemberList *m_memberList;
QCString m_title;
- mutable ScopedPtr<ClassContext> m_classCtx;
- mutable ScopedPtr<MemberListContext> m_memberListCtx;
- mutable TemplateList m_inheritedFrom;
+ mutable SharedPtr<ClassContext> m_classCtx;
+ mutable SharedPtr<MemberListContext> m_memberListCtx;
+ mutable SharedPtr<TemplateList> m_inheritedFrom;
};
//%% }
InheritedMemberInfoContext::InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,
- const QCString &title)
+ const QCString &title) : RefCountedContext("InheritedMemberInfoContext")
{
p = new Private(cd,ml,title);
}
@@ -5311,7 +6427,7 @@ TemplateVariant InheritedMemberInfoContext::get(const char *name) const
//------------------------------------------------------------------------
//%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes
-class InheritedMemberInfoListContext::Private : public GenericNodeListContext<InheritedMemberInfoContext>
+class InheritedMemberInfoListContext::Private : public GenericNodeListContext
{
public:
void addMemberList(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
@@ -5385,7 +6501,7 @@ class InheritedMemberInfoListContext::Private : public GenericNodeListContext<In
addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList);
addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList);
if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,(MemberListType)lt2,combinedList);
- append(new InheritedMemberInfoContext(cd,combinedList,title));
+ append(InheritedMemberInfoContext::alloc(cd,combinedList,title));
}
}
void findInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
@@ -5424,7 +6540,7 @@ class InheritedMemberInfoListContext::Private : public GenericNodeListContext<In
}
};
-InheritedMemberInfoListContext::InheritedMemberInfoListContext()
+InheritedMemberInfoListContext::InheritedMemberInfoListContext() : RefCountedContext("InheritedMemberInfoListContext")
{
p = new Private;
}
@@ -5433,7 +6549,7 @@ void InheritedMemberInfoListContext::addMemberList(
ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList)
{
QPtrDict<void> visited(17);
- bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE);
+ bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE)>0;
bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list
(!additionalList && memberInSection); // inherited member to show in a member list of the class
//printf("%s:%s show=%d\n",cd->name().data(),MemberList::listTypeAsString(lt).data(),show);
@@ -5542,7 +6658,7 @@ class ArgumentContext::Private : public PropertyMapper
};
//%% }
-ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath)
+ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext")
{
p = new Private(al,def,relPath);
}
@@ -5560,22 +6676,22 @@ TemplateVariant ArgumentContext::get(const char *name) const
//------------------------------------------------------------------------
//%% list ArgumentList[Argument] : list of inherited classes
-class ArgumentListContext::Private : public GenericNodeListContext<ArgumentContext>
+class ArgumentListContext::Private : public GenericNodeListContext
{
public:
void addArgument(const Argument *arg,Definition *def,const QCString &relPath)
{
- append(new ArgumentContext(arg,def,relPath));
+ append(ArgumentContext::alloc(arg,def,relPath));
}
};
-ArgumentListContext::ArgumentListContext()
+ArgumentListContext::ArgumentListContext() : RefCountedContext("ArgumentListContext")
{
p = new Private;
}
ArgumentListContext::ArgumentListContext(const ArgumentList *list,
- Definition *def,const QCString &relPath)
+ Definition *def,const QCString &relPath) : RefCountedContext("ArgumentListContext")
{
p = new Private;
if (list)
@@ -5692,74 +6808,88 @@ class HtmlSpaceless : public TemplateSpacelessIntf
//------------------------------------------------------------------------
+#if DEBUG_REF
+int RefCountedContext::s_totalCount;
+#endif
+
void generateOutputViaTemplate()
{
+ {
TemplateEngine e;
TemplateContext *ctx = e.createContext();
if (ctx)
{
- DoxygenContext doxygen;
- ConfigContext config;
- TranslateContext tr;
- ClassListContext classList;
- ClassTreeContext classTree;
- ClassHierarchyContext classHierarchy;
- NamespaceListContext namespaceList;
- NamespaceTreeContext namespaceTree;
- FileListContext fileList;
- FileTreeContext fileTree;
- PageTreeContext pageTree;
- PageListContext pageList;
- ModuleTreeContext moduleTree;
- ExampleListContext exampleList;
+ SharedPtr<DoxygenContext> doxygen (DoxygenContext::alloc());
+ SharedPtr<ConfigContext> config (ConfigContext::alloc());
+ SharedPtr<TranslateContext> tr (TranslateContext::alloc());
+ SharedPtr<ClassListContext> classList (ClassListContext::alloc());
+ SharedPtr<ClassTreeContext> classTree (ClassTreeContext::alloc());
+ SharedPtr<ClassHierarchyContext> classHierarchy (ClassHierarchyContext::alloc());
+ SharedPtr<NamespaceListContext> namespaceList (NamespaceListContext::alloc());
+ SharedPtr<NamespaceTreeContext> namespaceTree (NamespaceTreeContext::alloc());
+ SharedPtr<DirListContext> dirList (DirListContext::alloc());
+ SharedPtr<FileListContext> fileList (FileListContext::alloc());
+ SharedPtr<FileTreeContext> fileTree (FileTreeContext::alloc());
+ SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc());
+ SharedPtr<PageListContext> pageList (PageListContext::alloc());
+ SharedPtr<ModuleTreeContext> moduleTree (ModuleTreeContext::alloc());
+ SharedPtr<ExampleListContext> exampleList (ExampleListContext::alloc());
//%% Doxygen doxygen:
- ctx->set("doxygen",&doxygen);
+ ctx->set("doxygen",doxygen.get());
//%% Translator tr:
- ctx->set("tr",&tr);
+ ctx->set("tr",tr.get());
//%% Config config:
- ctx->set("config",&config);
+ ctx->set("config",config.get());
//%% ClassList classList:
- ctx->set("classList",&classList); // not used for standard HTML
+ ctx->set("classList",classList.get()); // not used for standard HTML
//%% ClassTree classTree:
- ctx->set("classTree",&classTree);
+ ctx->set("classTree",classTree.get());
// classIndex
//%% ClassHierarchy classHierarchy:
- ctx->set("classHierarchy",&classHierarchy);
+ ctx->set("classHierarchy",classHierarchy.get());
//%% NamespaceList namespaceList:
- ctx->set("namespaceList",&namespaceList);
+ ctx->set("namespaceList",namespaceList.get());
//%% NamespaceTree namespaceTree:
- ctx->set("namespaceTree",&namespaceTree);
+ ctx->set("namespaceTree",namespaceTree.get());
//%% FileList fileList:
- ctx->set("fileList",&fileList);
+ ctx->set("fileList",fileList.get());
//%% FileTree fileTree:
- ctx->set("fileTree",&fileTree);
+ ctx->set("fileTree",fileTree.get());
//%% PageList pageList
- ctx->set("pageList",&pageList);
+ ctx->set("pageList",pageList.get());
//%% PageTree pageTree
- ctx->set("pageTree",&pageTree);
+ ctx->set("pageTree",pageTree.get());
//%% ModuleTree moduleTree
- ctx->set("moduleTree",&moduleTree);
+ ctx->set("moduleTree",moduleTree.get());
//%% ExampleList exampleList
- ctx->set("exampleList",&exampleList);
+ ctx->set("exampleList",exampleList.get());
+ //%% DirList dirList
+ ctx->set("dirList",dirList.get());
// render HTML output
- Template *tpl = e.loadByName("htmllayout.tpl");
+ Template *tpl = e.loadByName("htmllayout.tpl",1);
if (tpl)
{
g_globals.outputFormat = ContextGlobals::Html;
g_globals.dynSectionId = 0;
g_globals.outputDir = Config_getString("HTML_OUTPUT");
- HtmlEscaper esc;
- ctx->setEscapeIntf(&esc);
+ HtmlEscaper htmlEsc;
+ ctx->setEscapeIntf(Config_getString("HTML_FILE_EXTENSION"),&htmlEsc);
HtmlSpaceless spl;
ctx->setSpacelessIntf(&spl);
ctx->setOutputDirectory(g_globals.outputDir);
FTextStream ts;
tpl->render(ts,ctx);
}
+ e.unload(tpl);
// TODO: render other outputs
}
+ delete ctx;
+ }
+#if DEBUG_REF
+ printf("==== total ref count %d\n",RefCountedContext::s_totalCount);
+#endif
}
diff --git a/src/context.h b/src/context.h
index f027749..18fa519 100644
--- a/src/context.h
+++ b/src/context.h
@@ -3,6 +3,8 @@
#include "types.h"
#include "template.h"
+#include <qlist.h>
+#include <stdio.h>
class Definition;
class ClassDef;
@@ -37,147 +39,266 @@ class MemberGroupList;
//----------------------------------------------------
-class ConfigContext : public TemplateStructIntf
+#define DEBUG_REF 0
+
+/** @brief Helper class to support reference counting */
+#if DEBUG_REF
+class RefCountedContext
{
public:
- ConfigContext();
- ~ConfigContext();
+ RefCountedContext(const char *className) : m_refCount(0)
+ {
+ m_className=className;
+ m_insideRelease = FALSE;
+ }
+ virtual ~RefCountedContext()
+ {
+ if (!m_insideRelease) abort();
+ }
+ int addRef()
+ {
+ ++s_totalCount;
+ printf("%p:%s::addRef()=%d\n",this,m_className.data(),m_refCount);
+ return ++m_refCount;
+ }
+ int release()
+ {
+ --s_totalCount;
+ printf("%p:%s::release()=%d\n",this,m_className.data(),m_refCount-1);
+ int count = --m_refCount;
+ if (count<=0)
+ {
+ m_insideRelease=TRUE;
+ delete this;
+ }
+ return count;
+ }
+ private:
+ int m_refCount;
+ QCString m_className;
+ bool m_insideRelease;
+ public:
+ static int s_totalCount;
+};
+
+#else // release version
+
+class RefCountedContext
+{
+ public:
+ RefCountedContext(const char *) : m_refCount(0) {}
+ virtual ~RefCountedContext() {}
+ int addRef() { return ++m_refCount; }
+ int release()
+ {
+ int count = --m_refCount;
+ if (count<=0)
+ {
+ delete this;
+ }
+ return count;
+ }
+ private:
+ int m_refCount;
+};
+#endif
+
+
+//----------------------------------------------------
+
+class ConfigContext : public RefCountedContext, public TemplateStructIntf
+{
+ public:
+ static ConfigContext *alloc() { return new ConfigContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ConfigContext();
+ ~ConfigContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class DoxygenContext : public TemplateStructIntf
+class DoxygenContext : public RefCountedContext, public TemplateStructIntf
{
public:
- DoxygenContext();
- ~DoxygenContext();
+ static DoxygenContext *alloc() { return new DoxygenContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ DoxygenContext();
+ ~DoxygenContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class TranslateContext : public TemplateStructIntf
+class TranslateContext : public RefCountedContext, public TemplateStructIntf
{
public:
- TranslateContext();
- ~TranslateContext();
+ static TranslateContext *alloc() { return new TranslateContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ TranslateContext();
+ ~TranslateContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class UsedFilesContext : public TemplateListIntf
+class UsedFilesContext : public RefCountedContext, public TemplateListIntf
{
public:
- UsedFilesContext(ClassDef *cd);
- ~UsedFilesContext();
+ static UsedFilesContext *alloc(ClassDef *cd) { return new UsedFilesContext(cd); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
void addFile(FileDef *fd);
private:
+ UsedFilesContext(ClassDef *cd);
+ ~UsedFilesContext();
+
class Private;
Private *p;
};
//----------------------------------------------------
-class IncludeInfoContext : public TemplateStructIntf
+class IncludeInfoContext : public RefCountedContext, public TemplateStructIntf
{
public:
- IncludeInfoContext(IncludeInfo *,SrcLangExt lang);
- ~IncludeInfoContext();
+ static IncludeInfoContext *alloc(const IncludeInfo *info,SrcLangExt lang)
+ { return new IncludeInfoContext(info,lang); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ IncludeInfoContext(const IncludeInfo *,SrcLangExt lang);
+ ~IncludeInfoContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ClassContext : public TemplateStructIntf
+class IncludeInfoListContext : public RefCountedContext, public TemplateListIntf
{
public:
- ClassContext(ClassDef *);
- ~ClassContext();
+ static IncludeInfoListContext *alloc(const QList<IncludeInfo> &list,SrcLangExt lang)
+ { return new IncludeInfoListContext(list,lang); }
+
+ // TemplateListIntf
+ virtual int count() const;
+ virtual TemplateVariant at(int index) const;
+ virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
+
+ private:
+ IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang);
+ ~IncludeInfoListContext();
+ class Private;
+ Private *p;
+};
+
+
+//----------------------------------------------------
+
+class ClassContext : public RefCountedContext, public TemplateStructIntf
+{
+ public:
+ static ClassContext *alloc(ClassDef *cd) { return new ClassContext(cd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ClassContext(ClassDef *);
+ ~ClassContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class NamespaceContext : public TemplateStructIntf
+class NamespaceContext : public RefCountedContext, public TemplateStructIntf
{
public:
- NamespaceContext(NamespaceDef *);
- ~NamespaceContext();
+ static NamespaceContext *alloc(NamespaceDef *nd) { return new NamespaceContext(nd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ NamespaceContext(NamespaceDef *);
+ ~NamespaceContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class FileContext : public TemplateStructIntf
+class FileContext : public RefCountedContext, public TemplateStructIntf
{
public:
- FileContext(FileDef *);
- ~FileContext();
+ static FileContext *alloc(FileDef *fd) { return new FileContext(fd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ FileContext(FileDef *);
+ ~FileContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class DirContext : public TemplateStructIntf
+class DirContext : public RefCountedContext, public TemplateStructIntf
{
public:
- DirContext(DirDef *);
- ~DirContext();
+ static DirContext *alloc(DirDef *dd) { return new DirContext(dd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ DirContext(DirDef *);
+ ~DirContext();
class Private;
Private *p;
};
@@ -185,32 +306,38 @@ class DirContext : public TemplateStructIntf
//----------------------------------------------------
-class PageContext : public TemplateStructIntf
+class PageContext : public RefCountedContext, public TemplateStructIntf
{
public:
- PageContext(PageDef *);
- ~PageContext();
+ static PageContext *alloc(PageDef *pd) { return new PageContext(pd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ PageContext(PageDef *);
+ ~PageContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class MemberContext : public TemplateStructIntf
+class MemberContext : public RefCountedContext, public TemplateStructIntf
{
public:
- MemberContext(MemberDef *);
- ~MemberContext();
+ static MemberContext *alloc(MemberDef *md) { return new MemberContext(md); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ MemberContext(MemberDef *);
+ ~MemberContext();
class Private;
Private *p;
};
@@ -218,414 +345,501 @@ class MemberContext : public TemplateStructIntf
//----------------------------------------------------
-class ModuleContext : public TemplateStructIntf
+class ModuleContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ModuleContext(GroupDef *);
- ~ModuleContext();
+ static ModuleContext *alloc(GroupDef *gd) { return new ModuleContext(gd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ModuleContext(GroupDef *);
+ ~ModuleContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class NestedClassListContext : public TemplateListIntf
+class NestedClassListContext : public RefCountedContext, public TemplateListIntf
{
public:
+ static NestedClassListContext *alloc() { return new NestedClassListContext; }
+
+ // TemplateListIntf
+ virtual int count() const;
+ virtual TemplateVariant at(int index) const;
+ virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
+
+ void append(ClassDef *cd);
+
+ private:
NestedClassListContext();
~NestedClassListContext();
+ class Private;
+ Private *p;
+};
+
+//----------------------------------------------------
+
+class NestedNamespaceListContext : public RefCountedContext, public TemplateListIntf
+{
+ public:
+ static NestedNamespaceListContext *alloc() { return new NestedNamespaceListContext; }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
- void append(ClassDef *cd);
+ void append(NamespaceDef *cd);
private:
+ NestedNamespaceListContext();
+ ~NestedNamespaceListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ClassListContext : public TemplateListIntf
+class ClassListContext : public RefCountedContext, public TemplateListIntf
{
public:
- ClassListContext();
- ~ClassListContext();
+ static ClassListContext *alloc() { return new ClassListContext; }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ClassListContext();
+ ~ClassListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ClassInheritanceNodeContext : public TemplateStructIntf
+class ClassInheritanceNodeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ClassInheritanceNodeContext(ClassDef *);
- ~ClassInheritanceNodeContext();
+ static ClassInheritanceNodeContext *alloc(ClassDef *cd)
+ { return new ClassInheritanceNodeContext(cd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
void addChildren(const BaseClassList *bcl,bool hideSuper);
+
private:
+ ClassInheritanceNodeContext(ClassDef *);
+ ~ClassInheritanceNodeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ClassInheritanceContext : public TemplateListIntf
+class ClassInheritanceContext : public RefCountedContext, public TemplateListIntf
{
public:
- ClassInheritanceContext();
- ~ClassInheritanceContext();
+ static ClassInheritanceContext *alloc() { return new ClassInheritanceContext; }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ClassInheritanceContext();
+ ~ClassInheritanceContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ClassHierarchyContext : public TemplateStructIntf
+class ClassHierarchyContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ClassHierarchyContext();
- ~ClassHierarchyContext();
+ static ClassHierarchyContext *alloc() { return new ClassHierarchyContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ClassHierarchyContext();
+ ~ClassHierarchyContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class NestingNodeContext : public TemplateStructIntf
+class NestingNodeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- NestingNodeContext(Definition *,bool addClasses);
- ~NestingNodeContext();
+ static NestingNodeContext *alloc(const NestingNodeContext *parent,Definition *def,
+ int index,int level,bool addClasses)
+ { return new NestingNodeContext(parent,def,index,level,addClasses); }
+
+ QCString id() const;
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ NestingNodeContext(const NestingNodeContext *parent,
+ Definition *,int index,int level,bool addClasses);
+ ~NestingNodeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class NestingContext : public TemplateListIntf
+class NestingContext : public RefCountedContext, public TemplateListIntf
{
public:
- NestingContext();
- ~NestingContext();
+ static NestingContext *alloc(const NestingNodeContext *parent,int level)
+ { return new NestingContext(parent,level); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses);
void addClasses(const ClassSDict &clDict,bool rootOnly);
+ void addDirs(const DirSDict &);
+ void addDirs(const DirList &);
+ void addFiles(const FileNameList &);
+ void addFiles(const FileList &);
+
private:
+ NestingContext(const NestingNodeContext *parent,int level);
+ ~NestingContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ClassTreeContext : public TemplateStructIntf
+class ClassTreeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ClassTreeContext();
- ~ClassTreeContext();
+ static ClassTreeContext *alloc() { return new ClassTreeContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ClassTreeContext();
+ ~ClassTreeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class NamespaceListContext : public TemplateListIntf
+class NamespaceListContext : public RefCountedContext, public TemplateListIntf
{
public:
- NamespaceListContext();
- ~NamespaceListContext();
+ static NamespaceListContext *alloc() { return new NamespaceListContext; }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ NamespaceListContext();
+ ~NamespaceListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class NamespaceTreeContext : public TemplateStructIntf
-{
- public:
- NamespaceTreeContext();
- ~NamespaceTreeContext();
-
- // TemplateStructIntf methods
- virtual TemplateVariant get(const char *name) const;
-
- private:
- class Private;
- Private *p;
-};
-
-//----------------------------------------------------
-
-class DirFileNodeContext : public TemplateStructIntf
+class NamespaceTreeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- DirFileNodeContext(Definition *);
- ~DirFileNodeContext();
+ static NamespaceTreeContext *alloc() { return new NamespaceTreeContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ NamespaceTreeContext();
+ ~NamespaceTreeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class DirFileContext : public TemplateListIntf
+class DirListContext : public RefCountedContext, public TemplateListIntf
{
public:
- DirFileContext();
- ~DirFileContext();
+ static DirListContext *alloc() { return new DirListContext; }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
- void addDirs(const DirSDict &);
- void addDirs(const DirList &);
- void addFiles(const FileNameList &);
- void addFiles(const FileList &);
private:
+ DirListContext();
+ ~DirListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class FileListContext : public TemplateListIntf
+class FileListContext : public RefCountedContext, public TemplateListIntf
{
public:
- FileListContext();
- ~FileListContext();
+ static FileListContext *alloc() { return new FileListContext; }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ FileListContext();
+ ~FileListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class FileTreeContext : public TemplateStructIntf
+class FileTreeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- FileTreeContext();
- ~FileTreeContext();
+ static FileTreeContext *alloc() { return new FileTreeContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ FileTreeContext();
+ ~FileTreeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class PageNodeContext : public TemplateStructIntf
+class PageNodeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- PageNodeContext(PageDef *);
- ~PageNodeContext();
+ static PageNodeContext *alloc(PageDef *pd) { return new PageNodeContext(pd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ PageNodeContext(PageDef *);
+ ~PageNodeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class PageNodeListContext : public TemplateListIntf
+class PageNodeListContext : public RefCountedContext, public TemplateListIntf
{
public:
- PageNodeListContext();
- ~PageNodeListContext();
+ static PageNodeListContext *alloc() { return new PageNodeListContext; }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
void addPages(const PageSDict &,bool rootOnly);
+
private:
+ PageNodeListContext();
+ ~PageNodeListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class PageListContext : public TemplateStructIntf
+class PageListContext : public RefCountedContext, public TemplateStructIntf
{
public:
- PageListContext();
- ~PageListContext();
+ static PageListContext *alloc() { return new PageListContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ PageListContext();
+ ~PageListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class PageTreeContext : public TemplateStructIntf
+class PageTreeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- PageTreeContext();
- ~PageTreeContext();
+ static PageTreeContext *alloc() { return new PageTreeContext; }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ PageTreeContext();
+ ~PageTreeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ModuleNodeContext : public TemplateStructIntf
+class ModuleNodeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ModuleNodeContext(GroupDef *);
- ~ModuleNodeContext();
+ static ModuleNodeContext *alloc(GroupDef *gd) { return new ModuleNodeContext(gd); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ModuleNodeContext(GroupDef *);
+ ~ModuleNodeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ModuleListContext : public TemplateListIntf
+class ModuleListContext : public RefCountedContext, public TemplateListIntf
{
public:
- ModuleListContext();
- ~ModuleListContext();
+ static ModuleListContext *alloc() { return new ModuleListContext(); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
void addModules(const GroupSDict &);
void addModules(const GroupList &);
+
private:
+ ModuleListContext();
+ ~ModuleListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ModuleTreeContext : public TemplateStructIntf
+class ModuleTreeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ModuleTreeContext();
- ~ModuleTreeContext();
+ static ModuleTreeContext *alloc() { return new ModuleTreeContext(); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ModuleTreeContext();
+ ~ModuleTreeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ExampleListContext : public TemplateStructIntf
+class ExampleListContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ExampleListContext();
- ~ExampleListContext();
+ static ExampleListContext *alloc() { return new ExampleListContext(); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ExampleListContext();
+ ~ExampleListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class NavPathElemContext : public TemplateStructIntf
+class NavPathElemContext : public RefCountedContext, public TemplateStructIntf
{
public:
- NavPathElemContext(Definition *def);
- ~NavPathElemContext();
+ static NavPathElemContext *alloc(Definition *def) { return new NavPathElemContext(def); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ NavPathElemContext(Definition *def);
+ ~NavPathElemContext();
class Private;
Private *p;
};
@@ -633,90 +847,118 @@ class NavPathElemContext : public TemplateStructIntf
//----------------------------------------------------
-class InheritanceNodeContext : public TemplateStructIntf
+class InheritanceNodeContext : public RefCountedContext, public TemplateStructIntf
{
public:
- InheritanceNodeContext(ClassDef *cd,const QCString &name);
- ~InheritanceNodeContext();
+ static InheritanceNodeContext *alloc(ClassDef *cd,const QCString &name)
+ { return new InheritanceNodeContext(cd,name); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ InheritanceNodeContext(ClassDef *cd,const QCString &name);
+ ~InheritanceNodeContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class InheritanceListContext : public TemplateListIntf
+class InheritanceListContext : public RefCountedContext, public TemplateListIntf
{
public:
- InheritanceListContext(const BaseClassList *list,bool baseClasses);
- ~InheritanceListContext();
+ static InheritanceListContext *alloc(const BaseClassList *list,bool baseClasses)
+ { return new InheritanceListContext(list,baseClasses); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ InheritanceListContext(const BaseClassList *list,bool baseClasses);
+ ~InheritanceListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class MemberListContext : public TemplateListIntf
+class MemberListContext : public RefCountedContext, public TemplateListIntf
{
public:
- MemberListContext();
- MemberListContext(const MemberList *ml);
- MemberListContext(MemberSDict *ml,bool doSort);
- ~MemberListContext();
+ static MemberListContext *alloc()
+ { return new MemberListContext; }
+ static MemberListContext *alloc(const MemberList *ml)
+ { return new MemberListContext(ml); }
+ static MemberListContext *alloc(MemberSDict *ml,bool doSort)
+ { return new MemberListContext(ml,doSort); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ MemberListContext();
+ MemberListContext(const MemberList *ml);
+ MemberListContext(MemberSDict *ml,bool doSort);
+ ~MemberListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class MemberGroupInfoContext : public TemplateStructIntf
+class MemberGroupInfoContext : public RefCountedContext, public TemplateStructIntf
{
public:
- MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg);
- ~MemberGroupInfoContext();
+ static MemberGroupInfoContext *alloc(Definition *def,const QCString &relPath,const MemberGroup *mg)
+ { return new MemberGroupInfoContext(def,relPath,mg); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg);
+ ~MemberGroupInfoContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class MemberGroupListContext : public TemplateListIntf
+class MemberGroupListContext : public RefCountedContext, public TemplateListIntf
{
public:
- MemberGroupListContext();
- MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list);
- MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping);
- ~MemberGroupListContext();
+ static MemberGroupListContext *alloc()
+ { return new MemberGroupListContext; }
+ static MemberGroupListContext *alloc(Definition *def,const QCString &relPath,const MemberGroupList *list)
+ { return new MemberGroupListContext(def,relPath,list); }
+ static MemberGroupListContext *alloc(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping)
+ { return new MemberGroupListContext(def,relPath,dict,subGrouping); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ MemberGroupListContext();
+ MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list);
+ MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping);
+ ~MemberGroupListContext();
class Private;
Private *p;
};
@@ -724,123 +966,154 @@ class MemberGroupListContext : public TemplateListIntf
//----------------------------------------------------
-class MemberListInfoContext : public TemplateStructIntf
+class MemberListInfoContext : public RefCountedContext, public TemplateStructIntf
{
public:
- MemberListInfoContext(Definition *def,const QCString &relPath,
+ static MemberListInfoContext *alloc(Definition *def,const QCString &relPath,
const MemberList *ml,const QCString &title,
- const QCString &subtitle=QCString());
- ~MemberListInfoContext();
+ const QCString &subtitle=QCString())
+ { return new MemberListInfoContext(def,relPath,ml,title,subtitle); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ MemberListInfoContext(Definition *def,const QCString &relPath,
+ const MemberList *ml,const QCString &title,
+ const QCString &subtitle=QCString());
+ ~MemberListInfoContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class MemberInfoContext : public TemplateStructIntf
+class MemberInfoContext : public RefCountedContext, public TemplateStructIntf
{
public:
- MemberInfoContext(const MemberInfo *mi);
- ~MemberInfoContext();
+ static MemberInfoContext *alloc(const MemberInfo *mi) { return new MemberInfoContext(mi); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ MemberInfoContext(const MemberInfo *mi);
+ ~MemberInfoContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class InheritedMemberInfoContext : public TemplateStructIntf
+class InheritedMemberInfoContext : public RefCountedContext, public TemplateStructIntf
{
public:
- InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,const QCString &title);
- ~InheritedMemberInfoContext();
+ static InheritedMemberInfoContext *alloc(ClassDef *cd,MemberList *ml,const QCString &title)
+ { return new InheritedMemberInfoContext(cd,ml,title); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,const QCString &title);
+ ~InheritedMemberInfoContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class InheritedMemberInfoListContext : public TemplateListIntf
+class InheritedMemberInfoListContext : public RefCountedContext, public TemplateListIntf
{
public:
- InheritedMemberInfoListContext();
+ static InheritedMemberInfoListContext *alloc() { return new InheritedMemberInfoListContext; }
void addMemberList(ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList=TRUE);
- ~InheritedMemberInfoListContext();
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ InheritedMemberInfoListContext();
+ ~InheritedMemberInfoListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class AllMembersListContext : public TemplateListIntf
+class AllMembersListContext : public RefCountedContext, public TemplateListIntf
{
public:
- AllMembersListContext();
- AllMembersListContext(const MemberNameInfoSDict *ml);
- ~AllMembersListContext();
+ static AllMembersListContext *alloc()
+ { return new AllMembersListContext; }
+ static AllMembersListContext *alloc(const MemberNameInfoSDict *ml)
+ { return new AllMembersListContext(ml); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ AllMembersListContext();
+ AllMembersListContext(const MemberNameInfoSDict *ml);
+ ~AllMembersListContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ArgumentContext : public TemplateStructIntf
+class ArgumentContext : public RefCountedContext, public TemplateStructIntf
{
public:
- ArgumentContext(const Argument *arg,Definition *def,const QCString &relPath);
- ~ArgumentContext();
+ static ArgumentContext *alloc(const Argument *arg,Definition *def,const QCString &relPath)
+ { return new ArgumentContext(arg,def,relPath); }
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ArgumentContext(const Argument *arg,Definition *def,const QCString &relPath);
+ ~ArgumentContext();
class Private;
Private *p;
};
//----------------------------------------------------
-class ArgumentListContext : public TemplateListIntf
+class ArgumentListContext : public RefCountedContext, public TemplateListIntf
{
public:
- ArgumentListContext();
- ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath);
- ~ArgumentListContext();
+ static ArgumentListContext *alloc() { return new ArgumentListContext; }
+ static ArgumentListContext *alloc(const ArgumentList *al,Definition *def,const QCString &relPath)
+ { return new ArgumentListContext(al,def,relPath); }
// TemplateListIntf
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
+ virtual int addRef() { return RefCountedContext::addRef(); }
+ virtual int release() { return RefCountedContext::release(); }
private:
+ ArgumentListContext();
+ ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath);
+ ~ArgumentListContext();
class Private;
Private *p;
};
diff --git a/src/cppvalue.cpp b/src/cppvalue.cpp
index 7efb4f8..a99ec56 100644
--- a/src/cppvalue.cpp
+++ b/src/cppvalue.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/cppvalue.h b/src/cppvalue.h
index 3f3ac3a..67c5433 100644
--- a/src/cppvalue.h
+++ b/src/cppvalue.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/dbusxmlscanner.cpp b/src/dbusxmlscanner.cpp
index 8b8df0d..e841428 100644
--- a/src/dbusxmlscanner.cpp
+++ b/src/dbusxmlscanner.cpp
@@ -252,7 +252,7 @@ public:
COND_DOC_ERROR(idx < 0, QString("Anonymous namespace found."));
m_namespaceStack.append(openNamespace(attributes.value(idx)));
- openScopes(m_namespaceStack.last());
+ openScopes(m_namespaceStack.getLast());
}
if (EXTENSION("struct"))
@@ -291,7 +291,7 @@ public:
m_currentEntry->type = getType(attributes).utf8();
QString type(getDBusType(m_currentEntry->type));
- m_structStack.last()->type.append(type.utf8());
+ m_structStack.getLast()->type.append(type.utf8());
}
if (EXTENSION("enum") || EXTENSION("flagset"))
@@ -348,9 +348,9 @@ public:
// Clean up elements stack:
// Since we made sure to get the elements in the proper order when
// adding we do not need to do so again here.
- COND_DOC_ERROR(m_elementStack.last()->element != qName.utf8(),
+ COND_DOC_ERROR(m_elementStack.getLast()->element != qName.utf8(),
QString("Malformed XML: Unexpected closing element found.").
- arg(m_elementStack.last()->element).utf8());
+ arg(m_elementStack.getLast()->element).utf8());
m_elementStack.removeLast();
// Interface:
@@ -389,7 +389,7 @@ public:
if (EXTENSION("namespace"))
{
- Entry * current = m_namespaceStack.last();
+ Entry * current = m_namespaceStack.getLast();
CONDITION(!current, "end of namespace without start.");
m_namespaceStack.removeLast();
@@ -399,7 +399,7 @@ public:
if (EXTENSION("struct"))
{
- StructData * data = m_structStack.last();
+ StructData * data = m_structStack.getLast();
CONDITION(!data, "end of struct without start.");
data->entry->endBodyLine = lineNumber();
@@ -418,7 +418,7 @@ public:
if (EXTENSION("member"))
{
- StructData * data = m_structStack.last();
+ StructData * data = m_structStack.getLast();
CONDITION(!data, "end of member outside struct.");
data->entry->addSubEntry(m_currentEntry);
}
@@ -625,7 +625,7 @@ private:
QCString scoped_name;
if (!m_scopeStack.isEmpty())
{
- scoped_name = m_scopeStack.last()->scope->name;
+ scoped_name = m_scopeStack.getLast()->scope->name;
scoped_name.append("::");
}
if (!type.isEmpty())
@@ -686,7 +686,7 @@ private:
Entry * current_namespace = openNamespace(scope);
if (!m_scopeStack.isEmpty())
- { m_scopeStack.last()->scope->addSubEntry(current_namespace); }
+ { m_scopeStack.getLast()->scope->addSubEntry(current_namespace); }
m_scopeStack.append(new ScopeData(current_namespace, m_scopeCount));
}
@@ -699,7 +699,7 @@ private:
object->name = scoped_name;
if (!m_scopeStack.isEmpty())
- { m_scopeStack.last()->scope->addSubEntry(object); }
+ { m_scopeStack.getLast()->scope->addSubEntry(object); }
m_scopeStack.append(new ScopeData(object, m_scopeCount));
++m_scopeCount;
@@ -721,13 +721,13 @@ private:
void closeScopes()
{
- const int current_scope_count(m_scopeStack.last()->count);
+ const int current_scope_count(m_scopeStack.getLast()->count);
// Do not close the root scope.
if (current_scope_count == 0)
{ return; }
- while (current_scope_count == m_scopeStack.last()->count)
+ while (current_scope_count == m_scopeStack.getLast()->count)
{ m_scopeStack.removeLast(); }
}
diff --git a/src/debug.cpp b/src/debug.cpp
index a5000ff..e27ce11 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/debug.h b/src/debug.h
index e1affab..e17c03c 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/declinfo.h b/src/declinfo.h
index 3d8cb87..5f11a1c 100644
--- a/src/declinfo.h
+++ b/src/declinfo.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/declinfo.l b/src/declinfo.l
index 58ecb05..f238be3 100644
--- a/src/declinfo.l
+++ b/src/declinfo.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/defargs.h b/src/defargs.h
index 1dbabdb..6ebfe1d 100644
--- a/src/defargs.h
+++ b/src/defargs.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/defargs.l b/src/defargs.l
index 5f64b66..164c100 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/defgen.cpp b/src/defgen.cpp
index 4e0e5b8..358cd24 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/defgen.h b/src/defgen.h
index 290a415..696fb5c 100644
--- a/src/defgen.h
+++ b/src/defgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/define.cpp b/src/define.cpp
index 76a64e1..75459c9 100644
--- a/src/define.cpp
+++ b/src/define.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/define.h b/src/define.h
index 843ecec..7971cc4 100644
--- a/src/define.h
+++ b/src/define.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -54,9 +54,10 @@ class DefineList : public QList<Define>
public:
DefineList() : QList<Define>() {}
~DefineList() {}
- int compareItems(QCollection::Item i1,QCollection::Item i2)
+ private:
+ int compareValues(const Define *d1,const Define *d2) const
{
- return qstricmp(((Define *)i1)->name,((Define *)i2)->name);
+ return qstricmp(d1->name,d2->name);
}
};
@@ -67,12 +68,12 @@ class DefineName : public QList<Define>
DefineName(const char *n) : QList<Define>() { name=n; }
~DefineName() {}
const char *nameString() const { return name; }
- int compareItems(QCollection::Item i1,QCollection::Item i2)
+
+ private:
+ int compareValues(const Define *d1,const Define *d2) const
{
- return qstricmp(((Define *)i1)->name,((Define *)i2)->name);
+ return qstricmp(d1->name,d2->name);
}
-
- private:
QCString name;
};
@@ -82,10 +83,10 @@ class DefineNameList : public QList<DefineName>
public:
DefineNameList() : QList<DefineName>() {}
~DefineNameList() {}
- int compareItems(QCollection::Item i1,QCollection::Item i2)
+ private:
+ int compareValues(const DefineName *n1,const DefineName *n2) const
{
- return qstricmp(((DefineName *)i1)->nameString(),
- ((DefineName *)i2)->nameString());
+ return qstricmp(n1->nameString(),n2->nameString());
}
};
diff --git a/src/definition.cpp b/src/definition.cpp
index 46147fc..c4b9f77 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -417,8 +417,9 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
{
if (!anchorList) return;
//printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
- SectionInfo *si=anchorList->first();
- while (si)
+ QListIterator<SectionInfo> it(*anchorList);
+ SectionInfo *si;
+ for (;(si=it.current());++it)
{
//printf("Add section `%s' to definition `%s'\n",
// si->label.data(),name().data());
@@ -429,7 +430,7 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
gsi = new SectionInfo(*si);
Doxygen::sectionDict->append(si->label,gsi);
}
- if (m_impl->sectionDict==0)
+ if (m_impl->sectionDict==0)
{
m_impl->sectionDict = new SectionDict(17);
}
@@ -438,7 +439,6 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
m_impl->sectionDict->append(gsi->label,gsi);
gsi->definition = this;
}
- si=anchorList->next();
}
}
diff --git a/src/definition.h b/src/definition.h
index f444cc5..dfd9dad 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -371,11 +371,9 @@ class DefinitionList : public QList<Definition>, public DefinitionIntf
public:
~DefinitionList() {}
DefType definitionType() const { return TypeSymbolList; }
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ int compareValues(const Definition *item1,const Definition *item2) const
{
- return qstricmp(((Definition *)item1)->name(),
- ((Definition *)item2)->name()
- );
+ return qstricmp(item1->name(),item2->name());
}
};
diff --git a/src/dia.cpp b/src/dia.cpp
index 1032564..955171c 100644
--- a/src/dia.cpp
+++ b/src/dia.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/dia.h b/src/dia.h
index 01d5962..ca10332 100644
--- a/src/dia.h
+++ b/src/dia.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/diagram.cpp b/src/diagram.cpp
index 80d0646..e50baec 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -209,18 +209,17 @@ static uint virtToMask(Specifier p)
// pre: dil is not empty
static Protection getMinProtectionLevel(DiagramItemList *dil)
{
- DiagramItem *di=dil->first();
+ QListIterator<DiagramItem> it(*dil);
+ DiagramItem *di=it.current();
Protection result=di->protection();
- di=dil->next();
- while (di)
+ for (++it;(di=it.current());++it)
{
Protection p=di->protection();
- if (p!=result)
+ if (p!=result)
{
if (result==Protected && p==Public) result=p;
else if (result==Private) result=p;
- }
- di=dil->next();
+ }
}
return result;
}
@@ -371,12 +370,12 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
if (bcl)
{
/* there are base/sub classes */
- BaseClassDef *bcd=bcl->first();
- while (bcd)
+ BaseClassListIterator it(*bcl);
+ BaseClassDef *bcd;
+ for (;(bcd=it.current());++it)
{
ClassDef *ccd=bcd->classDef;
if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/) count++;
- bcd=bcl->next();
}
}
if (count>0 && (prot!=Private || !doBases))
@@ -392,8 +391,9 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
row=diagram->at(level+1);
}
/* insert base classes in the next row */
- BaseClassDef *bcd=bcl->first();
- while (bcd)
+ BaseClassListIterator it(*bcl);
+ BaseClassDef *bcd;
+ for (;(bcd=it.current());++it)
{
ClassDef *ccd=bcd->classDef;
if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/)
@@ -402,7 +402,6 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
doBases?bcd->virt:Normal,
doBases?bcd->templSpecifiers.data():"");
}
- bcd=bcl->next();
}
}
}
@@ -423,12 +422,12 @@ TreeDiagram::~TreeDiagram()
void TreeDiagram::moveChildren(DiagramItem *root,int dx)
{
DiagramItemList *dil=root->getChildren();
- DiagramItem *di=dil->first();
- while (di)
+ QListIterator<DiagramItem> it(*dil);
+ DiagramItem *di;
+ for (;(di=it.current());++it)
{
di->move(dx,0);
moveChildren(di,dx);
- di=dil->next();
}
}
@@ -463,11 +462,11 @@ bool TreeDiagram::layoutTree(DiagramItem *root,int r)
}
// recurse to children
- DiagramItem *di=dil->first();
- while (di && !moved && !di->isInList())
+ QListIterator<DiagramItem> it(*dil);
+ DiagramItem *di;
+ for (;(di=it.current()) && !moved && !di->isInList();++it)
{
moved = layoutTree(di,r+1);
- di=dil->next();
}
}
return moved;
@@ -475,47 +474,49 @@ bool TreeDiagram::layoutTree(DiagramItem *root,int r)
void TreeDiagram::computeLayout()
{
- DiagramRow *row=first();
- while (row && row->count()<maxTreeWidth) row=next();
+ QListIterator<DiagramRow> it(*this);
+ DiagramRow *row;
+ for (;(row=it.current()) && row->count()<maxTreeWidth;++it) {}
if (row)
{
//printf("computeLayout() list row at %d\n",row->number());
- DiagramItem *di=row->first();
+ QListIterator<DiagramItem> rit(*row);
+ DiagramItem *di;
DiagramItem *opi=0;
int delta=0;
bool first=TRUE;
- while (di)
+ for (;(di=rit.current());++rit)
{
DiagramItem *pi=di->parentItem();
if (pi==opi && !first) { delta-=gridWidth; }
first = pi!=opi;
opi=pi;
- di->move(delta,0); // collapse all items in the same
+ di->move(delta,0); // collapse all items in the same
// list (except the first)
di->putInList();
- di=row->next();
}
}
// re-organize the diagram items
DiagramItem *root=getFirst()->getFirst();
while (layoutTree(root,0)) { }
-
+
// move first items of the lists
if (row)
{
- DiagramItem *di=row->first();
- while (di)
+ QListIterator<DiagramItem> rit(*row);
+ DiagramItem *di;
+ while ((di=rit.current()))
{
DiagramItem *pi=di->parentItem();
if (pi->getChildren()->count()>1)
{
di->move(gridWidth,0);
- while (di && di->parentItem()==pi) di=row->next();
+ while (di && di->parentItem()==pi) { ++rit; di=rit.current(); }
}
else
{
- di=row->next();
+ ++rit;
}
}
}
@@ -525,24 +526,25 @@ uint TreeDiagram::computeRows()
{
//printf("TreeDiagram::computeRows()=%d\n",count());
int count=0;
- DiagramRow *row=first();
- while (row && !row->getFirst()->isInList())
+ QListIterator<DiagramRow> it(*this);
+ DiagramRow *row;
+ for (;(row=it.current()) && !row->getFirst()->isInList();++it)
{
count++;
- row=next();
}
//printf("count=%d row=%p\n",count,row);
if (row)
{
int maxListLen=0;
int curListLen=0;
- DiagramItem *di=row->first(),*opi=0;
- while (di)
+ DiagramItem *opi=0;
+ QListIterator<DiagramItem> rit(*row);
+ DiagramItem *di;
+ for (;(di=rit.current());++rit)
{
if (di->parentItem()!=opi) curListLen=1; else curListLen++;
if (curListLen>maxListLen) maxListLen=curListLen;
opi=di->parentItem();
- di=row->next();
}
//printf("maxListLen=%d\n",maxListLen);
count+=maxListLen;
@@ -550,43 +552,22 @@ uint TreeDiagram::computeRows()
return count;
}
-#if 0
-uint TreeDiagram::computeCols()
-{
- uint count=0;
- DiagramRow *row=first();
- while (row && !row->getFirst()->isInList())
- {
- if (row->count()>count) count=row->count();
- row=next();
- }
- if (row)
- {
- row=prev();
- uint cols=row->count();
- if (row->getLast()->getChildren()->count()>1) cols++;
- if (cols>count) count=cols;
- }
- return count;
-};
-#endif
-
void TreeDiagram::computeExtremes(uint *maxLabelLen,uint *maxXPos)
{
uint ml=0,mx=0;
- DiagramRow *dr=first();
+ QListIterator<DiagramRow> it(*this);
+ DiagramRow *dr;
bool done=FALSE;
- while (dr && !done)
+ for (;(dr=it.current()) && !done;++it)
{
- DiagramItem *di=dr->first();
- while (di)
+ QListIterator<DiagramItem> rit(*dr);
+ DiagramItem *di;
+ for (;(di=rit.current());++rit)
{
if (di->isInList()) done=TRUE;
if (maxXPos) mx=QMAX(mx,(uint)di->xPos());
if (maxLabelLen) ml=QMAX(ml,Image::stringLength(di->label()));
- di=dr->next();
}
- dr=next();
}
if (maxLabelLen) *maxLabelLen=ml;
if (maxXPos) *maxXPos=mx;
@@ -599,20 +580,22 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
QCString relPath,
bool generateMap)
{
- DiagramRow *dr=first();
- if (!doBase) dr=next();
+ QListIterator<DiagramRow> it(*this);
+ DiagramRow *dr;
+ if (!doBase) ++it;
bool done=FALSE;
bool firstRow = doBase;
- while (dr && !done)
+ for (;(dr=it.current()) && !done;++it)
{
int x=0,y=0;
float xf=0.0f,yf=0.0f;
- DiagramItem *di=dr->first();
+ QListIterator<DiagramItem> rit(*dr);
+ DiagramItem *di = rit.current();
if (di->isInList()) // put boxes in a list
{
DiagramItem *opi=0;
- if (doBase) di=dr->last();
- while (di)
+ if (doBase) rit.toLast(); else rit.toFirst();
+ while ((di=rit.current()))
{
if (di->parentItem()==opi)
{
@@ -673,13 +656,13 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
writeVectorBox(t,di,xf,yf,di->getChildren()->count()>0);
}
- if (doBase) di=dr->prev(); else di=dr->next();
+ if (doBase) --rit; else ++rit;
}
done=TRUE;
}
else // draw a tree of boxes
{
- while (di)
+ for (rit.toFirst();(di=rit.current());++rit)
{
if (bitmap)
{
@@ -714,11 +697,8 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
}
writeVectorBox(t,di,xf,yf);
}
-
- di=dr->next();
}
}
- dr=next();
firstRow=FALSE;
}
}
@@ -728,16 +708,18 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
uint baseRows,uint superRows,
uint cellWidth,uint cellHeight)
{
- DiagramRow *dr=first();
+ QListIterator<DiagramRow> it(*this);
+ DiagramRow *dr;
bool done=FALSE;
- while (dr && !done) // for each row
+ for (;(dr=it.current()) && !done;++it) // for each row
{
- DiagramItem *di=dr->first();
+ QListIterator<DiagramItem> rit(*dr);
+ DiagramItem *di = rit.current();
if (di->isInList()) // row consists of list connectors
{
int x=0,y=0,ys=0;
float xf=0.0f,yf=0.0f,ysf=0.0f;
- while (di)
+ for (;(di=rit.current());++rit)
{
DiagramItem *pi=di->parentItem();
DiagramItemList *dil=pi->getChildren();
@@ -849,7 +831,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
yf -= 1.0f;
}
}
- di=dr->next();
+ ++rit; di=rit.current();
}
// add last horizonal line and a vertical connection line
if (bitmap)
@@ -895,13 +877,12 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
}
}
}
- di=dr->next();
}
done=TRUE; // the tree is drawn now
}
else // normal tree connector
{
- while (di)
+ for (;(di=rit.current());++rit)
{
int x=0,y=0;
DiagramItemList *dil = di->getChildren();
@@ -988,8 +969,8 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
}
}
/* write input line */
- DiagramItem *first = dil->first();
- DiagramItem *last = dil->last();
+ DiagramItem *first = dil->getFirst();
+ DiagramItem *last = dil->getLast();
if (first!=last && !first->isInList()) /* connect with all base classes */
{
if (bitmap)
@@ -1027,9 +1008,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
}
}
}
- di=dr->next();
}
- dr=next();
}
}
}
@@ -1053,8 +1032,8 @@ ClassDiagram::ClassDiagram(ClassDef *root)
clearVisitFlags();
super = new TreeDiagram(root,FALSE);
super->computeLayout();
- DiagramItem *baseItem = base->first()->first();
- DiagramItem *superItem = super->first()->first();
+ DiagramItem *baseItem = base->getFirst()->getFirst();
+ DiagramItem *superItem = super->getFirst()->getFirst();
int xbase = baseItem->xPos();
int xsuper = superItem->xPos();
if (xbase>xsuper)
@@ -1307,35 +1286,34 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
t << "boxfont setfont\n";
t << "1 boundaspect scale\n";
-
+
bool done=FALSE;
- DiagramRow *dr=base->first();
- while (dr && !done)
+ QListIterator<DiagramRow> bit(*base);
+ DiagramRow *dr;
+ for (;(dr=bit.current()) && !done;++bit)
{
- DiagramItem *di=dr->first();
- while (di)
+ QListIterator<DiagramItem> rit(*dr);
+ DiagramItem *di;
+ for (;(di=rit.current());++rit)
{
done=di->isInList();
t << "(" << di->label() << ") cw\n";
- di=dr->next();
}
- dr=base->next();
}
- dr=super->first();
- dr=super->next();
+ QListIterator<DiagramRow> sit(*super);
+ ++sit;
done=FALSE;
- while (dr && !done)
+ for (;(dr=sit.current()) && !done;++sit)
{
- DiagramItem *di=dr->first();
- while (di)
+ QListIterator<DiagramItem> rit(*dr);
+ DiagramItem *di;
+ for (;(di=rit.current());++rit)
{
done=di->isInList();
t << "(" << di->label() << ") cw\n";
- di=dr->next();
}
- dr=super->next();
}
-
+
t << "/boxwidth boxwidth marginwidth 2 mul add def\n"
<< "/xspacing boxwidth distx add def\n"
<< "/yspacing boxheight disty add def\n"
diff --git a/src/diagram.h b/src/diagram.h
index 62cab2e..6ce83f3 100644
--- a/src/diagram.h
+++ b/src/diagram.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 5df047a..284d1ee 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -150,6 +150,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
// ol.newParagraph(); // FIXME:PARA
ol.enableAll();
ol.disableAllBut(OutputGenerator::Man);
+ ol.enable(OutputGenerator::Latex);
ol.writeString("\n\n");
ol.popGeneratorState();
}
@@ -224,8 +225,9 @@ void DirDef::writeSubDirList(OutputList &ol)
ol.parseText(theTranslator->trDir(TRUE,FALSE));
ol.endMemberHeader();
ol.startMemberList();
- DirDef *dd=m_subdirs.first();
- while (dd)
+ QListIterator<DirDef> it(m_subdirs);
+ DirDef *dd;
+ for (;(dd=it.current());++it)
{
ol.startMemberDeclaration();
ol.startMemberItem(dd->getOutputFileBase(),0);
@@ -250,7 +252,6 @@ void DirDef::writeSubDirList(OutputList &ol)
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
- dd=m_subdirs.next();
}
ol.endMemberList();
@@ -266,8 +267,9 @@ void DirDef::writeFileList(OutputList &ol)
ol.parseText(theTranslator->trFile(TRUE,FALSE));
ol.endMemberHeader();
ol.startMemberList();
- FileDef *fd=m_fileList->first();
- while (fd)
+ QListIterator<FileDef> it(*m_fileList);
+ FileDef *fd;
+ for (;(fd=it.current());++it)
{
ol.startMemberDeclaration();
ol.startMemberItem(fd->getOutputFileBase(),0);
@@ -313,7 +315,6 @@ void DirDef::writeFileList(OutputList &ol)
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
- fd=m_fileList->next();
}
ol.endMemberList();
}
@@ -334,6 +335,12 @@ QCString DirDef::shortTitle() const
return theTranslator->trDirReference(m_shortName);
}
+bool DirDef::hasDetailedDescription() const
+{
+ static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+ return (!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty();
+}
+
void DirDef::writeDocumentation(OutputList &ol)
{
static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
@@ -584,10 +591,8 @@ bool DirDef::depGraphIsTrivial() const
//----------------------------------------------------------------------
-int FilePairDict::compareItems(QCollection::Item item1,QCollection::Item item2)
+int FilePairDict::compareValues(const FilePair *left,const FilePair *right) const
{
- FilePair *left = (FilePair*)item1;
- FilePair *right = (FilePair*)item2;
int orderHi = qstricmp(left->source()->name(),right->source()->name());
int orderLo = qstricmp(left->destination()->name(),right->destination()->name());
return orderHi==0 ? orderLo : orderHi;
diff --git a/src/dirdef.h b/src/dirdef.h
index 8b11b2e..8f4fbc2 100644
--- a/src/dirdef.h
+++ b/src/dirdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -37,7 +37,7 @@ class DirDef;
class DirList : public QList<DirDef>
{
public:
- int compareItems(QCollection::Item item1,QCollection::Item item2);
+ int compareValues(const DirDef *item1,const DirDef *item2) const;
};
/** A model of a directory symbol. */
@@ -67,6 +67,7 @@ class DirDef : public Definition
bool isParentOf(DirDef *dir) const;
bool depGraphIsTrivial() const;
QCString shortTitle() const;
+ bool hasDetailedDescription() const;
// generate output
void writeDocumentation(OutputList &ol);
@@ -122,7 +123,8 @@ class FilePairDict : public SDict<FilePair>
{
public:
FilePairDict(int size) : SDict<FilePair>(size) {}
- int compareItems(QCollection::Item item1,QCollection::Item item2);
+ private:
+ int compareValues(const FilePair *item1,const FilePair *item2) const;
};
/** Usage information of a directory. */
@@ -160,9 +162,9 @@ class DirRelation
UsedDir *m_dst;
};
-inline int DirList::compareItems(QCollection::Item item1,QCollection::Item item2)
+inline int DirList::compareValues(const DirDef *item1,const DirDef *item2) const
{
- return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+ return qstricmp(item1->shortName(),item2->shortName());
}
/** A sorted dictionary of DirDef objects. */
@@ -170,9 +172,9 @@ class DirSDict : public SDict<DirDef>
{
public:
DirSDict(int size) : SDict<DirDef>(size) {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ int compareValues(const DirDef *item1,const DirDef *item2) const
{
- return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+ return qstricmp(item1->shortName(),item2->shortName());
}
};
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
index 47d3b98..2011333 100644
--- a/src/docbookgen.cpp
+++ b/src/docbookgen.cpp
@@ -2,7 +2,7 @@
*
*
*
-* Copyright (C) 1997-2012 by Dimitri van Heesch.
+* Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -56,18 +56,6 @@
//------------------
-static const char index_xsd[] =
-#include "index.xsd.h"
-;
-
-//------------------
-//
-static const char compound_xsd[] =
-#include "compound.xsd.h"
-;
-
-//------------------
-
class DocbookSectionMapper : public QIntDict<char>
{
public:
diff --git a/src/docbookgen.h b/src/docbookgen.h
index 344cb5b..0431cf2 100644
--- a/src/docbookgen.h
+++ b/src/docbookgen.h
@@ -2,7 +2,7 @@
*
*
*
-* Copyright (C) 1997-2012 by Dimitri van Heesch.
+* Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
index aaea045..6867dce 100644
--- a/src/docbookvisitor.cpp
+++ b/src/docbookvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,6 +33,7 @@
#include "filedef.h"
#include "msc.h"
#include "dia.h"
+#include "htmlentity.h"
DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
: DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
@@ -73,109 +74,14 @@ void DocbookDocVisitor::visit(DocWhiteSpace *w)
void DocbookDocVisitor::visit(DocSymbol *s)
{
if (m_hide) return;
- switch(s->symbol())
+ const char *res = HtmlEntityMapper::instance()->docbook(s->symbol());
+ if (res)
{
- case DocSymbol::BSlash: m_t << "\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "&lt;"; break;
- case DocSymbol::Greater: m_t << "&gt;"; break;
- case DocSymbol::Amp: m_t << "&amp;"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::DoubleColon: m_t << "::"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Copy: m_t << "&#x00A9;"; break;
- case DocSymbol::Tm: m_t << "&#8482;"; break;
- case DocSymbol::Reg: m_t << "&#174;"; break;
- case DocSymbol::Apos: m_t << "&apos;"; break;
- case DocSymbol::Quot: m_t << "&quot;"; break;
- case DocSymbol::Lsquo: m_t << "&#8216;"; break;
- case DocSymbol::Rsquo: m_t << "&#8217;"; break;
- case DocSymbol::Ldquo: m_t << "&#8220;"; break;
- case DocSymbol::Rdquo: m_t << "&#8221;"; break;
- case DocSymbol::Ndash: m_t << "&#8211;"; break;
- case DocSymbol::Mdash: m_t << "&#8212;"; break;
- case DocSymbol::Uml: m_t << "&#168;"; break;
- case DocSymbol::Acute: m_t << "&#180;"; break;
- case DocSymbol::Grave: m_t << "&#192;"; break;
- case DocSymbol::Circ: m_t << "&#710;"; break;
- case DocSymbol::Tilde: m_t << "&#732;"; break;
- case DocSymbol::Szlig: m_t << "&#223;"; break;
- case DocSymbol::Cedil: m_t << "&#184;"; break;
- case DocSymbol::Ring: m_t << "&#197;"; break;
- case DocSymbol::Slash: m_t << "&#216;"; break;
- case DocSymbol::Nbsp: m_t << "&#160;"; break;
- case DocSymbol::Aelig: m_t << "&#230;"; break;
- case DocSymbol::AElig: m_t << "&#198;"; break;
- case DocSymbol::GrkGamma: m_t << "&#915;"; break;
- case DocSymbol::GrkDelta: m_t << "&#916;"; break;
- case DocSymbol::GrkTheta: m_t << "&#920;"; break;
- case DocSymbol::GrkLambda: m_t << "&#923;"; break;
- case DocSymbol::GrkXi: m_t << "&#926;"; break;
- case DocSymbol::GrkPi: m_t << "&#928;"; break;
- case DocSymbol::GrkSigma: m_t << "&#931;"; break;
- case DocSymbol::GrkUpsilon: m_t << "&#933;"; break;
- case DocSymbol::GrkPhi: m_t << "&#934;"; break;
- case DocSymbol::GrkPsi: m_t << "&#936;"; break;
- case DocSymbol::GrkOmega: m_t << "&#937;"; break;
- case DocSymbol::Grkalpha: m_t << "&#945;"; break;
- case DocSymbol::Grkbeta: m_t << "&#946;"; break;
- case DocSymbol::Grkgamma: m_t << "&#947;"; break;
- case DocSymbol::Grkdelta: m_t << "&#948;"; break;
- case DocSymbol::Grkepsilon: m_t << "&#949;"; break;
- case DocSymbol::Grkzeta: m_t << "&#950;"; break;
- case DocSymbol::Grketa: m_t << "&#951;"; break;
- case DocSymbol::Grktheta: m_t << "&#952;"; break;
- case DocSymbol::Grkiota: m_t << "&#953;"; break;
- case DocSymbol::Grkkappa: m_t << "&#954;"; break;
- case DocSymbol::Grklambda: m_t << "&#955;"; break;
- case DocSymbol::Grkmu: m_t << "&#956;"; break;
- case DocSymbol::Grknu: m_t << "&#957;"; break;
- case DocSymbol::Grkxi: m_t << "&#958;"; break;
- case DocSymbol::Grkpi: m_t << "&#960;"; break;
- case DocSymbol::Grkrho: m_t << "&#961;"; break;
- case DocSymbol::Grksigma: m_t << "&#963;"; break;
- case DocSymbol::Grktau: m_t << "&#964;"; break;
- case DocSymbol::Grkupsilon: m_t << "&#965;"; break;
- case DocSymbol::Grkphi: m_t << "&#966;"; break;
- case DocSymbol::Grkchi: m_t << "&#967;"; break;
- case DocSymbol::Grkpsi: m_t << "&#968;"; break;
- case DocSymbol::Grkomega: m_t << "&#969;"; break;
- case DocSymbol::Grkvarsigma: m_t << "&#962;"; break;
- case DocSymbol::Section: m_t << "<simplesect/>"; break;
- case DocSymbol::Degree: m_t << "&#176;"; break;
- case DocSymbol::Prime: m_t << "&#8242;"; break;
- case DocSymbol::DoublePrime: m_t << "&#8243;"; break;
- case DocSymbol::Infinity: m_t << "&#8734;"; break;
- case DocSymbol::EmptySet: m_t << "&#8709;"; break;
- case DocSymbol::PlusMinus: m_t << "&#177;"; break;
- case DocSymbol::Times: m_t << "&#215;"; break;
- case DocSymbol::Minus: m_t << "&#8722;"; break;
- case DocSymbol::CenterDot: m_t << "&#8901;"; break;
- case DocSymbol::Partial: m_t << "&#8706;"; break;
- case DocSymbol::Nabla: m_t << "&#8711;"; break;
- case DocSymbol::SquareRoot: m_t << "&#8730;"; break;
- case DocSymbol::Perpendicular: m_t << "&#8869;"; break;
- case DocSymbol::Sum: m_t << "&#8721;"; break;
- case DocSymbol::Integral: m_t << "&#8747;"; break;
- case DocSymbol::Product: m_t << "&#8719;"; break;
- case DocSymbol::Similar: m_t << "&#8764;"; break;
- case DocSymbol::Approx: m_t << "&#8776;"; break;
- case DocSymbol::NotEqual: m_t << "&#8800;"; break;
- case DocSymbol::Equivalent: m_t << "&#8801;"; break;
- case DocSymbol::Proportional: m_t << "&#8733;"; break;
- case DocSymbol::LessEqual: m_t << "&#8804;"; break;
- case DocSymbol::GreaterEqual: m_t << "&#8805;"; break;
- case DocSymbol::LeftArrow: m_t << "&#8592;"; break;
- case DocSymbol::RightArrow: m_t << "&#8594;"; break;
- case DocSymbol::SetIn: m_t << "&#8712;"; break;
- case DocSymbol::SetNotIn: m_t << "&#8713;"; break;
- case DocSymbol::LeftCeil: m_t << "&#8968;"; break;
- case DocSymbol::RightCeil: m_t << "&#8969;"; break;
- case DocSymbol::LeftFloor: m_t << "&#8970;"; break;
- case DocSymbol::RightFloor: m_t << "&#8971;"; break;
- default:
- err("unknown symbol found\n");
+ m_t << res;
+ }
+ else
+ {
+ err("DocBook: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
}
@@ -379,6 +285,8 @@ void DocbookDocVisitor::visit(DocInclude *inc)
break;
case DocInclude::HtmlInclude:
break;
+ case DocInclude::LatexInclude:
+ break;
case DocInclude::VerbInclude:
m_t << "<verbatim>";
filter(inc->text());
@@ -453,7 +361,7 @@ void DocbookDocVisitor::visit(DocIndexEntry *ie)
void DocbookDocVisitor::visit(DocSimpleSectSep *)
{
- m_t << "<simplesect/>";
+ m_t << "<simplesectsep/>";
}
void DocbookDocVisitor::visit(DocCite *cite)
diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h
index a03e04a..20d424e 100644
--- a/src/docbookvisitor.h
+++ b/src/docbookvisitor.h
@@ -2,7 +2,7 @@
*
*
*
-* Copyright (C) 1997-2012 by Dimitri van Heesch.
+* Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 4a18b4e..e5e2895 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -53,6 +53,7 @@
#include "config.h"
#include "growbuf.h"
#include "markdown.h"
+#include "htmlentity.h"
// debug off
#define DBG(x) do {} while(0)
@@ -1244,34 +1245,43 @@ reparsetoken:
switch (Mappers::cmdMapper->map(tokenName))
{
case CMD_BSLASH:
- children.append(new DocSymbol(parent,DocSymbol::BSlash));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_BSlash));
break;
case CMD_AT:
- children.append(new DocSymbol(parent,DocSymbol::At));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_At));
break;
case CMD_LESS:
- children.append(new DocSymbol(parent,DocSymbol::Less));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Less));
break;
case CMD_GREATER:
- children.append(new DocSymbol(parent,DocSymbol::Greater));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Greater));
break;
case CMD_AMP:
- children.append(new DocSymbol(parent,DocSymbol::Amp));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Amp));
break;
case CMD_DOLLAR:
- children.append(new DocSymbol(parent,DocSymbol::Dollar));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Dollar));
break;
case CMD_HASH:
- children.append(new DocSymbol(parent,DocSymbol::Hash));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Hash));
break;
case CMD_DCOLON:
- children.append(new DocSymbol(parent,DocSymbol::DoubleColon));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_DoubleColon));
break;
case CMD_PERCENT:
- children.append(new DocSymbol(parent,DocSymbol::Percent));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Percent));
+ break;
+ case CMD_NDASH:
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+ break;
+ case CMD_MDASH:
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
break;
case CMD_QUOTE:
- children.append(new DocSymbol(parent,DocSymbol::Quot));
+ children.append(new DocSymbol(parent,DocSymbol::Sym_Quot));
break;
case CMD_EMPHASIS:
{
@@ -1319,7 +1329,7 @@ reparsetoken:
{
doctokenizerYYsetStateHtmlOnly();
tok = doctokenizerYYlex();
- children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+ children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
@@ -1488,11 +1498,10 @@ reparsetoken:
break;
case TK_SYMBOL:
{
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(tokenName,&letter);
- if (s!=DocSymbol::Unknown)
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(tokenName);
+ if (s!=DocSymbol::Sym_Unknown)
{
- children.append(new DocSymbol(parent,s,letter));
+ children.append(new DocSymbol(parent,s));
}
else
{
@@ -1571,138 +1580,10 @@ static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribL
//---------------------------------------------------------------------------
-DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName,char *letter)
-{
- int l=symName.length();
- DBG(("decodeSymbol(%s) l=%d\n",qPrint(symName),l));
- // TODO: replace this with a hash
- if (symName=="&copy;") return DocSymbol::Copy;
- else if (symName=="&trade;") return DocSymbol::Tm;
- else if (symName=="&tm;") return DocSymbol::Tm; // alias for &trade;
- else if (symName=="&reg;") return DocSymbol::Reg;
- else if (symName=="&lt;") return DocSymbol::Less;
- else if (symName=="&gt;") return DocSymbol::Greater;
- else if (symName=="&amp;") return DocSymbol::Amp;
- else if (symName=="&apos;") return DocSymbol::Apos;
- else if (symName=="&quot;") return DocSymbol::Quot;
- else if (symName=="&lsquo;") return DocSymbol::Lsquo;
- else if (symName=="&rsquo;") return DocSymbol::Rsquo;
- else if (symName=="&ldquo;") return DocSymbol::Ldquo;
- else if (symName=="&rdquo;") return DocSymbol::Rdquo;
- else if (symName=="&ndash;") return DocSymbol::Ndash;
- else if (symName=="&mdash;") return DocSymbol::Mdash;
- else if (symName=="&szlig;") return DocSymbol::Szlig;
- else if (symName=="&nbsp;") return DocSymbol::Nbsp;
- else if (symName=="&AElig;") return DocSymbol::AElig;
- else if (symName=="&aelig;") return DocSymbol::Aelig;
- else if (symName=="&Gamma;") return DocSymbol::GrkGamma;
- else if (symName=="&Delta;") return DocSymbol::GrkDelta;
- else if (symName=="&Theta;") return DocSymbol::GrkTheta;
- else if (symName=="&Lambda;") return DocSymbol::GrkLambda;
- else if (symName=="&Xi;") return DocSymbol::GrkXi;
- else if (symName=="&Pi;") return DocSymbol::GrkPi;
- else if (symName=="&Sigma;") return DocSymbol::GrkSigma;
- else if (symName=="&Upsilon;") return DocSymbol::GrkUpsilon;
- else if (symName=="&Phi;") return DocSymbol::GrkPhi;
- else if (symName=="&Psi;") return DocSymbol::GrkPsi;
- else if (symName=="&Omega;") return DocSymbol::GrkOmega;
- else if (symName=="&alpha;") return DocSymbol::Grkalpha;
- else if (symName=="&beta;") return DocSymbol::Grkbeta;
- else if (symName=="&gamma;") return DocSymbol::Grkgamma;
- else if (symName=="&delta;") return DocSymbol::Grkdelta;
- else if (symName=="&epsilon;") return DocSymbol::Grkepsilon;
- else if (symName=="&zeta;") return DocSymbol::Grkzeta;
- else if (symName=="&eta;") return DocSymbol::Grketa;
- else if (symName=="&theta;") return DocSymbol::Grktheta;
- else if (symName=="&iota;") return DocSymbol::Grkiota;
- else if (symName=="&kappa;") return DocSymbol::Grkkappa;
- else if (symName=="&lambda;") return DocSymbol::Grklambda;
- else if (symName=="&mu;") return DocSymbol::Grkmu;
- else if (symName=="&nu;") return DocSymbol::Grknu;
- else if (symName=="&xi;") return DocSymbol::Grkxi;
- else if (symName=="&pi;") return DocSymbol::Grkpi;
- else if (symName=="&rho;") return DocSymbol::Grkrho;
- else if (symName=="&sigma;") return DocSymbol::Grksigma;
- else if (symName=="&tau;") return DocSymbol::Grktau;
- else if (symName=="&upsilon;") return DocSymbol::Grkupsilon;
- else if (symName=="&phi;") return DocSymbol::Grkphi;
- else if (symName=="&chi;") return DocSymbol::Grkchi;
- else if (symName=="&psi;") return DocSymbol::Grkpsi;
- else if (symName=="&omega;") return DocSymbol::Grkomega;
- else if (symName=="&sigmaf;") return DocSymbol::Grkvarsigma;
- else if (symName=="&sect;") return DocSymbol::Section;
- else if (symName=="&deg;") return DocSymbol::Degree;
- else if (symName=="&prime;") return DocSymbol::Prime;
- else if (symName=="&Prime;") return DocSymbol::DoublePrime;
- else if (symName=="&infin;") return DocSymbol::Infinity;
- else if (symName=="&empty;") return DocSymbol::EmptySet;
- else if (symName=="&plusmn;") return DocSymbol::PlusMinus;
- else if (symName=="&times;") return DocSymbol::Times;
- else if (symName=="&minus;") return DocSymbol::Minus;
- else if (symName=="&sdot;") return DocSymbol::CenterDot;
- else if (symName=="&part;") return DocSymbol::Partial;
- else if (symName=="&nabla;") return DocSymbol::Nabla;
- else if (symName=="&radic;") return DocSymbol::SquareRoot;
- else if (symName=="&perp;") return DocSymbol::Perpendicular;
- else if (symName=="&sum;") return DocSymbol::Sum;
- else if (symName=="&int;") return DocSymbol::Integral;
- else if (symName=="&prod;") return DocSymbol::Product;
- else if (symName=="&sim;") return DocSymbol::Similar;
- else if (symName=="&asymp;") return DocSymbol::Approx;
- else if (symName=="&ne;") return DocSymbol::NotEqual;
- else if (symName=="&equiv;") return DocSymbol::Equivalent;
- else if (symName=="&prop;") return DocSymbol::Proportional;
- else if (symName=="&le;") return DocSymbol::LessEqual;
- else if (symName=="&ge;") return DocSymbol::GreaterEqual;
- else if (symName=="&larr;") return DocSymbol::LeftArrow;
- else if (symName=="&rarr;") return DocSymbol::RightArrow;
- else if (symName=="&isin;") return DocSymbol::SetIn;
- else if (symName=="&notin;") return DocSymbol::SetNotIn;
- else if (symName=="&lceil;") return DocSymbol::LeftCeil;
- else if (symName=="&rceil;") return DocSymbol::RightCeil;
- else if (symName=="&lfloor;") return DocSymbol::LeftFloor;
- else if (symName=="&rfloor;") return DocSymbol::RightFloor;
- else if (l==6 && symName.right(4)=="uml;")
- {
- *letter=symName.at(1);
- return DocSymbol::Uml;
- }
- else if (l==8 && symName.right(6)=="acute;")
- {
- *letter=symName.at(1);
- return DocSymbol::Acute;
- }
- else if (l==8 && symName.right(6)=="grave;")
- {
- *letter=symName.at(1);
- return DocSymbol::Grave;
- }
- else if (l==7 && symName.right(5)=="circ;")
- {
- *letter=symName.at(1);
- return DocSymbol::Circ;
- }
- else if (l==8 && symName.right(6)=="tilde;")
- {
- *letter=symName.at(1);
- return DocSymbol::Tilde;
- }
- else if (l==8 && symName.right(6)=="cedil;")
- {
- *letter=symName.at(1);
- return DocSymbol::Cedil;
- }
- else if (l==7 && symName.right(5)=="ring;")
- {
- *letter=symName.at(1);
- return DocSymbol::Ring;
- }
- else if (l==8 && symName.right(6)=="slash;")
- {
- *letter=symName.at(1);
- return DocSymbol::Slash;
- }
- return DocSymbol::Unknown;
+DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName)
+{
+ DBG(("decodeSymbol(%s)\n",qPrint(symName)));
+ return HtmlEntityMapper::instance()->name2sym(symName);
}
//---------------------------------------------------------------------------
@@ -1719,9 +1600,9 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
// first parse any number of paragraphs
bool isFirst=TRUE;
DocPara *lastPar=0;
- if (!children.isEmpty() && children.last()->kind()==DocNode::Kind_Para)
+ if (!children.isEmpty() && children.getLast()->kind()==DocNode::Kind_Para)
{ // last child item was a paragraph
- lastPar = (DocPara*)children.last();
+ lastPar = (DocPara*)children.getLast();
isFirst=FALSE;
}
do
@@ -1873,12 +1754,12 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
DocVerbatim::DocVerbatim(DocNode *parent,const QCString &context,
const QCString &text, Type t,bool isExample,
- const QCString &exampleFile,const QCString &lang)
+ const QCString &exampleFile,bool isBlock,const QCString &lang)
: m_context(context), m_text(text), m_type(t),
- m_isExample(isExample), m_exampleFile(exampleFile),
- m_relPath(g_relPath), m_lang(lang)
-{
- m_parent = parent;
+ m_isExample(isExample), m_exampleFile(exampleFile),
+ m_relPath(g_relPath), m_lang(lang), m_isBlock(isBlock)
+{
+ m_parent = parent;
}
@@ -1905,6 +1786,9 @@ void DocInclude::parse()
case HtmlInclude:
readTextFileByName(m_file,m_text);
break;
+ case LatexInclude:
+ readTextFileByName(m_file,m_text);
+ break;
case Snippet:
readTextFileByName(m_file,m_text);
// check here for the existence of the blockId inside the file, so we
@@ -3369,26 +3253,25 @@ int DocIndexEntry::parse()
break;
case TK_SYMBOL:
{
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
switch (s)
{
- case DocSymbol::BSlash: m_entry+='\\'; break;
- case DocSymbol::At: m_entry+='@'; break;
- case DocSymbol::Less: m_entry+='<'; break;
- case DocSymbol::Greater: m_entry+='>'; break;
- case DocSymbol::Amp: m_entry+='&'; break;
- case DocSymbol::Dollar: m_entry+='$'; break;
- case DocSymbol::Hash: m_entry+='#'; break;
- case DocSymbol::Percent: m_entry+='%'; break;
- case DocSymbol::Apos: m_entry+='\''; break;
- case DocSymbol::Quot: m_entry+='"'; break;
- case DocSymbol::Lsquo: m_entry+='`'; break;
- case DocSymbol::Rsquo: m_entry+='\''; break;
- case DocSymbol::Ldquo: m_entry+="``"; break;
- case DocSymbol::Rdquo: m_entry+="''"; break;
- case DocSymbol::Ndash: m_entry+="--"; break;
- case DocSymbol::Mdash: m_entry+="---"; break;
+ case DocSymbol::Sym_BSlash: m_entry+='\\'; break;
+ case DocSymbol::Sym_At: m_entry+='@'; break;
+ case DocSymbol::Sym_Less: m_entry+='<'; break;
+ case DocSymbol::Sym_Greater: m_entry+='>'; break;
+ case DocSymbol::Sym_Amp: m_entry+='&'; break;
+ case DocSymbol::Sym_Dollar: m_entry+='$'; break;
+ case DocSymbol::Sym_Hash: m_entry+='#'; break;
+ case DocSymbol::Sym_Percent: m_entry+='%'; break;
+ case DocSymbol::Sym_apos: m_entry+='\''; break;
+ case DocSymbol::Sym_Quot: m_entry+='"'; break;
+ case DocSymbol::Sym_lsquo: m_entry+='`'; break;
+ case DocSymbol::Sym_rsquo: m_entry+='\''; break;
+ case DocSymbol::Sym_ldquo: m_entry+="``"; break;
+ case DocSymbol::Sym_rdquo: m_entry+="''"; break;
+ case DocSymbol::Sym_ndash: m_entry+="--"; break;
+ case DocSymbol::Sym_mdash: m_entry+="---"; break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected symbol found as argument of \\addindex");
break;
@@ -3407,6 +3290,8 @@ int DocIndexEntry::parse()
case CMD_HASH: m_entry+='#'; break;
case CMD_DCOLON: m_entry+="::"; break;
case CMD_PERCENT: m_entry+='%'; break;
+ case CMD_NDASH: m_entry+="--"; break;
+ case CMD_MDASH: m_entry+="---"; break;
case CMD_QUOTE: m_entry+='"'; break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
@@ -4654,8 +4539,8 @@ int DocSimpleSect::parse(bool userTitle,bool needsSeparator)
}
else
{
- ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
- ((DocPara *)m_children.last())->markLast(FALSE);
+ ASSERT(m_children.getLast()->kind()==DocNode::Kind_Para);
+ ((DocPara *)m_children.getLast())->markLast(FALSE);
}
par->markLast();
if (needsSeparator) m_children.append(new DocSimpleSectSep(this));
@@ -4705,8 +4590,8 @@ int DocSimpleSect::parseXml()
}
else
{
- ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
- ((DocPara *)m_children.last())->markLast(FALSE);
+ ASSERT(m_children.getLast()->kind()==DocNode::Kind_Para);
+ ((DocPara *)m_children.getLast())->markLast(FALSE);
}
par->markLast();
m_children.append(par);
@@ -4730,14 +4615,14 @@ int DocSimpleSect::parseXml()
void DocSimpleSect::appendLinkWord(const QCString &word)
{
DocPara *p;
- if (m_children.isEmpty() || m_children.last()->kind()!=DocNode::Kind_Para)
+ if (m_children.isEmpty() || m_children.getLast()->kind()!=DocNode::Kind_Para)
{
p = new DocPara(this);
m_children.append(p);
}
else
{
- p = (DocPara *)m_children.last();
+ p = (DocPara *)m_children.getLast();
// Comma-seperate <seealso> links.
p->injectToken(TK_WORD,",");
@@ -4881,7 +4766,7 @@ int DocParamList::parseXml(const QCString &paramName)
}
else
{
- m_paragraphs.last()->markLast(FALSE);
+ m_paragraphs.getLast()->markLast(FALSE);
}
par->markLast();
m_paragraphs.append(par);
@@ -4932,8 +4817,8 @@ int DocParamSect::parse(const QCString &cmdName,bool xmlContext, Direction d)
}
else
{
- ASSERT(m_children.last()->kind()==DocNode::Kind_ParamList);
- ((DocParamList *)m_children.last())->markLast(FALSE);
+ ASSERT(m_children.getLast()->kind()==DocNode::Kind_ParamList);
+ ((DocParamList *)m_children.getLast())->markLast(FALSE);
pl->markLast();
}
m_children.append(pl);
@@ -4945,6 +4830,10 @@ int DocParamSect::parse(const QCString &cmdName,bool xmlContext, Direction d)
{
retval = pl->parse(cmdName);
}
+ if (retval==RetVal_EndParBlock)
+ {
+ retval = RetVal_OK;
+ }
DBG(("DocParamSect::parse() end retval=%d\n",retval));
DocNode *n=g_nodeStack.pop();
@@ -4959,12 +4848,12 @@ int DocPara::handleSimpleSection(DocSimpleSect::Type t, bool xmlContext)
DocSimpleSect *ss=0;
bool needsSeparator = FALSE;
if (!m_children.isEmpty() && // previous element
- m_children.last()->kind()==Kind_SimpleSect && // was a simple sect
- ((DocSimpleSect *)m_children.last())->type()==t && // of same type
+ m_children.getLast()->kind()==Kind_SimpleSect && // was a simple sect
+ ((DocSimpleSect *)m_children.getLast())->type()==t && // of same type
t!=DocSimpleSect::User) // but not user defined
{
// append to previous section
- ss=(DocSimpleSect *)m_children.last();
+ ss=(DocSimpleSect *)m_children.getLast();
needsSeparator = TRUE;
}
else // start new section
@@ -4991,11 +4880,11 @@ int DocPara::handleParamSection(const QCString &cmdName,
{
DocParamSect *ps=0;
if (!m_children.isEmpty() && // previous element
- m_children.last()->kind()==Kind_ParamSect && // was a param sect
- ((DocParamSect *)m_children.last())->type()==t) // of same type
+ m_children.getLast()->kind()==Kind_ParamSect && // was a param sect
+ ((DocParamSect *)m_children.getLast())->type()==t) // of same type
{
// append to previous section
- ps=(DocParamSect *)m_children.last();
+ ps=(DocParamSect *)m_children.getLast();
}
else // start new section
{
@@ -5086,13 +4975,15 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
return;
}
DocIncOperator *op = new DocIncOperator(this,t,g_token->name,g_context,g_isExample,g_exampleName);
- DocNode *n1 = m_children.last();
- DocNode *n2 = n1!=0 ? m_children.prev() : 0;
+ QListIterator<DocNode> it(m_children);
+ DocNode *n1 = it.toLast();
+ --it;
+ DocNode *n2 = n1!=0 ? it.current() : 0;
bool isFirst = n1==0 || // no last node
- (n1->kind()!=DocNode::Kind_IncOperator &&
+ (n1->kind()!=DocNode::Kind_IncOperator &&
n1->kind()!=DocNode::Kind_WhiteSpace
) || // last node is not operator or whitespace
- (n1->kind()==DocNode::Kind_WhiteSpace &&
+ (n1->kind()==DocNode::Kind_WhiteSpace &&
n2!=0 && n2->kind()!=DocNode::Kind_IncOperator
); // previous not is not operator
op->markFirst(isFirst);
@@ -5400,7 +5291,7 @@ int DocPara::handleStartCode()
if (g_token->verb.at(i)=='\n') li=i+1;
i++;
}
- m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,lang));
+ m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,FALSE,lang));
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"code section ended without end marker");
doctokenizerYYsetStatePara();
return retval;
@@ -5464,37 +5355,46 @@ int DocPara::handleCommand(const QCString &cmdName)
if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
break;
case CMD_BSLASH:
- m_children.append(new DocSymbol(this,DocSymbol::BSlash));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_BSlash));
break;
case CMD_AT:
- m_children.append(new DocSymbol(this,DocSymbol::At));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_At));
break;
case CMD_LESS:
- m_children.append(new DocSymbol(this,DocSymbol::Less));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Less));
break;
case CMD_GREATER:
- m_children.append(new DocSymbol(this,DocSymbol::Greater));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Greater));
break;
case CMD_AMP:
- m_children.append(new DocSymbol(this,DocSymbol::Amp));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Amp));
break;
case CMD_DOLLAR:
- m_children.append(new DocSymbol(this,DocSymbol::Dollar));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Dollar));
break;
case CMD_HASH:
- m_children.append(new DocSymbol(this,DocSymbol::Hash));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Hash));
break;
case CMD_PIPE:
- m_children.append(new DocSymbol(this,DocSymbol::Pipe));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Pipe));
break;
case CMD_DCOLON:
- m_children.append(new DocSymbol(this,DocSymbol::DoubleColon));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon));
break;
case CMD_PERCENT:
- m_children.append(new DocSymbol(this,DocSymbol::Percent));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Percent));
+ break;
+ case CMD_NDASH:
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ break;
+ case CMD_MDASH:
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
break;
case CMD_QUOTE:
- m_children.append(new DocSymbol(this,DocSymbol::Quot));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Quot));
break;
case CMD_SA:
g_inSeeBlock=TRUE;
@@ -5588,7 +5488,7 @@ int DocPara::handleCommand(const QCString &cmdName)
{
doctokenizerYYsetStateHtmlOnly();
retval = doctokenizerYYlex();
- m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
@@ -5751,6 +5651,9 @@ int DocPara::handleCommand(const QCString &cmdName)
case CMD_HTMLINCLUDE:
handleInclude(cmdName,DocInclude::HtmlInclude);
break;
+ case CMD_LATEXINCLUDE:
+ handleInclude(cmdName,DocInclude::LatexInclude);
+ break;
case CMD_VERBINCLUDE:
handleInclude(cmdName,DocInclude::VerbInclude);
break;
@@ -6468,7 +6371,7 @@ reparsetoken:
// remove leading whitespace
!m_children.isEmpty() &&
// and whitespace after certain constructs
- (k=m_children.last()->kind())!=DocNode::Kind_HtmlDescList &&
+ (k=m_children.getLast()->kind())!=DocNode::Kind_HtmlDescList &&
k!=DocNode::Kind_HtmlTable &&
k!=DocNode::Kind_HtmlList &&
k!=DocNode::Kind_SimpleSect &&
@@ -6685,11 +6588,10 @@ reparsetoken:
break;
case TK_SYMBOL:
{
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
- if (s!=DocSymbol::Unknown)
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
+ if (s!=DocSymbol::Sym_Unknown)
{
- m_children.append(new DocSymbol(this,s,letter));
+ m_children.append(new DocSymbol(this,s));
}
else
{
@@ -6904,11 +6806,10 @@ void DocText::parse()
break;
case TK_SYMBOL:
{
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
- if (s!=DocSymbol::Unknown)
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
+ if (s!=DocSymbol::Sym_Unknown)
{
- m_children.append(new DocSymbol(this,s,letter));
+ m_children.append(new DocSymbol(this,s));
}
else
{
@@ -6921,34 +6822,43 @@ void DocText::parse()
switch (Mappers::cmdMapper->map(g_token->name))
{
case CMD_BSLASH:
- m_children.append(new DocSymbol(this,DocSymbol::BSlash));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_BSlash));
break;
case CMD_AT:
- m_children.append(new DocSymbol(this,DocSymbol::At));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_At));
break;
case CMD_LESS:
- m_children.append(new DocSymbol(this,DocSymbol::Less));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Less));
break;
case CMD_GREATER:
- m_children.append(new DocSymbol(this,DocSymbol::Greater));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Greater));
break;
case CMD_AMP:
- m_children.append(new DocSymbol(this,DocSymbol::Amp));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Amp));
break;
case CMD_DOLLAR:
- m_children.append(new DocSymbol(this,DocSymbol::Dollar));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Dollar));
break;
case CMD_HASH:
- m_children.append(new DocSymbol(this,DocSymbol::Hash));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Hash));
break;
case CMD_DCOLON:
- m_children.append(new DocSymbol(this,DocSymbol::DoubleColon));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon));
break;
case CMD_PERCENT:
- m_children.append(new DocSymbol(this,DocSymbol::Percent));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Percent));
+ break;
+ case CMD_NDASH:
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ break;
+ case CMD_MDASH:
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
break;
case CMD_QUOTE:
- m_children.append(new DocSymbol(this,DocSymbol::Quot));
+ m_children.append(new DocSymbol(this,DocSymbol::Sym_Quot));
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command `%s' found",
diff --git a/src/docparser.h b/src/docparser.h
index 050c871..fb4f084 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -336,34 +336,84 @@ class DocStyleChange : public DocNode
class DocSymbol : public DocNode
{
public:
- enum SymType { Unknown=0, BSlash, At, Less, Greater, Amp, Dollar, Hash,
- DoubleColon, Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute,
- Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Slash,
- Lsquo, Rsquo, Ldquo, Rdquo, Ndash, Mdash, Aelig, AElig,
- GrkGamma, GrkDelta, GrkTheta, GrkLambda, GrkXi, GrkPi,
- GrkSigma, GrkUpsilon, GrkPhi, GrkPsi, GrkOmega, Grkalpha,
- Grkbeta, Grkgamma, Grkdelta, Grkepsilon, Grkzeta, Grketa,
- Grktheta, Grkiota, Grkkappa, Grklambda, Grkmu, Grknu, Grkxi,
- Grkpi, Grkrho, Grksigma, Grktau, Grkupsilon, Grkphi, Grkchi,
- Grkpsi, Grkomega, Grkvarsigma, Section, Degree, Prime,
- DoublePrime, Infinity, EmptySet, PlusMinus, Times, Minus,
- CenterDot, Partial, Nabla, SquareRoot, Perpendicular, Sum,
- Integral, Product, Similar, Approx, NotEqual, Equivalent,
- Proportional, LessEqual, GreaterEqual, LeftArrow, RightArrow,
- SetIn, SetNotIn, LeftCeil, RightCeil, LeftFloor, RightFloor,
- Pipe
+ enum SymType { Sym_Unknown = -1,
+ Sym_nbsp, Sym_iexcl, Sym_cent, Sym_pound, Sym_curren,
+ Sym_yen, Sym_brvbar, Sym_sect, Sym_uml, Sym_copy,
+ Sym_ordf, Sym_laquo, Sym_not, Sym_shy, Sym_reg,
+ Sym_macr, Sym_deg, Sym_plusmn, Sym_sup2, Sym_sup3,
+ Sym_acute, Sym_micro, Sym_para, Sym_middot, Sym_cedil,
+ Sym_sup1, Sym_ordm, Sym_raquo, Sym_frac14, Sym_frac12,
+ Sym_frac34, Sym_iquest, Sym_Agrave, Sym_Aacute, Sym_Acirc,
+ Sym_Atilde, Sym_Auml, Sym_Aring, Sym_AElig, Sym_Ccedil,
+ Sym_Egrave, Sym_Eacute, Sym_Ecirc, Sym_Euml, Sym_Igrave,
+ Sym_Iacute, Sym_Icirc, Sym_Iuml, Sym_ETH, Sym_Ntilde,
+ Sym_Ograve, Sym_Oacute, Sym_Ocirc, Sym_Otilde, Sym_Ouml,
+ Sym_times, Sym_Oslash, Sym_Ugrave, Sym_Uacute, Sym_Ucirc,
+ Sym_Uuml, Sym_Yacute, Sym_THORN, Sym_szlig, Sym_agrave,
+ Sym_aacute, Sym_acirc, Sym_atilde, Sym_auml, Sym_aring,
+ Sym_aelig, Sym_ccedil, Sym_egrave, Sym_eacute, Sym_ecirc,
+ Sym_euml, Sym_igrave, Sym_iacute, Sym_icirc, Sym_iuml,
+ Sym_eth, Sym_ntilde, Sym_ograve, Sym_oacute, Sym_ocirc,
+ Sym_otilde, Sym_ouml, Sym_divide, Sym_oslash, Sym_ugrave,
+ Sym_uacute, Sym_ucirc, Sym_uuml, Sym_yacute, Sym_thorn,
+ Sym_yuml, Sym_fnof, Sym_Alpha, Sym_Beta, Sym_Gamma,
+ Sym_Delta, Sym_Epsilon, Sym_Zeta, Sym_Eta, Sym_Theta,
+ Sym_Iota, Sym_Kappa, Sym_Lambda, Sym_Mu, Sym_Nu,
+ Sym_Xi, Sym_Omicron, Sym_Pi, Sym_Rho, Sym_Sigma,
+ Sym_Tau, Sym_Upsilon, Sym_Phi, Sym_Chi, Sym_Psi,
+ Sym_Omega, Sym_alpha, Sym_beta, Sym_gamma, Sym_delta,
+ Sym_epsilon, Sym_zeta, Sym_eta, Sym_theta, Sym_iota,
+ Sym_kappa, Sym_lambda, Sym_mu, Sym_nu, Sym_xi,
+ Sym_omicron, Sym_pi, Sym_rho, Sym_sigmaf, Sym_sigma,
+ Sym_tau, Sym_upsilon, Sym_phi, Sym_chi, Sym_psi,
+ Sym_omega, Sym_thetasym, Sym_upsih, Sym_piv, Sym_bull,
+ Sym_hellip, Sym_prime, Sym_Prime, Sym_oline, Sym_frasl,
+ Sym_weierp, Sym_image, Sym_real, Sym_trade, Sym_alefsym,
+ Sym_larr, Sym_uarr, Sym_rarr, Sym_darr, Sym_harr,
+ Sym_crarr, Sym_lArr, Sym_uArr, Sym_rArr, Sym_dArr,
+ Sym_hArr, Sym_forall, Sym_part, Sym_exist, Sym_empty,
+ Sym_nabla, Sym_isin, Sym_notin, Sym_ni, Sym_prod,
+ Sym_sum, Sym_minus, Sym_lowast, Sym_radic, Sym_prop,
+ Sym_infin, Sym_ang, Sym_and, Sym_or, Sym_cap,
+ Sym_cup, Sym_int, Sym_there4, Sym_sim, Sym_cong,
+ Sym_asymp, Sym_ne, Sym_equiv, Sym_le, Sym_ge,
+ Sym_sub, Sym_sup, Sym_nsub, Sym_sube, Sym_supe,
+ Sym_oplus, Sym_otimes, Sym_perp, Sym_sdot, Sym_lceil,
+ Sym_rceil, Sym_lfloor, Sym_rfloor, Sym_lang, Sym_rang,
+ Sym_loz, Sym_spades, Sym_clubs, Sym_hearts, Sym_diams,
+ Sym_quot, Sym_amp, Sym_lt, Sym_gt, Sym_OElig,
+ Sym_oelig, Sym_Scaron, Sym_scaron, Sym_Yuml, Sym_circ,
+ Sym_tilde, Sym_ensp, Sym_emsp, Sym_thinsp, Sym_zwnj,
+ Sym_zwj, Sym_lrm, Sym_rlm, Sym_ndash, Sym_mdash,
+ Sym_lsquo, Sym_rsquo, Sym_sbquo, Sym_ldquo, Sym_rdquo,
+ Sym_bdquo, Sym_dagger, Sym_Dagger, Sym_permil, Sym_lsaquo,
+ Sym_rsaquo, Sym_euro,
+
+ /* doxygen extensions */
+ Sym_tm, Sym_apos,
+
+ /* doxygen commands mapped */
+ Sym_BSlash, Sym_At, Sym_Less, Sym_Greater, Sym_Amp,
+ Sym_Dollar, Sym_Hash, Sym_DoubleColon, Sym_Percent, Sym_Pipe,
+ Sym_Quot, Sym_Minus
};
- DocSymbol(DocNode *parent,SymType s,char letter='\0') :
- m_symbol(s), m_letter(letter) { m_parent = parent; }
+ enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut,
+ Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde,
+ Perl_cedilla, Perl_ring
+ };
+ typedef struct PerlSymb {
+ const char *symb;
+ const PerlType type;
+ }PerlSymb;
+ DocSymbol(DocNode *parent,SymType s) :
+ m_symbol(s) { m_parent = parent; }
SymType symbol() const { return m_symbol; }
- char letter() const { return m_letter; }
Kind kind() const { return Kind_Symbol; }
void accept(DocVisitor *v) { v->visit(this); }
- static SymType decodeSymbol(const QCString &symName,char *letter);
+ static SymType decodeSymbol(const QCString &symName);
private:
SymType m_symbol;
- char m_letter;
};
/** Node representing some amount of white space */
@@ -386,7 +436,7 @@ class DocVerbatim : public DocNode
enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly };
DocVerbatim(DocNode *parent,const QCString &context,
const QCString &text, Type t,bool isExample,
- const QCString &exampleFile,const QCString &lang=QCString());
+ const QCString &exampleFile,bool isBlock=FALSE,const QCString &lang=QCString());
Kind kind() const { return Kind_Verbatim; }
Type type() const { return m_type; }
QCString text() const { return m_text; }
@@ -396,6 +446,7 @@ class DocVerbatim : public DocNode
QCString exampleFile() const { return m_exampleFile; }
QCString relPath() const { return m_relPath; }
QCString language() const { return m_lang; }
+ bool isBlock() const { return m_isBlock; }
private:
QCString m_context;
@@ -405,6 +456,7 @@ class DocVerbatim : public DocNode
QCString m_exampleFile;
QCString m_relPath;
QCString m_lang;
+ bool m_isBlock;
};
@@ -412,7 +464,7 @@ class DocVerbatim : public DocNode
class DocInclude : public DocNode
{
public:
- enum Type { Include, DontInclude, VerbInclude, HtmlInclude, IncWithLines, Snippet };
+ enum Type { Include, DontInclude, VerbInclude, HtmlInclude, LatexInclude, IncWithLines, Snippet };
DocInclude(DocNode *parent,const QCString &file,
const QCString context, Type t,
bool isExample,const QCString exampleFile,
diff --git a/src/docsets.cpp b/src/docsets.cpp
index 2aa2918..52d24bb 100644
--- a/src/docsets.cpp
+++ b/src/docsets.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -72,7 +72,7 @@ void DocSets::initialize()
"DOCSET_RESOURCES=$(DOCSET_CONTENTS)/Resources\n"
"DOCSET_DOCUMENTS=$(DOCSET_RESOURCES)/Documents\n"
"DESTDIR=~/Library/Developer/Shared/Documentation/DocSets\n"
- "XCODE_INSTALL=$(shell xcode-select -print-path)\n"
+ "XCODE_INSTALL=\"$(shell xcode-select -print-path)\"\n"
"\n"
"all: docset\n"
"\n"
diff --git a/src/docsets.h b/src/docsets.h
index c5f0dc7..eac5bfc 100644
--- a/src/docsets.h
+++ b/src/docsets.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
index ca0490c..1db764e 100644
--- a/src/doctokenizer.h
+++ b/src/doctokenizer.h
@@ -3,7 +3,7 @@
* $Id: $
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 5ba1a72..7ffbbb3 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -3,7 +3,7 @@
* $Id: $
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -350,7 +350,7 @@ HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
VERBATIM "verbatim"{BLANK}*
-SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM})
+SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---")
SPCMD2 {CMD}[\\@<>&$#%~".|]
SPCMD3 {CMD}form#[0-9]+
SPCMD4 {CMD}"::"
@@ -406,6 +406,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
%x St_CodeOpt
%x St_XmlCode
%x St_HtmlOnly
+%x St_HtmlOnlyOption
%x St_ManOnly
%x St_LatexOnly
%x St_RtfOnly
@@ -627,8 +628,16 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
<St_Para>"$"{ID}":"[^\n$]+"$" { /* RCS tag */
QCString tagName(yytext+1);
int index=tagName.find(':');
- g_token->name = tagName.left(index+1);
- g_token->text = tagName.mid(index+2,tagName.length()-index-3);
+ g_token->name = tagName.left(index);
+ int text_begin = index+2;
+ int text_end = tagName.length()-1;
+ if (tagName[text_begin-1]==':') /* check for Subversion fixed-length keyword */
+ {
+ ++text_begin;
+ if (tagName[text_end-1]=='#')
+ --text_end;
+ }
+ g_token->text = tagName.mid(text_begin,text_end-text_begin);
return TK_RCSTAG;
}
<St_Para,St_HtmlOnly>"$("{ID}")" { /* environment variable */
@@ -759,6 +768,14 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
<St_Code,St_XmlCode>. {
g_token->verb+=yytext;
}
+<St_HtmlOnlyOption>" [block]" { // the space is added in commentscan.l
+ g_token->name="block";
+ BEGIN(St_HtmlOnly);
+ }
+<St_HtmlOnlyOption>.|\n {
+ unput(*yytext);
+ BEGIN(St_HtmlOnly);
+ }
<St_HtmlOnly>{CMD}"endhtmlonly" {
return RetVal_OK;
}
@@ -1024,7 +1041,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
g_token->name = types+"#"+params.mid(i);
return TK_WORD;
}
-<St_Param>[^ \t\n,]+ {
+<St_Param>[^ \t\n,@\\]+ {
g_token->name = yytext;
if (g_token->name.at(yyleng-1)==':')
{
@@ -1247,7 +1264,8 @@ void doctokenizerYYsetStateXmlCode()
void doctokenizerYYsetStateHtmlOnly()
{
g_token->verb="";
- BEGIN(St_HtmlOnly);
+ g_token->name="";
+ BEGIN(St_HtmlOnlyOption);
}
void doctokenizerYYsetStateManOnly()
diff --git a/src/docvisitor.h b/src/docvisitor.h
index d12295c..a444b47 100644
--- a/src/docvisitor.h
+++ b/src/docvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/dot.cpp b/src/dot.cpp
index 8d9ba3f..051a438 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -783,10 +783,11 @@ class DotNodeList : public QList<DotNode>
public:
DotNodeList() : QList<DotNode>() {}
~DotNodeList() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
- {
- return qstricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
- }
+ private:
+ int compareValues(const DotNode *n1,const DotNode *n2) const
+ {
+ return qstricmp(n1->m_label,n2->m_label);
+ }
};
//--------------------------------------------------------------------
@@ -1101,7 +1102,7 @@ bool DotFilePatcher::run()
}
else // error invalid map id!
{
- err("Found invalid bounding FIG id in file %s!\n",mapId,m_patchFile.data());
+ err("Found invalid bounding FIG %d in file %s!\n",mapId,m_patchFile.data());
t << line;
}
}
@@ -1223,7 +1224,7 @@ DotManager *DotManager::instance()
return m_theInstance;
}
-DotManager::DotManager() : m_dotMaps(1007)
+DotManager::DotManager() : m_dotMaps(1009)
{
m_dotRuns.setAutoDelete(TRUE);
m_dotMaps.setAutoDelete(TRUE);
@@ -2461,8 +2462,12 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
for (cli.toLast();(cd=cli.current());--cli)
{
//printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
- if (cd->getLanguage()==SrcLangExt_VHDL && !(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)
- continue;
+ if (cd->getLanguage()==SrcLangExt_VHDL &&
+ (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS
+ )
+ {
+ continue;
+ }
if (!hasVisibleRoot(cd->baseClasses()) &&
cd->isVisibleInHierarchy()
) // root node in the forest
diff --git a/src/dot.h b/src/dot.h
index 75474ed..6ff89be 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 41fca96..26eda84 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -220,7 +220,7 @@ class Statistics
}
void end()
{
- stats.last()->elapsed=((double)time.elapsed())/1000.0;
+ stats.getLast()->elapsed=((double)time.elapsed())/1000.0;
}
void print()
{
@@ -996,8 +996,9 @@ static Definition *findScope(Entry *root,int level=0)
* full qualified name \a name. Creates an artificial scope if the scope is
* not found and set the parent/child scope relation if the scope is found.
*/
-static Definition *buildScopeFromQualifiedName(const QCString name,int level,SrcLangExt lang)
+static Definition *buildScopeFromQualifiedName(const QCString name,int level,SrcLangExt lang,TagInfo *tagInfo)
{
+ //printf("buildScopeFromQualifiedName(%s) level=%d\n",name.data(),level);
int i=0;
int p=0,l;
Definition *prevScope=Doxygen::globalScope;
@@ -1020,9 +1021,11 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src
else if (nd==0 && cd==0) // scope is not known!
{
// introduce bogus namespace
- //printf("++ adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data());
+ //printf("++ adding dummy namespace %s to %s tagInfo=%p\n",nsName.data(),prevScope->name().data(),tagInfo);
nd=new NamespaceDef(
- "[generated]",1,1,fullScope);
+ "[generated]",1,1,fullScope,
+ tagInfo?tagInfo->tagName:QCString(),
+ tagInfo?tagInfo->fileName:QCString());
nd->setLanguage(lang);
// add namespace to the list
@@ -1109,7 +1112,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
// so use this instead.
QCString fqn = QCString(ui.currentKey())+
scope.right(scope.length()-p);
- resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),startScope->getLanguage());
+ resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),startScope->getLanguage(),0);
//printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope);
if (resultScope)
{
@@ -1295,22 +1298,23 @@ static void addClassToContext(EntryNav *rootNav)
QCString tagName;
QCString refFileName;
- if (rootNav->tagInfo())
+ TagInfo *tagInfo = rootNav->tagInfo();
+ if (tagInfo)
{
- tagName = rootNav->tagInfo()->tagName;
- refFileName = rootNav->tagInfo()->fileName;
+ tagName = tagInfo->tagName;
+ refFileName = tagInfo->fileName;
int i;
if ((i=fullName.find("::"))!=-1)
// symbols imported via tag files may come without the parent scope,
// so we artificially create it here
{
- buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang);
+ buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang,tagInfo);
}
}
cd=new ClassDef(root->fileName,root->startLine,root->startColumn,
fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum);
- Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
- fullName.data(),sec,root->tArgLists ? (int)root->tArgLists->count() : -1);
+ Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d tagInfo=%p\n",
+ fullName.data(),sec,root->tArgLists ? (int)root->tArgLists->count() : -1, tagInfo);
cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
cd->setLanguage(root->lang);
@@ -1443,7 +1447,7 @@ static void resolveClassNestingRelations()
//printf("processing unresolved=%s, iteration=%d\n",cd->name().data(),iteration);
/// create the scope artificially
// anyway, so we can at least relate scopes properly.
- Definition *d = buildScopeFromQualifiedName(name,name.contains("::"),cd->getLanguage());
+ Definition *d = buildScopeFromQualifiedName(name,name.contains("::"),cd->getLanguage(),0);
if (d!=cd && !cd->getDefFileName().isEmpty())
// avoid recursion in case of redundant scopes, i.e: namespace N { class N::C {}; }
// for this case doxygen assumes the exitance of a namespace N::N in which C is to be found!
@@ -1748,13 +1752,16 @@ static void buildNamespaceList(EntryNav *rootNav)
{
QCString tagName;
QCString tagFileName;
- if (rootNav->tagInfo())
+ TagInfo *tagInfo = rootNav->tagInfo();
+ if (tagInfo)
{
- tagName=rootNav->tagInfo()->tagName;
- tagFileName=rootNav->tagInfo()->fileName;
+ tagName = tagInfo->tagName;
+ tagFileName = tagInfo->fileName;
}
- //printf("++ new namespace %s lang=%s\n",fullName.data(),langToString(root->lang).data());
- NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,root->startColumn,fullName,tagName,tagFileName,root->type,root->spec&Entry::Published);
+ //printf("++ new namespace %s lang=%s tagName=%s\n",fullName.data(),langToString(root->lang).data(),tagName.data());
+ NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,
+ root->startColumn,fullName,tagName,tagFileName,
+ root->type,root->spec&Entry::Published);
nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
nd->addSectionsToDefinition(root->anchors);
@@ -1786,7 +1793,7 @@ static void buildNamespaceList(EntryNav *rootNav)
if (d==0) // we didn't find anything, create the scope artificially
// anyway, so we can at least relate scopes properly.
{
- Definition *d = buildScopeFromQualifiedName(fullName,fullName.contains("::"),nd->getLanguage());
+ Definition *d = buildScopeFromQualifiedName(fullName,fullName.contains("::"),nd->getLanguage(),tagInfo);
d->addInnerCompound(nd);
nd->setOuterScope(d);
// TODO: Due to the order in which the tag file is written
@@ -2319,7 +2326,7 @@ static MemberDef *addVariableToClass(
root->fileName,root->startLine,root->startColumn,
root->type,name,root->args,root->exception,
prot,Normal,root->stat,related,
- mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
+ mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0);
md->setTagInfo(rootNav->tagInfo());
md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope())
//md->setDefFile(root->fileName);
@@ -2556,7 +2563,7 @@ static MemberDef *addVariableToFile(
root->fileName,root->startLine,root->startColumn,
root->type,name,root->args,0,
Public, Normal,root->stat,Member,
- mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
+ mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0);
md->setTagInfo(rootNav->tagInfo());
md->setMemberSpecifiers(root->spec);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3245,7 +3252,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
root->stat && root->relatesType != MemberOf,
root->relates.isEmpty() ? Member :
root->relatesType == MemberOf ? Foreign : Related,
- mtype,root->tArgLists ? root->tArgLists->last() : 0,root->argList);
+ mtype,root->tArgLists ? root->tArgLists->getLast() : 0,root->argList);
md->setTagInfo(rootNav->tagInfo());
md->setMemberClass(cd);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3535,9 +3542,9 @@ static void buildFunctionList(EntryNav *rootNav)
)
{
GroupDef *gd=0;
- if (root->groups->first()!=0)
+ if (root->groups->getFirst()!=0)
{
- gd = Doxygen::groupSDict->find(root->groups->first()->groupname.data());
+ gd = Doxygen::groupSDict->find(root->groups->getFirst()->groupname.data());
}
//printf("match!\n");
//printf("mnd=%p rnd=%p nsName=%s rnsName=%s\n",mnd,rnd,nsName.data(),rnsName.data());
@@ -3598,7 +3605,7 @@ static void buildFunctionList(EntryNav *rootNav)
md->enableCallerGraph(md->hasCallerGraph() || root->callerGraph);
// merge ingroup specifiers
- if (md->getGroupDef()==0 && root->groups->first()!=0)
+ if (md->getGroupDef()==0 && root->groups->getFirst()!=0)
{
addMemberToGroups(root,md);
}
@@ -3607,7 +3614,7 @@ static void buildFunctionList(EntryNav *rootNav)
//printf("existing member is grouped, new member not\n");
root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri()));
}
- else if (md->getGroupDef()!=0 && root->groups->first()!=0)
+ else if (md->getGroupDef()!=0 && root->groups->getFirst()!=0)
{
//printf("both members are grouped\n");
}
@@ -3629,7 +3636,7 @@ static void buildFunctionList(EntryNav *rootNav)
// root->type.data(),rname.data(),root->args.data(),root->bodyLine);
// new global function
- ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0;
+ ArgumentList *tArgList = root->tArgLists ? root->tArgLists->getLast() : 0;
QCString name=removeRedundantWhiteSpace(rname);
md=new MemberDef(
root->fileName,root->startLine,root->startColumn,
@@ -5039,8 +5046,9 @@ static void computeTemplateClassRelations()
ArgumentList *templArgs = new ArgumentList;
stringToArgumentList(templSpec,templArgs);
QList<BaseInfo> *baseList=root->extends;
- BaseInfo *bi=baseList->first();
- while (bi) // for each base class of the template
+ QListIterator<BaseInfo> it(*baseList);
+ BaseInfo *bi;
+ for (;(bi=it.current());++it) // for each base class of the template
{
// check if the base class is a template argument
BaseInfo tbi(bi->name,bi->prot,bi->virt);
@@ -5082,7 +5090,6 @@ static void computeTemplateClassRelations()
}
delete actualTemplateNames;
}
- bi=baseList->next();
}
delete templArgs;
} // class has no base classes
@@ -5102,17 +5109,17 @@ static void computeMemberReferences()
for (cli.toFirst();(cd=cli.current());++cli)
{
cd->computeAnchors();
- }
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ }
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
fd->computeAnchors();
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
NamespaceDef *nd=0;
@@ -5143,8 +5150,8 @@ static void addListReferences()
md->visited=FALSE;
}
}
- MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
- for (fnli.toFirst();(mn=fnli.current());++fnli)
+ MemberNameSDict::Iterator fmnli(*Doxygen::functionNameSDict);
+ for (fmnli.toFirst();(mn=fmnli.current());++fmnli)
{
MemberNameIterator mni(*mn);
MemberDef *md=0;
@@ -5159,30 +5166,34 @@ static void addListReferences()
for (cli.toFirst();(cd=cli.current());++cli)
{
cd->addListReferences();
- }
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ }
+
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
fd->addListReferences();
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
+
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
NamespaceDef *nd=0;
for (nli.toFirst();(nd=nli.current());++nli)
{
nd->addListReferences();
}
+
GroupSDict::Iterator gli(*Doxygen::groupSDict);
GroupDef *gd;
for (gli.toFirst();(gd=gli.current());++gli)
{
gd->addListReferences();
}
+
PageSDict::Iterator pdi(*Doxygen::pageSDict);
PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
@@ -5200,6 +5211,7 @@ static void addListReferences()
name,pd->title(),0);
}
}
+
DirSDict::Iterator ddi(*Doxygen::directories);
DirDef *dd = 0;
for (ddi.toFirst();(dd=ddi.current());++ddi)
@@ -5486,7 +5498,7 @@ static bool findGlobalMember(EntryNav *rootNav,
{
//printf("Comparing return types '%s'<->'%s'\n",
// md->typeString(),type);
- if (md->templateArguments()->count()!=root->tArgLists->last()->count() ||
+ if (md->templateArguments()->count()!=root->tArgLists->getLast()->count() ||
qstrcmp(md->typeString(),type)!=0)
{
//printf(" ---> no matching\n");
@@ -5555,6 +5567,15 @@ static bool isSpecialization(
return FALSE;
}
+static bool scopeIsTemplate(Definition *d)
+{
+ bool result=FALSE;
+ if (d && d->definitionType()==Definition::TypeClass)
+ {
+ result = ((ClassDef*)d)->templateArguments() || scopeIsTemplate(d->getOuterScope());
+ }
+ return result;
+}
static QCString substituteTemplatesInString(
const QList<ArgumentList> &srcTempArgLists,
@@ -5579,10 +5600,12 @@ static QCString substituteTemplatesInString(
{
ArgumentListIterator tsali(*srclali.current());
ArgumentListIterator tdali(*dstlali.current());
+ ArgumentListIterator *fali=0;
Argument *tsa =0,*tda=0, *fa=0;
if (funcTempArgList)
{
- fa=funcTempArgList->first();
+ fali = new ArgumentListIterator(*funcTempArgList);
+ fa = fali->current();
}
for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali)
@@ -5615,11 +5638,13 @@ static QCString substituteTemplatesInString(
found=TRUE;
}
}
- if (tda)
- ++tdali;
- else if (fa)
- fa=funcTempArgList->next();
+ if (tda)
+ ++tdali;
+ else if (fali)
+ { ++(*fali); fa=fali->current(); }
}
+
+ delete fali;
//printf(" srcList='%s' dstList='%s faList='%s'\n",
// argListToString(srclali.current()).data(),
// argListToString(dstlali.current()).data(),
@@ -5643,8 +5668,9 @@ static void substituteTemplatesInArgList(
)
{
ArgumentListIterator sali(*src);
+ ArgumentListIterator dali(*dst);
Argument *sa=0;
- Argument *da=dst->first();
+ Argument *da=dali.current();
for (sali.toFirst();(sa=sali.current());++sali) // for each member argument
{
@@ -5666,7 +5692,8 @@ static void substituteTemplatesInArgList(
{
da->type=dstType;
da->type=dstArray;
- da=dst->next();
+ ++dali;
+ da=dali.current();
}
}
dst->constSpecifier = src->constSpecifier;
@@ -5862,7 +5889,7 @@ static void findMember(EntryNav *rootNav,
// this as a normal method of a template class.
if (!(root->tArgLists &&
root->tArgLists->count()>0 &&
- root->tArgLists->first()->count()==0
+ root->tArgLists->getFirst()->count()==0
)
)
{
@@ -5906,10 +5933,10 @@ static void findMember(EntryNav *rootNav,
ClassDef *cd=getClass(scopeName);
if (cd)
{
- if (root->tArgLists) root->tArgLists->first();
if (funcSpec.isEmpty())
{
- tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists);
+ int argListIndex=0;
+ tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists,&argListIndex);
}
else
{
@@ -5918,7 +5945,7 @@ static void findMember(EntryNav *rootNav,
}
//printf("scopeName=%s cd=%p root->tArgLists=%p result=%s\n",
// scopeName.data(),cd,root->tArgLists,tempScopeName.data());
-
+
//printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
// rebuild the function declaration (needed to get the scope right).
if (!scopeName.isEmpty() && !isRelated && !isFriend && !Config_getBool("HIDE_SCOPE_NAMES"))
@@ -6128,20 +6155,22 @@ static void findMember(EntryNav *rootNav,
Debug::print(Debug::FindMembers,0,
"5b. Comparing return types '%s'<->'%s' #args %d<->%d\n",
md->typeString(),funcType.data(),
- md->templateArguments()->count(),root->tArgLists->last()->count());
- if (md->templateArguments()->count()!=root->tArgLists->last()->count() ||
+ md->templateArguments()->count(),root->tArgLists->getLast()->count());
+ if (md->templateArguments()->count()!=root->tArgLists->getLast()->count() ||
qstrcmp(memType,funcType))
{
//printf(" ---> no matching\n");
matching = FALSE;
}
}
- bool classIsTemplate = md->getClassDef() && md->getClassDef()->templateArguments();
+ bool rootIsUserDoc = (root->section&Entry::MEMBERDOC_SEC)!=0;
+ bool classIsTemplate = scopeIsTemplate(md->getClassDef());
bool mdIsTemplate = md->templateArguments()!=0;
bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
bool rootIsTemplate = root->tArgLists!=0;
//printf("classIsTemplate=%d mdIsTemplate=%d rootIsTemplate=%d\n",classIsTemplate,mdIsTemplate,rootIsTemplate);
- if ((mdIsTemplate || rootIsTemplate) && // either md or root is a template
+ if (!rootIsUserDoc && // don't check out-of-line @fn references, see bug722457
+ (mdIsTemplate || rootIsTemplate) && // either md or root is a template
((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
)
{
@@ -6467,11 +6496,12 @@ static void findMember(EntryNav *rootNav,
MemberName *mn = Doxygen::functionNameSDict->find(funcName);
if (mn)
{
- mdDefine = mn->first();
+ MemberNameIterator mni(*mn);
+ mdDefine = mni.current();
while (mdDefine && !isDefine)
{
isDefine = isDefine || mdDefine->isDefine();
- if (!isDefine) mdDefine = mn->next();
+ if (!isDefine) { ++mni; mdDefine=mni.current(); }
}
}
}
@@ -6485,8 +6515,9 @@ static void findMember(EntryNav *rootNav,
}
else
{
- MemberDef *rmd=mn->first();
- while (rmd && newMember) // see if we got another member with matching arguments
+ MemberNameIterator mni(*mn);
+ MemberDef *rmd;
+ while ((rmd=mni.current()) && newMember) // see if we got another member with matching arguments
{
ArgumentList *rmdAl = rmd->argumentList();
@@ -6495,7 +6526,7 @@ static void findMember(EntryNav *rootNav,
!matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
cd,fd,root->argList,
TRUE);
- if (newMember) rmd=mn->next();
+ if (newMember) ++mni;
}
if (!newMember && rmd) // member already exists as rmd -> add docs
{
@@ -6543,7 +6574,7 @@ static void findMember(EntryNav *rootNav,
root->stat && !isMemberOf,
isMemberOf ? Foreign : isRelated ? Related : Member,
mtype,
- (root->tArgLists ? root->tArgLists->last() : 0),
+ (root->tArgLists ? root->tArgLists->getLast() : 0),
funcArgs.isEmpty() ? 0 : root->argList);
if (isDefine && mdDefine)
@@ -6579,8 +6610,9 @@ static void findMember(EntryNav *rootNav,
MemberName *rmn=Doxygen::functionNameSDict->find(funcName);
if (rmn)
{
- MemberDef *rmd=rmn->first();
- while (rmd && !found) // see if we got another member with matching arguments
+ MemberNameIterator rmni(*rmn);
+ MemberDef *rmd;
+ while ((rmd=rmni.current()) && !found) // see if we got another member with matching arguments
{
ArgumentList *rmdAl = rmd->argumentList();
// check for matching argument lists
@@ -6592,7 +6624,7 @@ static void findMember(EntryNav *rootNav,
{
found=TRUE;
}
- if (!found) rmd=rmn->next();
+ if (!found) ++rmni;
}
if (rmd) // member found -> copy line number info
{
@@ -7423,7 +7455,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
md->setRefItems(root->sli);
GroupDef *gd=md->getGroupDef();
- if (gd==0 &&root->groups->first()!=0) // member not grouped but out-of-line documentation is
+ if (gd==0 &&root->groups->getFirst()!=0) // member not grouped but out-of-line documentation is
{
addMemberToGroups(root,md);
}
@@ -7457,7 +7489,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
md->setMemberGroupId(root->mGrpId);
GroupDef *gd=md->getGroupDef();
- if (gd==0 && root->groups->first()!=0) // member not grouped but out-of-line documentation is
+ if (gd==0 && root->groups->getFirst()!=0) // member not grouped but out-of-line documentation is
{
addMemberToGroups(root,md);
}
@@ -7574,11 +7606,12 @@ static void computeMemberRelations()
for ( ; (mn=mnli.current()) ; ++mnli ) // for each member name
{
MemberNameIterator mdi(*mn);
+ MemberNameIterator bmdi(*mn);
MemberDef *md;
+ MemberDef *bmd;
for ( ; (md=mdi.current()) ; ++mdi ) // for each member with a specific name
{
- MemberDef *bmd = mn->first(); // for each other member with the same name
- while (bmd)
+ for ( bmdi.toFirst() ; (bmd=bmdi.current()); ++bmdi ) // for each other member with the same name
{
ClassDef *mcd = md->getClassDef();
if (mcd && mcd->baseClasses())
@@ -7625,10 +7658,9 @@ static void computeMemberRelations()
}
}
}
- bmd = mn->next();
}
}
- }
+ }
}
@@ -8132,16 +8164,16 @@ static void addMembersToMemberGroup()
cd->addMembersToMemberGroup();
}
// for each file
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
{
fd->addMembersToMemberGroup();
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
// for each namespace
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
@@ -8171,16 +8203,16 @@ static void distributeMemberGroupDocumentation()
cd->distributeMemberGroupDocumentation();
}
// for each file
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
{
fd->distributeMemberGroupDocumentation();
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
// for each namespace
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
@@ -8210,16 +8242,16 @@ static void findSectionsInDocumentation()
cd->findSectionsInDocumentation();
}
// for each file
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
{
fd->findSectionsInDocumentation();
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
// for each namespace
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
@@ -8380,17 +8412,16 @@ static void findDefineDocumentation(EntryNav *rootNav)
MemberName *mn=Doxygen::functionNameSDict->find(root->name);
if (mn)
{
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
int count=0;
- MemberDef *md=mn->first();
- while (md)
+ for (;(md=mni.current());++mni)
{
if (md->memberType()==MemberType_Define) count++;
- md=mn->next();
}
if (count==1)
{
- md=mn->first();
- while (md)
+ for (mni.toFirst();(md=mni.current());++mni)
{
if (md->memberType()==MemberType_Define)
{
@@ -8409,20 +8440,18 @@ static void findDefineDocumentation(EntryNav *rootNav)
if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
addMemberToGroups(root,md);
}
- md=mn->next();
}
}
- else if (count>1 &&
- (!root->doc.isEmpty() ||
- !root->brief.isEmpty() ||
+ else if (count>1 &&
+ (!root->doc.isEmpty() ||
+ !root->brief.isEmpty() ||
root->bodyLine!=-1
)
- )
+ )
// multiple defines don't know where to add docs
// but maybe they are in different files together with their documentation
{
- md=mn->first();
- while (md)
+ for (mni.toFirst();(md=mni.current());++mni)
{
if (md->memberType()==MemberType_Define)
{
@@ -8456,7 +8485,6 @@ static void findDefineDocumentation(EntryNav *rootNav)
addMemberToGroups(root,md);
}
}
- md=mn->next();
}
//warn("define %s found in the following files:\n",root->name.data());
//warn("Cannot determine where to add the documentation found "
@@ -8615,15 +8643,30 @@ static void findMainPage(EntryNav *rootNav)
Doxygen::mainPage->setShowToc(root->stat);
addPageToContext(Doxygen::mainPage,rootNav);
- // a page name is a label as well!
- SectionInfo *si=new SectionInfo(
- indexName,
+ SectionInfo *si = Doxygen::sectionDict->find(Doxygen::mainPage->name());
+ if (si)
+ {
+ if (si->lineNr != -1)
+ {
+ warn(root->fileName,root->startLine,"multiple use of section label '%s', (first occurrence: %s, line %d)",Doxygen::mainPage->name().data(),si->fileName.data(),si->lineNr);
+ }
+ else
+ {
+ warn(root->fileName,root->startLine,"multiple use of section label '%s', (first occurrence: %s)",Doxygen::mainPage->name().data(),si->fileName.data());
+ }
+ }
+ else
+ {
+ // a page name is a label as well! but should no be double either
+ si=new SectionInfo(
+ indexName, root->startLine,
Doxygen::mainPage->name(),
Doxygen::mainPage->title(),
SectionInfo::Page,
0); // level 0
- Doxygen::sectionDict->append(indexName,si);
- Doxygen::mainPage->addSectionsToDefinition(root->anchors);
+ Doxygen::sectionDict->append(indexName,si);
+ Doxygen::mainPage->addSectionsToDefinition(root->anchors);
+ }
}
else
{
@@ -9255,16 +9298,15 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
// create a dictionary with files to process
QDict<void> g_filesToProcess(10007);
- QCString *s=g_inputFiles.first();
- while (s)
+ StringListIterator it(g_inputFiles);
+ QCString *s;
+ for (;(s=it.current());++it)
{
g_filesToProcess.insert(*s,(void*)0x8);
- s=g_inputFiles.next();
}
- s=g_inputFiles.first();
// process source files (and their include dependencies)
- while (s)
+ for (it.toFirst();(s=it.current());++it)
{
bool ambig;
FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
@@ -9298,11 +9340,9 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
parser->finishTranslationUnit();
g_processedFiles.insert(*s,(void*)0x8);
}
- s=g_inputFiles.next();
}
// process remaining files
- s=g_inputFiles.first();
- while (s)
+ for (it.toFirst();(s=it.current());++it)
{
if (!g_processedFiles.find(*s)) // not yet processed
{
@@ -9316,14 +9356,14 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
parser->finishTranslationUnit();
g_processedFiles.insert(*s,(void*)0x8);
}
- s=g_inputFiles.next();
}
}
else // normal pocessing
#endif
{
- QCString *s=g_inputFiles.first();
- while (s)
+ StringListIterator it(g_inputFiles);
+ QCString *s;
+ for (;(s=it.current());++it)
{
bool ambig;
QStrList filesInSameTu;
@@ -9332,7 +9372,6 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
ParserInterface * parser = getParserForFile(s->data());
parser->startTranslationUnit(s->data());
parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
- s=g_inputFiles.next();
}
}
}
@@ -9800,7 +9839,7 @@ static void devUsage()
static void usage(const char *name)
{
- msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2013\n\n",versionString);
+ msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2014\n\n",versionString);
msg("You can use doxygen in a number of ways:\n\n");
msg("1) Use doxygen to generate a template configuration file:\n");
msg(" %s [-s] -g [configName]\n\n",name);
@@ -9853,13 +9892,15 @@ void initDoxygen()
initPreprocessor();
Doxygen::parserManager = new ParserManager;
- Doxygen::parserManager->registerParser("c", new CLanguageScanner, TRUE);
- Doxygen::parserManager->registerParser("python", new PythonLanguageScanner);
- Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner);
- Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner);
- Doxygen::parserManager->registerParser("dbusxml", new DBusXMLScanner);
- Doxygen::parserManager->registerParser("tcl", new TclLanguageScanner);
- Doxygen::parserManager->registerParser("md", new MarkdownFileParser);
+ Doxygen::parserManager->registerParser("c", new CLanguageScanner, TRUE);
+ Doxygen::parserManager->registerParser("python", new PythonLanguageScanner);
+ Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner);
+ Doxygen::parserManager->registerParser("fortranfree", new FortranLanguageScannerFree);
+ Doxygen::parserManager->registerParser("fortranfixed", new FortranLanguageScannerFixed);
+ Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner);
+ Doxygen::parserManager->registerParser("dbusxml", new DBusXMLScanner);
+ Doxygen::parserManager->registerParser("tcl", new TclLanguageScanner);
+ Doxygen::parserManager->registerParser("md", new MarkdownFileParser);
// register any additional parsers here...
@@ -10327,7 +10368,7 @@ void readConfiguration(int argc, char **argv)
}
- if (!Config::instance()->parse(configName))
+ if (!Config::instance()->parse(configName,updateConfig))
{
err("could not open or read configuration file %s!\n",configName);
cleanUpDoxygen();
diff --git a/src/doxygen.css b/src/doxygen.css
index 3c981f3..2f4bf70 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -670,12 +670,12 @@ span.mlabel {
/* @end */
-/* these are for tree view when not used as main index */
+/* these are for tree view inside a (index) page */
div.directory {
margin: 10px 0px;
- border-top: 1px solid #A8B8D9;
- border-bottom: 1px solid #A8B8D9;
+ border-top: 1px solid ##AA;
+ border-bottom: 1px solid ##AA;
width: 100%;
}
@@ -734,6 +734,80 @@ div.directory {
color: ##50;
}
+.arrow {
+ color: ##AA;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+}
+
+.icon {
+ font-family: Arial, Helvetica;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ width: 16px;
+ display: inline-block;
+ background-color: ##88;
+ color: white;
+ text-align: center;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+.icona {
+ width: 24px;
+ height: 22px;
+ display: inline-block;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('ftv2folderopen.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('ftv2folderclosed.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('ftv2doc.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+table.directory {
+ font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
div.dynheader {
margin-top: 8px;
-webkit-touch-callout: none;
diff --git a/src/doxygen.h b/src/doxygen.h
index ff9c620..6f766c0 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -65,6 +65,7 @@ class SectionDict;
struct MemberGroupInfo;
typedef QList<QCString> StringList;
+typedef QListIterator<QCString> StringListIterator;
//typedef QDict<FileDef> FileDict;
//typedef QDict<GroupDef> GroupDict;
diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in
index d9589e7..8bca741 100644
--- a/src/doxygen.pro.in
+++ b/src/doxygen.pro.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -28,6 +28,7 @@ win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% -Wl,--as-needed -lole32
win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+DEPENDPATH += ../generated_src/doxygen
INCLUDEPATH += ../qtools ../libmd5 .
DESTDIR = ../bin
TARGET = doxygen
@@ -35,5 +36,5 @@ unix:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
win32:TARGETDEPS = ..\lib\doxygen.lib ..\lib\doxycfg.lib
win32-g++:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
win32-mingw:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
-OBJECTS_DIR = ../objects
+OBJECTS_DIR = ../objects/doxygen
diff --git a/src/doxygen.sty b/src/doxygen.sty
index 199abf8..072104b 100644
--- a/src/doxygen.sty
+++ b/src/doxygen.sty
@@ -450,6 +450,10 @@
\textbf{#1} (\textnormal{#2}\,\pageref{#3})%
}
+% Used by @addindex
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
+
% Used for syntax highlighting
\definecolor{comment}{rgb}{0.5,0.0,0.0}
\definecolor{keyword}{rgb}{0.0,0.5,0.0}
diff --git a/src/dynsections.js b/src/dynsections.js
index ed092c7..85e1836 100644
--- a/src/dynsections.js
+++ b/src/dynsections.js
@@ -24,19 +24,20 @@ function updateStripes()
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}
+
function toggleLevel(level)
{
- $('table.directory tr').each(function(){
+ $('table.directory tr').each(function() {
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
- i.attr('src','ftv2folderopen.png');
- a.attr('src','ftv2mnode.png');
+ i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+ a.html('&#9660;');
$(this).show();
} else if (l==level+1) {
- i.attr('src','ftv2folderclosed.png');
- a.attr('src','ftv2pnode.png');
+ i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+ a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
@@ -47,34 +48,33 @@ function toggleLevel(level)
function toggleFolder(id)
{
- //The clicked row
+ // the clicked row
var currentRow = $('#row_'+id);
- var currentRowImages = currentRow.find("img");
- //All rows after the clicked row
+ // all rows after the clicked row
var rows = currentRow.nextAll("tr");
- //Only match elements AFTER this one (can't hide elements before)
- var childRows = rows.filter(function() {
- var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
- return this.id.match(re);
- });
+ var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
- //First row is visible we are HIDING
- if (childRows.filter(':first').is(':visible')===true) {
- currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
- currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
- rows.filter("[id^=row_"+id+"]").hide();
- } else { //We are SHOWING
- //All sub images
- var childImages = childRows.find("img");
- var childImg = childImages.filter("[id^=img]");
- var childArr = childImages.filter("[id^=arr]");
+ // only match elements AFTER this one (can't hide elements before)
+ var childRows = rows.filter(function() { return this.id.match(re); });
- currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
- currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
- childImg.attr('src','ftv2folderclosed.png'); //children closed
- childArr.attr('src','ftv2pnode.png'); //children closed
+ // first row is visible we are HIDING
+ if (childRows.filter(':first').is(':visible')===true) {
+ // replace down arrow by right arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ currentRowSpans.filter(".arrow").html('&#9658;');
+ rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+ } else { // we are SHOWING
+ // replace right arrow by down arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+ currentRowSpans.filter(".arrow").html('&#9660;');
+ // replace down arrows by right arrows for child rows
+ var childRowsSpans = childRows.find("span");
+ childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();
diff --git a/src/eclipsehelp.cpp b/src/eclipsehelp.cpp
index 213b0fa..6680aeb 100644
--- a/src/eclipsehelp.cpp
+++ b/src/eclipsehelp.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/eclipsehelp.h b/src/eclipsehelp.h
index c21c4ae..f0ab78e 100644
--- a/src/eclipsehelp.h
+++ b/src/eclipsehelp.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/entry.cpp b/src/entry.cpp
index 15263ab..ee3d0ae 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/entry.h b/src/entry.h
index cecd095..a861906 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/example.h b/src/example.h
index 8a2b529..7c86554 100644
--- a/src/example.h
+++ b/src/example.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -38,9 +38,10 @@ class ExampleSDict : public SDict<Example>
public:
ExampleSDict(int size=17) : SDict<Example>(size) {}
~ExampleSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const Example *item1,const Example *item2) const
{
- return qstricmp(((Example *)item1)->name,((Example *)item2)->name);
+ return qstricmp(item1->name,item2->name);
}
};
diff --git a/src/filedef.cpp b/src/filedef.cpp
index e286284..5752e8c 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -170,12 +170,19 @@ void FileDef::findSectionsInDocumentation()
}
}
+bool FileDef::hasDetailedDescription() const
+{
+ static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+ static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
+ return ((!briefDescription().isEmpty() && repeatBrief) ||
+ !documentation().stripWhiteSpace().isEmpty() || // avail empty section
+ (sourceBrowser && getStartBodyLine()!=-1 && getBodyDef())
+ );
+}
+
void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
{
- if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
- !documentation().stripWhiteSpace().isEmpty() || // avail empty section
- (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef())
- )
+ if (hasDetailedDescription())
{
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
@@ -203,6 +210,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
// ol.newParagraph(); // FIXME:PARA
ol.enableAll();
ol.disableAllBut(OutputGenerator::Man);
+ ol.enable(OutputGenerator::Latex);
ol.writeString("\n\n");
ol.popGeneratorState();
}
@@ -379,7 +387,7 @@ void FileDef::writeIncludedByGraph(OutputList &ol)
{
warn_uncond("Included by graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
}
- if (!incDepGraph.isTrivial())
+ else if (!incDepGraph.isTrivial())
{
ol.startTextBlock();
ol.disable(OutputGenerator::Man);
@@ -772,7 +780,7 @@ void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
MemberDef *md;
for (mli.toFirst();(md=mli.current());++mli)
{
- if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable())
+ if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable() && !md->isEnumValue())
{
ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
@@ -830,9 +838,9 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
getDirDef()->writeNavigationPath(ol);
ol.endQuickIndices();
}
- startTitle(ol,getOutputFileBase());
+ startTitle(ol,getSourceFileBase());
ol.parseText(name());
- endTitle(ol,getOutputFileBase(),title);
+ endTitle(ol,getSourceFileBase(),title);
}
else
{
@@ -1402,7 +1410,7 @@ static Directory *findDirNode(Directory *root,const QCString &name)
// add new branch to the root
if (!root->children().isEmpty())
{
- root->children().last()->setLast(FALSE);
+ root->children().getLast()->setLast(FALSE);
}
root->addChild(base);
return newBranch;
@@ -1422,7 +1430,7 @@ static Directory *findDirNode(Directory *root,const QCString &name)
Directory *newBranch = new Directory(root,baseName);
if (!root->children().isEmpty())
{
- root->children().last()->setLast(FALSE);
+ root->children().getLast()->setLast(FALSE);
}
root->addChild(newBranch);
return newBranch;
@@ -1437,7 +1445,7 @@ static void mergeFileDef(Directory *root,FileDef *fd)
Directory *dirNode = findDirNode(root,filePath);
if (!dirNode->children().isEmpty())
{
- dirNode->children().last()->setLast(FALSE);
+ dirNode->children().getLast()->setLast(FALSE);
}
DirEntry *e=new DirEntry(dirNode,fd);
dirNode->addChild(e);
@@ -1715,25 +1723,24 @@ void FileDef::addMemberToList(MemberListType lt,MemberDef *md)
void FileDef::sortMemberLists()
{
- MemberList *ml = m_memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
- ml = m_memberLists.next();
}
}
MemberList *FileDef::getMemberList(MemberListType lt) const
{
- FileDef *that = (FileDef*)this;
- MemberList *ml = that->m_memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
if (ml->listType()==lt)
{
return ml;
}
- ml = that->m_memberLists.next();
}
return 0;
}
@@ -1800,3 +1807,7 @@ QCString FileDef::title() const
return theTranslator->trFileReference(name());
}
+QCString FileDef::fileVersion() const
+{
+ return m_fileVersion;
+}
diff --git a/src/filedef.h b/src/filedef.h
index d1d7496..a95cd77 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -133,6 +133,10 @@ class FileDef : public Definition
ClassSDict *getClassSDict() const { return m_classSDict; }
QCString title() const;
+ bool hasDetailedDescription() const;
+ QCString fileVersion() const;
+
+ bool subGrouping() const { return m_subGrouping; }
//---------------------------------
@@ -237,13 +241,11 @@ class FileList : public QList<FileDef>
FileList(const char *path) : QList<FileDef>(), m_pathName(path) {}
~FileList() {}
QCString path() const { return m_pathName; }
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const FileDef *md1,const FileDef *md2) const
{
- FileDef *md1 = (FileDef *)item1;
- FileDef *md2 = (FileDef *)item2;
return qstricmp(md1->name(),md2->name());
}
- private:
QCString m_pathName;
};
@@ -252,10 +254,9 @@ class OutputNameList : public QList<FileList>
public:
OutputNameList() : QList<FileList>() {}
~OutputNameList() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const FileList *fl1,const FileList *fl2) const
{
- FileList *fl1 = (FileList *)item1;
- FileList *fl2 = (FileList *)item2;
return qstricmp(fl1->path(),fl2->path());
}
};
diff --git a/src/filename.cpp b/src/filename.cpp
index da0dccc..35a1841 100644
--- a/src/filename.cpp
+++ b/src/filename.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -34,18 +34,17 @@ FileName::~FileName()
void FileName::generateDiskNames()
{
//QCString commonPrefix;
- FileDef *fd=first();
+ QListIterator<FileDef> it(*this);
+ FileDef *fd;
int count=0;
- while (fd)
- {
- if (!fd->isReference()) count++;
- fd=next();
+ for (;(fd=it.current());++it)
+ {
+ if (!fd->isReference()) count++;
}
if (count==1)
{
- fd=first();
// skip references
- while (fd && fd->isReference()) fd=next();
+ for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
// name if unique, so diskname is simply the name
//printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
fd->m_diskName=name;
@@ -57,12 +56,11 @@ void FileName::generateDiskNames()
bool found=FALSE;
while (!found) // search for the common prefix of all paths
{
- fd=first();
- while (fd && fd->isReference()) fd=next();
+ for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
char c=fd->m_path.at(i);
if (c=='/') j=i; // remember last position of dirname
- fd=next();
- while (fd && !found)
+ ++it;
+ while ((fd=it.current()) && !found)
{
if (!fd->isReference())
{
@@ -75,15 +73,14 @@ void FileName::generateDiskNames()
}
else if (fd->m_path[i]!=c)
{
- found=TRUE;
+ found=TRUE;
}
- }
- fd=next();
+ }
+ ++it;
}
i++;
}
- fd=first();
- while (fd)
+ for (it.toFirst();(fd=it.current());++it)
{
//printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
if (!fd->isReference())
@@ -93,15 +90,12 @@ void FileName::generateDiskNames()
//printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
fd->m_diskName=prefix+name;
}
- fd=next();
}
}
}
-int FileName::compareItems(QCollection::Item item1, QCollection::Item item2)
+int FileName::compareValues(const FileDef *f1, const FileDef *f2) const
{
- FileName *f1=(FileName *)item1;
- FileName *f2=(FileName *)item2;
return qstricmp(f1->fileName(),f2->fileName());
}
@@ -120,20 +114,16 @@ FileNameList::~FileNameList()
void FileNameList::generateDiskNames()
{
- FileName *fn=first();
- while (fn)
+ FileNameListIterator it(*this);
+ FileName *fn;
+ for (;(fn=it.current());++it)
{
fn->generateDiskNames();
- fn=next();
}
}
-int FileNameList::compareItems(QCollection::Item item1, QCollection::Item item2)
+int FileNameList::compareValues(const FileName *f1, const FileName *f2) const
{
- FileName *f1=(FileName *)item1;
- FileName *f2=(FileName *)item2;
- //printf("FileNameList::compareItems `%s'<->`%s'\n",
- // f1->fileName(),f2->fileName());
return Config_getBool("FULL_PATH_NAMES") ?
qstricmp(f1->fullName(),f2->fullName()) :
qstricmp(f1->fileName(),f2->fileName());
diff --git a/src/filename.h b/src/filename.h
index 1cd160c..ac7b164 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -24,16 +24,16 @@
/** Class representing all files with a certain base name */
class FileName : public FileList
-{
+{
public:
FileName(const char *fn,const char *name);
~FileName();
const char *fileName() const { return name; }
const char *fullName() const { return fName; }
void generateDiskNames();
- int compareItems(QCollection::Item item1,QCollection::Item item2);
private:
+ int compareValues(const FileDef *item1,const FileDef *item2) const;
QCString name;
QCString fName;
};
@@ -52,7 +52,8 @@ class FileNameList : public QList<FileName>
FileNameList();
~FileNameList();
void generateDiskNames();
- int compareItems(QCollection::Item item1,QCollection::Item item2);
+ private:
+ int compareValues(const FileName *item1,const FileName *item2) const;
};
/** Iterator for FileName objects in a FileNameList. */
diff --git a/src/filestorage.h b/src/filestorage.h
index a6ee5b4..0d72923 100644
--- a/src/filestorage.h
+++ b/src/filestorage.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/formula.cpp b/src/formula.cpp
index 0d3c4cd..9e835e1 100644
--- a/src/formula.cpp
+++ b/src/formula.cpp
@@ -1,7 +1,7 @@
/******************************************************************************
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/formula.h b/src/formula.h
index 79821bf..47f7d4b 100644
--- a/src/formula.h
+++ b/src/formula.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/fortrancode.h b/src/fortrancode.h
index 3913ebb..b64ede7 100644
--- a/src/fortrancode.h
+++ b/src/fortrancode.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -15,8 +15,10 @@
*
*/
-#ifndef CODE_H
-#define CODE_H
+#ifndef FORTRANCODE_H
+#define FORTRANCODE_H
+
+#include "types.h"
class CodeOutputInterface;
class FileDef;
@@ -28,7 +30,7 @@ void parseFortranCode(CodeOutputInterface &,const char *,const QCString &,
bool ,const char *,FileDef *fd,
int startLine,int endLine,bool inlineFragment,
MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx,
- bool collectRefs);
+ bool collectRefs, FortranFormat format);
void resetFortranCodeParserState();
void codeFreeScanner();
diff --git a/src/fortrancode.l b/src/fortrancode.l
index 8ee825b..c31080b 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -154,12 +154,14 @@ static int bracketCount = 0;
// simplified way to know if this is fixed form
// duplicate in fortranscanner.l
-static bool recognizeFixedForm(const char* contents)
+static bool recognizeFixedForm(const char* contents, FortranFormat format)
{
int column=0;
bool skipLine=FALSE;
- for (int i=0;;i++)
+ if (format == FortranFormat_Fixed) return TRUE;
+ if (format == FortranFormat_Free) return FALSE;
+ for (int i=0;;i++)
{
column++;
@@ -437,9 +439,11 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam
if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */
// look in local variables
- for (Scope *scope=scopeStack.last(); scope!=NULL; scope=scopeStack.prev())
+ QListIterator<Scope> it(scopeStack);
+ Scope *scope;
+ for (it.toLast();(scope=it.current());--it)
{
- if(scope->localVars.find(memberName))
+ if (scope->localVars.find(memberName))
return FALSE;
}
@@ -636,13 +640,13 @@ static void endScope()
static void addUse(const QCString &moduleName)
{
if (!scopeStack.isEmpty())
- scopeStack.last()->useNames.append(moduleName);
+ scopeStack.getLast()->useNames.append(moduleName);
}
static void addLocalVar(const QCString &varName)
{
if (!scopeStack.isEmpty())
- scopeStack.last()->localVars.insert(varName, (void*)1);
+ scopeStack.getLast()->localVars.insert(varName, (void*)1);
}
//----------------------------------------------------------------------------
@@ -681,14 +685,14 @@ NUM_TYPE (complex|integer|logical|real)
LOG_OPER (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.)
KIND {ARGS}
CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
-TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR})
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR})
INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|IMPURE|ELEMENTAL)
ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC)
/* Assume that attribute statements are almost the same as attributes. */
ATTR_STMT {ATTR_SPEC}|DIMENSION
-FLOW (DO|SELECT|CASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT)
+FLOW (DO|SELECT|CASE|SELECTCASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT)
COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|DEALLOCATE|SIZE|INQUIRE|OPEN|CLOSE|DATA|COMMON)
IGNORE (CALL)
PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|IMPURE|PURE|ELEMENTAL)?
@@ -1106,7 +1110,7 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri
bool exBlock, const char *exName,FileDef *fd,
int startLine,int endLine,bool inlineFragment,
MemberDef *memberDef,bool,Definition *searchCtx,
- bool collectXRefs)
+ bool collectXRefs, FortranFormat format)
{
//printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
@@ -1120,7 +1124,7 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri
g_code = &od;
g_inputString = s;
g_inputPosition = 0;
- g_isFixedForm = recognizeFixedForm((const char*)s);
+ g_isFixedForm = recognizeFixedForm((const char*)s,format);
g_currentFontClass = 0;
g_needsTermination = FALSE;
g_searchCtx = searchCtx;
diff --git a/src/fortranscanner.h b/src/fortranscanner.h
index 41f7790..92a8669 100644
--- a/src/fortranscanner.h
+++ b/src/fortranscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -27,6 +27,7 @@
class FortranLanguageScanner : public ParserInterface
{
public:
+ FortranLanguageScanner(FortranFormat format=FortranFormat_Unknown) : m_format(format) { }
virtual ~FortranLanguageScanner() {}
void startTranslationUnit(const char *) {}
void finishTranslationUnit() {}
@@ -53,6 +54,21 @@ class FortranLanguageScanner : public ParserInterface
);
void resetCodeParserState();
void parsePrototype(const char *text);
+
+ private:
+ FortranFormat m_format;
+};
+
+class FortranLanguageScannerFree : public FortranLanguageScanner
+{
+ public:
+ FortranLanguageScannerFree() : FortranLanguageScanner(FortranFormat_Free) { }
+};
+
+class FortranLanguageScannerFixed : public FortranLanguageScanner
+{
+ public:
+ FortranLanguageScannerFixed() : FortranLanguageScanner(FortranFormat_Fixed) { }
};
#endif
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index 4cdea23..f6616ad 100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -187,7 +187,7 @@ static InterfaceType ifType = IF_NONE;
static bool functionLine = FALSE;
static char stringStartSymbol; // single or double quote
-static bool parsingPrototype = FALSE; // see parsePrototype()
+static bool parsingPrototype = FALSE; // see parsePrototype()
//! Accumulated modifiers of current statement, eg variable declaration.
static SymbolModifiers currentModifiers;
@@ -255,7 +255,7 @@ NUM_TYPE (complex|integer|logical|real)
LOG_OPER (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.)
KIND {ARGS}
CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
-TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?)
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?)
INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE)
@@ -567,7 +567,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
/*------- type definition -------------------------------------------------------------------------------*/
-<Start,ModuleBody>^{BS}type/[^a-z0-9] {
+<Start,ModuleBody>^{BS}type/[^a-z0-9_] {
if(YY_START == Start)
{
addModule(NULL);
@@ -1313,11 +1313,14 @@ void truncatePrepass(int index)
// simplified way to know if this is fixed form
// duplicate in fortrancode.l
-static bool recognizeFixedForm(const char* contents)
+static bool recognizeFixedForm(const char* contents, FortranFormat format)
{
int column=0;
bool skipLine=FALSE;
+ if (format == FortranFormat_Fixed) return TRUE;
+ if (format == FortranFormat_Free) return FALSE;
+
for(int i=0;;i++) {
column++;
@@ -2126,7 +2129,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
int lineNr = brief ? current->briefLine : current->docLine;
while (parseCommentBlock(
g_thisParser,
- docBlockInBody ? subrCurrent.first() : current,
+ docBlockInBody ? subrCurrent.getFirst() : current,
doc, // text
yyFileName, // file
lineNr,
@@ -2153,7 +2156,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief)
{
QCString loc_doc;
Entry *tmp_entry = current;
- current = subrCurrent.first(); // temporarily switch to the entry of the subroutine / function
+ current = subrCurrent.getFirst(); // temporarily switch to the entry of the subroutine / function
// Still in the specification section so no inbodyDocs yet, but parameter documentation
current->inbodyDocs = "";
@@ -2243,7 +2246,7 @@ level--;
#endif
-static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt, FortranFormat format)
{
char *tmpBuf = NULL;
initParser();
@@ -2263,7 +2266,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
inputFile.setName(fileName);
if (inputFile.open(IO_ReadOnly))
{
- isFixedForm = recognizeFixedForm(fileBuf);
+ isFixedForm = recognizeFixedForm(fileBuf,format);
if (isFixedForm)
{
@@ -2342,7 +2345,7 @@ void FortranLanguageScanner::parseInput(const char *fileName,
printlex(yy_flex_debug, TRUE, __FILE__, fileName);
- ::parseMain(fileName,fileBuf,root);
+ ::parseMain(fileName,fileBuf,root,m_format);
printlex(yy_flex_debug, FALSE, __FILE__, fileName);
}
@@ -2365,7 +2368,7 @@ void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
{
::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
fileDef,startLine,endLine,inlineFragment,memberDef,
- showLineNumbers,searchCtx,collectXRefs);
+ showLineNumbers,searchCtx,collectXRefs,m_format);
}
bool FortranLanguageScanner::needsPreprocessing(const QCString &extension)
diff --git a/src/ftextstream.cpp b/src/ftextstream.cpp
index f72185f..3038af3 100644
--- a/src/ftextstream.cpp
+++ b/src/ftextstream.cpp
@@ -165,6 +165,7 @@ FTextStream::FTextStream( FILE *fh )
{
m_dev = new QFile;
((QFile *)m_dev)->open( IO_WriteOnly, fh);
+ m_owndev = TRUE;
}
FTextStream::~FTextStream()
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index 11d3b1d..4613a92 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -1,7 +1,7 @@
/******************************************************************************
* ftvhelp.cpp,v 1.0 2000/09/06 16:09:00
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -234,6 +234,7 @@ static unsigned char doc_a_png[528] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
+#if 0
static unsigned char module_png[528] =
{
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
@@ -338,6 +339,7 @@ static unsigned char letter_a_png[528] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
+#endif
static unsigned char arrow_right_png[352] =
@@ -507,6 +509,7 @@ struct FTVImageInfo
//extern FTVImageInfo image_info[];
+#if 0
#define FTVIMG_blank 0
#define FTVIMG_doc 1
#define FTVIMG_folderclosed 2
@@ -553,6 +556,7 @@ static FTVImageInfo image_info[] =
{ "M", "ftv2mo.png", 0 /*ftv2vertline_png*/ /*,352*/,24,22 },
{ 0, 0, 0 /*, 0*/, 0, 0 }
};
+#endif
static ColoredImgDataItem ftv_image_data[] =
{
@@ -560,9 +564,9 @@ static ColoredImgDataItem ftv_image_data[] =
{ "ftv2doc.png", 24, 22, doc_png, doc_a_png },
{ "ftv2folderclosed.png", 24, 22, folderclosed_png, folderclosed_a_png },
{ "ftv2folderopen.png", 24, 22, folderopen_png, folderopen_a_png },
- { "ftv2ns.png", 24, 22, namespace_png, letter_a_png },
- { "ftv2mo.png", 24, 22, module_png, letter_a_png },
- { "ftv2cl.png", 24, 22, class_png, letter_a_png },
+// { "ftv2ns.png", 24, 22, namespace_png, letter_a_png },
+// { "ftv2mo.png", 24, 22, module_png, letter_a_png },
+// { "ftv2cl.png", 24, 22, class_png, letter_a_png },
{ "ftv2lastnode.png", 16, 22, blank_png, blank_png },
{ "ftv2link.png", 24, 22, doc_png, doc_a_png },
{ "ftv2mlastnode.png", 16, 22, arrow_down_png, arrow_down_a_png },
@@ -780,68 +784,27 @@ QCString FTVHelp::generateIndentLabel(FTVNode *n,int level)
{
result=generateIndentLabel(n->parent,level+1);
}
- result+=QCString().sprintf("%d_",n->index);
+ result+=QCString().setNum(n->index)+"_";
return result;
}
-void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,int level, bool opened)
+void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,bool opened)
{
- if (n->parent)
+ int indent=0;
+ FTVNode *p = n->parent;
+ while (p) { indent++; p=p->parent; }
+ if (n->isDir)
{
- generateIndent(t,n->parent,level+1,opened);
+ QCString dir = opened ? "&#9660;" : "&#9658;";
+ t << "<span style=\"width:" << (indent*16) << "px;display:inline-block;\">&#160;</span>"
+ << "<span id=\"arr_" << generateIndentLabel(n,0) << "\" class=\"arrow\" ";
+ t << "onclick=\"toggleFolder('" << generateIndentLabel(n,0) << "')\"";
+ t << ">" << dir
+ << "</span>";
}
- // from the root up to node n do...
- if (level==0) // item before a dir or document
+ else
{
- if (n->isLast)
- {
- if (n->isDir)
- {
- t << "<img id=\"arr_" << generateIndentLabel(n,0)
- << "\" ";
- if (opened)
- t << FTV_IMGATTRIBS(mlastnode);
- else
- t << FTV_IMGATTRIBS(plastnode);
- t << "onclick=\"toggleFolder('"
- << generateIndentLabel(n,0)
- << "')\"/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(lastnode) << "/>";
- }
- }
- else
- {
- if (n->isDir)
- {
- t << "<img id=\"arr_" << generateIndentLabel(n,0)
- << "\" ";
- if (opened)
- t << FTV_IMGATTRIBS(mnode);
- else
- t << FTV_IMGATTRIBS(pnode);
- t << "onclick=\"toggleFolder('"
- << generateIndentLabel(n,0)
- << "')\"/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(node) << "/>";
- }
- }
- }
- else // item at another level
- {
- if (n->isLast)
- {
- t << "<img " << FTV_IMGATTRIBS(blank) << "/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(vertline) << "/>";
- }
+ t << "<span style=\"width:" << ((indent+1)*16) << "px;display:inline-block;\">&#160;</span>";
}
}
@@ -912,7 +875,7 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
index++;
t << "><td class=\"entry\">";
bool nodeOpened = level+1<maxLevel;
- generateIndent(t,n,0,nodeOpened);
+ generateIndent(t,n,nodeOpened);
if (n->isDir)
{
if (n->def && n->def->definitionType()==Definition::TypeGroup)
@@ -925,29 +888,19 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
}
else if (n->def && n->def->definitionType()==Definition::TypeNamespace)
{
- t << "<img ";
- t << FTV_IMGATTRIBS(ns);
- t << "/>";
+ t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
}
else if (n->def && n->def->definitionType()==Definition::TypeClass)
{
- t << "<img ";
- t << FTV_IMGATTRIBS(cl);
- t << "/>";
+ t << "<span class=\"icona\"><span class=\"icon\">C</span></span>";
}
else
{
- t << "<img ";
- t << "id=\"img_" << generateIndentLabel(n,0)
- << "\" ";
- if (nodeOpened)
- t << FTV_IMGATTRIBS(folderopen);
- else
- t << FTV_IMGATTRIBS(folderclosed);
- t << "onclick=\"toggleFolder('"
- << generateIndentLabel(n,0)
- << "')\"";
- t << "/>";
+ t << "<span id=\"img_" << generateIndentLabel(n,0)
+ << "\" class=\"iconf"
+ << (nodeOpened?"open":"closed")
+ << "\" onclick=\"toggleFolder('" << generateIndentLabel(n,0)
+ << "')\">&#160;</span>";
}
generateLink(t,n);
t << "</td><td class=\"desc\">";
@@ -983,21 +936,15 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
}
else if (n->def && n->def->definitionType()==Definition::TypeNamespace)
{
- t << "<img ";
- t << FTV_IMGATTRIBS(ns);
- t << "/>";
+ t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
}
else if (n->def && n->def->definitionType()==Definition::TypeClass)
{
- t << "<img ";
- t << FTV_IMGATTRIBS(cl);
- t << "/>";
+ t << "<span class=\"icona\"><span class=\"icon\">C</span></span>";
}
else
{
- t << "<img ";
- t << FTV_IMGATTRIBS(doc);
- t << "/>";
+ t << "<span class=\"icondoc\"></span>";
}
if (srcRef)
{
@@ -1023,15 +970,16 @@ struct NavIndexEntry
QCString path;
};
-class NavIndexEntryList : public QList<NavIndexEntry>
+class NavIndexEntryList : public QList<NavIndexEntry>
{
public:
NavIndexEntryList() : QList<NavIndexEntry>() { setAutoDelete(TRUE); }
~NavIndexEntryList() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const NavIndexEntry *item1,const NavIndexEntry *item2) const
{
// sort list based on url
- return qstrcmp(((NavIndexEntry*)item1)->url,((NavIndexEntry*)item2)->url);
+ return qstrcmp(item1->url,item2->url);
}
};
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
index 9794d8b..bddb2f0 100644
--- a/src/ftvhelp.h
+++ b/src/ftvhelp.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -64,7 +64,7 @@ class FTVHelp : public IndexIntf
//bool generateJSTree(FTextStream &tidx,FTextStream &t,const QList<FTVNode> &nl,int level,bool &first);
//bool generateJSTreeTopLevel(FTextStream &tidx,FTextStream &t,const QList<FTVNode> &nl,int level,bool &first);
QCString generateIndentLabel(FTVNode *n,int level);
- void generateIndent(FTextStream &t,FTVNode *n,int level,bool opened);
+ void generateIndent(FTextStream &t,FTVNode *n,bool opened);
void generateLink(FTextStream &t,FTVNode *n);
//void generateJSLink(FTextStream &t,FTVNode *n);
QList<FTVNode> *m_indentNodes;
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 9426c24..85bfb8f 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -581,6 +581,7 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
// ol.newParagraph(); // FIXME:PARA
ol.enableAll();
ol.disableAllBut(OutputGenerator::Man);
+ ol.enable(OutputGenerator::Latex);
ol.writeString("\n\n");
ol.popGeneratorState();
}
@@ -659,8 +660,9 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title)
ol.parseText(title);
ol.endMemberHeader();
ol.startMemberList();
- FileDef *fd=fileList->first();
- while (fd)
+ QListIterator<FileDef> it(*fileList);
+ FileDef *fd;
+ for (;(fd=it.current());++it)
{
ol.startMemberDeclaration();
ol.startMemberItem(fd->getOutputFileBase(),0);
@@ -679,7 +681,6 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title)
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
- fd=fileList->next();
}
ol.endMemberList();
}
@@ -697,11 +698,11 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
int count=0;
if (groupList->count()>0)
{
- GroupDef *gd=groupList->first();
- while (gd)
+ QListIterator<GroupDef> it(*groupList);
+ GroupDef *gd;
+ for (;(gd=it.current());++it)
{
if (gd->isVisible()) count++;
- gd=groupList->next();
}
}
if (count>0)
@@ -714,8 +715,9 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
{
groupList->sort();
}
- GroupDef *gd=groupList->first();
- while (gd)
+ QListIterator<GroupDef> it(*groupList);
+ GroupDef *gd;
+ for (;(gd=it.current());++it)
{
if (gd->isVisible())
{
@@ -738,7 +740,6 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
}
ol.endMemberDeclaration(0,0);
}
- gd=groupList->next();
}
ol.endMemberList();
}
@@ -753,8 +754,9 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title)
ol.parseText(title);
ol.endMemberHeader();
ol.startMemberList();
- DirDef *dd=dirList->first();
- while (dd)
+ QListIterator<DirDef> it(*dirList);
+ DirDef *dd;
+ for (;(dd=it.current());++it)
{
ol.startMemberDeclaration();
ol.startMemberItem(dd->getOutputFileBase(),0);
@@ -773,7 +775,6 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title)
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
- dd=dirList->next();
}
ol.endMemberList();
@@ -1133,7 +1134,7 @@ void GroupDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
MemberDef *md;
for (mli.toFirst();(md=mli.current());++mli)
{
- if (md->getGroupDef()==this && md->isLinkable())
+ if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
{
ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
@@ -1436,26 +1437,24 @@ void GroupDef::addMemberToList(MemberListType lt,MemberDef *md)
void GroupDef::sortMemberLists()
{
- MemberList *ml = m_memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
- ml = m_memberLists.next();
}
}
-
MemberList *GroupDef::getMemberList(MemberListType lt) const
{
- GroupDef *that = (GroupDef*)this;
- MemberList *ml = that->m_memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (;(ml=mli.current());++mli)
{
if (ml->listType()==lt)
{
return ml;
}
- ml = that->m_memberLists.next();
}
return 0;
}
diff --git a/src/groupdef.h b/src/groupdef.h
index bd53ff5..481bece 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -159,9 +159,10 @@ class GroupSDict : public SDict<GroupDef>
public:
GroupSDict(uint size) : SDict<GroupDef>(size) {}
virtual ~GroupSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const GroupDef *item1,const GroupDef *item2) const
{
- return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+ return qstrcmp(item1->groupTitle(),item2->groupTitle());
}
};
@@ -169,9 +170,9 @@ class GroupSDict : public SDict<GroupDef>
class GroupList : public QList<GroupDef>
{
public:
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ int compareValues(const GroupDef *item1,const GroupDef *item2) const
{
- return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+ return qstrcmp(item1->groupTitle(),item2->groupTitle());
}
};
diff --git a/src/htags.cpp b/src/htags.cpp
index 5f0c71a..1e18ae1 100644
--- a/src/htags.cpp
+++ b/src/htags.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/htags.h b/src/htags.h
index 474b098..5173b2b 100644
--- a/src/htags.h
+++ b/src/htags.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/htmlattrib.h b/src/htmlattrib.h
index 203fb48..e7fd204 100644
--- a/src/htmlattrib.h
+++ b/src/htmlattrib.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -40,33 +40,31 @@ class HtmlAttribList : public QList<HtmlAttrib>
{ clear(); QList<HtmlAttrib>::operator=(l); return *this; }
QCString find(const QCString name) const
{
- HtmlAttribList *that = (HtmlAttribList *)this;
+ QListIterator<HtmlAttrib> it(*this);
QCString result;
- HtmlAttrib *attr=that->first();
- while (attr)
+ HtmlAttrib *attr;
+ for (;(attr=it.current());++it)
{
if (attr->name==name) return attr->value;
- attr=that->next();
}
return result;
}
QCString toString() const
{
- HtmlAttribList *that = (HtmlAttribList *)this;
+ QListIterator<HtmlAttrib> it(*this);
QCString result;
- HtmlAttrib *attr=that->first();
- while (attr)
+ HtmlAttrib *attr;
+ for (;(attr=it.current());++it)
{
result+=" "+attr->name+"=\""+attr->value+"\"";
- attr=that->next();
}
return result;
}
private:
- QCollection::Item newItem( QCollection::Item d )
- { return (QCollection::Item)new HtmlAttrib(*(HtmlAttrib *)d); }
- void deleteItem(QCollection::Item d)
- { delete (HtmlAttrib *)d; }
+ HtmlAttrib *newValue( HtmlAttrib *v ) const
+ { return new HtmlAttrib(*v); }
+ void deleteValue(HtmlAttrib *v) const
+ { delete v; }
};
/*! @brief Html attribute list iterator */
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 6ccbda4..c70f2c5 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,6 +33,7 @@
#include "vhdldocgen.h"
#include "filedef.h"
#include "memberdef.h"
+#include "htmlentity.h"
static const int NUM_HTML_LIST_TYPES = 4;
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
@@ -43,27 +44,30 @@ static QCString convertIndexWordToAnchor(const QString &word)
QCString result;
const char *str = word.data();
unsigned char c;
- while ((c = *str++))
- {
- if ((c >= 'a' && c <= 'z') || // ALPHA
- (c >= 'A' && c <= 'A') || // ALPHA
- (c >= '0' && c <= '9') || // DIGIT
- c == '-' ||
- c == '.' ||
- c == '_' ||
- c == '~'
- )
- {
- result += c;
- }
- else
+ if (str)
+ {
+ while ((c = *str++))
{
- char enc[4];
- enc[0] = '%';
- enc[1] = hex[(c & 0xf0) >> 4];
- enc[2] = hex[c & 0xf];
- enc[3] = 0;
- result += enc;
+ if ((c >= 'a' && c <= 'z') || // ALPHA
+ (c >= 'A' && c <= 'A') || // ALPHA
+ (c >= '0' && c <= '9') || // DIGIT
+ c == '-' ||
+ c == '.' ||
+ c == '_' ||
+ c == '~'
+ )
+ {
+ result += c;
+ }
+ else
+ {
+ char enc[4];
+ enc[0] = '%';
+ enc[1] = hex[(c & 0xf0) >> 4];
+ enc[2] = hex[c & 0xf];
+ enc[3] = 0;
+ result += enc;
+ }
}
}
return result;
@@ -91,7 +95,6 @@ static bool mustBeOutsideParagraph(DocNode *n)
case DocNode::Kind_Internal:
/* <div> */
case DocNode::Kind_Include:
- case DocNode::Kind_Verbatim:
case DocNode::Kind_Image:
case DocNode::Kind_SecRefList:
/* <hr> */
@@ -106,6 +109,11 @@ static bool mustBeOutsideParagraph(DocNode *n)
/* \parblock */
case DocNode::Kind_ParBlock:
return TRUE;
+ case DocNode::Kind_Verbatim:
+ {
+ DocVerbatim *dv = (DocVerbatim*)n;
+ return dv->type()!=DocVerbatim::HtmlOnly || dv->isBlock();
+ }
case DocNode::Kind_StyleChange:
return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted ||
((DocStyleChange*)n)->style()==DocStyleChange::Div ||
@@ -182,110 +190,14 @@ void HtmlDocVisitor::visit(DocWhiteSpace *w)
void HtmlDocVisitor::visit(DocSymbol *s)
{
if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "&lt;"; break;
- case DocSymbol::Greater: m_t << "&gt;"; break;
- case DocSymbol::Amp: m_t << "&amp;"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::DoubleColon: m_t << "::"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Pipe: m_t << "|"; break;
- case DocSymbol::Copy: m_t << "&copy;"; break;
- case DocSymbol::Tm: m_t << "&trade;"; break;
- case DocSymbol::Reg: m_t << "&reg;"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Lsquo: m_t << "&lsquo;"; break;
- case DocSymbol::Rsquo: m_t << "&rsquo;"; break;
- case DocSymbol::Ldquo: m_t << "&ldquo;"; break;
- case DocSymbol::Rdquo: m_t << "&rdquo;"; break;
- case DocSymbol::Ndash: m_t << "&ndash;"; break;
- case DocSymbol::Mdash: m_t << "&mdash;"; break;
- case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break;
- case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break;
- case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break;
- case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break;
- case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break;
- case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break;
- case DocSymbol::Szlig: m_t << "&szlig;"; break;
- case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break;
- case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break;
- case DocSymbol::Nbsp: m_t << "&#160;"; break;
- case DocSymbol::AElig: m_t << "&AElig;"; break;
- case DocSymbol::Aelig: m_t << "&aelig;"; break;
- case DocSymbol::GrkGamma: m_t << "&Gamma;"; break;
- case DocSymbol::GrkDelta: m_t << "&Delta;"; break;
- case DocSymbol::GrkTheta: m_t << "&Theta;"; break;
- case DocSymbol::GrkLambda: m_t << "&Lambda;"; break;
- case DocSymbol::GrkXi: m_t << "&Xi;"; break;
- case DocSymbol::GrkPi: m_t << "&Pi;"; break;
- case DocSymbol::GrkSigma: m_t << "&Sigma;"; break;
- case DocSymbol::GrkUpsilon: m_t << "&Upsilon;"; break;
- case DocSymbol::GrkPhi: m_t << "&Phi;"; break;
- case DocSymbol::GrkPsi: m_t << "&Psi;"; break;
- case DocSymbol::GrkOmega: m_t << "&Omega;"; break;
- case DocSymbol::Grkalpha: m_t << "&alpha;"; break;
- case DocSymbol::Grkbeta: m_t << "&beta;"; break;
- case DocSymbol::Grkgamma: m_t << "&gamma;"; break;
- case DocSymbol::Grkdelta: m_t << "&delta;"; break;
- case DocSymbol::Grkepsilon: m_t << "&epsilon;"; break;
- case DocSymbol::Grkzeta: m_t << "&zeta;"; break;
- case DocSymbol::Grketa: m_t << "&eta;"; break;
- case DocSymbol::Grktheta: m_t << "&theta;"; break;
- case DocSymbol::Grkiota: m_t << "&iota;"; break;
- case DocSymbol::Grkkappa: m_t << "&kappa;"; break;
- case DocSymbol::Grklambda: m_t << "&lambda;"; break;
- case DocSymbol::Grkmu: m_t << "&mu;"; break;
- case DocSymbol::Grknu: m_t << "&nu;"; break;
- case DocSymbol::Grkxi: m_t << "&xi;"; break;
- case DocSymbol::Grkpi: m_t << "&pi;"; break;
- case DocSymbol::Grkrho: m_t << "&rho;"; break;
- case DocSymbol::Grksigma: m_t << "&sigma;"; break;
- case DocSymbol::Grktau: m_t << "&tau;"; break;
- case DocSymbol::Grkupsilon: m_t << "&upsilon;"; break;
- case DocSymbol::Grkphi: m_t << "&phi;"; break;
- case DocSymbol::Grkchi: m_t << "&chi;"; break;
- case DocSymbol::Grkpsi: m_t << "&psi;"; break;
- case DocSymbol::Grkomega: m_t << "&omega;"; break;
- case DocSymbol::Grkvarsigma: m_t << "&sigmaf;"; break;
- case DocSymbol::Section: m_t << "&sect;"; break;
- case DocSymbol::Degree: m_t << "&deg;"; break;
- case DocSymbol::Prime: m_t << "&prime;"; break;
- case DocSymbol::DoublePrime: m_t << "&Prime;"; break;
- case DocSymbol::Infinity: m_t << "&infin;"; break;
- case DocSymbol::EmptySet: m_t << "&empty;"; break;
- case DocSymbol::PlusMinus: m_t << "&plusmn;"; break;
- case DocSymbol::Times: m_t << "&times;"; break;
- case DocSymbol::Minus: m_t << "&minus;"; break;
- case DocSymbol::CenterDot: m_t << "&sdot;"; break;
- case DocSymbol::Partial: m_t << "&part;"; break;
- case DocSymbol::Nabla: m_t << "&nabla;"; break;
- case DocSymbol::SquareRoot: m_t << "&radic;"; break;
- case DocSymbol::Perpendicular: m_t << "&perp;"; break;
- case DocSymbol::Sum: m_t << "&sum;"; break;
- case DocSymbol::Integral: m_t << "&int;"; break;
- case DocSymbol::Product: m_t << "&prod;"; break;
- case DocSymbol::Similar: m_t << "&sim;"; break;
- case DocSymbol::Approx: m_t << "&asymp;"; break;
- case DocSymbol::NotEqual: m_t << "&ne;"; break;
- case DocSymbol::Equivalent: m_t << "&equiv;"; break;
- case DocSymbol::Proportional: m_t << "&prop;"; break;
- case DocSymbol::LessEqual: m_t << "&le;"; break;
- case DocSymbol::GreaterEqual: m_t << "&ge;"; break;
- case DocSymbol::LeftArrow: m_t << "&larr;"; break;
- case DocSymbol::RightArrow: m_t << "&rarr;"; break;
- case DocSymbol::SetIn: m_t << "&isin;"; break;
- case DocSymbol::SetNotIn: m_t << "&notin;"; break;
- case DocSymbol::LeftCeil: m_t << "&lceil;"; break;
- case DocSymbol::RightCeil: m_t << "&rceil;"; break;
- case DocSymbol::LeftFloor: m_t << "&lfloor;"; break;
- case DocSymbol::RightFloor: m_t << "&rfloor;"; break;
- default:
- err("unknown symbol found\n");
+ const char *res = HtmlEntityMapper::instance()->html(s->symbol());
+ if (res)
+ {
+ m_t << res;
+ }
+ else
+ {
+ err("HTML: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
}
@@ -332,7 +244,7 @@ void HtmlDocVisitor::visit(DocURL *u)
void HtmlDocVisitor::visit(DocLineBreak *)
{
if (m_hide) return;
- m_t << "<br/>\n";
+ m_t << "<br />\n";
}
void HtmlDocVisitor::visit(DocHorRuler *hr)
@@ -452,7 +364,9 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
forceStartParagraph(s);
break;
case DocVerbatim::HtmlOnly:
+ if (s->isBlock()) forceEndParagraph(s);
m_t << s->text();
+ if (s->isBlock()) forceStartParagraph(s);
break;
case DocVerbatim::ManOnly:
case DocVerbatim::LatexOnly:
@@ -585,6 +499,8 @@ void HtmlDocVisitor::visit(DocInclude *inc)
case DocInclude::HtmlInclude:
m_t << inc->text();
break;
+ case DocInclude::LatexInclude:
+ break;
case DocInclude::VerbInclude:
forceEndParagraph(inc);
m_t << /*PREFRAG_START <<*/ "<pre class=\"fragment\">";
@@ -1873,7 +1789,7 @@ void HtmlDocVisitor::visitPre(DocVhdlFlow *vf)
m_t << "</a>";
if (vf->hasCaption())
{
- m_t << "<br/>";
+ m_t << "<br />";
}
}
}
@@ -2040,7 +1956,7 @@ void HtmlDocVisitor::writeMscFile(const QCString &fileName,
}
void HtmlDocVisitor::writeDiaFile(const QCString &fileName,
- const QCString &,
+ const QCString &relPath,
const QCString &)
{
QCString baseName=fileName;
@@ -2057,7 +1973,7 @@ void HtmlDocVisitor::writeDiaFile(const QCString &fileName,
QCString outDir = Config_getString("HTML_OUTPUT");
writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP);
- m_t << "<img src=\"" << outDir << '/' << baseName << ".png" << "\" />" << endl;
+ m_t << "<img src=\"" << relPath << baseName << ".png" << "\" />" << endl;
}
/** Used for items found inside a paragraph, which due to XHTML restrictions
@@ -2092,7 +2008,7 @@ void HtmlDocVisitor::forceEndParagraph(DocNode *n)
//printf("forceEnd first=%d last=%d\n",isFirst,isLast);
if (isFirst && isLast) return;
- m_t << "</p>" << endl;
+ m_t << "</p>";
}
}
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
index fd7c23a..ddefecd 100644
--- a/src/htmldocvisitor.h
+++ b/src/htmldocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/htmlentity.cpp b/src/htmlentity.cpp
new file mode 100644
index 0000000..c49491e
--- /dev/null
+++ b/src/htmlentity.cpp
@@ -0,0 +1,500 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ *
+ * 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.
+ *
+ */
+
+#include "htmlentity.h"
+#include "message.h"
+#include "ftextstream.h"
+
+//! Number of doxygen commands mapped as if it were HTML entities
+static const int g_numberHtmlMappedCmds = 11;
+
+//! @brief Structure defining all HTML4 entities, doxygen extensions and doxygen commands representing special symbols.
+//! @details In case an entity does not exist a NULL is given for the entity. The first column contains the symbolic code
+//! for the entity, see also doxparser.h The second column contains the name of the enitity (without the starting \& and
+//! ending ;)
+static struct htmlEntityInfo
+{
+ DocSymbol::SymType symb;
+ const char *item;
+ const char *UTF8;
+ const char *html;
+ const char *xml;
+ const char *docbook;
+ const char *latex;
+ const char *man;
+ const char *rtf;
+ DocSymbol::PerlSymb perl;
+} g_htmlEntities[] =
+{
+#undef SYM
+// helper macro to force consistent entries for the symbol and item columns
+#define SYM(s) DocSymbol::Sym_##s,"&"#s";"
+ // HTML4 entities
+ // symb+item UTF-8 html xml docbook latex man rtf perl
+ { SYM(nbsp), "\xc2\xa0", "&#160;", "<nonbreakablespace/>", "&#160;", "~", " ", "\\~", { " ", DocSymbol::Perl_char }},
+ { SYM(iexcl), "\xc2\xa1", "&iexcl;", "<iexcl/>", "&#161;", "!`", NULL, "\\'A1", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(cent), "\xc2\xa2", "&cent;", "<cent/>", "&#162;", "\\textcent{}", NULL, "\\'A2", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(pound), "\xc2\xa3", "&pound;", "<pound/>", "&#163;", "{$\\pounds$}", NULL, "\\'A3", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(curren), "\xc2\xa4", "&curren;", "<curren/>", "&#164;", "\\textcurrency{}", NULL, "\\'A4", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(yen), "\xc2\xa5", "&yen;", "<yen/>", "&#165;", "{$\\yen$}", NULL, "\\'A5", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(brvbar), "\xc2\xa6", "&brvbar;", "<brvbar/>", "&#166;", "\\textbrokenbar{}", NULL, "\\'A6", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(sect), "\xc2\xa7", "&sect;", "<sect/>", "<simplesect/>", "{$\\S$}", NULL, "\\'A7", { "sect", DocSymbol::Perl_symbol }},
+ { SYM(uml), "\xc2\xa8", "&uml;", "<umlaut/>", "&#168;", "\\textasciidieresis{}", " \\*(4", "\\'A8", { " ", DocSymbol::Perl_umlaut }},
+ { SYM(copy), "\xc2\xa9", "&copy;", "<copy/>", "&#169;", "\\copyright{}", "(C)", "\\'A9", { "copyright", DocSymbol::Perl_symbol }},
+ { SYM(ordf), "\xc2\xaa", "&ordf;", "<ordf/>", "&#170;", "\\textordfeminine{}", NULL, "\\'AA", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(laquo), "\xc2\xab", "&laquo;", "<laquo/>", "&#171;", "\\guillemotleft{}", NULL, "\\'AB", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(not), "\xc2\xac", "&not;", "<not/>", "&#172;", "\\textlnot", NULL, "\\'AC", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(shy), "\xc2\xad", "&shy;", "<shy/>", "&#173;", "{$\\-$}", NULL, "\\-", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(reg), "\xc2\xae", "&reg;", "<registered/>", "&#174;", "\\textregistered{}", "(R)", "\\'AE", { "registered", DocSymbol::Perl_symbol }},
+ { SYM(macr), "\xc2\xaf", "&macr;", "<macr/>", "&#175;", "\\={}", NULL, "\\'AF", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(deg), "\xc2\xb0", "&deg;", "<deg/>", "&#176;", "\\textdegree", NULL, "\\'B0", { "deg", DocSymbol::Perl_symbol }},
+ { SYM(plusmn), "\xc2\xb1", "&plusmn;", "<plusmn/>", "&#177;", "{$\\pm$}", NULL, "\\'B1", { "+/-", DocSymbol::Perl_string }},
+ { SYM(sup2), "\xc2\xb2", "&sup2;", "<sup2/>", "&#178;", "\\texttwosuperior{}", NULL, "\\'B2", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(sup3), "\xc2\xb3", "&sup3;", "<sup3/>", "&#179;", "\\textthreesuperior{}", NULL, "\\'B3", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(acute), "\xc2\xb4", "&acute;", "<acute/>", "&#180;", "\\'{}", NULL, "\\'B4", { " ", DocSymbol::Perl_acute }},
+ { SYM(micro), "\xc2\xb5", "&micro;", "<micro/>", "&#181;", "{$\\mu$}", NULL, "\\'B5", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(para), "\xc2\xb6", "&para;", "<para/>", "&#182;", "{$\\P$}", NULL, "\\'B6", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(middot), "\xc2\xb7", "&middot;", "<middot/>", "&#183;", "\\textperiodcentered{}", NULL, "\\'B7", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(cedil), "\xc2\xb8", "&cedil;", "<cedil/>", "&#184;", "\\c{}", " \\*,", "\\'B8", { " ", DocSymbol::Perl_cedilla }},
+ { SYM(sup1), "\xc2\xb9", "&sup1;", "<sup1/>", "&#185;", "\\textonesuperior{}", NULL, "\\'B9", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(ordm), "\xc2\xba", "&ordm;", "<ordm/>", "&#186;", "\\textordmasculine{}", NULL, "\\'BA", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(raquo), "\xc2\xbb", "&raquo;", "<raquo/>", "&#187;", "\\guillemotright{}", NULL, "\\'BB", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(frac14), "\xc2\xbc", "&frac14;", "<frac14/>", "&#188;", "{$\\frac14$}", "1/4", "\\'BC", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(frac12), "\xc2\xbd", "&frac12;", "<frac12/>", "&#189;", "{$\\frac12$}", "1/2", "\\'BD", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(frac34), "\xc2\xbe", "&frac34;", "<frac34/>", "&#190;", "{$\\frac34$}", "3/4", "\\'BE", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(iquest), "\xc2\xbf", "&iquest;", "<iquest/>", "&#191;", "?`", NULL, "\\'BF", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(Agrave), "\xc3\x80", "&Agrave;", "<Agrave/>", "&#192;", "\\`{A}", "A\\*:", "\\'C0", { "A", DocSymbol::Perl_grave }},
+ { SYM(Aacute), "\xc3\x81", "&Aacute;", "<Aacute/>", "&#193;", "\\'{A}", "A\\*(`", "\\'C1", { "A", DocSymbol::Perl_acute }},
+ { SYM(Acirc), "\xc3\x82", "&Acirc;", "<Acirc/>", "&#194;", "\\^{A}", "A\\*^", "\\'C2", { "A", DocSymbol::Perl_circ }},
+ { SYM(Atilde), "\xc3\x83", "&Atilde;", "<Atilde/>", "&#195;", "\\~{A}", "A\\*~", "\\'C3", { "A", DocSymbol::Perl_tilde }},
+ { SYM(Auml), "\xc3\x84", "&Auml;", "<Aumlaut/>", "&#196;", "\\\"{A}", "A\\*(4", "\\'C4", { "A", DocSymbol::Perl_umlaut }},
+ { SYM(Aring), "\xc3\x85", "&Aring;", "<Aring/>", "&#197;", "\\AA", "A\\*o", "\\'C5", { "A", DocSymbol::Perl_ring }},
+ { SYM(AElig), "\xc3\x86", "&AElig;", "<AElig/>", "&#198;", "{\\AE}", NULL, "\\'C6", { "AElig", DocSymbol::Perl_symbol }},
+ { SYM(Ccedil), "\xc3\x87", "&Ccedil;", "<Ccedil/>", "&#199;", "\\c{C}", "C\\*,", "\\'C7", { "C", DocSymbol::Perl_cedilla }},
+ { SYM(Egrave), "\xc3\x88", "&Egrave;", "<Egrave/>", "&#200;", "\\`{E}", "E\\*:", "\\'C8", { "E", DocSymbol::Perl_grave }},
+ { SYM(Eacute), "\xc3\x89", "&Eacute;", "<Eacute/>", "&#201;", "\\'{E}", "E\\*(`", "\\'C9", { "E", DocSymbol::Perl_acute }},
+ { SYM(Ecirc), "\xc3\x8a", "&Ecirc;", "<Ecirc/>", "&#202;", "\\^{E}", "E\\*^", "\\'CA", { "E", DocSymbol::Perl_circ }},
+ { SYM(Euml), "\xc3\x8b", "&Euml;", "<Eumlaut/>", "&#203;", "\\\"{E}", "E\\*(4", "\\'CB", { "E", DocSymbol::Perl_umlaut }},
+ { SYM(Igrave), "\xc3\x8c", "&Igrave;", "<Igrave/>", "&#204;", "\\`{I}", "I\\*:", "\\'CC", { "I", DocSymbol::Perl_grave }},
+ { SYM(Iacute), "\xc3\x8d", "&Iacute;", "<Iacute/>", "&#205;", "\\'{I}", "I\\*(`", "\\'CD", { "I", DocSymbol::Perl_acute }},
+ { SYM(Icirc), "\xc3\x8e", "&Icirc;", "<Icirc/>", "&#206;", "\\^{I}", "I\\*^", "\\'CE", { "I", DocSymbol::Perl_circ }},
+ { SYM(Iuml), "\xc3\x8f", "&Iuml;", "<Iumlaut/>", "&#207;", "\\\"{I}", "I\\*(4", "\\'CF", { "I", DocSymbol::Perl_umlaut }},
+ { SYM(ETH), "\xc3\x90", "&ETH;", "<ETH/>", "&#208;", "\\DH", NULL, "\\'D0", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(Ntilde), "\xc3\x91", "&Ntilde;", "<Ntilde/>", "&#209;", "\\~{N}", "N\\*~", "\\'D1", { "N", DocSymbol::Perl_tilde }},
+ { SYM(Ograve), "\xc3\x92", "&Ograve;", "<Ograve/>", "&#210;", "\\`{O}", "O\\*:", "\\'D2", { "O", DocSymbol::Perl_grave }},
+ { SYM(Oacute), "\xc3\x93", "&Oacute;", "<Oacute/>", "&#211;", "\\'{O}", "O\\*(`", "\\'D3", { "O", DocSymbol::Perl_acute }},
+ { SYM(Ocirc), "\xc3\x94", "&Ocirc;", "<Ocirc/>", "&#212;", "\\^{O}", "O\\*^", "\\'D4", { "O", DocSymbol::Perl_circ }},
+ { SYM(Otilde), "\xc3\x95", "&Otilde;", "<Otilde/>", "&#213;", "\\~{O}", "O\\*~", "\\'D5", { "O", DocSymbol::Perl_tilde }},
+ { SYM(Ouml), "\xc3\x96", "&Ouml;", "<Oumlaut/>", "&#214;", "\\\"{O}", "O\\*(4", "\\'D6", { "O", DocSymbol::Perl_umlaut }},
+ { SYM(times), "\xc3\x97", "&times;", "<times/>", "&#215;", "{$\\times$}", NULL, "\\'D7", { "*", DocSymbol::Perl_char }},
+ { SYM(Oslash), "\xc3\x98", "&Oslash;", "<Oslash/>", "&#216;", "{\\O}", "O\x08/", "\\'D8", { "O", DocSymbol::Perl_slash }},
+ { SYM(Ugrave), "\xc3\x99", "&Ugrave;", "<Ugrave/>", "&#217;", "\\`{U}", "U\\*:", "\\'D9", { "U", DocSymbol::Perl_grave }},
+ { SYM(Uacute), "\xc3\x9a", "&Uacute;", "<Uacute/>", "&#218;", "\\'{U}", "U\\*(`", "\\'DA", { "U", DocSymbol::Perl_acute }},
+ { SYM(Ucirc), "\xc3\x9b", "&Ucirc;", "<Ucirc/>", "&#219;", "\\^{U}", "U\\*^", "\\'DB", { "U", DocSymbol::Perl_circ }},
+ { SYM(Uuml), "\xc3\x9c", "&Uuml;", "<Uumlaut/>", "&#220;", "\\\"{U}", "U\\*(4", "\\'DC", { "U", DocSymbol::Perl_umlaut }},
+ { SYM(Yacute), "\xc3\x9d", "&Yacute;", "<Yacute/>", "&#221;", "\\'{Y}", "Y\\*(`", "\\'DD", { "Y", DocSymbol::Perl_acute }},
+ { SYM(THORN), "\xc3\x9e", "&THORN;", "<THORN/>", "&#222;", "\\TH", NULL, "\\'DE", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(szlig), "\xc3\x9f", "&szlig;", "<szlig/>", "&#223;", "{\\ss}", "s\\*:", "\\'DF", { "szlig", DocSymbol::Perl_symbol }},
+ { SYM(agrave), "\xc3\xa0", "&agrave;", "<agrave/>", "&#224;", "\\`{a}", "a\\*:", "\\'E0", { "a", DocSymbol::Perl_grave }},
+ { SYM(aacute), "\xc3\xa1", "&aacute;", "<aacute/>", "&#225;", "\\'{a}", "a\\*(`", "\\'E1", { "a", DocSymbol::Perl_acute }},
+ { SYM(acirc), "\xc3\xa2", "&acirc;", "<acirc/>", "&#226;", "\\^{a}", "a\\*^", "\\'E2", { "a", DocSymbol::Perl_circ }},
+ { SYM(atilde), "\xc3\xa3", "&atilde;", "<atilde/>", "&#227;", "\\~{a}", "a\\*~", "\\'E3", { "a", DocSymbol::Perl_tilde }},
+ { SYM(auml), "\xc3\xa4", "&auml;", "<aumlaut/>", "&#228;", "\\\"{a}", "a\\*(4", "\\'E4", { "a", DocSymbol::Perl_umlaut }},
+ { SYM(aring), "\xc3\xa5", "&aring;", "<aring/>", "&#229;", "\\aa", "a\\*o", "\\'E5", { "a", DocSymbol::Perl_ring }},
+ { SYM(aelig), "\xc3\xa6", "&aelig;", "<aelig/>", "&#230;", "{\\ae}", NULL, "\\'E6", { "aelig", DocSymbol::Perl_symbol }},
+ { SYM(ccedil), "\xc3\xa7", "&ccedil;", "<ccedil/>", "&#231;", "\\c{c}", "c\\*,", "\\'E7", { "c", DocSymbol::Perl_cedilla }},
+ { SYM(egrave), "\xc3\xa8", "&egrave;", "<egrave/>", "&#232;", "\\`{e}", "e\\*:", "\\'E8", { "e", DocSymbol::Perl_grave }},
+ { SYM(eacute), "\xc3\xa9", "&eacute;", "<eacute/>", "&#233;", "\\'{e}", "e\\*(`", "\\'E9", { "e", DocSymbol::Perl_acute }},
+ { SYM(ecirc), "\xc3\xaa", "&ecirc;", "<ecirc/>", "&#234;", "\\^{e}", "e\\*^", "\\'EA", { "e", DocSymbol::Perl_circ }},
+ { SYM(euml), "\xc3\xab", "&euml;", "<eumlaut/>", "&#235;", "\\\"{e}", "e\\*(4", "\\'EB", { "e", DocSymbol::Perl_umlaut }},
+ { SYM(igrave), "\xc3\xac", "&igrave;", "<igrave/>", "&#236;", "\\`{\\i}", "i\\*:", "\\'EC", { "i", DocSymbol::Perl_grave }},
+ { SYM(iacute), "\xc3\xad", "&iacute;", "<iacute/>", "&#237;", "\\'{\\i}", "i\\*(`", "\\'ED", { "i", DocSymbol::Perl_acute }},
+ { SYM(icirc), "\xc3\xae", "&icirc;", "<icirc/>", "&#238;", "\\^{\\i}", "i\\*^", "\\'EE", { "i", DocSymbol::Perl_circ }},
+ { SYM(iuml), "\xc3\xaf", "&iuml;", "<iumlaut/>", "&#239;", "\\\"{\\i}", "i\\*(4", "\\'EF", { "i", DocSymbol::Perl_umlaut }},
+ { SYM(eth), "\xc3\xb0", "&eth;", "<eth/>", "&#240;", "\\dh", NULL, "\\'F0", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(ntilde), "\xc3\xb1", "&ntilde;", "<ntilde/>", "&#241;", "\\~{n}", "n\\*~", "\\'F1", { "n", DocSymbol::Perl_tilde }},
+ { SYM(ograve), "\xc3\xb2", "&ograve;", "<ograve/>", "&#242;", "\\`{o}", "o\\*:", "\\'F2", { "o", DocSymbol::Perl_grave }},
+ { SYM(oacute), "\xc3\xb3", "&oacute;", "<oacute/>", "&#243;", "\\'{o}", "o\\*(`", "\\'F3", { "o", DocSymbol::Perl_acute }},
+ { SYM(ocirc), "\xc3\xb4", "&ocirc;", "<ocirc/>", "&#244;", "\\^{o}", "o\\*^", "\\'F4", { "o", DocSymbol::Perl_circ }},
+ { SYM(otilde), "\xc3\xb5", "&otilde;", "<otilde/>", "&#245;", "\\~{o}", "o\\*~", "\\'F5", { "o", DocSymbol::Perl_tilde }},
+ { SYM(ouml), "\xc3\xb6", "&ouml;", "<oumlaut/>", "&#246;", "\\\"{o}", "o\\*(4", "\\'F6", { "o", DocSymbol::Perl_umlaut }},
+ { SYM(divide), "\xc3\xb7", "&divide;", "<divide/>", "&#247;", "{$\\div$}", NULL, "\\'F7", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(oslash), "\xc3\xb8", "&oslash;", "<oslash/>", "&#248;", "{\\o}", "o\x08/", "\\'F8", { "o", DocSymbol::Perl_slash }},
+ { SYM(ugrave), "\xc3\xb9", "&ugrave;", "<ugrave/>", "&#249;", "\\`{u}", "u\\*:", "\\'F9", { "u", DocSymbol::Perl_grave }},
+ { SYM(uacute), "\xc3\xba", "&uacute;", "<uacute/>", "&#250;", "\\'{u}", "u\\*(`", "\\'FA", { "u", DocSymbol::Perl_acute }},
+ { SYM(ucirc), "\xc3\xbb", "&ucirc;", "<ucirc/>", "&#251;", "\\^{u}", "u\\*^", "\\'FB", { "u", DocSymbol::Perl_circ }},
+ { SYM(uuml), "\xc3\xbc", "&uuml;", "<uumlaut/>", "&#252;", "\\\"{u}", "u\\*(4", "\\'FC", { "u", DocSymbol::Perl_umlaut }},
+ { SYM(yacute), "\xc3\xbd", "&yacute;", "<yacute/>", "&#253;", "\\'{y}", "y\\*(`", "\\'FD", { "y", DocSymbol::Perl_acute }},
+ { SYM(thorn), "\xc3\xbe", "&thorn;", "<thorn/>", "&#254;", "\\th", NULL, "\\'FE", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(yuml), "\xc3\xbf", "&yuml;", "<yumlaut/>", "&#255;", "\\\"{y}", "y\\*(4", "\\'FF", { "y", DocSymbol::Perl_umlaut }},
+ { SYM(fnof), "\xc6\x92", "&fnof;", "<fnof/>", "&#402;", "\\textflorin", NULL, "\\'83", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(Alpha), "\xce\x91", "&Alpha;", "<Alpha/>", "&#913;", "A", NULL, "\\u0913?", { "A", DocSymbol::Perl_char }},
+ { SYM(Beta), "\xce\x92", "&Beta;", "<Beta/>", "&#914;", "B", NULL, "\\u0914?", { "B", DocSymbol::Perl_char }},
+ { SYM(Gamma), "\xce\x93", "&Gamma;", "<Gamma/>", "&#915;", "{$\\Gamma$}", NULL, "\\u0915?", { "Gamma", DocSymbol::Perl_symbol }},
+ { SYM(Delta), "\xce\x94", "&Delta;", "<Delta/>", "&#916;", "{$\\Delta$}", NULL, "\\u0916?", { "Delta", DocSymbol::Perl_symbol }},
+ { SYM(Epsilon), "\xce\x95", "&Epsilon;", "<Epsilon/>", "&#917;", "E", NULL, "\\u0917?", { "E", DocSymbol::Perl_char }},
+ { SYM(Zeta), "\xce\x96", "&Zeta;", "<Zeta/>", "&#918;", "Z", NULL, "\\u0918?", { "Z", DocSymbol::Perl_char }},
+ { SYM(Eta), "\xce\x97", "&Eta;", "<Eta/>", "&#919;", "H", NULL, "\\u0919?", { "H", DocSymbol::Perl_char }},
+ { SYM(Theta), "\xce\x98", "&Theta;", "<Theta/>", "&#920;", "{$\\Theta$}", NULL, "\\u0920?", { "Theta", DocSymbol::Perl_symbol }},
+ { SYM(Iota), "\xce\x99", "&Iota;", "<Iota/>", "&#921;", "I", NULL, "\\u0921?", { "I", DocSymbol::Perl_char }},
+ { SYM(Kappa), "\xce\x9a", "&Kappa;", "<Kappa/>", "&#922;", "K", NULL, "\\u0922?", { "K", DocSymbol::Perl_char }},
+ { SYM(Lambda), "\xce\x9b", "&Lambda;", "<Lambda/>", "&#923;", "{$\\Lambda$}", NULL, "\\u0923?", { "Lambda", DocSymbol::Perl_symbol }},
+ { SYM(Mu), "\xce\x9c", "&Mu;", "<Mu/>", "&#924;", "M", NULL, "\\u0924?", { "M", DocSymbol::Perl_char }},
+ { SYM(Nu), "\xce\x9d", "&Nu;", "<Nu/>", "&#925;", "N", NULL, "\\u0925?", { "N", DocSymbol::Perl_char }},
+ { SYM(Xi), "\xce\x9e", "&Xi;", "<Xi/>", "&#926;", "{$\\Xi$}", NULL, "\\u0926?", { "Xi", DocSymbol::Perl_symbol }},
+ { SYM(Omicron), "\xce\x9f", "&Omicron;", "<Omicron/>", "&#927;", "O", NULL, "\\u0927?", { "O", DocSymbol::Perl_char }},
+ { SYM(Pi), "\xce\xa0", "&Pi;", "<Pi/>", "&#928;", "{$\\Pi$}", NULL, "\\u0928?", { "Pi", DocSymbol::Perl_symbol }},
+ { SYM(Rho), "\xce\xa1", "&Rho;", "<Rho/>", "&#929;", "P", NULL, "\\u0929?", { "P", DocSymbol::Perl_char }},
+ { SYM(Sigma), "\xce\xa3", "&Sigma;", "<Sigma/>", "&#931;", "{$\\Sigma$}", NULL, "\\u0931?", { "Sigma", DocSymbol::Perl_symbol }},
+ { SYM(Tau), "\xce\xa4", "&Tau;", "<Tau/>", "&#932;", "T", NULL, "\\u0932?", { "T", DocSymbol::Perl_char }},
+ { SYM(Upsilon), "\xce\xa5", "&Upsilon;", "<Upsilon/>", "&#933;", "{$\\Upsilon$}", NULL, "\\u0933?", { "Upsilon", DocSymbol::Perl_symbol }},
+ { SYM(Phi), "\xce\xa6", "&Phi;", "<Phi/>", "&#934;", "{$\\Phi$}", NULL, "\\u0934?", { "Phi", DocSymbol::Perl_symbol }},
+ { SYM(Chi), "\xce\xa7", "&Chi;", "<Chi/>", "&#935;", "X", NULL, "\\u0935?", { "X", DocSymbol::Perl_char }},
+ { SYM(Psi), "\xce\xa8", "&Psi;", "<Psi/>", "&#936;", "{$\\Psi$}", NULL, "\\u0936?", { "Psi", DocSymbol::Perl_symbol }},
+ { SYM(Omega), "\xce\xa9", "&Omega;", "<Omega/>", "&#937;", "{$\\Omega$}", NULL, "\\u0937?", { "Omega", DocSymbol::Perl_symbol }},
+ { SYM(alpha), "\xce\xb1", "&alpha;", "<alpha/>", "&#945;", "{$\\alpha$}", NULL, "\\u0945?", { "alpha", DocSymbol::Perl_symbol }},
+ { SYM(beta), "\xce\xb2", "&beta;", "<beta/>", "&#946;", "{$\\beta$}", NULL, "\\u0946?", { "beta", DocSymbol::Perl_symbol }},
+ { SYM(gamma), "\xce\xb3", "&gamma;", "<gamma/>", "&#947;", "{$\\gamma$}", NULL, "\\u0947?", { "gamma", DocSymbol::Perl_symbol }},
+ { SYM(delta), "\xce\xb4", "&delta;", "<delta/>", "&#948;", "{$\\delta$}", NULL, "\\u0948?", { "delta", DocSymbol::Perl_symbol }},
+ { SYM(epsilon), "\xce\xb5", "&epsilon;", "<epsilon/>", "&#949;", "{$\\varepsilon$}", NULL, "\\u0949?", { "epsilon", DocSymbol::Perl_symbol }},
+ { SYM(zeta), "\xce\xb6", "&zeta;", "<zeta/>", "&#950;", "{$\\zeta$}", NULL, "\\u0950?", { "zeta", DocSymbol::Perl_symbol }},
+ { SYM(eta), "\xce\xb7", "&eta;", "<eta/>", "&#951;", "{$\\eta$}", NULL, "\\u0951?", { "eta", DocSymbol::Perl_symbol }},
+ { SYM(theta), "\xce\xb8", "&theta;", "<theta/>", "&#952;", "{$\\theta$}", NULL, "\\u0952?", { "theta", DocSymbol::Perl_symbol }},
+ { SYM(iota), "\xce\xb9", "&iota;", "<iota/>", "&#953;", "{$\\iota$}", NULL, "\\u0953?", { "iota", DocSymbol::Perl_symbol }},
+ { SYM(kappa), "\xce\xba", "&kappa;", "<kappa/>", "&#954;", "{$\\kappa$}", NULL, "\\u0954?", { "kappa", DocSymbol::Perl_symbol }},
+ { SYM(lambda), "\xce\xbb", "&lambda;", "<lambda/>", "&#955;", "{$\\lambda$}", NULL, "\\u0955?", { "lambda", DocSymbol::Perl_symbol }},
+ { SYM(mu), "\xce\xbc", "&mu;", "<mu/>", "&#956;", "{$\\mu$}", NULL, "\\u0956?", { "mu", DocSymbol::Perl_symbol }},
+ { SYM(nu), "\xce\xbd", "&nu;", "<nu/>", "&#957;", "{$\\nu$}", NULL, "\\u0957?", { "nu", DocSymbol::Perl_symbol }},
+ { SYM(xi), "\xce\xbe", "&xi;", "<xi/>", "&#958;", "{$\\xi$}", NULL, "\\u0958?", { "xi", DocSymbol::Perl_symbol }},
+ { SYM(omicron), "\xce\xbf", "&omicron;", "<omicron/>", "&#959;", "{$\\omicron$}", NULL, "\\u0959?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(pi), "\xcf\x80", "&pi;", "<pi/>", "&#960;", "{$\\pi$}", NULL, "\\u0960?", { "pi", DocSymbol::Perl_symbol }},
+ { SYM(rho), "\xcf\x81", "&rho;", "<rho/>", "&#961;", "{$\\rho$}", NULL, "\\u0961?", { "rho", DocSymbol::Perl_symbol }},
+ { SYM(sigmaf), "\xcf\x82", "&sigmaf;", "<sigmaf/>", "&#962;", "{$\\varsigma$}", NULL, "\\u0962?", { "sigma", DocSymbol::Perl_symbol }},
+ { SYM(sigma), "\xcf\x83", "&sigma;", "<sigma/>", "&#963;", "{$\\sigma$}", NULL, "\\u0963?", { "sigma", DocSymbol::Perl_symbol }},
+ { SYM(tau), "\xcf\x84", "&tau;", "<tau/>", "&#964;", "{$\\tau$}", NULL, "\\u0964?", { "tau", DocSymbol::Perl_symbol }},
+ { SYM(upsilon), "\xcf\x85", "&upsilon;", "<upsilon/>", "&#965;", "{$\\upsilon$}", NULL, "\\u0965?", { "upsilon", DocSymbol::Perl_symbol }},
+ { SYM(phi), "\xcf\x86", "&phi;", "<phi/>", "&#966;", "{$\\varphi$}", NULL, "\\u0966?", { "phi", DocSymbol::Perl_symbol }},
+ { SYM(chi), "\xcf\x87", "&chi;", "<chi/>", "&#967;", "{$\\chi$}", NULL, "\\u0967?", { "chi", DocSymbol::Perl_symbol }},
+ { SYM(psi), "\xcf\x88", "&psi;", "<psi/>", "&#968;", "{$\\psi$}", NULL, "\\u0968?", { "psi", DocSymbol::Perl_symbol }},
+ { SYM(omega), "\xcf\x89", "&omega;", "<omega/>", "&#969;", "{$\\omega$}", NULL, "\\u0969?", { "omega", DocSymbol::Perl_symbol }},
+ { SYM(thetasym), "\xcf\x91", "&thetasym;", "<thetasym/>", "&#977;", "{$\\vartheta$}", NULL, "\\u977?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(upsih), "\xcf\x92", "&upsih;", "<upsih/>", "&#978;", "{$\\Upsilon$}", NULL, "\\u978?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(piv), "\xcf\x96", "&piv;", "<piv/>", "&#982;", "{$\\varpi$}", NULL, "\\u982?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(bull), "\xe2\x80\xa2", "&bull;", "<bull/>", "&#8226;", "\\textbullet{}", NULL, "\\'95", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(hellip), "\xe2\x80\xa6", "&hellip;", "<hellip/>", "&#8230;", "{$\\cdots$}", NULL, "\\'85", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(prime), "\xe2\x80\xb2", "&prime;", "<prime/>", "&#8242;", "'", NULL, "\\u8242?", { "\\\'", DocSymbol::Perl_string }},
+ { SYM(Prime), "\xe2\x80\xb3", "&Prime;", "<Prime/>", "&#8243;", "''", NULL, "\\u8243?", { "\"", DocSymbol::Perl_char }},
+ { SYM(oline), "\xe2\x80\xbe", "&oline;", "<oline/>", "&#8254;", "{$\\overline{\\,}$}", NULL, "\\u8254?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(frasl), "\xe2\x81\x84", "&frasl;", "<frasl/>", "&#8260;", "/", NULL, "\\u8260?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(weierp), "\xe2\x84\x98", "&weierp;", "<weierp/>", "&#8472;", "{$\\wp$}", NULL, "\\u8472?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(image), "\xe2\x84\x91", "&image;", "<image/>", "&#8465;", "{$\\Im$}", NULL, "\\u8465?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(real), "\xe2\x84\x9c", "&real;", "<real/>", "&#8476;", "{$\\Re$}", NULL, "\\u8476?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(trade), "\xe2\x84\xa2", "&trade;", "<trademark/>", "&#8482;", "\\texttrademark{}", "(TM)", "\\'99", { "trademark", DocSymbol::Perl_symbol }},
+ { SYM(alefsym), "\xe2\x85\xb5", "&alefsym;", "<alefsym/>", "&#8501;", "{$\\aleph$}", NULL, "\\u8501?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(larr), "\xe2\x86\x90", "&larr;", "<larr/>", "&#8592;", "{$\\leftarrow$}", NULL, "\\u8592?", { "<-", DocSymbol::Perl_string }},
+ { SYM(uarr), "\xe2\x86\x91", "&uarr;", "<uarr/>", "&#8593;", "{$\\uparrow$}", NULL, "\\u8593?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(rarr), "\xe2\x86\x92", "&rarr;", "<rarr/>", "&#8594;", "{$\\rightarrow$}", NULL, "\\u8594?", { "->", DocSymbol::Perl_string }},
+ { SYM(darr), "\xe2\x86\x93", "&darr;", "<darr/>", "&#8595;", "{$\\downarrow$}", NULL, "\\u8595?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(harr), "\xe2\x86\x94", "&harr;", "<harr/>", "&#8596;", "{$\\leftrightarrow$}", NULL, "\\u8596?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(crarr), "\xe2\x86\xb5", "&crarr;", "<crarr/>", "&#8629;", "{$\\hookleftarrow$}", NULL, "\\u8629?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(lArr), "\xe2\x87\x90", "&lArr;", "<lArr/>", "&#8656;", "{$\\Leftarrow$}", NULL, "\\u8656?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(uArr), "\xe2\x87\x91", "&uArr;", "<uArr/>", "&#8657;", "{$\\Uparrow$}", NULL, "\\u8657?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(rArr), "\xe2\x87\x92", "&rArr;", "<rArr/>", "&#8658;", "{$\\Rightarrow$}", NULL, "\\u8658?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(dArr), "\xe2\x87\x93", "&dArr;", "<dArr/>", "&#8659;", "{$\\Downarrow$}", NULL, "\\u8659?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(hArr), "\xe2\x87\x94", "&hArr;", "<hArr/>", "&#8660;", "{$\\Leftrightarrow$}", NULL, "\\u8660?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(forall), "\xe2\x88\x80", "&forall;", "<forall/>", "&#8704;", "{$\\forall$}", NULL, "\\u8704?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(part), "\xe2\x88\x82", "&part;", "<part/>", "&#8706;", "{$\\partial$}", NULL, "\\u8706?", { "partial", DocSymbol::Perl_symbol }},
+ { SYM(exist), "\xe2\x88\x83", "&exist;", "<exist/>", "&#8707;", "{$\\exists$}", NULL, "\\u8707?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(empty), "\xe2\x88\x85", "&empty;", "<empty/>", "&#8709;", "{$\\emptyset$}", NULL, "\\u8709?", { "empty", DocSymbol::Perl_symbol }},
+ { SYM(nabla), "\xe2\x88\x87", "&nabla;", "<nabla/>", "&#8711;", "{$\\nabla$}", NULL, "\\u8711?", { "nabla", DocSymbol::Perl_symbol }},
+ { SYM(isin), "\xe2\x88\x88", "&isin;", "<isin/>", "&#8712;", "{$\\in$}", NULL, "\\u8712?", { "in", DocSymbol::Perl_symbol }},
+ { SYM(notin), "\xe2\x88\x89", "&notin;", "<notin/>", "&#8713;", "{$\\notin$}", NULL, "\\u8713?", { "notin", DocSymbol::Perl_symbol }},
+ { SYM(ni), "\xe2\x88\x8b", "&ni;", "<ni/>", "&#8715;", "{$\\ni$}", NULL, "\\u8715?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(prod), "\xe2\x88\x8f", "&prod;", "<prod/>", "&#8719;", "{$\\prod$}", NULL, "\\u8719?", { "prod", DocSymbol::Perl_symbol }},
+ { SYM(sum), "\xe2\x88\x91", "&sum;", "<sum/>", "&#8721;", "{$\\sum$}", NULL, "\\u8721?", { "sum", DocSymbol::Perl_symbol }},
+ { SYM(minus), "\xe2\x88\x92", "&minus;", "<minus/>", "&#8722;", "-", NULL, "\\u8722?", { "-", DocSymbol::Perl_char }},
+ { SYM(lowast), "\xe2\x88\x97", "&lowast;", "<lowast/>", "&#8727;", "{$\\ast$}", NULL, "\\u8727?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(radic), "\xe2\x88\x9a", "&radic;", "<radic/>", "&#8730;", "{$\\surd$}", NULL, "\\u8730?", { "sqrt", DocSymbol::Perl_symbol }},
+ { SYM(prop), "\xe2\x88\x9d", "&prop;", "<prop/>", "&#8733;", "{$\\propto$}", NULL, "\\u8733?", { "propto", DocSymbol::Perl_symbol }},
+ { SYM(infin), "\xe2\x88\x9e", "&infin;", "<infin/>", "&#8734;", "{$\\infty$}", NULL, "\\u8734?", { "inf", DocSymbol::Perl_symbol }},
+ { SYM(ang), "\xe2\x88\xa0", "&ang;", "<ang/>", "&#8736;", "{$\\angle$}", NULL, "\\u8736?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(and), "\xe2\x88\xa7", "&and;", "<and/>", "&#8743;", "{$\\wedge$}", NULL, "\\u8743?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(or), "\xe2\x88\xa8", "&or;", "<or/>", "&#8744;", "{$\\vee$}", NULL, "\\u8744?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(cap), "\xe2\x88\xa9", "&cap;", "<cap/>", "&#8745;", "{$\\cap$}", NULL, "\\u8745?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(cup), "\xe2\x88\xaa", "&cup;", "<cup/>", "&#8746;", "{$\\cup$}", NULL, "\\u8746?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(int), "\xe2\x88\xab", "&int;", "<int/>", "&#8747;", "{$\\int$}", NULL, "\\u8747?", { "int", DocSymbol::Perl_symbol }},
+ { SYM(there4), "\xe2\x88\xb4", "&there4;", "<there4/>", "&#8756;", "{$\\therefore$}", NULL, "\\u8756?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(sim), "\xe2\x88\xbc", "&sim;", "<sim/>", "&#8764;", "{$\\sim$}", NULL, "\\u8764?", { "~", DocSymbol::Perl_char }},
+ { SYM(cong), "\xe2\x89\x85", "&cong;", "<cong/>", "&#8773;", "{$\\cong$}", NULL, "\\u8773?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(asymp), "\xe2\x89\x88", "&asymp;", "<asymp/>", "&#8776;", "{$\\approx$}", NULL, "\\u8776?", { "approx", DocSymbol::Perl_symbol }},
+ { SYM(ne), "\xe2\x89\xa0", "&ne;", "<ne/>", "&#8800;", "{$\\ne$}", NULL, "\\u8800?", { "!=", DocSymbol::Perl_string }},
+ { SYM(equiv), "\xe2\x89\xa1", "&equiv;", "<equiv/>", "&#8801;", "{$\\equiv$}", NULL, "\\u8801?", { "equiv", DocSymbol::Perl_symbol }},
+ { SYM(le), "\xe2\x89\xa4", "&le;", "<le/>", "&#8804;", "{$\\le$}", NULL, "\\u8804?", { "<=", DocSymbol::Perl_string }},
+ { SYM(ge), "\xe2\x89\xa5", "&ge;", "<ge/>", "&#8805;", "{$\\ge$}", NULL, "\\u8805?", { ">=", DocSymbol::Perl_string }},
+ { SYM(sub), "\xe2\x8a\x82", "&sub;", "<sub/>", "&#8834;", "{$\\subset$}", NULL, "\\u8834?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(sup), "\xe2\x8a\x83", "&sup;", "<sup/>", "&#8835;", "{$\\supset$}", NULL, "\\u8835?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(nsub), "\xe2\x8a\x84", "&nsub;", "<nsub/>", "&#8836;", "{$\\not\\subset$}", NULL, "\\u8836?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(sube), "\xe2\x8a\x86", "&sube;", "<sube/>", "&#8838;", "{$\\subseteq$}", NULL, "\\u8838?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(supe), "\xe2\x8a\x87", "&supe;", "<supe/>", "&#8839;", "{$\\supseteq$}", NULL, "\\u8839?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(oplus), "\xe2\x8a\x95", "&oplus;", "<oplus/>", "&#8853;", "{$\\oplus$}", NULL, "\\u8853?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(otimes), "\xe2\x8a\x97", "&otimes;", "<otimes/>", "&#8855;", "{$\\otimes$}", NULL, "\\u8855?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(perp), "\xe2\x8a\xa5", "&perp;", "<perp/>", "&#8869;", "{$\\perp$}", NULL, "\\u8869?", { "perp", DocSymbol::Perl_symbol }},
+ { SYM(sdot), "\xe2\x8b\x85", "&sdot;", "<sdot/>", "&#8901;", "{$\\cdot$}", NULL, "\\u8901?", { ".", DocSymbol::Perl_char }},
+ { SYM(lceil), "\xe2\x8c\x88", "&lceil;", "<lceil/>", "&#8968;", "{$\\lceil$}", NULL, "\\u8968?", { "lceil", DocSymbol::Perl_symbol }},
+ { SYM(rceil), "\xe2\x8c\x89", "&rceil;", "<rceil/>", "&#8969;", "{$\\rceil$}", NULL, "\\u8969?", { "rceil", DocSymbol::Perl_symbol }},
+ { SYM(lfloor), "\xe2\x8c\x8a", "&lfloor;", "<lfloor/>", "&#8970;", "{$\\lfloor$}", NULL, "\\u8970?", { "lfloor", DocSymbol::Perl_symbol }},
+ { SYM(rfloor), "\xe2\x8c\x8b", "&rfloor;", "<rfloor/>", "&#8971;", "{$\\rfloor$}", NULL, "\\u8971?", { "rfloor", DocSymbol::Perl_symbol }},
+ { SYM(lang), "\xe2\x8c\xa9", "&lang;", "<lang/>", "&#9001;", "{$\\langle$}", NULL, "\\u9001?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(rang), "\xe2\x8c\xaa", "&rang;", "<rang/>", "&#9002;", "{$\\rangle$}", NULL, "\\u9002?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(loz), "\xe2\x97\x8a", "&loz;", "<loz/>", "&#9674;", "{$\\lozenge$}", NULL, "\\u9674?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(spades), "\xe2\x99\xa0", "&spades;", "<spades/>", "&#9824;", "{$\\spadesuit$}", NULL, "\\u9824?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(clubs), "\xe2\x99\xa3", "&clubs;", "<clubs/>", "&#9827;", "{$\\clubsuit$}", NULL, "\\u9827?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(hearts), "\xe2\x99\xa5", "&hearts;", "<hearts/>", "&#9829;", "{$\\heartsuit$}", NULL, "\\u9829?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(diams), "\xe2\x99\xa6", "&diams;", "<diams/>", "&#9830;", "{$\\diamondsuit$}", NULL, "\\u9830?", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(quot), "\"", "&quot;", "\"", "&quot;", "\"", "\"", "\"", { "\"", DocSymbol::Perl_char }},
+ { SYM(amp), "&", "&amp;", "&amp;", "&amp;", "\\&", "&", "&", { "&", DocSymbol::Perl_char }},
+ { SYM(lt), "<", "&lt;", "&lt;", "&lt;", "<", "<", "<", { "<", DocSymbol::Perl_char }},
+ { SYM(gt), ">", "&gt;", "&gt;", "&gt;", ">", ">", ">", { ">", DocSymbol::Perl_char }},
+ { SYM(OElig), "\xc5\x92", "&OElig;", "<OElig/>", "&#338;", "\\OE", NULL, "\\'8C", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(oelig), "\xc5\x93", "&oelig;", "<oelig/>", "&#339;", "\\oe", NULL, "\\'9C", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(Scaron), "\xc5\xa0", "&Scaron;", "<Scaron/>", "&#352;", "\\v{S}", NULL, "\\'8A", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(scaron), "\xc5\xa1", "&scaron;", "<scaron/>", "&#353;", "\\v{s}", NULL, "\\'9A", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(Yuml), "\xc5\xb8", "&Yuml;", "<Yumlaut/>", "&#376;", "\\\"{Y}", "Y\\*(4", "\\'9F", { "Y", DocSymbol::Perl_umlaut }},
+ { SYM(circ), "\xcb\x86", "&circ;", "<circ/>", "&#710;", "{$\\circ$}", NULL, "\\'88", { " ", DocSymbol::Perl_circ }},
+ { SYM(tilde), "\xcb\x9c", "&tilde;", "<tilde/>", "&#732;", "\\~{}", "~", "\\'98", { " ", DocSymbol::Perl_tilde }},
+ { SYM(ensp), "\xe2\x80\x82", "&ensp;", "<ensp/>", "&#8194;", "\\enskip{}", NULL, "{\\enspace}", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(emsp), "\xe2\x80\x83", "&emsp;", "<emsp/>", "&#8195;", "\\quad{}", NULL, "{\\emspace}", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(thinsp), "\xe2\x80\x89", "&thinsp;", "<thinsp/>", "&#8201;", "\\,", NULL, "{\\qmspace}", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(zwnj), "\xe2\x80\x8c", "&zwnj;", "<zwnj/>", "&#8204;", "{}", NULL, "\\zwnj", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(zwj), "\xe2\x80\x8d", "&zwj;", "<zwj/>", "&#8205;", "", NULL, "\\zwj", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(lrm), "\xe2\x80\x8e", "&lrm;", "<lrm/>", "&#8206;", "", NULL, "\\ltrmark", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(rlm), "\xe2\x80\x8f", "&rlm;", "<rlm/>", "&#8207;", "", NULL, "\\rtlmark", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(ndash), "\xe2\x80\x93", "&ndash;", "<ndash/>", "&#8211;", "--", "--", "\\'96", { "-", DocSymbol::Perl_char }},
+ { SYM(mdash), "\xe2\x80\x94", "&mdash;", "<mdash/>", "&#8212;", "---", "---", "\\'97", { "--", DocSymbol::Perl_string }},
+ { SYM(lsquo), "\xe2\x80\x98", "&lsquo;", "<lsquo/>", "&#8216;", "`", "`", "\\'91", { "\\\'", DocSymbol::Perl_string }},
+ { SYM(rsquo), "\xe2\x80\x99", "&rsquo;", "<rsquo/>", "&#8217;", "'", "'", "\\'92", { "\\\'", DocSymbol::Perl_string }},
+ { SYM(sbquo), "\xe2\x80\x9a", "&sbquo;", "<sbquo/>", "&#8218;", "\\quotesinglbase{}", NULL, "\\'82", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(ldquo), "\xe2\x80\x9c", "&ldquo;", "<ldquo/>", "&#8220;", "``", "``", "\\'93", { "\"", DocSymbol::Perl_char }},
+ { SYM(rdquo), "\xe2\x80\x9d", "&rdquo;", "<rdquo/>", "&#8221;", "''", "''", "\\'94", { "\"", DocSymbol::Perl_char }},
+ { SYM(bdquo), "\xe2\x80\x9e", "&bdquo;", "<bdquo/>", "&#8222;", "\\quotedblbase{}", NULL, "\\'84", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(dagger), "\xe2\x80\xa0", "&dagger;", "<dagger/>", "&#8224;", "{$\\dagger$}", NULL, "\\'86", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(Dagger), "\xe2\x80\xa1", "&Dagger;", "<Dagger/>", "&#8225;", "{$\\ddagger$}", NULL, "\\'87", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(permil), "\xe2\x80\xb0", "&permil;", "<permil/>", "&#8240;", "{$\\permil{}$}", NULL, "\\'89", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(lsaquo), "\xe2\x80\xb9", "&lsaquo;", "<lsaquo/>", "&#8249;", "\\guilsinglleft{}", NULL, "\\'8B", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(rsaquo), "\xe2\x80\xba", "&rsaquo;", "<rsaquo/>", "&#8250;", "\\guilsinglright{}", NULL, "\\'9B", { NULL, DocSymbol::Perl_unknown }},
+ { SYM(euro), "\xe2\x82\xac", "&euro;", "<euro/>", "&#8364;", "\\texteuro{}", NULL, "\\'80", { NULL, DocSymbol::Perl_unknown }},
+
+ // doxygen extension to the HTML4 table of HTML entities
+ { SYM(tm), "\xe2\x84\xa2", "&trade;", "<trademark/>", "&#8482;", "\\texttrademark{}", "(TM)", "\\'99", { "trademark", DocSymbol::Perl_symbol }},
+ { SYM(apos), "'", "'", "'", "&apos;", "'", "'", "'", { "\\\'", DocSymbol::Perl_string }},
+
+ // doxygen commands represented as HTML entities
+ { SYM(BSlash), "\\", "\\", "\\", "\\", "\\textbackslash{}", "\\\\", "\\\\", { "\\\\", DocSymbol::Perl_string }},
+ { SYM(At), "@", "@", "@", "@", "@", "@", "@", { "@", DocSymbol::Perl_char }},
+ { SYM(Less), "<", "&lt;", "&lt;", "&lt;", "<", "<", "<", { "<", DocSymbol::Perl_char }},
+ { SYM(Greater), ">", "&gt;", "&gt;", "&gt;", ">", ">", ">", { ">", DocSymbol::Perl_char }},
+ { SYM(Amp), "&", "&amp;", "&amp;", "&amp;", "\\&", "&", "&", { "&", DocSymbol::Perl_char }},
+ { SYM(Dollar), "$", "$", "$", "$", "\\$", "$", "$", { "$", DocSymbol::Perl_char }},
+ { SYM(Hash), "#;", "#", "#", "#", "\\#", "#", "#", { "#", DocSymbol::Perl_char }},
+ { SYM(DoubleColon), "::", "::", "::", "::", "::", "::", "::", { "::", DocSymbol::Perl_string }},
+ { SYM(Percent), "%", "%", "%", "%", "\\%", "%", "%", { "%", DocSymbol::Perl_char }},
+ { SYM(Pipe), "|", "|", "|", "|", "$|$", "|", "|", { "|", DocSymbol::Perl_char }},
+ { SYM(Quot), "\"", "\"", "\"", "&quot;", "\"", "\"", "\"", { "\"", DocSymbol::Perl_char }},
+ { SYM(Minus), "-", "-", "-", "-", "-\\/", "-", "-", { "-", DocSymbol::Perl_char }}
+};
+
+static const int g_numHtmlEntities = (int)(sizeof(g_htmlEntities)/ sizeof(*g_htmlEntities));
+
+HtmlEntityMapper *HtmlEntityMapper::s_instance = 0;
+
+HtmlEntityMapper::HtmlEntityMapper()
+{
+ m_name2sym = new QDict<int>(1009);
+ m_name2sym->setAutoDelete(TRUE);
+ for (int i = 0; i < g_numHtmlEntities; i++)
+ {
+ m_name2sym->insert(g_htmlEntities[i].item,new int(g_htmlEntities[i].symb));
+ }
+ validate();
+}
+
+HtmlEntityMapper::~HtmlEntityMapper()
+{
+ delete m_name2sym;
+}
+
+/** Returns the one and only instance of the HTML entity mapper */
+HtmlEntityMapper *HtmlEntityMapper::instance()
+{
+ if (s_instance==0)
+ {
+ s_instance = new HtmlEntityMapper;
+ }
+ return s_instance;
+}
+
+/** Deletes the one and only instance of the HTML entity mapper */
+void HtmlEntityMapper::deleteInstance()
+{
+ delete s_instance;
+ s_instance=0;
+}
+
+
+/*! @brief Access routine to the UTF8 code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @param useInPrintf If TRUE the result will be escaped such that it can be
+ * used in a printf string pattern
+ * @return the UTF8 code of the HTML entity,
+ * in case the UTF code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::utf8(DocSymbol::SymType symb,bool useInPrintf) const
+{
+ if (useInPrintf && symb==DocSymbol::Sym_Percent)
+ {
+ return "%%"; // escape for printf
+ }
+ else
+ {
+ return g_htmlEntities[symb].UTF8;
+ }
+}
+
+/*! @brief Access routine to the html code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @param useInPrintf If TRUE the result will be escaped such that it can be
+ * used in a printf string pattern
+ * @return the html representation of the HTML entity,
+ * in case the html code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::html(DocSymbol::SymType symb,bool useInPrintf) const
+{
+ if (useInPrintf && symb==DocSymbol::Sym_Percent)
+ {
+ return "%%"; // escape for printf
+ }
+ else
+ {
+ return g_htmlEntities[symb].html;
+ }
+}
+
+/*! @brief Access routine to the XML code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the XML code of the HTML entity,
+ * in case the XML code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::xml(DocSymbol::SymType symb) const
+{
+ return g_htmlEntities[symb].xml;
+}
+
+/*! @brief Access routine to the docbook code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the docbook code of the HTML entity,
+ * in case the docbook code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::docbook(DocSymbol::SymType symb) const
+{
+ return g_htmlEntities[symb].docbook;
+}
+
+/*! @brief Access routine to the LaTeX code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the LaTeX code of the HTML entity,
+ * in case the LaTeX code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::latex(DocSymbol::SymType symb) const
+{
+ return g_htmlEntities[symb].latex;
+}
+
+/*! @brief Access routine to the man code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the man of the HTML entity,
+ * in case the man code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::man(DocSymbol::SymType symb) const
+{
+ return g_htmlEntities[symb].man;
+}
+
+/*! @brief Access routine to the RTF code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the RTF of the HTML entity,
+ * in case the RTF code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::rtf(DocSymbol::SymType symb) const
+{
+ return g_htmlEntities[symb].rtf;
+}
+
+/*! @brief Access routine to the perl struct with the perl code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the pointer to perl struct with the perl code of the HTML entity,
+ * in case the perl code does not exists the NULL pointer is entered in the
+ * \c symb field and in the `DocSymbol::Perl_unknown` in the \c type field.
+ */
+const DocSymbol::PerlSymb *HtmlEntityMapper::perl(DocSymbol::SymType symb) const
+{
+ return &g_htmlEntities[symb].perl;
+}
+
+/*!
+ * @brief Give code of the requested HTML entity name
+ * @param symName HTML entity name without \c & and \c;
+ * @return the code for the requested HTML entity name,
+ * in case the requested HTML item does not exist `DocSymbol::Sym_unknown` is returned.
+ */
+DocSymbol::SymType HtmlEntityMapper::name2sym(const QCString &symName) const
+{
+ int *pSymb = m_name2sym->find(symName);
+ return pSymb ? ((DocSymbol::SymType)*pSymb) : DocSymbol::Sym_Unknown;
+}
+
+void HtmlEntityMapper::writeXMLSchema(FTextStream &t)
+{
+ for (int i=0;i<g_numHtmlEntities - g_numberHtmlMappedCmds;i++)
+ {
+ QCString bareName = g_htmlEntities[i].xml;
+ if (!bareName.isEmpty() && bareName.at(0)=='<' && bareName.right(2)=="/>")
+ {
+ bareName = bareName.mid(1,bareName.length()-3); // strip < and />
+ t << " <xsd:element name=\"" << bareName << "\" type=\"docEmptyType\" />\n";
+ }
+ }
+}
+
+/*! @brief Routine to check if the entries of the html_entities are numbered correctly
+ * @details in case of a mismatch a warning message is given.
+ */
+void HtmlEntityMapper::validate()
+{
+ for (int i = 0; i < g_numHtmlEntities; i++)
+ {
+ if (i != g_htmlEntities[i].symb)
+ {
+ warn_uncond("Internal inconsistency, htmlentries code %d (item=%s)\n",i,g_htmlEntities[i].item);
+ }
+ }
+}
diff --git a/src/htmlentity.h b/src/htmlentity.h
new file mode 100644
index 0000000..d3b268c
--- /dev/null
+++ b/src/htmlentity.h
@@ -0,0 +1,47 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ *
+ * 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 HTMLENTITY_H
+#define HTMLENTITY_H
+
+#include <qdict.h>
+#include "docparser.h"
+
+class FTextStream;
+
+/** @brief Singleton helper class to map html entities to other formats */
+class HtmlEntityMapper
+{
+ public:
+ static HtmlEntityMapper *instance();
+ static void deleteInstance();
+ DocSymbol::SymType name2sym(const QCString &symName) const;
+ const char *utf8(DocSymbol::SymType symb,bool useInPrintf=FALSE) const;
+ const char *html(DocSymbol::SymType symb,bool useInPrintf=FALSE) const;
+ const char *xml(DocSymbol::SymType symb) const;
+ const char *docbook(DocSymbol::SymType symb) const;
+ const char *latex(DocSymbol::SymType symb) const;
+ const char *man(DocSymbol::SymType symb) const;
+ const char *rtf(DocSymbol::SymType symb) const;
+ const DocSymbol::PerlSymb *perl(DocSymbol::SymType symb) const;
+ void writeXMLSchema(FTextStream &t);
+ private:
+ void validate();
+ HtmlEntityMapper();
+ ~HtmlEntityMapper();
+ static HtmlEntityMapper *s_instance;
+ QDict<int> *m_name2sym;
+};
+
+#endif
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 059d0e7..0d399d3 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -1683,7 +1683,7 @@ void HtmlGenerator::startFile(const char *name,const char *,
Doxygen::indexList->addIndexFile(fileName);
lastFile = fileName;
- t << substituteHtmlKeywords(g_header,convertToHtml(title),relPath);
+ t << substituteHtmlKeywords(g_header,convertToHtml(filterTitle(title)),relPath);
t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
<< versionString << " -->" << endl;
@@ -2181,25 +2181,11 @@ void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
void HtmlGenerator::startMemberList()
{
DBG_HTML(t << "<!-- startMemberList -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- //}
- //else
- //{
- // t << "<ul>" << endl;
- //}
}
void HtmlGenerator::endMemberList()
{
DBG_HTML(t << "<!-- endMemberList -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- //}
- //else
- //{
- // t << "</ul>" << endl;
- //}
}
// anonymous type:
@@ -2254,93 +2240,63 @@ void HtmlGenerator::endMemberTemplateParams(const char *anchor,const char *inher
void HtmlGenerator::insertMemberAlign(bool templ)
{
DBG_HTML(t << "<!-- insertMemberAlign -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- QCString className = templ ? "memTemplItemRight" : "memItemRight";
- t << "&#160;</td><td class=\"" << className << "\" valign=\"bottom\">";
- //}
+ QCString className = templ ? "memTemplItemRight" : "memItemRight";
+ t << "&#160;</td><td class=\"" << className << "\" valign=\"bottom\">";
}
void HtmlGenerator::startMemberDescription(const char *anchor,const char *inheritId)
{
DBG_HTML(t << "<!-- startMemberDescription -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
if (m_emptySection)
{
t << "<table class=\"memberdecls\">" << endl;
m_emptySection=FALSE;
}
- t << "<tr class=\"memdesc:" << anchor;
- if (inheritId)
- {
- t << " inherit " << inheritId;
- }
- t << "\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">";
- //}
- //else
- //{
- // t << "<dl class=\"el\"><dd class=\"mdescRight\">";
- //}
+ t << "<tr class=\"memdesc:" << anchor;
+ if (inheritId)
+ {
+ t << " inherit " << inheritId;
+ }
+ t << "\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">";
}
void HtmlGenerator::endMemberDescription()
{
DBG_HTML(t << "<!-- endMemberDescription -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- t << "<br/></td></tr>" << endl;
- //}
- //else
- //{
- // t << "<br/></dl>";
- //}
+ t << "<br /></td></tr>" << endl;
}
void HtmlGenerator::startMemberSections()
{
DBG_HTML(t << "<!-- startMemberSections -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- m_emptySection=TRUE; // we postpone writing <table> until we actually
- // write a row to prevent empty tables, which
- // are not valid XHTML!
- //}
+ m_emptySection=TRUE; // we postpone writing <table> until we actually
+ // write a row to prevent empty tables, which
+ // are not valid XHTML!
}
void HtmlGenerator::endMemberSections()
{
DBG_HTML(t << "<!-- endMemberSections -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- if (!m_emptySection)
- {
- t << "</table>" << endl;
- }
- //}
+ if (!m_emptySection)
+ {
+ t << "</table>" << endl;
+ }
}
void HtmlGenerator::startMemberHeader(const char *anchor)
{
DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- if (!m_emptySection)
- {
- t << "</table>";
- m_emptySection=TRUE;
- }
- if (m_emptySection)
- {
- t << "<table class=\"memberdecls\">" << endl;
- m_emptySection=FALSE;
- }
- t << "<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\">";
- //}
- //else
- //{
- // startGroupHeader(FALSE);
- //}
+ if (!m_emptySection)
+ {
+ t << "</table>";
+ m_emptySection=TRUE;
+ }
+ if (m_emptySection)
+ {
+ t << "<table class=\"memberdecls\">" << endl;
+ m_emptySection=FALSE;
+ }
+ t << "<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\">";
if (anchor)
{
t << "<a name=\"" << anchor << "\"></a>" << endl;
@@ -2350,28 +2306,19 @@ void HtmlGenerator::startMemberHeader(const char *anchor)
void HtmlGenerator::endMemberHeader()
{
DBG_HTML(t << "<!-- endMemberHeader -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- //{
- t << "</h2></td></tr>" << endl;
- //}
- //else
- //{
- // endGroupHeader(FALSE);
- //}
+ t << "</h2></td></tr>" << endl;
}
void HtmlGenerator::startMemberSubtitle()
{
DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- t << "<tr><td class=\"ititle\" colspan=\"2\">";
+ t << "<tr><td class=\"ititle\" colspan=\"2\">";
}
void HtmlGenerator::endMemberSubtitle()
{
DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl)
- //if (Config_getBool("HTML_ALIGN_MEMBERS"))
- t << "</td></tr>" << endl;
+ t << "</td></tr>" << endl;
}
void HtmlGenerator::startIndexList()
@@ -3324,11 +3271,11 @@ void HtmlGenerator::lineBreak(const char *style)
{
if (style)
{
- t << "<br class=\"" << style << "\"/>" << endl;
+ t << "<br class=\"" << style << "\" />" << endl;
}
else
{
- t << "<br/>" << endl;
+ t << "<br />" << endl;
}
}
diff --git a/src/htmlgen.h b/src/htmlgen.h
index 366027d..7b63a6b 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -280,9 +280,9 @@ class HtmlGenerator : public OutputGenerator
{ t << "</table>" << endl; }
void startDescTableTitle()
//{ t << "<tr><td valign=\"top\"><em>"; }
- { t << "<tr><td class=\"fieldname\"><em>"; }
+ { t << "<tr><td class=\"fieldname\">"; }
void endDescTableTitle()
- { t << "</em>&#160;</td>"; }
+ { t << "&#160;</td>"; }
void startDescTableData()
//{ t << "<td>" << endl; }
{ t << "<td class=\"fielddoc\">" << endl; }
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 23d5194..c1e535d 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -35,6 +35,7 @@
#include "groupdef.h"
#include "memberdef.h"
#include "filedef.h"
+#include "util.h"
//----------------------------------------------------------------------------
@@ -54,9 +55,10 @@ class IndexFieldSDict : public SDict<IndexField>
public:
IndexFieldSDict() : SDict<IndexField>(17) {}
~IndexFieldSDict() {}
- int compareItems(QCollection::Item item1, QCollection::Item item2)
+ private:
+ int compareValues(const IndexField *item1, const IndexField *item2) const
{
- return qstricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
+ return qstricmp(item1->name,item2->name);
}
};
@@ -493,9 +495,22 @@ void HtmlHelp::createProjectFile()
// the font-size one is not normally settable by the HTML Help Workshop
// utility but the way to set it is described here:
// http://support.microsoft.com/?scid=kb%3Ben-us%3B240062&x=17&y=18
- t << "main=\"" << recode(Config_getString("PROJECT_NAME")) << "\",\"index.hhc\","
+ // NOTE: the 0x70387e number in addition to the above the Next and Prev button
+ // are shown. They can only be shown in case of a binary toc.
+ // dee http://www.mif2go.com/xhtml/htmlhelp_0016_943addingtabsandtoolbarbuttonstohtmlhelp.htm#Rz108x95873
+ // Value has been taken from htmlhelp.h file of the HTML Help Workshop
+ if (Config_getBool("BINARY_TOC"))
+ {
+ t << "main=\"" << recode(Config_getString("PROJECT_NAME")) << "\",\"index.hhc\","
+ "\"index.hhk\",\"" << indexName << "\",\"" <<
+ indexName << "\",,,,,0x23520,,0x70387e,,,,,,,,0" << endl << endl;
+ }
+ else
+ {
+ t << "main=\"" << recode(Config_getString("PROJECT_NAME")) << "\",\"index.hhc\","
"\"index.hhk\",\"" << indexName << "\",\"" <<
indexName << "\",,,,,0x23520,,0x10387e,,,,,,,,0" << endl << endl;
+ }
t << "[FILES]" << endl;
char *s = indexFiles.first();
@@ -618,14 +633,17 @@ void HtmlHelp::addContentsItem(bool isDir,
Definition * /* def */)
{
// If we're using a binary toc then folders cannot have links.
- if(Config_getBool("BINARY_TOC") && isDir)
- {
- file = 0;
- anchor = 0;
- }
+ // Tried this and I didn't see any problems, when not using
+ // the resetting of file and anchor the TOC works better
+ // (prev / next button)
+ //if(Config_getBool("BINARY_TOC") && isDir)
+ //{
+ //file = 0;
+ //anchor = 0;
+ //}
int i; for (i=0;i<dc;i++) cts << " ";
cts << "<LI><OBJECT type=\"text/sitemap\">";
- cts << "<param name=\"Name\" value=\"" << recode(name) << "\">";
+ cts << "<param name=\"Name\" value=\"" << convertToHtml(recode(name),TRUE) << "\">";
if (file) // made file optional param - KPW
{
if (file && (file[0]=='!' || file[0]=='^')) // special markers for user defined URLs
@@ -691,6 +709,6 @@ void HtmlHelp::addIndexItem(Definition *context,MemberDef *md,
void HtmlHelp::addImageFile(const char *fileName)
{
- imageFiles.append(fileName);
+ if (!imageFiles.contains(fileName)) imageFiles.append(fileName);
}
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
index 85e46e0..574cec9 100644
--- a/src/htmlhelp.h
+++ b/src/htmlhelp.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/image.cpp b/src/image.cpp
index 49485af..3283754 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/image.h b/src/image.h
index d2311a1..ad11a64 100644
--- a/src/image.h
+++ b/src/image.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/index.cpp b/src/index.cpp
index ae96c80..2013a7c 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -122,10 +122,8 @@ class MemberIndexList : public QList<MemberDef>
typedef MemberDef ElementType;
MemberIndexList(uint letter) : QList<MemberDef>(), m_letter(letter) {}
~MemberIndexList() {}
- int compareItems(QCollection::Item item1, QCollection::Item item2)
+ int compareValues(const MemberDef *md1, const MemberDef *md2) const
{
- MemberDef *md1=(MemberDef *)item1;
- MemberDef *md2=(MemberDef *)item2;
int result = qstricmp(md1->name(),md2->name());
if (result==0)
{
@@ -347,7 +345,7 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
(!md->isStatic() || extractStatic)
)
{
- if (md->getOuterScope()==def)
+ if (md->getOuterScope()==def || md->getOuterScope()==Doxygen::globalScope)
{
Doxygen::indexList->addContentsItem(isDir,
md->name(),md->getReference(),md->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
@@ -368,15 +366,18 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
MemberDef *emd;
for (emli.toFirst();(emd=emli.current());++emli)
{
- if (emd->getOuterScope()==def)
+ if (!hideUndocMembers || emd->hasDocumentation())
{
- Doxygen::indexList->addContentsItem(FALSE,
- emd->name(),emd->getReference(),emd->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
- }
- else // inherited member
- {
- Doxygen::indexList->addContentsItem(FALSE,
- emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+ if (emd->getOuterScope()==def || emd->getOuterScope()==Doxygen::globalScope)
+ {
+ Doxygen::indexList->addContentsItem(FALSE,
+ emd->name(),emd->getReference(),emd->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+ }
+ else // inherited member
+ {
+ Doxygen::indexList->addContentsItem(FALSE,
+ emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+ }
}
}
if (!isAnonymous)
@@ -400,9 +401,10 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
{
if (cd->isLinkable() && (cd->partOfGroups()==0 || def->definitionType()==Definition::TypeGroup))
{
+ static bool inlineSimpleStructs = Config_getBool("INLINE_SIMPLE_STRUCTS");
bool isNestedClass = def->definitionType()==Definition::TypeClass;
addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),
- addToIndex && isNestedClass,
+ addToIndex && (isNestedClass || (cd->isSimple() && inlineSimpleStructs)),
preventSeparateIndex || cd->isEmbeddedInOuterScope());
}
}
@@ -628,9 +630,10 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
FileList *fileList=dd->getFiles();
int fileCount=0;
if (fileList && fileList->count()>0)
- {
- FileDef *fd=fileList->first();
- while (fd)
+ {
+ QListIterator<FileDef> it(*fileList);
+ FileDef *fd;
+ for (;(fd=it.current());++it)
{
//static bool allExternals = Config_getBool("ALLEXTERNALS");
//if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject())
@@ -646,13 +649,11 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
{
fileCount++;
}
- fd=fileList->next();
}
if (fileCount>0)
{
startIndexHierarchy(ol,level+1);
- fd=fileList->first();
- while (fd)
+ for (it.toFirst();(fd=it.current());++it)
{
bool doc,src;
doc = fileVisibleInIndex(fd,src);
@@ -678,7 +679,6 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
0,FALSE,FALSE,fd);
}
}
- fd=fileList->next();
}
endIndexHierarchy(ol,level+1);
}
@@ -689,8 +689,9 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
// write files of this directory
if (fileCount>0)
{
- FileDef *fd=fileList->first();
- while (fd)
+ QListIterator<FileDef> it(*fileList);
+ FileDef *fd;
+ for (;(fd=it.current());++it)
{
//static bool allExternals = Config_getBool("ALLEXTERNALS");
//if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject())
@@ -706,7 +707,6 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
FALSE, convertToHtml(fd->name(),TRUE), 0,
fd->getSourceFileBase(), 0, FALSE, TRUE, fd);
}
- fd=fileList->next();
}
}
}
@@ -811,7 +811,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
bool b;
if (cd->getLanguage()==SrcLangExt_VHDL)
{
- if (!(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)
+ if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
{
continue;
}
@@ -1085,6 +1085,82 @@ static void countFiles(int &htmlFiles,int &files)
}
}
+static void writeSingleFileIndex(OutputList &ol,FileDef *fd)
+{
+ //printf("Found filedef %s\n",fd->name().data());
+ bool doc = fd->isLinkableInProject();
+ bool src = fd->generateSourceFile();
+ bool nameOk = !fd->isDocumentationFile();
+ if (nameOk && (doc || src) && !fd->isReference())
+ {
+ QCString path;
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ path=stripFromPath(fd->getPath().copy());
+ }
+ QCString fullName=fd->name();
+ if (!path.isEmpty())
+ {
+ if (path.at(path.length()-1)!='/') fullName.prepend("/");
+ fullName.prepend(path);
+ }
+
+ ol.startIndexKey();
+ ol.docify(path);
+ if (doc)
+ {
+ ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
+ //if (addToIndex)
+ //{
+ // addMembersToIndex(fd,LayoutDocManager::File,fullName,QCString());
+ //}
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(fd->name());
+ ol.endBold();
+ //if (addToIndex)
+ //{
+ // Doxygen::indexList->addContentsItem(FALSE,fullName,0,0,0);
+ //}
+ }
+ if (src)
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.docify(" ");
+ ol.startTextLink(fd->includeName(),0);
+ ol.docify("[");
+ ol.parseText(theTranslator->trCode());
+ ol.docify("]");
+ ol.endTextLink();
+ ol.popGeneratorState();
+ }
+ ol.endIndexKey();
+ bool hasBrief = !fd->briefDescription().isEmpty();
+ ol.startIndexValue(hasBrief);
+ if (hasBrief)
+ {
+ //ol.docify(" (");
+ ol.generateDoc(
+ fd->briefFile(),fd->briefLine(),
+ fd,0,
+ fd->briefDescription(TRUE),
+ FALSE, // index words
+ FALSE, // isExample
+ 0, // example name
+ TRUE, // single line
+ TRUE // link from index
+ );
+ //ol.docify(")");
+ }
+ ol.endIndexValue(fd->getOutputFileBase(),hasBrief);
+ //ol.popGeneratorState();
+ // --------------------------------------------------------
+ }
+}
+
//----------------------------------------------------------------------------
static void writeFileIndex(OutputList &ol)
@@ -1131,135 +1207,67 @@ static void writeFileIndex(OutputList &ol)
OutputNameDict outputNameDict(1009);
OutputNameList outputNameList;
outputNameList.setAutoDelete(TRUE);
-
+
if (Config_getBool("FULL_PATH_NAMES"))
{
// re-sort input files in (dir,file) output order instead of (file,dir) input order
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
QCString path=fd->getPath();
if (path.isEmpty()) path="[external]";
FileList *fl = outputNameDict.find(path);
if (fl)
{
- fl->inSort(fd);
+ fl->append(fd);
//printf("+ inserting %s---%s\n",fd->getPath().data(),fd->name().data());
}
else
{
//printf("o inserting %s---%s\n",fd->getPath().data(),fd->name().data());
fl = new FileList(path);
- fl->inSort(fd);
- outputNameList.inSort(fl);
+ fl->append(fd);
+ outputNameList.append(fl);
outputNameDict.insert(path,fl);
}
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
}
-
+
ol.startIndexList();
- FileList *fl=0;
if (Config_getBool("FULL_PATH_NAMES"))
{
- fl = outputNameList.first();
+ outputNameList.sort();
+ QListIterator<FileList> fnli(outputNameList);
+ FileList *fl;
+ for (fnli.toFirst();(fl=fnli.current());++fnli)
+ {
+ fl->sort();
+ QListIterator<FileDef> it(*fl);
+ FileDef *fd;
+ for (;(fd=it.current());++it)
+ {
+ writeSingleFileIndex(ol,fd);
+ }
+ }
}
else
{
- fl = Doxygen::inputNameList->first();
- }
- while (fl)
- {
- FileDef *fd=fl->first();
- while (fd)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- //printf("Found filedef %s\n",fd->name().data());
- bool doc = fd->isLinkableInProject();
- bool src = fd->generateSourceFile();
- bool nameOk = !fd->isDocumentationFile();
- if (nameOk && (doc || src) &&
- !fd->isReference())
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
- QCString path;
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- path=stripFromPath(fd->getPath().copy());
- }
- QCString fullName=fd->name();
- if (!path.isEmpty())
- {
- if (path.at(path.length()-1)!='/') fullName.prepend("/");
- fullName.prepend(path);
- }
-
- ol.startIndexKey();
- ol.docify(path);
- if (doc)
- {
- ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
- //if (addToIndex)
- //{
- // addMembersToIndex(fd,LayoutDocManager::File,fullName,QCString());
- //}
- }
- else
- {
- ol.startBold();
- ol.docify(fd->name());
- ol.endBold();
- //if (addToIndex)
- //{
- // Doxygen::indexList->addContentsItem(FALSE,fullName,0,0,0);
- //}
- }
- if (src)
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.docify(" ");
- ol.startTextLink(fd->includeName(),0);
- ol.docify("[");
- ol.parseText(theTranslator->trCode());
- ol.docify("]");
- ol.endTextLink();
- ol.popGeneratorState();
- }
- ol.endIndexKey();
- bool hasBrief = !fd->briefDescription().isEmpty();
- ol.startIndexValue(hasBrief);
- if (hasBrief)
- {
- //ol.docify(" (");
- ol.generateDoc(
- fd->briefFile(),fd->briefLine(),
- fd,0,
- fd->briefDescription(TRUE),
- FALSE, // index words
- FALSE, // isExample
- 0, // example name
- TRUE, // single line
- TRUE // link from index
- );
- //ol.docify(")");
- }
- ol.endIndexValue(fd->getOutputFileBase(),hasBrief);
- //ol.popGeneratorState();
- // --------------------------------------------------------
+ writeSingleFileIndex(ol,fd);
}
- fd=fl->next();
- }
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- fl=outputNameList.next();
- }
- else
- {
- fl=Doxygen::inputNameList->next();
}
}
ol.endIndexList();
@@ -1360,7 +1368,10 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
)
)
{
- addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),cd->partOfGroups()==0);
+ addMembersToIndex(cd,LayoutDocManager::Class,
+ cd->displayName(FALSE),
+ cd->anchor(),
+ cd->partOfGroups()==0 && !cd->isSimple());
}
if (count>0)
{
@@ -1402,7 +1413,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
}
}
- if (isLinkable || hasChildren)
+ if ((isLinkable && !showClasses) || hasChildren)
{
ftv->addContentsItem(hasChildren,nd->localName(),ref,file,0,FALSE,TRUE,nd);
@@ -1672,17 +1683,14 @@ class PrefixIgnoreClassList : public ClassList
public:
typedef ClassDef ElementType;
PrefixIgnoreClassList(uint letter) : m_letter(letter) {}
- virtual int compareItems(QCollection::Item item1, QCollection::Item item2)
+ uint letter() const { return m_letter; }
+ private:
+ virtual int compareValue(const ClassDef *c1, const ClassDef *c2) const
{
- ClassDef *c1=(ClassDef *)item1;
- ClassDef *c2=(ClassDef *)item2;
-
QCString n1 = c1->className();
QCString n2 = c2->className();
return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
}
- uint letter() const { return m_letter; }
- private:
uint m_letter;
};
@@ -1734,12 +1742,6 @@ class UsedIndexLetters : public SIntDict<uint>
{
public:
UsedIndexLetters() : SIntDict<uint>(257) { setAutoDelete(TRUE); }
- int compareItems( QCollection::Item item1, QCollection::Item item2)
- {
- int *p1=(int *)item1;
- int *p2=(int *)item2;
- return *p1 - *p2; // subtracting is done by int not uint.
- }
void add(uint letter)
{
uint *v = find(letter);
@@ -1748,6 +1750,11 @@ class UsedIndexLetters : public SIntDict<uint>
append(letter,new uint(letter));
}
}
+ private:
+ int compareValues( const uint *p1, const uint *p2) const
+ {
+ return (int)*p1 - (int)*p2; // subtracting is done by int not uint.
+ }
};
// write an alphabetical index of all class with a header for each letter
@@ -3095,7 +3102,7 @@ static void writePages(PageDef *pd,FTVHelp *ftv)
if (pd->title().isEmpty())
pageTitle=pd->name();
else
- pageTitle=pd->title();
+ pageTitle=filterTitle(pd->title());
if (ftv)
{
@@ -3166,9 +3173,10 @@ static void writePageIndex(OutputList &ol)
PageDef *pd=0;
for (pdi.toFirst();(pd=pdi.current());++pdi)
{
- if (pd->getOuterScope()==0 ||
- pd->getOuterScope()->definitionType()!=Definition::TypePage
- ) // not a sub page
+ if ((pd->getOuterScope()==0 ||
+ pd->getOuterScope()->definitionType()!=Definition::TypePage) && // not a sub page
+ !pd->isReference() // not an external page
+ )
{
writePages(pd,ftv);
}
diff --git a/src/index.h b/src/index.h
index ae15f16..6805655 100644
--- a/src/index.h
+++ b/src/index.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/lang_cfg.h b/src/lang_cfg.h
deleted file mode 100644
index 769696c..0000000
--- a/src/lang_cfg.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#define LANG_AM
-#define LANG_AR
-#define LANG_BR
-#define LANG_CA
-#define LANG_CN
-#define LANG_CZ
-#define LANG_DE
-#define LANG_DK
-#define LANG_EN
-#define LANG_EO
-#define LANG_ES
-#define LANG_FA
-#define LANG_FI
-#define LANG_FR
-#define LANG_GR
-#define LANG_HR
-#define LANG_HU
-#define LANG_ID
-#define LANG_IT
-#define LANG_JE
-#define LANG_JP
-#define LANG_KE
-#define LANG_KR
-#define LANG_LT
-#define LANG_LV
-#define LANG_MK
-#define LANG_NL
-#define LANG_NO
-#define LANG_PL
-#define LANG_PT
-#define LANG_RO
-#define LANG_RU
-#define LANG_SC
-#define LANG_SI
-#define LANG_SK
-#define LANG_SR
-#define LANG_SV
-#define LANG_TR
-#define LANG_TW
-#define LANG_UA
-#define LANG_VI
-#define LANG_ZA
diff --git a/src/language.cpp b/src/language.cpp
index c993323..3b57de1 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -156,16 +156,6 @@
Translator *theTranslator=0;
-static const char obsoleteMsg[] =
- "---------\n"
- "ERROR: The selected language is no longer supported!\n"
- "If you want doxygen to produce output in this language \n"
- "you are kindly requested to help bringing the documentation \n"
- "up to date. Please read the development section of the manual \n"
- "for more information or contact Petr Prikryl (Prikryl@skil.cz).\n"
- "Thanks in advance!\n"
- "---------\n";
-
bool setTranslator(const char *langName)
{
if (L_EQUAL("english"))
diff --git a/src/language.h b/src/language.h
index 9550cb9..4780ab3 100644
--- a/src/language.h
+++ b/src/language.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/languages.py b/src/languages.py
index 0005e88..7ce382a 100755
--- a/src/languages.py
+++ b/src/languages.py
@@ -25,8 +25,8 @@ print """\
<CustomBuildRule
Name="Languages"
DisplayName="Settings"
- CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] &gt; $(InputDir)../src/$(InputName).h"
- Outputs="$(InputDir)../src/$(InputName).h"
+ CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] &gt; $(InpDir)/$(InputName).h"
+ Outputs="$(IntDir)/$(InputName).h"
FileExtensions="*.py"
AdditionalDependencies=""
ExecutionDescription="Executing languages ..."
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 91064a3..eed36bc 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -31,20 +31,27 @@
#include "cite.h"
#include "filedef.h"
#include "config.h"
+#include "htmlentity.h"
static QCString escapeLabelName(const char *s)
{
QCString result;
const char *p=s;
char c;
- while ((c=*p++))
+ if (p)
{
- switch (c)
+ while ((c=*p++))
{
- case '%': result+="\\%"; break;
- case '|': result+="\\texttt{\"|}"; break;
- case '!': result+="\"!"; break;
- default: result+=c;
+ switch (c)
+ {
+ case '%': result+="\\%"; break;
+ case '|': result+="\\texttt{\"|}"; break;
+ case '!': result+="\"!"; break;
+ case '{': result+="\\lcurly{}"; break;
+ case '}': result+="\\rcurly{}"; break;
+ case '~': result+="````~"; break; // to get it a bit better in index together with other special characters
+ default: result+=c;
+ }
}
}
return result;
@@ -69,17 +76,22 @@ QCString LatexDocVisitor::escapeMakeIndexChars(const char *s)
const char *p=s;
char str[2]; str[1]=0;
char c;
- while ((c=*p++))
+ if (p)
{
- switch (c)
+ while ((c=*p++))
{
- case '!': m_t << "\"!"; break;
- case '"': m_t << "\"\""; break;
- case '@': m_t << "\"@"; break;
- case '|': m_t << "\\texttt{\"|}"; break;
- case '[': m_t << "["; break;
- case ']': m_t << "]"; break;
- default: str[0]=c; filter(str); break;
+ switch (c)
+ {
+ case '!': m_t << "\"!"; break;
+ case '"': m_t << "\"\""; break;
+ case '@': m_t << "\"@"; break;
+ case '|': m_t << "\\texttt{\"|}"; break;
+ case '[': m_t << "["; break;
+ case ']': m_t << "]"; break;
+ case '{': m_t << "\\lcurly{}"; break;
+ case '}': m_t << "\\rcurly{}"; break;
+ default: str[0]=c; filter(str); break;
+ }
}
}
return result;
@@ -130,135 +142,25 @@ void LatexDocVisitor::visit(DocWhiteSpace *w)
void LatexDocVisitor::visit(DocSymbol *s)
{
if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "\\textbackslash{}"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: if (m_insidePre) m_t << "<"; else m_t << "$<$";
- break;
- case DocSymbol::Greater: if (m_insidePre) m_t << ">"; else m_t << "$>$"; break;
- case DocSymbol::Amp: m_t << "\\&"; break;
- case DocSymbol::Dollar: m_t << "\\$"; break;
- case DocSymbol::Hash: m_t << "\\#"; break;
- case DocSymbol::DoubleColon: m_t << "::"; break;
- case DocSymbol::Percent: m_t << "\\%"; break;
- case DocSymbol::Pipe: m_t << "$|$"; break;
- case DocSymbol::Copy: m_t << "\\copyright{}"; break;
- case DocSymbol::Tm: m_t << "\\texttrademark{}"; break;
- case DocSymbol::Reg: m_t << "\\textregistered{}"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Lsquo: m_t << "`"; break;
- case DocSymbol::Rsquo: m_t << "'"; break;
- case DocSymbol::Ldquo: m_t << "``"; break;
- case DocSymbol::Rdquo: m_t << "''"; break;
- case DocSymbol::Ndash: m_t << "--"; break;
- case DocSymbol::Mdash: m_t << "---"; break;
- case DocSymbol::Uml:
- if (s->letter()=='i')
- m_t << "\\\"{\\i}";
- else
- m_t << "\\\"{" << s->letter() << "}";
- break;
- case DocSymbol::Acute:
- if (s->letter()=='i')
- m_t << "\\'{\\i}";
- else
- m_t << "\\'{" << s->letter() << "}";
- break;
- case DocSymbol::Grave:
- if (s->letter()=='i')
- m_t << "\\`{\\i}";
- else
- m_t << "\\`{" << s->letter() << "}";
- break;
- case DocSymbol::Circ:
- if (s->letter()=='i')
- m_t << "\\^{\\i}";
- else
- m_t << "\\^{" << s->letter() << "}";
- break;
- case DocSymbol::Slash: if (tolower(s->letter())=='o')
- m_t << "{\\" << s->letter() << "}";
- else
- m_t << s->letter();
- break;
- case DocSymbol::Tilde: m_t << "\\~{" << s->letter() << "}"; break;
- case DocSymbol::Szlig: m_t << "{\\ss}"; break;
- case DocSymbol::Cedil: m_t << "\\c{" << s->letter() << "}"; break;
- case DocSymbol::Ring: m_t << "\\" << s->letter() << s->letter(); break;
- case DocSymbol::Nbsp: m_t << "~"; break;
- case DocSymbol::AElig: m_t << "{\\AE}"; break;
- case DocSymbol::Aelig: m_t << "{\\ae}"; break;
- case DocSymbol::GrkGamma: m_t << "{$\\Gamma$}"; break;
- case DocSymbol::GrkDelta: m_t << "{$\\Delta$}"; break;
- case DocSymbol::GrkTheta: m_t << "{$\\Theta$}"; break;
- case DocSymbol::GrkLambda: m_t << "{$\\Lambda$}"; break;
- case DocSymbol::GrkXi: m_t << "{$\\Xi$}"; break;
- case DocSymbol::GrkPi: m_t << "{$\\Pi$}"; break;
- case DocSymbol::GrkSigma: m_t << "{$\\Sigma$}"; break;
- case DocSymbol::GrkUpsilon: m_t << "{$\\Upsilon$}"; break;
- case DocSymbol::GrkPhi: m_t << "{$\\Phi$}"; break;
- case DocSymbol::GrkPsi: m_t << "{$\\Psi$}"; break;
- case DocSymbol::GrkOmega: m_t << "{$\\Omega$}"; break;
- case DocSymbol::Grkalpha: m_t << "{$\\alpha$}"; break;
- case DocSymbol::Grkbeta: m_t << "{$\\beta$}"; break;
- case DocSymbol::Grkgamma: m_t << "{$\\gamma$}"; break;
- case DocSymbol::Grkdelta: m_t << "{$\\delta$}"; break;
- case DocSymbol::Grkepsilon: m_t << "{$\\varepsilon$}"; break;
- case DocSymbol::Grkzeta: m_t << "{$\\zeta$}"; break;
- case DocSymbol::Grketa: m_t << "{$\\eta$}"; break;
- case DocSymbol::Grktheta: m_t << "{$\\theta$}"; break;
- case DocSymbol::Grkiota: m_t << "{$\\iota$}"; break;
- case DocSymbol::Grkkappa: m_t << "{$\\kappa$}"; break;
- case DocSymbol::Grklambda: m_t << "{$\\lambda$}"; break;
- case DocSymbol::Grkmu: m_t << "{$\\mu$}"; break;
- case DocSymbol::Grknu: m_t << "{$\\nu$}"; break;
- case DocSymbol::Grkxi: m_t << "{$\\xi$}"; break;
- case DocSymbol::Grkpi: m_t << "{$\\pi$}"; break;
- case DocSymbol::Grkrho: m_t << "{$\\rho$}"; break;
- case DocSymbol::Grksigma: m_t << "{$\\sigma$}"; break;
- case DocSymbol::Grktau: m_t << "{$\\tau$}"; break;
- case DocSymbol::Grkupsilon: m_t << "{$\\upsilon$}"; break;
- case DocSymbol::Grkphi: m_t << "{$\\varphi$}"; break;
- case DocSymbol::Grkchi: m_t << "{$\\chi$}"; break;
- case DocSymbol::Grkpsi: m_t << "{$\\psi$}"; break;
- case DocSymbol::Grkomega: m_t << "{$\\omega$}"; break;
- case DocSymbol::Grkvarsigma: m_t << "{$\\varsigma$}"; break;
- case DocSymbol::Section: m_t << "{$\\S$}"; break;
- case DocSymbol::Degree: m_t << "\\textdegree"; break;
- case DocSymbol::Prime: m_t << "'"; break;
- case DocSymbol::DoublePrime: m_t << "''"; break;
- case DocSymbol::Infinity: m_t << "{$\\infty$}"; break;
- case DocSymbol::EmptySet: m_t << "{$\\emptyset$}"; break;
- case DocSymbol::PlusMinus: m_t << "{$\\pm$}"; break;
- case DocSymbol::Times: m_t << "{$\\times$}"; break;
- case DocSymbol::Minus: m_t << "-"; break;
- case DocSymbol::CenterDot: m_t << "{$\\cdot$}"; break;
- case DocSymbol::Partial: m_t << "{$\\partial$}"; break;
- case DocSymbol::Nabla: m_t << "{$\\nabla$}"; break;
- case DocSymbol::SquareRoot: m_t << "{$\\surd$}"; break;
- case DocSymbol::Perpendicular: m_t << "{$\\perp$}"; break;
- case DocSymbol::Sum: m_t << "{$\\sum$}"; break;
- case DocSymbol::Integral: m_t << "{$\\int$}"; break;
- case DocSymbol::Product: m_t << "{$\\prod$}"; break;
- case DocSymbol::Similar: m_t << "{$\\sim$}"; break;
- case DocSymbol::Approx: m_t << "{$\\approx$}"; break;
- case DocSymbol::NotEqual: m_t << "{$\\ne$}"; break;
- case DocSymbol::Equivalent: m_t << "{$\\equiv$}"; break;
- case DocSymbol::Proportional: m_t << "{$\\propto$}"; break;
- case DocSymbol::LessEqual: m_t << "{$\\le$}"; break;
- case DocSymbol::GreaterEqual: m_t << "{$\\ge$}"; break;
- case DocSymbol::LeftArrow: m_t << "{$\\leftarrow$}"; break;
- case DocSymbol::RightArrow: m_t << "{$\\rightarrow$}"; break;
- case DocSymbol::SetIn: m_t << "{$\\in$}"; break;
- case DocSymbol::SetNotIn: m_t << "{$\\notin$}"; break;
- case DocSymbol::LeftCeil: m_t << "{$\\lceil$}"; break;
- case DocSymbol::RightCeil: m_t << "{$\\rceil$}"; break;
- case DocSymbol::LeftFloor: m_t << "{$\\lfloor$}"; break;
- case DocSymbol::RightFloor: m_t << "{$\\rfloor$}"; break;
- default:
- err("unknown symbol found\n");
+ const char *res = HtmlEntityMapper::instance()->latex(s->symbol());
+ if (res)
+ {
+ if (((s->symbol() == DocSymbol::Sym_lt) || (s->symbol() == DocSymbol::Sym_Less))&& (!m_insidePre))
+ {
+ m_t << "$<$";
+ }
+ else if (((s->symbol() == DocSymbol::Sym_gt) || (s->symbol() == DocSymbol::Sym_Greater)) && (!m_insidePre))
+ {
+ m_t << "$>$";
+ }
+ else
+ {
+ m_t << res;
+ }
+ }
+ else
+ {
+ err("LaTeX: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
}
@@ -279,8 +181,7 @@ void LatexDocVisitor::visit(DocURL *u)
void LatexDocVisitor::visit(DocLineBreak *)
{
if (m_hide) return;
- if (m_insideTable) m_t << "\\newline\n";
- else m_t << "\\par\n";
+ m_t << "~\\newline\n";
}
void LatexDocVisitor::visit(DocHorRuler *)
@@ -304,10 +205,10 @@ void LatexDocVisitor::visit(DocStyleChange *s)
if (s->enable()) m_t << "{\\ttfamily "; else m_t << "}";
break;
case DocStyleChange::Subscript:
- if (s->enable()) m_t << "$_{\\mbox{"; else m_t << "}}$ ";
+ if (s->enable()) m_t << "\\textsubscript{"; else m_t << "}";
break;
case DocStyleChange::Superscript:
- if (s->enable()) m_t << "$^{\\mbox{"; else m_t << "}}$ ";
+ if (s->enable()) m_t << "\\textsuperscript{"; else m_t << "}";
break;
case DocStyleChange::Center:
if (s->enable()) m_t << "\\begin{center}"; else m_t << "\\end{center} ";
@@ -466,6 +367,9 @@ void LatexDocVisitor::visit(DocInclude *inc)
break;
case DocInclude::HtmlInclude:
break;
+ case DocInclude::LatexInclude:
+ m_t << inc->text();
+ break;
case DocInclude::VerbInclude:
m_t << "\n\\begin{DoxyVerbInclude}\n";
m_t << inc->text();
@@ -1573,13 +1477,13 @@ void LatexDocVisitor::visitPost(DocText *)
void LatexDocVisitor::visitPre(DocHtmlBlockQuote *)
{
if (m_hide) return;
- m_t << "\\begin{quotation}" << endl;
+ m_t << "\\begin{quote}" << endl;
}
void LatexDocVisitor::visitPost(DocHtmlBlockQuote *)
{
if (m_hide) return;
- m_t << "\\end{quotation}" << endl;
+ m_t << "\\end{quote}" << endl;
}
void LatexDocVisitor::visitPre(DocVhdlFlow *)
@@ -1646,8 +1550,8 @@ void LatexDocVisitor::endLink(const QCString &ref,const QCString &file,const QCS
m_t << "{";
filter(theTranslator->trPageAbbreviation());
m_t << "}{" << file;
- if (!anchor.isEmpty()) m_t << "_" << anchor;
- m_t << "}";
+ if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
+ m_t << anchor << "}";
}
}
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index 4073b7f..d386569 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index e473e79..90591c5 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -293,7 +293,10 @@ static void writeDefaultHeaderPart1(FTextStream &t)
"\\usepackage{makeidx}\n"
"\\usepackage{multicol}\n"
"\\usepackage{multirow}\n"
+ "\\usepackage{fixltx2e}\n" // for \textsubscript
+ "\\PassOptionsToPackage{warn}{textcomp}\n"
"\\usepackage{textcomp}\n"
+ "\\usepackage[nointegrals]{wasysym}\n"
"\\usepackage[table]{xcolor}\n"
"\n";
@@ -323,6 +326,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
" \\fontseries{bc}\\selectfont%\n"
" \\color{darkgray}%\n"
"}\n"
+ "\\newcommand{\\+}{\\discretionary{\\mbox{\\scriptsize$\\hookleftarrow$}}{}{}}\n"
"\n";
// Define page & text layout
@@ -464,7 +468,11 @@ static void writeDefaultHeaderPart1(FTextStream &t)
{
// To avoid duplicate page anchors due to reuse of same numbers for
// the index (be it as roman numbers)
- t << "\\hypersetup{pageanchor=false}\n";
+ t << "\\hypersetup{pageanchor=false,\n"
+ << " bookmarks=true,\n"
+ << " bookmarksnumbered=true,\n"
+ << " pdfencoding=unicode\n"
+ << " }\n";
}
t << "\\pagenumbering{roman}\n"
"\\begin{titlepage}\n"
@@ -592,6 +600,14 @@ void LatexGenerator::startProjectNumber()
t << "\\\\[1ex]\\large ";
}
+static QCString convertToLaTeX(const QCString &s)
+{
+ QGString result;
+ FTextStream t(&result);
+ filterLatexString(t,s,FALSE,FALSE,FALSE);
+ return result.data();
+}
+
void LatexGenerator::startIndexSection(IndexSections is)
{
bool &compactLatex = Config_getBool("COMPACT_LATEX");
@@ -608,9 +624,9 @@ void LatexGenerator::startIndexSection(IndexSections is)
{
QCString header = fileToString(latexHeader);
t << substituteKeywords(header,0,
- Config_getString("PROJECT_NAME"),
- Config_getString("PROJECT_NUMBER"),
- Config_getString("PROJECT_BRIEF"));
+ convertToLaTeX(Config_getString("PROJECT_NAME")),
+ convertToLaTeX(Config_getString("PROJECT_NUMBER")),
+ convertToLaTeX(Config_getString("PROJECT_BRIEF")));
}
}
break;
@@ -726,11 +742,13 @@ void LatexGenerator::startIndexSection(IndexSections is)
case isFileDocumentation:
{
bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
if (fd->isLinkableInProject())
{
@@ -742,9 +760,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
break;
}
}
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
}
break;
@@ -919,11 +935,13 @@ void LatexGenerator::endIndexSection(IndexSections is)
case isFileDocumentation:
{
bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
if (fd->isLinkableInProject())
{
@@ -949,9 +967,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
}
}
}
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
}
break;
@@ -1006,9 +1022,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
{
QCString footer = fileToString(latexFooter);
t << substituteKeywords(footer,0,
- Config_getString("PROJECT_NAME"),
- Config_getString("PROJECT_NUMBER"),
- Config_getString("PROJECT_BRIEF"));
+ convertToLaTeX(Config_getString("PROJECT_NAME")),
+ convertToLaTeX(Config_getString("PROJECT_NUMBER")),
+ convertToLaTeX(Config_getString("PROJECT_BRIEF")));
}
break;
}
@@ -1362,8 +1378,10 @@ void LatexGenerator::startMemberDoc(const char *clname,
t << "}";
if (clname)
{
- t << "!" << clname << "@{";
- docify(clname);
+ t << "!";
+ escapeLabelName(clname);
+ t << "@{";
+ escapeMakeIndexChars(clname);
t << "}";
}
t << "}" << endl;
@@ -2000,13 +2018,18 @@ void LatexGenerator::escapeLabelName(const char *s)
{
switch (c)
{
+ case '|': t << "\\texttt{\"|}"; break;
+ case '!': t << "\"!"; break;
case '%': t << "\\%"; break;
+ case '{': t << "\\lcurly{}"; break;
+ case '}': t << "\\rcurly{}"; break;
+ case '~': t << "````~"; break; // to get it a bit better in index together with other special characters
// NOTE: adding a case here, means adding it to while below as well!
default:
i=0;
// collect as long string as possible, before handing it to docify
result[i++]=c;
- while ((c=*p) && c!='%')
+ while ((c=*p) && c!='|' && c!='!' && c!='%' && c!='{' && c!='}' && c!='~')
{
result[i++]=c;
p++;
@@ -2029,16 +2052,20 @@ void LatexGenerator::escapeMakeIndexChars(const char *s)
{
switch (c)
{
+ case '!': t << "\"!"; break;
case '"': t << "\"\""; break;
case '@': t << "\"@"; break;
+ case '|': t << "\\texttt{\"|}"; break;
case '[': t << "["; break;
case ']': t << "]"; break;
+ case '{': t << "\\lcurly{}"; break;
+ case '}': t << "\\rcurly{}"; break;
// NOTE: adding a case here, means adding it to while below as well!
default:
i=0;
// collect as long string as possible, before handing it to docify
result[i++]=c;
- while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']')
+ while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|')
{
result[i++]=c;
p++;
diff --git a/src/latexgen.h b/src/latexgen.h
index 8e29c01..f68612d 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/layout.cpp b/src/layout.cpp
index bc00745..739a2a3 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/layout.h b/src/layout.h
index 2506076..d50bc7c 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/libdoxycfg.pro.in b/src/libdoxycfg.pro.in
index 6a63828..ab7c36c 100644
--- a/src/libdoxycfg.pro.in
+++ b/src/libdoxycfg.pro.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -17,11 +17,11 @@
TEMPLATE = libdoxycfg.t
CONFIG = console warn_on staticlib $extraopts
HEADERS = config.h configoptions.h portable.h
-SOURCES = config.cpp configoptions.cpp portable.cpp portable_c.c
+SOURCES = ../generated_src/doxygen/config.cpp ../generated_src/doxygen/configoptions.cpp portable.cpp portable_c.c
win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
-INCLUDEPATH += ../qtools
-win32:INCLUDEPATH += .
+DEPENDPATH += ../generated_src/doxygen
+INCLUDEPATH += ../generated_src/doxygen . ../qtools
DESTDIR = ../lib
TARGET = doxycfg
-OBJECTS_DIR = ../objects
+OBJECTS_DIR = ../objects/doxygen
diff --git a/src/libdoxycfg.t.in b/src/libdoxycfg.t.in
index 3a2ce0a..89833f6 100644
--- a/src/libdoxycfg.t.in
+++ b/src/libdoxycfg.t.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -45,9 +45,9 @@ sub GenerateDep {
####################
-#$ GenerateDep("config.cpp","config.l");
- $(LEX) -PconfigYY -t config.l >config.cpp
+#$ GenerateDep("../generated_src/doxygen/config.cpp","config.l");
+ $(LEX) -PconfigYY -t config.l >../generated_src/doxygen/config.cpp
-configoptions.cpp: config.xml configgen.py
- $(PYTHON) configgen.py -cpp config.xml >configoptions.cpp
+../generated_src/doxygen/configoptions.cpp: config.xml configgen.py
+ $(PYTHON) configgen.py -cpp config.xml >../generated_src/doxygen/configoptions.cpp
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
index b230b2f..457db58 100644
--- a/src/libdoxygen.pro.in
+++ b/src/libdoxygen.pro.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -17,7 +17,6 @@
TEMPLATE = libdoxygen.t
CONFIG = console warn_on staticlib $extraopts
HEADERS = arguments.h \
- bib2xhtml.pl.h \
bufstr.h \
cite.h \
clangparser.h \
@@ -27,7 +26,6 @@ HEADERS = arguments.h \
code.h \
commentcnv.h \
commentscan.h \
- compound.xsd.h \
condparser.h \
config.h \
context.h \
@@ -47,41 +45,27 @@ HEADERS = arguments.h \
docvisitor.h \
dot.h \
doxygen.h \
- doxygen.bst.h \
- doxygen.css.h \
- doxygen.sty.h \
eclipsehelp.h \
entry.h \
example.h \
filedef.h \
filename.h \
- footer.html.h \
formula.h \
ftextstream.h \
ftvhelp.h \
groupdef.h \
- header.html.h \
htags.h \
htmlattrib.h \
htmldocvisitor.h \
htmlgen.h \
htmlhelp.h \
+ htmlentity.h \
image.h \
index.h \
- index.xsd.h \
- jquery_p1.js.h \
- jquery_p2.js.h \
- jquery_p3.js.h \
- jquery_ui.js.h \
- jquery_fx.js.h \
- jquery_pt.js.h \
- svgpan.js.h \
- dynsections.js.h \
language.h \
latexdocvisitor.h \
latexgen.h \
layout.h \
- layout_default.xml.h \
logos.h \
mandocvisitor.h \
mangen.h \
@@ -96,8 +80,6 @@ HEADERS = arguments.h \
msc.h \
dia.h \
namespacedef.h \
- navtree.css.h \
- navtree.js.h \
objcache.h \
outputgen.h \
outputlist.h \
@@ -114,17 +96,11 @@ HEADERS = arguments.h \
qhp.h \
qhpxmlwriter.h \
reflist.h \
- resize.js.h \
rtfdocvisitor.h \
rtfgen.h \
rtfstyle.h \
scanner.h \
searchindex.h \
- search.css.h \
- search.js.h \
- extsearch.js.h \
- search_functions.php.h \
- search_opensearch.php.h \
section.h \
sortdict.h \
store.h \
@@ -143,34 +119,26 @@ HEADERS = arguments.h \
xmldocvisitor.h \
xmlgen.h \
docbookvisitor.h \
- docbookgen.h
+ docbookgen.h \
SOURCES = arguments.cpp \
- constexp.cpp \
- ce_parse.cpp \
cite.cpp \
clangparser.cpp \
classdef.cpp \
classlist.cpp \
cmdmapper.cpp \
- code.cpp \
- commentcnv.cpp \
- commentscan.cpp \
condparser.cpp \
context.cpp \
cppvalue.cpp \
dbusxmlscanner.cpp \
debug.cpp \
defgen.cpp \
- declinfo.cpp \
- defargs.cpp \
define.cpp \
definition.cpp \
diagram.cpp \
dirdef.cpp \
docparser.cpp \
docsets.cpp \
- doctokenizer.cpp \
dot.cpp \
doxygen.cpp \
eclipsehelp.cpp \
@@ -180,13 +148,12 @@ SOURCES = arguments.cpp \
formula.cpp \
ftextstream.cpp \
ftvhelp.cpp \
- fortrancode.cpp \
- fortranscanner.cpp \
groupdef.cpp \
htags.cpp \
htmldocvisitor.cpp \
htmlgen.cpp \
htmlhelp.cpp \
+ htmlentity.cpp \
image.cpp \
index.cpp \
language.cpp \
@@ -213,46 +180,53 @@ SOURCES = arguments.cpp \
outputlist.cpp \
pagedef.cpp \
perlmodgen.cpp \
- pre.cpp \
- pycode.cpp \
- pyscanner.cpp \
qhp.cpp \
qhpxmlwriter.cpp \
reflist.cpp \
rtfdocvisitor.cpp \
rtfgen.cpp \
rtfstyle.cpp \
- scanner.cpp \
searchindex.cpp \
store.cpp \
tagreader.cpp \
- tclscanner.cpp \
template.cpp \
textdocvisitor.cpp \
tooltip.cpp \
util.cpp \
- version.cpp \
- vhdlcode.cpp \
vhdldocgen.cpp \
- vhdlparser.cpp \
- vhdlscanner.cpp \
xmldocvisitor.cpp \
xmlgen.cpp \
docbookvisitor.cpp \
- docbookgen.cpp
+ docbookgen.cpp \
+ ../generated_src/doxygen/ce_parse.cpp \
+ ../generated_src/doxygen/constexp.cpp \
+ ../generated_src/doxygen/vhdlcode.cpp \
+ ../generated_src/doxygen/vhdlparser.cpp \
+ ../generated_src/doxygen/vhdlscanner.cpp \
+ ../generated_src/doxygen/code.cpp \
+ ../generated_src/doxygen/commentcnv.cpp \
+ ../generated_src/doxygen/commentscan.cpp \
+ ../generated_src/doxygen/declinfo.cpp \
+ ../generated_src/doxygen/defargs.cpp \
+ ../generated_src/doxygen/doctokenizer.cpp \
+ ../generated_src/doxygen/pre.cpp \
+ ../generated_src/doxygen/pycode.cpp \
+ ../generated_src/doxygen/pyscanner.cpp \
+ ../generated_src/doxygen/scanner.cpp \
+ ../generated_src/doxygen/tclscanner.cpp \
+ ../generated_src/doxygen/fortrancode.cpp \
+ ../generated_src/doxygen/fortranscanner.cpp \
+ ../generated_src/doxygen/version.cpp
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-msvc:TMAKE_CXXFLAGS += -Zm200
win32-g++:TMAKE_CXXFLAGS += -fno-exceptions
-linux-g++:TMAKE_CXXFLAGS += -fno-exceptions
-INCLUDEPATH += ../qtools
-#INCLUDEPATH += ../libpng
-INCLUDEPATH += ../libmd5
+linux-g++:TMAKE_CXXFLAGS += -fno-exceptions
+INCLUDEPATH += ../generated_src/doxygen ../src ../qtools ../libmd5
INCLUDEPATH += %%SQLITE3_INC%%
+DEPENDPATH += ../generated_src/doxygen
win32:INCLUDEPATH += .
-#win32-g++:INCLUDEPATH = ../qtools /usr/include/libpng12 ../libmd5
-win32-g++:INCLUDEPATH = ../qtools ../libmd5
DESTDIR = ../lib
TARGET = doxygen
-OBJECTS_DIR = ../objects
+OBJECTS_DIR = ../objects/doxygen
diff --git a/src/libdoxygen.t.in b/src/libdoxygen.t.in
index f131f70..173f90b 100644
--- a/src/libdoxygen.t.in
+++ b/src/libdoxygen.t.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -21,10 +21,12 @@ YACC = %%BISON%%
PYTHON = %%PYTHON%%
PERL = %%PERL%%
INCBUFSIZE = $(PYTHON) increasebuffer.py
+GENERATED_SRC = ../generated_src/doxygen
+GENERATED_OBJ = ../objects/doxygen
#${
sub GenerateDep {
- my($obj,$src,$dep) = @_;
+ my($obj,$src,@deps) = @_;
my(@objv,$srcv,$i,$s,$o,$d,$c);
@objv = split(/\s+/,$obj);
@srcv = split(/\s+/,$src);
@@ -33,7 +35,9 @@ sub GenerateDep {
$o = $objv[$i];
next if $s eq "";
$text .= $o . ": " . $s;
- $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
+ foreach my $dep (@deps) {
+ $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
+ }
if ( $moc_output{$s} ne "" ) {
$text .= " ${linebreak}\n\t\t" . $moc_output{$s};
}
@@ -49,170 +53,164 @@ sub GenerateLex {
if ($caseOpt) {
$text .= "-i ";
}
- $text .= "-P".$name."YY -t ".$name.".l | \$(INCBUFSIZE) >".$name.".cpp";
+ $text .= "-P".$name."YY -t ".$name.".l | \$(INCBUFSIZE) > \$(GENERATED_SRC)/".$name.".cpp";
}
#$}
####################
-#$ GenerateDep("scanner.cpp","scanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/scanner.cpp","scanner.l");
#$ GenerateLex("scanner",0);
-#$ GenerateDep("code.cpp","code.l");
+#$ GenerateDep("\$(GENERATED_SRC)/code.cpp","code.l");
#$ GenerateLex("code",0);
-#$ GenerateDep("pyscanner.cpp","pyscanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/pyscanner.cpp","pyscanner.l");
#$ GenerateLex("pyscanner",0);
-#$ GenerateDep("pycode.cpp","pycode.l");
+#$ GenerateDep("\$(GENERATED_SRC)/pycode.cpp","pycode.l");
#$ GenerateLex("pycode",0);
-#$ GenerateDep("fortranscanner.cpp","fortranscanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/fortranscanner.cpp","fortranscanner.l");
#$ GenerateLex("fortranscanner",1);
-#$ GenerateDep("fortrancode.cpp","fortrancode.l");
+#$ GenerateDep("\$(GENERATED_SRC)/fortrancode.cpp","fortrancode.l");
#$ GenerateLex("fortrancode",1);
-#$ GenerateDep("vhdlcode.cpp","vhdlcode.l");
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlcode.cpp","vhdlcode.l");
#$ GenerateLex("vhdlcode",1);
-#$ GenerateDep("tclscanner.cpp","tclscanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/tclscanner.cpp","tclscanner.l");
#$ GenerateLex("tclscanner",1);
-#$ GenerateDep("pre.cpp","pre.l");
+#$ GenerateDep("\$(GENERATED_SRC)/pre.cpp","pre.l");
#$ GenerateLex("pre",0);
-#$ GenerateDep("declinfo.cpp","declinfo.l");
+#$ GenerateDep("\$(GENERATED_SRC)/declinfo.cpp","declinfo.l");
#$ GenerateLex("declinfo",0);
-#$ GenerateDep("defargs.cpp","defargs.l");
+#$ GenerateDep("\$(GENERATED_SRC)/defargs.cpp","defargs.l");
#$ GenerateLex("defargs",0);
-#$ GenerateDep("doctokenizer.cpp","doctokenizer.l");
+#$ GenerateDep("\$(GENERATED_SRC)/doctokenizer.cpp","doctokenizer.l");
#$ GenerateLex("doctokenizer",0);
-#$ GenerateDep("commentcnv.cpp","commentcnv.l");
+#$ GenerateDep("\$(GENERATED_SRC)/commentcnv.cpp","commentcnv.l");
#$ GenerateLex("commentcnv",0);
-#$ GenerateDep("commentscan.cpp","commentscan.l");
+#$ GenerateDep("\$(GENERATED_SRC)/commentscan.cpp","commentscan.l");
#$ GenerateLex("commentscan",0);
-#$ GenerateDep("constexp.cpp","constexp.l","ce_parse.h");
+#$ GenerateDep("\$(GENERATED_SRC)/constexp.cpp","constexp.l","\$(GENERATED_SRC)/ce_parse.h");
#$ GenerateLex("constexp",0);
-#$ GenerateDep("ce_parse.cpp","constexp.y");
- $(YACC) -l -p constexpYY constexp.y -o ce_parse.cpp
+#$ GenerateDep("\$(GENERATED_SRC)/ce_parse.cpp","constexp.y");
+ $(YACC) -l -p constexpYY constexp.y -o \$(GENERATED_SRC)/ce_parse.cpp
-#$ GenerateDep("ce_parse.h","constexp.y");
- $(YACC) -l -d -p ce_parsexpYY constexp.y -o ce_parse.c
- -rm ce_parse.c
+#$ GenerateDep("\$(GENERATED_SRC)/ce_parse.h","constexp.y");
+ $(YACC) -l -d -p ce_parsexpYY constexp.y -o \$(GENERATED_SRC)/ce_parse.c
+ -rm $(GENERATED_SRC)/ce_parse.c
-#$ GenerateDep("vhdlscanner.cpp","vhdlscanner.l","vhdlparser.h");
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlscanner.cpp","vhdlscanner.l","\$(GENERATED_SRC)/vhdlparser.h");
#$ GenerateLex("vhdlscanner",1);
-#$ GenerateDep("vhdlparser.cpp","vhdlparser.y");
- $(YACC) -l -p vhdlscannerYY vhdlparser.y -o vhdlparser.cpp
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlparser.cpp","vhdlparser.y");
+ $(YACC) -l -p vhdlscannerYY vhdlparser.y -o \$(GENERATED_SRC)/vhdlparser.cpp
-#$ GenerateDep("vhdlparser.h","vhdlparser.y");
- $(YACC) -l -d -p vhdlscannerYY vhdlparser.y -o vhdlparser.c
- -rm vhdlparser.c
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlparser.h","vhdlparser.y");
+ $(YACC) -l -d -p vhdlscannerYY vhdlparser.y -o \$(GENERATED_SRC)/vhdlparser.c
+ -rm $(GENERATED_SRC)/vhdlparser.c
-#$ GenerateDep("layout.cpp","layout_default.xml.h");
-
TO_C_CMD=$(PYTHON) to_c_cmd.py < $< > $@
-cite.cpp: doxygen.bst.h bib2xhtml.pl.h
+#$ GenerateDep("layout.cpp","\$(GENERATED_SRC)/layout_default.xml.h");
-ftvhelp.cpp: navtree.js.h resize.js.h navtree.css.h
+#$ GenerateDep("cite.cpp","\$(GENERATED_SRC)/doxygen.bst.h","\$(GENERATED_SRC)/bib2xhtml.pl.h");
-htmlgen.cpp: header.html.h footer.html.h doxygen.css.h search_functions.php.h \
- search_opensearch.php.h search.css.h jquery_p1.js.h jquery_p2.js.h \
- jquery_p3.js.h jquery_ui.js.h jquery_fx.js.h jquery_pt.js.h \
- svgpan.js.h dynsections.js.h extsearch.js.h
+#$ GenerateDep("ftvhelp.cpp","\$(GENERATED_SRC)/navtree.js.h","\$(GENERATED_SRC)/resize.js.h","\$(GENERATED_SRC)/navtree.css.h");
-layout.cpp: layout_default.xml.h
+#$ GenerateDep("htmlgen.cpp","\$(GENERATED_SRC)/header.html.h","\$(GENERATED_SRC)/footer.html.h","\$(GENERATED_SRC)/doxygen.css.h","\$(GENERATED_SRC)/search_functions.php.h","\$(GENERATED_SRC)/search_opensearch.php.h","\$(GENERATED_SRC)/search.css.h","\$(GENERATED_SRC)/jquery_p1.js.h","\$(GENERATED_SRC)/jquery_p2.js.h","\$(GENERATED_SRC)/jquery_p3.js.h","\$(GENERATED_SRC)/jquery_ui.js.h","\$(GENERATED_SRC)/jquery_fx.js.h","\$(GENERATED_SRC)/jquery_pt.js.h","\$(GENERATED_SRC)/svgpan.js.h","\$(GENERATED_SRC)/dynsections.js.h","\$(GENERATED_SRC)/extsearch.js.h");
-xmlgen.cpp: index.xsd.h compound.xsd.h
+#$ GenerateDep("xmlgen.cpp","\$(GENERATED_SRC)/index.xsd.h","\$(GENERATED_SRC)/compound.xsd.h");
-latexgen.cpp: doxygen.sty.h
+#$ GenerateDep("latexgen.cpp","\$(GENERATED_SRC)/doxygen.sty.h");
-searchindex.cpp: search.js.h
+#$ GenerateDep("searchindex.cpp","\$(GENERATED_SRC)/search.js.h");
-index.xsd.h: index.xsd
+$(GENERATED_SRC)/index.xsd.h: index.xsd
$(TO_C_CMD)
-compound.xsd.h: compound.xsd
+$(GENERATED_SRC)/compound.xsd.h: compound.xsd
$(TO_C_CMD)
-layout_default.xml.h: layout_default.xml
+$(GENERATED_SRC)/layout_default.xml.h: layout_default.xml
$(TO_C_CMD)
-header.html.h: header.html
+$(GENERATED_SRC)/header.html.h: header.html
$(TO_C_CMD)
-footer.html.h: footer.html
+$(GENERATED_SRC)/footer.html.h: footer.html
$(TO_C_CMD)
-search_functions.php.h: search_functions.php
+$(GENERATED_SRC)/search_functions.php.h: search_functions.php
$(TO_C_CMD)
-search_opensearch.php.h: search_opensearch.php
+$(GENERATED_SRC)/search_opensearch.php.h: search_opensearch.php
$(TO_C_CMD)
-search.js.h: search.js
+$(GENERATED_SRC)/search.js.h: search.js
$(TO_C_CMD)
-search.css.h: search.css
+$(GENERATED_SRC)/search.css.h: search.css
$(TO_C_CMD)
-extsearch.js.h: extsearch.js
+$(GENERATED_SRC)/extsearch.js.h: extsearch.js
$(TO_C_CMD)
-doxygen.css.h: doxygen.css
+$(GENERATED_SRC)/doxygen.css.h: doxygen.css
$(TO_C_CMD)
-doxygen.sty.h: doxygen.sty
+$(GENERATED_SRC)/doxygen.sty.h: doxygen.sty
$(TO_C_CMD)
-
-navtree.js.h: navtree.js
+$(GENERATED_SRC)/navtree.js.h: navtree.js
$(TO_C_CMD)
-resize.js.h: resize.js
+$(GENERATED_SRC)/resize.js.h: resize.js
$(TO_C_CMD)
-jquery_p1.js.h: jquery_p1.js
+$(GENERATED_SRC)/jquery_p1.js.h: jquery_p1.js
$(TO_C_CMD)
-jquery_p2.js.h: jquery_p2.js
+$(GENERATED_SRC)/jquery_p2.js.h: jquery_p2.js
$(TO_C_CMD)
-jquery_p3.js.h: jquery_p3.js
+$(GENERATED_SRC)/jquery_p3.js.h: jquery_p3.js
$(TO_C_CMD)
-jquery_ui.js.h: jquery_ui.js
+$(GENERATED_SRC)/jquery_ui.js.h: jquery_ui.js
$(TO_C_CMD)
-jquery_fx.js.h: jquery_fx.js
+$(GENERATED_SRC)/jquery_fx.js.h: jquery_fx.js
$(TO_C_CMD)
-jquery_pt.js.h: jquery_pt.js
+$(GENERATED_SRC)/jquery_pt.js.h: jquery_pt.js
$(TO_C_CMD)
-navtree.css.h: navtree.css
+$(GENERATED_SRC)/navtree.css.h: navtree.css
$(TO_C_CMD)
-svgpan.js.h: svgpan.js
+$(GENERATED_SRC)/svgpan.js.h: svgpan.js
$(TO_C_CMD)
-dynsections.js.h: dynsections.js
+$(GENERATED_SRC)/dynsections.js.h: dynsections.js
$(TO_C_CMD)
-doxygen.bst.h: doxygen.bst
+$(GENERATED_SRC)/doxygen.bst.h: doxygen.bst
$(TO_C_CMD)
-bib2xhtml.pl.h: bib2xhtml.pl
+$(GENERATED_SRC)/bib2xhtml.pl.h: bib2xhtml.pl
$(TO_C_CMD)
-version.cpp: ../configure
- $(PYTHON) version.py
+$(GENERATED_SRC)/version.cpp: ../configure
+ $(PYTHON) version.py $(GENERATED_SRC)
diff --git a/src/lodepng.cpp b/src/lodepng.cpp
index df8378e..b237d5a 100644
--- a/src/lodepng.cpp
+++ b/src/lodepng.cpp
@@ -1146,10 +1146,10 @@ static unsigned encodeLZ77_brute(uivector* out, const unsigned char* in, size_t
}
#endif
+/*
static const unsigned HASH_NUM_VALUES = 65536;
static const unsigned HASH_NUM_CHARACTERS = 6;
static const unsigned HASH_SHIFT = 2;
-/*
Good and fast values: HASH_NUM_VALUES=65536, HASH_NUM_CHARACTERS=6, HASH_SHIFT=2
making HASH_NUM_CHARACTERS larger (like 8), makes the file size larger but is a bit faster
making HASH_NUM_CHARACTERS smaller (like 3), makes the file size smaller but is slower
diff --git a/src/logos.cpp b/src/logos.cpp
index 6aea996..9a9e5db 100644
--- a/src/logos.cpp
+++ b/src/logos.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/logos.h b/src/logos.h
index 13406e1..083d772 100644
--- a/src/logos.h
+++ b/src/logos.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/main.cpp b/src/main.cpp
index 09798ec..b64f700 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
index 729f3d4..5403324 100644
--- a/src/mandocvisitor.cpp
+++ b/src/mandocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -29,6 +29,7 @@
#include "message.h"
#include "parserintf.h"
#include "filedef.h"
+#include "htmlentity.h"
ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,
const char *langExt)
@@ -75,42 +76,15 @@ void ManDocVisitor::visit(DocWhiteSpace *w)
void ManDocVisitor::visit(DocSymbol *s)
{
if (m_hide) return;
- switch(s->symbol())
+ const char *res = HtmlEntityMapper::instance()->man(s->symbol());
+ if (res)
{
- case DocSymbol::BSlash: m_t << "\\\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "<"; break;
- case DocSymbol::Greater: m_t << ">"; break;
- case DocSymbol::Amp: m_t << "&"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::DoubleColon: m_t << "::"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Pipe: m_t << "|"; break;
- case DocSymbol::Copy: m_t << "(C)"; break;
- case DocSymbol::Tm: m_t << "(TM)"; break;
- case DocSymbol::Reg: m_t << "(R)"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Lsquo: m_t << "`"; break;
- case DocSymbol::Rsquo: m_t << "'"; break;
- case DocSymbol::Ldquo: m_t << "``"; break;
- case DocSymbol::Rdquo: m_t << "''"; break;
- case DocSymbol::Ndash: m_t << "--"; break;
- case DocSymbol::Mdash: m_t << "---"; break;
- case DocSymbol::Uml: m_t << s->letter() << "\\*(4"; break;
- case DocSymbol::Acute: m_t << s->letter() << "\\*(`"; break;
- case DocSymbol::Grave: m_t << s->letter() << "\\*:"; break;
- case DocSymbol::Circ: m_t << s->letter() << "\\*^"; break;
- case DocSymbol::Slash: m_t << s->letter(); break; /* todo: implement this */
- case DocSymbol::Tilde: m_t << s->letter() << "\\*~"; break;
- case DocSymbol::Szlig: m_t << "s\\*:"; break;
- case DocSymbol::Cedil: m_t << s->letter() << "\\*,"; break;
- case DocSymbol::Ring: m_t << s->letter() << "\\*o"; break;
- case DocSymbol::Nbsp: m_t << " "; break;
- default:
- // unsupport symbol for man page :-(
- break;
+ m_t << res;
+ }
+ else
+ {
+ // no error or warning to be supplied
+ // err("man: non supported HTML-entity found: &%s;\n",get_symbol_item(s->symbol()));
}
m_firstCol=FALSE;
}
@@ -288,6 +262,8 @@ void ManDocVisitor::visit(DocInclude *inc)
break;
case DocInclude::HtmlInclude:
break;
+ case DocInclude::LatexInclude:
+ break;
case DocInclude::VerbInclude:
if (!m_firstCol) m_t << endl;
m_t << ".PP" << endl;
diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h
index 7012152..a5906d0 100644
--- a/src/mandocvisitor.h
+++ b/src/mandocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/mangen.cpp b/src/mangen.cpp
index a50ee73..cf6795b 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -64,9 +64,19 @@ static QCString getExtension()
return ext;
}
+static QCString getSubdir()
+{
+ QCString dir = Config_getString("MAN_SUBDIR");
+ if (dir.isEmpty())
+ {
+ dir = "man" + getExtension();
+ }
+ return dir;
+}
+
ManGenerator::ManGenerator() : OutputGenerator()
{
- dir=Config_getString("MAN_OUTPUT")+"/man" + getExtension();
+ dir=Config_getString("MAN_OUTPUT") + "/" + getSubdir();
firstCol=TRUE;
paragraph=TRUE;
col=0;
@@ -106,10 +116,10 @@ void ManGenerator::init()
err("Could not create output directory %s\n",manOutput.data());
exit(1);
}
- d.setPath(manOutput+"/man"+ext);
- if (!d.exists() && !d.mkdir(manOutput+"/man"+ext))
+ d.setPath(manOutput + "/" + getSubdir());
+ if (!d.exists() && !d.mkdir(manOutput + "/" + getSubdir()))
{
- err("Could not create output directory %s/man%s\n",manOutput.data(),ext.data());
+ err("Could not create output directory %s/%s\n",manOutput.data(), getSubdir().data());
exit(1);
}
createSubDirs(d);
@@ -445,7 +455,7 @@ void ManGenerator::startDoxyAnchor(const char *,const char *manName,
FTextStream linkstream;
linkstream.setDevice(&linkfile);
//linkstream.setEncoding(QTextStream::UnicodeUTF8);
- linkstream << ".so man" << getExtension() << "/" << buildFileName( manName ) << endl;
+ linkstream << ".so " << getSubdir() << "/" << buildFileName( manName ) << endl;
}
}
linkfile.close();
diff --git a/src/mangen.h b/src/mangen.h
index 7ac5ae1..98ef959 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/markdown.cpp b/src/markdown.cpp
index ac824f4..291e1dc 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -48,6 +48,7 @@
#include "commentcnv.h"
#include "config.h"
#include "section.h"
+#include "message.h"
//-----------
@@ -90,6 +91,7 @@ static QDict<LinkRef> g_linkRefs(257);
static action_t g_actions[256];
static Entry *g_current;
static QCString g_fileName;
+static int g_lineNr;
// In case a markdown page starts with a level1 header, that header is used
// as a title of the page, in effect making it a level0 header, so the
@@ -1002,6 +1004,16 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
if (c=='[' || c==']' || c=='*' || c=='+' || c=='-' ||
c=='!' || c=='(' || c==')' || c=='.' || c=='`' || c=='_')
{
+ if (c=='-' && size>3 && data[2]=='-' && data[3]=='-') // \---
+ {
+ out.addStr(&data[1],3);
+ return 4;
+ }
+ else if (c=='-' && size>2 && data[2]=='-') // \--
+ {
+ out.addStr(&data[1],2);
+ return 3;
+ }
out.addStr(&data[1],1);
return 2;
}
@@ -1133,8 +1145,8 @@ static int isLinkRef(const char *data,int size,
while (i<size && data[i]==' ') i++;
if (i<size && data[i]=='\n')
{
- i++;
eol=i;
+ i++;
while (i<size && data[i]==' ') i++;
}
if (i>=size)
@@ -1152,6 +1164,7 @@ static int isLinkRef(const char *data,int size,
int titleStart=i;
// search for end of the line
while (i<size && data[i]!='\n') i++;
+ eol = i;
// search back to matching character
int end=i-1;
@@ -1166,8 +1179,7 @@ static int isLinkRef(const char *data,int size,
//printf("end of isLinkRef: i=%d size=%d data[i]='%c' eol=%d\n",
// i,size,data[i],eol);
if (i>=size) return i; // end of buffer while ref id was found
- else if (data[i]=='\n') return i+1; // end of line while ref id was found
- else if (eol) return eol; // no optional title found
+ else if (eol) return eol; // end of line while ref id was found
return 0; // invalid link ref
}
@@ -1467,7 +1479,7 @@ int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
eol=i+1;
i--;
while (i>0 && data[i]==' ') i--;
- if (i>0 && data[i]=='|') i--,n++; // trailing | does not count
+ if (i>0 && data[i-1]!='\\' && data[i]=='|') i--,n++; // trailing or escaped | does not count
end = i;
// count columns between start and end
@@ -1690,12 +1702,27 @@ void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size)
out.addStr(" ");
out.addStr(header);
out.addStr("\n");
- SectionInfo *si = new SectionInfo(g_fileName,id,header,type,level);
- if (g_current)
+ SectionInfo *si = Doxygen::sectionDict->find(header);
+ if (si)
{
- g_current->anchors->append(si);
+ if (si->lineNr != -1)
+ {
+ warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",header.data(),si->fileName.data(),si->lineNr);
+ }
+ else
+ {
+ warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s)",header.data(),si->fileName.data());
+ }
+ }
+ else
+ {
+ si = new SectionInfo(g_fileName,g_lineNr,id,header,type,level);
+ if (g_current)
+ {
+ g_current->anchors->append(si);
+ }
+ Doxygen::sectionDict->append(header,si);
}
- Doxygen::sectionDict->append(header,si);
}
else
{
@@ -1725,7 +1752,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
{
// find end of this line
end=i+1;
- while (end<size && data[end-1]!='\n') end++;
+ while (end<=size && data[end-1]!='\n') end++;
int j=i;
int level=0;
int indent=i;
@@ -1753,7 +1780,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
{
for (l=level;l<curLevel;l++)
{
- out.addStr("\n</blockquote>\n");
+ out.addStr("</blockquote>\n");
}
}
curLevel=level;
@@ -1766,7 +1793,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
// end of comment within blockquote => add end markers
for (l=0;l<curLevel;l++)
{
- out.addStr("\n</blockquote>\n");
+ out.addStr("</blockquote>\n");
}
return i;
}
@@ -1781,7 +1808,7 @@ static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent)
{
// find end of this line
end=i+1;
- while (end<size && data[end-1]!='\n') end++;
+ while (end<=size && data[end-1]!='\n') end++;
int j=i;
int indent=0;
while (j<end && data[j]==' ') j++,indent++;
@@ -1828,7 +1855,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
// find end of the line
int nb=0;
end=i+1;
- while (end<size && data[end-1]!='\n')
+ while (end<=size && data[end-1]!='\n')
{
// while looking for the end of the line we might encounter a block
// that needs to be passed unprocessed.
@@ -1892,12 +1919,12 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
}
else if (nb==0 && data[end-1]=='`')
{
- while (end<size && data[end-1]=='`') end++,nb++;
+ while (end<=size && data[end-1]=='`') end++,nb++;
}
else if (nb>0 && data[end-1]=='`')
{
int enb=0;
- while (end<size && data[end-1]=='`') end++,enb++;
+ while (end<=size && data[end-1]=='`') end++,enb++;
if (enb==nb) nb=0;
}
else
@@ -1908,12 +1935,29 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
//printf("findEndOfLine pi=%d i=%d end=%d {%s}\n",pi,i,end,QCString(data+i).left(end-i).data());
}
+static void writeFencedCodeBlock(GrowBuf &out,const char *data,const char *lng,
+ int blockStart,int blockEnd)
+{
+ QCString lang = lng;
+ if (!lang.isEmpty() && lang.at(0)=='.') lang=lang.mid(1);
+ out.addStr("@code");
+ if (!lang.isEmpty())
+ {
+ out.addStr("{"+lang+"}");
+ }
+ out.addStr(data+blockStart,blockEnd-blockStart);
+ out.addStr("\n");
+ out.addStr("@endcode");
+}
+
static QCString processQuotations(const QCString &s,int refIndent)
{
GrowBuf out;
const char *data = s.data();
int size = s.length();
int i=0,end=0,pi=-1;
+ int blockStart,blockEnd,blockOffset;
+ QCString lang;
while (i<size)
{
findEndOfLine(out,data,size,pi,i,end);
@@ -1921,7 +1965,15 @@ static QCString processQuotations(const QCString &s,int refIndent)
if (pi!=-1)
{
- if (isBlockQuote(data+pi,i-pi,refIndent))
+ if (isFencedCodeBlock(data+pi,size-pi,refIndent,lang,blockStart,blockEnd,blockOffset))
+ {
+ writeFencedCodeBlock(out,data+pi,lang,blockStart,blockEnd);
+ i=pi+blockOffset;
+ pi=-1;
+ end=i+1;
+ continue;
+ }
+ else if (isBlockQuote(data+pi,i-pi,refIndent))
{
i = pi+writeBlockQuote(out,data+pi,size-pi);
pi=-1;
@@ -1968,7 +2020,7 @@ static QCString processBlocks(const QCString &s,int indent)
// get indent for the first line
end = i+1;
int sp=0;
- while (end<size && data[end-1]!='\n')
+ while (end<=size && data[end-1]!='\n')
{
if (data[end-1]==' ') sp++;
end++;
@@ -2020,13 +2072,28 @@ static QCString processBlocks(const QCString &s,int indent)
out.addStr(" ");
out.addStr(header);
out.addStr("\n\n");
- SectionInfo *si = new SectionInfo(g_fileName,id,header,
- level==1 ? SectionInfo::Section : SectionInfo::Subsection,level);
- if (g_current)
+ SectionInfo *si = Doxygen::sectionDict->find(header);
+ if (si)
{
- g_current->anchors->append(si);
+ if (si->lineNr != -1)
+ {
+ warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",header.data(),si->fileName.data(),si->lineNr);
+ }
+ else
+ {
+ warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s)",header.data(),si->fileName.data());
+ }
+ }
+ else
+ {
+ si = new SectionInfo(g_fileName,g_lineNr,id,header,
+ level==1 ? SectionInfo::Section : SectionInfo::Subsection,level);
+ if (g_current)
+ {
+ g_current->anchors->append(si);
+ }
+ Doxygen::sectionDict->append(header,si);
}
- Doxygen::sectionDict->append(header,si);
}
else
{
@@ -2057,15 +2124,7 @@ static QCString processBlocks(const QCString &s,int indent)
{
//printf("Found FencedCodeBlock lang='%s' start=%d end=%d code={%s}\n",
// lang.data(),blockStart,blockEnd,QCString(data+pi+blockStart).left(blockEnd-blockStart).data());
- if (!lang.isEmpty() && lang.at(0)=='.') lang=lang.mid(1);
- out.addStr("@code");
- if (!lang.isEmpty())
- {
- out.addStr("{"+lang+"}");
- }
- out.addStr(data+pi+blockStart,blockEnd-blockStart);
- out.addStr("\n");
- out.addStr("@endcode");
+ writeFencedCodeBlock(out,data+pi,lang,blockStart,blockEnd);
i=pi+blockOffset;
pi=-1;
end=i+1;
@@ -2101,7 +2160,7 @@ static QCString processBlocks(const QCString &s,int indent)
{
//printf("found link ref: id='%s' link='%s' title='%s'\n",
// id.data(),link.data(),title.data());
- g_linkRefs.insert(id,new LinkRef(link,title));
+ g_linkRefs.insert(id.lower(),new LinkRef(link,title));
}
else
{
@@ -2152,7 +2211,6 @@ static QCString extractPageTitle(QCString &docs,QCString &id)
{
docs=docs.mid(end1);
}
- id = extractTitleId(title);
//printf("extractPageTitle(title='%s' docs='%s' id='%s')\n",title.data(),docs.data(),id.data());
return title;
}
@@ -2214,7 +2272,7 @@ static QCString detab(const QCString &s,int &refIndent)
//---------------------------------------------------------------------------
-QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input)
+QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &input)
{
static bool init=FALSE;
if (!init)
@@ -2237,6 +2295,7 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input
g_linkRefs.clear();
g_current = e;
g_fileName = fileName;
+ g_lineNr = lineNr;
static GrowBuf out;
if (input.isEmpty()) return input;
out.clear();
@@ -2279,14 +2338,7 @@ void MarkdownFileParser::parseInput(const char *fileName,
current->fileName = fileName;
current->docFile = fileName;
current->docLine = 1;
- int len = qstrlen(fileBuf);
- BufStr input(len);
- BufStr output(len);
- input.addArray(fileBuf,qstrlen(fileBuf));
- input.addChar('\0');
- convertCppComments(&input,&output,fileName);
- output.addChar('\0');
- QCString docs = output.data();
+ QCString docs = fileBuf;
QCString id;
QCString title=extractPageTitle(docs,id).stripWhiteSpace();
QCString titleFn = QFileInfo(fileName).baseName().utf8();
diff --git a/src/markdown.h b/src/markdown.h
index d3a845e..5e35259 100644
--- a/src/markdown.h
+++ b/src/markdown.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -22,7 +22,7 @@
class Entry;
/** processes string \a s and converts markdown into doxygen/html commands. */
-QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &s);
+QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &s);
QCString markdownFileNameToId(const QCString &fileName);
class MarkdownFileParser : public ParserInterface
diff --git a/src/marshal.cpp b/src/marshal.cpp
index a6b3e75..04f426d 100644
--- a/src/marshal.cpp
+++ b/src/marshal.cpp
@@ -139,6 +139,7 @@ void marshalSectionInfoList(StorageIntf *s, QList<SectionInfo> *anchors)
marshalQCString(s,si->ref);
marshalInt(s,(int)si->type);
marshalQCString(s,si->fileName);
+ marshalInt(s,si->lineNr);
marshalInt(s,si->level);
}
}
@@ -546,8 +547,9 @@ QList<SectionInfo> *unmarshalSectionInfoList(StorageIntf *s)
QCString ref = unmarshalQCString(s);
SectionInfo::SectionType type = (SectionInfo::SectionType)unmarshalInt(s);
QCString fileName = unmarshalQCString(s);
+ int lineNr = unmarshalInt(s);
int level = unmarshalInt(s);
- result->append(new SectionInfo(fileName,label,title,type,level,ref));
+ result->append(new SectionInfo(fileName,lineNr,label,title,type,level,ref));
}
return result;
}
diff --git a/src/marshal.h b/src/marshal.h
index 977a89b..0c61276 100644
--- a/src/marshal.h
+++ b/src/marshal.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 4d7ea9f..a1b23e8 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -133,13 +133,14 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
if (md->getLanguage()==SrcLangExt_Tcl)
{
if (defArgList->count()==0) return FALSE;
- Argument *a=defArgList->first();
+ ArgumentListIterator ali(*defArgList);
+ Argument *a;
ol.endMemberDocName();
ol.startParameterList(FALSE);
ol.startParameterType(TRUE,0);
ol.endParameterType();
ol.startParameterName(FALSE);
- while (a)
+ for (;(a=ali.current());++ali)
{
if (a->defval.isEmpty())
{
@@ -149,7 +150,6 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
{
ol.docify("?"+a->name+"? ");
}
- a=defArgList->next();
}
ol.endParameterName(TRUE,FALSE,FALSE);
return TRUE;
@@ -181,7 +181,6 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
ol.popGeneratorState();
//printf("===> name=%s isDefine=%d\n",md->name().data(),md->isDefine());
- Argument *a=defArgList->first();
QCString cName;
if (cd)
{
@@ -208,6 +207,8 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
bool first=TRUE;
bool paramTypeStarted=FALSE;
bool isDefine = md->isDefine();
+ ArgumentListIterator ali(*defArgList);
+ Argument *a=ali.current();
while (a)
{
if (isDefine || first)
@@ -302,7 +303,8 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
ol.endTypewriter();
}
- a=defArgList->next();
+ ++ali;
+ a=ali.current();
if (a)
{
if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
@@ -432,7 +434,8 @@ static void writeExceptionList(OutputList &ol, ClassDef *cd, MemberDef *md)
static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
{
ol.docify("template<");
- Argument *a=al->first();
+ ArgumentListIterator ali(*al);
+ Argument *a = ali.current();
while (a)
{
ol.docify(a->type);
@@ -443,7 +446,8 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
ol.docify(" = ");
ol.docify(a->defval);
}
- a=al->next();
+ ++ali;
+ a=ali.current();
if (a) ol.docify(", ");
}
ol.docify("> ");
@@ -975,7 +979,7 @@ QCString MemberDef::getOutputFileBase() const
);
return "dummy";
}
- else if (separateMemberPages)
+ else if (separateMemberPages && isDetailedSectionLinkable())
{
if (getEnumScope()) // enum value, which is part of enum's documentation
{
@@ -1348,7 +1352,7 @@ bool MemberDef::isBriefSectionVisible() const
bool visibleIfNotDefaultCDTor = !(cOrDTor &&
m_impl->defArgList &&
(m_impl->defArgList->isEmpty() ||
- m_impl->defArgList->first()->type == "void"
+ m_impl->defArgList->getFirst()->type == "void"
) &&
!hasDocs
);
@@ -1414,6 +1418,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
_writeTagData(compoundType);
+ _addToSearchIndex();
QCString cname = d->name();
QCString cdname = d->displayName();
@@ -1568,7 +1573,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
);
}
bool htmlOn = ol.isEnabled(OutputGenerator::Html);
- if (htmlOn && /*Config_getBool("HTML_ALIGN_MEMBERS") &&*/ !ltype.isEmpty())
+ if (htmlOn && !ltype.isEmpty())
{
ol.disable(OutputGenerator::Html);
}
@@ -1787,11 +1792,12 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.writeDoc(rootNode,getOuterScope()?getOuterScope():d,this);
if (detailsVisible)
{
+ static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
//ol.endEmphasis();
ol.docify(" ");
- if (m_impl->group!=0 && gd==0) // forward link to the group
+ if (separateMemberPages || (m_impl->group!=0 && gd==0)) // forward link to the page or group
{
ol.startTextLink(getOutputFileBase(),anchor());
}
@@ -1895,7 +1901,7 @@ bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const
static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
bool groupFilter = getGroupDef()==0 || inGroup || separateMemPages;
bool fileFilter = getNamespaceDef()==0 || !inFile;
- bool simpleFilter = !hideUndocMembers && inlineSimpleStructs &&
+ bool simpleFilter = (hasBriefDescription() || !hideUndocMembers) && inlineSimpleStructs &&
getClassDef()!=0 && getClassDef()->isSimple();
bool visible = isDetailedSectionLinkable() && groupFilter && fileFilter &&
@@ -2286,8 +2292,9 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
//printf("** %s: enum values=%d\n",name().data(),fmdl!=0 ? fmdl->count() : 0);
if (fmdl)
{
- MemberDef *fmd=fmdl->first();
- while (fmd)
+ MemberListIterator it(*fmdl);
+ MemberDef *fmd;
+ for (;(fmd=it.current());++it)
{
//printf("Enum %p: isLinkable()=%d\n",fmd,fmd->isLinkable());
if (fmd->isLinkable())
@@ -2312,7 +2319,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
Doxygen::indexList->addIndexItem(container,fmd);
//ol.writeListItem();
- ol.startDescTableTitle(); // this enables emphasis!
+ ol.startDescTableTitle();
ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
first=FALSE;
//ol.startEmphasis();
@@ -2349,7 +2356,6 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
}
ol.endDescTableData();
}
- fmd=fmdl->next();
}
}
if (!first)
@@ -2696,6 +2702,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (sp!=-1)
{
ldef=ldef.left(sp+1)+ldef.mid(ep+2);
+ } else {
+ ldef=ldef.mid(ep+2);
}
}
// strip keywords
@@ -3036,6 +3044,18 @@ static Definition *getClassFromType(Definition *scope,const QCString &type,SrcLa
}
#endif
+QCString MemberDef::fieldType() const
+{
+ QCString type = m_impl->accessorType;
+ if (type.isEmpty())
+ {
+ type = m_impl->type;
+ }
+
+ if (isTypedef()) type.prepend("typedef ");
+ return simplifyTypeForTable(type);
+}
+
void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
{
Definition *scope = getOuterScope();
@@ -3056,15 +3076,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
ol.startInlineMemberType();
ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
- QCString type = m_impl->accessorType;
- if (type.isEmpty())
- {
- type = m_impl->type;
- }
-
- if (isTypedef()) type.prepend("typedef ");
-
- QCString ts = simplifyTypeForTable(type);
+ QCString ts = fieldType();
if (cd) // cd points to an anonymous struct pointed to by this member
// so we add a link to it from the type column.
@@ -3599,7 +3611,6 @@ void MemberDef::_writeTagData(const DefType compoundType)
}
writeDocAnchorsToTagFile();
Doxygen::tagFile << " </member>" << endl;
- _addToSearchIndex();
}
m_impl->tagDataWritten |= typeMask;
}
@@ -3709,11 +3720,11 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
uint numVisibleEnumValues=0;
if (fmdl)
{
- MemberDef *fmd=fmdl->first();
- while (fmd)
+ MemberListIterator mli(*fmdl);
+ MemberDef *fmd;
+ for (mli.toFirst();(fmd=mli.current());++mli)
{
if (fmd->isBriefSectionVisible()) numVisibleEnumValues++;
- fmd=fmdl->next();
}
}
if (numVisibleEnumValues==0 && !isBriefSectionVisible())
@@ -3729,6 +3740,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
if (isLinkableInProject() || hasDocumentedEnumValues())
{
_writeTagData(compoundType);
+ _addToSearchIndex();
writeLink(typeDecl,cd,nd,fd,gd);
}
else
@@ -3753,7 +3765,8 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
typeDecl.docify("{ ");
if (fmdl)
{
- MemberDef *fmd=fmdl->first();
+ MemberListIterator mli(*fmdl);
+ MemberDef *fmd=mli.current();
bool fmdVisible = fmd->isBriefSectionVisible();
while (fmd)
{
@@ -3776,6 +3789,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
if (fmd->hasDocumentation()) // enum value has docs
{
fmd->_writeTagData(compoundType);
+ fmd->_addToSearchIndex();
fmd->writeLink(typeDecl,cd,nd,fd,gd);
}
else // no docs for this enum value
@@ -3793,7 +3807,8 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
}
bool prevVisible = fmdVisible;
- fmd=fmdl->next();
+ ++mli;
+ fmd=mli.current();
if (fmd && (fmdVisible=fmd->isBriefSectionVisible()))
{
typeDecl.writeString(", ");
@@ -3855,6 +3870,11 @@ void MemberDef::setAccessorType(ClassDef *cd,const char *t)
m_impl->accessorType = t;
}
+ClassDef *MemberDef::accessorClass() const
+{
+ return m_impl->accessorClass;
+}
+
void MemberDef::findSectionsInDocumentation()
{
docFindSections(documentation(),this,0,docFile());
diff --git a/src/memberdef.h b/src/memberdef.h
index 47912b8..3259102 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -81,6 +81,7 @@ class MemberDef : public Definition
ClassDef *getClassDef() const;
FileDef *getFileDef() const;
NamespaceDef* getNamespaceDef() const;
+ ClassDef *accessorClass() const;
// grabbing the property read/write accessor names
const char *getReadAccessor() const;
@@ -251,7 +252,7 @@ class MemberDef : public Definition
// overrules
QCString documentation() const;
QCString briefDescription(bool abbr=FALSE) const;
-
+ QCString fieldType() const;
//-----------------------------------------------------------------------------------
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 2df4a89..84567e2 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -75,7 +75,7 @@ void MemberGroup::insertMember(MemberDef *md)
// md->getSectionList(m_parent),
// md,md->name().data());
- MemberDef *firstMd = memberList->first();
+ MemberDef *firstMd = memberList->getFirst();
if (inSameSection && memberList->count()>0 &&
firstMd->getSectionList(m_parent)!=md->getSectionList(m_parent))
{
@@ -215,8 +215,9 @@ int MemberGroup::countInheritableMembers(ClassDef *inheritedFrom) const
void MemberGroup::distributeMemberGroupDocumentation()
{
//printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
- MemberDef *md=memberList->first();
- while (md)
+ MemberListIterator li(*memberList);
+ MemberDef *md;
+ for (li.toFirst();(md=li.current());++li)
{
//printf("checking md=%s\n",md->name().data());
// find the first member of the group with documentation
@@ -228,16 +229,15 @@ void MemberGroup::distributeMemberGroupDocumentation()
//printf("found it!\n");
break;
}
- md=memberList->next();
}
if (md) // distribute docs of md to other members of the list
{
//printf("Member %s has documentation!\n",md->name().data());
- MemberDef *omd=memberList->first();
- while (omd)
+ MemberDef *omd;
+ for (li.toFirst();(omd=li.current());++li)
{
- if (md!=omd && omd->documentation().isEmpty() &&
- omd->briefDescription().isEmpty() &&
+ if (md!=omd && omd->documentation().isEmpty() &&
+ omd->briefDescription().isEmpty() &&
omd->inbodyDocumentation().isEmpty()
)
{
@@ -246,7 +246,6 @@ void MemberGroup::distributeMemberGroupDocumentation()
omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
omd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
}
- omd=memberList->next();
}
}
}
diff --git a/src/membergroup.h b/src/membergroup.h
index c5a2d0c..42e60c5 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -125,9 +125,10 @@ class MemberGroupSDict : public SIntDict<MemberGroup>
public:
MemberGroupSDict(int size=17) : SIntDict<MemberGroup>(size) {}
~MemberGroupSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const MemberGroup *item1,const MemberGroup *item2) const
{
- return ((MemberGroup *)item1)->groupId() - ((MemberGroup*)item2)->groupId();
+ return item1->groupId() - item2->groupId();
}
};
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 101293a..28ed37e 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -55,11 +55,9 @@ MemberList::~MemberList()
delete memberGroupList;
}
-int MemberList::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberList::compareValues(const MemberDef *c1, const MemberDef *c2) const
{
static bool sortConstructorsFirst = Config_getBool("SORT_MEMBERS_CTORS_1ST");
- MemberDef *c1=(MemberDef *)item1;
- MemberDef *c2=(MemberDef *)item2;
if (sortConstructorsFirst) {
int ord1 = c1->isConstructor() ? 2 : (c1->isDestructor() ? 1 : 0);
int ord2 = c2->isConstructor() ? 2 : (c2->isDestructor() ? 1 : 0);
@@ -381,9 +379,18 @@ void MemberList::writePlainDeclarations(OutputList &ol,
}
ol.startMemberDeclaration();
ol.startMemberItem(md->anchor(),0,inheritId);
+ bool detailsLinkable = md->isDetailedSectionLinkable();
+ if (!detailsLinkable)
+ {
+ ol.startDoxyAnchor(md->getOutputFileBase(),0,md->anchor(),md->name(),QCString());
+ }
ol.writeString("enum ");
ol.insertMemberAlign();
md->writeEnumDeclaration(ol,cd,nd,fd,gd,compoundType);
+ if (!detailsLinkable)
+ {
+ ol.endDoxyAnchor(md->getOutputFileBase(),md->anchor());
+ }
ol.endMemberItem();
if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
@@ -696,52 +703,53 @@ void MemberList::writeDocumentationPage(OutputList &ol,
MemberDef *md;
for ( ; (md=mli.current()) ; ++mli)
{
- QCString diskName=md->getOutputFileBase();
- QCString title=md->qualifiedName();
- startFile(ol,diskName,md->name(),title,HLI_None,!generateTreeView,
- container->getOutputFileBase());
- if (!generateTreeView)
+ if (md->isDetailedSectionLinkable())
{
- container->writeNavigationPath(ol);
- ol.endQuickIndices();
- }
- ol.startContents();
-
+ QCString diskName=md->getOutputFileBase();
+ QCString title=md->qualifiedName();
+ startFile(ol,diskName,md->name(),title,HLI_None,!generateTreeView,diskName);
+ if (!generateTreeView)
+ {
+ container->writeNavigationPath(ol);
+ ol.endQuickIndices();
+ }
+ ol.startContents();
- if (generateTreeView)
- {
- md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
- ol.endContents();
- endFileWithNavPath(container,ol);
- }
- else
- {
- ol.writeString("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"
- " <tr>\n"
- " <td valign=\"top\">\n");
+ if (generateTreeView)
+ {
+ md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
+ ol.endContents();
+ endFileWithNavPath(container,ol);
+ }
+ else
+ {
+ ol.writeString("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"
+ " <tr>\n"
+ " <td valign=\"top\">\n");
- container->writeQuickMemberLinks(ol,md);
+ container->writeQuickMemberLinks(ol,md);
- ol.writeString(" </td>\n");
- ol.writeString(" <td valign=\"top\" class=\"mempage\">\n");
+ ol.writeString(" </td>\n");
+ ol.writeString(" <td valign=\"top\" class=\"mempage\">\n");
- md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
+ md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
- ol.writeString(" </td>\n");
- ol.writeString(" </tr>\n");
- ol.writeString("</table>\n");
+ ol.writeString(" </td>\n");
+ ol.writeString(" </tr>\n");
+ ol.writeString("</table>\n");
- endFile(ol);
+ endFile(ol);
+ }
}
- }
- if (memberGroupList)
- {
- //printf("MemberList::writeDocumentation() -- member groups\n");
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
+ if (memberGroupList)
{
- mg->writeDocumentationPage(ol,scopeName,container);
+ //printf("MemberList::writeDocumentation() -- member groups\n");
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->writeDocumentationPage(ol,scopeName,container);
+ }
}
}
}
@@ -938,15 +946,9 @@ QCString MemberList::listTypeAsString(MemberListType type)
//--------------------------------------------------------------------------
-int MemberSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberSDict::compareValues(const MemberDef *c1, const MemberDef *c2) const
{
- // NOTE: this function can be triggered from unmarshalMemberSDict
- // so it may not result in called to MemberDef::makeResident().
- // As a result, the data returned by MemberDef::name() and
- // MemberDef::getDefLine() will always be kept in memory.
- MemberDef *c1=(MemberDef *)item1;
- MemberDef *c2=(MemberDef *)item2;
- //printf("MemberSDict::compareItems(%s,%s)\n",c1->name().data(),c2->name().data());
+ //printf("MemberSDict::compareValues(%s,%s)\n",c1->name().data(),c2->name().data());
int cmp = qstricmp(c1->name(),c2->name());
if (cmp)
{
diff --git a/src/memberlist.h b/src/memberlist.h
index 9dfa104..607eb01 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -40,7 +40,6 @@ class MemberList : public QList<MemberDef>
bool insert(uint index,const MemberDef *md);
void inSort(const MemberDef *md);
void append(const MemberDef *md);
- int compareItems(QCollection::Item item1,QCollection::Item item2);
int varCount() const { ASSERT(m_numDecMembers!=-1); return m_varCnt; }
int funcCount() const { ASSERT(m_numDecMembers!=-1); return m_funcCnt; }
int enumCount() const { ASSERT(m_numDecMembers!=-1); return m_enumCnt; }
@@ -82,6 +81,7 @@ class MemberList : public QList<MemberDef>
void unmarshal(StorageIntf *s);
private:
+ int compareValues(const MemberDef *item1,const MemberDef *item2) const;
int m_varCnt;
int m_funcCnt;
int m_enumCnt;
@@ -121,7 +121,8 @@ class MemberSDict : public SDict<MemberDef>
public:
MemberSDict(int size=17) : SDict<MemberDef>(size) {}
virtual ~MemberSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2);
+ private:
+ int compareValues(const MemberDef *item1,const MemberDef *item2) const;
};
diff --git a/src/membername.cpp b/src/membername.cpp
index 58eaf8c..a2f7296 100644
--- a/src/membername.cpp
+++ b/src/membername.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -30,10 +30,8 @@ MemberName::~MemberName()
{
}
-int MemberName::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberName::compareValues(const MemberDef *m1, const MemberDef *m2) const
{
- MemberDef *m1=(MemberDef *)item1;
- MemberDef *m2=(MemberDef *)item2;
ClassDef *c1=m1->getClassDef();
ClassDef *c2=m2->getClassDef();
FileDef *f1=m1->getFileDef();
@@ -52,10 +50,8 @@ MemberNameInfo::MemberNameInfo(const char *n) : QList<MemberInfo>()
setAutoDelete(TRUE);
}
-int MemberNameInfo::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberNameInfo::compareValues(const MemberInfo *m1,const MemberInfo *m2) const
{
- MemberInfo *m1=(MemberInfo *)item1;
- MemberInfo *m2=(MemberInfo *)item2;
ClassDef *c1=m1->memberDef->getClassDef();
ClassDef *c2=m2->memberDef->getClassDef();
FileDef *f1=m1->memberDef->getFileDef();
@@ -72,12 +68,10 @@ MemberNameIterator::MemberNameIterator(const MemberName &mnlist) :
{
}
-int MemberNameSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberNameSDict::compareValues(const MemberName *n1,const MemberName *n2) const
{
- MemberName *n1=(MemberName *)item1;
- MemberName *n2=(MemberName *)item2;
return qstricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
- n2->memberName()+getPrefixIndex(n2->memberName())
- );
+ n2->memberName()+getPrefixIndex(n2->memberName())
+ );
}
diff --git a/src/membername.h b/src/membername.h
index 0004aea..7a2fdc5 100644
--- a/src/membername.h
+++ b/src/membername.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -24,14 +24,14 @@
/** Class representing all MemberDef objects with the same name */
class MemberName : public QList<MemberDef>
-{
+{
public:
MemberName(const char *name);
~MemberName();
const char *memberName() const { return name; }
-
- int compareItems(QCollection::Item item1,QCollection::Item item2);
+
private:
+ int compareValues(const MemberDef *item1,const MemberDef *item2) const;
QCString name;
};
@@ -49,7 +49,8 @@ class MemberNameSDict : public SDict<MemberName>
MemberNameSDict(int size) : SDict<MemberName>(size) {}
~MemberNameSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2);
+ private:
+ int compareValues(const MemberName *item1,const MemberName *item2) const;
};
/** Data associated with a MemberDef in an inheritance relation. */
@@ -74,8 +75,8 @@ class MemberNameInfo : public QList<MemberInfo>
MemberNameInfo(const char *name);
~MemberNameInfo() {}
const char *memberName() const { return name; }
- int compareItems(QCollection::Item item1,QCollection::Item item2);
private:
+ int compareValues(const MemberInfo *item1,const MemberInfo *item2) const;
QCString name;
};
@@ -93,11 +94,10 @@ class MemberNameInfoSDict : public SDict<MemberNameInfo>
public:
MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {}
~MemberNameInfoSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
- { return qstricmp(
- ((MemberNameInfo *)item1)->memberName(),
- ((MemberNameInfo *)item2)->memberName()
- );
+ private:
+ int compareValues(const MemberNameInfo *item1,const MemberNameInfo *item2) const
+ {
+ return qstricmp(item1->memberName(), item2->memberName());
}
};
diff --git a/src/message.cpp b/src/message.cpp
index dd3549a..8e4ecbd 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -13,7 +13,6 @@
*
*/
-#include <stdarg.h>
#include <stdio.h>
#include <qdatetime.h>
#include "config.h"
@@ -22,6 +21,7 @@
#include "doxygen.h"
#include "portable.h"
#include "filedef.h"
+#include "message.h"
static QCString outputFormat;
static const char *warning_str = "warning: ";
@@ -110,7 +110,7 @@ void msg(const char *fmt, ...)
va_list args;
va_start(args, fmt);
vfprintf(stdout, fmt, args);
- va_end(args);
+ va_end(args);
}
}
@@ -172,6 +172,11 @@ void warn(const char *file,int line,const char *fmt, ...)
va_end(args);
}
+void va_warn(const char *file,int line,const char *fmt,va_list args)
+{
+ do_warn("WARNINGS", file, line, warning_str, fmt, args);
+}
+
void warn_simple(const char *file,int line,const char *text)
{
if (!Config_getBool("WARNINGS")) return; // warning type disabled
diff --git a/src/message.h b/src/message.h
index b7bdfe4..481e8bf 100644
--- a/src/message.h
+++ b/src/message.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,9 +19,11 @@
#define MESSAGE_H
#include <stdio.h>
+#include <stdarg.h>
extern void msg(const char *fmt, ...);
extern void warn(const char *file,int line,const char *fmt, ...);
+extern void va_warn(const char *file,int line,const char *fmt, va_list args);
extern void warn_simple(const char *file,int line,const char *text);
extern void warn_undoc(const char *file,int line,const char *fmt, ...);
extern void warn_doc_error(const char *file,int line,const char *fmt, ...);
diff --git a/src/msc.cpp b/src/msc.cpp
index 3592e76..ebbba0f 100644
--- a/src/msc.cpp
+++ b/src/msc.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/msc.h b/src/msc.h
index 961f544..5d71ebd 100644
--- a/src/msc.h
+++ b/src/msc.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index d00d845..2aa5728 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -68,6 +68,10 @@ NamespaceDef::NamespaceDef(const char *df,int dl,int dc,
{
m_type = CONSTANT_GROUP;
}
+ else if (type && !strcmp("library", type))
+ {
+ m_type = LIBRARY;
+ }
else
{
m_type = NAMESPACE;
@@ -248,11 +252,17 @@ void NamespaceDef::computeAnchors()
if (allMemberList) setAnchors(allMemberList);
}
+bool NamespaceDef::hasDetailedDescription() const
+{
+ static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+ return ((!briefDescription().isEmpty() && repeatBrief) ||
+ !documentation().isEmpty());
+}
+
+
void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title)
{
- if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
- !documentation().isEmpty()
- )
+ if (hasDetailedDescription())
{
ol.pushGeneratorState();
ol.disable(OutputGenerator::Html);
@@ -280,6 +290,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
//ol.newParagraph(); // FIXME:PARA
ol.enableAll();
ol.disableAllBut(OutputGenerator::Man);
+ ol.enable(OutputGenerator::Latex);
ol.writeString("\n\n");
ol.popGeneratorState();
}
@@ -293,7 +304,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
void NamespaceDef::writeBriefDescription(OutputList &ol)
{
- if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ if (hasBriefDescription())
{
DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
@@ -306,9 +317,7 @@ void NamespaceDef::writeBriefDescription(OutputList &ol)
ol.writeString(" \n");
ol.enable(OutputGenerator::RTF);
- if (Config_getBool("REPEAT_BRIEF") ||
- !documentation().isEmpty()
- )
+ if (hasDetailedDescription())
{
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(0,"details");
@@ -655,7 +664,7 @@ void NamespaceDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) co
MemberDef *md;
for (mli.toFirst();(md=mli.current());++mli)
{
- if (md->getNamespaceDef()==this && md->isLinkable())
+ if (md->getNamespaceDef()==this && md->isLinkable() && !md->isEnumValue())
{
ol.writeString(" <tr><td class=\"navtab\">");
if (md->isLinkableInProject())
@@ -916,29 +925,9 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
continue; // will be output in another pass, see layout_default.xml
ol.startMemberDeclaration();
ol.startMemberItem(nd->getOutputFileBase(),0);
- if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
- {
- ol.docify("package ");
- }
- else if (lang==SrcLangExt_Fortran)
- {
- ol.docify("module ");
- }
- else if (lang==SrcLangExt_IDL)
- {
- if (nd->isModule())
- {
- ol.docify("module ");
- }
- else if (nd->isConstantGroup())
- {
- ol.docify("constants");
- }
- else
- {
- err("Internal inconsistency: namespace in IDL not module or cg\n");
- }
- }
+ QCString ct = nd->compoundTypeString();
+ ol.docify(ct);
+ ol.docify(" ");
ol.insertMemberAlign();
QCString name;
if (localName)
@@ -1007,11 +996,19 @@ void NamespaceDef::addMemberToList(MemberListType lt,MemberDef *md)
void NamespaceDef::sortMemberLists()
{
- MemberList *ml = m_memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
{
if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
- ml = m_memberLists.next();
+ }
+ if (classSDict)
+ {
+ classSDict->sort();
+ }
+ if (namespaceSDict)
+ {
+ namespaceSDict->sort();
}
}
@@ -1019,15 +1016,14 @@ void NamespaceDef::sortMemberLists()
MemberList *NamespaceDef::getMemberList(MemberListType lt) const
{
- NamespaceDef *that = (NamespaceDef*)this;
- MemberList *ml = that->m_memberLists.first();
- while (ml)
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
{
if (ml->listType()==lt)
{
return ml;
}
- ml = that->m_memberLists.next();
}
return 0;
}
@@ -1103,3 +1099,37 @@ QCString NamespaceDef::title() const
}
return pageTitle;
}
+
+QCString NamespaceDef::compoundTypeString() const
+{
+ SrcLangExt lang = getLanguage();
+ if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
+ {
+ return "package";
+ }
+ else if (lang==SrcLangExt_Fortran)
+ {
+ return "module";
+ }
+ else if (lang==SrcLangExt_IDL)
+ {
+ if (isModule())
+ {
+ return "module";
+ }
+ else if (isConstantGroup())
+ {
+ return "constants";
+ }
+ else if (isLibrary())
+ {
+ return "library";
+ }
+ else
+ {
+ err("Internal inconsistency: namespace in IDL not module, library or constant group\n");
+ }
+ }
+ return "";
+}
+
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 2037d23..4613480 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -68,9 +68,11 @@ class NamespaceDef : public Definition
bool isConstantGroup() const { return CONSTANT_GROUP == m_type; }
bool isModule() const { return MODULE == m_type; }
+ bool isLibrary() const { return LIBRARY == m_type; }
bool isLinkableInProject() const;
bool isLinkable() const;
+ bool hasDetailedDescription() const;
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
void findSectionsInDocumentation();
@@ -94,6 +96,7 @@ class NamespaceDef : public Definition
NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
QCString title() const;
+ QCString compoundTypeString() const;
bool visited;
@@ -130,20 +133,18 @@ class NamespaceDef : public Definition
ClassSDict *classSDict;
NamespaceSDict *namespaceSDict;
bool m_subGrouping;
- enum { NAMESPACE, MODULE, CONSTANT_GROUP } m_type;
+ enum { NAMESPACE, MODULE, CONSTANT_GROUP, LIBRARY } m_type;
bool m_isPublished;
};
/** A list of NamespaceDef objects. */
class NamespaceList : public QList<NamespaceDef>
-{
+{
public:
~NamespaceList() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ int compareValues(const NamespaceDef *nd1,const NamespaceDef *nd2) const
{
- return qstricmp(((NamespaceDef *)item1)->name(),
- ((NamespaceDef *)item2)->name()
- );
+ return qstricmp(nd1->name(), nd2->name());
}
};
@@ -169,15 +170,14 @@ class NamespaceSDict : public SDict<NamespaceDef>
public:
NamespaceSDict(int size=17) : SDict<NamespaceDef>(size) {}
~NamespaceSDict() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
- {
- return qstricmp(((NamespaceDef *)item1)->name(),
- ((NamespaceDef *)item2)->name()
- );
- }
void writeDeclaration(OutputList &ol,const char *title,
bool isConstantGroup=false, bool localName=FALSE);
bool declVisible() const;
+ private:
+ int compareValues(const NamespaceDef *item1,const NamespaceDef *item2) const
+ {
+ return qstricmp(item1->name(),item2->name());
+ }
};
diff --git a/src/navtree.js b/src/navtree.js
index 1d739b2..3914be8 100644
--- a/src/navtree.js
+++ b/src/navtree.js
@@ -1,5 +1,3 @@
-var SYNCONMSG = 'click to disable panel synchronisation';
-var SYNCOFFMSG = 'click to enable panel synchronisation';
var navTreeSubIndices = new Array();
function getData(varName)
@@ -22,6 +20,21 @@ function stripPath2(uri)
return m ? uri.substring(i-6) : s;
}
+function hashValue()
+{
+ return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,'');
+}
+
+function hashUrl()
+{
+ return '#'+hashValue();
+}
+
+function pathName()
+{
+ return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, '');
+}
+
function localStorageSupported()
{
try {
@@ -44,7 +57,7 @@ function deleteLink()
{
if (localStorageSupported()) {
window.localStorage.setItem('navpath','');
- }
+ }
}
function cachedLink()
@@ -116,11 +129,13 @@ var animationInProgress = false;
function gotoAnchor(anchor,aname,updateLocation)
{
var pos, docContent = $('#doc-content');
- if (anchor.parent().attr('class')=='memItemLeft' ||
- anchor.parent().attr('class')=='fieldtype' ||
- anchor.parent().is(':header'))
+ var ancParent = $(anchor.parent());
+ if (ancParent.hasClass('memItemLeft') ||
+ ancParent.hasClass('fieldname') ||
+ ancParent.hasClass('fieldtype') ||
+ ancParent.is(':header'))
{
- pos = anchor.parent().position().top;
+ pos = ancParent.position().top;
} else if (anchor.position()) {
pos = anchor.position().top;
}
@@ -178,7 +193,7 @@ function newNode(o, po, text, link, childrenData, lastNode)
a.className = stripPath(link.replace('#',':'));
if (link.indexOf('#')!=-1) {
var aname = '#'+link.split('#')[1];
- var srcPage = stripPath($(location).attr('pathname'));
+ var srcPage = stripPath(pathName());
var targetPage = stripPath(link.split('#')[0]);
a.href = srcPage!=targetPage ? url : "javascript:void(0)";
a.onclick = function(){
@@ -272,14 +287,13 @@ function glowEffect(n,duration)
function highlightAnchor()
{
- var aname = $(location).attr('hash');
+ var aname = hashUrl();
var anchor = $(aname);
if (anchor.parent().attr('class')=='memItemLeft'){
- var rows = $('.memberdecls tr[class$="'+
- window.location.hash.substring(1)+'"]');
+ var rows = $('.memberdecls tr[class$="'+hashValue()+'"]');
glowEffect(rows.children(),300); // member without details
- } else if (anchor.parents().slice(2).prop('tagName')=='TR') {
- glowEffect(anchor.parents('div.memitem'),1000); // enum value
+ } else if (anchor.parent().attr('class')=='fieldname'){
+ glowEffect(anchor.parent().parent(),1000); // enum value
} else if (anchor.parent().attr('class')=='fieldtype'){
glowEffect(anchor.parent().parent(),1000); // struct field
} else if (anchor.parent().is(":header")) {
@@ -294,7 +308,7 @@ function selectAndHighlight(hash,n)
{
var a;
if (hash) {
- var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);
+ var link=stripPath(pathName())+':'+hash.substring(1);
a=$('.item a[class$="'+link+'"]');
}
if (a && a.length) {
@@ -405,14 +419,13 @@ function navTo(o,root,hash,relpath)
if (link) {
var parts = link.split('#');
root = parts[0];
- if (parts.length>1) hash = '#'+parts[1];
+ if (parts.length>1) hash = '#'+parts[1].replace(/[^\w\-]/g,'');
else hash='';
}
if (hash.match(/^#l\d+$/)) {
var anchor=$('a[name='+hash.substring(1)+']');
glowEffect(anchor.parent(),1000); // line number
hash=''; // strip line number anchors
- //root=root.replace(/_source\./,'.'); // source link to doc link
}
var url=root+hash;
var i=-1;
@@ -446,7 +459,7 @@ function toggleSyncButton(relpath)
if (navSync.hasClass('sync')) {
navSync.removeClass('sync');
showSyncOff(navSync,relpath);
- storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));
+ storeLink(stripPath2(pathName())+hashUrl());
} else {
navSync.addClass('sync');
showSyncOn(navSync,relpath);
@@ -486,7 +499,7 @@ function initNavTree(toroot,relpath)
}
$(window).load(function(){
- navTo(o,toroot,window.location.hash,relpath);
+ navTo(o,toroot,hashUrl(),relpath);
showRoot();
});
@@ -494,21 +507,20 @@ function initNavTree(toroot,relpath)
if (window.location.hash && window.location.hash.length>1){
var a;
if ($(location).attr('hash')){
- var clslink=stripPath($(location).attr('pathname'))+':'+
- $(location).attr('hash').substring(1);
- a=$('.item a[class$="'+clslink+'"]');
+ var clslink=stripPath(pathName())+':'+hashValue();
+ a=$('.item a[class$="'+clslink.replace(/</g,'\\3c ')+'"]');
}
if (a==null || !$(a).parent().parent().hasClass('selected')){
$('.item').removeClass('selected');
$('.item').removeAttr('id');
}
- var link=stripPath2($(location).attr('pathname'));
- navTo(o,link,$(location).attr('hash'),relpath);
+ var link=stripPath2(pathName());
+ navTo(o,link,hashUrl(),relpath);
} else if (!animationInProgress) {
$('#doc-content').scrollTop(0);
$('.item').removeClass('selected');
$('.item').removeAttr('id');
- navTo(o,toroot,window.location.hash,relpath);
+ navTo(o,toroot,hashUrl(),relpath);
}
})
}
diff --git a/src/objcache.cpp b/src/objcache.cpp
index 3a538a3..a59c67b 100644
--- a/src/objcache.cpp
+++ b/src/objcache.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/objcache.h b/src/objcache.h
index d93c1f6..6e6e95d 100644
--- a/src/objcache.h
+++ b/src/objcache.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/outputgen.cpp b/src/outputgen.cpp
index 89686e0..ee9bc48 100644
--- a/src/outputgen.cpp
+++ b/src/outputgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/outputgen.h b/src/outputgen.h
index 95c467d..aaf1ba7 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
index f5df477..59c3efb 100644
--- a/src/outputlist.cpp
+++ b/src/outputlist.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,100 +33,98 @@
OutputList::OutputList(bool)
{
//printf("OutputList::OutputList()\n");
- outputs = new QList<OutputGenerator>;
- outputs->setAutoDelete(TRUE);
+ m_outputs.setAutoDelete(TRUE);
}
OutputList::~OutputList()
{
//printf("OutputList::~OutputList()\n");
- delete outputs;
}
void OutputList::add(const OutputGenerator *og)
{
- if (og) outputs->append(og);
+ if (og) m_outputs.append(og);
}
void OutputList::disableAllBut(OutputGenerator::OutputType o)
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
og->disableIfNot(o);
- og=outputs->next();
}
}
void OutputList::enableAll()
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
og->enable();
- og=outputs->next();
}
}
void OutputList::disableAll()
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
og->disable();
- og=outputs->next();
}
}
void OutputList::disable(OutputGenerator::OutputType o)
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
og->disableIf(o);
- og=outputs->next();
}
}
void OutputList::enable(OutputGenerator::OutputType o)
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
og->enableIf(o);
- og=outputs->next();
}
}
bool OutputList::isEnabled(OutputGenerator::OutputType o)
{
bool result=FALSE;
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
result=result || og->isEnabled(o);
- og=outputs->next();
}
return result;
}
void OutputList::pushGeneratorState()
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
og->pushGeneratorState();
- og=outputs->next();
}
}
void OutputList::popGeneratorState()
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
og->popGeneratorState();
- og=outputs->next();
}
}
@@ -138,12 +136,12 @@ bool OutputList::generateDoc(const char *fileName,int startLine,
{
int count=0;
if (docStr.isEmpty()) return TRUE;
-
- OutputGenerator *og=outputs->first();
- while (og)
+
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
if (og->isEnabled()) count++;
- og=outputs->next();
}
if (count==0) return TRUE; // no output formats enabled.
@@ -163,13 +161,13 @@ bool OutputList::generateDoc(const char *fileName,int startLine,
void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md)
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
//printf("og->printDoc(extension=%s)\n",
// ctx?ctx->getDefFileExtension().data():"<null>");
if (og->isEnabled()) og->writeDoc(root,ctx,md);
- og=outputs->next();
}
VhdlDocGen::setFlowMember(0);
@@ -178,21 +176,19 @@ void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md)
bool OutputList::parseText(const QCString &textStr)
{
int count=0;
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
if (og->isEnabled()) count++;
- og=outputs->next();
}
if (count==0) return TRUE; // no output formats enabled.
DocText *root = validatingParseText(textStr);
- og=outputs->first();
- while (og)
+ for (it.toFirst();(og=it.current());++it)
{
if (og->isEnabled()) og->writeDoc(root,0,0);
- og=outputs->next();
}
bool isEmpty = root->isEmpty();
@@ -211,11 +207,11 @@ bool OutputList::parseText(const QCString &textStr)
// zero arguments
void OutputList::forall(void (OutputGenerator::*func)())
{
- OutputGenerator *og=outputs->first();
- while (og)
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (it.toFirst();(og=it.current());++it)
{
if (og->isEnabled()) (og->*func)();
- og=outputs->next();
}
}
@@ -223,98 +219,98 @@ void OutputList::forall(void (OutputGenerator::*func)())
#define FORALL1(a1,p1) \
void OutputList::forall(void (OutputGenerator::*func)(a1),a1) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1); \
- og=outputs->next(); \
} \
-}
+}
// two arguments
#define FORALL2(a1,a2,p1,p2) \
void OutputList::forall(void (OutputGenerator::*func)(a1,a2),a1,a2) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1,p2); \
- og=outputs->next(); \
} \
-}
+}
// three arguments
#define FORALL3(a1,a2,a3,p1,p2,p3) \
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3),a1,a2,a3) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1,p2,p3); \
- og=outputs->next(); \
} \
-}
+}
// four arguments
#define FORALL4(a1,a2,a3,a4,p1,p2,p3,p4) \
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1,p2,p3,p4); \
- og=outputs->next(); \
} \
-}
+}
// five arguments
#define FORALL5(a1,a2,a3,a4,a5,p1,p2,p3,p4,p5) \
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5),a1,a2,a3,a4,a5) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5); \
- og=outputs->next(); \
} \
-}
+}
// six arguments
#define FORALL6(a1,a2,a3,a4,a5,a6,p1,p2,p3,p4,p5,p6) \
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6),a1,a2,a3,a4,a5,a6) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6); \
- og=outputs->next(); \
} \
-}
+}
// seven arguments
#define FORALL7(a1,a2,a3,a4,a5,a6,a7,p1,p2,p3,p4,p5,p6,p7) \
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6,a7),a1,a2,a3,a4,a5,a6,a7) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6,p7); \
- og=outputs->next(); \
} \
-}
+}
// eight arguments
#define FORALL8(a1,a2,a3,a4,a5,a6,a7,a8,p1,p2,p3,p4,p5,p6,p7,p8) \
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6,a7,a8),a1,a2,a3,a4,a5,a6,a7,a8) \
{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
+ QListIterator<OutputGenerator> it(m_outputs); \
+ OutputGenerator *og; \
+ for (it.toFirst();(og=it.current());++it) \
{ \
if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6,p7,p8); \
- og=outputs->next(); \
} \
-}
+}
// now instantiate only the ones we need.
diff --git a/src/outputlist.h b/src/outputlist.h
index a12d9f5..f578d64 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -58,7 +58,7 @@ class OutputList : public OutputDocInterface
virtual ~OutputList();
void add(const OutputGenerator *);
- uint count() const { return outputs->count(); }
+ uint count() const { return m_outputs.count(); }
void disableAllBut(OutputGenerator::OutputType o);
void enableAll();
@@ -483,28 +483,28 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::addWord,word,hiPriority); }
void startPlainFile(const char *name)
- {
- OutputGenerator *og=outputs->first();
- while (og)
+ {
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (;(og=it.current());++it)
{
if (og->isEnabled()) (og->startPlainFile)(name);
- og=outputs->next();
}
}
- void endPlainFile()
- {
- OutputGenerator *og=outputs->first();
- while (og)
+ void endPlainFile()
+ {
+ QListIterator<OutputGenerator> it(m_outputs);
+ OutputGenerator *og;
+ for (;(og=it.current());++it)
{
if (og->isEnabled()) (og->endPlainFile)();
- og=outputs->next();
}
}
private:
void debug();
void clear();
-
+
void forall(void (OutputGenerator::*func)());
FORALLPROTO1(const char *);
FORALLPROTO1(char);
@@ -546,9 +546,9 @@ class OutputList : public OutputDocInterface
FORALLPROTO5(const char *,const char *,const char *,const char *,bool);
FORALLPROTO6(const char *,const char *,const char *,const char *,const char *,const char *);
FORALLPROTO6(const char *,const DocLinkInfo &,const char *,const char *,const SourceLinkInfo &,const SourceLinkInfo &);
-
+
OutputList(const OutputList &ol);
- QList<OutputGenerator> *outputs;
+ QList<OutputGenerator> m_outputs;
};
#endif
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
index 3c9e1b6..e75327c 100644
--- a/src/pagedef.cpp
+++ b/src/pagedef.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/pagedef.h b/src/pagedef.h
index 141c03b..890829e 100644
--- a/src/pagedef.h
+++ b/src/pagedef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -81,9 +81,10 @@ class PageSDict : public SDict<PageDef>
public:
PageSDict(int size) : SDict<PageDef>(size) {}
virtual ~PageSDict() {}
- int compareItems(QCollection::Item i1,QCollection::Item i2)
+ private:
+ int compareValues(const PageDef *i1,const PageDef *i2) const
{
- return qstricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
+ return qstricmp(i1->name(),i2->name());
}
};
diff --git a/src/parserintf.h b/src/parserintf.h
index d474d8f..c389597 100644
--- a/src/parserintf.h
+++ b/src/parserintf.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -184,8 +184,8 @@ class ParserManager
*/
ParserInterface *getParser(const char *extension)
{
- if (extension==0) return m_defaultParser;
QCString ext = QCString(extension).lower();
+ if (ext.isEmpty()) ext=".no_extension";
ParserInterface *intf = m_extensions.find(ext);
if (intf==0 && ext.length()>4)
{
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index 5537438..948836b 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
* Authors: Dimitri van Heesch, Miguel Lobo.
*
* Permission to use, copy, modify, and distribute this software and its
@@ -41,6 +41,8 @@
#include "namespacedef.h"
#include "membergroup.h"
#include "section.h"
+#include "util.h"
+#include "htmlentity.h"
#define PERLOUTPUT_MAX_INDENTATION 40
@@ -540,140 +542,71 @@ void PerlModDocVisitor::visit(DocWhiteSpace *)
void PerlModDocVisitor::visit(DocSymbol *sy)
{
- char c = 0;
- const char *s = 0;
- const char *accent = 0;
- const char *symbol = 0;
- switch(sy->symbol())
+ const DocSymbol::PerlSymb *res = HtmlEntityMapper::instance()->perl(sy->symbol());
+ const char *accent=0;
+ if (res-> symb)
{
- case DocSymbol::At: c = '@'; break;
- case DocSymbol::Less: c = '<'; break;
- case DocSymbol::Greater: c = '>'; break;
- case DocSymbol::Amp: c = '&'; break;
- case DocSymbol::Dollar: c = '$'; break;
- case DocSymbol::Hash: c = '#'; break;
- case DocSymbol::DoubleColon: s = "::"; break;
- case DocSymbol::Percent: c = '%'; break;
- case DocSymbol::Pipe: c = '|'; break;
- case DocSymbol::Quot: c = '"'; break;
- case DocSymbol::Lsquo: s = "\\\'"; break;
- case DocSymbol::Rsquo: s = "\\\'"; break;
- case DocSymbol::Ldquo: c = '"'; break;
- case DocSymbol::Rdquo: c = '"'; break;
- case DocSymbol::Ndash: c = '-'; break;
- case DocSymbol::Mdash: s = "--"; break;
- case DocSymbol::Nbsp: c = ' '; break;
- case DocSymbol::Uml: accent = "umlaut"; break;
- case DocSymbol::Acute: accent = "acute"; break;
- case DocSymbol::Grave: accent = "grave"; break;
- case DocSymbol::Circ: accent = "circ"; break;
- case DocSymbol::Slash: accent = "slash"; break;
- case DocSymbol::Tilde: accent = "tilde"; break;
- case DocSymbol::Cedil: accent = "cedilla"; break;
- case DocSymbol::Ring: accent = "ring"; break;
- case DocSymbol::BSlash: s = "\\\\"; break;
- case DocSymbol::Copy: symbol = "copyright"; break;
- case DocSymbol::Tm: symbol = "trademark"; break;
- case DocSymbol::Reg: symbol = "registered"; break;
- case DocSymbol::Szlig: symbol = "szlig"; break;
- case DocSymbol::Apos: s = "\\\'"; break;
- case DocSymbol::Aelig: symbol = "aelig"; break;
- case DocSymbol::AElig: symbol = "AElig"; break;
- case DocSymbol::GrkGamma: symbol = "Gamma"; break;
- case DocSymbol::GrkDelta: symbol = "Delta"; break;
- case DocSymbol::GrkTheta: symbol = "Theta"; break;
- case DocSymbol::GrkLambda: symbol = "Lambda"; break;
- case DocSymbol::GrkXi: symbol = "Xi"; break;
- case DocSymbol::GrkPi: symbol = "Pi"; break;
- case DocSymbol::GrkSigma: symbol = "Sigma"; break;
- case DocSymbol::GrkUpsilon: symbol = "Upsilon"; break;
- case DocSymbol::GrkPhi: symbol = "Phi"; break;
- case DocSymbol::GrkPsi: symbol = "Psi"; break;
- case DocSymbol::GrkOmega: symbol = "Omega"; break;
- case DocSymbol::Grkalpha: symbol = "alpha"; break;
- case DocSymbol::Grkbeta: symbol = "beta"; break;
- case DocSymbol::Grkgamma: symbol = "gamma"; break;
- case DocSymbol::Grkdelta: symbol = "delta"; break;
- case DocSymbol::Grkepsilon: symbol = "epsilon"; break;
- case DocSymbol::Grkzeta: symbol = "zeta"; break;
- case DocSymbol::Grketa: symbol = "eta"; break;
- case DocSymbol::Grktheta: symbol = "theta"; break;
- case DocSymbol::Grkiota: symbol = "iota"; break;
- case DocSymbol::Grkkappa: symbol = "kappa"; break;
- case DocSymbol::Grklambda: symbol = "lambda"; break;
- case DocSymbol::Grkmu: symbol = "mu"; break;
- case DocSymbol::Grknu: symbol = "nu"; break;
- case DocSymbol::Grkxi: symbol = "xi"; break;
- case DocSymbol::Grkpi: symbol = "pi"; break;
- case DocSymbol::Grkrho: symbol = "rho"; break;
- case DocSymbol::Grksigma: symbol = "sigma"; break;
- case DocSymbol::Grktau: symbol = "tau"; break;
- case DocSymbol::Grkupsilon: symbol = "upsilon"; break;
- case DocSymbol::Grkphi: symbol = "phi"; break;
- case DocSymbol::Grkchi: symbol = "chi"; break;
- case DocSymbol::Grkpsi: symbol = "psi"; break;
- case DocSymbol::Grkomega: symbol = "omega"; break;
- case DocSymbol::Grkvarsigma: symbol = "sigma"; break;
- case DocSymbol::Section: symbol = "sect"; break;
- case DocSymbol::Degree: symbol = "deg"; break;
- case DocSymbol::Prime: s = "\\\'"; break;
- case DocSymbol::DoublePrime: c = '"'; break;
- case DocSymbol::Infinity: symbol = "inf"; break;
- case DocSymbol::EmptySet: symbol = "empty"; break;
- case DocSymbol::PlusMinus: s = "+/-"; break;
- case DocSymbol::Times: c = '*'; break;
- case DocSymbol::Minus: c = '-'; break;
- case DocSymbol::CenterDot: c = '.'; break;
- case DocSymbol::Partial: symbol = "partial"; break;
- case DocSymbol::Nabla: symbol = "nabla"; break;
- case DocSymbol::SquareRoot: symbol = "sqrt"; break;
- case DocSymbol::Perpendicular: symbol = "perp"; break;
- case DocSymbol::Sum: symbol = "sum"; break;
- case DocSymbol::Integral: symbol = "int"; break;
- case DocSymbol::Product: symbol = "prod"; break;
- case DocSymbol::Similar: c = '~'; break;
- case DocSymbol::Approx: symbol = "approx"; break;
- case DocSymbol::NotEqual: s = "!="; break;
- case DocSymbol::Equivalent: symbol = "equiv"; break;
- case DocSymbol::Proportional: symbol = "propto"; break;
- case DocSymbol::LessEqual: s = "<="; break;
- case DocSymbol::GreaterEqual: s = ">="; break;
- case DocSymbol::LeftArrow: s = "<-"; break;
- case DocSymbol::RightArrow: s = "->"; break;
- case DocSymbol::SetIn: symbol = "in"; break;
- case DocSymbol::SetNotIn: symbol = "notin"; break;
- case DocSymbol::LeftCeil: symbol = "lceil"; break;
- case DocSymbol::RightCeil: symbol = "rceil"; break;
- case DocSymbol::LeftFloor: symbol = "lfloor"; break;
- case DocSymbol::RightFloor: symbol = "rfloor"; break;
- case DocSymbol::Unknown: err("unknown symbol found\n");
- break;
- }
- if (c != 0)
- {
- enterText();
- m_output.add(c);
- }
- else if (s != 0)
- {
- enterText();
- m_output.add(s);
- }
- else if (symbol != 0)
- {
- leaveText();
- openItem("symbol");
- m_output.addFieldQuotedString("symbol", symbol);
- closeItem();
- }
- else if (accent != 0)
+ switch (res->type)
+ {
+ case DocSymbol::Perl_string:
+ enterText();
+ m_output.add(res->symb);
+ break;
+ case DocSymbol::Perl_char:
+ enterText();
+ m_output.add(res->symb[0]);
+ break;
+ case DocSymbol::Perl_symbol:
+ leaveText();
+ openItem("symbol");
+ m_output.addFieldQuotedString("symbol", res->symb);
+ closeItem();
+ break;
+ default:
+ switch(res->type)
+ {
+ case DocSymbol::Perl_umlaut:
+ accent = "umlaut";
+ break;
+ case DocSymbol::Perl_acute:
+ accent = "acute";
+ break;
+ case DocSymbol::Perl_grave:
+ accent = "grave";
+ break;
+ case DocSymbol::Perl_circ:
+ accent = "circ";
+ break;
+ case DocSymbol::Perl_slash:
+ accent = "slash";
+ break;
+ case DocSymbol::Perl_tilde:
+ accent = "tilde";
+ break;
+ case DocSymbol::Perl_cedilla:
+ accent = "cedilla";
+ break;
+ case DocSymbol::Perl_ring:
+ accent = "ring";
+ break;
+ default:
+ break;
+ }
+ leaveText();
+ if (accent)
+ {
+ openItem("accent");
+ m_output
+ .addFieldQuotedString("accent", accent)
+ .addFieldQuotedChar("letter", res->symb[0]);
+ closeItem();
+ }
+ break;
+ }
+ }
+ else
{
- leaveText();
- openItem("accent");
- m_output
- .addFieldQuotedString("accent", accent)
- .addFieldQuotedChar("letter", sy->letter());
- closeItem();
+ err("perl: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(sy->symbol(),TRUE));
}
}
@@ -771,6 +704,7 @@ void PerlModDocVisitor::visit(DocInclude *inc)
return;
case DocInclude::DontInclude: return;
case DocInclude::HtmlInclude: type = "htmlonly"; break;
+ case DocInclude::LatexInclude: type = "latexonly"; break;
case DocInclude::VerbInclude: type = "preformatted"; break;
case DocInclude::Snippet: return;
}
@@ -2098,7 +2032,7 @@ void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
{
m_output.openList("files");
QListIterator<FileDef> fli(*fl);
- FileDef *fd = fl->first();
+ FileDef *fd;
for (fli.toFirst();(fd=fli.current());++fli)
m_output.openHash()
.addFieldQuotedString("name", fd->name())
@@ -2192,7 +2126,7 @@ void PerlModGenerator::generatePerlModForPage(PageDef *pd)
SectionInfo *si = Doxygen::sectionDict->find(pd->name());
if (si)
- m_output.addFieldQuotedString("title", si->title);
+ m_output.addFieldQuotedString("title4", filterTitle(si->title));
addPerlModDocBlock(m_output,"detailed",pd->docFile(),pd->docLine(),0,0,pd->documentation());
m_output.closeHash();
diff --git a/src/perlmodgen.h b/src/perlmodgen.h
index 7f593b2..f908959 100644
--- a/src/perlmodgen.h
+++ b/src/perlmodgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/pre.h b/src/pre.h
index 7deb23c..b624be5 100644
--- a/src/pre.h
+++ b/src/pre.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/pre.l b/src/pre.l
index 775d448..6d818f3 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
index 37929fc..0381c93 100644
--- a/src/printdocvisitor.h
+++ b/src/printdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,7 @@
#include <qglobal.h>
#include "docvisitor.h"
+#include "htmlentity.h"
/*! Concrete visitor implementation for pretty printing */
class PrintDocVisitor : public DocVisitor
@@ -56,106 +57,14 @@ class PrintDocVisitor : public DocVisitor
void visit(DocSymbol *s)
{
indent_leaf();
- switch(s->symbol())
+ const char *res = HtmlEntityMapper::instance()->utf8(s->symbol(),TRUE);
+ if (res)
{
- case DocSymbol::BSlash: printf("\\"); break;
- case DocSymbol::At: printf("@"); break;
- case DocSymbol::Less: printf("<"); break;
- case DocSymbol::Greater: printf(">"); break;
- case DocSymbol::Amp: printf("&"); break;
- case DocSymbol::Dollar: printf("$"); break;
- case DocSymbol::Hash: printf("#"); break;
- case DocSymbol::Percent: printf("%%"); break;
- case DocSymbol::Pipe: printf("|"); break;
- case DocSymbol::Copy: printf("&copy;"); break;
- case DocSymbol::Apos: printf("'"); break;
- case DocSymbol::Quot: printf("\""); break;
- case DocSymbol::Lsquo: printf("&lsquo;"); break;
- case DocSymbol::Rsquo: printf("&rsquo;"); break;
- case DocSymbol::Ldquo: printf("&ldquo;"); break;
- case DocSymbol::Rdquo: printf("&rdquo;"); break;
- case DocSymbol::Ndash: printf("&ndash;"); break;
- case DocSymbol::Mdash: printf("&mdash;"); break;
- case DocSymbol::Uml: printf("&%cuml;",s->letter()); break;
- case DocSymbol::Acute: printf("&%cacute;",s->letter()); break;
- case DocSymbol::Grave: printf("&%cgrave;",s->letter()); break;
- case DocSymbol::Circ: printf("&%ccirc;",s->letter()); break;
- case DocSymbol::Tilde: printf("&%ctilde;",s->letter()); break;
- case DocSymbol::Szlig: printf("&szlig;"); break;
- case DocSymbol::Cedil: printf("&%ccedul;",s->letter()); break;
- case DocSymbol::Ring: printf("&%cring;",s->letter()); break;
- case DocSymbol::Nbsp: printf("&nbsp;"); break;
- case DocSymbol::Aelig: printf("&aelig;"); break;
- case DocSymbol::AElig: printf("&AElig;"); break;
- case DocSymbol::GrkGamma: printf("&Gamma;"); break;
- case DocSymbol::GrkDelta: printf("&Delta;"); break;
- case DocSymbol::GrkTheta: printf("&Theta;"); break;
- case DocSymbol::GrkLambda: printf("&Lambda;"); break;
- case DocSymbol::GrkXi: printf("&Xi;"); break;
- case DocSymbol::GrkPi: printf("&Pi;"); break;
- case DocSymbol::GrkSigma: printf("&Sigma;"); break;
- case DocSymbol::GrkUpsilon: printf("&Upsilon;"); break;
- case DocSymbol::GrkPhi: printf("&Phi;"); break;
- case DocSymbol::GrkPsi: printf("&Psi;"); break;
- case DocSymbol::GrkOmega: printf("&Omega;"); break;
- case DocSymbol::Grkalpha: printf("&alpha;"); break;
- case DocSymbol::Grkbeta: printf("&beta;"); break;
- case DocSymbol::Grkgamma: printf("&gamma;"); break;
- case DocSymbol::Grkdelta: printf("&delta;"); break;
- case DocSymbol::Grkepsilon: printf("&epsilon;"); break;
- case DocSymbol::Grkzeta: printf("&zeta;"); break;
- case DocSymbol::Grketa: printf("&eta;"); break;
- case DocSymbol::Grktheta: printf("&theta;"); break;
- case DocSymbol::Grkiota: printf("&iota;"); break;
- case DocSymbol::Grkkappa: printf("&kappa;"); break;
- case DocSymbol::Grklambda: printf("&lambda;"); break;
- case DocSymbol::Grkmu: printf("&mu;"); break;
- case DocSymbol::Grknu: printf("&nu;"); break;
- case DocSymbol::Grkxi: printf("&xi;"); break;
- case DocSymbol::Grkpi: printf("&pi;"); break;
- case DocSymbol::Grkrho: printf("&rho;"); break;
- case DocSymbol::Grksigma: printf("&sigma;"); break;
- case DocSymbol::Grktau: printf("&tau;"); break;
- case DocSymbol::Grkupsilon: printf("&upsilon;"); break;
- case DocSymbol::Grkphi: printf("&phi;"); break;
- case DocSymbol::Grkchi: printf("&chi;"); break;
- case DocSymbol::Grkpsi: printf("&psi;"); break;
- case DocSymbol::Grkomega: printf("&omega;"); break;
- case DocSymbol::Grkvarsigma: printf("&sigmaf;"); break;
- case DocSymbol::Section: printf("&sect;"); break;
- case DocSymbol::Degree: printf("&deg;"); break;
- case DocSymbol::Prime: printf("&prime;"); break;
- case DocSymbol::DoublePrime: printf("&Prime;"); break;
- case DocSymbol::Infinity: printf("&infin;"); break;
- case DocSymbol::EmptySet: printf("&empty;"); break;
- case DocSymbol::PlusMinus: printf("&plusmn;"); break;
- case DocSymbol::Times: printf("&times;"); break;
- case DocSymbol::Minus: printf("&minus;"); break;
- case DocSymbol::CenterDot: printf("&sdot;"); break;
- case DocSymbol::Partial: printf("&part;"); break;
- case DocSymbol::Nabla: printf("&nabla;"); break;
- case DocSymbol::SquareRoot: printf("&radic;"); break;
- case DocSymbol::Perpendicular: printf("&perp;"); break;
- case DocSymbol::Sum: printf("&sum;"); break;
- case DocSymbol::Integral: printf("&int;"); break;
- case DocSymbol::Product: printf("&prod;"); break;
- case DocSymbol::Similar: printf("&sim;"); break;
- case DocSymbol::Approx: printf("&asymp;"); break;
- case DocSymbol::NotEqual: printf("&ne;"); break;
- case DocSymbol::Equivalent: printf("&equiv;"); break;
- case DocSymbol::Proportional: printf("&prop;"); break;
- case DocSymbol::LessEqual: printf("&le;"); break;
- case DocSymbol::GreaterEqual: printf("&ge;"); break;
- case DocSymbol::LeftArrow: printf("&larr;"); break;
- case DocSymbol::RightArrow: printf("&rarr;"); break;
- case DocSymbol::SetIn: printf("&isin;"); break;
- case DocSymbol::SetNotIn: printf("&notin;"); break;
- case DocSymbol::LeftCeil: printf("&lceil;"); break;
- case DocSymbol::RightCeil: printf("&rceil;"); break;
- case DocSymbol::LeftFloor: printf("&lfloor;"); break;
- case DocSymbol::RightFloor: printf("&rfloor;"); break;
- default:
- printf("unknown symbol found\n");
+ printf("%s",res);
+ }
+ else
+ {
+ printf("print: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
}
void visit(DocURL *u)
@@ -256,6 +165,7 @@ class PrintDocVisitor : public DocVisitor
case DocInclude::IncWithLines: printf("incwithlines"); break;
case DocInclude::DontInclude: printf("dontinclude"); break;
case DocInclude::HtmlInclude: printf("htmlinclude"); break;
+ case DocInclude::LatexInclude: printf("latexinclude"); break;
case DocInclude::VerbInclude: printf("verbinclude"); break;
case DocInclude::Snippet: printf("snippet"); break;
}
diff --git a/src/pycode.h b/src/pycode.h
index 6382975..9b0dacb 100644
--- a/src/pycode.h
+++ b/src/pycode.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/pycode.l b/src/pycode.l
index 8512711..585b587 100644
--- a/src/pycode.l
+++ b/src/pycode.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/pyscanner.h b/src/pyscanner.h
index 4b99706..e4e974f 100644
--- a/src/pyscanner.h
+++ b/src/pyscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/pyscanner.l b/src/pyscanner.l
index 671d330..c67875e 100644
--- a/src/pyscanner.l
+++ b/src/pyscanner.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -645,6 +645,8 @@ STARTDOCSYMS "##"
}
<FromMod>{
+ "." { // python3 style imports
+ }
{IDENTIFIER}({B}"."{B}{IDENTIFIER})* { // from package import
g_packageName=yytext;
}
diff --git a/src/qtbc.h b/src/qtbc.h
index ab49733..c9ff3ca 100644
--- a/src/qtbc.h
+++ b/src/qtbc.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/reflist.cpp b/src/reflist.cpp
index 70bd9ba..ee6ac91 100644
--- a/src/reflist.cpp
+++ b/src/reflist.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/reflist.h b/src/reflist.h
index 3124582..97b1420 100644
--- a/src/reflist.h
+++ b/src/reflist.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -44,10 +44,9 @@ class SortedRefItems : public SDict<RefItem>
public:
SortedRefItems(int size=17) : SDict<RefItem>(size) {}
virtual ~SortedRefItems() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const RefItem *r1,const RefItem *r2) const
{
- RefItem *r1 = (RefItem*)item1;
- RefItem *r2 = (RefItem*)item2;
return qstricmp(r1->title,r2->title);
}
};
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index 7c2fef8..67faf98 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -32,6 +32,7 @@
#include "dia.h"
#include "filedef.h"
#include "config.h"
+#include "htmlentity.h"
//#define DBG_RTF(x) m_t << x
#define DBG_RTF(x) do {} while(0)
@@ -121,198 +122,14 @@ void RTFDocVisitor::visit(DocSymbol *s)
{
if (m_hide) return;
DBG_RTF("{\\comment RTFDocVisitor::visit(DocSymbol)}\n");
- switch(s->symbol())
+ const char *res = HtmlEntityMapper::instance()->rtf(s->symbol());
+ if (res)
{
- case DocSymbol::BSlash: m_t << "\\\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "<"; break;
- case DocSymbol::Greater: m_t << ">"; break;
- case DocSymbol::Amp: m_t << "&"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::DoubleColon: m_t << "::"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Pipe: m_t << "|"; break;
- case DocSymbol::Copy: m_t << "(C)"; break;
- case DocSymbol::Tm: m_t << "(TM)"; break;
- case DocSymbol::Reg: m_t << "(R)"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Lsquo: m_t << "`"; break;
- case DocSymbol::Rsquo: m_t << "'"; break;
- case DocSymbol::Ldquo: m_t << "\""; break;
- case DocSymbol::Rdquo: m_t << "\""; break;
- case DocSymbol::Ndash: m_t << "-"; break;
- case DocSymbol::Mdash: m_t << "--"; break;
- case DocSymbol::Uml: switch(s->letter())
- {
- case 'A' : m_t << '\304'; break;
- case 'E' : m_t << '\313'; break;
- case 'I' : m_t << '\317'; break;
- case 'O' : m_t << '\326'; break;
- case 'U' : m_t << '\334'; break;
- case 'Y' : m_t << 'Y'; break;
- case 'a' : m_t << '\344'; break;
- case 'e' : m_t << '\353'; break;
- case 'i' : m_t << '\357'; break;
- case 'o' : m_t << '\366'; break;
- case 'u' : m_t << '\374'; break;
- case 'y' : m_t << '\377'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Acute: switch(s->letter())
- {
- case 'A' : m_t << '\301'; break;
- case 'E' : m_t << '\311'; break;
- case 'I' : m_t << '\315'; break;
- case 'O' : m_t << '\323'; break;
- case 'U' : m_t << '\332'; break;
- case 'Y' : m_t << '\335'; break;
- case 'a' : m_t << '\341'; break;
- case 'e' : m_t << '\351'; break;
- case 'i' : m_t << '\355'; break;
- case 'o' : m_t << '\363'; break;
- case 'u' : m_t << '\372'; break;
- case 'y' : m_t << '\375'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Grave: switch(s->letter())
- {
- case 'A' : m_t << '\300'; break;
- case 'E' : m_t << '\310'; break;
- case 'I' : m_t << '\314'; break;
- case 'O' : m_t << '\322'; break;
- case 'U' : m_t << '\331'; break;
- case 'a' : m_t << '\340'; break;
- case 'e' : m_t << '\350'; break;
- case 'i' : m_t << '\354'; break;
- case 'o' : m_t << '\362'; break;
- case 'u' : m_t << '\371'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Circ: switch(s->letter())
- {
- case 'A' : m_t << '\302'; break;
- case 'E' : m_t << '\312'; break;
- case 'I' : m_t << '\316'; break;
- case 'O' : m_t << '\324'; break;
- case 'U' : m_t << '\333'; break;
- case 'a' : m_t << '\342'; break;
- case 'e' : m_t << '\352'; break;
- case 'i' : m_t << '\356'; break;
- case 'o' : m_t << '\364'; break;
- case 'u' : m_t << '\373'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Tilde: switch(s->letter())
- {
- case 'A' : m_t << '\303'; break;
- case 'N' : m_t << '\321'; break;
- case 'O' : m_t << '\325'; break;
- case 'a' : m_t << '\343'; break;
- case 'n' : m_t << '\361'; break;
- case 'o' : m_t << '\365'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Cedil: switch(s->letter())
- {
- case 'C' : m_t << '\307'; break;
- case 'c' : m_t << '\347'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Slash: switch(s->letter())
- {
- case 'O' : m_t << '\330'; break;
- case 'o' : m_t << '\370'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Ring: switch(s->letter())
- {
- case 'A' : m_t << '\305'; break;
- case 'a' : m_t << '\345'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Szlig: m_t << "\337"; break;
- case DocSymbol::Nbsp: m_t << "\\~ "; break;
- case DocSymbol::Aelig: m_t << "\346"; break;
- case DocSymbol::AElig: m_t << "\306"; break;
- case DocSymbol::GrkGamma: m_t << "Gamma "; break;
- case DocSymbol::GrkDelta: m_t << "Delta "; break;
- case DocSymbol::GrkTheta: m_t << "Theta "; break;
- case DocSymbol::GrkLambda: m_t << "Lambda "; break;
- case DocSymbol::GrkXi: m_t << "Xi "; break;
- case DocSymbol::GrkPi: m_t << "Pi "; break;
- case DocSymbol::GrkSigma: m_t << "Sigma "; break;
- case DocSymbol::GrkUpsilon: m_t << "Upsilon "; break;
- case DocSymbol::GrkPhi: m_t << "Phi "; break;
- case DocSymbol::GrkPsi: m_t << "Psi "; break;
- case DocSymbol::GrkOmega: m_t << "Omega "; break;
- case DocSymbol::Grkalpha: m_t << "alpha "; break;
- case DocSymbol::Grkbeta: m_t << "beta "; break;
- case DocSymbol::Grkgamma: m_t << "gamma "; break;
- case DocSymbol::Grkdelta: m_t << "delta "; break;
- case DocSymbol::Grkepsilon: m_t << "epsilon "; break;
- case DocSymbol::Grkzeta: m_t << "zeta "; break;
- case DocSymbol::Grketa: m_t << "eta "; break;
- case DocSymbol::Grktheta: m_t << "theta "; break;
- case DocSymbol::Grkiota: m_t << "iota "; break;
- case DocSymbol::Grkkappa: m_t << "kappa "; break;
- case DocSymbol::Grklambda: m_t << "lambda "; break;
- case DocSymbol::Grkmu: m_t << "mu "; break;
- case DocSymbol::Grknu: m_t << "nu "; break;
- case DocSymbol::Grkxi: m_t << "xi "; break;
- case DocSymbol::Grkpi: m_t << "pi "; break;
- case DocSymbol::Grkrho: m_t << "rho "; break;
- case DocSymbol::Grksigma: m_t << "sigma "; break;
- case DocSymbol::Grktau: m_t << "tau "; break;
- case DocSymbol::Grkupsilon: m_t << "upsilon "; break;
- case DocSymbol::Grkphi: m_t << "phi "; break;
- case DocSymbol::Grkchi: m_t << "chi "; break;
- case DocSymbol::Grkpsi: m_t << "psi "; break;
- case DocSymbol::Grkomega: m_t << "omega "; break;
- case DocSymbol::Grkvarsigma: m_t << "sigma "; break;
- case DocSymbol::Section: m_t << "\247"; break;
- case DocSymbol::Degree: m_t << "\260"; break;
- case DocSymbol::Prime: m_t << "'"; break;
- case DocSymbol::DoublePrime: m_t << "\""; break;
- case DocSymbol::Infinity: m_t << "inf "; break;
- case DocSymbol::EmptySet: m_t << "empty "; break;
- case DocSymbol::PlusMinus: m_t << "\261"; break;
- case DocSymbol::Times: m_t << "\327"; break;
- case DocSymbol::Minus: m_t << "-"; break;
- case DocSymbol::CenterDot: m_t << "."; break;
- case DocSymbol::Partial: m_t << "partial "; break;
- case DocSymbol::Nabla: m_t << "nabla "; break;
- case DocSymbol::SquareRoot: m_t << "sqrt "; break;
- case DocSymbol::Perpendicular: m_t << "perp "; break;
- case DocSymbol::Sum: m_t << "sum "; break;
- case DocSymbol::Integral: m_t << "int "; break;
- case DocSymbol::Product: m_t << "prod "; break;
- case DocSymbol::Similar: m_t << "~"; break;
- case DocSymbol::Approx: m_t << "approx "; break;
- case DocSymbol::NotEqual: m_t << "!="; break;
- case DocSymbol::Equivalent: m_t << "equiv "; break;
- case DocSymbol::Proportional: m_t << "propto "; break;
- case DocSymbol::LessEqual: m_t << "<="; break;
- case DocSymbol::GreaterEqual: m_t << ">="; break;
- case DocSymbol::LeftArrow: m_t << "<-"; break;
- case DocSymbol::RightArrow: m_t << "->"; break;
- case DocSymbol::SetIn: m_t << "in "; break;
- case DocSymbol::SetNotIn: m_t << "notin "; break;
- case DocSymbol::LeftCeil: m_t << "lceil "; break;
- case DocSymbol::RightCeil: m_t << "rceil "; break;
- case DocSymbol::LeftFloor: m_t << "lfloor "; break;
- case DocSymbol::RightFloor: m_t << "rfloor "; break;
- default:
- err("unknown symbol found\n");
+ m_t << res;
+ }
+ else
+ {
+ err("RTF: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
m_lastIsPara=FALSE;
}
@@ -565,6 +382,8 @@ void RTFDocVisitor::visit(DocInclude *inc)
break;
case DocInclude::HtmlInclude:
break;
+ case DocInclude::LatexInclude:
+ break;
case DocInclude::VerbInclude:
m_t << "{" << endl;
m_t << "\\par" << endl;
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
index 9572b73..efc9d21 100644
--- a/src/rtfdocvisitor.h
+++ b/src/rtfdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index d8c34ee..8699c4e 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Parker Waechter & Dimitri van Heesch.
*
* Style sheet additions by Alexander Bartolich
*
@@ -492,11 +492,13 @@ void RTFGenerator::startIndexSection(IndexSections is)
{
//File Documentation
bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList->first();
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
if (fd->isLinkableInProject())
{
@@ -507,9 +509,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
break;
}
}
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
}
break;
@@ -792,13 +792,15 @@ void RTFGenerator::endIndexSection(IndexSections is)
case isFileDocumentation:
{
bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList->first();
t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl;
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- while (fd)
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
if (fd->isLinkableInProject())
{
@@ -819,9 +821,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
}
}
- fd=fn->next();
}
- fn=Doxygen::inputNameList->next();
}
}
break;
diff --git a/src/rtfgen.h b/src/rtfgen.h
index 6206311..7b31673 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Parker Waechter & Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp
index 2bede42..f44951a 100644
--- a/src/rtfstyle.cpp
+++ b/src/rtfstyle.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/rtfstyle.h b/src/rtfstyle.h
index 52488f1..4f0a03f 100644
--- a/src/rtfstyle.h
+++ b/src/rtfstyle.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/scanner.h b/src/scanner.h
index 767fea0..8c8c3d9 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/scanner.l b/src/scanner.l
index bbe90a3..a7ac841 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -5023,6 +5023,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
tempEntry = current; // temporarily switch to the previous entry
current = previous;
+ previous = 0;
docBlockContext = SkipCurlyEndDoc;
docBlockInBody = FALSE;
@@ -5062,7 +5063,11 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<SkipCurlyEndDoc>"}" {
//addToBody("}");
- current = tempEntry;
+ if (tempEntry) // we can only switch back to current if no new item was created
+ {
+ current = tempEntry;
+ tempEntry = 0;
+ }
BEGIN( lastCurlyContext );
}
<SkipCurly>\" {
@@ -5115,6 +5120,11 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
lastCContext = YY_START;
BEGIN(SkipCxxComment);
}
+<SkipInits>"(" {
+ roundCount=0;
+ lastSkipRoundContext=YY_START;
+ BEGIN(SkipRound);
+ }
<SkipInits>\" {
lastStringContext=YY_START;
BEGIN( SkipString );
@@ -5510,7 +5520,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN( CopyArgComment );
}
<CSConstraintType,CSConstraintName>"#" { // artificially inserted token to signal end of comment block
- current->typeConstr->last()->docs = fullArgString;
+ current->typeConstr->getLast()->docs = fullArgString;
}
<CSConstraintType>"{" { // end of type constraint reached
// parse documentation of the constraints
@@ -5528,24 +5538,24 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<CSConstraintName>{ID} {
// parameter name
- current->typeConstr->last()->name=yytext;
+ current->typeConstr->getLast()->name=yytext;
}
<CSConstraintType>"where" { // another constraint for a different param
current->typeConstr->append(new Argument);
BEGIN( CSConstraintName );
}
<CSConstraintType>({ID}".")*{ID}("<"{ID}">")?("()")? {
- if (current->typeConstr->last()->type.isEmpty())
+ if (current->typeConstr->getLast()->type.isEmpty())
// first type constraint for this parameter
{
- current->typeConstr->last()->type=yytext;
+ current->typeConstr->getLast()->type=yytext;
}
else // new type constraint for same parameter
{
- QCString name = current->typeConstr->last()->name;
+ QCString name = current->typeConstr->getLast()->name;
current->typeConstr->append(new Argument);
- current->typeConstr->last()->name=name;
- current->typeConstr->last()->type=yytext;
+ current->typeConstr->getLast()->name=name;
+ current->typeConstr->getLast()->type=yytext;
}
}
<CSConstraintName,CSConstraintType>\n {
@@ -5766,7 +5776,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
specName = &current->name;
BEGIN ( Specialization );
}
-<Bases>"<" {
+<Bases>{BN}*"<" {
+ lineCount();
sharpCount=1;
roundCount=0;
lastSkipSharpContext = YY_START;
@@ -6194,7 +6205,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
g_nestedComment=FALSE;
BEGIN(DocCopyBlock);
}
-<DocBlock>"<"{PRE}">" {
+<DocBlock>{B}*"<"{PRE}">" {
docBlock+=yytext;
docBlockName="<pre>";
g_fencedSize=0;
@@ -6210,6 +6221,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
}
<DocBlock>"~~~"[~]* {
docBlock+=yytext;
+ docBlockName="~~~";
g_fencedSize=yyleng;
g_nestedComment=FALSE;
BEGIN(DocCopyBlock);
@@ -6293,6 +6305,18 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
REJECT;
}
}
+<DocCopyBlock>^{B}*"*"+/({ID}|"(") { // Assume *var or *(... is part of source code (see bug723516)
+ if (docBlockName=="code")
+ {
+ QCString indent;
+ indent.fill(' ',computeIndent(yytext,-1));
+ docBlock+=indent+"*";
+ }
+ else
+ {
+ REJECT;
+ }
+ }
<DocCopyBlock>^{B}*"*"+/{BN}* { // start of a comment line with one *
if (docBlockName=="code")
{
@@ -6497,7 +6521,14 @@ static void startCommentBlock(bool brief)
static void newEntry()
{
- current_root->addSubEntry(current);
+ if (tempEntry==0) // if temp entry is not 0, it holds current,
+ // and current is actually replaced by previous which was
+ // already added to current_root, so we should not add it again
+ // (see bug723314)
+ {
+ current_root->addSubEntry(current);
+ }
+ tempEntry = 0;
previous = current;
current = new Entry ;
initEntry();
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index f023e4d..a550eb1 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -632,16 +632,14 @@ class SearchIndexList : public SDict< SearchDefinitionList >
}
l->append(d);
}
- int compareItems(QCollection::Item item1, QCollection::Item item2)
+ uint letter() const { return m_letter; }
+ private:
+ int compareValues(const SearchDefinitionList *md1, const SearchDefinitionList *md2) const
{
- QList<Definition> *md1=(QList<Definition> *)item1;
- QList<Definition> *md2=(QList<Definition> *)item2;
- QCString n1 = md1->first()->localName();
- QCString n2 = md2->first()->localName();
+ QCString n1 = md1->getFirst()->localName();
+ QCString n2 = md2->getFirst()->localName();
return qstricmp(n1.data(),n2.data());
}
- uint letter() const { return m_letter; }
- private:
uint m_letter;
};
@@ -1029,7 +1027,7 @@ void writeJavascriptSearchIndex()
" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
t << "<html><head><title></title>" << endl;
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
- t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\">" << endl;
+ t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\"/>" << endl;
t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>" << endl;
t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
@@ -1077,7 +1075,7 @@ void writeJavascriptSearchIndex()
int itemCount=0;
for (li.toFirst();(dl=li.current());++li)
{
- Definition *d = dl->first();
+ Definition *d = dl->getFirst();
QCString id = d->localName();
if (!firstEntry)
diff --git a/src/searchindex.h b/src/searchindex.h
index 2ce80e8..872c0d3 100644
--- a/src/searchindex.h
+++ b/src/searchindex.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/section.h b/src/section.h
index 486656d..a1f859e 100644
--- a/src/section.h
+++ b/src/section.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,25 +33,32 @@ struct SectionInfo
Paragraph = 4,
Anchor = 5
};
- SectionInfo(const char *f,const char *l,const char *t,
+ SectionInfo(const char *f,const int lin,const char *l,const char *t,
SectionType st,int lev,const char *r=0) :
- label(l), title(t), type(st), ref(r), definition(0),
- fileName(f), generated(FALSE), level(lev)
- {
+ label(l), title(t), type(st), ref(r), definition(0),
+ fileName(f), lineNr(lin), generated(FALSE), level(lev)
+ {
}
SectionInfo(const SectionInfo &s)
{
- label=s.label.copy(); title=s.title.copy(); ref=s.ref.copy();
- type =s.type; definition=s.definition;
- fileName=s.fileName.copy(); generated=s.generated;
+ label=s.label.copy();
+ title=s.title.copy();
+ type =s.type;
+ ref=s.ref.copy();
+ definition=s.definition;
+ fileName=s.fileName.copy();
+ lineNr=s.lineNr;
+ generated=s.generated;
+ level=s.level;
}
~SectionInfo() {}
- QCString label;
+ QCString label;
QCString title;
SectionType type;
QCString ref;
Definition *definition;
QCString fileName;
+ int lineNr;
bool generated;
int level;
};
diff --git a/src/settings.h b/src/settings.h
deleted file mode 100644
index a9fd128..0000000
--- a/src/settings.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef SETTINGS_H
-#define SETTINGS_H
-
-#define USE_SQLITE3 0
-#define USE_LIBCLANG 0
-
-#define IS_SUPPORTED(x) \
- ((USE_SQLITE3 && strcmp("USE_SQLITE3",(x))==0) || \
- (USE_LIBCLANG && strcmp("USE_LIBCLANG",(x))==0) || \
- 0)
-
-#endif
diff --git a/src/settings.py b/src/settings.py
index af24e7b..a9dfa13 100755
--- a/src/settings.py
+++ b/src/settings.py
@@ -1,11 +1,12 @@
#
import sys
+import os
f_sqlite3 = sys.argv[1]
f_libclang = sys.argv[2]
-f1 = open('../src/settings.h','w')
+f1 = open(os.path.join(sys.argv[3],'settings.h'),'w')
f1.write("#ifndef SETTINGS_H\n")
f1.write("#define SETTINGS_H\n")
f1.write("\n")
diff --git a/src/sortdict.h b/src/sortdict.h
index e111075..f79a335 100644
--- a/src/sortdict.h
+++ b/src/sortdict.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -73,7 +73,7 @@ const uint SDict_primes[] =
template<class T> class SDict;
template<class T> class SIntDict;
-/** internal wrapper class that redirects compareItems() to the
+/** internal wrapper class that redirects compareValues() to the
* dictionary
*/
template<class T>
@@ -82,9 +82,9 @@ class SList : public QList<T>
public:
SList(SDict<T> *owner) : m_owner(owner) {}
virtual ~SList() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ int compareValues(const T *item1,const T *item2) const
{
- return m_owner->compareItems(item1,item2);
+ return m_owner->compareValues(item1,item2);
}
private:
SDict<T> *m_owner;
@@ -264,7 +264,7 @@ class SDict
* Overload this to properly sort items.
* \sa inSort()
*/
- virtual int compareItems(QCollection::Item item1,QCollection::Item item2)
+ virtual int compareValues(const T *item1,const T *item2) const
{
return item1!=item2;
}
@@ -421,7 +421,7 @@ class SDict
};
};
-/** internal wrapper class that redirects compareItems() to the
+/** internal wrapper class that redirects compareValues() to the
* dictionary
*/
template<class T>
@@ -430,11 +430,11 @@ class SIntList : public QList<T>
public:
SIntList(SIntDict<T> *owner) : m_owner(owner) {}
virtual ~SIntList() {}
- int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+ int compareValues(const T *item1,const T *item2) const
{
- return m_owner->compareItems(item1,item2);
+ return m_owner->compareValues(item1,item2);
}
- private:
SIntDict<T> *m_owner;
};
@@ -573,7 +573,7 @@ class SIntDict
* Overload this to properly sort items.
* \sa inSort()
*/
- virtual int compareItems(QCollection::Item item1,QCollection::Item item2)
+ virtual int compareValues(const T *item1,const T *item2) const
{
return item1!=item2;
}
diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp
index a59a3d0..42a0307 100644
--- a/src/sqlite3gen.cpp
+++ b/src/sqlite3gen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -45,143 +45,59 @@
//#define DBG_CTX(x) printf x
#define DBG_CTX(x) do { } while(0)
-static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def);
-
-//////////////////////////////////////////////////////
-const char *i_q_includes="INSERT OR REPLACE INTO includes "
- "( local, id_src, dst ) "
- "VALUES "
- "(:local,:id_src,:dst )" ;
-const char *c_q_includes="SELECT count(*) FROM includes WHERE local=:local and id_src=:id_src and dst=:dst";
-static sqlite3_stmt *c_s_includes=0;
-static sqlite3_stmt *i_s_includes=0;
-//////////////////////////////////////////////////////
-const char *i_q_innerclass="INSERT OR REPLACE INTO innerclass "
- "( refid, prot, name )"
- "VALUES "
- "(:refid,:prot,:name )";
-static sqlite3_stmt *i_s_innerclass=0;
-//////////////////////////////////////////////////////
-const char *i_q_files="INSERT OR REPLACE INTO files "
- "( name )"
- "VALUES "
- "(:name )";
-const char *id_q_files="SELECT id FROM files WHERE name=:name";
-static sqlite3_stmt *id_s_files=0;
-static sqlite3_stmt *i_s_files=0;
-//////////////////////////////////////////////////////
-const char *i_q_xrefs="INSERT OR REPLACE INTO xrefs "
- "( src, dst, id_file, line, column )"
- "VALUES "
- "(:src,:dst,:id_file,:line,:column )";
-static sqlite3_stmt *i_s_xrefs=0;
-//////////////////////////////////////////////////////
-const char *i_q_memberdef="INSERT OR REPLACE INTO memberdef "
- "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, initializer, kind, id_bfile, bline, bcolumn, id_file, line, column)"
- "VALUES "
- "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:initializer,:kind,:id_bfile,:bline,:bcolumn,:id_file,:line,:column)";
-const char *id_q_memberdef="SELECT id FROM memberdef WHERE refid=:refid and id is not null";
-static sqlite3_stmt *id_s_memberdef=0;
-static sqlite3_stmt *i_s_memberdef=0;
-//////////////////////////////////////////////////////
-const char *i_q_compounddef="INSERT OR REPLACE INTO compounddef "
- "( name, kind, prot, refid, id_file, line, column ) "
- "VALUES "
- "(:name,:kind,:prot,:refid,:id_file,:line,:column )";
-static sqlite3_stmt *i_s_compounddef=0;
-//////////////////////////////////////////////////////
-const char *i_q_basecompoundref="INSERT OR REPLACE INTO basecompoundref "
- "( base, derived, refid, prot, virt ) "
- "VALUES "
- "(:base,:derived,:refid,:prot,:virt )" ;
-static sqlite3_stmt *i_s_basecompoundref=0;
-//////////////////////////////////////////////////////
-const char *i_q_derivedcompoundref="INSERT OR REPLACE INTO derivedcompoundref "
- "( refid, prot, virt, base, derived ) "
- "VALUES "
- "(:refid,:prot,:virt,:base,:derived )" ;
-static sqlite3_stmt *i_s_derivedcompoundref=0;
-//////////////////////////////////////////////////////
-
-const char * schema_queries[][2] =
-{
- {
- "compounddef",
- "CREATE TABLE IF NOT EXISTS compounddef ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
- "name TEXT NOT NULL,"
- "kind TEXT NOT NULL,"
- "prot INTEGER NOT NULL,"
- "refid TEXT NOT NULL,"
- "id_file INTEGER NOT NULL,"
- "line INTEGER NOT NULL,"
- "column INTEGER NOT NULL)"
- },
- {
- "basecompoundref",
- "CREATE TABLE IF NOT EXISTS basecompoundref ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
- "base TEXT NOT NULL,"
- "derived TEXT NOT NULL,"
- "refid TEXT NOT NULL,"
- "prot INTEGER NOT NULL,"
- "virt INTEGER NOT NULL)"
- },
- {
- "derivedcompoundref",
- "CREATE TABLE IF NOT EXISTS derivedcompoundref ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
- "base TEXT NOT NULL,"
- "derived TEXT NOT NULL,"
- "refid TEXT NOT NULL,"
- "prot INTEGER NOT NULL,"
- "virt INTEGER NOT NULL)"
- },
- {
- "includes",
+const char * schema_queries[][2] = {
+ { "includes",
"CREATE TABLE IF NOT EXISTS includes ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
"local INTEGER NOT NULL,"
"id_src INTEGER NOT NULL,"
- "dst TEXT NOT NULL)"
+ "id_dst INTEGER NOT NULL);"
+ "CREATE UNIQUE INDEX idx_includes ON includes "
+ "(local, id_src, id_dst);"
},
- {
- "innerclass",
+ { "innerclass",
"CREATE TABLE IF NOT EXISTS innerclass ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
"refid TEXT NOT NULL,"
"prot INTEGER NOT NULL,"
"name TEXT NOT NULL)"
},
- {
- "files",
+ { "files",
"CREATE TABLE IF NOT EXISTS files ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
- "name TEXT NOT NULL)"
+ "name TEXT PRIMARY KEY NOT NULL);"
},
- {
- "xrefs",
+ { "refids",
+ "CREATE TABLE IF NOT EXISTS refids ("
+ "refid TEXT PRIMARY KEY NOT NULL);"
+ },
+ { "xrefs",
"CREATE TABLE IF NOT EXISTS xrefs ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
- "src TEXT NOT NULL, "
- "dst TEXT NOT NULL, "
- "id_file INTEGER NOT NULL, "
- "line INTEGER, "
- "column INTEGER)"
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ "refid_src INTEGER NOT NULL, "
+ "refid_dst INTEGER NOT NULL, "
+ "id_file INTEGER NOT NULL, "
+ "line INTEGER NOT NULL, "
+ "column INTEGER NOT NULL);"
+ "CREATE UNIQUE INDEX idx_xrefs ON xrefs "
+ "(refid_src, refid_dst, id_file, line, column);"
},
- {
- "memberdef",
+ { "memberdef",
"CREATE TABLE IF NOT EXISTS memberdef ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "id_file INTEGER NOT NULL,"
+ "line INTEGER NOT NULL,"
+ "column INTEGER NOT NULL,"
+ "refid TEXT NOT NULL,"
"name TEXT NOT NULL,"
"definition TEXT,"
"type TEXT,"
"argsstring TEXT,"
"scope TEXT,"
"initializer TEXT,"
- "prot INTEGER NOT NULL,"
- "static INTEGER NOT NULL,"
+ "prot INTEGER,"
"const INTEGER,"
+ "virt INTEGER,"
+ "static INTEGER NOT NULL,"
"explicit INTEGER,"
"inline INTEGER,"
"final INTEGER,"
@@ -189,7 +105,6 @@ const char * schema_queries[][2] =
"new INTEGER,"
"optional INTEGER,"
"required INTEGER,"
- "virt INTEGER,"
"mutable INTEGER,"
"initonly INTEGER,"
"readable INTEGER,"
@@ -201,14 +116,177 @@ const char * schema_queries[][2] =
"removable INTEGER,"
"raisable INTEGER,"
"kind INTEGER,"
+ "id_bodyfile INTEGER,"
+ "bodystart INTEGER,"
+ "bodyend INTEGER,"
+ "detaileddescription TEXT,"
+ "briefdescription TEXT,"
+ "inbodydescription TEXT"
+ ")"
+ },
+ { "compounddef",
+ "CREATE TABLE IF NOT EXISTS compounddef ("
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ "name TEXT NOT NULL,"
+ "kind TEXT NOT NULL,"
+ "prot INTEGER NOT NULL,"
"refid TEXT NOT NULL,"
- "id_bfile INTEGER,"
- "bline INTEGER,"
- "bcolumn INTEGER,"
"id_file INTEGER NOT NULL,"
"line INTEGER NOT NULL,"
"column INTEGER NOT NULL)"
},
+ { "basecompoundref",
+ "CREATE TABLE IF NOT EXISTS basecompoundref ("
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "base TEXT NOT NULL,"
+ "derived TEXT NOT NULL,"
+ "refid TEXT NOT NULL,"
+ "prot INTEGER NOT NULL,"
+ "virt INTEGER NOT NULL)"
+ },
+ { "derivedcompoundref",
+ "CREATE TABLE IF NOT EXISTS derivedcompoundref ("
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "base TEXT NOT NULL,"
+ "derived TEXT NOT NULL,"
+ "refid TEXT NOT NULL,"
+ "prot INTEGER NOT NULL,"
+ "virt INTEGER NOT NULL)"
+ },
+ { "params",
+ "CREATE TABLE IF NOT EXISTS params ("
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ "attributes TEXT,"
+ "type TEXT,"
+ "declname TEXT,"
+ "defnname TEXT,"
+ "array TEXT,"
+ "defval TEXT,"
+ "briefdescription TEXT)"
+ },
+ { "memberdef_params",
+ "CREATE TABLE IF NOT EXISTS memberdef_params ("
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ "id_memberdef INTEGER NOT NULL,"
+ "id_param INTEGER NOT NULL)"
+ },
+ { "innernamespaces",
+ "CREATE TABLE IF NOT EXISTS innernamespaces ("
+ "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ "refid TEXT NOT NULL,"
+ "name TEXT NOT NULL)"
+ }
+};
+
+//////////////////////////////////////////////////////
+struct SqlStmt {
+ const char *query;
+ sqlite3_stmt *stmt;
+};
+//////////////////////////////////////////////////////
+SqlStmt incl_insert = { "INSERT INTO includes "
+ "( local, id_src, id_dst ) "
+ "VALUES "
+ "(:local,:id_src,:id_dst )"
+ ,NULL
+};
+SqlStmt incl_select = { "SELECT COUNT(*) FROM includes WHERE "
+ "local=:local AND id_src=:id_src AND id_dst=:id_dst"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt innerclass_insert={"INSERT INTO innerclass "
+ "( refid, prot, name )"
+ "VALUES "
+ "(:refid,:prot,:name )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt files_select = {"SELECT rowid FROM files WHERE name=:name"
+ ,NULL
+};
+SqlStmt files_insert = {"INSERT INTO files "
+ "( name )"
+ "VALUES "
+ "(:name )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt refids_select = {"SELECT rowid FROM refids WHERE "
+ "refid=:refid"
+ ,NULL
+};
+SqlStmt refids_insert = {"INSERT INTO refids "
+ "( refid )"
+ "VALUES "
+ "(:refid )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt xrefs_insert= {"INSERT INTO xrefs "
+ "( refid_src, refid_dst, id_file, line, column )"
+ "VALUES "
+ "(:refid_src,:refid_dst,:id_file,:line,:column )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt memberdef_insert={"INSERT INTO memberdef "
+ "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, initializer, kind, id_bodyfile, bodystart, bodyend, id_file, line, column, detaileddescription, briefdescription, inbodydescription)"
+ "VALUES "
+ "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:initializer,:kind,:id_bodyfile,:bodystart,:bodyend,:id_file,:line,:column,:detaileddescription,:briefdescription,:inbodydescription)"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt compounddef_insert={"INSERT INTO compounddef "
+ "( name, kind, prot, refid, id_file, line, column ) "
+ "VALUES "
+ "(:name,:kind,:prot,:refid,:id_file,:line,:column )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt basecompoundref_insert={"INSERT INTO basecompoundref "
+ "( base, derived, refid, prot, virt ) "
+ "VALUES "
+ "(:base,:derived,:refid,:prot,:virt )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt derivedcompoundref_insert={"INSERT INTO derivedcompoundref "
+ "( refid, prot, virt, base, derived ) "
+ "VALUES "
+ "(:refid,:prot,:virt,:base,:derived )"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt params_select = { "SELECT rowid FROM params WHERE "
+ "(attributes IS NULL OR attributes=:attributes) AND "
+ "(type IS NULL OR type=:type) AND "
+ "(declname IS NULL OR declname=:declname) AND "
+ "(defnname IS NULL OR defnname=:defnname) AND "
+ "(array IS NULL OR array=:array) AND "
+ "(defval IS NULL OR defval=:defval) AND "
+ "(briefdescription IS NULL OR briefdescription=:briefdescription)"
+ ,NULL
+};
+SqlStmt params_insert = { "INSERT INTO params "
+ "( attributes, type, declname, defnname, array, defval, briefdescription ) "
+ "VALUES "
+ "(:attributes,:type,:declname,:defnname,:array,:defval,:briefdescription)"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt memberdef_params_insert={ "INSERT INTO memberdef_params "
+ "( id_memberdef, id_param)"
+ "VALUES "
+ "(:id_memberdef,:id_param)"
+ ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt innernamespace_insert={"INSERT INTO innernamespaces "
+ "( refid, name)"
+ "VALUES "
+ "(:refid,:name)",
+ NULL
};
@@ -242,78 +320,194 @@ class TextGeneratorSqlite3Impl : public TextGeneratorIntf
};
-static void bindTextParameter(sqlite3_stmt *stmt,const char *name,const char *value, bool _static=TRUE)
+static void bindTextParameter(SqlStmt &s,const char *name,const char *value, bool _static=TRUE)
{
- int idx = sqlite3_bind_parameter_index(stmt, name);
- sqlite3_bind_text(stmt, idx, value, -1, _static==TRUE?SQLITE_STATIC:SQLITE_TRANSIENT);
+ int idx = sqlite3_bind_parameter_index(s.stmt, name);
+ sqlite3_bind_text(s.stmt, idx, value, -1, _static==TRUE?SQLITE_STATIC:SQLITE_TRANSIENT);
}
-static void bindIntParameter(sqlite3_stmt *stmt,const char *name,int value)
+static void bindIntParameter(SqlStmt &s,const char *name,int value)
{
- int idx = sqlite3_bind_parameter_index(stmt, name);
- sqlite3_bind_int(stmt, idx, value);
+ int idx = sqlite3_bind_parameter_index(s.stmt, name);
+ sqlite3_bind_int(s.stmt, idx, value);
}
-static int step(sqlite3 *db, sqlite3_stmt *stmt,bool getRowId=FALSE)
+static int step(sqlite3 *db, SqlStmt &s,bool getRowId=FALSE, bool select=FALSE)
{
- int id=-1;
- int rc = sqlite3_step(stmt);
+ int rowid=-1;
+ int rc = sqlite3_step(s.stmt);
if (rc!=SQLITE_DONE && rc!=SQLITE_ROW)
{
msg("sqlite3_step failed: %s\n", sqlite3_errmsg(db));
+ sqlite3_clear_bindings(s.stmt);
return -1;
}
- if (getRowId) id = sqlite3_column_int(stmt, 0);
- sqlite3_reset(stmt);
- return id;
+ if (getRowId && select) rowid = sqlite3_column_int(s.stmt, 0); // works on selects, doesnt on inserts
+ if (getRowId && !select) rowid = sqlite3_last_insert_rowid(db); //works on inserts, doesnt on selects
+ sqlite3_reset(s.stmt);
+ sqlite3_clear_bindings(s.stmt); // XXX When should this really be called
+ return rowid;
}
static int insertFile(sqlite3 *db, const char* name)
{
- int id=-1;
- if (name==0) return -1;
+ int rowid=-1;
+ if (name==0) return rowid;
- // see if it's already in DB
- bindTextParameter(id_s_files,":name",name);
- id=step(db,id_s_files,TRUE);
- if (id==0)
+ bindTextParameter(files_select,":name",name);
+ rowid=step(db,files_select,TRUE,TRUE);
+ if (rowid==0)
{
- // insert it
- bindTextParameter(i_s_files,":name",name);
+ bindTextParameter(files_insert,":name",name);
+ rowid=step(db,files_insert,TRUE);
+ }
+ return rowid;
+}
+
+static int insertRefid(sqlite3 *db, const char *refid)
+{
+ int rowid=-1;
+ if (refid==0) return rowid;
- step(db,i_s_files);
- id=sqlite3_last_insert_rowid(db);
+ bindTextParameter(refids_select,":refid",refid);
+ rowid=step(db,refids_select,TRUE,TRUE);
+ if (rowid==0)
+ {
+ bindTextParameter(refids_insert,":refid",refid);
+ rowid=step(db,refids_insert,TRUE);
}
- return id;
+ return rowid;
}
-static int insertMemberReference(sqlite3 *db, const char*src, const char*dst, const char *file, int line, int column)
+
+static void insertMemberReference(sqlite3 *db, const char*src, const char*dst, const char *file, int line, int column)
{
int id_file = insertFile(db,file);
- bindTextParameter(i_s_xrefs,":src",src);
- bindTextParameter(i_s_xrefs,":dst",dst);
-
- bindIntParameter(i_s_xrefs,":id_file",id_file);
- bindIntParameter(i_s_xrefs,":line",line);
- bindIntParameter(i_s_xrefs,":column",column);
+ int refid_src = insertRefid(db,src);
+ int refid_dst = insertRefid(db,dst);
+ if (id_file==-1||refid_src==-1||refid_dst==-1)
+ return;
-return step(db,i_s_xrefs);
+ bindIntParameter(xrefs_insert,":refid_src",refid_src);
+ bindIntParameter(xrefs_insert,":refid_dst",refid_dst);
+ bindIntParameter(xrefs_insert,":id_file",id_file);
+ bindIntParameter(xrefs_insert,":line",line);
+ bindIntParameter(xrefs_insert,":column",1);
+ step(db,xrefs_insert);
}
static void insertMemberReference(sqlite3 *db, MemberDef *src, MemberDef *dst, const char*floc)
{
if (dst->getStartBodyLine()!=-1 && dst->getBodyDef())
{
- char file[4096] = { 0 };
+ static char file[4096];
int line=0,column=0;
if (floc)
{
- sscanf(floc,"%[^:]:%d:%d",file,&line,&column);
+ int rv = sscanf(floc,"%[^:]:%d:%d",file,&line,&column);
+ if (rv!=3)
+ {
+ msg("unable to read file loc from[%s]\n",floc);
+ return;
+ }
}
insertMemberReference(db,src->anchor().data(),dst->anchor().data(),file,line,column);
}
}
+static void insertMemberFunctionParams(sqlite3 *db,int id_memberdef,MemberDef *md,Definition *def)
+{
+ ArgumentList *declAl = md->declArgumentList();
+ ArgumentList *defAl = md->argumentList();
+ if (declAl!=0 && declAl->count()>0)
+ {
+ ArgumentListIterator declAli(*declAl);
+ ArgumentListIterator defAli(*defAl);
+ Argument *a;
+ for (declAli.toFirst();(a=declAli.current());++declAli)
+ {
+ Argument *defArg = defAli.current();
+
+ if (!a->attrib.isEmpty())
+ {
+ bindTextParameter(params_select,":attributes",a->attrib.data());
+ bindTextParameter(params_insert,":attributes",a->attrib.data());
+ }
+ if (!a->type.isEmpty())
+ {
+ StringList l;
+ linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type);
+
+ StringListIterator li(l);
+ QCString *s;
+ while ((s=li.current()))
+ {
+ insertMemberReference(db,md->anchor().data(),s->data(),def->getDefFileName().data(),md->getDefLine(),1);
+ ++li;
+ }
+ bindTextParameter(params_select,":type",a->type.data());
+ bindTextParameter(params_insert,":type",a->type.data());
+ }
+ if (!a->name.isEmpty())
+ {
+ bindTextParameter(params_select,":declname",a->name.data());
+ bindTextParameter(params_insert,":declname",a->name.data());
+ }
+ if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
+ {
+ bindTextParameter(params_select,":defnname",defArg->name.data());
+ bindTextParameter(params_insert,":defnname",defArg->name.data());
+ }
+ if (!a->array.isEmpty())
+ {
+ bindTextParameter(params_select,":array",a->array.data());
+ bindTextParameter(params_insert,":array",a->array.data());
+ }
+ if (!a->defval.isEmpty())
+ {
+ StringList l;
+ linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
+ bindTextParameter(params_select,":defval",a->defval.data());
+ bindTextParameter(params_insert,":defval",a->defval.data());
+ }
+ if (defArg) ++defAli;
+
+ int id_param=step(db,params_select,TRUE,TRUE);
+ if (id_param==0) {
+ id_param=step(db,params_insert,TRUE);
+ }
+
+ bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
+ bindIntParameter(memberdef_params_insert,":id_param",id_param);
+ step(db,memberdef_params_insert);
+ }
+ }
+}
+
+static void insertMemberDefineParams(sqlite3 *db,int id_memberdef,MemberDef *md,Definition *def)
+{
+ if (md->argumentList()->count()==0) // special case for "foo()" to
+ // disguish it from "foo".
+ {
+ DBG_CTX(("no params\n"));
+ }
+ else
+ {
+ ArgumentListIterator ali(*md->argumentList());
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ bindTextParameter(params_insert,":defnname",a->type.data());
+ int id_param=step(db,params_insert,TRUE);
+
+ bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
+ bindIntParameter(memberdef_params_insert,":id_param",id_param);
+ step(db,memberdef_params_insert);
+ }
+ }
+}
+
+
static void stripQualifiers(QCString &typeStr)
{
bool done=FALSE;
@@ -327,13 +521,13 @@ static void stripQualifiers(QCString &typeStr)
}
}
-static int prepareStatement(sqlite3 *db, const char* query, sqlite3_stmt **statement)
+static int prepareStatement(sqlite3 *db, SqlStmt &s)
{
int rc;
- rc = sqlite3_prepare_v2(db,query,-1,statement,0);
+ rc = sqlite3_prepare_v2(db,s.query,-1,&s.stmt,0);
if (rc!=SQLITE_OK)
{
- msg("prepare failed for %s\n%s\n", query, sqlite3_errmsg(db));
+ msg("prepare failed for %s\n%s\n", s.query, sqlite3_errmsg(db));
return -1;
}
return rc;
@@ -342,17 +536,22 @@ static int prepareStatement(sqlite3 *db, const char* query, sqlite3_stmt **state
static int prepareStatements(sqlite3 *db)
{
if (
- -1==prepareStatement(db, id_q_memberdef, &id_s_memberdef) ||
- -1==prepareStatement(db, id_q_files, &id_s_files) ||
- -1==prepareStatement(db, i_q_files, &i_s_files) ||
- -1==prepareStatement(db, i_q_xrefs, &i_s_xrefs) ||
- -1==prepareStatement(db, i_q_innerclass, &i_s_innerclass) ||
- -1==prepareStatement(db, i_q_memberdef, &i_s_memberdef) ||
- -1==prepareStatement(db, i_q_compounddef, &i_s_compounddef) ||
- -1==prepareStatement(db, i_q_basecompoundref, &i_s_basecompoundref) ||
- -1==prepareStatement(db, i_q_derivedcompoundref, &i_s_derivedcompoundref) ||
- -1==prepareStatement(db, i_q_includes, &i_s_includes)||
- -1==prepareStatement(db, c_q_includes, &c_s_includes)
+ -1==prepareStatement(db, memberdef_insert) ||
+ -1==prepareStatement(db, files_insert) ||
+ -1==prepareStatement(db, files_select) ||
+ -1==prepareStatement(db, refids_insert) ||
+ -1==prepareStatement(db, refids_select) ||
+ -1==prepareStatement(db, incl_insert)||
+ -1==prepareStatement(db, incl_select)||
+ -1==prepareStatement(db, params_insert) ||
+ -1==prepareStatement(db, params_select) ||
+ -1==prepareStatement(db, xrefs_insert) ||
+ -1==prepareStatement(db, innerclass_insert) ||
+ -1==prepareStatement(db, compounddef_insert) ||
+ -1==prepareStatement(db, basecompoundref_insert) ||
+ -1==prepareStatement(db, derivedcompoundref_insert) ||
+ -1==prepareStatement(db, memberdef_params_insert)||
+ -1==prepareStatement(db, innernamespace_insert)
)
{
return -1;
@@ -377,6 +576,7 @@ static void pragmaTuning(sqlite3 *db)
char * sErrMsg = 0;
sqlite3_exec(db, "PRAGMA synchronous = OFF", NULL, NULL, &sErrMsg);
sqlite3_exec(db, "PRAGMA journal_mode = MEMORY", NULL, NULL, &sErrMsg);
+ sqlite3_exec(db, "PRAGMA temp_store = MEMORY;", NULL, NULL, &sErrMsg);
}
static int initializeSchema(sqlite3* db)
@@ -387,7 +587,6 @@ static int initializeSchema(sqlite3* db)
msg("Initializing DB schema...\n");
for (unsigned int k = 0; k < sizeof(schema_queries) / sizeof(schema_queries[0]); k++)
{
- //const char *tname = schema_queries[k][0];
const char *q = schema_queries[k][1];
// create table
rc = sqlite3_prepare_v2(db, q, -1, &stmt, 0);
@@ -418,18 +617,17 @@ static void writeInnerClasses(sqlite3*db,const ClassSDict *cl)
{
if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
{
- bindTextParameter(i_s_innerclass,":refid",cd->getOutputFileBase(),FALSE);
- bindIntParameter(i_s_innerclass,":prot",cd->protection());
- bindTextParameter(i_s_innerclass,":name",cd->name());
- if (-1==step(db,i_s_innerclass))
- return;
+ bindTextParameter(innerclass_insert,":refid",cd->getOutputFileBase(),FALSE);
+ bindIntParameter(innerclass_insert,":prot",cd->protection());
+ bindTextParameter(innerclass_insert,":name",cd->name());
+ step(db,innerclass_insert);
}
}
}
-static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
+
+static void writeInnerNamespaces(sqlite3 *db,const NamespaceSDict *nl)
{
-#warning WorkInProgress
if (nl)
{
NamespaceSDict::Iterator nli(*nl);
@@ -438,25 +636,62 @@ static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
{
if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
{
-// t << " <innernamespace refid=\"" << nd->getOutputFileBase()
-// << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
+ bindTextParameter(innernamespace_insert,":refid",nd->getOutputFileBase(),FALSE);
+ bindTextParameter(innernamespace_insert,":name",nd->name(),FALSE);
+ step(db,innernamespace_insert);
}
}
}
}
-static void writeTemplateArgumentList(sqlite3* /*db*/,
- ArgumentList * /*al*/,
- Definition * /*scope*/,
- FileDef * /*fileScope*/,
- int /*indent*/)
+
+static void writeTemplateArgumentList(sqlite3* db,
+ ArgumentList * al,
+ Definition * scope,
+ FileDef * fileScope)
{
-#warning WorkInProgress
+ if (al)
+ {
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (!a->type.isEmpty())
+ {
+ #warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
+ bindTextParameter(params_select,":type",a->type);
+ bindTextParameter(params_insert,":type",a->type);
+ }
+ if (!a->name.isEmpty())
+ {
+ bindTextParameter(params_select,":declname",a->name);
+ bindTextParameter(params_insert,":declname",a->name);
+ bindTextParameter(params_select,":defnname",a->name);
+ bindTextParameter(params_insert,":defnname",a->name);
+ }
+ if (!a->defval.isEmpty())
+ {
+ #warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
+ bindTextParameter(params_select,":defval",a->defval);
+ bindTextParameter(params_insert,":defval",a->defval);
+ }
+ if (!step(db,params_select,TRUE,TRUE))
+ step(db,params_insert);
+ }
+ }
}
+static void writeMemberTemplateLists(sqlite3* db,MemberDef *md)
+{
+ ArgumentList *templMd = md->templateArguments();
+ if (templMd) // function template prefix
+ {
+ writeTemplateArgumentList(db,templMd,md->getClassDef(),md->getFileDef());
+ }
+}
static void writeTemplateList(sqlite3*db,ClassDef *cd)
{
- writeTemplateArgumentList(db,cd->templateArguments(),cd,0,4);
+ writeTemplateArgumentList(db,cd->templateArguments(),cd,0);
}
////////////////////////////////////////////
@@ -476,7 +711,6 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
// + template arguments
// (templateArguments(), definitionTemplateParameterLists())
// - call graph
- msg("=====%s\n",md->name().data());
// enum values are written as part of the enum
if (md->memberType()==MemberType_EnumValue) return;
@@ -487,10 +721,11 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
//if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
QCString memType;
// memberdef
- bindTextParameter(i_s_memberdef,":refid",md->anchor().data(),FALSE);
- bindIntParameter(i_s_memberdef,":kind",md->memberType());
- bindIntParameter(i_s_memberdef,":prot",md->protection());
- bindIntParameter(i_s_memberdef,":static",md->isStatic());
+ bindTextParameter(memberdef_insert,":refid",md->anchor().data(),FALSE);
+ bindIntParameter(memberdef_insert,":kind",md->memberType());
+ bindIntParameter(memberdef_insert,":prot",md->protection());
+
+ bindIntParameter(memberdef_insert,":static",md->isStatic());
bool isFunc=FALSE;
switch (md->memberType())
@@ -510,45 +745,44 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
ArgumentList *al = md->argumentList();
if (al!=0 && al->constSpecifier)
{
- bindIntParameter(i_s_memberdef,":const",al->constSpecifier);
+ bindIntParameter(memberdef_insert,":const",al->constSpecifier);
}
-
- bindIntParameter(i_s_memberdef,":explicit",md->isExplicit());
- bindIntParameter(i_s_memberdef,":inline",md->isInline());
- bindIntParameter(i_s_memberdef,":final",md->isFinal());
- bindIntParameter(i_s_memberdef,":sealed",md->isSealed());
- bindIntParameter(i_s_memberdef,":new",md->isNew());
- bindIntParameter(i_s_memberdef,":optional",md->isOptional());
- bindIntParameter(i_s_memberdef,":required",md->isRequired());
- bindIntParameter(i_s_memberdef,":virt",md->virtualness());
+ bindIntParameter(memberdef_insert,":explicit",md->isExplicit());
+ bindIntParameter(memberdef_insert,":inline",md->isInline());
+ bindIntParameter(memberdef_insert,":final",md->isFinal());
+ bindIntParameter(memberdef_insert,":sealed",md->isSealed());
+ bindIntParameter(memberdef_insert,":new",md->isNew());
+ bindIntParameter(memberdef_insert,":optional",md->isOptional());
+ bindIntParameter(memberdef_insert,":required",md->isRequired());
+
+ bindIntParameter(memberdef_insert,":virt",md->virtualness());
}
// place in the arguments and linkify the arguments
if (md->memberType() == MemberType_Variable)
{
- bindIntParameter(i_s_memberdef,":mutable",md->isMutable());
- bindIntParameter(i_s_memberdef,":initonly",md->isInitonly());
+ bindIntParameter(memberdef_insert,":mutable",md->isMutable());
+ bindIntParameter(memberdef_insert,":initonly",md->isInitonly());
}
else if (md->memberType() == MemberType_Property)
{
- bindIntParameter(i_s_memberdef,":readable",md->isReadable());
- bindIntParameter(i_s_memberdef,":writable",md->isWritable());
- bindIntParameter(i_s_memberdef,":gettable",md->isGettable());
- bindIntParameter(i_s_memberdef,":settable",md->isSettable());
-
+ bindIntParameter(memberdef_insert,":readable",md->isReadable());
+ bindIntParameter(memberdef_insert,":writable",md->isWritable());
+ bindIntParameter(memberdef_insert,":gettable",md->isGettable());
+ bindIntParameter(memberdef_insert,":settable",md->isSettable());
if (md->isAssign() || md->isCopy() || md->isRetain())
{
int accessor = md->isAssign() ? md->isAssign() :
(md->isCopy() ? md->isCopy() : md->isRetain()) ;
- bindIntParameter(i_s_memberdef,":accessor",accessor);
+ bindIntParameter(memberdef_insert,":accessor",accessor);
}
}
else if (md->memberType() == MemberType_Event)
{
- bindIntParameter(i_s_memberdef,":addable",md->isAddable());
- bindIntParameter(i_s_memberdef,":removable",md->isRemovable());
- bindIntParameter(i_s_memberdef,":raisable",md->isRaisable());
+ bindIntParameter(memberdef_insert,":addable",md->isAddable());
+ bindIntParameter(memberdef_insert,":removable",md->isRemovable());
+ bindIntParameter(memberdef_insert,":raisable",md->isRaisable());
}
// + declaration/definition arg lists
@@ -556,121 +790,55 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
md->memberType()!=MemberType_Enumeration
)
{
+ if (md->memberType()!=MemberType_Typedef)
+ {
+ writeMemberTemplateLists(db,md);
+ }
QCString typeStr = md->typeString();
stripQualifiers(typeStr);
StringList l;
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,typeStr);
if (typeStr.data())
{
- bindTextParameter(i_s_memberdef,":type",typeStr.data(),FALSE);
+ bindTextParameter(memberdef_insert,":type",typeStr.data(),FALSE);
}
if (md->definition())
{
- bindTextParameter(i_s_memberdef,":definition",md->definition());
+ bindTextParameter(memberdef_insert,":definition",md->definition());
}
if (md->argsString())
{
- bindTextParameter(i_s_memberdef,":argsstring",md->argsString());
+ bindTextParameter(memberdef_insert,":argsstring",md->argsString());
}
}
- bindTextParameter(i_s_memberdef,":name",md->name());
+ bindTextParameter(memberdef_insert,":name",md->name());
if (md->memberType() == MemberType_Property)
{
if (md->isReadable())
{
- DBG_CTX(("<read>\n"));
+ bindIntParameter(memberdef_insert,":readable",1);
}
if (md->isWritable())
{
- DBG_CTX(("<write>\n"));
- }
- }
- if (isFunc) //function
- {
- ArgumentList *declAl = md->declArgumentList();
- ArgumentList *defAl = md->argumentList();
- if (declAl!=0 && declAl->count()>0)
- {
- ArgumentListIterator declAli(*declAl);
- ArgumentListIterator defAli(*defAl);
- Argument *a;
- for (declAli.toFirst();(a=declAli.current());++declAli)
- {
- Argument *defArg = defAli.current();
- DBG_CTX(("<param>\n"));
- if (!a->attrib.isEmpty())
- {
- DBG_CTX(("<attributes>:%s\n",a->attrib.data()));
- }
- if (!a->type.isEmpty())
- {
- StringList l;
- linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type);
-
- QCString *s=l.first();
- while (s)
- {
- insertMemberReference(db,md->anchor().data(),s->data(),def->getDefFileName().data(),md->getDefLine(),1);
- s=l.next();
- }
- }
- if (!a->name.isEmpty())
- {
- DBG_CTX(("<declname>%s\n",a->name.data()));
- }
- if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
- {
- DBG_CTX(("<defname>%s\n",defArg->name.data()));
- }
- if (!a->array.isEmpty())
- {
- DBG_CTX(("<array>%s",a->array.data()));
- }
- if (!a->defval.isEmpty())
- {
- StringList l;
- linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
- }
- if (defArg) ++defAli;
- }
- }
- }
- else if (md->memberType()==MemberType_Define &&
- md->argsString()) // define
- {
- if (md->argumentList()->count()==0) // special case for "foo()" to
- // disguish it from "foo".
- {
- DBG_CTX(("no params\n"));
- }
- else
- {
- ArgumentListIterator ali(*md->argumentList());
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- DBG_CTX(("<param><defname>%s\n",a->type.data()));
- }
+ bindIntParameter(memberdef_insert,":writable",1);
}
}
// Extract references from initializer
- // avoid that extremely large tables are written to the output.
- // todo: it's better to adhere to MAX_INITIALIZER_LINES.
- // drm_mod_register_buffer,
- if (!md->initializer().isEmpty() && md->initializer().length()<2000)
+ if (md->hasMultiLineInitializer() || md->hasOneLineInitializer())
{
- bindTextParameter(i_s_memberdef,":initializer",md->initializer().data());
+ bindTextParameter(memberdef_insert,":initializer",md->initializer().data());
StringList l;
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer());
- QCString *s=l.first();
- while (s)
+ StringListIterator li(l);
+ QCString *s;
+ while ((s=li.current()))
{
if (md->getBodyDef())
{
@@ -681,48 +849,58 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
md->getStartBodyLine()));
insertMemberReference(db,md->anchor().data(),s->data(),md->getBodyDef()->getDefFileName().data(),md->getStartBodyLine(),1);
}
- s=l.next();
+ ++li;
}
}
if ( md->getScopeString() )
{
- bindTextParameter(i_s_memberdef,":scope",md->getScopeString().data(),FALSE);
+ bindTextParameter(memberdef_insert,":scope",md->getScopeString().data(),FALSE);
}
+ // +Brief, detailed and inbody description
+ bindTextParameter(memberdef_insert,":briefdescription",md->briefDescription(),FALSE);
+ bindTextParameter(memberdef_insert,":detaileddescription",md->documentation(),FALSE);
+ bindTextParameter(memberdef_insert,":inbodydescription",md->inbodyDocumentation(),FALSE);
+
// File location
if (md->getDefLine() != -1)
{
int id_file = insertFile(db,md->getDefFileName());
if (id_file!=-1)
{
- bindIntParameter(i_s_memberdef,":id_file",id_file);
- bindIntParameter(i_s_memberdef,":line",md->getDefLine());
- bindIntParameter(i_s_memberdef,":column",md->getDefColumn());
+ bindIntParameter(memberdef_insert,":id_file",id_file);
+ bindIntParameter(memberdef_insert,":line",md->getDefLine());
+ bindIntParameter(memberdef_insert,":column",md->getDefColumn());
if (md->getStartBodyLine()!=-1)
{
- int id_bfile = insertFile(db,md->getBodyDef()->absFilePath());
- if (id_bfile == -1)
+ int id_bodyfile = insertFile(db,md->getBodyDef()->absFilePath());
+ if (id_bodyfile == -1)
{
- sqlite3_clear_bindings(i_s_memberdef);
- return;
+ sqlite3_clear_bindings(memberdef_insert.stmt);
+ }
+ else
+ {
+ bindIntParameter(memberdef_insert,":id_bodyfile",id_bodyfile);
+ bindIntParameter(memberdef_insert,":bodystart",md->getStartBodyLine());
+ bindIntParameter(memberdef_insert,":bodyend",md->getEndBodyLine());
}
-
- bindIntParameter(i_s_memberdef,":id_ibfile",id_bfile);
- bindIntParameter(i_s_memberdef,":bline",md->getStartBodyLine());
-
- // XXX implement getStartBodyColumn
- bindIntParameter(i_s_memberdef,":bcolumn",1);
}
}
}
- if (-1==step(db,i_s_memberdef))
+ int id_memberdef=step(db,memberdef_insert,TRUE);
+
+ if (isFunc)
+ {
+ insertMemberFunctionParams(db,id_memberdef,md,def);
+ }
+ else if (md->memberType()==MemberType_Define &&
+ md->argsString())
{
- sqlite3_clear_bindings(i_s_memberdef);
+ insertMemberDefineParams(db,id_memberdef,md,def);
}
- /*int id_src =*/ sqlite3_last_insert_rowid(db);
// + source references
// The cross-references in initializers only work when both the src and dst
@@ -737,7 +915,6 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
insertMemberReference(db,md,rmd,mdi.currentKey());
}
}
-
// + source referenced by
mdict = md->getReferencedByMembers();
if (mdict!=0)
@@ -762,7 +939,6 @@ static void generateSqlite3Section(sqlite3*db,
int count=0;
for (mli.toFirst();(md=mli.current());++mli)
{
- msg("I:%s\n",md->name().data());
// namespace members are also inserted in the file scope, but
// to prevent this duplication in the XML output, we filter those here.
if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
@@ -808,24 +984,17 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
msg("Generating Sqlite3 output for class %s\n",cd->name().data());
- //int idx,rc;
- //sqlite3_stmt *stmt ;
-
- // + compounddef
- //stmt = i_s_compounddef;
-
- bindTextParameter(i_s_compounddef,":name",cd->name());
- bindTextParameter(i_s_compounddef,":kind",cd->compoundTypeString(),FALSE);
- bindIntParameter(i_s_compounddef,":prot",cd->protection());
- bindTextParameter(i_s_compounddef,":refid",cd->getOutputFileBase(),FALSE);
+ bindTextParameter(compounddef_insert,":name",cd->name());
+ bindTextParameter(compounddef_insert,":kind",cd->compoundTypeString(),FALSE);
+ bindIntParameter(compounddef_insert,":prot",cd->protection());
+ bindTextParameter(compounddef_insert,":refid",cd->getOutputFileBase(),FALSE);
int id_file = insertFile(db,cd->getDefFileName().data());
- bindIntParameter(i_s_compounddef,":id_file",id_file);
- bindIntParameter(i_s_compounddef,":line",cd->getDefLine());
- bindIntParameter(i_s_compounddef,":column",cd->getDefColumn());
+ bindIntParameter(compounddef_insert,":id_file",id_file);
+ bindIntParameter(compounddef_insert,":line",cd->getDefLine());
+ bindIntParameter(compounddef_insert,":column",cd->getDefColumn());
- if (-1==step(db,i_s_compounddef))
- return;
+ step(db,compounddef_insert);
// + list of direct super classes
if (cd->baseClasses())
@@ -834,21 +1003,20 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
BaseClassDef *bcd;
for (bcli.toFirst();(bcd=bcli.current());++bcli)
{
- bindTextParameter(i_s_basecompoundref,":refid",bcd->classDef->getOutputFileBase());
- bindIntParameter(i_s_basecompoundref,":prot",bcd->prot);
- bindIntParameter(i_s_basecompoundref,":virt",bcd->virt);
+ bindTextParameter(basecompoundref_insert,":refid",bcd->classDef->getOutputFileBase(),FALSE);
+ bindIntParameter(basecompoundref_insert,":prot",bcd->prot);
+ bindIntParameter(basecompoundref_insert,":virt",bcd->virt);
if (!bcd->templSpecifiers.isEmpty())
{
- bindTextParameter(i_s_basecompoundref,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers));
+ bindTextParameter(basecompoundref_insert,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers),FALSE);
}
else
{
- bindTextParameter(i_s_basecompoundref,":base",bcd->classDef->displayName());
+ bindTextParameter(basecompoundref_insert,":base",bcd->classDef->displayName(),FALSE);
}
- bindTextParameter(i_s_basecompoundref,":derived",cd->displayName());
- if (-1==step(db,i_s_basecompoundref))
- continue;
+ bindTextParameter(basecompoundref_insert,":derived",cd->displayName(),FALSE);
+ step(db,basecompoundref_insert);
}
}
@@ -859,13 +1027,12 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
BaseClassDef *bcd;
for (bcli.toFirst();(bcd=bcli.current());++bcli)
{
- bindTextParameter(i_s_derivedcompoundref,":base",cd->displayName());
- bindTextParameter(i_s_derivedcompoundref,":dervied",bcd->classDef->displayName());
- bindTextParameter(i_s_derivedcompoundref,":refid",bcd->classDef->getOutputFileBase());
- bindIntParameter(i_s_derivedcompoundref,":prot",bcd->prot);
- bindIntParameter(i_s_derivedcompoundref,":virt",bcd->virt);
- if (-1==step(db,i_s_derivedcompoundref))
- continue;
+ bindTextParameter(derivedcompoundref_insert,":base",cd->displayName());
+ bindTextParameter(derivedcompoundref_insert,":dervied",bcd->classDef->displayName());
+ bindTextParameter(derivedcompoundref_insert,":refid",bcd->classDef->getOutputFileBase());
+ bindIntParameter(derivedcompoundref_insert,":prot",bcd->prot);
+ bindIntParameter(derivedcompoundref_insert,":virt",bcd->virt);
+ step(db,derivedcompoundref_insert);
}
}
@@ -877,21 +1044,22 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
if (!nm.isEmpty())
{
- bindIntParameter(c_s_includes,":local",ii->local);
- bindIntParameter(c_s_includes,":id_src",id_file);
- bindTextParameter(c_s_includes,":dst",nm);
- int count=step(db,c_s_includes,TRUE);
- if (count==0)
- {
- bindIntParameter(i_s_includes,":local",ii->local);
- bindIntParameter(i_s_includes,":id_src",id_file);
- bindTextParameter(i_s_includes,":dst",nm);
- if (-1==step(db,i_s_includes))
- return;
+ int id_dst=insertFile(db,nm);
+ if (id_dst!=-1) {
+ bindIntParameter(incl_select,":local",ii->local);
+ bindIntParameter(incl_select,":id_src",id_file);
+ bindIntParameter(incl_select,":id_dst",id_dst);
+ int count=step(db,incl_select,TRUE,TRUE);
+ if (count==0)
+ {
+ bindIntParameter(incl_insert,":local",ii->local);
+ bindIntParameter(incl_insert,":id_src",id_file);
+ bindIntParameter(incl_insert,":id_dst",id_dst);
+ step(db,incl_insert);
+ }
}
}
}
-
// + list of inner classes
writeInnerClasses(db,cd->getClassSDict());
@@ -990,12 +1158,17 @@ static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
QListIterator<IncludeInfo> ili(*fd->includeFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
- int id_file=insertFile(db,fd->absFilePath().data());
- bindIntParameter(i_s_includes,":local",ii->local);
- bindIntParameter(i_s_includes,":id_src",id_file);
- bindTextParameter(i_s_includes,":dst",ii->includeName.data(),FALSE);
- if (-1==step(db,i_s_includes))
- continue;
+ int id_src=insertFile(db,fd->absFilePath().data());
+ int id_dst=insertFile(db,ii->includeName.data());
+ bindIntParameter(incl_select,":local",ii->local);
+ bindIntParameter(incl_select,":id_src",id_src);
+ bindIntParameter(incl_select,":id_dst",id_dst);
+ if (step(db,incl_select,TRUE,TRUE)==0) {
+ bindIntParameter(incl_insert,":local",ii->local);
+ bindIntParameter(incl_insert,":id_src",id_src);
+ bindIntParameter(incl_insert,":id_dst",id_dst);
+ step(db,incl_insert);
+ }
}
}
@@ -1005,13 +1178,17 @@ static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
QListIterator<IncludeInfo> ili(*fd->includedByFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
- int id_file=insertFile(db,ii->includeName);
- bindIntParameter(i_s_includes,":local",ii->local);
- bindIntParameter(i_s_includes,":id_src",id_file);
- bindTextParameter(i_s_includes,":dst",fd->absFilePath().data(),FALSE);
- if (-1==step(db,i_s_includes))
- continue;
-
+ int id_src=insertFile(db,ii->includeName);
+ int id_dst=insertFile(db,fd->absFilePath());
+ bindIntParameter(incl_select,":local",ii->local);
+ bindIntParameter(incl_select,":id_src",id_src);
+ bindIntParameter(incl_select,":id_dst",id_dst);
+ if (step(db,incl_select,TRUE,TRUE)==0) {
+ bindIntParameter(incl_insert,":local",ii->local);
+ bindIntParameter(incl_insert,":id_src",id_src);
+ bindIntParameter(incl_insert,":id_dst",id_dst);
+ step(db,incl_insert);
+ }
}
}
@@ -1053,16 +1230,17 @@ static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
static void generateSqlite3ForGroup(sqlite3*db,GroupDef *gd)
{
- db=db;
- gd=gd;
+#warning WorkInProgress
}
static void generateSqlite3ForDir(sqlite3 *db,DirDef *dd)
{
+#warning WorkInProgress
}
static void generateSqlite3ForPage(sqlite3 *db,PageDef *pd,bool isExample)
{
+#warning WorkInProgress
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -1189,4 +1367,4 @@ void generateSqlite3()
err("sqlite3 support has not been compiled in!");
}
#endif
-
+// vim: noai:ts=2:sw=2:ss=2:expandtab
diff --git a/src/sqlite3gen.h b/src/sqlite3gen.h
index 689f1da..59664dd 100644
--- a/src/sqlite3gen.h
+++ b/src/sqlite3gen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/store.cpp b/src/store.cpp
index 7e5118a..8916015 100644
--- a/src/store.cpp
+++ b/src/store.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/store.h b/src/store.h
index d075dc0..597ea63 100644
--- a/src/store.h
+++ b/src/store.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index 03cc020..036e24f 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -1120,7 +1120,7 @@ void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l)
{
//printf("New sectionInfo file=%s anchor=%s\n",
// ta->fileName.data(),ta->label.data());
- SectionInfo *si=new SectionInfo(ta->fileName,ta->label,ta->title,
+ SectionInfo *si=new SectionInfo(ta->fileName,-1,ta->label,ta->title,
SectionInfo::Anchor,0,m_tagName);
Doxygen::sectionDict->append(ta->label,si);
e->anchors->append(si);
@@ -1274,8 +1274,9 @@ static QCString stripPath(const QCString &s)
void TagFileParser::buildLists(Entry *root)
{
// build class list
- TagClassInfo *tci = m_tagFileClasses.first();
- while (tci)
+ QListIterator<TagClassInfo> cit(m_tagFileClasses);
+ TagClassInfo *tci;
+ for (cit.toFirst();(tci=cit.current());++cit)
{
Entry *ce = new Entry;
ce->section = Entry::CLASS_SEC;
@@ -1290,7 +1291,7 @@ void TagFileParser::buildLists(Entry *root)
case TagClassInfo::Category: ce->spec = Entry::Category; break;
}
ce->name = tci->name;
- if (tci->kind==TagClassInfo::Protocol)
+ if (tci->kind==TagClassInfo::Protocol)
{
ce->name+="-p";
}
@@ -1309,14 +1310,14 @@ void TagFileParser::buildLists(Entry *root)
}
if (tci->templateArguments)
{
- if (ce->tArgLists==0)
+ if (ce->tArgLists==0)
{
ce->tArgLists = new QList<ArgumentList>;
ce->tArgLists->setAutoDelete(TRUE);
}
ArgumentList *al = new ArgumentList;
ce->tArgLists->append(al);
-
+
QListIterator<QCString> sli(*tci->templateArguments);
QCString *argName;
for (;(argName=sli.current());++sli)
@@ -1330,12 +1331,12 @@ void TagFileParser::buildLists(Entry *root)
buildMemberList(ce,tci->members);
root->addSubEntry(ce);
- tci = m_tagFileClasses.next();
}
// build file list
- TagFileInfo *tfi = m_tagFileFiles.first();
- while (tfi)
+ QListIterator<TagFileInfo> fit(m_tagFileFiles);
+ TagFileInfo *tfi;
+ for (fit.toFirst();(tfi=fit.current());++fit)
{
Entry *fe = new Entry;
fe->section = guessSection(tfi->name);
@@ -1367,12 +1368,12 @@ void TagFileParser::buildLists(Entry *root)
}
buildMemberList(fe,tfi->members);
root->addSubEntry(fe);
- tfi = m_tagFileFiles.next();
}
// build namespace list
- TagNamespaceInfo *tni = m_tagFileNamespaces.first();
- while (tni)
+ QListIterator<TagNamespaceInfo> nit(m_tagFileNamespaces);
+ TagNamespaceInfo *tni;
+ for (nit.toFirst();(tni=nit.current());++nit)
{
Entry *ne = new Entry;
ne->section = Entry::NAMESPACE_SEC;
@@ -1386,12 +1387,12 @@ void TagFileParser::buildLists(Entry *root)
buildMemberList(ne,tni->members);
root->addSubEntry(ne);
- tni = m_tagFileNamespaces.next();
}
// build package list
- TagPackageInfo *tpgi = m_tagFilePackages.first();
- while (tpgi)
+ QListIterator<TagPackageInfo> pit(m_tagFilePackages);
+ TagPackageInfo *tpgi;
+ for (pit.toFirst();(tpgi=pit.current());++pit)
{
Entry *pe = new Entry;
pe->section = Entry::PACKAGE_SEC;
@@ -1404,34 +1405,31 @@ void TagFileParser::buildLists(Entry *root)
buildMemberList(pe,tpgi->members);
root->addSubEntry(pe);
- tpgi = m_tagFilePackages.next();
}
- // build group list, but only if config file says to include it
- //if (Config_getBool("EXTERNAL_GROUPS"))
- //{
- TagGroupInfo *tgi = m_tagFileGroups.first();
- while (tgi)
- {
- Entry *ge = new Entry;
- ge->section = Entry::GROUPDOC_SEC;
- ge->name = tgi->name;
- ge->type = tgi->title;
- addDocAnchors(ge,tgi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tgi->filename;
- ge->tagInfo = ti;
-
- buildMemberList(ge,tgi->members);
- root->addSubEntry(ge);
- tgi = m_tagFileGroups.next();
- }
- //}
+ // build group list
+ QListIterator<TagGroupInfo> git(m_tagFileGroups);
+ TagGroupInfo *tgi;
+ for (git.toFirst();(tgi=git.current());++git)
+ {
+ Entry *ge = new Entry;
+ ge->section = Entry::GROUPDOC_SEC;
+ ge->name = tgi->name;
+ ge->type = tgi->title;
+ addDocAnchors(ge,tgi->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tgi->filename;
+ ge->tagInfo = ti;
+
+ buildMemberList(ge,tgi->members);
+ root->addSubEntry(ge);
+ }
// build page list
- TagPageInfo *tpi = m_tagFilePages.first();
- while (tpi)
+ QListIterator<TagPageInfo> pgit(m_tagFilePages);
+ TagPageInfo *tpi;
+ for (pgit.toFirst();(tpi=pgit.current());++pgit)
{
Entry *pe = new Entry;
pe->section = Entry::PAGEDOC_SEC;
@@ -1444,14 +1442,14 @@ void TagFileParser::buildLists(Entry *root)
pe->tagInfo = ti;
root->addSubEntry(pe);
- tpi = m_tagFilePages.next();
}
}
void TagFileParser::addIncludes()
{
- TagFileInfo *tfi = m_tagFileFiles.first();
- while (tfi)
+ QListIterator<TagFileInfo> fit(m_tagFileFiles);
+ TagFileInfo *tfi;
+ for (fit.toFirst();(tfi=fit.current());++fit)
{
//printf("tag file tagName=%s path=%s name=%s\n",m_tagName.data(),tfi->path.data(),tfi->name.data());
FileName *fn = Doxygen::inputNameDict->find(tfi->name);
@@ -1489,9 +1487,8 @@ void TagFileParser::addIncludes()
}
}
}
- }
+ }
}
- tfi = m_tagFileFiles.next();
}
}
diff --git a/src/tagreader.h b/src/tagreader.h
index 73619db..1b5f7e3 100644
--- a/src/tagreader.h
+++ b/src/tagreader.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/tclscanner.h b/src/tclscanner.h
index 02627b4..baa8e84 100644
--- a/src/tclscanner.h
+++ b/src/tclscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
* Copyright (C) 2010-2011 by Rene Zaumseil
*
* Permission to use, copy, modify, and distribute this software and its
diff --git a/src/template.cpp b/src/template.cpp
index 8144afd..64d3523 100644
--- a/src/template.cpp
+++ b/src/template.cpp
@@ -29,7 +29,8 @@ class TemplateToken;
//-------------------------------------------------------------------
-static QValueList<QCString> split(const QCString &str,const QCString &sep,bool allowEmptyEntries=FALSE,bool cleanup=TRUE)
+static QValueList<QCString> split(const QCString &str,const QCString &sep,
+ bool allowEmptyEntries=FALSE,bool cleanup=TRUE)
{
QValueList<QCString> lst;
@@ -102,8 +103,8 @@ class TemplateVariant::Private
int intVal;
QCString strVal;
bool boolVal;
- const TemplateStructIntf *strukt;
- const TemplateListIntf *list;
+ TemplateStructIntf *strukt;
+ TemplateListIntf *list;
Delegate delegate;
bool raw;
};
@@ -144,17 +145,20 @@ TemplateVariant::TemplateVariant(const QCString &s,bool raw)
p->raw = raw;
}
-TemplateVariant::TemplateVariant(const TemplateStructIntf *s)
+TemplateVariant::TemplateVariant(TemplateStructIntf *s)
{
p = new Private;
p->type = Struct;
- p->strukt = s; }
+ p->strukt = s;
+ p->strukt->addRef();
+}
-TemplateVariant::TemplateVariant(const TemplateListIntf *l)
+TemplateVariant::TemplateVariant(TemplateListIntf *l)
{
p = new Private;
p->type = List;
p->list = l;
+ p->list->addRef();
}
TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
@@ -166,6 +170,8 @@ TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
TemplateVariant::~TemplateVariant()
{
+ if (p->type==Struct) p->strukt->release();
+ else if (p->type==List) p->list->release();
delete p;
}
@@ -180,14 +186,20 @@ TemplateVariant::TemplateVariant(const TemplateVariant &v)
case Bool: p->boolVal = v.p->boolVal; break;
case Integer: p->intVal = v.p->intVal; break;
case String: p->strVal = v.p->strVal; break;
- case Struct: p->strukt = v.p->strukt; break;
- case List: p->list = v.p->list; break;
+ case Struct: p->strukt = v.p->strukt; p->strukt->addRef(); break;
+ case List: p->list = v.p->list; p->list->addRef(); break;
case Function: p->delegate= v.p->delegate;break;
}
}
TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
{
+ // assignment can change the type of the variable, so we have to be
+ // careful with reference counted content.
+ TemplateStructIntf *tmpStruct = p->type==Struct ? p->strukt : 0;
+ TemplateListIntf *tmpList = p->type==List ? p->list : 0;
+ Type tmpType = p->type;
+
p->type = v.p->type;
p->raw = v.p->raw;
switch (p->type)
@@ -196,10 +208,14 @@ TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
case Bool: p->boolVal = v.p->boolVal; break;
case Integer: p->intVal = v.p->intVal; break;
case String: p->strVal = v.p->strVal; break;
- case Struct: p->strukt = v.p->strukt; break;
- case List: p->list = v.p->list; break;
+ case Struct: p->strukt = v.p->strukt; p->strukt->addRef(); break;
+ case List: p->list = v.p->list; p->list->addRef(); break;
case Function: p->delegate= v.p->delegate;break;
}
+
+ // release overwritten reference counted values
+ if (tmpType==Struct && tmpStruct) tmpStruct->release();
+ else if (tmpType==List && tmpList ) tmpList->release();
return *this;
}
@@ -289,12 +305,12 @@ int TemplateVariant::toInt() const
return result;
}
-const TemplateStructIntf *TemplateVariant::toStruct() const
+TemplateStructIntf *TemplateVariant::toStruct() const
{
return p->type==Struct ? p->strukt : 0;
}
-const TemplateListIntf *TemplateVariant::toList() const
+TemplateListIntf *TemplateVariant::toList() const
{
return p->type==List ? p->list : 0;
}
@@ -352,9 +368,10 @@ bool TemplateVariant::raw() const
class TemplateStruct::Private
{
public:
- Private() : fields(17)
+ Private() : fields(17), refCount(0)
{ fields.setAutoDelete(TRUE); }
QDict<TemplateVariant> fields;
+ int refCount;
};
TemplateStruct::TemplateStruct()
@@ -367,6 +384,21 @@ TemplateStruct::~TemplateStruct()
delete p;
}
+int TemplateStruct::addRef()
+{
+ return ++p->refCount;
+}
+
+int TemplateStruct::release()
+{
+ int count = --p->refCount;
+ if (count<=0)
+ {
+ delete this;
+ }
+ return count;
+}
+
void TemplateStruct::set(const char *name,const TemplateVariant &v)
{
TemplateVariant *pv = p->fields.find(name);
@@ -386,6 +418,11 @@ TemplateVariant TemplateStruct::get(const char *name) const
return v ? *v : TemplateVariant();
}
+TemplateStruct *TemplateStruct::alloc()
+{
+ return new TemplateStruct;
+}
+
//- Template list implementation ----------------------------------------------
@@ -393,9 +430,10 @@ TemplateVariant TemplateStruct::get(const char *name) const
class TemplateList::Private
{
public:
- Private() : index(-1) {}
+ Private() : index(-1), refCount(0) {}
QValueList<TemplateVariant> elems;
int index;
+ int refCount;
};
@@ -409,6 +447,21 @@ TemplateList::~TemplateList()
delete p;
}
+int TemplateList::addRef()
+{
+ return ++p->refCount;
+}
+
+int TemplateList::release()
+{
+ int count = --p->refCount;
+ if (count<=0)
+ {
+ delete this;
+ }
+ return count;
+}
+
int TemplateList::count() const
{
return p->elems.count();
@@ -491,6 +544,11 @@ TemplateVariant TemplateList::at(int index) const
}
}
+TemplateList *TemplateList::alloc()
+{
+ return new TemplateList;
+}
+
//- Operator types ------------------------------------------------------------
/** @brief Class representing operators that can appear in template expressions */
@@ -503,6 +561,8 @@ class Operator
not
in
==, !=, <, >, <=, >=
+ +, -
+ *, /, %
|
:
,
@@ -510,7 +570,9 @@ class Operator
enum Type
{
Or, And, Not, In, Equal, NotEqual, Less, Greater, LessEqual,
- GreaterEqual, Filter, Colon, Comma, Last
+ GreaterEqual, Plus, Minus, Multiply, Divide, Modulo, Filter, Colon, Comma,
+ LeftParen, RightParen,
+ Last
};
static const char *toString(Type op)
@@ -527,9 +589,16 @@ class Operator
case Greater: return ">";
case LessEqual: return "<=";
case GreaterEqual: return ">=";
+ case Plus: return "+";
+ case Minus: return "-";
+ case Multiply: return "*";
+ case Divide: return "/";
+ case Modulo: return "%";
case Filter: return "|";
case Colon: return ":";
case Comma: return ",";
+ case LeftParen: return "(";
+ case RightParen: return ")";
case Last: return "?";
}
return "?";
@@ -555,13 +624,21 @@ class TemplateBlockContext
QDict< QList<TemplateNodeBlock> > m_blocks;
};
+/** @brief A container to store a key-value pair */
+struct TemplateKeyValue
+{
+ TemplateKeyValue() {}
+ TemplateKeyValue(const QCString &k,const TemplateVariant &v) : key(k), value(v) {}
+ QCString key;
+ TemplateVariant value;
+};
/** @brief Internal class representing the implementation of a template
* context */
class TemplateContextImpl : public TemplateContext
{
public:
- TemplateContextImpl();
+ TemplateContextImpl(const TemplateEngine *e);
virtual ~TemplateContextImpl();
// TemplateContext methods
@@ -572,33 +649,50 @@ class TemplateContextImpl : public TemplateContext
const TemplateVariant *getRef(const QCString &name) const;
void setOutputDirectory(const QCString &dir)
{ m_outputDir = dir; }
- void setEscapeIntf(TemplateEscapeIntf *intf)
- { m_escapeIntf = intf; }
- void setSpacelessIntf(TemplateSpacelessIntf *intf)
- { m_spacelessIntf = intf; }
+ void setEscapeIntf(const QCString &ext,TemplateEscapeIntf *intf)
+ {
+ int i=(!ext.isEmpty() && ext.at(0)=='.') ? 1 : 0;
+ m_escapeIntfDict.insert(ext.mid(i),new TemplateEscapeIntf*(intf));
+ }
+ void selectEscapeIntf(const QCString &ext)
+ { TemplateEscapeIntf **ppIntf = m_escapeIntfDict.find(ext);
+ m_activeEscapeIntf = ppIntf ? *ppIntf : 0;
+ }
+ void setActiveEscapeIntf(TemplateEscapeIntf *intf) { m_activeEscapeIntf = intf; }
+ void setSpacelessIntf(TemplateSpacelessIntf *intf) { m_spacelessIntf = intf; }
// internal methods
TemplateBlockContext *blockContext();
TemplateVariant getPrimary(const QCString &name) const;
void setLocation(const QCString &templateName,int line)
{ m_templateName=templateName; m_line=line; }
- QCString templateName() const { return m_templateName; }
- int line() const { return m_line; }
- QCString outputDirectory() const { return m_outputDir; }
- TemplateEscapeIntf *escapeIntf() const { return m_escapeIntf; }
+ QCString templateName() const { return m_templateName; }
+ int line() const { return m_line; }
+ QCString outputDirectory() const { return m_outputDir; }
+ TemplateEscapeIntf *escapeIntf() const { return m_activeEscapeIntf; }
TemplateSpacelessIntf *spacelessIntf() const { return m_spacelessIntf; }
- void enableSpaceless(bool b) { m_spacelessEnabled=b; }
- bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; }
+ void enableSpaceless(bool b) { m_spacelessEnabled=b; }
+ bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; }
+ void warn(const char *fileName,int line,const char *fmt,...) const;
+
+ // index related functions
+ void openSubIndex(const QCString &indexName);
+ void closeSubIndex(const QCString &indexName);
+ void addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments);
private:
+ const TemplateEngine *m_engine;
QCString m_templateName;
int m_line;
QCString m_outputDir;
QList< QDict<TemplateVariant> > m_contextStack;
TemplateBlockContext m_blockContext;
- TemplateEscapeIntf *m_escapeIntf;
+ QDict<TemplateEscapeIntf*> m_escapeIntfDict;
+ TemplateEscapeIntf *m_activeEscapeIntf;
TemplateSpacelessIntf *m_spacelessIntf;
bool m_spacelessEnabled;
+ TemplateAutoRef<TemplateStruct> m_indices;
+ QDict< QStack<TemplateVariant> > m_indexStacks;
};
//-----------------------------------------------------------------------------
@@ -874,7 +968,7 @@ class ExprAstVariable : public ExprAst
TemplateVariant v = c->get(m_name);
if (!v.isValid())
{
- warn(ci->templateName(),ci->line(),"undefined variable '%s' in expression",m_name.data());
+ ci->warn(ci->templateName(),ci->line(),"undefined variable '%s' in expression",m_name.data());
}
return v;
}
@@ -887,7 +981,7 @@ class ExprAstFunctionVariable : public ExprAst
public:
ExprAstFunctionVariable(ExprAst *var,const QList<ExprAst> &args)
: m_var(var), m_args(args)
- { TRACE(("ExprAstFunctionVariable(%s)\n",var->name().data()));
+ { TRACE(("ExprAstFunctionVariable()\n"));
m_args.setAutoDelete(TRUE);
}
virtual TemplateVariant resolve(TemplateContext *c)
@@ -928,7 +1022,7 @@ class ExprAstFilter : public ExprAst
TemplateVariant result = TemplateFilterFactory::instance()->apply(m_name,v,arg,ok);
if (!ok)
{
- warn(ci->templateName(),ci->line(),"unknown filter '%s'",m_name.data());
+ ci->warn(ci->templateName(),ci->line(),"unknown filter '%s'",m_name.data());
}
return result;
}
@@ -979,6 +1073,28 @@ class ExprAstNegate : public ExprAst
ExprAst *m_expr;
};
+class ExprAstUnary : public ExprAst
+{
+ public:
+ ExprAstUnary(Operator::Type op,ExprAst *exp) : m_operator(op), m_exp(exp)
+ { TRACE(("ExprAstUnary %s\n",Operator::toString(op))); }
+ ~ExprAstUnary() { delete m_exp; }
+ virtual TemplateVariant resolve(TemplateContext *c)
+ {
+ TemplateVariant exp = m_exp->resolve(c);
+ switch (m_operator)
+ {
+ case Operator::Minus:
+ return -exp.toInt();
+ default:
+ return TemplateVariant();
+ }
+ }
+ private:
+ Operator::Type m_operator;
+ ExprAst *m_exp;
+};
+
/** @brief Class representing a binary operator in the AST */
class ExprAstBinary : public ExprAst
{
@@ -989,6 +1105,7 @@ class ExprAstBinary : public ExprAst
~ExprAstBinary() { delete m_lhs; delete m_rhs; }
virtual TemplateVariant resolve(TemplateContext *c)
{
+ TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
TemplateVariant lhs = m_lhs->resolve(c);
TemplateVariant rhs = m_rhs ? m_rhs->resolve(c) : TemplateVariant();
switch(m_operator)
@@ -1037,6 +1154,44 @@ class ExprAstBinary : public ExprAst
{
return lhs.toInt()>=rhs.toInt();
}
+ case Operator::Plus:
+ {
+ return TemplateVariant(lhs.toInt() + rhs.toInt());
+ }
+ case Operator::Minus:
+ {
+ return TemplateVariant(lhs.toInt() - rhs.toInt());
+ }
+ case Operator::Multiply:
+ {
+ return TemplateVariant(lhs.toInt() * rhs.toInt());
+ }
+ case Operator::Divide:
+ {
+ int denom = rhs.toInt();
+ if (denom!=0)
+ {
+ return TemplateVariant(lhs.toInt() / denom);
+ }
+ else // divide by zero
+ {
+ ci->warn(ci->templateName(),ci->line(),"division by zero while evaluating expression is undefined");
+ return 0;
+ }
+ }
+ case Operator::Modulo:
+ {
+ int denom = rhs.toInt();
+ if (denom!=0)
+ {
+ return TemplateVariant(lhs.toInt() % denom);
+ }
+ else // module zero
+ {
+ ci->warn(ci->templateName(),ci->line(),"modulo zero while evaluating expression is undefined");
+ return 0;
+ }
+ }
default:
return TemplateVariant();
}
@@ -1047,6 +1202,46 @@ class ExprAstBinary : public ExprAst
ExprAst *m_rhs;
};
+//----------------------------------------------------------
+
+/** @brief Base class of all nodes in a template's AST */
+class TemplateNode
+{
+ public:
+ TemplateNode(TemplateNode *parent) : m_parent(parent) {}
+ virtual ~TemplateNode() {}
+
+ virtual void render(FTextStream &ts, TemplateContext *c) = 0;
+
+ TemplateNode *parent() { return m_parent; }
+
+ private:
+ TemplateNode *m_parent;
+};
+
+//----------------------------------------------------------
+
+/** @brief Parser for templates */
+class TemplateParser
+{
+ public:
+ TemplateParser(const TemplateEngine *engine,
+ const QCString &templateName,QList<TemplateToken> &tokens);
+ void parse(TemplateNode *parent,int line,const QStrList &stopAt,
+ QList<TemplateNode> &nodes);
+ bool hasNextToken() const;
+ TemplateToken *takeNextToken();
+ void removeNextToken();
+ void prependToken(const TemplateToken *token);
+ const TemplateToken *currentToken() const;
+ QCString templateName() const { return m_templateName; }
+ void warn(const char *fileName,int line,const char *fmt,...) const;
+ private:
+ const TemplateEngine *m_engine;
+ QCString m_templateName;
+ QList<TemplateToken> &m_tokens;
+};
+
//--------------------------------------------------------------------
/** @brief Recursive decent parser for Django style template expressions.
@@ -1054,8 +1249,8 @@ class ExprAstBinary : public ExprAst
class ExpressionParser
{
public:
- ExpressionParser(const QCString &templateName,int line)
- : m_templateName(templateName), m_line(line), m_tokenStream(0)
+ ExpressionParser(const TemplateParser *parser,int line)
+ : m_parser(parser), m_line(line), m_tokenStream(0)
{
}
virtual ~ExpressionParser()
@@ -1067,23 +1262,7 @@ class ExpressionParser
if (expr==0) return 0;
m_tokenStream = expr;
getNextToken();
- return parseOrExpression();
- }
-
- ExprAst *parsePrimary(const char *expr)
- {
- if (expr==0) return 0;
- m_tokenStream = expr;
- getNextToken();
- return parsePrimaryExpression();
- }
-
- ExprAst *parseVariable(const char *varExpr)
- {
- if (varExpr==0) return 0;
- m_tokenStream = varExpr;
- getNextToken();
- return parseFilteredVariable();
+ return parseExpression();
}
private:
@@ -1106,6 +1285,14 @@ class ExpressionParser
Operator::Type op;
};
+ ExprAst *parseExpression()
+ {
+ TRACE(("{parseExpression(%s)\n",m_tokenStream));
+ ExprAst *result = parseOrExpression();
+ TRACE(("}parseExpression(%s)\n",m_tokenStream));
+ return result;
+ }
+
ExprAst *parseOrExpression()
{
TRACE(("{parseOrExpression(%s)\n",m_tokenStream));
@@ -1153,7 +1340,7 @@ class ExpressionParser
ExprAst *expr = parseCompareExpression();
if (expr==0)
{
- warn(m_templateName,m_line,"argument missing for not operator");
+ warn(m_parser->templateName(),m_line,"argument missing for not operator");
return 0;
}
result = new ExprAstNegate(expr);
@@ -1169,7 +1356,7 @@ class ExpressionParser
ExprAst *parseCompareExpression()
{
TRACE(("{parseCompareExpression(%s)\n",m_tokenStream));
- ExprAst *lhs = parsePrimaryExpression();
+ ExprAst *lhs = parseAdditiveExpression();
if (lhs)
{
Operator::Type op = m_curToken.op;
@@ -1192,6 +1379,74 @@ class ExpressionParser
return lhs;
}
+ ExprAst *parseAdditiveExpression()
+ {
+ TRACE(("{parseAdditiveExpression(%s)\n",m_tokenStream));
+ ExprAst *lhs = parseMultiplicativeExpression();
+ if (lhs)
+ {
+ while (m_curToken.type==ExprToken::Operator &&
+ (m_curToken.op==Operator::Plus || m_curToken.op==Operator::Minus))
+ {
+ Operator::Type op = m_curToken.op;
+ getNextToken();
+ ExprAst *rhs = parseMultiplicativeExpression();
+ lhs = new ExprAstBinary(op,lhs,rhs);
+ }
+ }
+ TRACE(("}parseAdditiveExpression(%s)\n",m_tokenStream));
+ return lhs;
+ }
+
+ ExprAst *parseMultiplicativeExpression()
+ {
+ TRACE(("{parseMultiplicativeExpression(%s)\n",m_tokenStream));
+ ExprAst *lhs = parseUnaryExpression();
+ if (lhs)
+ {
+ while (m_curToken.type==ExprToken::Operator &&
+ (m_curToken.op==Operator::Multiply || m_curToken.op==Operator::Divide || m_curToken.op==Operator::Modulo))
+ {
+ Operator::Type op = m_curToken.op;
+ getNextToken();
+ ExprAst *rhs = parseUnaryExpression();
+ lhs = new ExprAstBinary(op,lhs,rhs);
+ }
+ }
+ TRACE(("}parseMultiplicativeExpression(%s)\n",m_tokenStream));
+ return lhs;
+ }
+
+ ExprAst *parseUnaryExpression()
+ {
+ TRACE(("{parseUnaryExpression(%s)\n",m_tokenStream));
+ ExprAst *result=0;
+ if (m_curToken.type==ExprToken::Operator)
+ {
+ if (m_curToken.op==Operator::Plus)
+ {
+ getNextToken();
+ result = parsePrimaryExpression();
+ }
+ else if (m_curToken.op==Operator::Minus)
+ {
+ getNextToken();
+ ExprAst *rhs = parsePrimaryExpression();
+ result = new ExprAstUnary(m_curToken.op,rhs);
+ }
+ else
+ {
+ result = parsePrimaryExpression();
+ }
+ }
+ else
+ {
+ result = parsePrimaryExpression();
+ }
+ TRACE(("}parseUnaryExpression(%s)\n",m_tokenStream));
+ return result;
+ }
+
ExprAst *parsePrimaryExpression()
{
TRACE(("{parsePrimary(%s)\n",m_tokenStream));
@@ -1207,16 +1462,29 @@ class ExpressionParser
case ExprToken::Literal:
result = parseLiteral();
break;
- default:
- if (m_curToken.type==ExprToken::Operator)
+ case ExprToken::Operator:
+ if (m_curToken.op==Operator::LeftParen)
{
- warn(m_templateName,m_line,"unexpected operator '%s' in expression",
- Operator::toString(m_curToken.op));
+ getNextToken(); // skip over opening bracket
+ result = parseExpression();
+ if (m_curToken.type!=ExprToken::Operator ||
+ m_curToken.op!=Operator::RightParen)
+ {
+ warn(m_parser->templateName(),m_line,"missing closing parenthesis");
+ }
+ else
+ {
+ getNextToken(); // skip over closing bracket
+ }
}
else
{
- warn(m_templateName,m_line,"unexpected token in expression");
+ warn(m_parser->templateName(),m_line,"unexpected operator '%s' in expression",
+ Operator::toString(m_curToken.op));
}
+ break;
+ default:
+ warn(m_parser->templateName(),m_line,"unexpected token in expression");
}
TRACE(("}parsePrimary(%s)\n",m_tokenStream));
return result;
@@ -1321,147 +1589,185 @@ class ExpressionParser
if (p==0 || *p=='\0') return FALSE;
while (*p==' ') p++; // skip over spaces
char c=*p;
- if (strncmp(p,"not ",4)==0)
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Not;
- p+=4;
- }
- else if (strncmp(p,"and ",4)==0)
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::And;
- p+=4;
- }
- else if (strncmp(p,"or ",3)==0)
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Or;
- p+=3;
- }
- else if (c=='=' && *(p+1)=='=')
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Equal;
- p+=2;
- }
- else if (c=='!' && *(p+1)=='=')
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::NotEqual;
- p+=2;
- }
- else if (c=='<' && *(p+1)=='=')
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::LessEqual;
- p+=2;
- }
- else if (c=='>' && *(p+1)=='=')
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::GreaterEqual;
- p+=2;
- }
- else if (c=='<')
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Less;
- p++;
- }
- else if (c=='>')
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Greater;
- p++;
- }
- else if (c=='|')
+ const char *q = p;
+ switch (c)
{
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Filter;
- p++;
- }
- else if (c==':')
- {
- m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Colon;
- p++;
+ case '=':
+ if (c=='=' && *(p+1)=='=') // equal
+ {
+ m_curToken.op = Operator::Equal;
+ p+=2;
+ }
+ break;
+ case '!':
+ if (c=='!' && *(p+1)=='=') // not equal
+ {
+ m_curToken.op = Operator::NotEqual;
+ p+=2;
+ }
+ break;
+ case '<':
+ if (c=='<' && *(p+1)=='=') // less or equal
+ {
+ m_curToken.op = Operator::LessEqual;
+ p+=2;
+ }
+ else // less
+ {
+ m_curToken.op = Operator::Less;
+ p++;
+ }
+ break;
+ case '>':
+ if (c=='>' && *(p+1)=='=') // greater or equal
+ {
+ m_curToken.op = Operator::GreaterEqual;
+ p+=2;
+ }
+ else // greater
+ {
+ m_curToken.op = Operator::Greater;
+ p++;
+ }
+ break;
+ case '(':
+ m_curToken.op = Operator::LeftParen;
+ p++;
+ break;
+ case ')':
+ m_curToken.op = Operator::RightParen;
+ p++;
+ break;
+ case '|':
+ m_curToken.op = Operator::Filter;
+ p++;
+ break;
+ case '+':
+ m_curToken.op = Operator::Plus;
+ p++;
+ break;
+ case '-':
+ m_curToken.op = Operator::Minus;
+ p++;
+ break;
+ case '*':
+ m_curToken.op = Operator::Multiply;
+ p++;
+ break;
+ case '/':
+ m_curToken.op = Operator::Divide;
+ p++;
+ break;
+ case '%':
+ m_curToken.op = Operator::Modulo;
+ p++;
+ break;
+ case ':':
+ m_curToken.op = Operator::Colon;
+ p++;
+ break;
+ case ',':
+ m_curToken.op = Operator::Comma;
+ p++;
+ break;
+ case 'n':
+ if (strncmp(p,"not ",4)==0)
+ {
+ m_curToken.op = Operator::Not;
+ p+=4;
+ }
+ break;
+ case 'a':
+ if (strncmp(p,"and ",4)==0)
+ {
+ m_curToken.op = Operator::And;
+ p+=4;
+ }
+ break;
+ case 'o':
+ if (strncmp(p,"or ",3)==0)
+ {
+ m_curToken.op = Operator::Or;
+ p+=3;
+ }
+ break;
+ default:
+ break;
}
- else if (c==',')
+ if (p!=q) // found an operator
{
m_curToken.type = ExprToken::Operator;
- m_curToken.op = Operator::Comma;
- p++;
- }
- else if ((c=='-' && *(p+1)>='0' && *(p+1)<='9') || (c>='0' && c<='9'))
- {
- m_curToken.type = ExprToken::Number;
- const char *np = p;
- if (c=='-') np++;
- m_curToken.num = 0;
- while (*np>='0' && *np<='9')
- {
- m_curToken.num*=10;
- m_curToken.num+=*np-'0';
- np++;
- }
- if (c=='-') m_curToken.num=-m_curToken.num;
- p=np;
}
- else if (c=='_' || (c>='a' && c<='z') || (c>='A' && c<='Z'))
+ else // no token found yet
{
- m_curToken.type = ExprToken::Identifier;
- s[0]=c;
- m_curToken.id = s;
- p++;
- while ((c=*p) &&
- (c=='_' || c=='.' ||
- (c>='a' && c<='z') ||
- (c>='A' && c<='Z') ||
- (c>='0' && c<='9'))
- )
- {
- s[0]=c;
- m_curToken.id+=s;
- p++;
- }
- if (m_curToken.id=="True") // treat true literal as numerical 1
- {
- m_curToken.type = ExprToken::Number;
- m_curToken.num = 1;
- }
- else if (m_curToken.id=="False") // treat false literal as numerical 0
+ if (c>='0' && c<='9') // number?
{
m_curToken.type = ExprToken::Number;
+ const char *np = p;
m_curToken.num = 0;
+ while (*np>='0' && *np<='9')
+ {
+ m_curToken.num*=10;
+ m_curToken.num+=*np-'0';
+ np++;
+ }
+ p=np;
}
- }
- else if (c=='"' || c=='\'')
- {
- m_curToken.type = ExprToken::Literal;
- m_curToken.id.resize(0);
- p++;
- char tokenChar = c;
- char cp=0;
- while ((c=*p) && (c!=tokenChar || (c==tokenChar && cp=='\\')))
+ else if (c=='_' || (c>='a' && c<='z') || (c>='A' && c<='Z')) // identifier?
{
+ m_curToken.type = ExprToken::Identifier;
s[0]=c;
- if (c!='\\' || cp=='\\') // don't add escapes
+ m_curToken.id = s;
+ p++;
+ while ((c=*p) &&
+ (c=='_' || c=='.' ||
+ (c>='a' && c<='z') ||
+ (c>='A' && c<='Z') ||
+ (c>='0' && c<='9'))
+ )
{
+ s[0]=c;
m_curToken.id+=s;
+ p++;
+ }
+ if (m_curToken.id=="True") // treat true literal as numerical 1
+ {
+ m_curToken.type = ExprToken::Number;
+ m_curToken.num = 1;
+ }
+ else if (m_curToken.id=="False") // treat false literal as numerical 0
+ {
+ m_curToken.type = ExprToken::Number;
+ m_curToken.num = 0;
}
- cp=c;
+ }
+ else if (c=='"' || c=='\'') // string literal
+ {
+ m_curToken.type = ExprToken::Literal;
+ m_curToken.id.resize(0);
p++;
+ char tokenChar = c;
+ char cp=0;
+ while ((c=*p) && (c!=tokenChar || (c==tokenChar && cp=='\\')))
+ {
+ s[0]=c;
+ if (c!='\\' || cp=='\\') // don't add escapes
+ {
+ m_curToken.id+=s;
+ }
+ cp=c;
+ p++;
+ }
+ if (*p==tokenChar) p++;
}
- if (*p==tokenChar) p++;
}
- else
+ if (p==q) // still no valid token found -> error
{
m_curToken.type = ExprToken::Unknown;
char s[2];
s[0]=c;
s[1]=0;
- warn(m_templateName,m_line,"Found unknown token %s while parsing %s",s,m_tokenStream);
+ warn(m_parser->templateName(),m_line,"Found unknown token %s while parsing %s",s,m_tokenStream);
m_curToken.id = s;
p++;
}
@@ -1472,51 +1778,14 @@ class ExpressionParser
return TRUE;
}
+ const TemplateParser *m_parser;
ExprToken m_curToken;
- QCString m_templateName;
int m_line;
const char *m_tokenStream;
};
//----------------------------------------------------------
-/** @brief Base class of all nodes in a template's AST */
-class TemplateNode
-{
- public:
- TemplateNode(TemplateNode *parent) : m_parent(parent) {}
- virtual ~TemplateNode() {}
-
- virtual void render(FTextStream &ts, TemplateContext *c) = 0;
-
- TemplateNode *parent() { return m_parent; }
-
- private:
- TemplateNode *m_parent;
-};
-
-//----------------------------------------------------------
-
-/** @brief Parser for templates */
-class TemplateParser
-{
- public:
- TemplateParser(const QCString &templateName,QList<TemplateToken> &tokens);
- void parse(TemplateNode *parent,int line,const QStrList &stopAt,
- QList<TemplateNode> &nodes);
- bool hasNextToken() const;
- TemplateToken *takeNextToken();
- void removeNextToken();
- void prependToken(const TemplateToken *token);
- const TemplateToken *currentToken() const;
- QCString templateName() const { return m_templateName; }
- private:
- QCString m_templateName;
- QList<TemplateToken> &m_tokens;
-};
-
-//----------------------------------------------------------
-
/** @brief Class representing a lexical token in a template */
class TemplateToken
{
@@ -1558,28 +1827,30 @@ class TemplateImpl : public TemplateNode, public Template
{
public:
TemplateImpl(TemplateEngine *e,const QCString &name,const QCString &data);
- ~TemplateImpl() {}
void render(FTextStream &ts, TemplateContext *c);
TemplateEngine *engine() const { return m_engine; }
TemplateBlockContext *blockContext() { return &m_blockContext; }
private:
+ TemplateEngine *m_engine;
QCString m_name;
TemplateNodeList m_nodes;
- TemplateEngine *m_engine;
TemplateBlockContext m_blockContext;
};
//----------------------------------------------------------
-TemplateContextImpl::TemplateContextImpl()
- : m_templateName("<unknown>"), m_line(1), m_escapeIntf(0),
- m_spacelessIntf(0), m_spacelessEnabled(FALSE)
+TemplateContextImpl::TemplateContextImpl(const TemplateEngine *e)
+ : m_engine(e), m_templateName("<unknown>"), m_line(1), m_activeEscapeIntf(0),
+ m_spacelessIntf(0), m_spacelessEnabled(FALSE), m_indices(TemplateStruct::alloc())
{
+ m_indexStacks.setAutoDelete(TRUE);
m_contextStack.setAutoDelete(TRUE);
+ m_escapeIntfDict.setAutoDelete(TRUE);
push();
+ set("index",m_indices.get());
}
TemplateContextImpl::~TemplateContextImpl()
@@ -1589,12 +1860,12 @@ TemplateContextImpl::~TemplateContextImpl()
void TemplateContextImpl::set(const char *name,const TemplateVariant &v)
{
- TemplateVariant *pv = m_contextStack.first()->find(name);
+ TemplateVariant *pv = m_contextStack.getFirst()->find(name);
if (pv)
{
- m_contextStack.first()->remove(name);
+ m_contextStack.getFirst()->remove(name);
}
- m_contextStack.first()->insert(name,new TemplateVariant(v));
+ m_contextStack.getFirst()->insert(name,new TemplateVariant(v));
}
TemplateVariant TemplateContextImpl::get(const QCString &name) const
@@ -1704,6 +1975,118 @@ TemplateBlockContext *TemplateContextImpl::blockContext()
return &m_blockContext;
}
+void TemplateContextImpl::warn(const char *fileName,int line,const char *fmt,...) const
+{
+ va_list args;
+ va_start(args,fmt);
+ va_warn(fileName,line,fmt,args);
+ va_end(args);
+ m_engine->printIncludeContext(fileName,line);
+}
+
+void TemplateContextImpl::openSubIndex(const QCString &indexName)
+{
+ //printf("TemplateContextImpl::openSubIndex(%s)\n",indexName.data());
+ QStack<TemplateVariant> *stack = m_indexStacks.find(indexName);
+ if (!stack || stack->isEmpty() || stack->top()->type()==TemplateVariant::List) // error: no stack yet or no entry
+ {
+ warn(m_templateName,m_line,"opensubindex for index %s without preceding indexentry",indexName.data());
+ return;
+ }
+ // get the parent entry to add the list to
+ TemplateStruct *entry = dynamic_cast<TemplateStruct*>(stack->top()->toStruct());
+ if (entry)
+ {
+ // add new list to the stack
+ TemplateList *list = TemplateList::alloc();
+ stack->push(new TemplateVariant(list));
+ entry->set("children",list);
+ entry->set("is_leaf_node",false);
+ }
+}
+
+void TemplateContextImpl::closeSubIndex(const QCString &indexName)
+{
+ //printf("TemplateContextImpl::closeSubIndex(%s)\n",indexName.data());
+ QStack<TemplateVariant> *stack = m_indexStacks.find(indexName);
+ if (!stack || stack->count()<3)
+ {
+ warn(m_templateName,m_line,"closesubindex for index %s without matching open",indexName.data());
+ }
+ else // stack->count()>=2
+ {
+ if (stack->top()->type()==TemplateVariant::Struct)
+ {
+ delete stack->pop(); // pop struct
+ delete stack->pop(); // pop list
+ }
+ else // empty list! correct "is_left_node" attribute of the parent entry
+ {
+ delete stack->pop(); // pop list
+ TemplateStruct *entry = dynamic_cast<TemplateStruct*>(stack->top()->toStruct());
+ if (entry)
+ {
+ entry->set("is_leaf_node",true);
+ }
+ }
+ }
+}
+
+void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments)
+{
+ QValueListConstIterator<TemplateKeyValue> it = arguments.begin();
+ //printf("TemplateContextImpl::addIndexEntry(%s)\n",indexName.data());
+ //while (it!=arguments.end())
+ //{
+ // printf(" key=%s value=%s\n",(*it).key.data(),(*it).value.toString().data());
+ // ++it;
+ //}
+ QStack<TemplateVariant> *stack = m_indexStacks.find(indexName);
+ if (!stack) // no stack yet, create it!
+ {
+ stack = new QStack<TemplateVariant>;
+ stack->setAutoDelete(TRUE);
+ m_indexStacks.insert(indexName,stack);
+ }
+ TemplateList *list = 0;
+ if (stack->isEmpty()) // first item, create empty list and add it to the index
+ {
+ list = TemplateList::alloc();
+ stack->push(new TemplateVariant(list));
+ m_indices->set(indexName,list); // make list available under index
+ }
+ else // stack not empty
+ {
+ if (stack->top()->type()==TemplateVariant::Struct) // already an entry in the list
+ {
+ // remove current entry from the stack
+ delete stack->pop();
+ }
+ else // first entry after opensubindex
+ {
+ ASSERT(stack->top()->type()==TemplateVariant::List);
+ }
+ // get list to add new item
+ list = dynamic_cast<TemplateList*>(stack->top()->toList());
+ }
+ TemplateStruct *entry = TemplateStruct::alloc();
+ // add user specified fields to the entry
+ for (it=arguments.begin();it!=arguments.end();++it)
+ {
+ entry->set((*it).key,(*it).value);
+ }
+ if (list->count()>0)
+ {
+ TemplateStruct *lastEntry = dynamic_cast<TemplateStruct*>(list->at(list->count()-1).toStruct());
+ lastEntry->set("last",false);
+ }
+ entry->set("is_leaf_node",true);
+ entry->set("first",list->count()==0);
+ entry->set("last",true);
+ stack->push(new TemplateVariant(entry));
+ list->append(entry);
+}
+
//----------------------------------------------------------
/** @brief Class representing a piece of plain text in a template */
@@ -1743,8 +2126,12 @@ class TemplateNodeVariable : public TemplateNode
: TemplateNode(parent), m_templateName(parser->templateName()), m_line(line)
{
TRACE(("TemplateNodeVariable(%s)\n",var.data()));
- ExpressionParser expParser(m_templateName,line);
- m_var = expParser.parseVariable(var);
+ ExpressionParser expParser(parser,line);
+ m_var = expParser.parse(var);
+ if (m_var==0)
+ {
+ parser->warn(m_templateName,line,"invalid expression '%s' for variable",var.data());
+ }
}
~TemplateNodeVariable()
{
@@ -1755,19 +2142,22 @@ class TemplateNodeVariable : public TemplateNode
{
TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
ci->setLocation(m_templateName,m_line);
- TemplateVariant v = m_var->resolve(c);
- if (v.type()==TemplateVariant::Function)
- {
- v = v.call(QValueList<TemplateVariant>());
- }
- //printf("TemplateNodeVariable::render(%s) raw=%d\n",value.data(),v.raw());
- if (ci->escapeIntf() && !v.raw())
- {
- ts << ci->escapeIntf()->escape(v.toString());
- }
- else
+ if (m_var)
{
- ts << v.toString();
+ TemplateVariant v = m_var->resolve(c);
+ if (v.type()==TemplateVariant::Function)
+ {
+ v = v.call(QValueList<TemplateVariant>());
+ }
+ //printf("TemplateNodeVariable::render(%s) raw=%d\n",value.data(),v.raw());
+ if (ci->escapeIntf() && !v.raw())
+ {
+ ts << ci->escapeIntf()->escape(v.toString());
+ }
+ else
+ {
+ ts << v.toString();
+ }
}
}
@@ -1818,22 +2208,45 @@ class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf>
TemplateNodeIf(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) :
TemplateNodeCreator<TemplateNodeIf>(parser,parent,line)
{
+ m_ifGuardedNodes.setAutoDelete(TRUE);
TRACE(("{TemplateNodeIf(%s)\n",data.data()));
if (data.isEmpty())
{
- warn(m_templateName,line,"missing argument for if tag");
+ parser->warn(m_templateName,line,"missing argument for if tag");
}
QStrList stopAt;
stopAt.append("endif");
+ stopAt.append("elif");
stopAt.append("else");
- parser->parse(this,line,stopAt,m_trueNodes);
+
+ // if 'nodes'
+ GuardedNodes *guardedNodes = new GuardedNodes;
+ ExpressionParser ex(parser,line);
+ guardedNodes->line = line;
+ guardedNodes->guardAst = ex.parse(data);
+ parser->parse(this,line,stopAt,guardedNodes->trueNodes);
+ m_ifGuardedNodes.append(guardedNodes);
TemplateToken *tok = parser->takeNextToken();
- ExpressionParser ex(parser->templateName(),line);
- m_guardAst = ex.parse(data);
+ // elif 'nodes'
+ while (tok && tok->data.left(5)=="elif ")
+ {
+ ExpressionParser ex(parser,line);
+ guardedNodes = new GuardedNodes;
+ guardedNodes->line = tok->line;
+ guardedNodes->guardAst = ex.parse(tok->data.mid(5));
+ parser->parse(this,tok->line,stopAt,guardedNodes->trueNodes);
+ m_ifGuardedNodes.append(guardedNodes);
+ // proceed to the next token
+ delete tok;
+ tok = parser->takeNextToken();
+ }
+
+ // else 'nodes'
if (tok && tok->data=="else")
{
- stopAt.removeLast();
+ stopAt.removeLast(); // remove "else"
+ stopAt.removeLast(); // remove "elif"
parser->parse(this,line,stopAt,m_falseNodes);
parser->removeNextToken(); // skip over endif
}
@@ -1842,29 +2255,48 @@ class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf>
}
~TemplateNodeIf()
{
- delete m_guardAst;
}
void render(FTextStream &ts, TemplateContext *c)
{
- dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+ TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
//printf("TemplateNodeIf::render #trueNodes=%d #falseNodes=%d\n",m_trueNodes.count(),m_falseNodes.count());
- if (m_guardAst)
+ bool processed=FALSE;
+ QListIterator<GuardedNodes> li(m_ifGuardedNodes);
+ GuardedNodes *nodes;
+ for (li.toFirst();(nodes=li.current()) && !processed;++li)
{
- TemplateVariant guardValue = m_guardAst->resolve(c);
- if (guardValue.toBool()) // guard is true, render corresponding nodes
+ if (nodes->guardAst)
{
- m_trueNodes.render(ts,c);
+ TemplateVariant guardValue = nodes->guardAst->resolve(c);
+ if (guardValue.toBool()) // render nodes for the first guard that evaluated to 'true'
+ {
+ nodes->trueNodes.render(ts,c);
+ processed=TRUE;
+ }
}
- else // guard is false, render corresponding nodes
+ else
{
- m_falseNodes.render(ts,c);
+ ci->warn(m_templateName,nodes->line,"invalid expression for if/elif");
}
}
+ if (!processed)
+ {
+ // all guards are false, render 'else' nodes
+ m_falseNodes.render(ts,c);
+ }
}
private:
- ExprAst *m_guardAst;
- TemplateNodeList m_trueNodes;
+ struct GuardedNodes
+ {
+ GuardedNodes() : guardAst(0) {}
+ ~GuardedNodes() { delete guardAst; }
+ int line;
+ ExprAst *guardAst;
+ TemplateNodeList trueNodes;
+ };
+ QList<GuardedNodes> m_ifGuardedNodes;
TemplateNodeList m_falseNodes;
};
@@ -1877,8 +2309,8 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat>
: TemplateNodeCreator<TemplateNodeRepeat>(parser,parent,line)
{
TRACE(("{TemplateNodeRepeat(%s)\n",data.data()));
- ExpressionParser expParser(parser->templateName(),line);
- m_expr = expParser.parseVariable(data);
+ ExpressionParser expParser(parser,line);
+ m_expr = expParser.parse(data);
QStrList stopAt;
stopAt.append("endrepeat");
parser->parse(this,line,stopAt,m_repeatNodes);
@@ -1891,28 +2323,29 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat>
}
void render(FTextStream &ts, TemplateContext *c)
{
- dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+ TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
TemplateVariant v;
if (m_expr && (v=m_expr->resolve(c)).type()==TemplateVariant::Integer)
{
int i, n = v.toInt();
for (i=0;i<n;i++)
{
- TemplateStruct s;
- s.set("counter0", (int)i);
- s.set("counter", (int)(i+1));
- s.set("revcounter", (int)(n-i));
- s.set("revcounter0", (int)(n-i-1));
- s.set("first",i==0);
- s.set("last", i==n-1);
- c->set("repeatloop",&s);
+ TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+ s->set("counter0", (int)i);
+ s->set("counter", (int)(i+1));
+ s->set("revcounter", (int)(n-i));
+ s->set("revcounter0", (int)(n-i-1));
+ s->set("first",i==0);
+ s->set("last", i==n-1);
+ c->set("repeatloop",s.get());
// render all items for this iteration of the loop
m_repeatNodes.render(ts,c);
}
}
else // simple type...
{
- warn(m_templateName,m_line,"for requires a variable of list type!");
+ ci->warn(m_templateName,m_line,"for requires a variable of list type!");
}
}
private:
@@ -1922,6 +2355,176 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat>
//----------------------------------------------------------
+/** @brief Class representing a 'range' tag in a template */
+class TemplateNodeRange : public TemplateNodeCreator<TemplateNodeRange>
+{
+ public:
+ TemplateNodeRange(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+ : TemplateNodeCreator<TemplateNodeRange>(parser,parent,line)
+ {
+ TRACE(("{TemplateNodeRange(%s)\n",data.data()));
+ QCString start,end;
+ int i1 = data.find(" from ");
+ int i2 = data.find(" to ");
+ int i3 = data.find(" downto ");
+ if (i1==-1)
+ {
+ if (data.right(5)==" from")
+ {
+ parser->warn(m_templateName,line,"range missing after 'from' keyword");
+ }
+ else if (data=="from")
+ {
+ parser->warn(m_templateName,line,"range needs an iterator variable and a range");
+ }
+ else
+ {
+ parser->warn(m_templateName,line,"range is missing 'from' keyword");
+ }
+ }
+ else if (i2==-1 && i3==-1)
+ {
+ if (data.right(3)==" to")
+ {
+ parser->warn(m_templateName,line,"range is missing end value after 'to' keyword");
+ }
+ else if (data.right(7)==" downto")
+ {
+ parser->warn(m_templateName,line,"range is missing end value after 'downto' keyword");
+ }
+ else
+ {
+ parser->warn(m_templateName,line,"range is missing 'to' or 'downto' keyword");
+ }
+ }
+ else
+ {
+ m_var = data.left(i1).stripWhiteSpace();
+ if (m_var.isEmpty())
+ {
+ parser->warn(m_templateName,line,"range needs an iterator variable");
+ }
+ start = data.mid(i1+6,i2-i1-6).stripWhiteSpace();
+ if (i2!=-1)
+ {
+ end = data.right(data.length()-i2-4).stripWhiteSpace();
+ m_down = FALSE;
+ }
+ else if (i3!=-1)
+ {
+ end = data.right(data.length()-i3-8).stripWhiteSpace();
+ m_down = TRUE;
+ }
+ }
+ ExpressionParser expParser(parser,line);
+ m_startExpr = expParser.parse(start);
+ m_endExpr = expParser.parse(end);
+
+ QStrList stopAt;
+ stopAt.append("endrange");
+ parser->parse(this,line,stopAt,m_loopNodes);
+ parser->removeNextToken(); // skip over endrange
+ TRACE(("}TemplateNodeRange(%s)\n",data.data()));
+ }
+
+ ~TemplateNodeRange()
+ {
+ delete m_startExpr;
+ delete m_endExpr;
+ }
+
+ void render(FTextStream &ts, TemplateContext *c)
+ {
+ TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
+ //printf("TemplateNodeRange::render #loopNodes=%d\n",
+ // m_loopNodes.count());
+ if (m_startExpr && m_endExpr)
+ {
+ TemplateVariant vs = m_startExpr->resolve(c);
+ TemplateVariant ve = m_endExpr->resolve(c);
+ if (vs.type()==TemplateVariant::Integer && ve.type()==TemplateVariant::Integer)
+ {
+ int s = vs.toInt();
+ int e = ve.toInt();
+ int l = m_down ? s-e+1 : e-s+1;
+ if (l>0)
+ {
+ c->push();
+ //int index = m_reversed ? list.count() : 0;
+ TemplateVariant v;
+ const TemplateVariant *parentLoop = c->getRef("forloop");
+ uint index = 0;
+ int i = m_down ? e : s;
+ bool done=false;
+ while (!done)
+ {
+ // set the forloop meta-data variable
+ TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+ s->set("counter0", (int)index);
+ s->set("counter", (int)(index+1));
+ s->set("revcounter", (int)(l-index));
+ s->set("revcounter0", (int)(l-index-1));
+ s->set("first",index==0);
+ s->set("last", (int)index==l-1);
+ s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
+ c->set("forloop",s.get());
+
+ // set the iterator variable
+ c->set(m_var,i);
+
+ // render all items for this iteration of the loop
+ m_loopNodes.render(ts,c);
+
+ index++;
+ if (m_down)
+ {
+ i--;
+ done = i<e;
+ }
+ else
+ {
+ i++;
+ done = i>e;
+ }
+ }
+ c->pop();
+ }
+ else
+ {
+ ci->warn(m_templateName,m_line,"range %d %s %d is empty!",
+ s,m_down?"downto":"to",e);
+ }
+ }
+ else if (vs.type()!=TemplateVariant::Integer)
+ {
+ ci->warn(m_templateName,m_line,"range requires a start value of integer type!");
+ }
+ else if (ve.type()!=TemplateVariant::Integer)
+ {
+ ci->warn(m_templateName,m_line,"range requires an end value of integer type!");
+ }
+ }
+ else if (!m_startExpr)
+ {
+ ci->warn(m_templateName,m_line,"range has empty start value");
+ }
+ else if (!m_endExpr)
+ {
+ ci->warn(m_templateName,m_line,"range has empty end value");
+ }
+ }
+
+ private:
+ bool m_down;
+ ExprAst *m_startExpr;
+ ExprAst *m_endExpr;
+ QCString m_var;
+ TemplateNodeList m_loopNodes;
+};
+
+//----------------------------------------------------------
+
/** @brief Class representing a 'for' tag in a template */
class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
{
@@ -1936,15 +2539,15 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
{
if (data.right(3)==" in")
{
- warn(m_templateName,line,"for is missing container after 'in' keyword");
+ parser->warn(m_templateName,line,"for is missing container after 'in' keyword");
}
else if (data=="in")
{
- warn(m_templateName,line,"for needs at least one iterator variable");
+ parser->warn(m_templateName,line,"for needs at least one iterator variable");
}
else
{
- warn(m_templateName,line,"for is missing 'in' keyword");
+ parser->warn(m_templateName,line,"for is missing 'in' keyword");
}
}
else
@@ -1952,7 +2555,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
m_vars = split(data.left(i),",");
if (m_vars.count()==0)
{
- warn(m_templateName,line,"for needs at least one iterator variable");
+ parser->warn(m_templateName,line,"for needs at least one iterator variable");
}
int j = data.find(" reversed",i);
@@ -1965,11 +2568,11 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
}
if (exprStr.isEmpty())
{
- warn(m_templateName,line,"for is missing container after 'in' keyword");
+ parser->warn(m_templateName,line,"for is missing container after 'in' keyword");
}
}
- ExpressionParser expParser(parser->templateName(),line);
- m_expr = expParser.parseVariable(exprStr);
+ ExpressionParser expParser(parser,line);
+ m_expr = expParser.parse(exprStr);
QStrList stopAt;
stopAt.append("endfor");
@@ -1993,7 +2596,8 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
void render(FTextStream &ts, TemplateContext *c)
{
- dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+ TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
//printf("TemplateNodeFor::render #loopNodes=%d #emptyNodes=%d\n",
// m_loopNodes.count(),m_emptyNodes.count());
if (m_expr)
@@ -2018,15 +2622,15 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
(it->current(v));
m_reversed ? it->toPrev() : it->toNext())
{
- TemplateStruct s;
- s.set("counter0", (int)index);
- s.set("counter", (int)(index+1));
- s.set("revcounter", (int)(listSize-index));
- s.set("revcounter0", (int)(listSize-index-1));
- s.set("first",index==0);
- s.set("last", index==listSize-1);
- s.set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
- c->set("forloop",&s);
+ TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+ s->set("counter0", (int)index);
+ s->set("counter", (int)(index+1));
+ s->set("revcounter", (int)(listSize-index));
+ s->set("revcounter0", (int)(listSize-index-1));
+ s->set("first",index==0);
+ s->set("last", index==listSize-1);
+ s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
+ c->set("forloop",s.get());
// add variables for this loop to the context
//obj->addVariableToContext(index,m_vars,c);
@@ -2058,7 +2662,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
}
else // simple type...
{
- warn(m_templateName,m_line,"for requires a variable of list type!");
+ ci->warn(m_templateName,m_line,"for requires a variable of list type!");
}
}
}
@@ -2090,14 +2694,15 @@ class TemplateNodeMsg : public TemplateNodeCreator<TemplateNodeMsg>
void render(FTextStream &, TemplateContext *c)
{
TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
TemplateEscapeIntf *escIntf = ci->escapeIntf();
- ci->setEscapeIntf(0); // avoid escaping things we send to standard out
+ ci->setActiveEscapeIntf(0); // avoid escaping things we send to standard out
bool enable = ci->spacelessEnabled();
ci->enableSpaceless(FALSE);
FTextStream ts(stdout);
m_nodes.render(ts,c);
ts << endl;
- ci->setEscapeIntf(escIntf);
+ ci->setActiveEscapeIntf(escIntf);
ci->enableSpaceless(enable);
}
private:
@@ -2118,7 +2723,7 @@ class TemplateNodeBlock : public TemplateNodeCreator<TemplateNodeBlock>
m_blockName = data;
if (m_blockName.isEmpty())
{
- warn(parser->templateName(),line,"block tag without name");
+ parser->warn(parser->templateName(),line,"block tag without name");
}
QStrList stopAt;
stopAt.append("endblock");
@@ -2152,18 +2757,22 @@ class TemplateNodeBlock : public TemplateNodeCreator<TemplateNodeBlock>
m_nodes.render(ss,c); // render parent of nb to string
}
// add 'block.super' variable to allow access to parent block content
- TemplateStruct superBlock;
- superBlock.set("super",TemplateVariant(super.data(),TRUE));
- ci->set("block",&superBlock);
+ TemplateAutoRef<TemplateStruct> superBlock(TemplateStruct::alloc());
+ superBlock->set("super",TemplateVariant(super.data(),TRUE));
+ ci->set("block",superBlock.get());
// render the overruled block contents
+ t->engine()->enterBlock(nb->m_templateName,nb->m_blockName,nb->m_line);
nb->m_nodes.render(ts,c);
+ t->engine()->leaveBlock();
ci->pop();
// re-add block to the context
ci->blockContext()->push(nb);
}
else // block has no overrule
{
+ t->engine()->enterBlock(m_templateName,m_blockName,m_line);
m_nodes.render(ts,c);
+ t->engine()->leaveBlock();
}
}
}
@@ -2188,12 +2797,12 @@ class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend>
: TemplateNodeCreator<TemplateNodeExtend>(parser,parent,line)
{
TRACE(("{TemplateNodeExtend(%s)\n",data.data()));
- ExpressionParser ep(m_templateName,line);
+ ExpressionParser ep(parser,line);
if (data.isEmpty())
{
- warn(m_templateName,line,"extend tag is missing template file argument");
+ parser->warn(m_templateName,line,"extend tag is missing template file argument");
}
- m_extendExpr = ep.parsePrimary(data);
+ m_extendExpr = ep.parse(data);
QStrList stopAt;
parser->parse(this,line,stopAt,m_nodes);
TRACE(("}TemplateNodeExtend(%s)\n",data.data()));
@@ -2205,20 +2814,21 @@ class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend>
void render(FTextStream &ts, TemplateContext *c)
{
- dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+ TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
if (m_extendExpr==0) return;
QCString extendFile = m_extendExpr->resolve(c).toString();
if (extendFile.isEmpty())
{
- warn(m_templateName,m_line,"invalid parameter for extend command");
+ ci->warn(m_templateName,m_line,"invalid parameter for extend command");
}
// goto root of tree (template node)
TemplateImpl *t = getTemplate();
if (t)
{
- Template *bt = t->engine()->loadByName(extendFile);
+ Template *bt = t->engine()->loadByName(extendFile,m_line);
TemplateImpl *baseTemplate = bt ? dynamic_cast<TemplateImpl*>(bt) : 0;
if (baseTemplate)
{
@@ -2248,11 +2858,11 @@ class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend>
// clean up
bc->clear();
- //delete baseTemplate;
+ t->engine()->unload(t);
}
else
{
- warn(m_templateName,m_line,"failed to load template %s for extend",extendFile.data());
+ ci->warn(m_templateName,m_line,"failed to load template %s for extend",extendFile.data());
}
}
}
@@ -2270,12 +2880,12 @@ class TemplateNodeInclude : public TemplateNodeCreator<TemplateNodeInclude>
: TemplateNodeCreator<TemplateNodeInclude>(parser,parent,line)
{
TRACE(("TemplateNodeInclude(%s)\n",data.data()));
- ExpressionParser ep(m_templateName,line);
+ ExpressionParser ep(parser,line);
if (data.isEmpty())
{
- warn(m_templateName,line,"include tag is missing template file argument");
+ parser->warn(m_templateName,line,"include tag is missing template file argument");
}
- m_includeExpr = ep.parsePrimary(data);
+ m_includeExpr = ep.parse(data);
}
~TemplateNodeInclude()
{
@@ -2283,28 +2893,30 @@ class TemplateNodeInclude : public TemplateNodeCreator<TemplateNodeInclude>
}
void render(FTextStream &ts, TemplateContext *c)
{
- dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+ TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
if (m_includeExpr)
{
QCString includeFile = m_includeExpr->resolve(c).toString();
if (includeFile.isEmpty())
{
- warn(m_templateName,m_line,"invalid parameter for include command\n");
+ ci->warn(m_templateName,m_line,"invalid parameter for include command\n");
}
else
{
TemplateImpl *t = getTemplate();
if (t)
{
- Template *it = t->engine()->loadByName(includeFile);
+ Template *it = t->engine()->loadByName(includeFile,m_line);
TemplateImpl *incTemplate = it ? dynamic_cast<TemplateImpl*>(it) : 0;
if (incTemplate)
{
incTemplate->render(ts,c);
+ t->engine()->unload(t);
}
else
{
- warn(m_templateName,m_line,"failed to load template '%s' for include",includeFile.data()?includeFile.data():"");
+ ci->warn(m_templateName,m_line,"failed to load template '%s' for include",includeFile.data()?includeFile.data():"");
}
}
}
@@ -2325,32 +2937,32 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
: TemplateNodeCreator<TemplateNodeCreate>(parser,parent,line)
{
TRACE(("TemplateNodeCreate(%s)\n",data.data()));
- ExpressionParser ep(m_templateName,line);
+ ExpressionParser ep(parser,line);
if (data.isEmpty())
{
- warn(m_templateName,line,"create tag is missing arguments");
+ parser->warn(m_templateName,line,"create tag is missing arguments");
}
int i = data.find(" from ");
if (i==-1)
{
if (data.right(3)==" from")
{
- warn(m_templateName,line,"create is missing template name after 'from' keyword");
+ parser->warn(m_templateName,line,"create is missing template name after 'from' keyword");
}
else if (data=="from")
{
- warn(m_templateName,line,"create needs a file name and a template name");
+ parser->warn(m_templateName,line,"create needs a file name and a template name");
}
else
{
- warn(m_templateName,line,"create is missing 'from' keyword");
+ parser->warn(m_templateName,line,"create is missing 'from' keyword");
}
}
else
{
- ExpressionParser ep(m_templateName,line);
- m_fileExpr = ep.parsePrimary(data.left(i).stripWhiteSpace());
- m_templateExpr = ep.parsePrimary(data.mid(i+6).stripWhiteSpace());
+ ExpressionParser ep(parser,line);
+ m_fileExpr = ep.parse(data.left(i).stripWhiteSpace());
+ m_templateExpr = ep.parse(data.mid(i+6).stripWhiteSpace());
}
}
~TemplateNodeCreate()
@@ -2368,21 +2980,27 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
QCString outputFile = m_fileExpr->resolve(c).toString();
if (templateFile.isEmpty())
{
- warn(m_templateName,m_line,"empty template name parameter for create command\n");
+ ci->warn(m_templateName,m_line,"empty template name parameter for create command\n");
}
else if (outputFile.isEmpty())
{
- warn(m_templateName,m_line,"empty file name parameter for create command\n");
+ ci->warn(m_templateName,m_line,"empty file name parameter for create command\n");
}
else
{
TemplateImpl *t = getTemplate();
if (t)
{
- Template *ct = t->engine()->loadByName(templateFile);
+ Template *ct = t->engine()->loadByName(templateFile,m_line);
TemplateImpl *createTemplate = ct ? dynamic_cast<TemplateImpl*>(ct) : 0;
if (createTemplate)
{
+ QCString extension=outputFile;
+ int i=extension.findRev('.');
+ if (i!=-1)
+ {
+ extension=extension.right(extension.length()-i-1);
+ }
if (!ci->outputDirectory().isEmpty())
{
outputFile.prepend(ci->outputDirectory()+"/");
@@ -2390,18 +3008,21 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
QFile f(outputFile);
if (f.open(IO_WriteOnly))
{
+ TemplateEscapeIntf *escIntf = ci->escapeIntf();
+ ci->selectEscapeIntf(extension);
FTextStream ts(&f);
createTemplate->render(ts,c);
- //delete createTemplate;
+ t->engine()->unload(t);
+ ci->setActiveEscapeIntf(escIntf);
}
else
{
- warn(m_templateName,m_line,"failed to open output file '%s' for create command",outputFile.data());
+ ci->warn(m_templateName,m_line,"failed to open output file '%s' for create command",outputFile.data());
}
}
else
{
- warn(m_templateName,m_line,"failed to load template '%s' for include",templateFile.data());
+ ci->warn(m_templateName,m_line,"failed to load template '%s' for include",templateFile.data());
}
}
}
@@ -2431,12 +3052,12 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
: TemplateNodeCreator<TemplateNodeTree>(parser,parent,line)
{
TRACE(("{TemplateNodeTree(%s)\n",data.data()));
- ExpressionParser ep(m_templateName,line);
+ ExpressionParser ep(parser,line);
if (data.isEmpty())
{
- warn(m_templateName,line,"recursetree tag is missing data argument");
+ parser->warn(m_templateName,line,"recursetree tag is missing data argument");
}
- m_treeExpr = ep.parsePrimary(data);
+ m_treeExpr = ep.parse(data);
QStrList stopAt;
stopAt.append("endrecursetree");
parser->parse(this,line,stopAt,m_treeNodes);
@@ -2508,7 +3129,7 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
}
else
{
- warn(m_templateName,m_line,"recursetree's argument should be a list type");
+ ci->warn(m_templateName,m_line,"recursetree's argument should be a list type");
}
}
@@ -2519,6 +3140,148 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
//----------------------------------------------------------
+/** @brief Class representing an 'indexentry' tag in a template */
+class TemplateNodeIndexEntry : public TemplateNodeCreator<TemplateNodeIndexEntry>
+{
+ struct Mapping
+ {
+ Mapping(const QCString &n,ExprAst *e) : name(n), value(e) {}
+ ~Mapping() { delete value; }
+ QCString name;
+ ExprAst *value;
+ };
+ public:
+ TemplateNodeIndexEntry(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+ : TemplateNodeCreator<TemplateNodeIndexEntry>(parser,parent,line)
+ {
+ TRACE(("{TemplateNodeIndexEntry(%s)\n",data.data()));
+ m_args.setAutoDelete(TRUE);
+ ExpressionParser expParser(parser,line);
+ QValueList<QCString> args = split(data," ");
+ QValueListIterator<QCString> it = args.begin();
+ if (it==args.end() || (*it).find('=')!=-1)
+ {
+ parser->warn(parser->templateName(),line,"Missing name for indexentry tag");
+ }
+ else
+ {
+ m_name = *it;
+ ++it;
+ while (it!=args.end())
+ {
+ QCString arg = *it;
+ int j=arg.find('=');
+ if (j>0)
+ {
+ ExprAst *expr = expParser.parse(arg.mid(j+1));
+ if (expr)
+ {
+ m_args.append(new Mapping(arg.left(j),expr));
+ }
+ }
+ else
+ {
+ parser->warn(parser->templateName(),line,"invalid argument '%s' for indexentry tag",arg.data());
+ }
+ ++it;
+ }
+ }
+ TRACE(("}TemplateNodeIndexEntry(%s)\n",data.data()));
+ }
+ void render(FTextStream &, TemplateContext *c)
+ {
+ if (!m_name.isEmpty())
+ {
+ TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
+ QListIterator<Mapping> it(m_args);
+ Mapping *mapping;
+ QValueList<TemplateKeyValue> list;
+ for (it.toFirst();(mapping=it.current());++it)
+ {
+ list.append(TemplateKeyValue(mapping->name,mapping->value->resolve(c)));
+ }
+ ci->addIndexEntry(m_name,list);
+ }
+ }
+ private:
+ QCString m_name;
+ QList<Mapping> m_args;
+};
+
+//----------------------------------------------------------
+
+/** @brief Class representing an 'opensubindex' tag in a template */
+class TemplateNodeOpenSubIndex : public TemplateNodeCreator<TemplateNodeOpenSubIndex>
+{
+ public:
+ TemplateNodeOpenSubIndex(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+ : TemplateNodeCreator<TemplateNodeOpenSubIndex>(parser,parent,line)
+ {
+ TRACE(("{TemplateNodeOpenSubIndex(%s)\n",data.data()));
+ m_name = data.stripWhiteSpace();
+ if (m_name.isEmpty())
+ {
+ parser->warn(parser->templateName(),line,"Missing argument for opensubindex tag");
+ }
+ else if (m_name.find(' ')!=-1)
+ {
+ parser->warn(parser->templateName(),line,"Expected single argument for opensubindex tag got '%s'",data.data());
+ m_name="";
+ }
+ TRACE(("}TemplateNodeOpenSubIndex(%s)\n",data.data()));
+ }
+ void render(FTextStream &, TemplateContext *c)
+ {
+ if (!m_name.isEmpty())
+ {
+ TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
+ ci->openSubIndex(m_name);
+ }
+ }
+ private:
+ QCString m_name;
+};
+
+//----------------------------------------------------------
+
+/** @brief Class representing an 'closesubindex' tag in a template */
+class TemplateNodeCloseSubIndex : public TemplateNodeCreator<TemplateNodeCloseSubIndex>
+{
+ public:
+ TemplateNodeCloseSubIndex(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+ : TemplateNodeCreator<TemplateNodeCloseSubIndex>(parser,parent,line)
+ {
+ TRACE(("{TemplateNodeCloseSubIndex(%s)\n",data.data()));
+ m_name = data.stripWhiteSpace();
+ if (m_name.isEmpty())
+ {
+ parser->warn(parser->templateName(),line,"Missing argument for closesubindex tag");
+ }
+ else if (m_name.find(' ')!=-1 || m_name.isEmpty())
+ {
+ parser->warn(parser->templateName(),line,"Expected single argument for closesubindex tag got '%s'",data.data());
+ m_name="";
+ }
+ TRACE(("}TemplateNodeCloseSubIndex(%s)\n",data.data()));
+ }
+ void render(FTextStream &, TemplateContext *c)
+ {
+ if (!m_name.isEmpty())
+ {
+ TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
+ ci->closeSubIndex(m_name);
+ }
+ }
+ private:
+ QCString m_name;
+};
+
+
+//----------------------------------------------------------
+
/** @brief Class representing an 'with' tag in a template */
class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
{
@@ -2535,7 +3298,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
{
TRACE(("{TemplateNodeWith(%s)\n",data.data()));
m_args.setAutoDelete(TRUE);
- ExpressionParser expParser(parser->templateName(),line);
+ ExpressionParser expParser(parser,line);
QValueList<QCString> args = split(data," ");
QValueListIterator<QCString> it = args.begin();
while (it!=args.end())
@@ -2544,7 +3307,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
int j=arg.find('=');
if (j>0)
{
- ExprAst *expr = expParser.parsePrimary(arg.mid(j+1));
+ ExprAst *expr = expParser.parse(arg.mid(j+1));
if (expr)
{
m_args.append(new Mapping(arg.left(j),expr));
@@ -2552,7 +3315,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
}
else
{
- warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
+ parser->warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
}
++it;
}
@@ -2568,6 +3331,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
void render(FTextStream &ts, TemplateContext *c)
{
TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
c->push();
QListIterator<Mapping> it(m_args);
Mapping *mapping;
@@ -2596,12 +3360,12 @@ class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle>
TRACE(("{TemplateNodeCycle(%s)\n",data.data()));
m_args.setAutoDelete(TRUE);
m_index=0;
- ExpressionParser expParser(parser->templateName(),line);
+ ExpressionParser expParser(parser,line);
QValueList<QCString> args = split(data," ");
QValueListIterator<QCString> it = args.begin();
while (it!=args.end())
{
- ExprAst *expr = expParser.parsePrimary(*it);
+ ExprAst *expr = expParser.parse(*it);
if (expr)
{
m_args.append(expr);
@@ -2610,13 +3374,14 @@ class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle>
}
if (m_args.count()<2)
{
- warn(parser->templateName(),line,"expected at least two arguments for cycle command, got %d",m_args.count());
+ parser->warn(parser->templateName(),line,"expected at least two arguments for cycle command, got %d",m_args.count());
}
TRACE(("}TemplateNodeCycle(%s)\n",data.data()));
}
void render(FTextStream &ts, TemplateContext *c)
{
TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
if (m_index<m_args.count())
{
TemplateVariant v = m_args.at(m_index)->resolve(c);
@@ -2661,7 +3426,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
{
TRACE(("{TemplateNodeSet(%s)\n",data.data()));
m_args.setAutoDelete(TRUE);
- ExpressionParser expParser(parser->templateName(),line);
+ ExpressionParser expParser(parser,line);
QValueList<QCString> args = split(data," ");
QValueListIterator<QCString> it = args.begin();
while (it!=args.end())
@@ -2670,7 +3435,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
int j=arg.find('=');
if (j>0)
{
- ExprAst *expr = expParser.parsePrimary(arg.mid(j+1));
+ ExprAst *expr = expParser.parse(arg.mid(j+1));
if (expr)
{
m_args.append(new Mapping(arg.left(j),expr));
@@ -2678,7 +3443,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
}
else
{
- warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
+ parser->warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
}
++it;
}
@@ -2687,6 +3452,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
void render(FTextStream &, TemplateContext *c)
{
TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
QListIterator<Mapping> it(m_args);
Mapping *mapping;
for (it.toFirst();(mapping=it.current());++it)
@@ -2718,6 +3484,7 @@ class TemplateNodeSpaceless : public TemplateNodeCreator<TemplateNodeSpaceless>
void render(FTextStream &ts, TemplateContext *c)
{
TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+ ci->setLocation(m_templateName,m_line);
bool wasSpaceless = ci->spacelessEnabled();
ci->enableSpaceless(TRUE);
m_nodes.render(ts,c);
@@ -2741,14 +3508,14 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
int w = data.find(" with ");
if (i==-1 || w==-1 || w<i)
{
- warn(m_templateName,line,"markers tag as wrong format. Expected: markers <var> in <list> with <string_with_markers>");
+ parser->warn(m_templateName,line,"markers tag as wrong format. Expected: markers <var> in <list> with <string_with_markers>");
}
else
{
- ExpressionParser expParser(parser->templateName(),line);
+ ExpressionParser expParser(parser,line);
m_var = data.left(i);
- m_listExpr = expParser.parseVariable(data.mid(i+4,w-i-4));
- m_patternExpr = expParser.parseVariable(data.right(data.length()-w-6));
+ m_listExpr = expParser.parse(data.mid(i+4,w-i-4));
+ m_patternExpr = expParser.parse(data.right(data.length()-w-6));
}
QStrList stopAt;
stopAt.append("endmarkers");
@@ -2785,9 +3552,9 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
for (it->toFirst(); (it->current(var)) && i<entryIndex; it->toNext(),i++) {}
if (ok && i==entryIndex) // found element
{
- TemplateStruct s;
- s.set("id",(int)i);
- c->set("markers",&s);
+ TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+ s->set("id",(int)i);
+ c->set("markers",s.get());
c->set(m_var,var); // define local variable to hold element of list type
bool wasSpaceless = ci->spacelessEnabled();
ci->enableSpaceless(TRUE);
@@ -2796,11 +3563,11 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
}
else if (!ok)
{
- warn(m_templateName,m_line,"markers pattern string has invalid markers '%s'",str.data());
+ ci->warn(m_templateName,m_line,"markers pattern string has invalid markers '%s'",str.data());
}
else if (i<entryIndex)
{
- warn(m_templateName,m_line,"markers list does not an element for marker position %d",i);
+ ci->warn(m_templateName,m_line,"markers list does not an element for marker position %d",i);
}
index=newIndex+matchLen; // set index just after marker
}
@@ -2809,12 +3576,12 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
}
else
{
- warn(m_templateName,m_line,"markers requires a parameter of string type after 'with'!");
+ ci->warn(m_templateName,m_line,"markers requires a parameter of string type after 'with'!");
}
}
else
{
- warn(m_templateName,m_line,"markers requires a parameter of list type after 'in'!");
+ ci->warn(m_templateName,m_line,"markers requires a parameter of list type after 'in'!");
}
}
}
@@ -2881,12 +3648,16 @@ static TemplateNodeFactory::AutoRegister<TemplateNodeTree> autoRefTree("rec
static TemplateNodeFactory::AutoRegister<TemplateNodeWith> autoRefWith("with");
static TemplateNodeFactory::AutoRegister<TemplateNodeBlock> autoRefBlock("block");
static TemplateNodeFactory::AutoRegister<TemplateNodeCycle> autoRefCycle("cycle");
+static TemplateNodeFactory::AutoRegister<TemplateNodeRange> autoRefRange("range");
static TemplateNodeFactory::AutoRegister<TemplateNodeExtend> autoRefExtend("extend");
static TemplateNodeFactory::AutoRegister<TemplateNodeCreate> autoRefCreate("create");
static TemplateNodeFactory::AutoRegister<TemplateNodeRepeat> autoRefRepeat("repeat");
static TemplateNodeFactory::AutoRegister<TemplateNodeInclude> autoRefInclude("include");
static TemplateNodeFactory::AutoRegister<TemplateNodeMarkers> autoRefMarkers("markers");
static TemplateNodeFactory::AutoRegister<TemplateNodeSpaceless> autoRefSpaceless("spaceless");
+static TemplateNodeFactory::AutoRegister<TemplateNodeIndexEntry> autoRefIndexEntry("indexentry");
+static TemplateNodeFactory::AutoRegister<TemplateNodeOpenSubIndex> autoRefOpenSubIndex("opensubindex");
+static TemplateNodeFactory::AutoRegister<TemplateNodeCloseSubIndex> autoRefCloseSubIndex("closesubindex");
//----------------------------------------------------------
@@ -2970,19 +3741,20 @@ void TemplateBlockContext::push(TemplateNodeBlock *block)
class TemplateLexer
{
public:
- TemplateLexer(const QCString &fileName,const QCString &data);
+ TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data);
void tokenize(QList<TemplateToken> &tokens);
private:
void addToken(QList<TemplateToken> &tokens,
const char *data,int line,int startPos,int endPos,
TemplateToken::Type type);
void reset();
+ const TemplateEngine *m_engine;
QCString m_fileName;
QCString m_data;
};
-TemplateLexer::TemplateLexer(const QCString &fileName,const QCString &data) :
- m_fileName(fileName), m_data(data)
+TemplateLexer::TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data) :
+ m_engine(engine), m_fileName(fileName), m_data(data)
{
}
@@ -3049,6 +3821,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
if (c=='\n')
{
warn(m_fileName,line,"unexpected new line inside {%%...%%} block");
+ m_engine->printIncludeContext(m_fileName,line);
}
else if (c=='%') // %} or something else
{
@@ -3072,6 +3845,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
if (c=='\n')
{
warn(m_fileName,line,"unexpected new line inside {%%...%%} block");
+ m_engine->printIncludeContext(m_fileName,line);
}
state=StateTag;
}
@@ -3080,6 +3854,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
if (c=='\n')
{
warn(m_fileName,line,"unexpected new line inside {#...#} block");
+ m_engine->printIncludeContext(m_fileName,line);
}
else if (c=='#') // #} or something else
{
@@ -3101,6 +3876,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
if (c=='\n')
{
warn(m_fileName,line,"unexpected new line inside {#...#} block");
+ m_engine->printIncludeContext(m_fileName,line);
}
state=StateComment;
}
@@ -3125,6 +3901,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
if (c=='\n')
{
warn(m_fileName,line,"unexpected new line inside {{...}} block");
+ m_engine->printIncludeContext(m_fileName,line);
}
else if (c=='}') // }} or something else
{
@@ -3148,6 +3925,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
if (c=='\n')
{
warn(m_fileName,line,"unexpected new line inside {{...}} block");
+ m_engine->printIncludeContext(m_fileName,line);
}
state=StateVariable;
}
@@ -3192,9 +3970,10 @@ void TemplateLexer::addToken(QList<TemplateToken> &tokens,
//----------------------------------------------------------
-TemplateParser::TemplateParser(const QCString &templateName,
+TemplateParser::TemplateParser(const TemplateEngine *engine,
+ const QCString &templateName,
QList<TemplateToken> &tokens) :
- m_templateName(templateName), m_tokens(tokens)
+ m_engine(engine), m_templateName(templateName), m_tokens(tokens)
{
}
@@ -3214,10 +3993,10 @@ void TemplateParser::parse(
case TemplateToken::Text:
nodes.append(new TemplateNodeText(this,parent,tok->line,tok->data));
break;
- case TemplateToken::Variable:
+ case TemplateToken::Variable: // {{ var }}
nodes.append(new TemplateNodeVariable(this,parent,tok->line,tok->data));
break;
- case TemplateToken::Block:
+ case TemplateToken::Block: // {% tag %}
{
QCString command = tok->data;
int sep = command.find(' ');
@@ -3247,7 +4026,8 @@ void TemplateParser::parse(
command=="endblock" || command=="endwith" ||
command=="endrecursetree" || command=="endspaceless" ||
command=="endmarkers" || command=="endmsg" ||
- command=="endrepeat")
+ command=="endrepeat" || command=="elif" ||
+ command=="endrange")
{
warn(m_templateName,tok->line,"Found tag '%s' without matching start tag",command.data());
}
@@ -3288,7 +4068,7 @@ TemplateToken *TemplateParser::takeNextToken()
const TemplateToken *TemplateParser::currentToken() const
{
- return m_tokens.first();
+ return m_tokens.getFirst();
};
void TemplateParser::removeNextToken()
@@ -3301,6 +4081,15 @@ void TemplateParser::prependToken(const TemplateToken *token)
m_tokens.prepend(token);
}
+void TemplateParser::warn(const char *fileName,int line,const char *fmt,...) const
+{
+ va_list args;
+ va_start(args,fmt);
+ va_warn(fileName,line,fmt,args);
+ va_end(args);
+ m_engine->printIncludeContext(fileName,line);
+}
+
//----------------------------------------------------------
@@ -3311,11 +4100,11 @@ TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const QCS
{
m_name = name;
m_engine = engine;
- TemplateLexer lexer(name,data);
+ TemplateLexer lexer(engine,name,data);
QList<TemplateToken> tokens;
tokens.setAutoDelete(TRUE);
lexer.tokenize(tokens);
- TemplateParser parser(name,tokens);
+ TemplateParser parser(engine,name,tokens);
parser.parse(this,1,QStrList(),m_nodes);
}
@@ -3348,11 +4137,35 @@ void TemplateImpl::render(FTextStream &ts, TemplateContext *c)
/** @brief Private data of the template engine */
class TemplateEngine::Private
{
+ class IncludeEntry
+ {
+ public:
+ enum Type { Template, Block };
+ IncludeEntry(Type type,const QCString &fileName,const QCString &blockName,int line)
+ : m_type(type), m_fileName(fileName), m_blockName(blockName), m_line(line) {}
+ Type type() const { return m_type; }
+ QCString fileName() const { return m_fileName; }
+ QCString blockName() const { return m_blockName; }
+ int line() const { return m_line; }
+
+ private:
+ Type m_type;
+ QCString m_fileName;
+ QCString m_blockName;
+ int m_line;
+ };
public:
- Private(TemplateEngine *engine) : m_templateCache(17), m_engine(engine)
- { m_templateCache.setAutoDelete(TRUE); }
- Template *loadByName(const QCString &fileName) const
+ Private(TemplateEngine *engine) : m_templateCache(17) /*, m_indent(0)*/, m_engine(engine)
{
+ m_templateCache.setAutoDelete(TRUE);
+ m_includeStack.setAutoDelete(TRUE);
+ }
+ Template *loadByName(const QCString &fileName,int line)
+ {
+ //for (int i=0;i<m_indent;i++) printf(" ");
+ //m_indent++;
+ //printf("loadByName(%s,%d) {\n",fileName.data(),line);
+ m_includeStack.append(new IncludeEntry(IncludeEntry::Template,fileName,QCString(),line));
Template *templ = m_templateCache.find(fileName);
if (templ==0)
{
@@ -3379,10 +4192,60 @@ class TemplateEngine::Private
}
return templ;
}
+ void unload(Template * /*t*/)
+ {
+ //(void)t;
+ //m_indent--;
+ //for (int i=0;i<m_indent;i++) printf(" ");
+ //printf("}\n");
+ m_includeStack.removeLast();
+ }
+
+ void enterBlock(const QCString &fileName,const QCString &blockName,int line)
+ {
+ //for (int i=0;i<m_indent;i++) printf(" ");
+ //m_indent++;
+ //printf("enterBlock(%s,%s,%d) {\n",fileName.data(),blockName.data(),line);
+ m_includeStack.append(new IncludeEntry(IncludeEntry::Block,fileName,blockName,line));
+ }
+
+ void leaveBlock()
+ {
+ //m_indent--;
+ //for (int i=0;i<m_indent;i++) printf(" ");
+ //printf("}\n");
+ m_includeStack.removeLast();
+ }
+
+ void printIncludeContext(const char *fileName,int line) const
+ {
+ QListIterator<IncludeEntry> li(m_includeStack);
+ li.toLast();
+ IncludeEntry *ie=li.current();
+ while ((ie=li.current()))
+ {
+ --li;
+ IncludeEntry *next=li.current();
+ if (ie->type()==IncludeEntry::Template)
+ {
+ if (next)
+ {
+ warn(fileName,line," inside template '%s' included from template '%s' at line %d",ie->fileName().data(),next->fileName().data(),ie->line());
+ }
+ }
+ else // ie->type()==IncludeEntry::Block
+ {
+ warn(fileName,line," included by block '%s' inside template '%s' at line %d",ie->blockName().data(),
+ ie->fileName().data(),ie->line());
+ }
+ }
+ }
private:
- mutable QDict<Template> m_templateCache;
+ QDict<Template> m_templateCache;
+ //mutable int m_indent;
TemplateEngine *m_engine;
+ QList<IncludeEntry> m_includeStack;
};
TemplateEngine::TemplateEngine()
@@ -3397,11 +4260,31 @@ TemplateEngine::~TemplateEngine()
TemplateContext *TemplateEngine::createContext() const
{
- return new TemplateContextImpl;
+ return new TemplateContextImpl(this);
+}
+
+Template *TemplateEngine::loadByName(const QCString &fileName,int line)
+{
+ return p->loadByName(fileName,line);
+}
+
+void TemplateEngine::unload(Template *t)
+{
+ p->unload(t);
+}
+
+void TemplateEngine::enterBlock(const QCString &fileName,const QCString &blockName,int line)
+{
+ p->enterBlock(fileName,blockName,line);
+}
+
+void TemplateEngine::leaveBlock()
+{
+ p->leaveBlock();
}
-Template *TemplateEngine::loadByName(const QCString &fileName)
+void TemplateEngine::printIncludeContext(const char *fileName,int line) const
{
- return p->loadByName(fileName);
+ p->printIncludeContext(fileName,line);
}
diff --git a/src/template.h b/src/template.h
index 9e3b106..cb4a96f 100644
--- a/src/template.h
+++ b/src/template.h
@@ -10,32 +10,32 @@ class TemplateListIntf;
class TemplateStructIntf;
class TemplateEngine;
-/** @defgroup template_api Template API
+/** @defgroup template_api Template API
*
- * This is the API for a
- * <a href="https://docs.djangoproject.com/en/1.6/topics/templates/">Django</a>
+ * This is the API for a
+ * <a href="https://docs.djangoproject.com/en/1.6/topics/templates/">Django</a>
* compatible template system written in C++.
- * It is somewhat inspired by Stephen Kelly's
+ * It is somewhat inspired by Stephen Kelly's
* <a href="http://www.gitorious.org/grantlee/pages/Home">Grantlee</a>.
*
- * A template is simply a text file.
- * A template contains \b variables, which get replaced with values when the
+ * A template is simply a text file.
+ * A template contains \b variables, which get replaced with values when the
* template is evaluated, and \b tags, which control the logic of the template.
*
* Variables look like this: `{{ variable }}`
- * When the template engine encounters a variable, it evaluates that variable and
- * replaces it with the result. Variable names consist of any combination of
+ * When the template engine encounters a variable, it evaluates that variable and
+ * replaces it with the result. Variable names consist of any combination of
* alphanumeric characters and the underscore ("_").
* Use a dot (.) to access attributes of a structured variable.
- *
+ *
* One can modify variables for display by using \b filters, for example:
* `{{ value|default:"nothing" }}`
*
- * Tags look like this: `{% tag %}`. Tags are more complex than variables:
- * Some create text in the output, some control flow by performing loops or logic,
+ * Tags look like this: `{% tag %}`. Tags are more complex than variables:
+ * Some create text in the output, some control flow by performing loops or logic,
* and some load external information into the template to be used by later variables.
*
- * To comment-out part of a line in a template, use the comment syntax:
+ * To comment-out part of a line in a template, use the comment syntax:
* `{# comment text #}`.
*
* Supported Django tags:
@@ -144,17 +144,15 @@ class TemplateVariant
/** Constructs a new variant with a string value \a s. */
TemplateVariant(const QCString &s,bool raw=FALSE);
- /** Constructs a new variant with a struct value \a s.
- * @note. Only a pointer to the struct is stored. The caller
- * is responsible to manage the memory for the struct object.
+ /** Constructs a new variant with a struct value \a s.
+ * @note. The variant will hold a reference to the object.
*/
- TemplateVariant(const TemplateStructIntf *s);
+ TemplateVariant(TemplateStructIntf *s);
- /** Constructs a new variant with a list value \a l.
- * @note. Only a pointer to the struct is stored. The caller
- * is responsible to manage the memory for the list object.
+ /** Constructs a new variant with a list value \a l.
+ * @note. The variant will hold a reference to the object.
*/
- TemplateVariant(const TemplateListIntf *l);
+ TemplateVariant(TemplateListIntf *l);
/** Constructs a new variant which represents a method call
* @param[in] delegate Delegate object to invoke when
@@ -168,7 +166,7 @@ class TemplateVariant
/** Destroys the Variant object */
~TemplateVariant();
- /** Constructs a copy of the variant, \a v,
+ /** Constructs a copy of the variant, \a v,
* passed as the argument to this constructor.
*/
TemplateVariant(const TemplateVariant &v);
@@ -176,7 +174,7 @@ class TemplateVariant
/** Assigns the value of the variant \a v to this variant. */
TemplateVariant &operator=(const TemplateVariant &v);
- /** Compares this QVariant with v and returns true if they are equal;
+ /** Compares this QVariant with v and returns true if they are equal;
* otherwise returns false.
*/
bool operator==(TemplateVariant &other);
@@ -190,22 +188,22 @@ class TemplateVariant
/** Returns the variant as an integer. */
int toInt() const;
- /** Returns the pointer to list referenced by this variant
- * or 0 if this variant does not have list type.
+ /** Returns the pointer to list referenced by this variant
+ * or 0 if this variant does not have list type.
*/
- const TemplateListIntf *toList() const;
+ TemplateListIntf *toList() const;
- /** Returns the pointer to struct referenced by this variant
- * or 0 if this variant does not have struct type.
+ /** Returns the pointer to struct referenced by this variant
+ * or 0 if this variant does not have struct type.
*/
- const TemplateStructIntf *toStruct() const;
+ TemplateStructIntf *toStruct() const;
/** Return the result of apply this function with \a args.
* Returns an empty string if the variant type is not a function.
*/
TemplateVariant call(const QValueList<TemplateVariant> &args);
- /** Sets whether or not the value of the Variant should be
+ /** Sets whether or not the value of the Variant should be
* escaped or written as-is (raw).
* @param[in] b TRUE means write as-is, FALSE means apply escaping.
*/
@@ -223,7 +221,28 @@ class TemplateVariant
//------------------------------------------------------------------------
-/** @brief Abstract read-only interface for a context value of type list.
+template<class T> class TemplateAutoRef
+{
+ public:
+ TemplateAutoRef(T *obj) : m_obj(obj)
+ {
+ m_obj->addRef();
+ }
+ ~TemplateAutoRef()
+ {
+ m_obj->release();
+ }
+ T &operator*() const { return *m_obj; }
+ T *operator->() const { return m_obj; }
+ T *get() const { return m_obj; }
+
+ private:
+ T *m_obj;
+};
+
+//------------------------------------------------------------------------
+
+/** @brief Abstract read-only interface for a context value of type list.
* @note The values of the list are TemplateVariants.
*/
class TemplateListIntf
@@ -245,7 +264,7 @@ class TemplateListIntf
virtual void toPrev() = 0;
/* Returns TRUE if the iterator points to a valid element
* in the list, or FALSE otherwise.
- * If TRUE is returned, the value pointed to be the
+ * If TRUE is returned, the value pointed to be the
* iterator is assigned to \a v.
*/
virtual bool current(TemplateVariant &v) const = 0;
@@ -260,30 +279,41 @@ class TemplateListIntf
/** Returns the element at index position \a index. */
virtual TemplateVariant at(int index) const = 0;
- /** Creates a new iterator for this list.
+ /** Creates a new iterator for this list.
* @note the user should call delete on the returned pointer.
*/
virtual TemplateListIntf::ConstIterator *createIterator() const = 0;
+
+ /** Increase object's reference count */
+ virtual int addRef() = 0;
+
+ /** Decreases object's referenc count, destroy object if 0 */
+ virtual int release() = 0;
};
/** @brief Default implementation of a context value of type list. */
class TemplateList : public TemplateListIntf
{
public:
- /** Creates a list */
- TemplateList();
- /** Destroys the list */
- ~TemplateList();
-
// TemplateListIntf methods
virtual int count() const;
virtual TemplateVariant at(int index) const;
virtual TemplateListIntf::ConstIterator *createIterator() const;
-
+ virtual int addRef();
+ virtual int release();
+
+ /** Creates an instance with ref count set to 0 */
+ static TemplateList *alloc();
+
/** Appends element \a v to the end of the list */
virtual void append(const TemplateVariant &v);
private:
+ /** Creates a list */
+ TemplateList();
+ /** Destroys the list */
+ ~TemplateList();
+
friend class TemplateListConstIterator;
class Private;
Private *p;
@@ -302,6 +332,12 @@ class TemplateStructIntf
* @param[in] name The name of the field.
*/
virtual TemplateVariant get(const char *name) const = 0;
+
+ /** Increase object's reference count */
+ virtual int addRef() = 0;
+
+ /** Decreases object's referenc count, destroy object if 0 */
+ virtual int release() = 0;
};
@@ -309,13 +345,13 @@ class TemplateStructIntf
class TemplateStruct : public TemplateStructIntf
{
public:
- /** Creates a struct */
- TemplateStruct();
- /** Destroys the struct */
- virtual ~TemplateStruct();
-
// TemplateStructIntf methods
virtual TemplateVariant get(const char *name) const;
+ virtual int addRef();
+ virtual int release();
+
+ /** Creates an instance with ref count set to 0. */
+ static TemplateStruct *alloc();
/** Sets the value the field of a struct
* @param[in] name The name of the field.
@@ -323,7 +359,13 @@ class TemplateStruct : public TemplateStructIntf
*/
virtual void set(const char *name,const TemplateVariant &v);
+
private:
+ /** Creates a struct */
+ TemplateStruct();
+ /** Destroys the struct */
+ virtual ~TemplateStruct();
+
class Private;
Private *p;
};
@@ -350,14 +392,14 @@ class TemplateSpacelessIntf
//------------------------------------------------------------------------
-/** @brief Abstract interface for a template context.
- *
+/** @brief Abstract interface for a template context.
+ *
* A Context consists of a stack of dictionaries.
* A dictionary consists of a mapping of string keys onto TemplateVariant values.
* A key is searched starting with the dictionary at the top of the stack
* and searching downwards until it is found. The stack is used to create
* local scopes.
- * @note This object must be created by TemplateEngine
+ * @note This object must be created by TemplateEngine::createContext()
*/
class TemplateContext
{
@@ -370,10 +412,10 @@ class TemplateContext
/** Pop the current scope from the stack. */
virtual void pop() = 0;
- /** Sets a value in the current scope.
+ /** Sets a value in the current scope.
* @param[in] name The name of the value; the key in the dictionary.
* @param[in] v The value associated with the key.
- * @note When a given key is already present,
+ * @note When a given key is already present,
* its value will be replaced by \a v
*/
virtual void set(const char *name,const TemplateVariant &v) = 0;
@@ -399,7 +441,7 @@ class TemplateContext
/** Sets the interface that will be used for escaping the result
* of variable expansion before writing it to the output.
*/
- virtual void setEscapeIntf(TemplateEscapeIntf *intf) = 0;
+ virtual void setEscapeIntf(const QCString &extension, TemplateEscapeIntf *intf) = 0;
/** Sets the interface that will be used inside a spaceless block
* to remove any redundant whitespace.
@@ -409,8 +451,8 @@ class TemplateContext
//------------------------------------------------------------------------
-/** @brief Abstract interface for a template.
- * @note Must be created by TemplateEngine
+/** @brief Abstract interface for a template.
+ * @note Must be created and is deleted by the TemplateEngine
*/
class Template
{
@@ -418,7 +460,7 @@ class Template
/** Destructor */
virtual ~Template() {}
- /** Renders a template instance to a stream.
+ /** Renders a template instance to a stream.
* @param[in] ts The text stream to write the results to.
* @param[in] c The context containing data that can be used
* when instantiating the template.
@@ -444,13 +486,25 @@ class TemplateEngine
TemplateContext *createContext() const;
/** Creates a new template whole contents are in a file.
- * @param[in] fileName The name of the file containing the
+ * @param[in] fileName The name of the file containing the
* template data
+ * @param[in] fromLine The line number of the statement that triggered the load
* @return the new template, the caller will be the owner.
*/
- Template *loadByName(const QCString &fileName);
+ Template *loadByName(const QCString &fileName,int fromLine);
+
+ /** Indicates that template \a t is no longer needed. The engine
+ * may decide to delete it.
+ */
+ void unload(Template *t);
+
+ void printIncludeContext(const char *fileName,int line) const;
private:
+ friend class TemplateNodeBlock;
+ void enterBlock(const QCString &fileName,const QCString &blockName,int line);
+ void leaveBlock();
+
class Private;
Private *p;
};
diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp
index 9275846..6f3151f 100644
--- a/src/textdocvisitor.cpp
+++ b/src/textdocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,115 +19,21 @@
#include <qdir.h>
#include "textdocvisitor.h"
#include "message.h"
+#include "util.h"
+#include "htmlentity.h"
//-------------------------------------------------------------------------
void TextDocVisitor::visit(DocSymbol *s)
{
- switch(s->symbol())
+ const char *res = HtmlEntityMapper::instance()->html(s->symbol());
+ if (res)
{
- case DocSymbol::BSlash: m_t << "\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "&lt;"; break;
- case DocSymbol::Greater: m_t << "&gt;"; break;
- case DocSymbol::Amp: m_t << "&amp;"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::DoubleColon: m_t << "::"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Pipe: m_t << "|"; break;
- case DocSymbol::Copy: m_t << "&copy;"; break;
- case DocSymbol::Tm: m_t << "&tm;"; break;
- case DocSymbol::Reg: m_t << "&reg;"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Lsquo: m_t << "&lsquo;"; break;
- case DocSymbol::Rsquo: m_t << "&rsquo;"; break;
- case DocSymbol::Ldquo: m_t << "&ldquo;"; break;
- case DocSymbol::Rdquo: m_t << "&rdquo;"; break;
- case DocSymbol::Ndash: m_t << "&ndash;"; break;
- case DocSymbol::Mdash: m_t << "&mdash;"; break;
- case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break;
- case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break;
- case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break;
- case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break;
- case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break;
- case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break;
- case DocSymbol::Szlig: m_t << "&szlig;"; break;
- case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break;
- case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break;
- case DocSymbol::Nbsp: m_t << "&nbsp;"; break;
- case DocSymbol::Aelig: m_t << "&aelig;"; break;
- case DocSymbol::AElig: m_t << "&AElig;"; break;
- case DocSymbol::GrkGamma: m_t << "&Gamma;"; break;
- case DocSymbol::GrkDelta: m_t << "&Delta;"; break;
- case DocSymbol::GrkTheta: m_t << "&Theta;"; break;
- case DocSymbol::GrkLambda: m_t << "&Lambda;"; break;
- case DocSymbol::GrkXi: m_t << "&Xi;"; break;
- case DocSymbol::GrkPi: m_t << "&Pi;"; break;
- case DocSymbol::GrkSigma: m_t << "&Sigma;"; break;
- case DocSymbol::GrkUpsilon: m_t << "&Upsilon;"; break;
- case DocSymbol::GrkPhi: m_t << "&Phi;"; break;
- case DocSymbol::GrkPsi: m_t << "&Psi;"; break;
- case DocSymbol::GrkOmega: m_t << "&Omega;"; break;
- case DocSymbol::Grkalpha: m_t << "&alpha;"; break;
- case DocSymbol::Grkbeta: m_t << "&beta;"; break;
- case DocSymbol::Grkgamma: m_t << "&gamma;"; break;
- case DocSymbol::Grkdelta: m_t << "&delta;"; break;
- case DocSymbol::Grkepsilon: m_t << "&epsilon;"; break;
- case DocSymbol::Grkzeta: m_t << "&zeta;"; break;
- case DocSymbol::Grketa: m_t << "&eta;"; break;
- case DocSymbol::Grktheta: m_t << "&theta;"; break;
- case DocSymbol::Grkiota: m_t << "&iota;"; break;
- case DocSymbol::Grkkappa: m_t << "&kappa;"; break;
- case DocSymbol::Grklambda: m_t << "&lambda;"; break;
- case DocSymbol::Grkmu: m_t << "&mu;"; break;
- case DocSymbol::Grknu: m_t << "&nu;"; break;
- case DocSymbol::Grkxi: m_t << "&xi;"; break;
- case DocSymbol::Grkpi: m_t << "&pi;"; break;
- case DocSymbol::Grkrho: m_t << "&rho;"; break;
- case DocSymbol::Grksigma: m_t << "&sigma;"; break;
- case DocSymbol::Grktau: m_t << "&tau;"; break;
- case DocSymbol::Grkupsilon: m_t << "&upsilon;"; break;
- case DocSymbol::Grkphi: m_t << "&phi;"; break;
- case DocSymbol::Grkchi: m_t << "&chi;"; break;
- case DocSymbol::Grkpsi: m_t << "&psi;"; break;
- case DocSymbol::Grkomega: m_t << "&omega;"; break;
- case DocSymbol::Grkvarsigma: m_t << "&sigmaf;"; break;
- case DocSymbol::Section: m_t << "&sect;"; break;
- case DocSymbol::Degree: m_t << "&deg;"; break;
- case DocSymbol::Prime: m_t << "&prime;"; break;
- case DocSymbol::DoublePrime: m_t << "&Prime;"; break;
- case DocSymbol::Infinity: m_t << "&infin;"; break;
- case DocSymbol::EmptySet: m_t << "&empty;"; break;
- case DocSymbol::PlusMinus: m_t << "&plusmn;"; break;
- case DocSymbol::Times: m_t << "&times;"; break;
- case DocSymbol::Minus: m_t << "&minus;"; break;
- case DocSymbol::CenterDot: m_t << "&sdot;"; break;
- case DocSymbol::Partial: m_t << "&part;"; break;
- case DocSymbol::Nabla: m_t << "&nabla;"; break;
- case DocSymbol::SquareRoot: m_t << "&radic;"; break;
- case DocSymbol::Perpendicular: m_t << "&perp;"; break;
- case DocSymbol::Sum: m_t << "&sum;"; break;
- case DocSymbol::Integral: m_t << "&int;"; break;
- case DocSymbol::Product: m_t << "&prod;"; break;
- case DocSymbol::Similar: m_t << "&sim;"; break;
- case DocSymbol::Approx: m_t << "&asymp;"; break;
- case DocSymbol::NotEqual: m_t << "&ne;"; break;
- case DocSymbol::Equivalent: m_t << "&equiv;"; break;
- case DocSymbol::Proportional: m_t << "&prop;"; break;
- case DocSymbol::LessEqual: m_t << "&le;"; break;
- case DocSymbol::GreaterEqual: m_t << "&ge;"; break;
- case DocSymbol::LeftArrow: m_t << "&larr;"; break;
- case DocSymbol::RightArrow: m_t << "&rarr;"; break;
- case DocSymbol::SetIn: m_t << "&isin;"; break;
- case DocSymbol::SetNotIn: m_t << "&notin;"; break;
- case DocSymbol::LeftCeil: m_t << "&lceil;"; break;
- case DocSymbol::RightCeil: m_t << "&rceil;"; break;
- case DocSymbol::LeftFloor: m_t << "&lfloor;"; break;
- case DocSymbol::RightFloor: m_t << "&rfloor;"; break;
- default:
- err("unknown symbol found\n");
+ m_t << res;
+ }
+ else
+ {
+ err("text: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
}
diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h
index 9045d21..b17065d 100644
--- a/src/textdocvisitor.h
+++ b/src/textdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/tooltip.cpp b/src/tooltip.cpp
index 041aa16..8085bff 100644
--- a/src/tooltip.cpp
+++ b/src/tooltip.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/tooltip.h b/src/tooltip.h
index b4a4af4..ea8948d 100644
--- a/src/tooltip.h
+++ b/src/tooltip.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator.h b/src/translator.h
index 49a8135..32eaf09 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_am.h b/src/translator_am.h
index fd8b1dd..9eaba0e 100644
--- a/src/translator_am.h
+++ b/src/translator_am.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_ar.h b/src/translator_ar.h
index 143170d..5d37b69 100644
--- a/src/translator_ar.h
+++ b/src/translator_ar.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_br.h b/src/translator_br.h
index f9dba84..b381495 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_ca.h b/src/translator_ca.h
index 1291a8c..5c3e595 100644
--- a/src/translator_ca.h
+++ b/src/translator_ca.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_cn.h b/src/translator_cn.h
index f8e03c5..fc01ce0 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_cz.h b/src/translator_cz.h
index 2793519..b83eb92 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_de.h b/src/translator_de.h
index d13d99c..d936bf1 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_dk.h b/src/translator_dk.h
index 16ffae4..74b07f4 100644
--- a/src/translator_dk.h
+++ b/src/translator_dk.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_en.h b/src/translator_en.h
index 0535b6b..ca0a151 100644
--- a/src/translator_en.h
+++ b/src/translator_en.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -530,7 +530,7 @@ class TranslatorEnglish : public Translator
/*! this text is generated when the \\sa command is used. */
virtual QCString trSeeAlso()
- { return "See Also"; }
+ { return "See also"; }
/*! this text is generated when the \\param command is used. */
virtual QCString trParameters()
diff --git a/src/translator_eo.h b/src/translator_eo.h
index 3c5b9a5..e1513cb 100644
--- a/src/translator_eo.h
+++ b/src/translator_eo.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_es.h b/src/translator_es.h
index d6738e0..ba6e823 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_fa.h b/src/translator_fa.h
index bcc0572..7b6f9d7 100644
--- a/src/translator_fa.h
+++ b/src/translator_fa.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_fi.h b/src/translator_fi.h
index fa42259..eeeb9a5 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_fr.h b/src/translator_fr.h
index 28468e7..2c548c2 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_gr.h b/src/translator_gr.h
index 1523445..fa7a682 100644
--- a/src/translator_gr.h
+++ b/src/translator_gr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_hr.h b/src/translator_hr.h
index 5c79f61..70dba21 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_hu.h b/src/translator_hu.h
index 157247c..610af8e 100644
--- a/src/translator_hu.h
+++ b/src/translator_hu.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_id.h b/src/translator_id.h
index 7ecdbe7..5647bc0 100644
--- a/src/translator_id.h
+++ b/src/translator_id.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_it.h b/src/translator_it.h
index 912f389..59799a3 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_je.h b/src/translator_je.h
index 894452a..4dbcb4e 100644
--- a/src/translator_je.h
+++ b/src/translator_je.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_jp.h b/src/translator_jp.h
index febf353..ae3605a 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_ke.h b/src/translator_ke.h
index 357465d..56a70b3 100644
--- a/src/translator_ke.h
+++ b/src/translator_ke.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_kr.h b/src/translator_kr.h
index 348fa10..6919763 100644
--- a/src/translator_kr.h
+++ b/src/translator_kr.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_lt.h b/src/translator_lt.h
index 9edbe57..000dc6e 100644
--- a/src/translator_lt.h
+++ b/src/translator_lt.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_lv.h b/src/translator_lv.h
index 054310c..135cd11 100644
--- a/src/translator_lv.h
+++ b/src/translator_lv.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_mk.h b/src/translator_mk.h
index b753756..510561e 100644
--- a/src/translator_mk.h
+++ b/src/translator_mk.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 2525b4f..2ffacb6 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_no.h b/src/translator_no.h
index 3d20f08..2662e47 100644
--- a/src/translator_no.h
+++ b/src/translator_no.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_pl.h b/src/translator_pl.h
index d819f66..6f2e14c 100644
--- a/src/translator_pl.h
+++ b/src/translator_pl.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_pt.h b/src/translator_pt.h
index 8e91181..95a62b0 100644
--- a/src/translator_pt.h
+++ b/src/translator_pt.h
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_ro.h b/src/translator_ro.h
index 9bbadeb..ea0988d 100644
--- a/src/translator_ro.h
+++ b/src/translator_ro.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_ru.h b/src/translator_ru.h
index 07aa63b..54174d7 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -532,7 +532,7 @@ class TranslatorRussian : public Translator
* related classes
*/
virtual QCString trRelatedFunctionDocumentation()
- { return "Документация по друзьям класса и функциям, отноносящимся"
+ { return "Документация по друзьям класса и функциям, относящимся"
" к классу"; }
//////////////////////////////////////////////////////////////////////////
@@ -1678,7 +1678,7 @@ class TranslatorRussian : public Translator
case ClassDef::Union: result+="объединению"; break;
case ClassDef::Interface: result+="интерфейсу"; break;
case ClassDef::Protocol: result+="протоколу"; break;
- case ClassDef::Category: result+="кетегории"; break;
+ case ClassDef::Category: result+="категории"; break;
case ClassDef::Exception: result+="исключению"; break;
default: break;
}
@@ -1954,7 +1954,7 @@ class TranslatorRussian : public Translator
{
// single is true implies a single file
QCString result=(QCString)"Документация для этого сервиса "
- "сгенерированна из следующего файл";
+ "сгенерирована из следующего файл";
if (single) result+="а:"; else result+="ов:";
return result;
}
@@ -1963,7 +1963,7 @@ class TranslatorRussian : public Translator
{
// single is true implies a single file
QCString result=(QCString)"Документация по этому одиночке "
- "сгенерированна из следующего файл";
+ "сгенерирована из следующего файл";
if (single) result+="а:"; else result+="ов:";
return result;
}
diff --git a/src/translator_sc.h b/src/translator_sc.h
index af2d7df..84e8756 100644
--- a/src/translator_sc.h
+++ b/src/translator_sc.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_si.h b/src/translator_si.h
index 57ca5c4..33bc27a 100644
--- a/src/translator_si.h
+++ b/src/translator_si.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_sk.h b/src/translator_sk.h
index 8c51147..0fc826b 100644
--- a/src/translator_sk.h
+++ b/src/translator_sk.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_sr.h b/src/translator_sr.h
index 11ebac2..f58ac13 100644
--- a/src/translator_sr.h
+++ b/src/translator_sr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_sv.h b/src/translator_sv.h
index 4ef2bc4..f4d0a35 100644
--- a/src/translator_sv.h
+++ b/src/translator_sv.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,7 @@ Svensk översättning av:
Samuel Hägglund <sahag96@ite.mh.se>
Xet Erixon <xet@xeqt.com>
Mikael Hallin <mikaelhallin@yahoo.se> 2003-07-28
+Björn Palmqvist <bjorn@aidium.se> 2014-02-01
==================================================================================
Uppdateringar.
1999/04/29
@@ -69,7 +70,7 @@ Problem!
#ifndef TRANSLATOR_SE_H
#define TRANSLATOR_SE_H
-class TranslatorSwedish : public TranslatorAdapter_1_6_0
+class TranslatorSwedish : public Translator
{
public:
@@ -389,7 +390,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
{ return "Dokumentation över typdefinitioner"; }
virtual QCString trEnumerationTypeDocumentation()
- { return "Dokumentation över egenuppräknande typer"; }
+ { return "Dokumentation över egenuppräknande typer"; ; }
virtual QCString trFunctionDocumentation()
{ return "Dokumentation över funktioner"; }
@@ -1085,7 +1086,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
*/
virtual QCString trNamespace(bool first_capital, bool singular)
{
- QCString result((first_capital ? "Namnrymd" : "namnrynd"));
+ QCString result((first_capital ? "Namnrymd" : "namnrymd"));
if (!singular) result+="er";
return result;
}
@@ -1604,6 +1605,262 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
{
return "Typbegränsningar";
}
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Relation";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Laddar...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globalnamnrymd";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Söker...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Inga träffar";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Fil i "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Inkluderar fil i "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Mån","Tis","Ons","Tor","Fre","Lör","Sön" };
+ static const char *months[] = { "Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
+ QCString sdate;
+ sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Header for the page with bibliographic citations */
+ virtual QCString trCiteReferences()
+ { return "Bibliografiska Referenser"; }
+
+ /*! Text for copyright paragraph */
+ virtual QCString trCopyright()
+ { return "Copyright"; }
+
+ /*! Header for the graph showing the directory dependencies */
+ virtual QCString trDirDepGraph(const char *name)
+ { return QCString("Katalogberoendegraf för ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Detail level selector shown for hierarchical indices */
+ virtual QCString trDetailLevel()
+ { return "detaljnivå"; }
+
+ /*! Section header for list of template parameters */
+ virtual QCString trTemplateParameters()
+ { return "Mall Parametrar"; }
+
+ /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+ virtual QCString trAndMore(const QCString &number)
+ { return "och "+number+" mera..."; }
+
+ /*! Used file list for a Java enum */
+ virtual QCString trEnumGeneratedFromFiles(bool single)
+ { QCString result = "Dokumentationen för denna enum var genererad från föjlande fil";
+ if (!single) result += "er";
+ result+=":";
+ return result;
+ }
+
+ /*! Header of a Java enum page (Java enums are represented as classes). */
+ virtual QCString trEnumReference(const char *name)
+ { return QCString(name)+" Enum Referens"; }
+
+ /*! Used for a section containing inherited members */
+ virtual QCString trInheritedFrom(const char *members,const char *what)
+ { return QCString(members)+" ärvd ifrån "+what; }
+
+ /*! Header of the sections with inherited members specific for the
+ * base class(es)
+ */
+ virtual QCString trAdditionalInheritedMembers()
+ { return "Ytterliga Ärvda Medlemmar"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a tooltip for the toggle button that appears in the
+ * navigation tree in the HTML output when GENERATE_TREEVIEW is
+ * enabled. This tooltip explains the meaning of the button.
+ */
+ virtual QCString trPanelSynchronisationTooltip(bool enable)
+ {
+ QCString opt = enable ? "aktivera" : "inaktivera";
+ return "klicka för att "+opt+" panel synkronisering";
+ }
+
+ /*! Used in a method of an Objective-C class that is declared in a
+ * a category. Note that the @1 marker is required and is replaced
+ * by a link.
+ */
+ virtual QCString trProvidedByCategory()
+ {
+ return "Tillhandahålls av kategori @1.";
+ }
+
+ /*! Used in a method of an Objective-C category that extends a class.
+ * Note that the @1 marker is required and is replaced by a link to
+ * the class method.
+ */
+ virtual QCString trExtendsClass()
+ {
+ return "Utökar klass @1.";
+ }
+
+ /*! Used as the header of a list of class methods in Objective-C.
+ * These are similar to static public member functions in C++.
+ */
+ virtual QCString trClassMethods()
+ {
+ return "Klassmetoder";
+ }
+
+ /*! Used as the header of a list of instance methods in Objective-C.
+ * These are similar to public member functions in C++.
+ */
+ virtual QCString trInstanceMethods()
+ {
+ return "Instansmetoder";
+ }
+
+ /*! Used as the header of the member functions of an Objective-C class.
+ */
+ virtual QCString trMethodDocumentation()
+ {
+ return "Metoddokumentation";
+ }
+
+ /*! Used as the title of the design overview picture created for the
+ * VHDL output.
+ */
+ virtual QCString trDesignOverview()
+ {
+ return "Designöversikt";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+ /** old style UNO IDL services: implemented interfaces */
+ virtual QCString trInterfaces()
+ { return "Exporterade Interface"; }
+
+ /** old style UNO IDL services: inherited services */
+ virtual QCString trServices()
+ { return "Inkuderade Tjänster"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroups()
+ { return "Konstant Grupper"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroupReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Konstant Grupp Referens";
+ return result;
+ }
+ /** UNO IDL service page title */
+ virtual QCString trServiceReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" Tjänstereferens";
+ return result;
+ }
+ /** UNO IDL singleton page title */
+ virtual QCString trSingletonReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" Singleton Referens";
+ return result;
+ }
+ /** UNO IDL service page */
+ virtual QCString trServiceGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentationen för denna tjänst "
+ "genererades från följande fil";
+ if (single) result+=":"; else result+="er:";
+ return result;
+ }
+ /** UNO IDL singleton page */
+ virtual QCString trSingletonGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentationen för denna singleton"
+ "genererades från följande fil";
+ if (single) result+=":"; else result+="er:";
+ return result;
+ }
/*---------- For internal use: ----------------------------------------*/
protected:
diff --git a/src/translator_tr.h b/src/translator_tr.h
index 2dbfcd8..56b4a19 100644
--- a/src/translator_tr.h
+++ b/src/translator_tr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_tw.h b/src/translator_tw.h
index 86e0a02..581d7fe 100644
--- a/src/translator_tw.h
+++ b/src/translator_tw.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_ua.h b/src/translator_ua.h
index 9c89c40..b7ca86a 100644
--- a/src/translator_ua.h
+++ b/src/translator_ua.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_vi.h b/src/translator_vi.h
index 6657c6b..54c68b8 100644
--- a/src/translator_vi.h
+++ b/src/translator_vi.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_za.h b/src/translator_za.h
index 184eaa9..f47052e 100644
--- a/src/translator_za.h
+++ b/src/translator_za.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/types.h b/src/types.h
index 0c269be..688d664 100644
--- a/src/types.h
+++ b/src/types.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -210,4 +210,11 @@ enum MemberType
MemberType_Service,
};
+enum FortranFormat
+{
+ FortranFormat_Unknown,
+ FortranFormat_Free,
+ FortranFormat_Fixed
+};
+
#endif
diff --git a/src/util.cpp b/src/util.cpp
index 545cd43..fecf632 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1,8 +1,7 @@
/*****************************************************************************
- *
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -61,6 +60,7 @@
#include "filename.h"
#include "membergroup.h"
#include "dirdef.h"
+#include "htmlentity.h"
#define ENABLE_TRACINGSUPPORT 0
@@ -2143,11 +2143,12 @@ QCString argListToString(ArgumentList *al,bool useCanonicalType,bool showDefVals
{
QCString result;
if (al==0) return result;
- Argument *a=al->first();
+ ArgumentListIterator ali(*al);
+ Argument *a=ali.current();
result+="(";
while (a)
{
- QCString type1 = useCanonicalType && !a->canType.isEmpty() ?
+ QCString type1 = useCanonicalType && !a->canType.isEmpty() ?
a->canType : a->type;
QCString type2;
int i=type1.find(")("); // hack to deal with function pointers
@@ -2172,8 +2173,9 @@ QCString argListToString(ArgumentList *al,bool useCanonicalType,bool showDefVals
{
result+="="+a->defval;
}
- a = al->next();
- if (a) result+=", ";
+ ++ali;
+ a = ali.current();
+ if (a) result+=", ";
}
result+=")";
if (al->constSpecifier) result+=" const";
@@ -2188,7 +2190,8 @@ QCString tempArgListToString(ArgumentList *al)
QCString result;
if (al==0) return result;
result="<";
- Argument *a=al->first();
+ ArgumentListIterator ali(*al);
+ Argument *a=ali.current();
while (a)
{
if (!a->name.isEmpty()) // add template argument name
@@ -2216,7 +2219,8 @@ QCString tempArgListToString(ArgumentList *al)
result+=a->type;
}
}
- a=al->next();
+ ++ali;
+ a=ali.current();
if (a) result+=", ";
}
result+=">";
@@ -2486,13 +2490,13 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
int m=maxInheritanceDepth;
if (cd->baseClasses())
{
- BaseClassDef *bcdi = cd->baseClasses()->first();
- while (bcdi)
+ BaseClassListIterator bcli(*cd->baseClasses());
+ BaseClassDef *bcdi;
+ for (;(bcdi=bcli.current());++bcli)
{
int mc=minClassDistance(bcdi->classDef,bcd,level+1);
if (mc<m) m=mc;
if (m<0) break;
- bcdi = cd->baseClasses()->next();
}
}
return m;
@@ -2516,13 +2520,13 @@ Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection p
}
else if (cd->baseClasses())
{
- BaseClassDef *bcdi = cd->baseClasses()->first();
- while (bcdi && prot!=Private)
+ BaseClassListIterator bcli(*cd->baseClasses());
+ BaseClassDef *bcdi;
+ for (;(bcdi=bcli.current()) && prot!=Private;++bcli)
{
Protection baseProt = classInheritedProtectionLevel(bcdi->classDef,bcd,bcdi->prot,level+1);
if (baseProt==Private) prot=Private;
else if (baseProt==Protected) prot=Protected;
- bcdi = cd->baseClasses()->next();
}
}
exit:
@@ -4285,10 +4289,10 @@ bool getDefs(const QCString &scName,
//printf("found %d members\n",members.count());
if (members.count()!=1 && args && !qstrcmp(args,"()"))
{
- // no exact match found, but if args="()" an arbitrary
+ // no exact match found, but if args="()" an arbitrary
// member will do
- md=mn->last();
- while (md /* && md->isLinkable()*/)
+ MemberListIterator mni(*mn);
+ for (mni.toLast();(md=mni.current());--mni)
{
//printf("Found member `%s'\n",md->name().data());
//printf("member is linkable md->name()=`%s'\n",md->name().data());
@@ -4302,7 +4306,6 @@ bool getDefs(const QCString &scName,
{
members.append(md);
}
- md=mn->prev();
}
}
//printf("found %d candidate members\n",members.count());
@@ -4311,23 +4314,22 @@ bool getDefs(const QCString &scName,
if (currentFile)
{
//printf("multiple results; pick one from file:%s\n", currentFile->name().data());
- md = members.first();
- while (md)
+ QListIterator<MemberDef> mit(members);
+ for (mit.toFirst();(md=mit.current());++mit)
{
if (md->getFileDef() && md->getFileDef()->name() == currentFile->name())
{
break; // found match in the current file
}
- md=members.next();
}
if (!md) // member not in the current file
{
- md=members.last();
+ md=members.getLast();
}
- }
- else
+ }
+ else
{
- md=members.last();
+ md=members.getLast();
}
}
if (md && (md->getEnumScope()==0 || !md->getEnumScope()->isStrong()))
@@ -5142,6 +5144,7 @@ bool hasVisibleRoot(BaseClassList *bcl)
QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscore)
{
static bool caseSenseNames = Config_getBool("CASE_SENSE_NAMES");
+ static bool allowUnicodeNames = Config_getBool("ALLOW_UNICODE_NAMES");
static GrowBuf growBuf;
growBuf.clear();
char c;
@@ -5177,15 +5180,57 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor
default:
if (c<0)
{
- static char map[] = "0123456789ABCDEF";
char ids[5];
- unsigned char id = (unsigned char)c;
- ids[0]='_';
- ids[1]='x';
- ids[2]=map[id>>4];
- ids[3]=map[id&0xF];
- ids[4]=0;
- growBuf.addStr(ids);
+ const unsigned char uc = (unsigned char)c;
+ bool doEscape = TRUE;
+ if (allowUnicodeNames && uc <= 0xf7)
+ {
+ const char* pt = p;
+ ids[ 0 ] = c;
+ int l = 0;
+ if ((uc&0xE0)==0xC0)
+ {
+ l=2; // 11xx.xxxx: >=2 byte character
+ }
+ if ((uc&0xF0)==0xE0)
+ {
+ l=3; // 111x.xxxx: >=3 byte character
+ }
+ if ((uc&0xF8)==0xF0)
+ {
+ l=4; // 1111.xxxx: >=4 byte character
+ }
+ doEscape = l==0;
+ for (int m=1; m<l && !doEscape; ++m)
+ {
+ unsigned char ct = (unsigned char)*pt;
+ if (ct==0 || (ct&0xC0)!=0x80) // invalid unicode character
+ {
+ doEscape=TRUE;
+ }
+ else
+ {
+ ids[ m ] = *pt++;
+ }
+ }
+ if ( !doEscape ) // got a valid unicode character
+ {
+ ids[ l ] = 0;
+ growBuf.addStr( ids );
+ p += l - 1;
+ }
+ }
+ if (doEscape) // not a valid unicode char or escaping needed
+ {
+ static char map[] = "0123456789ABCDEF";
+ unsigned char id = (unsigned char)c;
+ ids[0]='_';
+ ids[1]='x';
+ ids[2]=map[id>>4];
+ ids[3]=map[id&0xF];
+ ids[4]=0;
+ growBuf.addStr(ids);
+ }
}
else if (caseSenseNames || !isupper(c))
{
@@ -5632,146 +5677,8 @@ QCString convertToJSString(const char *s)
QCString convertCharEntitiesToUTF8(const QCString &s)
{
- static QDict<char> entityMap(127);
- static bool init=TRUE;
QCString result;
- static QRegExp entityPat("&[a-zA-Z]+;");
-
- if (init)
- {
- entityMap.insert("copy", "\xC2\xA9");
- entityMap.insert("tm", "\xE2\x84\xA2");
- entityMap.insert("trade", "\xE2\x84\xA2");
- entityMap.insert("reg", "\xC2\xAE");
- entityMap.insert("lsquo", "\xE2\x80\x98");
- entityMap.insert("rsquo", "\xE2\x80\x99");
- entityMap.insert("ldquo", "\xE2\x80\x9C");
- entityMap.insert("rdquo", "\xE2\x80\x9D");
- entityMap.insert("ndash", "\xE2\x80\x93");
- entityMap.insert("mdash", "\xE2\x80\x94");
- entityMap.insert("Auml", "\xC3\x84");
- entityMap.insert("Euml", "\xC3\x8B");
- entityMap.insert("Iuml", "\xC3\x8F");
- entityMap.insert("Ouml", "\xC3\x96");
- entityMap.insert("Uuml", "\xC3\x9C");
- entityMap.insert("Yuml", "\xC5\xB8");
- entityMap.insert("auml", "\xC3\xA4");
- entityMap.insert("euml", "\xC3\xAB");
- entityMap.insert("iuml", "\xC3\xAF");
- entityMap.insert("ouml", "\xC3\xB6");
- entityMap.insert("uuml", "\xC3\xBC");
- entityMap.insert("yuml", "\xC3\xBF");
- entityMap.insert("Aacute", "\xC3\x81");
- entityMap.insert("Eacute", "\xC3\x89");
- entityMap.insert("Iacute", "\xC3\x8D");
- entityMap.insert("Oacute", "\xC3\x93");
- entityMap.insert("Uacute", "\xC3\x9A");
- entityMap.insert("aacute", "\xC3\xA1");
- entityMap.insert("eacute", "\xC3\xA9");
- entityMap.insert("iacute", "\xC3\xAD");
- entityMap.insert("oacute", "\xC3\xB3");
- entityMap.insert("uacute", "\xC3\xBA");
- entityMap.insert("Agrave", "\xC3\x80");
- entityMap.insert("Egrave", "\xC3\x88");
- entityMap.insert("Igrave", "\xC3\x8C");
- entityMap.insert("Ograve", "\xC3\x92");
- entityMap.insert("Ugrave", "\xC3\x99");
- entityMap.insert("agrave", "\xC3\xA0");
- entityMap.insert("egrave", "\xC3\xA8");
- entityMap.insert("igrave", "\xC3\xAC");
- entityMap.insert("ograve", "\xC3\xB2");
- entityMap.insert("ugrave", "\xC3\xB9");
- entityMap.insert("Acirc", "\xC3\x82");
- entityMap.insert("Ecirc", "\xC3\x8A");
- entityMap.insert("Icirc", "\xC3\x8E");
- entityMap.insert("Ocirc", "\xC3\x94");
- entityMap.insert("Ucirc", "\xC3\x9B");
- entityMap.insert("acirc", "\xC3\xA2");
- entityMap.insert("ecirc", "\xC3\xAA");
- entityMap.insert("icirc", "\xC3\xAE");
- entityMap.insert("ocirc", "\xC3\xB4");
- entityMap.insert("ucirc", "\xC3\xBB");
- entityMap.insert("Atilde", "\xC3\x83");
- entityMap.insert("Ntilde", "\xC3\x91");
- entityMap.insert("Otilde", "\xC3\x95");
- entityMap.insert("atilde", "\xC3\xA3");
- entityMap.insert("ntilde", "\xC3\xB1");
- entityMap.insert("otilde", "\xC3\xB5");
- entityMap.insert("szlig", "\xC3\x9F");
- entityMap.insert("Ccedil", "\xC3\x87");
- entityMap.insert("ccedil", "\xC3\xA7");
- entityMap.insert("Aring", "\xC3\x85");
- entityMap.insert("aring", "\xC3\xA5");
- entityMap.insert("nbsp", "\xC2\xA0");
- entityMap.insert("Gamma", "\xCE\x93");
- entityMap.insert("Delta", "\xCE\x94");
- entityMap.insert("Theta", "\xCE\x98");
- entityMap.insert("Lambda", "\xCE\x9B");
- entityMap.insert("Xi", "\xCE\x9E");
- entityMap.insert("Pi", "\xCE\xA0");
- entityMap.insert("Sigma", "\xCE\xA3");
- entityMap.insert("Upsilon", "\xCE\xA5");
- entityMap.insert("Phi", "\xCE\xA6");
- entityMap.insert("Psi", "\xCE\xA8");
- entityMap.insert("Omega", "\xCE\xA9");
- entityMap.insert("alpha", "\xCE\xB1");
- entityMap.insert("beta", "\xCE\xB2");
- entityMap.insert("gamma", "\xCE\xB3");
- entityMap.insert("delta", "\xCE\xB4");
- entityMap.insert("epsilon", "\xCE\xB5");
- entityMap.insert("zeta", "\xCE\xB6");
- entityMap.insert("eta", "\xCE\xB8");
- entityMap.insert("theta", "\xCE\xB8");
- entityMap.insert("iota", "\xCE\xB9");
- entityMap.insert("kappa", "\xCE\xBA");
- entityMap.insert("lambda", "\xCE\xBB");
- entityMap.insert("mu", "\xCE\xBC");
- entityMap.insert("nu", "\xCE\xBD");
- entityMap.insert("xi", "\xCE\xBE");
- entityMap.insert("pi", "\xCF\x80");
- entityMap.insert("rho", "\xCF\x81");
- entityMap.insert("sigma", "\xCF\x83");
- entityMap.insert("tau", "\xCF\x84");
- entityMap.insert("upsilon", "\xCF\x85");
- entityMap.insert("phi", "\xCF\x86");
- entityMap.insert("chi", "\xCF\x87");
- entityMap.insert("psi", "\xCF\x88");
- entityMap.insert("omega", "\xCF\x89");
- entityMap.insert("sigmaf", "\xCF\x82");
- entityMap.insert("sect", "\xC2\xA7");
- entityMap.insert("deg", "\xC2\xB0");
- entityMap.insert("prime", "\xE2\x80\xB2");
- entityMap.insert("Prime", "\xE2\x80\xB2");
- entityMap.insert("infin", "\xE2\x88\x9E");
- entityMap.insert("empty", "\xE2\x88\x85");
- entityMap.insert("plusmn", "\xC2\xB1");
- entityMap.insert("times", "\xC3\x97");
- entityMap.insert("minus", "\xE2\x88\x92");
- entityMap.insert("sdot", "\xE2\x8B\x85");
- entityMap.insert("part", "\xE2\x88\x82");
- entityMap.insert("nabla", "\xE2\x88\x87");
- entityMap.insert("radic", "\xE2\x88\x9A");
- entityMap.insert("perp", "\xE2\x8A\xA5");
- entityMap.insert("sum", "\xE2\x88\x91");
- entityMap.insert("int", "\xE2\x88\xAB");
- entityMap.insert("prod", "\xE2\x88\x8F");
- entityMap.insert("sim", "\xE2\x88\xBC");
- entityMap.insert("asymp", "\xE2\x89\x88");
- entityMap.insert("ne", "\xE2\x89\xA0");
- entityMap.insert("equiv", "\xE2\x89\xA1");
- entityMap.insert("prop", "\xE2\x88\x9D");
- entityMap.insert("le", "\xE2\x89\xA4");
- entityMap.insert("ge", "\xE2\x89\xA5");
- entityMap.insert("larr", "\xE2\x86\x90");
- entityMap.insert("rarr", "\xE2\x86\x92");
- entityMap.insert("isin", "\xE2\x88\x88");
- entityMap.insert("notin", "\xE2\x88\x89");
- entityMap.insert("lceil", "\xE2\x8C\x88");
- entityMap.insert("rceil", "\xE2\x8C\x89");
- entityMap.insert("lfloor", "\xE2\x8C\x8A");
- entityMap.insert("rfloor", "\xE2\x8C\x8B");
- init=FALSE;
- }
+ static QRegExp entityPat("&[a-zA-Z]+[0-9]*;");
if (s.length()==0) return result;
static GrowBuf growBuf;
@@ -5779,13 +5686,14 @@ QCString convertCharEntitiesToUTF8(const QCString &s)
int p,i=0,l;
while ((p=entityPat.match(s,i,&l))!=-1)
{
- if (p>i)
+ if (p>i)
{
growBuf.addStr(s.mid(i,p-i));
}
- QCString entity = s.mid(p+1,l-2);
- char *code = entityMap.find(entity);
- if (code)
+ QCString entity = s.mid(p,l);
+ DocSymbol::SymType symType = HtmlEntityMapper::instance()->name2sym(entity);
+ const char *code=0;
+ if (symType!=DocSymbol::Sym_Unknown && (code=HtmlEntityMapper::instance()->utf8(symType)))
{
growBuf.addStr(code);
}
@@ -5829,8 +5737,9 @@ void addMembersToMemberGroup(MemberList *ml,
MemberList *fmdl=md->enumFieldList();
if (fmdl!=0)
{
- MemberDef *fmd=fmdl->first();
- while (fmd)
+ MemberListIterator fmli(*fmdl);
+ MemberDef *fmd;
+ for (fmli.toFirst();(fmd=fmli.current());++fmli)
{
int groupId=fmd->getMemberGroupId();
if (groupId!=-1)
@@ -5861,7 +5770,6 @@ void addMembersToMemberGroup(MemberList *ml,
fmd->setMemberGroup(mg);
}
}
- fmd=fmdl->next();
}
}
}
@@ -6059,15 +5967,16 @@ QCString substituteTemplateArgumentsInString(
result += name.mid(p,i-p);
QCString n = name.mid(i,l);
ArgumentListIterator formAli(*formalArgs);
+ ArgumentListIterator actAli(*actualArgs);
Argument *formArg;
- Argument *actArg=actualArgs->first();
+ Argument *actArg;
// if n is a template argument, then we substitute it
// for its template instance argument.
bool found=FALSE;
for (formAli.toFirst();
- (formArg=formAli.current()) && !found;
- ++formAli,actArg=actualArgs->next()
+ (formArg=formAli.current()) && !found && (actArg=actAli.current());
+ ++formAli,++actAli
)
{
if (formArg->type.left(6)=="class " && formArg->name.isEmpty())
@@ -6371,14 +6280,29 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
{
file=pd->getOutputFileBase();
}
- SectionInfo *si=new SectionInfo(
- file,pd->name(),pd->title(),SectionInfo::Page,0,pd->getReference());
- //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
- // si->label.data(),si->definition?si->definition->name().data():"<none>",
- // si->fileName.data());
- //printf(" SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data());
- //printf("Adding section key=%s si->fileName=%s\n",pageName.data(),si->fileName.data());
- Doxygen::sectionDict->append(pd->name(),si);
+ SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+ if (si)
+ {
+ if (si->lineNr != -1)
+ {
+ warn(file,-1,"multiple use of section label '%s', (first occurrence: %s, line %d)",pd->name().data(),si->fileName.data(),si->lineNr);
+ }
+ else
+ {
+ warn(file,-1,"multiple use of section label '%s', (first occurrence: %s)",pd->name().data(),si->fileName.data());
+ }
+ }
+ else
+ {
+ si=new SectionInfo(
+ file,-1,pd->name(),pd->title(),SectionInfo::Page,0,pd->getReference());
+ //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
+ // si->label.data(),si->definition?si->definition->name().data():"<none>",
+ // si->fileName.data());
+ //printf(" SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data());
+ //printf("Adding section key=%s si->fileName=%s\n",pageName.data(),si->fileName.data());
+ Doxygen::sectionDict->append(pd->name(),si);
+ }
}
}
return pd;
@@ -6481,9 +6405,9 @@ void filterLatexString(FTextStream &t,const char *str,
case '^': t << "$^\\wedge$"; break;
case '&': t << "\\&"; break;
case '*': t << "$\\ast$"; break;
- case '_': if (!insideTabbing) t << "\\-";
+ case '_': if (!insideTabbing) t << "\\+";
t << "\\_";
- if (!insideTabbing) t << "\\-";
+ if (!insideTabbing) t << "\\+";
break;
case '{': t << "\\{"; break;
case '}': t << "\\}"; break;
@@ -6504,14 +6428,9 @@ void filterLatexString(FTextStream &t,const char *str,
break;
case '-': t << "-\\/";
break;
- case '\\': if (*p=='<')
- { t << "$<$"; p++; }
- else if (*p=='>')
- { t << "$>$"; p++; }
- else
- { t << "\\textbackslash{}"; }
+ case '\\': t << "\\textbackslash{}";
break;
- case '"': { t << "\\char`\\\"{}"; }
+ case '"': t << "\\char`\\\"{}";
break;
default:
@@ -6520,7 +6439,7 @@ void filterLatexString(FTextStream &t,const char *str,
((c>='A' && c<='Z' && pc!=' ' && pc!='\0') || (c==':' && pc!=':') || (pc=='.' && isId(c)))
)
{
- t << "\\-";
+ t << "\\+";
}
t << (char)c;
}
@@ -6720,23 +6639,25 @@ static struct Lang2ExtMap
}
g_lang2extMap[] =
{
-// language parser parser option
- { "idl", "c", SrcLangExt_IDL },
- { "java", "c", SrcLangExt_Java },
- { "javascript", "c", SrcLangExt_JS },
- { "csharp", "c", SrcLangExt_CSharp },
- { "d", "c", SrcLangExt_D },
- { "php", "c", SrcLangExt_PHP },
- { "objective-c", "c", SrcLangExt_ObjC },
- { "c", "c", SrcLangExt_Cpp },
- { "c++", "c", SrcLangExt_Cpp },
- { "python", "python", SrcLangExt_Python },
- { "fortran", "fortran", SrcLangExt_Fortran },
- { "vhdl", "vhdl", SrcLangExt_VHDL },
- { "dbusxml", "dbusxml", SrcLangExt_XML },
- { "tcl", "tcl", SrcLangExt_Tcl },
- { "md", "md", SrcLangExt_Markdown },
- { 0, 0, (SrcLangExt)0 }
+// language parser parser option
+ { "idl", "c", SrcLangExt_IDL },
+ { "java", "c", SrcLangExt_Java },
+ { "javascript", "c", SrcLangExt_JS },
+ { "csharp", "c", SrcLangExt_CSharp },
+ { "d", "c", SrcLangExt_D },
+ { "php", "c", SrcLangExt_PHP },
+ { "objective-c", "c", SrcLangExt_ObjC },
+ { "c", "c", SrcLangExt_Cpp },
+ { "c++", "c", SrcLangExt_Cpp },
+ { "python", "python", SrcLangExt_Python },
+ { "fortran", "fortran", SrcLangExt_Fortran },
+ { "fortranfree", "fortranfree", SrcLangExt_Fortran },
+ { "fortranfixed", "fortranfixed", SrcLangExt_Fortran },
+ { "vhdl", "vhdl", SrcLangExt_VHDL },
+ { "dbusxml", "dbusxml", SrcLangExt_XML },
+ { "tcl", "tcl", SrcLangExt_Tcl },
+ { "md", "md", SrcLangExt_Markdown },
+ { 0, 0, (SrcLangExt)0 }
};
bool updateLanguageMapping(const QCString &extension,const QCString &language)
@@ -6919,14 +6840,25 @@ const char *writeUtf8Char(FTextStream &t,const char *s)
t << c;
if (c<0) // multibyte character
{
- t << *s++;
- if (((uchar)c&0xE0)==0xE0)
+ if (((uchar)c&0xE0)==0xC0)
+ {
+ t << *s++; // 11xx.xxxx: >=2 byte character
+ }
+ if (((uchar)c&0xF0)==0xE0)
{
t << *s++; // 111x.xxxx: >=3 byte character
}
- if (((uchar)c&0xF0)==0xF0)
+ if (((uchar)c&0xF8)==0xF0)
+ {
+ t << *s++; // 1111.xxxx: >=4 byte character
+ }
+ if (((uchar)c&0xFC)==0xF8)
{
- t << *s++; // 1111.xxxx: 4 byte character
+ t << *s++; // 1111.1xxx: >=5 byte character
+ }
+ if (((uchar)c&0xFE)==0xFC)
+ {
+ t << *s++; // 1111.1xxx: 6 byte character
}
}
return s;
@@ -6939,14 +6871,25 @@ int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos)
char c = utf8Str[startPos];
if (c<0) // multibyte utf-8 character
{
- bytes++; // 1xxx.xxxx: >=2 byte character
- if (((uchar)c&0xE0)==0xE0)
+ if (((uchar)c&0xE0)==0xC0)
+ {
+ bytes++; // 11xx.xxxx: >=2 byte character
+ }
+ if (((uchar)c&0xF0)==0xE0)
{
bytes++; // 111x.xxxx: >=3 byte character
}
- if (((uchar)c&0xF0)==0xF0)
+ if (((uchar)c&0xF8)==0xF0)
+ {
+ bytes++; // 1111.xxxx: >=4 byte character
+ }
+ if (((uchar)c&0xFC)==0xF8)
{
- bytes++; // 1111.xxxx: 4 byte character
+ bytes++; // 1111.1xxx: >=5 byte character
+ }
+ if (((uchar)c&0xFE)==0xFC)
+ {
+ bytes++; // 1111.1xxx: 6 byte character
}
}
else if (c=='&') // skip over character entities
@@ -7517,9 +7460,14 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList)
{
QStrListIterator it(*patList);
QCString pattern;
+
+ QCString fn = fi.fileName().data();
+ QCString fp = fi.filePath().data();
+ QCString afp= fi.absFilePath().data();
+
for (it.toFirst();(pattern=it.current());++it)
{
- if (!pattern.isEmpty() && !found)
+ if (!pattern.isEmpty())
{
int i=pattern.find('=');
if (i!=-1) pattern=pattern.left(i); // strip of the extension specific filter name
@@ -7529,9 +7477,10 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList)
#else // unix
QRegExp re(pattern,TRUE,TRUE); // case sensitive match
#endif
- found = found || re.match(fi.fileName().data())!=-1 ||
- re.match(fi.filePath().data())!=-1 ||
- re.match(fi.absFilePath().data())!=-1;
+ found = re.match(fn)!=-1 ||
+ re.match(fp)!=-1 ||
+ re.match(afp)!=-1;
+ if (found) break;
//printf("Matching `%s' against pattern `%s' found=%d\n",
// fi->fileName().data(),pattern.data(),found);
}
@@ -8025,7 +7974,7 @@ bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses)
NamespaceDef *cnd;
for (cnli.toFirst();(cnd=cnli.current());++cnli)
{
- if (cnd->isLinkable() && cnd->localName().find('@')==-1)
+ if (cnd->isLinkableInProject() && cnd->localName().find('@')==-1)
{
return TRUE;
}
@@ -8271,3 +8220,4 @@ void convertProtectionLevel(
//printf("convertProtectionLevel(type=%d prot=%d): %d,%d\n",
// inListType,inProt,*outListType1,*outListType2);
}
+
diff --git a/src/util.h b/src/util.h
index a36a769..c131dd0 100644
--- a/src/util.h
+++ b/src/util.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -26,6 +26,7 @@
#include <ctype.h>
#include "types.h"
#include "sortdict.h"
+#include "docparser.h"
//--------------------------------------------------------------------
@@ -95,12 +96,6 @@ class LetterToIndexMap : public SIntDict<T>
{
public:
LetterToIndexMap() { SIntDict<T>::setAutoDelete(TRUE); }
- int compareItems(QCollection::Item item1, QCollection::Item item2)
- {
- T *l1=(T *)item1;
- T *l2=(T *)item2;
- return (int)l1->letter()-(int)l2->letter();
- }
void append(uint letter,typename T::ElementType *elem)
{
T *l = SIntDict<T>::find((int)letter);
@@ -111,6 +106,11 @@ class LetterToIndexMap : public SIntDict<T>
}
l->append(elem);
}
+ private:
+ int compareValues(const T *l1, const T *l2) const
+ {
+ return (int)l1->letter()-(int)l2->letter();
+ }
};
//--------------------------------------------------------------------
@@ -414,6 +414,7 @@ QCString externalRef(const QCString &relPath,const QCString &ref,bool href);
int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos);
const char *writeUtf8Char(FTextStream &t,const char *s);
+
/** Data associated with a HSV colored image. */
struct ColoredImgDataItem
{
diff --git a/src/version.h b/src/version.h
index 9d523c1..b31fe4f 100644
--- a/src/version.h
+++ b/src/version.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/version.py b/src/version.py
index c53303d..003cf95 100755
--- a/src/version.py
+++ b/src/version.py
@@ -9,6 +9,7 @@
# the collected information is written to: `../VERSION` and `../src/version.cpp`
#
import sys
+import os
#
# set 'default' values
#
@@ -46,7 +47,7 @@ mnt = mnt.replace('\n','')
# close files
#
f1 = open('../VERSION','w')
-f2 = open('../src/version.cpp','w')
+f2 = open(os.path.join(sys.argv[1],'version.cpp'),'w')
if (mnt == 'NO'):
f1.write(major + '.' + minor + '.' + revision)
f2.write('char versionString[]="' + major + '.' + minor + '.' + revision + '";')
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
index 94ba3c0..d8586ab 100644
--- a/src/vhdlcode.l
+++ b/src/vhdlcode.l
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -436,9 +436,10 @@ static void setParameterList(MemberDef *md)
{
g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
ArgumentList *al = md->argumentList();
- if (al==0) return;
- Argument *a = al->first();
- while (a)
+ if (al==0) return;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
{
g_parmName = a->name.copy();
g_parmType = a->type.copy();
@@ -449,7 +450,6 @@ static void setParameterList(MemberDef *md)
g_parmType.stripPrefix("const ");
g_parmType=g_parmType.stripWhiteSpace();
// g_theVarContext.addVariable(g_parmType,g_parmName);
- a = al->next();
}
}
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index aa0207a..4ff5f9d 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -167,7 +167,8 @@ static void createSVG()
QRegExp ep("[\\s]");
QCString vlargs="-Tsvg \""+ov+"\" "+dir ;
- if (portable_system("dot",vlargs)!=0)
+ QCString dotExe = Config_getString("DOT_PATH")+"dot";
+ if (portable_system(dotExe,vlargs)!=0)
{
err("could not create dot file");
}
@@ -2221,7 +2222,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
}
bool htmlOn = ol.isEnabled(OutputGenerator::Html);
- if (htmlOn && /*Config_getBool("HTML_ALIGN_MEMBERS") &&*/ !ltype.isEmpty())
+ if (htmlOn && !ltype.isEmpty())
{
ol.disable(OutputGenerator::Html);
}
@@ -2772,7 +2773,6 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
{
- FileName *fn=Doxygen::inputNameList->first();
//LayoutNavEntry *cc = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files);
LayoutNavEntry *kk = lne->parent();// find(LayoutNavEntry::Files);
@@ -2788,17 +2788,22 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
kk->addChild(oo);
}
- while (fn)
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- FileDef *fd=fn->first();
- if (fd->name().contains(".ucf") || fd->name().contains(".qsf"))
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
- file = convertNameToFile(fd->name().data(),FALSE,FALSE);
- LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,"");
- kk->addChild(ucf);
- break;
+ if (fd->name().contains(".ucf") || fd->name().contains(".qsf"))
+ {
+ file = convertNameToFile(fd->name().data(),FALSE,FALSE);
+ LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,"");
+ kk->addChild(ucf);
+ break;
+ }
}
- fn=Doxygen::inputNameList->next();
}
return FALSE;
}
@@ -3880,8 +3885,9 @@ void FlowChart::createSVG()
ov+="/flow_design.dot";
QCString vlargs="-Tsvg "+ov+dir ;
+ QCString dotExe = Config_getString("DOT_PATH")+"dot";
- if (portable_system("dot",vlargs)!=0)
+ if (portable_system(dotExe,vlargs)!=0)
{
err("could not create dot file");
}
diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h
index 7c78373..45ceb06 100644
--- a/src/vhdldocgen.h
+++ b/src/vhdldocgen.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/vhdlparser.y b/src/vhdlparser.y
index 4e4e675..247ac8a 100644
--- a/src/vhdlparser.y
+++ b/src/vhdlparser.y
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -2364,7 +2364,7 @@ static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool i
if(!configL.isEmpty())
{
- VhdlConfNode* vc=configL.last();
+ VhdlConfNode* vc=configL.getLast();
level=vc->level;
if (levelCounter==0)
pushLabel(forL,ent);
diff --git a/src/vhdlscanner.h b/src/vhdlscanner.h
index 1d799d0..9b7c292 100644
--- a/src/vhdlscanner.h
+++ b/src/vhdlscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l
index 716c0c0..a3603c8 100644
--- a/src/vhdlscanner.l
+++ b/src/vhdlscanner.l
@@ -543,7 +543,7 @@ BR [ \t\n\r]
. { /* unknown characters */ }
-<*>{BR}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment
+<*>{B}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment
if (iDocLine==-1) iDocLine=yyLineNr;
QCString qc(vhdlscannerYYtext);
int len=qc.contains('\n')+yyLineNr-1;
@@ -988,7 +988,7 @@ static bool checkMultiComment(QCString& qcs,int line)
qcs.stripPrefix("--!");
while (!pTemp->isEmpty())
{
- Entry *e=(Entry*)pTemp->first();
+ Entry *e=(Entry*)pTemp->getFirst();
e->briefLine=line;
e->brief+=qcs;
iDocLine=-1;
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index 8df1acf..f74a6a2 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -30,6 +30,7 @@
#include "parserintf.h"
#include "filename.h"
#include "config.h"
+#include "htmlentity.h"
XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci)
: DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
@@ -70,110 +71,14 @@ void XmlDocVisitor::visit(DocWhiteSpace *w)
void XmlDocVisitor::visit(DocSymbol *s)
{
if (m_hide) return;
- switch(s->symbol())
+ const char *res = HtmlEntityMapper::instance()->xml(s->symbol());
+ if (res)
{
- case DocSymbol::BSlash: m_t << "\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "&lt;"; break;
- case DocSymbol::Greater: m_t << "&gt;"; break;
- case DocSymbol::Amp: m_t << "&amp;"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::DoubleColon: m_t << "::"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Pipe: m_t << "|"; break;
- case DocSymbol::Copy: m_t << "<copy/>"; break;
- case DocSymbol::Tm: m_t << "<trademark/>"; break;
- case DocSymbol::Reg: m_t << "<registered/>"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Lsquo: m_t << "<lsquo/>"; break;
- case DocSymbol::Rsquo: m_t << "<rsquo/>"; break;
- case DocSymbol::Ldquo: m_t << "<ldquo/>"; break;
- case DocSymbol::Rdquo: m_t << "<rdquo/>"; break;
- case DocSymbol::Ndash: m_t << "<ndash/>"; break;
- case DocSymbol::Mdash: m_t << "<mdash/>"; break;
- case DocSymbol::Uml: m_t << "<umlaut char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Acute: m_t << "<acute char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Grave: m_t << "<grave char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Circ: m_t << "<circ char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Tilde: m_t << "<tilde char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Szlig: m_t << "<szlig/>"; break;
- case DocSymbol::Cedil: m_t << "<cedil char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Ring: m_t << "<ring char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Slash: m_t << "<slash char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Nbsp: m_t << "<nonbreakablespace/>"; break;
- case DocSymbol::Aelig: m_t << "<aelig/>"; break;
- case DocSymbol::AElig: m_t << "<AElig/>"; break;
- case DocSymbol::GrkGamma: m_t << "<Gamma/>"; break;
- case DocSymbol::GrkDelta: m_t << "<Delta/>"; break;
- case DocSymbol::GrkTheta: m_t << "<Theta/>"; break;
- case DocSymbol::GrkLambda: m_t << "<Lambda/>"; break;
- case DocSymbol::GrkXi: m_t << "<Xi/>"; break;
- case DocSymbol::GrkPi: m_t << "<Pi/>"; break;
- case DocSymbol::GrkSigma: m_t << "<Sigma/>"; break;
- case DocSymbol::GrkUpsilon: m_t << "<Upsilon/>"; break;
- case DocSymbol::GrkPhi: m_t << "<Phi/>"; break;
- case DocSymbol::GrkPsi: m_t << "<Psi/>"; break;
- case DocSymbol::GrkOmega: m_t << "<Omega/>"; break;
- case DocSymbol::Grkalpha: m_t << "<alpha/>"; break;
- case DocSymbol::Grkbeta: m_t << "<beta/>"; break;
- case DocSymbol::Grkgamma: m_t << "<gamma/>"; break;
- case DocSymbol::Grkdelta: m_t << "<delta/>"; break;
- case DocSymbol::Grkepsilon: m_t << "<epsilon/>"; break;
- case DocSymbol::Grkzeta: m_t << "<zeta/>"; break;
- case DocSymbol::Grketa: m_t << "<eta/>"; break;
- case DocSymbol::Grktheta: m_t << "<theta/>"; break;
- case DocSymbol::Grkiota: m_t << "<iota/>"; break;
- case DocSymbol::Grkkappa: m_t << "<kappa/>"; break;
- case DocSymbol::Grklambda: m_t << "<lambda/>"; break;
- case DocSymbol::Grkmu: m_t << "<mu/>"; break;
- case DocSymbol::Grknu: m_t << "<nu/>"; break;
- case DocSymbol::Grkxi: m_t << "<xi/>"; break;
- case DocSymbol::Grkpi: m_t << "<pi/>"; break;
- case DocSymbol::Grkrho: m_t << "<rho/>"; break;
- case DocSymbol::Grksigma: m_t << "<sigma/>"; break;
- case DocSymbol::Grktau: m_t << "<tau/>"; break;
- case DocSymbol::Grkupsilon: m_t << "<upsilon/>"; break;
- case DocSymbol::Grkphi: m_t << "<phi/>"; break;
- case DocSymbol::Grkchi: m_t << "<chi/>"; break;
- case DocSymbol::Grkpsi: m_t << "<psi/>"; break;
- case DocSymbol::Grkomega: m_t << "<omega/>"; break;
- case DocSymbol::Grkvarsigma: m_t << "<sigmaf/>"; break;
- case DocSymbol::Section: m_t << "<sect/>"; break;
- case DocSymbol::Degree: m_t << "<deg/>"; break;
- case DocSymbol::Prime: m_t << "<prime/>"; break;
- case DocSymbol::DoublePrime: m_t << "<Prime/>"; break;
- case DocSymbol::Infinity: m_t << "<infin/>"; break;
- case DocSymbol::EmptySet: m_t << "<empty/>"; break;
- case DocSymbol::PlusMinus: m_t << "<plusmn/>"; break;
- case DocSymbol::Times: m_t << "<times/>"; break;
- case DocSymbol::Minus: m_t << "<minus/>"; break;
- case DocSymbol::CenterDot: m_t << "<sdot/>"; break;
- case DocSymbol::Partial: m_t << "<part/>"; break;
- case DocSymbol::Nabla: m_t << "<nabla/>"; break;
- case DocSymbol::SquareRoot: m_t << "<radic/>"; break;
- case DocSymbol::Perpendicular: m_t << "<perp/>"; break;
- case DocSymbol::Sum: m_t << "<sum/>"; break;
- case DocSymbol::Integral: m_t << "<int/>"; break;
- case DocSymbol::Product: m_t << "<prod/>"; break;
- case DocSymbol::Similar: m_t << "<sim/>"; break;
- case DocSymbol::Approx: m_t << "<asymp/>"; break;
- case DocSymbol::NotEqual: m_t << "<ne/>"; break;
- case DocSymbol::Equivalent: m_t << "<equiv/>"; break;
- case DocSymbol::Proportional: m_t << "<prop/>"; break;
- case DocSymbol::LessEqual: m_t << "<le/>"; break;
- case DocSymbol::GreaterEqual: m_t << "<ge/>"; break;
- case DocSymbol::LeftArrow: m_t << "<larr/>"; break;
- case DocSymbol::RightArrow: m_t << "<rarr/>"; break;
- case DocSymbol::SetIn: m_t << "<isin/>"; break;
- case DocSymbol::SetNotIn: m_t << "<notin/>"; break;
- case DocSymbol::LeftCeil: m_t << "<lceil/>"; break;
- case DocSymbol::RightCeil: m_t << "<rceil/>"; break;
- case DocSymbol::LeftFloor: m_t << "<lfloor/>"; break;
- case DocSymbol::RightFloor: m_t << "<rfloor/>"; break;
- default:
- err("unknown symbol found\n");
+ m_t << res;
+ }
+ else
+ {
+ err("XML: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
}
}
@@ -350,6 +255,11 @@ void XmlDocVisitor::visit(DocInclude *inc)
filter(inc->text());
m_t << "</htmlonly>";
break;
+ case DocInclude::LatexInclude:
+ m_t << "<latexonly>";
+ filter(inc->text());
+ m_t << "</latexonly>";
+ break;
case DocInclude::VerbInclude:
m_t << "<verbatim>";
filter(inc->text());
@@ -427,9 +337,13 @@ void XmlDocVisitor::visit(DocIndexEntry *ie)
"</indexentry>";
}
-void XmlDocVisitor::visit(DocSimpleSectSep *)
+void XmlDocVisitor::visit(DocSimpleSectSep *sep)
{
- m_t << "<simplesectsep/>";
+ if (sep->parent() && sep->parent()->kind()==DocNode::Kind_SimpleSect)
+ {
+ visitPost((DocSimpleSect*)sep->parent()); // end current section
+ visitPre((DocSimpleSect*)sep->parent()); // start new section
+ }
}
void XmlDocVisitor::visit(DocCite *cite)
diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h
index 6dc189c..3e2236c 100644
--- a/src/xmldocvisitor.h
+++ b/src/xmldocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 570901f..efddcd4 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -45,6 +45,7 @@
#include "membergroup.h"
#include "dirdef.h"
#include "section.h"
+#include "htmlentity.h"
// no debug info
#define XML_DB(x) do {} while(0)
@@ -1844,7 +1845,7 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
SectionInfo *si = Doxygen::sectionDict->find(pd->name());
if (si)
{
- t << " <title>" << convertToXML(convertCharEntitiesToUTF8(si->title))
+ t << " <title>" << convertToXML(convertCharEntitiesToUTF8(filterTitle(si->title)))
<< "</title>" << endl;
}
}
@@ -1897,7 +1898,32 @@ void generateXML()
err("Cannot open file %s for writing!\n",fileName.data());
return;
}
- f.writeBlock(compound_xsd,qstrlen(compound_xsd));
+
+ // write compound.xsd, but replace special marker with the entities
+ const char *startLine = compound_xsd;
+ while (*startLine)
+ {
+ // find end of the line
+ const char *endLine = startLine+1;
+ while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
+ int len=endLine-startLine;
+ if (len>0)
+ {
+ QCString s(len+1);
+ qstrncpy(s.data(),startLine,len);
+ s[len]='\0';
+ if (s.find("<!-- Automatically insert here the HTML entities -->")!=-1)
+ {
+ FTextStream t(&f);
+ HtmlEntityMapper::instance()->writeXMLSchema(t);
+ }
+ else
+ {
+ f.writeBlock(startLine,len);
+ }
+ }
+ startLine=endLine;
+ }
f.close();
fileName=outputDirectory+"/index.xml";
diff --git a/src/xmlgen.h b/src/xmlgen.h
index b89b10f..9c9ae17 100644
--- a/src/xmlgen.h
+++ b/src/xmlgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby