summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cite.cpp4
-rw-r--r--src/classdef.cpp3
-rw-r--r--src/classlist.cpp13
-rw-r--r--src/code.l156
-rw-r--r--src/commentscan.l4
-rw-r--r--src/config.xml14
-rwxr-xr-xsrc/configgen.py328
-rw-r--r--src/context.cpp42
-rw-r--r--src/definition.cpp16
-rw-r--r--src/docbookgen.cpp155
-rw-r--r--src/docbookvisitor.cpp121
-rw-r--r--src/docparser.cpp15
-rw-r--r--src/docparser.h2
-rw-r--r--src/doctokenizer.l4
-rw-r--r--src/dot.cpp209
-rw-r--r--src/dot.h16
-rw-r--r--src/doxygen.cpp24
-rw-r--r--src/entry.h4
-rw-r--r--src/filedef.cpp8
-rw-r--r--src/fortrancode.l63
-rw-r--r--src/htmldocvisitor.cpp2
-rw-r--r--src/htmlgen.cpp10
-rw-r--r--src/lang_cfg.py6
-rwxr-xr-xsrc/languages.py12
-rw-r--r--src/latexdocvisitor.cpp2
-rw-r--r--src/latexgen.cpp16
-rw-r--r--src/memberdef.cpp52
-rw-r--r--src/memberdef.h4
-rw-r--r--src/portable_c.c6
-rw-r--r--src/pre.l5
-rw-r--r--src/printdocvisitor.h7
-rw-r--r--src/rtfdocvisitor.cpp2
-rw-r--r--src/rtfgen.cpp8
-rw-r--r--src/scanner.l16
-rw-r--r--src/tclscanner.l552
-rw-r--r--src/util.cpp5
-rw-r--r--src/xmldocvisitor.cpp7
-rw-r--r--src/xmlgen.cpp16
38 files changed, 1323 insertions, 606 deletions
diff --git a/src/cite.cpp b/src/cite.cpp
index a3056ba..f0580ed 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -58,6 +58,10 @@ static QCString getListOfBibFiles(const QCString &sep,bool namesOnly)
{
bibFile = bibFile.left(bibFile.length()-4);
}
+ else
+ {
+ if (!namesOnly && bibFile.right(4)!=".bib") bibFile += ".bib";
+ }
if ((i=bibFile.findRev('/'))!=-1) // strip path
{
bibFile = bibFile.mid(i+1);
diff --git a/src/classdef.cpp b/src/classdef.cpp
index eded587..cef4720 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -3413,8 +3413,7 @@ QCString ClassDef::getOutputFileBase() const
{
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)
+ if (!Doxygen::generatingXmlOutput)
{
Definition *scope=0;
if (inlineGroupedClasses && partOfGroups()!=0)
diff --git a/src/classlist.cpp b/src/classlist.cpp
index 5751356..6615a99 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -24,6 +24,7 @@
#include "vhdldocgen.h"
#include "defargs.h"
#include "arguments.h"
+#include "groupdef.h"
ClassList::ClassList() : QList<ClassDef>()
{
@@ -131,21 +132,17 @@ void ClassSDict::writeDocumentation(OutputList &ol,Definition * container)
ClassDef *cd=0;
for (sdi.toFirst();(cd=sdi.current());++sdi)
{
- //printf("%s:writeDocumentation() %p embedded=%d container=%p\n",
- // cd->name().data(),cd->getOuterScope(),cd->isEmbeddedInOuterScope(),
- // container);
+ //printf("%s:writeDocumentation() %p linkable=%d embedded=%d container=%p partOfGroups=%d\n",
+ // cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(),
+ // container,cd->partOfGroups() ? cd->partOfGroups()->count() : 0);
if (cd->name().find('@')==-1 &&
cd->isLinkableInProject() &&
cd->isEmbeddedInOuterScope() &&
(container==0 || cd->partOfGroups()==0) // if container==0 -> show as part of the group docs, otherwise only show if not part of a group
- //&&
- //(container==0 || // no container -> used for groups
- // cd->getOuterScope()==container || // correct container -> used for namespaces and classes
- // (container->definitionType()==Definition::TypeFile && cd->getOuterScope()==Doxygen::globalScope && cd->partOfGroups()==0) // non grouped class with file scope -> used for files
- //)
)
{
+ //printf(" showing class %s\n",cd->name().data());
if (!found)
{
ol.writeRuler();
diff --git a/src/code.l b/src/code.l
index 0d23553..d96067e 100644
--- a/src/code.l
+++ b/src/code.l
@@ -329,44 +329,44 @@ class CallContext
public:
struct Ctx
{
- Ctx() : name(g_name), type(g_type), cd(0) {}
+ Ctx() : name(g_name), type(g_type), d(0) {}
QCString name;
QCString type;
- ClassDef *cd;
+ Definition *d;
};
CallContext()
{
- m_classList.append(new Ctx);
- m_classList.setAutoDelete(TRUE);
+ m_defList.append(new Ctx);
+ m_defList.setAutoDelete(TRUE);
}
virtual ~CallContext() {}
- void setClass(ClassDef *cd)
+ void setScope(Definition *d)
{
- Ctx *ctx = m_classList.getLast();
+ Ctx *ctx = m_defList.getLast();
if (ctx)
{
- DBG_CTX((stderr,"** Set call context %s (%p)\n",cd==0 ? "<null>" : cd->name().data(),cd));
- ctx->cd=cd;
+ DBG_CTX((stderr,"** Set call context %s (%p)\n",d==0 ? "<null>" : d->name().data(),d));
+ ctx->d=d;
}
}
void pushScope()
{
- m_classList.append(new Ctx);
- DBG_CTX((stderr,"** Push call context %d\n",m_classList.count()));
+ m_defList.append(new Ctx);
+ DBG_CTX((stderr,"** Push call context %d\n",m_defList.count()));
}
void popScope()
{
- if (m_classList.count()>1)
+ if (m_defList.count()>1)
{
- DBG_CTX((stderr,"** Pop call context %d\n",m_classList.count()));
- Ctx *ctx = m_classList.getLast();
+ DBG_CTX((stderr,"** Pop call context %d\n",m_defList.count()));
+ Ctx *ctx = m_defList.getLast();
if (ctx)
{
g_name = ctx->name;
g_type = ctx->type;
}
- m_classList.removeLast();
+ m_defList.removeLast();
}
else
{
@@ -376,17 +376,17 @@ class CallContext
void clear()
{
DBG_CTX((stderr,"** Clear call context\n"));
- m_classList.clear();
- m_classList.append(new Ctx);
+ m_defList.clear();
+ m_defList.append(new Ctx);
}
- ClassDef *getClass() const
+ Definition *getScope() const
{
- Ctx *ctx = m_classList.getLast();
- if (ctx) return ctx->cd; else return 0;
+ Ctx *ctx = m_defList.getLast();
+ if (ctx) return ctx->d; else return 0;
}
private:
- QList<Ctx> m_classList;
+ QList<Ctx> m_defList;
};
static CallContext g_theCallContext;
@@ -732,7 +732,7 @@ static MemberDef *setCallContextForVar(const QCString &name)
if (md)
{
//printf("name=%s scope=%s\n",locName.data(),scope.data());
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
+ g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
return md;
}
}
@@ -745,7 +745,7 @@ static MemberDef *setCallContextForVar(const QCString &name)
if (md)
{
//printf("name=%s scope=%s\n",locName.data(),scope.data());
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
+ g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
return md;
}
}
@@ -760,7 +760,7 @@ static MemberDef *setCallContextForVar(const QCString &name)
if (mcd!=VariableContext::dummyContext)
{
DBG_CTX((stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data()));
- g_theCallContext.setClass(mcd);
+ g_theCallContext.setScope(mcd);
}
}
else
@@ -778,7 +778,7 @@ static MemberDef *setCallContextForVar(const QCString &name)
if (g_scopeStack.top()!=CLASSBLOCK)
{
DBG_CTX((stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data()));
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
+ g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
}
return md;
}
@@ -794,7 +794,7 @@ static MemberDef *setCallContextForVar(const QCString &name)
MemberDef *md=mn->getFirst();
if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
{
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
+ g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
return md;
}
return 0;
@@ -816,7 +816,7 @@ static MemberDef *setCallContextForVar(const QCString &name)
(g_forceTagReference.isEmpty() || g_forceTagReference==md->getReference())
)
{
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
+ g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
//printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
return md;
}
@@ -829,15 +829,15 @@ static MemberDef *setCallContextForVar(const QCString &name)
static void updateCallContextForSmartPointer()
{
- ClassDef *cd = g_theCallContext.getClass();
- //printf("updateCallContextForSmartPointer() cd=%s\n",cd ? cd->name().data() : "<none>");
+ Definition *d = g_theCallContext.getScope();
+ //printf("updateCallContextForSmartPointer() cd=%s\n",cd ? d->name().data() : "<none>");
MemberDef *md;
- if (cd && (md=cd->isSmartPointer()))
+ if (d && d->definitionType()==Definition::TypeClass && (md=((ClassDef*)d)->isSmartPointer()))
{
ClassDef *ncd = stripClassName(md->typeString(),md->getOuterScope());
if (ncd)
{
- g_theCallContext.setClass(ncd);
+ g_theCallContext.setScope(ncd);
//printf("Found smart pointer call %s->%s!\n",cd->name().data(),ncd->name().data());
}
}
@@ -879,7 +879,7 @@ static bool getLinkInScope(const QCString &c, // scope
if (md->getGroupDef()) d = md->getGroupDef();
if (d && d->isLinkable())
{
- g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
+ g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
//printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
// g_currentDefinition,g_currentMemberDef,g_insideBody);
@@ -965,8 +965,18 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version
}
}
+ NamespaceDef *nd = getResolvedNamespace(className);
+ if (nd)
+ {
+ g_theCallContext.setScope(nd);
+ addToSearchIndex(className);
+ writeMultiLineCodeLink(*g_code,nd,clName);
+ return;
+ }
//printf("md=%s\n",md?md->name().data():"<none>");
- DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"));
+ DBG_CTX((stderr,"is found as a type cd=%s nd=%s\n",
+ cd?cd->name().data():"<null>",
+ nd?nd->name().data():"<null>"));
if (cd==0 && md==0) // also see if it is variable or enum or enum value
{
if (getLink(g_classScope,clName,ol,clName,varOnly))
@@ -981,7 +991,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
if (lcd!=VariableContext::dummyContext)
{
//printf("non-dummy context lcd=%s!\n",lcd->name().data());
- g_theCallContext.setClass(lcd);
+ g_theCallContext.setScope(lcd);
// to following is needed for links to a global variable, but is
// no good for a link to a local variable that is also a global symbol.
@@ -1011,7 +1021,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
}
writeMultiLineCodeLink(ol,cd,clName);
addToSearchIndex(className);
- g_theCallContext.setClass(cd);
+ g_theCallContext.setScope(cd);
if (md)
{
Definition *d = md->getOuterScope()==Doxygen::globalScope ?
@@ -1111,7 +1121,7 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const
ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope());
DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass));
- g_theCallContext.setClass(typeClass);
+ g_theCallContext.setScope(typeClass);
Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
xmd->getFileDef() : xmd->getOuterScope();
@@ -1142,18 +1152,42 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const
return FALSE;
}
-static bool generateClassMemberLink(CodeOutputInterface &ol,ClassDef *mcd,const char *memName)
+static bool generateClassMemberLink(CodeOutputInterface &ol,Definition *def,const char *memName)
{
- if (mcd)
+ if (def && def->definitionType()==Definition::TypeClass)
{
- MemberDef *xmd = mcd->getMemberByName(memName);
- //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",mcd->name().data(),memName,xmd);
+ ClassDef *cd = (ClassDef*)def;
+ MemberDef *xmd = cd->getMemberByName(memName);
+ //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",def->name().data(),memName,xmd);
if (xmd)
{
return generateClassMemberLink(ol,xmd,memName);
}
+ else
+ {
+ Definition *innerDef = cd->findInnerCompound(memName);
+ if (innerDef)
+ {
+ g_theCallContext.setScope(innerDef);
+ addToSearchIndex(memName);
+ writeMultiLineCodeLink(*g_code,innerDef,memName);
+ return TRUE;
+ }
+ }
+ }
+ else if (def && def->definitionType()==Definition::TypeNamespace)
+ {
+ NamespaceDef *nd = (NamespaceDef*)def;
+ //printf("Looking for %s inside namespace %s\n",memName,nd->name().data());
+ Definition *innerDef = nd->findInnerCompound(memName);
+ if (innerDef)
+ {
+ g_theCallContext.setScope(innerDef);
+ addToSearchIndex(memName);
+ writeMultiLineCodeLink(*g_code,innerDef,memName);
+ return TRUE;
+ }
}
-
return FALSE;
}
@@ -1743,9 +1777,7 @@ B [ \t]
BN [ \t\n\r]
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
SEP ("::"|"\\")
-SEPCS (".")
SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
-SCOPENAMECS ({SEPCS}{BN}*)?({ID}{BN}*{SEPCS}{BN}*)*("~"{BN}*)?{ID}
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
@@ -2490,20 +2522,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
generateClassOrGlobalLink(*g_code,yytext);
g_name+=yytext;
}
-<Body>{SCOPENAMECS}/{BN}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro"
- if (!g_insideCS && !g_insideJava)
- {
- REJECT;
- }
- else
- {
- addType();
- // changed this to generateFunctionLink, see bug 624514
- //generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE);
- generateFunctionLink(*g_code,yytext);
- g_name+=yytext;
- }
- }
<Body>{SCOPENAME}/{BN}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro"
addType();
// changed this to generateFunctionLink, see bug 624514
@@ -2511,18 +2529,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
generateFunctionLink(*g_code,yytext);
g_name+=yytext;
}
-<Body>{SCOPENAMECS}/{B}* { // p->func()
- if (!g_insideCS && !g_insideJava)
- {
- REJECT;
- }
- else
- {
- addType();
- generateClassOrGlobalLink(*g_code,yytext);
- g_name+=yytext;
- }
- }
<Body>{SCOPENAME}/{B}* { // p->func()
addType();
generateClassOrGlobalLink(*g_code,yytext);
@@ -2657,9 +2663,9 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN( MemberCall );
}
<MemberCall>{SCOPETNAME}/{BN}*"(" {
- if (g_theCallContext.getClass())
+ if (g_theCallContext.getScope())
{
- if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext))
{
g_code->codify(yytext);
addToSearchIndex(yytext);
@@ -2684,10 +2690,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
}
<MemberCall>{SCOPENAME}/{B}* {
- if (g_theCallContext.getClass())
+ if (g_theCallContext.getScope())
{
- DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass()));
- if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
+ DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getScope()));
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext))
{
g_code->codify(yytext);
addToSearchIndex(yytext);
@@ -2733,7 +2739,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
if (*yytext!='[' && !g_type.isEmpty())
{
//printf("g_scopeStack.bottom()=%p\n",g_scopeStack.bottom());
- if (g_scopeStack.top()!=CLASSBLOCK)
+ //if (g_scopeStack.top()!=CLASSBLOCK) // commented out for bug731363
{
//printf("AddVariable: '%s' '%s' context=%d\n",
// g_type.data(),g_name.data(),g_theVarContext.count());
@@ -3008,7 +3014,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_theVarContext.addVariable(g_type,g_name);
}
g_parmType.resize(0);g_parmName.resize(0);
- g_theCallContext.setClass(0);
+ g_theCallContext.setScope(0);
if (*yytext==';' || g_insideBody)
{
if (!g_insideBody)
diff --git a/src/commentscan.l b/src/commentscan.l
index bd20bf0..a42f6ce 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -914,7 +914,9 @@ FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
-CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]*
+CITESCHAR [a-z_A-Z\x80-\xFF]
+CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]*
+CITEID {CITESCHAR}*{CITEECHAR}+("."{CITESCHAR}*{CITEECHAR}+)*
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID})
TMPLSPEC "<"{BN}*[^>]+{BN}*">"
diff --git a/src/config.xml b/src/config.xml
index 349c41c..eed486e 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -2553,7 +2553,7 @@ EXTRA_PACKAGES=times
<option type='bool' id='USE_PDFLATEX' defval='1' depends='GENERATE_LATEX'>
<docs>
<![CDATA[
- If the \c LATEX_PDFLATEX tag is set to \c YES, doxygen will use
+ If the \c USE_PDFLATEX tag is set to \c YES, doxygen will use
\c pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
files. Set this option to \c YES to get a higher quality PDF documentation.
]]>
@@ -2763,6 +2763,16 @@ front of it.
]]>
</docs>
</option>
+ <option type='bool' id='DOCBOOK_PROGRAMLISTING' defval='0' depends='GENERATE_DOCBOOK'>
+ <docs>
+<![CDATA[
+ If the \c DOCBOOK_PROGRAMLISTING tag is set to \c YES doxygen will
+ include the program listings (including syntax highlighting
+ and cross-referencing information) to the DOCBOOK output. Note that
+ enabling this will significantly increase the size of the DOCBOOK output.
+]]>
+ </docs>
+ </option>
</group>
<group name='AutoGen' docs='Configuration options for the AutoGen Definitions output'>
<option type='bool' id='GENERATE_AUTOGEN_DEF' defval='0'>
@@ -3076,7 +3086,7 @@ to be found in the default search path.
<option type='string' id='DOT_FONTNAME' format='string' defval='Helvetica' depends='HAVE_DOT'>
<docs>
<![CDATA[
- When you want a differently looking font n the dot files that doxygen generates
+ When you want a differently looking font in the dot files that doxygen generates
you can specify the font name
using \c DOT_FONTNAME. You need to make sure dot is able to find the font,
which can be done by putting it in a standard location or by setting the
diff --git a/src/configgen.py b/src/configgen.py
index 8ec0caa..04ffc8c 100755
--- a/src/configgen.py
+++ b/src/configgen.py
@@ -18,7 +18,6 @@ import re
import textwrap
from xml.dom import minidom, Node
-
def transformDocs(doc):
# join lines, unless it is an empty line
# remove doxygen layout constructs
@@ -112,7 +111,7 @@ def addValues(var, node):
if (n.nodeName == "value"):
if n.nodeType == Node.ELEMENT_NODE:
name = n.getAttribute('name')
- print " %s->addValue(\"%s\");" % (var, name)
+ print(" %s->addValue(\"%s\");" % (var, name))
def parseHeader(node,objName):
@@ -123,15 +122,15 @@ def parseHeader(node,objName):
if (n.getAttribute('doxyfile') != "0"):
doc += parseDocs(n)
docC = transformDocs(doc)
- print " %s->setHeader(" % (objName)
+ print(" %s->setHeader(" % (objName))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
def prepCDocs(node):
@@ -201,7 +200,7 @@ def prepCDocs(node):
else:
if abspath == '1':
doc += "<br/>The file has to be specified with full path."
- elif file =='image':
+ elif format =='image':
abspath = node.getAttribute('abspath')
if defval != '':
if abspath != '1':
@@ -238,8 +237,8 @@ def parseOption(node):
setting = node.getAttribute('setting')
docC = prepCDocs(node);
if len(setting) > 0:
- print "#if %s" % (setting)
- print " //----"
+ print("#if %s" % (setting))
+ print(" //----")
if type == 'bool':
if len(adefval) > 0:
enabled = adefval
@@ -247,108 +246,108 @@ def parseOption(node):
enabled = "TRUE"
else:
enabled = "FALSE"
- print " cb = cfg->addBool("
- print " \"%s\"," % (name)
+ print(" cb = cfg->addBool(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"," % (line)
- print " %s" % (enabled)
- print " );"
+ print(" \"%s\"," % (line))
+ print(" %s" % (enabled))
+ print(" );")
if depends != '':
- print " cb->addDependency(\"%s\");" % (depends)
+ print(" cb->addDependency(\"%s\");" % (depends))
elif type == 'string':
- print " cs = cfg->addString("
- print " \"%s\"," % (name)
+ print(" cs = cfg->addString(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
if defval != '':
- print " cs->setDefaultValue(\"%s\");" % (defval)
+ print(" cs->setDefaultValue(\"%s\");" % (defval))
if format == 'file':
- print " cs->setWidgetType(ConfigString::File);"
+ print(" cs->setWidgetType(ConfigString::File);")
elif format == 'image':
- print " cs->setWidgetType(ConfigString::Image);"
+ print(" cs->setWidgetType(ConfigString::Image);")
elif format == 'dir':
- print " cs->setWidgetType(ConfigString::Dir);"
+ print(" cs->setWidgetType(ConfigString::Dir);")
if depends != '':
- print " cs->addDependency(\"%s\");" % (depends)
+ print(" cs->addDependency(\"%s\");" % (depends))
elif type == 'enum':
- print " ce = cfg->addEnum("
- print " \"%s\"," % (name)
+ print(" ce = cfg->addEnum(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"," % (line)
- print " \"%s\"" % (defval)
- print " );"
+ print(" \"%s\"," % (line))
+ print(" \"%s\"" % (defval))
+ print(" );")
addValues("ce", node)
if depends != '':
- print " ce->addDependency(\"%s\");" % (depends)
+ print(" ce->addDependency(\"%s\");" % (depends))
elif type == 'int':
minval = node.getAttribute('minval')
maxval = node.getAttribute('maxval')
- print " ci = cfg->addInt("
- print " \"%s\"," % (name)
+ print(" ci = cfg->addInt(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"," % (line)
- print " %s,%s,%s" % (minval, maxval, defval)
- print " );"
+ print(" \"%s\"," % (line))
+ print(" %s,%s,%s" % (minval, maxval, defval))
+ print(" );")
if depends != '':
- print " ci->addDependency(\"%s\");" % (depends)
+ print(" ci->addDependency(\"%s\");" % (depends))
elif type == 'list':
- print " cl = cfg->addList("
- print " \"%s\"," % (name)
+ print(" cl = cfg->addList(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
addValues("cl", node)
if depends != '':
- print " cl->addDependency(\"%s\");" % (depends)
+ print(" cl->addDependency(\"%s\");" % (depends))
if format == 'file':
- print " cl->setWidgetType(ConfigList::File);"
+ print(" cl->setWidgetType(ConfigList::File);")
elif format == 'dir':
- print " cl->setWidgetType(ConfigList::Dir);"
+ print(" cl->setWidgetType(ConfigList::Dir);")
elif format == 'filedir':
- print " cl->setWidgetType(ConfigList::FileAndDir);"
+ print(" cl->setWidgetType(ConfigList::FileAndDir);")
elif type == 'obsolete':
- print " cfg->addObsolete(\"%s\");" % (name)
+ print(" cfg->addObsolete(\"%s\");" % (name))
if len(setting) > 0:
- print "#else"
- print " cfg->addDisabled(\"%s\");" % (name)
- print "#endif"
+ print("#else")
+ print(" cfg->addDisabled(\"%s\");" % (name))
+ print("#endif")
def parseGroups(node):
name = node.getAttribute('name')
doc = node.getAttribute('docs')
- print "%s%s" % (" //-----------------------------------------",
- "----------------------------------")
- print " cfg->addInfo(\"%s\",\"%s\");" % (name, doc)
- print "%s%s" % (" //-----------------------------------------",
- "----------------------------------")
- print
+ print("%s%s" % (" //-----------------------------------------",
+ "----------------------------------"))
+ print(" cfg->addInfo(\"%s\",\"%s\");" % (name, doc))
+ print("%s%s" % (" //-----------------------------------------",
+ "----------------------------------"))
+ print("")
for n in node.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
parseOption(n)
@@ -360,16 +359,16 @@ def parseGroupCDocs(node):
name = n.getAttribute('id')
docC = prepCDocs(n);
if type != 'obsolete':
- print " doc->add("
- print " \"%s\"," % (name)
+ print(" doc->add(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
def parseOptionDoc(node, first):
# Handling part for documentation
@@ -388,52 +387,52 @@ def parseOptionDoc(node, first):
if n.nodeType == Node.ELEMENT_NODE:
doc += parseDocs(n)
if (first):
- print " \\anchor cfg_%s" % (name.lower())
- print "<dl>"
- print ""
- print "<dt>\\c %s <dd>" % (name)
+ print(" \\anchor cfg_%s" % (name.lower()))
+ print("<dl>")
+ print("")
+ print("<dt>\\c %s <dd>" % (name))
else:
- print " \\anchor cfg_%s" % (name.lower())
- print "<dt>\\c %s <dd>" % (name)
- print " \\addindex %s" % (name)
- print doc
+ print(" \\anchor cfg_%s" % (name.lower()))
+ print("<dt>\\c %s <dd>" % (name))
+ print(" \\addindex %s" % (name))
+ print(doc)
if (type == 'enum'):
values = collectValues(node)
- print ""
- print "Possible values are: "
+ print("")
+ print("Possible values are: ")
rng = len(values)
for i in range(rng):
val = values[i]
if i == rng - 2:
- print "%s and " % (val)
+ print("%s and " % (val))
elif i == rng - 1:
- print "%s." % (val)
+ print("%s." % (val))
else:
- print "%s, " % (val)
+ print("%s, " % (val))
if (defval != ""):
- print ""
- print ""
- print "The default value is: <code>%s</code>." % (defval)
- print ""
+ print("")
+ print("")
+ print("The default value is: <code>%s</code>." % (defval))
+ print("")
elif (type == 'int'):
minval = node.getAttribute('minval')
maxval = node.getAttribute('maxval')
- print ""
- print ""
- print "%s: %s%s%s, %s: %s%s%s, %s: %s%s%s." % (
+ print("")
+ print("")
+ print("%s: %s%s%s, %s: %s%s%s, %s: %s%s%s." % (
" Minimum value", "<code>", minval, "</code>",
"maximum value", "<code>", maxval, "</code>",
- "default value", "<code>", defval, "</code>")
- print ""
+ "default value", "<code>", defval, "</code>"))
+ print("")
elif (type == 'bool'):
- print ""
- print ""
+ print("")
+ print("")
if (node.hasAttribute('altdefval')):
- print "The default value is: system dependent."
+ print("The default value is: system dependent.")
else:
- print "The default value is: <code>%s</code>." % (
- "YES" if (defval == "1") else "NO")
- print ""
+ print("The default value is: <code>%s</code>." % (
+ "YES" if (defval == "1") else "NO"))
+ print("")
elif (type == 'list'):
if format == 'string':
values = collectValues(node)
@@ -441,67 +440,67 @@ def parseOptionDoc(node, first):
for i in range(rng):
val = values[i]
if i == rng - 2:
- print "%s and " % (val)
+ print("%s and " % (val))
elif i == rng - 1:
- print "%s." % (val)
+ print("%s." % (val))
else:
- print "%s, " % (val)
- print ""
+ print("%s, " % (val))
+ print("")
elif (type == 'string'):
if format == 'dir':
if defval != '':
- print ""
- print "The default directory is: <code>%s</code>." % (
- defval)
+ print("")
+ print("The default directory is: <code>%s</code>." % (
+ defval))
elif format == 'file':
abspath = node.getAttribute('abspath')
if defval != '':
- print ""
+ print("")
if abspath != '1':
- print "The default file is: <code>%s</code>." % (
- defval)
+ print("The default file is: <code>%s</code>." % (
+ defval))
else:
- print "%s: %s%s%s." % (
+ print("%s: %s%s%s." % (
"The default file (with absolute path) is",
- "<code>",defval,"</code>")
+ "<code>",defval,"</code>"))
else:
if abspath == '1':
- print ""
- print "The file has to be specified with full path."
- elif file =='image':
+ print("")
+ print("The file has to be specified with full path.")
+ elif format =='image':
abspath = node.getAttribute('abspath')
if defval != '':
- print ""
+ print("")
if abspath != '1':
- print "The default image is: <code>%s</code>." % (
- defval)
+ print("The default image is: <code>%s</code>." % (
+ defval))
else:
- print "%s: %s%s%s." % (
+ print("%s: %s%s%s." % (
"The default image (with absolute path) is",
- "<code>",defval,"</code>")
+ "<code>",defval,"</code>"))
else:
if abspath == '1':
- print ""
- print "The image has to be specified with full path."
+ print("")
+ print("The image has to be specified with full path.")
else: # format == 'string':
if defval != '':
- print ""
- print "The default value is: <code>%s</code>." % (
- defval)
- print ""
+ print("")
+ print("The default value is: <code>%s</code>." % (
+ defval))
+ print("")
# depends handling
if (node.hasAttribute('depends')):
depends = node.getAttribute('depends')
- print ""
- print "%s \\ref cfg_%s \"%s\" is set to \\c YES." % (
- "This tag requires that the tag", depends.lower(), depends.upper())
+ print("")
+ print("%s \\ref cfg_%s \"%s\" is set to \\c YES." % (
+ "This tag requires that the tag", depends.lower(), depends.upper()))
return False
def parseGroupsDoc(node):
name = node.getAttribute('name')
doc = node.getAttribute('docs')
- print "\section config_%s %s" % (name.lower(), doc)
+ print("\section config_%s %s" % (name.lower(), doc))
# Start of list has been moved to the first option for better
# anchor placement
# print "<dl>"
@@ -511,7 +510,7 @@ def parseGroupsDoc(node):
if n.nodeType == Node.ELEMENT_NODE:
first = parseOptionDoc(n, first)
if (not first):
- print "</dl>"
+ print("</dl>")
def parseGroupsList(node, commandsList):
@@ -542,7 +541,7 @@ def parseHeaderDoc(node):
if (n.nodeName == "docs"):
if (n.getAttribute('documentation') != "0"):
doc += parseDocs(n)
- print doc
+ print(doc)
def parseFooterDoc(node):
@@ -552,7 +551,7 @@ def parseFooterDoc(node):
if (n.nodeName == "docs"):
if (n.getAttribute('documentation') != "0"):
doc += parseDocs(n)
- print doc
+ print(doc)
def main():
@@ -561,16 +560,17 @@ def main():
try:
doc = xml.dom.minidom.parse(sys.argv[2])
except Exception as inst:
- print >> sys.stderr
- print >> sys.stderr, inst
- print >> sys.stderr
+ sys.stdout = sys.stderr
+ print("")
+ print(inst)
+ print("")
sys.exit(1)
elem = doc.documentElement
if (sys.argv[1] == "-doc"):
- print "/* WARNING: This file is generated!"
- print " * Do not edit this file, but edit config.xml instead and run"
- print " * python configgen.py -doc config.xml to regenerate this file!"
- print " */"
+ print("/* WARNING: This file is generated!")
+ print(" * Do not edit this file, but edit config.xml instead and run")
+ print(" * python configgen.py -doc config.xml to regenerate this file!")
+ print(" */")
# process header
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
@@ -582,10 +582,10 @@ def main():
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
commandsList = parseGroupsList(n, commandsList)
- print "\\secreflist"
+ print("\\secreflist")
for x in sorted(commandsList):
- print "\\refitem cfg_%s %s" % (x.lower(), x)
- print "\\endsecreflist"
+ print("\\refitem cfg_%s %s" % (x.lower(), x))
+ print("\\endsecreflist")
# process groups and options
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
@@ -597,24 +597,24 @@ def main():
if (n.nodeName == "footer"):
parseFooterDoc(n)
elif (sys.argv[1] == "-cpp"):
- print "/* WARNING: This file is generated!"
- print " * Do not edit this file, but edit config.xml instead and run"
- print " * python configgen.py -cpp config.xml to regenerate this file!"
- print " */"
- print ""
- print "#include \"configoptions.h\""
- print "#include \"config.h\""
- print "#include \"portable.h\""
- print "#include \"settings.h\""
- print ""
- print "void addConfigOptions(Config *cfg)"
- print "{"
- print " ConfigString *cs;"
- print " ConfigEnum *ce;"
- print " ConfigList *cl;"
- print " ConfigInt *ci;"
- print " ConfigBool *cb;"
- print ""
+ print("/* WARNING: This file is generated!")
+ print(" * Do not edit this file, but edit config.xml instead and run")
+ print(" * python configgen.py -cpp config.xml to regenerate this file!")
+ print(" */")
+ print("")
+ print("#include \"configoptions.h\"")
+ print("#include \"config.h\"")
+ print("#include \"portable.h\"")
+ print("#include \"settings.h\"")
+ print("")
+ print("void addConfigOptions(Config *cfg)")
+ print("{")
+ print(" ConfigString *cs;")
+ print(" ConfigEnum *ce;")
+ print(" ConfigList *cl;")
+ print(" ConfigInt *ci;")
+ print(" ConfigBool *cb;")
+ print("")
# process header
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
@@ -624,17 +624,17 @@ def main():
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
parseGroups(n)
- print "}"
+ print("}")
elif (sys.argv[1] == "-wiz"):
- print "/* WARNING: This file is generated!"
- print " * Do not edit this file, but edit config.xml instead and run"
- print " * python configgen.py -wiz config.xml to regenerate this file!"
- print " */"
- print "#include \"configdoc.h\""
- print "#include \"docintf.h\""
- print ""
- print "void addConfigDocs(DocIntf *doc)"
- print "{"
+ print("/* WARNING: This file is generated!")
+ print(" * Do not edit this file, but edit config.xml instead and run")
+ print(" * python configgen.py -wiz config.xml to regenerate this file!")
+ print(" */")
+ print("#include \"configdoc.h\"")
+ print("#include \"docintf.h\"")
+ print("")
+ print("void addConfigDocs(DocIntf *doc)")
+ print("{")
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "header"):
@@ -643,7 +643,7 @@ def main():
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
parseGroupCDocs(n)
- print "}"
+ print("}")
if __name__ == '__main__':
main()
diff --git a/src/context.cpp b/src/context.cpp
index 850f8e8..541cb74 100644
--- a/src/context.cpp
+++ b/src/context.cpp
@@ -1471,7 +1471,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
DotClassGraph *cg = getClassGraph();
FTextStream t(&result);
- cg->writeGraph(t,BITMAP,
+ cg->writeGraph(t,GOF_BITMAP,EOF_Html,
g_globals.outputDir,
g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
@@ -1516,7 +1516,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
{
DotClassGraph *cg = getCollaborationGraph();
FTextStream t(&result);
- cg->writeGraph(t,BITMAP,
+ cg->writeGraph(t,GOF_BITMAP,EOF_Html,
g_globals.outputDir,
g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
@@ -2197,7 +2197,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
{
DotInclDepGraph *cg = getIncludeGraph();
FTextStream t(&result);
- cg->writeGraph(t,BITMAP,
+ cg->writeGraph(t,GOF_BITMAP,EOF_Html,
g_globals.outputDir,
g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
relPathAsString(),TRUE,g_globals.dynSectionId
@@ -2228,7 +2228,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
{
DotInclDepGraph *cg = getIncludedByGraph();
FTextStream t(&result);
- cg->writeGraph(t,BITMAP,
+ cg->writeGraph(t,GOF_BITMAP,EOF_Html,
g_globals.outputDir,
g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
relPathAsString(),TRUE,g_globals.dynSectionId
@@ -2766,7 +2766,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
addProperty("isExplicit", this,&Private::isExplicit);
addProperty("isMutable", this,&Private::isMutable);
addProperty("isGettable", this,&Private::isGettable);
+ addProperty("isPrivateGettable", this,&Private::isPrivateGettable);
+ addProperty("isProtectedGettable", this,&Private::isProtectedGettable);
addProperty("isSettable", this,&Private::isSettable);
+ addProperty("isPrivateSettable", this,&Private::isPrivateSettable);
+ addProperty("isProtectedSettable", this,&Private::isProtectedSettable);
addProperty("isReadable", this,&Private::isReadable);
addProperty("isWritable", this,&Private::isWritable);
addProperty("isAddable", this,&Private::isAddable);
@@ -2855,8 +2859,12 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
m_cache.propertyAttrs.reset(TemplateList::alloc());
if (md && md->isProperty())
{
- if (md->isGettable()) m_cache.propertyAttrs->append("get");
- if (md->isSettable()) m_cache.propertyAttrs->append("set");
+ if (md->isGettable()) m_cache.propertyAttrs->append("get");
+ if (md->isPrivateGettable()) m_cache.propertyAttrs->append("private get");
+ if (md->isProtectedGettable()) m_cache.propertyAttrs->append("protected get");
+ if (md->isSettable()) m_cache.propertyAttrs->append("set");
+ if (md->isPrivateSettable()) m_cache.propertyAttrs->append("private set");
+ if (md->isProtectedSettable()) m_cache.propertyAttrs->append("protected set");
}
m_cache.eventAttrs.reset(TemplateList::alloc());
if (md && md->isEvent())
@@ -2948,12 +2956,28 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
}
TemplateVariant isGettable() const
{
- return m_memberDef->isSettable();
+ return m_memberDef->isGettable();
+ }
+ TemplateVariant isPrivateGettable() const
+ {
+ return m_memberDef->isPrivateGettable();
+ }
+ TemplateVariant isProtectedGettable() const
+ {
+ return m_memberDef->isProtectedGettable();
}
TemplateVariant isSettable() const
{
return m_memberDef->isSettable();
}
+ TemplateVariant isPrivateSettable() const
+ {
+ return m_memberDef->isPrivateSettable();
+ }
+ TemplateVariant isProtectedSettable() const
+ {
+ return m_memberDef->isProtectedSettable();
+ }
TemplateVariant isReadable() const
{
return m_memberDef->isReadable();
@@ -3634,7 +3658,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
DotCallGraph *cg = getCallGraph();
QGString result;
FTextStream t(&result);
- cg->writeGraph(t,BITMAP,
+ cg->writeGraph(t,GOF_BITMAP,EOF_Html,
g_globals.outputDir,
g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
relPathAsString(),TRUE,g_globals.dynSectionId
@@ -3674,7 +3698,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
DotCallGraph *cg = getCallerGraph();
QGString result;
FTextStream t(&result);
- cg->writeGraph(t,BITMAP,
+ cg->writeGraph(t,GOF_BITMAP,EOF_Html,
g_globals.outputDir,
g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
relPathAsString(),TRUE,g_globals.dynSectionId
diff --git a/src/definition.cpp b/src/definition.cpp
index c4b9f77..8603536 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -1362,13 +1362,21 @@ QCString Definition::qualifiedName() const
return m_impl->qualifiedName;
};
-void Definition::setOuterScope(Definition *d)
+void Definition::setOuterScope(Definition *d)
{
//printf("%s::setOuterScope(%s)\n",name().data(),d?d->name().data():"<none>");
- if (m_impl->outerScope!=d)
- {
+ Definition *p = m_impl->outerScope;
+ bool found=false;
+ // make sure that we are not creating a recursive scope relation.
+ while (p && !found)
+ {
+ found = (p==d);
+ p = p->m_impl->outerScope;
+ }
+ if (!found)
+ {
m_impl->qualifiedName.resize(0); // flush cached scope name
- m_impl->outerScope = d;
+ m_impl->outerScope = d;
}
m_impl->hidden = m_impl->hidden || d->isHidden();
}
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
index 2011333..cabb7ad 100644
--- a/src/docbookgen.cpp
+++ b/src/docbookgen.cpp
@@ -210,7 +210,7 @@ class DocbookCodeGenerator : public CodeOutputInterface
{
m_t << "<link linkend=\"" << m_refId << "\">";
}
- m_t << m_lineNumber;
+ m_t << m_lineNumber << " ";
if (!m_refId.isEmpty())
{
m_t << "</link>";
@@ -228,10 +228,10 @@ class DocbookCodeGenerator : public CodeOutputInterface
m_external.resize(0);
m_insideCodeLine=FALSE;
}
- void startFontClass(const char * /*colorClass*/)
+ void startFontClass(const char *colorClass)
{
Docbook_DB(("(startFontClass)\n"));
- m_t << "<emphasis>"; // non DocBook
+ m_t << "<emphasis class=\"" << colorClass << "\">";
m_insideSpecialHL=TRUE;
}
void endFontClass()
@@ -453,7 +453,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de
if (md->memberType()==MemberType_Enumeration)
{
MemberList *enumFields = md->enumFieldList();
- t << " <para>" << memType << " <link linkend=\"";
+ t << " <para><literallayout>" << memType << " <link linkend=\"";
if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
{
t << md->getGroupDef()->getOutputFileBase();
@@ -467,25 +467,25 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de
{
MemberListIterator emli(*enumFields);
MemberDef *emd;
- t << "{";
+ t << " {" << endl;
int cnt=0;
for (emli.toFirst();(emd=emli.current());++emli)
{
if (cnt!=0)
{
- t << ", ";
+ t << "," << endl;
}
t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">";
writeDocbookString(t,emd->name());
t << "</link>";
if (!emd->initializer().isEmpty())
{
- t << "=";
writeDocbookString(t,emd->initializer());
}
cnt++;
}
- t << "}";
+ t << endl << "}";
+ t << "</literallayout>" << endl;
}
}
else if (md->memberType()==MemberType_Define)
@@ -608,10 +608,10 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de
t << " </listitem>" << endl;
t << " </itemizedlist>" << endl;
t << " </para>" << endl;
- }
- else
+ }
+ else
{
- if (md->memberType()==MemberType_Enumeration)
+ if (md->memberType()==MemberType_Enumeration)
{
MemberList *enumFields = md->enumFieldList();
t << " <section xml:id=\"";
@@ -653,20 +653,19 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de
t << " </formalpara>" << endl;
t << " <para>";
t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl;
- t << " <programlisting>" << endl;
+ t << " <computeroutput><literallayout>" << endl;
t << "{" << endl;
for (emli.toFirst();(emd=emli.current());++emli)
{
writeDocbookString(t,emd->name());
if (!emd->initializer().isEmpty())
{
- t << "=";
writeDocbookString(t,emd->initializer());
}
t << ", " << endl;
}
t << "}" << convertToXML(md->name()) << ";" << endl;
- t << " </programlisting>" << endl;
+ t << " </literallayout></computeroutput>" << endl;
t << " </para>" << endl;
t << " </section>" << endl;
}
@@ -1127,6 +1126,7 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
+ QCString relPath = relativePathToRoot(fileName);
QFile f(fileName);
if (!f.open(IO_WriteOnly))
{
@@ -1181,6 +1181,20 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
}
}
+ if (Config_getBool("HAVE_DOT") && (Config_getBool("CLASS_DIAGRAMS") || Config_getBool("CLASS_GRAPH")))
+ {
+ t << "<para>Inheritance diagram for " << convertToXML(cd->name()) << "</para>" << endl;
+ DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
+ inheritanceGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,TRUE,FALSE);
+ }
+
+ if (Config_getBool("HAVE_DOT") && Config_getBool("COLLABORATION_GRAPH"))
+ {
+ t << "<para>Collaboration diagram for " << convertToXML(cd->name()) << "</para>" << endl;
+ DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
+ collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,TRUE,FALSE);
+ }
+
writeInnerClasses(cd->getClassSDict(),t);
writeTemplateList(cd,t);
@@ -1369,6 +1383,7 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
+ QCString relPath = relativePathToRoot(fileName);
QFile f(fileName);
if (!f.open(IO_WriteOnly))
@@ -1413,6 +1428,21 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
t << "</programlisting>" << endl;
}
}
+ if (Config_getBool("HAVE_DOT"))
+ {
+ if (Config_getBool("INCLUDE_GRAPH"))
+ {
+ t << "<para>Include dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
+ DotInclDepGraph idepGraph(fd, FALSE);
+ idepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE);
+ }
+ if (Config_getBool("INCLUDED_BY_GRAPH"))
+ {
+ t << "<para>Included by dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
+ DotInclDepGraph ibdepGraph(fd, TRUE);
+ ibdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE);
+ }
+ }
if (fd->getClassSDict())
{
@@ -1448,20 +1478,24 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
t << " <title>Detailed Description</title>" << endl;
writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
- t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
+ }
+ else
+ {
+ t << " <para>Definition in file " << stripPath(fd->getDefFileName()) << "</para>" << endl;
+ }
t << " </simplesect>" << endl;
- /*// TODO: Handling of Program listing for Docbook to be implemented
- if (Config_getBool("DOCBOOK_PROGRAMLISTING"))
- {
- t << " <programlisting>" << endl;
+ if (Config_getBool("DOCBOOK_PROGRAMLISTING"))
+ {
+ t << " <literallayout><computeroutput>" << endl;
writeDocbookCodeBlock(t,fd);
- t << " </programlisting>" << endl;
- }
- */
+ t << " </computeroutput></literallayout>" << endl;
+ }
t << "</section>" << endl;
-
}
static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
@@ -1489,6 +1523,7 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
+ QCString relPath = relativePathToRoot(fileName);
QFile f(fileName);
if (!f.open(IO_WriteOnly))
@@ -1503,6 +1538,13 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
+ if (Config_getBool("GROUP_GRAPHS") && Config_getBool("HAVE_DOT"))
+ {
+ t << "<para>Collaboration diagram for " << convertToXML(gd->groupTitle()) << "</para>" << endl;
+ DotGroupCollaboration collaborationGraph(gd);
+ collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE);
+ }
+
if (gd->briefDescription())
{
t << " <simplesect>" << endl;
@@ -1570,6 +1612,8 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
QFile f(fileName);
+ QCString relPath = relativePathToRoot(fileName);
+
if (!f.open(IO_WriteOnly))
{
err("Cannot open file %s for writing!\n",fileName.data());
@@ -1584,6 +1628,12 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
writeDocbookString(t, dd->displayName());
t << " Directory Reference";
t << "</title>" << endl;
+ if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT"))
+ {
+ t << "<para>Directory dependency diagram for " << convertToXML(dd->displayName()) << "</para>" << endl;
+ DotDirDeps dirdepGraph(dd);
+ dirdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE);
+ }
writeInnerDirs(&dd->subDirs(),t);
writeInnerFiles(dd->getFiles(),t);
@@ -1628,7 +1678,13 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
FTextStream t(&f);
//t.setEncoding(FTextStream::UnicodeUTF8);
- if (!pd->hasParentPage())
+ if(isExample)
+ {
+ QCString fileDocbook=pageName+".xml";
+ ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
+
+ if (!pd->hasParentPage() && !isExample)
{
QCString fileDocbook=pageName+".xml";
//Add the file Documentation info to index file
@@ -1654,7 +1710,7 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
if (isExample)
{
writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
- pd->documentation()+"\n&lt;include "+pd->name()+"&gt;");
+ pd->documentation()+"\n\\include "+pd->name());
}
else
{
@@ -1663,7 +1719,7 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
}
writeInnerPages(pd->getSubPages(),t);
- if (!pd->hasParentPage())
+ if (!pd->hasParentPage() && !isExample)
{
t << endl << "</chapter>" << endl;
}
@@ -1744,7 +1800,6 @@ void generateDocbook()
t << " </info>" << endl;
// NAMESPACE DOCUMENTATION
-
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
NamespaceDef *nd;
@@ -1838,35 +1893,39 @@ void generateDocbook()
// FILE DOCUMENTATION
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
-
- //File Documentation index header
- if (fnli.toFirst())
+ static bool showFiles = Config_getBool("SHOW_FILES");
+ if (showFiles)
{
- t << " <chapter>" << endl;
- t << " <title>File Documentation</title>" << endl;
- }
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
- for (;(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ //File Documentation index header
+ if (fnli.toFirst())
{
- msg("Generating Docbook output for file %s\n",fd->name().data());
- generateDocbookForFile(fd,t);
+ t << " <chapter>" << endl;
+ t << " <title>File Documentation</title>" << endl;
}
- }
- //File Documentation index footer
- if (fnli.toFirst())
- {
- t << " </chapter>" << endl;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ msg("Generating Docbook output for file %s\n",fd->name().data());
+ generateDocbookForFile(fd,t);
+ }
+ }
+
+ //File Documentation index footer
+ if (fnli.toFirst())
+ {
+ t << " </chapter>" << endl;
+ }
}
// DIRECTORY DOCUMENTATION
-
+ if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT"))
{
DirDef *dir;
DirSDict::Iterator sdi(*Doxygen::directories);
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
index 6867dce..5d7aafd 100644
--- a/src/docbookvisitor.cpp
+++ b/src/docbookvisitor.cpp
@@ -160,16 +160,16 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
switch(s->type())
{
case DocVerbatim::Code: // fall though
- m_t << "<programlisting>";
+ m_t << "<literallayout><computeroutput>";
Doxygen::parserManager->getParser(m_langExt)
->parseCode(m_ci,s->context(),s->text(),langExt,
s->isExample(),s->exampleFile());
- m_t << "</programlisting>";
+ m_t << "</computeroutput></literallayout>";
break;
case DocVerbatim::Verbatim:
- m_t << "<programlisting><literallayout>";
+ m_t << "<literallayout>";
filter(s->text());
- m_t << "</literallayout></programlisting>";
+ m_t << "</literallayout>";
break;
case DocVerbatim::HtmlOnly:
break;
@@ -189,8 +189,10 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
{
static int dotindex = 1;
QCString baseName(4096);
+ QCString name;
QCString stext = s->text();
m_t << "<para>" << endl;
+ name.sprintf("%s%d", "dot_inline_dotgraph_", dotindex);
baseName.sprintf("%s%d",
(Config_getString("DOCBOOK_OUTPUT")+"/inline_dotgraph_").data(),
dotindex++
@@ -203,7 +205,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
file.writeBlock( stext, stext.length() );
file.close();
m_t << " <figure>" << endl;
- m_t << " <title></title>" << endl;
+ m_t << " <title>" << name << "</title>" << endl;
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
writeDotFile(baseName);
@@ -216,8 +218,10 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::Msc:
static int mscindex = 1;
QCString baseName(4096);
+ QCString name;
QCString stext = s->text();
m_t << "<para>" << endl;
+ name.sprintf("%s%d", "msc_inline_mscgraph_", mscindex);
baseName.sprintf("%s%d",
(Config_getString("DOCBOOK_OUTPUT")+"/inline_mscgraph_").data(),
mscindex++
@@ -233,7 +237,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s)
file.writeBlock( text, text.length() );
file.close();
m_t << " <figure>" << endl;
- m_t << " <title></title>" << endl;
+ m_t << " <title>" << name << "</title>" << endl;
m_t << " <mediaobject>" << endl;
m_t << " <imageobject>" << endl;
writeMscFile(baseName);
@@ -259,7 +263,7 @@ void DocbookDocVisitor::visit(DocInclude *inc)
{
case DocInclude::IncWithLines:
{
- m_t << "<programlisting>";
+ m_t << "<literallayout><computeroutput>";
QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
Doxygen::parserManager->getParser(inc->extension())
@@ -268,18 +272,18 @@ void DocbookDocVisitor::visit(DocInclude *inc)
langExt,
inc->isExample(),
inc->exampleFile(), &fd);
- m_t << "</programlisting>";
+ m_t << "</computeroutput></literallayout>";
}
break;
case DocInclude::Include:
- m_t << "<programlisting>";
+ m_t << "<literallayout><computeroutput>";
Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(),
inc->text(),
langExt,
inc->isExample(),
inc->exampleFile());
- m_t << "</programlisting>";
+ m_t << "</computeroutput></literallayout>";
break;
case DocInclude::DontInclude:
break;
@@ -293,7 +297,7 @@ void DocbookDocVisitor::visit(DocInclude *inc)
m_t << "</verbatim>";
break;
case DocInclude::Snippet:
- m_t << "<programlisting>";
+ m_t << "<literallayout><computeroutput>";
Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,
inc->context(),
@@ -302,7 +306,7 @@ void DocbookDocVisitor::visit(DocInclude *inc)
inc->isExample(),
inc->exampleFile()
);
- m_t << "</programlisting>";
+ m_t << "</computeroutput></literallayout>";
break;
}
}
@@ -361,7 +365,7 @@ void DocbookDocVisitor::visit(DocIndexEntry *ie)
void DocbookDocVisitor::visit(DocSimpleSectSep *)
{
- m_t << "<simplesectsep/>";
+ m_t << "<simplesect/>";
}
void DocbookDocVisitor::visit(DocCite *cite)
@@ -818,14 +822,14 @@ void DocbookDocVisitor::visitPost(DocHtmlHeader *)
void DocbookDocVisitor::visitPre(DocImage *img)
{
- if (img->type()==DocImage::Latex)
+ if (img->type()==DocImage::DocBook)
{
if (m_hide) return;
m_t << endl;
m_t << " <figure>" << endl;
m_t << " <title>";
- }
- else
+ }
+ else
{
pushEnabled();
m_hide=TRUE;
@@ -834,7 +838,7 @@ void DocbookDocVisitor::visitPre(DocImage *img)
void DocbookDocVisitor::visitPost(DocImage *img)
{
- if (img->type()==DocImage::Latex)
+ if (img->type()==DocImage::DocBook)
{
if (m_hide) return;
QCString typevar;
@@ -854,13 +858,17 @@ void DocbookDocVisitor::visitPost(DocImage *img)
filter(img->width());
m_t << "\"";
}
- else if (!img->height().isEmpty())
+ else
+ {
+ m_t << " width=\"50%\"";
+ }
+ if (!img->height().isEmpty())
{
m_t << " depth=\"";
filter(img->height());
m_t << "\"";
}
- m_t << " align=\"center\" fileref=\"" << baseName << "\">";
+ m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "\">";
m_t << "</imagedata>" << endl;
m_t << " </imageobject>" << endl;
m_t << " </mediaobject>" << endl;
@@ -980,37 +988,23 @@ void DocbookDocVisitor::visitPost(DocSecRefList *)
void DocbookDocVisitor::visitPre(DocParamSect *s)
{
if (m_hide) return;
+ m_t << endl;
+ m_t << " <formalpara>" << endl;
+ m_t << " <title/>" << endl;
+ m_t << " <table frame=\"all\">" << endl;
+ m_t << " <title>";
switch(s->type())
{
- case DocParamSect::Param:
- {
- m_t << endl;
- m_t << " <formalpara>" << endl;
- m_t << " <title/>" << endl;
- m_t << " <table frame=\"all\">" << endl;
- m_t << " <title>Parameters</title>" << endl;
- m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
- m_t << " <tbody>" << endl;
- break;
- }
- case DocParamSect::RetVal:
- {
- m_t << endl;
- m_t << " <formalpara>" << endl;
- m_t << " <title/>" << endl;
- m_t << " <table frame=\"all\">" << endl;
- m_t << " <title>Parameters</title>" << endl;
- m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
- m_t << " <tbody>" << endl;
- break;
- }
- case DocParamSect::Exception:
- m_t << "exception"; break;
- case DocParamSect::TemplateParam:
- m_t << "templateparam"; break;
+ case DocParamSect::Param: m_t << theTranslator->trParameters(); break;
+ case DocParamSect::RetVal: m_t << theTranslator->trReturnValues(); break;
+ case DocParamSect::Exception: m_t << theTranslator->trExceptions(); break;
+ case DocParamSect::TemplateParam: m_t << theTranslator->trTemplateParameters(); break;
default:
ASSERT(0);
}
+ m_t << " </title>" << endl;
+ m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+ m_t << " <tbody>" << endl;
}
void DocbookDocVisitor::visitPost(DocParamSect *)
@@ -1029,17 +1023,17 @@ void DocbookDocVisitor::visitPre(DocParamList *pl)
QListIterator<DocNode> li(pl->parameters());
DocNode *param;
m_t << " <row>" << endl;
- if (!li.toFirst())
+ if (!li.toFirst())
{
m_t << " <entry></entry>" << endl;
- }
- else
+ }
+ else
{
m_t << " <entry>";
int cnt = 0;
for (li.toFirst();(param=li.current());++li)
{
- if (cnt)
+ if (cnt)
{
m_t << ", ";
}
@@ -1196,7 +1190,8 @@ void DocbookDocVisitor::writeMscFile(const QCString &baseName)
QCString outDir = Config_getString("DOCBOOK_OUTPUT");
writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP);
m_t << " <imagedata";
- m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">";
+ m_t << " width=\"50%\"";
+ m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << ".png" << "\">";
m_t << "</imagedata>" << endl;
}
@@ -1231,13 +1226,17 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName,
m_t << width;
m_t << "\"";
}
- else if (!height.isEmpty())
+ else
+ {
+ m_t << " width=\"50%\"";
+ }
+ if (!height.isEmpty())
{
m_t << " depth=\"";
m_t << height;
m_t << "\"";
}
- m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">";
+ m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << ".png" << "\">";
m_t << "</imagedata>" << endl;
m_t << " </imageobject>" << endl;
if (hasCaption)
@@ -1342,9 +1341,12 @@ void DocbookDocVisitor::writeDotFile(const QCString &baseName)
shortName=shortName.right(shortName.length()-i-1);
}
QCString outDir = Config_getString("DOCBOOK_OUTPUT");
- writeDotGraphFromFile(baseName+".dot",outDir,shortName,BITMAP);
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP);
m_t << " <imagedata";
- m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">";
+ //If no width is specified use default value for PDF rendering
+ m_t << " width=\"50%\"";
+ m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << "." << imgExt << "\">";
m_t << "</imagedata>" << endl;
}
@@ -1366,7 +1368,8 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName,
}
baseName.prepend("dot_");
QCString outDir = Config_getString("DOCBOOK_OUTPUT");
- writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP);
m_t << "<para>" << endl;
m_t << " <figure>" << endl;
m_t << " <title></title>" << endl;
@@ -1379,13 +1382,17 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName,
m_t << width;
m_t << "\"";
}
- else if (!height.isEmpty())
+ else
+ {
+ m_t << " width=\"50%\"";
+ }
+ if (!height.isEmpty())
{
m_t << " depth=\"";
m_t << height;
m_t << "\"";
}
- m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">";
+ m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "." << imgExt << "\">";
m_t << "</imagedata>" << endl;
m_t << " </imageobject>" << endl;
if (hasCaption)
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 66a890f..13d333f 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -257,14 +257,18 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
QCString outputDir;
switch(type)
{
- case DocImage::Html:
+ case DocImage::Html:
if (!Config_getBool("GENERATE_HTML")) return result;
outputDir = Config_getString("HTML_OUTPUT");
break;
- case DocImage::Latex:
+ case DocImage::Latex:
if (!Config_getBool("GENERATE_LATEX")) return result;
outputDir = Config_getString("LATEX_OUTPUT");
break;
+ case DocImage::DocBook:
+ if (!Config_getBool("GENERATE_DOCBOOK")) return result;
+ outputDir = Config_getString("DOCBOOK_OUTPUT");
+ break;
case DocImage::Rtf:
if (!Config_getBool("GENERATE_RTF")) return result;
outputDir = Config_getString("RTF_OUTPUT");
@@ -5025,9 +5029,10 @@ void DocPara::handleImage(const QCString &cmdName)
}
DocImage::Type t;
QCString imgType = g_token->name.lower();
- if (imgType=="html") t=DocImage::Html;
- else if (imgType=="latex") t=DocImage::Latex;
- else if (imgType=="rtf") t=DocImage::Rtf;
+ if (imgType=="html") t=DocImage::Html;
+ else if (imgType=="latex") t=DocImage::Latex;
+ else if (imgType=="docbook") t=DocImage::DocBook;
+ else if (imgType=="rtf") t=DocImage::Rtf;
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"image type %s specified as the first argument of "
diff --git a/src/docparser.h b/src/docparser.h
index fb4f084..17f296b 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -668,7 +668,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode
class DocImage : public CompAccept<DocImage>, public DocNode
{
public:
- enum Type { Html, Latex, Rtf };
+ enum Type { Html, Latex, Rtf, DocBook };
DocImage(DocNode *parent,const HtmlAttribList &attribs,
const QCString &name,Type t,const QCString &url=QCString());
Kind kind() const { return Kind_Image; }
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 7ffbbb3..3bd2058 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -333,7 +333,9 @@ BLANK [ \t\r]
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
PHPTYPE [\\:a-z_A-Z0-9\x80-\xFF\-]+
-CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]*
+CITESCHAR [a-z_A-Z\x80-\xFF]
+CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]*
+CITEID {CITESCHAR}*{CITEECHAR}+("."{CITESCHAR}*{CITEECHAR}+)*
MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}*
LISTITEM {BLANK}*[-]("#")?{WS}
diff --git a/src/dot.cpp b/src/dot.cpp
index 5c3d4fc..c64729a 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -16,11 +16,6 @@
*
*/
-#ifdef _WIN32
-#include <windows.h>
-#define BITMAP W_BITMAP
-#endif
-
#include <stdlib.h>
#include <qdir.h>
@@ -1896,7 +1891,7 @@ void DotNode::writeArrow(FTextStream &t,
t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->m_color] << "\"";
}
- if (format==BITMAP) t << ",fontname=\"" << FONTNAME << "\"";
+ if (format==GOF_BITMAP) t << ",fontname=\"" << FONTNAME << "\"";
t << "];" << endl;
}
@@ -2313,7 +2308,7 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
{
if (node->m_subgraphId==n->m_subgraphId)
{
- node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,TRUE,TRUE);
+ node->write(md5stream,DotNode::Hierarchy,GOF_BITMAP,FALSE,TRUE,TRUE,TRUE);
}
}
writeGraphFooter(md5stream);
@@ -3080,7 +3075,8 @@ QCString DotClassGraph::diskName() const
}
QCString DotClassGraph::writeGraph(FTextStream &out,
- GraphOutputFormat format,
+ GraphOutputFormat graphFormat,
+ EmbeddedOutputFormat textFormat,
const char *path,
const char *fileName,
const char *relPath,
@@ -3128,19 +3124,19 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
if (updateDotGraph(m_startNode,
m_graphType,
absBaseName,
- format,
+ graphFormat,
m_lrRank,
m_graphType==DotNode::Inheritance,
TRUE,
m_startNode->label()
) ||
- !checkDeliverables(format==BITMAP ? absImgName :
+ !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName :
usePDFLatex ? absPdfName : absEpsName,
- format==BITMAP && generateImageMap ? absMapName : QCString())
+ graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString())
)
{
regenerate=TRUE;
- if (format==BITMAP) // run dot to create a bitmap image
+ if (graphFormat==GOF_BITMAP) // run dot to create a bitmap image
{
QCString dotArgs(maxCmdLine);
@@ -3151,7 +3147,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
DotManager::instance()->addRun(dotRun);
}
- else if (format==EPS) // run dot to create a .eps image
+ else if (graphFormat==GOF_EPS) // run dot to create a .eps image
{
DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
if (usePDFLatex)
@@ -3167,7 +3163,35 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
}
Doxygen::indexList->addImageFile(baseName+"."+imgExt);
- if (format==BITMAP && generateImageMap) // produce HTML to include the image
+ if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
+ {
+ out << "<para>" << endl;
+ out << " <figure>" << endl;
+ out << " <title>";
+ switch (m_graphType)
+ {
+ case DotNode::Collaboration:
+ out << "Collaboration graph";
+ break;
+ case DotNode::Inheritance:
+ out << "Inheritance graph";
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ out << "</title>" << endl;
+ out << " <mediaobject>" << endl;
+ out << " <imageobject>" << endl;
+ out << " <imagedata";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << "</imagedata>" << endl;
+ out << " </imageobject>" << endl;
+ out << " </mediaobject>" << endl;
+ out << " </figure>" << endl;
+ out << "</para>" << endl;
+ }
+ else if (graphFormat==GOF_BITMAP && generateImageMap) // produce HTML to include the image
{
QCString mapLabel = escapeCharsInString(m_startNode->m_label,FALSE)+"_"+
escapeCharsInString(mapName,FALSE);
@@ -3189,7 +3213,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
{
out << "<div class=\"center\">";
out << "<img src=\"" << relPath << baseName << "."
- << imgExt << "\" border=\"0\" usemap=\"#"
+ << imgExt << "\" border=\"0\" usemap=\"#"
<< mapLabel << "\" alt=\"";
switch (m_graphType)
{
@@ -3202,10 +3226,9 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
default:
ASSERT(0);
break;
- }
+ }
out << "\"/>";
out << "</div>" << endl;
-
if (regenerate || !insertMapFile(out,absMapName,relPath,mapLabel))
{
int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
@@ -3214,7 +3237,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
}
}
}
- else if (format==EPS) // produce tex to include the .eps image
+ else if (graphFormat==GOF_EPS) // produce tex to include the .eps image
{
if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
{
@@ -3423,7 +3446,8 @@ QCString DotInclDepGraph::diskName() const
}
QCString DotInclDepGraph::writeGraph(FTextStream &out,
- GraphOutputFormat format,
+ GraphOutputFormat graphFormat,
+ EmbeddedOutputFormat textFormat,
const char *path,
const char *fileName,
const char *relPath,
@@ -3458,19 +3482,19 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
if (updateDotGraph(m_startNode,
DotNode::Dependency,
absBaseName,
- format,
+ graphFormat,
FALSE, // lrRank
FALSE, // renderParents
m_inverse, // backArrows
m_startNode->label()
) ||
- !checkDeliverables(format==BITMAP ? absImgName :
+ !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName :
usePDFLatex ? absPdfName : absEpsName,
- format==BITMAP && generateImageMap ? absMapName : QCString())
+ graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString())
)
{
regenerate=TRUE;
- if (format==BITMAP)
+ if (graphFormat==GOF_BITMAP)
{
// run dot to create a bitmap image
QCString dotArgs(maxCmdLine);
@@ -3479,7 +3503,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
DotManager::instance()->addRun(dotRun);
}
- else if (format==EPS)
+ else if (graphFormat==GOF_EPS)
{
DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
if (usePDFLatex)
@@ -3491,12 +3515,27 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
dotRun->addJob("ps",absEpsName);
}
DotManager::instance()->addRun(dotRun);
-
- }
+ }
}
Doxygen::indexList->addImageFile(baseName+"."+imgExt);
- if (format==BITMAP && generateImageMap)
+ if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
+ {
+ out << "<para>" << endl;
+ out << " <figure>" << endl;
+ out << " <title>Dependency diagram";
+ out << "</title>" << endl;
+ out << " <mediaobject>" << endl;
+ out << " <imageobject>" << endl;
+ out << " <imagedata";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << "</imagedata>" << endl;
+ out << " </imageobject>" << endl;
+ out << " </mediaobject>" << endl;
+ out << " </figure>" << endl;
+ out << "</para>" << endl;
+ }
+ else if (graphFormat==GOF_BITMAP && generateImageMap)
{
if (imgExt=="svg") // Scalable vector graphics
{
@@ -3514,9 +3553,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
}
else // bitmap graphics
{
- out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
- << imgExt << "\" border=\"0\" usemap=\"#"
- << mapName << "\" alt=\"\"/>";
+ out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "\" alt=\"\"/>";
out << "</div>" << endl;
QCString absMapName = absBaseName+".map";
@@ -3528,7 +3565,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
}
}
}
- else if (format==EPS) // encapsulated postscript
+ else if (graphFormat==GOF_EPS) // encapsulated postscript
{
if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
{
@@ -3729,7 +3766,8 @@ DotCallGraph::~DotCallGraph()
delete m_usedNodes;
}
-QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
+QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat graphFormat,
+ EmbeddedOutputFormat textFormat,
const char *path,const char *fileName,
const char *relPath,bool generateImageMap,int
graphId) const
@@ -3757,19 +3795,19 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
if (updateDotGraph(m_startNode,
DotNode::CallGraph,
absBaseName,
- format,
+ graphFormat,
TRUE, // lrRank
FALSE, // renderParents
m_inverse, // backArrows
m_startNode->label()
) ||
- !checkDeliverables(format==BITMAP ? absImgName :
+ !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName :
usePDFLatex ? absPdfName : absEpsName,
- format==BITMAP && generateImageMap ? absMapName : QCString())
+ graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString())
)
{
regenerate=TRUE;
- if (format==BITMAP)
+ if (graphFormat==GOF_BITMAP)
{
// run dot to create a bitmap image
QCString dotArgs(maxCmdLine);
@@ -3779,7 +3817,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
DotManager::instance()->addRun(dotRun);
}
- else if (format==EPS)
+ else if (graphFormat==GOF_EPS)
{
// run dot to create a .eps image
DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
@@ -3797,7 +3835,23 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
}
Doxygen::indexList->addImageFile(baseName+"."+imgExt);
- if (format==BITMAP && generateImageMap)
+ if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
+ {
+ out << "<para>" << endl;
+ out << " <figure>" << endl;
+ out << " <title>Call diagram";
+ out << "</title>" << endl;
+ out << " <mediaobject>" << endl;
+ out << " <imageobject>" << endl;
+ out << " <imagedata";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << "</imagedata>" << endl;
+ out << " </imageobject>" << endl;
+ out << " </mediaobject>" << endl;
+ out << " </figure>" << endl;
+ out << "</para>" << endl;
+ }
+ else if (graphFormat==GOF_BITMAP && generateImageMap)
{
if (imgExt=="svg") // Scalable vector graphics
{
@@ -3815,7 +3869,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
}
else // bitmap graphics
{
- out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
+ out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapName << "\" alt=\"";
out << "\"/>";
@@ -3829,7 +3883,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
}
}
}
- else if (format==EPS) // encapsulated postscript
+ else if (graphFormat==GOF_EPS) // encapsulated postscript
{
if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
{
@@ -3865,7 +3919,8 @@ DotDirDeps::~DotDirDeps()
}
QCString DotDirDeps::writeGraph(FTextStream &out,
- GraphOutputFormat format,
+ GraphOutputFormat graphFormat,
+ EmbeddedOutputFormat textFormat,
const char *path,
const char *fileName,
const char *relPath,
@@ -3901,9 +3956,9 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
MD5SigToString(md5_sig,sigStr.data(),33);
bool regenerate=FALSE;
if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
- !checkDeliverables(format==BITMAP ? absImgName :
+ !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName :
usePDFLatex ? absPdfName : absEpsName,
- format==BITMAP && generateImageMap ? absMapName : QCString())
+ graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString())
)
{
regenerate=TRUE;
@@ -3917,7 +3972,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
t << theGraph.data();
f.close();
- if (format==BITMAP)
+ if (graphFormat==GOF_BITMAP)
{
// run dot to create a bitmap image
QCString dotArgs(maxCmdLine);
@@ -3926,7 +3981,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
DotManager::instance()->addRun(dotRun);
}
- else if (format==EPS)
+ else if (graphFormat==GOF_EPS)
{
DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
if (usePDFLatex)
@@ -3942,7 +3997,23 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
}
Doxygen::indexList->addImageFile(baseName+"."+imgExt);
- if (format==BITMAP && generateImageMap)
+ if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
+ {
+ out << "<para>" << endl;
+ out << " <figure>" << endl;
+ out << " <title>Directory Dependency diagram";
+ out << "</title>" << endl;
+ out << " <mediaobject>" << endl;
+ out << " <imageobject>" << endl;
+ out << " <imagedata";
+ out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ out << "</imagedata>" << endl;
+ out << " </imageobject>" << endl;
+ out << " </mediaobject>" << endl;
+ out << " </figure>" << endl;
+ out << "</para>" << endl;
+ }
+ else if (graphFormat==GOF_BITMAP && generateImageMap)
{
if (imgExt=="svg") // Scalable vector graphics
{
@@ -3960,7 +4031,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
}
else // bitmap graphics
{
- out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
+ out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapName << "\" alt=\"";
out << convertToXML(m_dir->displayName());
@@ -3975,7 +4046,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
}
}
}
- else if (format==EPS)
+ else if (graphFormat==GOF_EPS)
{
if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
{
@@ -4085,9 +4156,9 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
QCString absOutFile = d.absPath().utf8()+"/"+outFile;
DotRunner dotRun(inFile,d.absPath().data(),FALSE,absImgName);
- if (format==BITMAP)
+ if (format==GOF_BITMAP)
dotRun.addJob(imgExt,absImgName);
- else // format==EPS
+ else // format==GOF_EPS
{
if (Config_getBool("USE_PDFLATEX"))
{
@@ -4105,7 +4176,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
return;
}
- if (format==BITMAP) checkDotResult(absImgName);
+ if (format==GOF_BITMAP) checkDotResult(absImgName);
Doxygen::indexList->addImageFile(imgName);
@@ -4384,7 +4455,8 @@ void DotGroupCollaboration::addCollaborationMember(
}
-QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat format,
+QCString DotGroupCollaboration::writeGraph( FTextStream &t,
+ GraphOutputFormat graphFormat, EmbeddedOutputFormat textFormat,
const char *path, const char *fileName, const char *relPath,
bool writeImageMap,int graphId) const
{
@@ -4411,7 +4483,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
// write other nodes.
for (dni.toFirst();(pn=dni.current());++dni)
{
- pn->write(md5stream,DotNode::Inheritance,format,TRUE,FALSE,FALSE,FALSE);
+ pn->write(md5stream,DotNode::Inheritance,graphFormat,TRUE,FALSE,FALSE,FALSE);
}
// write edges
@@ -4441,9 +4513,9 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
QCString absEpsName = absBaseName+".eps";
bool regenerate=FALSE;
if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
- !checkDeliverables(format==BITMAP ? absImgName :
+ !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName :
usePDFLatex ? absPdfName : absEpsName,
- format==BITMAP /*&& generateImageMap*/ ? absMapName : QCString())
+ graphFormat==GOF_BITMAP /*&& generateImageMap*/ ? absMapName : QCString())
)
{
regenerate=TRUE;
@@ -4456,7 +4528,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
dotfile.close();
}
- if (format==BITMAP) // run dot to create a bitmap image
+ if (graphFormat==GOF_BITMAP) // run dot to create a bitmap image
{
QCString dotArgs(maxCmdLine);
@@ -4466,7 +4538,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
DotManager::instance()->addRun(dotRun);
}
- else if (format==EPS)
+ else if (graphFormat==GOF_EPS)
{
DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
if (usePDFLatex)
@@ -4481,7 +4553,23 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
}
}
- if (format==BITMAP && writeImageMap)
+ if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook)
+ {
+ t << "<para>" << endl;
+ t << " <figure>" << endl;
+ t << " <title>Group Collaboration diagram";
+ t << "</title>" << endl;
+ t << " <mediaobject>" << endl;
+ t << " <imageobject>" << endl;
+ t << " <imagedata";
+ t << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">";
+ t << "</imagedata>" << endl;
+ t << " </imageobject>" << endl;
+ t << " </mediaobject>" << endl;
+ t << " </figure>" << endl;
+ t << "</para>" << endl;
+ }
+ else if (graphFormat==GOF_BITMAP && writeImageMap)
{
QCString mapLabel = escapeCharsInString(baseName,FALSE);
t << "<center><table><tr><td>";
@@ -4503,7 +4591,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
else
{
t << "<img src=\"" << relPath << imgName
- << "\" border=\"0\" alt=\"\" usemap=\"#"
+ << "\" border=\"0\" alt=\"\" usemap=\"#"
<< mapLabel << "\"/>" << endl;
if (regenerate || !insertMapFile(t,absMapName,relPath,mapLabel))
{
@@ -4512,10 +4600,9 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
t << "<!-- MAP " << mapId << " -->" << endl;
}
}
-
t << "</td></tr></table></center>" << endl;
}
- else if (format==EPS)
+ else if (graphFormat==GOF_EPS)
{
if (regenerate || !writeVecGfxFigure(t,baseName,absBaseName))
{
diff --git a/src/dot.h b/src/dot.h
index 6ff89be..8906199 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -39,7 +39,8 @@ class GroupDef;
class DotGroupCollaboration;
class DotRunnerQueue;
-enum GraphOutputFormat { BITMAP , EPS };
+enum GraphOutputFormat { GOF_BITMAP, GOF_EPS };
+enum EmbeddedOutputFormat { EOF_Html, EOF_LaTeX, EOF_Rtf, EOF_DocBook };
/** Attributes of an edge of a dot graph */
struct EdgeInfo
@@ -165,8 +166,8 @@ class DotClassGraph
~DotClassGraph();
bool isTrivial() const;
bool isTooBig() const;
- QCString writeGraph(FTextStream &t,GraphOutputFormat f,const char *path,
- const char *fileName, const char *relPath,
+ QCString writeGraph(FTextStream &t,GraphOutputFormat gf,EmbeddedOutputFormat ef,
+ const char *path, const char *fileName, const char *relPath,
bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1) const;
void writeXML(FTextStream &t);
@@ -196,7 +197,7 @@ class DotInclDepGraph
public:
DotInclDepGraph(FileDef *fd,bool inverse);
~DotInclDepGraph();
- QCString writeGraph(FTextStream &t, GraphOutputFormat f,
+ QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef,
const char *path,const char *fileName,const char *relPath,
bool writeImageMap=TRUE,int graphId=-1) const;
bool isTrivial() const;
@@ -222,7 +223,7 @@ class DotCallGraph
public:
DotCallGraph(MemberDef *md,bool inverse);
~DotCallGraph();
- QCString writeGraph(FTextStream &t, GraphOutputFormat f,
+ QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef,
const char *path,const char *fileName,
const char *relPath,bool writeImageMap=TRUE,
int graphId=-1) const;
@@ -249,7 +250,8 @@ class DotDirDeps
~DotDirDeps();
bool isTrivial() const;
QCString writeGraph(FTextStream &out,
- GraphOutputFormat format,
+ GraphOutputFormat gf,
+ EmbeddedOutputFormat ef,
const char *path,
const char *fileName,
const char *relPath,
@@ -298,7 +300,7 @@ class DotGroupCollaboration
DotGroupCollaboration(GroupDef* gd);
~DotGroupCollaboration();
- QCString writeGraph(FTextStream &t, GraphOutputFormat format,
+ QCString writeGraph(FTextStream &t, GraphOutputFormat gf,EmbeddedOutputFormat ef,
const char *path,const char *fileName,const char *relPath,
bool writeImageMap=TRUE,int graphId=-1) const;
void buildGraph(GroupDef* gd);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 8aba232..bc080a2 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -551,7 +551,7 @@ static void addSTLClasses(EntryNav *rootNav)
//----------------------------------------------------------------------------
static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n,
- FileDef *fileScope=0);
+ FileDef *fileScope,TagInfo *tagInfo);
static void addPageToContext(PageDef *pd,EntryNav *rootNav)
{
@@ -564,7 +564,7 @@ static void addPageToContext(PageDef *pd,EntryNav *rootNav)
}
scope = stripAnonymousNamespaceScope(scope);
scope+="::"+pd->name();
- Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope);
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo());
if (d)
{
pd->setPageScope(d);
@@ -708,7 +708,7 @@ static void findGroupScope(EntryNav *rootNav)
}
scope = stripAnonymousNamespaceScope(scope);
scope+="::"+gd->name();
- Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope);
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo());
if (d)
{
gd->setGroupScope(d);
@@ -996,7 +996,8 @@ 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,TagInfo *tagInfo)
+static Definition *buildScopeFromQualifiedName(const QCString name,
+ int level,SrcLangExt lang,TagInfo *tagInfo)
{
//printf("buildScopeFromQualifiedName(%s) level=%d\n",name.data(),level);
int i=0;
@@ -1018,7 +1019,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src
{
innerScope = cd;
}
- else if (nd==0 && cd==0) // scope is not known!
+ else if (nd==0 && cd==0 && fullScope.find('<')==-1) // scope is not known and could be a namespace!
{
// introduce bogus namespace
//printf("++ adding dummy namespace %s to %s tagInfo=%p\n",nsName.data(),prevScope->name().data(),tagInfo);
@@ -1047,7 +1048,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src
}
static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n,
- FileDef *fileScope)
+ FileDef *fileScope,TagInfo *tagInfo)
{
//printf("<findScopeFromQualifiedName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data());
Definition *resultScope=startScope;
@@ -1080,7 +1081,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
for (ni.toFirst();((nd=ni.current()) && resultScope==0);++ni)
{
// restart search within the used namespace
- resultScope = findScopeFromQualifiedName(nd,n,fileScope);
+ resultScope = findScopeFromQualifiedName(nd,n,fileScope,tagInfo);
}
if (resultScope)
{
@@ -1112,7 +1113,8 @@ 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(),0);
+ resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),
+ startScope->getLanguage(),0);
//printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope);
if (resultScope)
{
@@ -1420,7 +1422,7 @@ static void resolveClassNestingRelations()
//printf("processing=%s, iteration=%d\n",cd->name().data(),iteration);
// also add class to the correct structural context
Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,
- name,cd->getFileDef());
+ name,cd->getFileDef(),0);
if (d)
{
//printf("****** adding %s to scope %s in iteration %d\n",cd->name().data(),d->name().data(),iteration);
@@ -1788,7 +1790,7 @@ static void buildNamespaceList(EntryNav *rootNav)
Doxygen::namespaceSDict->inSort(fullName,nd);
// also add namespace to the correct structural context
- Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName);
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName,0,tagInfo);
//printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"<none>");
if (d==0) // we didn't find anything, create the scope artificially
// anyway, so we can at least relate scopes properly.
@@ -4823,7 +4825,7 @@ static bool findClassRelation(
int si = baseClassName.findRev("::");
if (si!=-1) // class is nested
{
- Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si));
+ Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si),0,rootNav->tagInfo());
if (sd==0 || sd==Doxygen::globalScope) // outer scope not found
{
baseClass->setArtificial(TRUE); // see bug678139
diff --git a/src/entry.h b/src/entry.h
index a861906..3e5f3d7 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -135,6 +135,10 @@ class Entry
static const uint64 Singleton = (1ULL<<14); // UNO IDL
// member specifiers (add new items to the beginning)
+ static const uint64 PrivateGettable = (1ULL<<20); // C# private getter
+ static const uint64 ProtectedGettable = (1ULL<<21); // C# protected getter
+ static const uint64 PrivateSettable = (1ULL<<22); // C# private setter
+ static const uint64 ProtectedSettable = (1ULL<<23); // C# protected setter
static const uint64 Inline = (1ULL<<24);
static const uint64 Explicit = (1ULL<<25);
static const uint64 Mutable = (1ULL<<26);
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 5752e8c..9e8a61c 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -432,7 +432,15 @@ void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title)
void FileDef::writeInlineClasses(OutputList &ol)
{
+ // temporarily undo the disbling could be done by startMemberDocumentation()
+ // as a result of setting SEPARATE_MEMBER_PAGES to YES; see bug730512
+ bool isEnabled = ol.isEnabled(OutputGenerator::Html);
+ ol.enable(OutputGenerator::Html);
+
if (m_classSDict) m_classSDict->writeDocumentation(ol,this);
+
+ // restore the initial state if needed
+ if (!isEnabled) ol.disable(OutputGenerator::Html);
}
void FileDef::startMemberDeclarations(OutputList &ol)
diff --git a/src/fortrancode.l b/src/fortrancode.l
index 02a827e..e6cfdde 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -150,7 +150,9 @@ static bool g_includeCodeFragment;
static char stringStartSymbol; // single or double quote
// count in variable declaration to filter out
// declared from referenced names
-static int bracketCount = 0;
+static int bracketCount = 0;
+
+static bool g_endComment;
// simplified way to know if this is fixed form
// duplicate in fortranscanner.l
@@ -255,6 +257,7 @@ static void startCodeLine()
g_currentDefinition = d;
g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
g_insideBody = FALSE;
+ g_endComment = FALSE;
g_parmType.resize(0);
g_parmName.resize(0);
QCString lineAnchor;
@@ -688,8 +691,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}|PROCEDURE)
-TYPE_PREFIX ((TYPE|CLASS|PROCEDURE){BS}"(")
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE|CLASS|PROCEDURE)
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|VALUE|NOPASS|DEFERRED)
@@ -718,7 +720,6 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
%x Use
%x UseOnly
%x Import
-%x TypeDecl
%x Declaration
%x DeclContLine
%x Parameterlist
@@ -828,7 +829,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
g_insideBody=FALSE;
}
/*-------- fortran module -----------------------------------------*/
-<Start>("block"{BS}"data"|"program"|"module"|"type"|"interface")/{BS_}|({COMMA}({ACCESS_SPEC}|ABSTRACT|EXTENDS))|\n { //
+<Start>("block"{BS}"data"|"program"|"module"|"interface")/{BS_}|({COMMA}{ACCESS_SPEC})|\n { //
startScope();
startFontClass("keyword");
codifyLines(yytext);
@@ -837,6 +838,14 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
BEGIN(ClassName);
if (!qstricmp(yytext,"module")) currentModule="module";
}
+<Start>("type")/{BS_}|({COMMA}({ACCESS_SPEC}|ABSTRACT|EXTENDS))|\n { //
+ startScope();
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ yy_push_state(YY_START);
+ BEGIN(ClassName);
+ }
<ClassName>{ID} {
if (currentModule == "module")
{
@@ -905,24 +914,6 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
endFontClass();
}
/*-------- variable declaration ----------------------------------*/
-<Start>^{BS}{TYPE_PREFIX}/{ID} {
- yy_push_state(YY_START);
- BEGIN(TypeDecl);
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- }
-<TypeDecl>{ID} { // link type
- g_insideBody=TRUE;
- generateLink(*g_code,yytext);
- g_insideBody=FALSE;
- }
-<TypeDecl>")" {
- BEGIN(Declaration);
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- }
<Start>{TYPE_SPEC}/[,:( ] {
yy_push_state(YY_START);
BEGIN(Declaration);
@@ -941,7 +932,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
endFontClass();
}
<Declaration>{ID} { // local var
- if (g_currentMemberDef && !g_currentMemberDef->isFunction())
+ if (g_currentMemberDef && g_currentMemberDef->isFunction() && bracketCount==0)
{
g_code->codify(yytext);
addLocalVar(yytext);
@@ -973,7 +964,14 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
YY_FTN_RESET
}
<Declaration>"\n" { // end declaration line
- codifyLines(yytext);
+ if (g_endComment)
+ {
+ g_endComment=FALSE;
+ }
+ else
+ {
+ codifyLines(yytext);
+ }
bracketCount = 0;
yy_pop_state();
YY_FTN_RESET
@@ -1030,16 +1028,17 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
docBlock+=yytext;
}
<DocBlock>"\n" { // comment block ends at the end of this line
- docBlock+=yytext;
// remove special comment (default config)
if (Config_getBool("STRIP_CODE_COMMENTS"))
{
g_yyLineNr+=((QCString)docBlock).contains('\n');
+ g_yyLineNr+=1;
endCodeLine();
- if (g_yyLineNr<g_inputLines)
+ if (g_yyLineNr<g_inputLines)
{
startCodeLine();
}
+ g_endComment=TRUE;
}
else // do not remove comment
{
@@ -1047,6 +1046,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
codifyLines(docBlock);
endFontClass();
}
+ unput(*yytext);
yy_pop_state();
YY_FTN_RESET
}
@@ -1118,7 +1118,14 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
/*-----------------------------------------------------------------------------*/
<*>\n {
- codifyLines(yytext);
+ if (g_endComment)
+ {
+ g_endComment=FALSE;
+ }
+ else
+ {
+ codifyLines(yytext);
+ }
YY_FTN_RESET
}
<*>. {
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 261f739..372bb93 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -1906,7 +1906,7 @@ void HtmlDocVisitor::writeDotFile(const QCString &fn,const QCString &relPath,
}
baseName.prepend("dot_");
QCString outDir = Config_getString("HTML_OUTPUT");
- writeDotGraphFromFile(fn,outDir,baseName,BITMAP);
+ writeDotGraphFromFile(fn,outDir,baseName,GOF_BITMAP);
writeDotImageMapFromFile(m_t,fn,outDir,relPath,baseName,context);
}
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 0d399d3..27091b4 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -2516,7 +2516,7 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,TRUE,m_sectionCount);
if (generateLegend && !umlLook)
{
t << "<center><span class=\"legend\">[";
@@ -2542,7 +2542,7 @@ void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
@@ -2560,7 +2560,7 @@ void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
@@ -2578,7 +2578,7 @@ void HtmlGenerator::endCallGraph(const DotCallGraph &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
@@ -2596,7 +2596,7 @@ void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
endSectionSummary(t);
startSectionContent(t,m_sectionCount);
- g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount);
+ g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount);
endSectionContent(t);
m_sectionCount++;
diff --git a/src/lang_cfg.py b/src/lang_cfg.py
index 329610f..efed05f 100644
--- a/src/lang_cfg.py
+++ b/src/lang_cfg.py
@@ -2,7 +2,7 @@ import sys
if (len(sys.argv) > 1):
if (sys.argv[1] == "ENONLY"):
- print "#define ENGLISH_ONLY"
+ print("#define ENGLISH_ONLY")
else:
- for x in xrange(1, len(sys.argv)):
- print "#define LANG_%s"%(sys.argv[x])
+ for x in range(1, len(sys.argv)):
+ print("#define LANG_%s"%(sys.argv[x]))
diff --git a/src/languages.py b/src/languages.py
index 7ce382a..2b02b3e 100755
--- a/src/languages.py
+++ b/src/languages.py
@@ -15,7 +15,7 @@ for f in files:
# generating file is lang_cfg.py
# the rules file has to output lang_cfg.h
#
-print """\
+print("""\
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="languages"
@@ -52,7 +52,7 @@ print """\
/>
</Values>
</EnumProperty>
-"""
+""")
#
# generate loop, English is mandatory (so cannot be chosen)
#
@@ -76,7 +76,7 @@ for f in new_list:
l1 = l.replace("-","")
# capatalize first letter
l = l.title()
- print """\
+ print("""\
<EnumProperty
Name="%s"
DisplayName="Use %s"
@@ -96,11 +96,11 @@ for f in new_list:
/>
</Values>
</EnumProperty>
- """ % (l1, l, l, l, f[1], l)
+ """ % (l1, l, l, l, f[1], l))
-print """\
+print("""\
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
-"""
+""")
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index eed36bc..0edb459 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -1587,7 +1587,7 @@ void LatexDocVisitor::startDotFile(const QCString &fileName,
baseName.prepend("dot_");
QCString outDir = Config_getString("LATEX_OUTPUT");
QCString name = fileName;
- writeDotGraphFromFile(name,outDir,baseName,EPS);
+ writeDotGraphFromFile(name,outDir,baseName,GOF_EPS);
if (hasCaption)
{
m_t << "\n\\begin{DoxyImage}\n";
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index a714539..086e012 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -186,6 +186,8 @@ static void writeMakeBat()
exit(1);
}
FTextStream t(&file);
+ t << "set Dir_Old=%cd%\n";
+ t << "cd /D %~dp0\n\n";
t << "del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf\n\n";
if (!Config_getBool("USE_PDFLATEX")) // use plain old latex
{
@@ -246,6 +248,8 @@ static void writeMakeBat()
t << "endlocal\n";
t << mkidx_command << " refman.idx\n";
t << "pdflatex refman\n";
+ t << "cd /D %Dir_Old%\n";
+ t << "set Dir_Old=\n";
}
#endif
}
@@ -286,6 +290,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
// Load required packages
t << "% Packages required by doxygen\n"
+ "\\usepackage{fixltx2e}\n" // for \textsubscript
"\\usepackage{calc}\n"
"\\usepackage{doxygen}\n"
"\\usepackage{graphicx}\n"
@@ -293,7 +298,6 @@ 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"
@@ -1810,7 +1814,7 @@ void LatexGenerator::startDotGraph()
void LatexGenerator::endDotGraph(const DotClassGraph &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startInclDepGraph()
@@ -1819,7 +1823,7 @@ void LatexGenerator::startInclDepGraph()
void LatexGenerator::endInclDepGraph(const DotInclDepGraph &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startGroupCollaboration()
@@ -1828,7 +1832,7 @@ void LatexGenerator::startGroupCollaboration()
void LatexGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startCallGraph()
@@ -1837,7 +1841,7 @@ void LatexGenerator::startCallGraph()
void LatexGenerator::endCallGraph(const DotCallGraph &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startDirDepGraph()
@@ -1846,7 +1850,7 @@ void LatexGenerator::startDirDepGraph()
void LatexGenerator::endDirDepGraph(const DotDirDeps &g)
{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+ g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath);
}
void LatexGenerator::startDescription()
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index a1b23e8..1069b3b 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -942,7 +942,9 @@ bool MemberDef::hasExamples()
QCString MemberDef::getOutputFileBase() const
{
static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+ static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
QCString baseName;
+
//printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
// name().data(),m_impl->templateMaster,m_impl->group,m_impl->classDef,
// m_impl->nspace,m_impl->fileDef);
@@ -961,6 +963,10 @@ QCString MemberDef::getOutputFileBase() const
else if (m_impl->classDef)
{
baseName=m_impl->classDef->getOutputFileBase();
+ if (inlineSimpleClasses && m_impl->classDef->isSimple())
+ {
+ return baseName;
+ }
}
else if (m_impl->nspace)
{
@@ -1723,15 +1729,27 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.docify(" [implementation]");
ol.endTypewriter();
}
+
+ bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
- if (isProperty() && (isSettable() || isGettable()))
+ if (isProperty() && (isSettable() || isGettable() ||
+ isPrivateSettable() || isPrivateGettable() ||
+ isProtectedSettable() || isProtectedGettable()))
{
ol.writeLatexSpacing();
ol.startTypewriter();
ol.docify(" [");
QStrList sl;
- if (isGettable()) sl.append("get");
- if (isSettable()) sl.append("set");
+
+ if (isGettable()) sl.append("get");
+ if (isProtectedGettable()) sl.append("protected get");
+ if (isSettable()) sl.append("set");
+ if (isProtectedSettable()) sl.append("protected set");
+ if (extractPrivate)
+ {
+ if (isPrivateGettable()) sl.append("private get");
+ if (isPrivateSettable()) sl.append("private set");
+ }
const char *s=sl.first();
while (s)
{
@@ -1934,6 +1952,7 @@ void MemberDef::getLabels(QStrList &sl,Definition *container) const
//ol.docify(" [");
SrcLangExt lang = getLanguage();
bool optVhdl = lang==SrcLangExt_VHDL;
+ bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
if (optVhdl)
{
sl.append(VhdlDocGen::trTypeString(getMemberSpecifiers()));
@@ -1949,7 +1968,14 @@ void MemberDef::getLabels(QStrList &sl,Definition *container) const
if (isMutable()) sl.append("mutable");
if (isStatic()) sl.append("static");
if (isGettable()) sl.append("get");
+ if (isProtectedGettable()) sl.append("protected get");
if (isSettable()) sl.append("set");
+ if (isProtectedSettable()) sl.append("protected set");
+ if (extractPrivate)
+ {
+ if (isPrivateGettable()) sl.append("private get");
+ if (isPrivateSettable()) sl.append("private set");
+ }
if (isAddable()) sl.append("add");
if (!isUNOProperty() && isRemovable()) sl.append("remove");
if (isRaisable()) sl.append("raise");
@@ -4187,11 +4213,31 @@ bool MemberDef::isGettable() const
return (m_impl->memSpec&Entry::Gettable)!=0;
}
+bool MemberDef::isPrivateGettable() const
+{
+ return (m_impl->memSpec&Entry::PrivateGettable)!=0;
+}
+
+bool MemberDef::isProtectedGettable() const
+{
+ return (m_impl->memSpec&Entry::ProtectedGettable)!=0;
+}
+
bool MemberDef::isSettable() const
{
return (m_impl->memSpec&Entry::Settable)!=0;
}
+bool MemberDef::isPrivateSettable() const
+{
+ return (m_impl->memSpec&Entry::PrivateSettable)!=0;
+}
+
+bool MemberDef::isProtectedSettable() const
+{
+ return (m_impl->memSpec&Entry::ProtectedSettable)!=0;
+}
+
bool MemberDef::isAddable() const
{
return (m_impl->memSpec&Entry::Addable)!=0;
diff --git a/src/memberdef.h b/src/memberdef.h
index 3259102..b3c671f 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -123,7 +123,11 @@ class MemberDef : public Definition
bool isExplicit() const;
bool isMutable() const;
bool isGettable() const;
+ bool isPrivateGettable() const;
+ bool isProtectedGettable() const;
bool isSettable() const;
+ bool isPrivateSettable() const;
+ bool isProtectedSettable() const;
bool isReadable() const;
bool isWritable() const;
bool isAddable() const;
diff --git a/src/portable_c.c b/src/portable_c.c
index 05bb4bd..fb83b45 100644
--- a/src/portable_c.c
+++ b/src/portable_c.c
@@ -1,3 +1,9 @@
+#if defined(__APPLE__) || defined(macintosh)
+// define this before including iconv.h to avoid a mapping of
+// iconv_open and friends to libicon_open (done by mac ports),
+// while the symbols without 'lib' are linked from /usr/lib/libiconv
+#define LIBICONV_PLUG
+#endif
#include <iconv.h>
// These functions are implemented in a C file, because there are different
diff --git a/src/pre.l b/src/pre.l
index 6d818f3..f06cc98 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -886,8 +886,9 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
}
// PHASE 2: apply the macro function
- if (argCount==def->nargs ||
- (argCount>def->nargs && def->varArgs)) // matching parameters lists
+ if (argCount==def->nargs || // same number of arguments
+ (argCount>=def->nargs-1 && def->varArgs)) // variadic macro with at least as many
+ // params as the non-variadic part (see bug731985)
{
uint k=0;
// substitution of all formal arguments
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
index 0381c93..ee2ae3f 100644
--- a/src/printdocvisitor.h
+++ b/src/printdocvisitor.h
@@ -476,9 +476,10 @@ class PrintDocVisitor : public DocVisitor
printf("<image src=\"%s\" type=\"",img->name().data());
switch(img->type())
{
- case DocImage::Html: printf("html"); break;
- case DocImage::Latex: printf("latex"); break;
- case DocImage::Rtf: printf("rtf"); break;
+ case DocImage::Html: printf("html"); break;
+ case DocImage::Latex: printf("latex"); break;
+ case DocImage::Rtf: printf("rtf"); break;
+ case DocImage::DocBook: printf("docbook"); break;
}
printf("\" width=%s height=%s>\n",img->width().data(),img->height().data());
}
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index b90b5a8..0d17208 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -1653,7 +1653,7 @@ void RTFDocVisitor::writeDotFile(const QCString &fileName)
baseName=baseName.right(baseName.length()-i-1);
}
QCString outDir = Config_getString("RTF_OUTPUT");
- writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
+ writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP);
if (!m_lastIsPara) m_t << "\\par" << endl;
m_t << "{" << endl;
m_t << rtf_Style_Reset;
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 8699c4e..ccdadcf 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -2409,7 +2409,7 @@ void RTFGenerator::endDotGraph(const DotClassGraph &g)
newParagraph();
QCString fn =
- g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE);
+ g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE);
// display the file
t << "{" << endl;
@@ -2431,7 +2431,7 @@ void RTFGenerator::endInclDepGraph(const DotInclDepGraph &g)
{
newParagraph();
- QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"),
fileName,relPath,FALSE);
// display the file
@@ -2461,7 +2461,7 @@ void RTFGenerator::endCallGraph(const DotCallGraph &g)
{
newParagraph();
- QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"),
fileName,relPath,FALSE);
// display the file
@@ -2483,7 +2483,7 @@ void RTFGenerator::endDirDepGraph(const DotDirDeps &g)
{
newParagraph();
- QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"),
fileName,relPath,FALSE);
// display the file
diff --git a/src/scanner.l b/src/scanner.l
index 323dc65..50e3b18 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -6129,6 +6129,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
BEGIN(FindMembers);
}
}
+<CSAccessorDecl>"private "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::PrivateSettable; }
+<CSAccessorDecl>"protected "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::ProtectedSettable; }
+<CSAccessorDecl>"private "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::PrivateGettable; }
+<CSAccessorDecl>"protected "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::ProtectedGettable; }
<CSAccessorDecl>"set" { if (curlyCount==0) current->spec |= Entry::Settable; }
<CSAccessorDecl>"get" { if (curlyCount==0) current->spec |= Entry::Gettable; }
<CSAccessorDecl>"add" { if (curlyCount==0) current->spec |= Entry::Addable; }
@@ -6675,6 +6679,18 @@ static void parseCompounds(Entry *rt)
current = new Entry;
gstat = FALSE;
initEntry();
+
+ // deep copy group list from parent (see bug 727732)
+ if (rt->groups)
+ {
+ QListIterator<Grouping> gli(*rt->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ ce->groups->append(new Grouping(*g));
+ }
+ }
+
int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2;
// set default protection based on the compound type
if( ce->section==Entry::CLASS_SEC ) // class
diff --git a/src/tclscanner.l b/src/tclscanner.l
index 1fd20cd..88e3d1d 100644
--- a/src/tclscanner.l
+++ b/src/tclscanner.l
@@ -451,6 +451,7 @@ static struct
QList<Entry> entry; // list of all created entries, will be deleted after codifying
Protection protection; // current protections state
MemberDef *memberdef; // contain current MemberDef when codifying
+ bool collectXRefs;
} tcl;
// scanner functions
@@ -533,6 +534,24 @@ static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, Q
}
}
+//! Check name. Strip namespace qualifiers from name0 if inside inlined code segment.
+// @return 'ns' and 'name' of given current 'ns0' and 'name0'
+static void tcl_name_SnippetAware(const QCString &ns0, const QCString &name0, QCString &ns, QCString &name)
+{
+ // If we are inside an inlined code snippet then ns0
+ // already containes the complete namespace path.
+ // Any namespace qualifiers in name0 are redundant.
+ int i = name0.findRev("::");
+ if (i>=0 && tcl.memberdef)
+ {
+ tcl_name(ns0, name0.mid(i+2), ns, name);
+ }
+ else
+ {
+ tcl_name(ns0, name0, ns, name);
+ }
+}
+
// Check and return namespace entry.
// @return namespace entry
Entry* tcl_entry_namespace(const QCString ns)
@@ -713,6 +732,40 @@ static void tcl_codify_cmd(const char *s,int i)
{
tcl_codify(s,(*tcl.list_commandwords.at(i)).utf8());
}
+//! codify a string token
+//
+// codifies string according to type.
+// Starts a new scan context if needed (*myScan==0 and type == "script").
+// Returns NULL or the created scan context.
+//
+static tcl_scan *tcl_codify_token(tcl_scan *myScan, const QCString type, const QCString string)
+{
+ if (myScan != NULL)
+ {
+ if (type != NULL)
+ {
+ myScan->after << type << string;
+ }
+ else
+ {
+ myScan->after << "NULL" << string;
+ }
+ }
+ else
+ {
+ if (qstrcmp(type, "script") == 0)
+ {
+ myScan = tcl.scan.at(0);
+ myScan = tcl_scan_start('?', string,
+ myScan->ns, myScan->entry_cl, myScan->entry_fn);
+ }
+ else
+ {
+ tcl_codify((const char*)type, string);
+ }
+ }
+ return myScan;
+}
//-----------------------------------------------------------------------------
#undef YY_INPUT
@@ -1652,6 +1705,40 @@ static void tcl_codify_link(QCString name)
{
myDef->addSourceReferencedBy(tcl.memberdef);
tcl.memberdef->addSourceReferences(myDef);
+ } else {
+ Entry* callerEntry;
+ unsigned int i;
+ // walk the stack of scan contexts and find the enclosing method or proc
+ for (i=0;i<tcl.scan.count();i++)
+ {
+ callerEntry=tcl.scan.at(i)->entry_scan;
+ if (callerEntry->mtype==Method && !callerEntry->name.isEmpty())
+ {
+ break;
+ }
+ }
+ if (i<tcl.scan.count())
+ {
+ // enclosing method found
+ QCString callerName = callerEntry->name;
+ if (callerName.mid(0,2)=="::") // fully qualified global command
+ {
+ callerName = callerName.mid(2);
+ }
+ else
+ {
+ if (!(tcl.scan.at(0)->ns.stripWhiteSpace().isEmpty()))
+ {
+ callerName = tcl.scan.at(0)->ns + "::" + callerEntry->name;
+ }
+ }
+ MemberDef *callerDef=NULL;
+ callerDef = fn.find(callerName);
+ if (callerDef!=NULL && myDef!= NULL && tcl.collectXRefs)
+ {
+ addDocCrossReference(callerDef,myDef);
+ }
+ }
}
}
else if (tcl_keyword(myName)) // check keyword
@@ -1665,6 +1752,250 @@ static void tcl_codify_link(QCString name)
}
+//! scan general argument for brackets
+//
+// parses (*tcl.list_commandwords.at(i)).utf8() and checks for brackets.
+// Starts a new scan context if needed (*myScan==0 and brackets found).
+// Returns NULL or the created scan context.
+//
+static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOutermostBraces)
+{
+ QCString myName;
+ bool insideQuotes=false;
+ unsigned int insideBrackets=0;
+ unsigned int insideBraces=0;
+ myName = (*tcl.list_commandwords.at(i)).utf8();
+ if (i%2 != 0)
+ {
+ // handle white space
+ myScan = tcl_codify_token(myScan, "NULL", myName);
+ }
+ else
+ {
+ QCString myStr = "";
+ unsigned int j;
+ for (j=0;j<myName.length();j++)
+ {
+ QChar c = myName[j];
+ bool backslashed = false;
+ if (j>0)
+ {
+ backslashed = myName[j-1]=='\\';
+ }
+ // this is a state machine
+ // input is c
+ // internal state is myScan and insideXXX
+ // these are the transitions:
+ if (c=='[' && !backslashed && insideBraces==0)
+ {
+ insideBrackets++;
+ }
+ if (c==']' && !backslashed && insideBraces==0 && insideBrackets>0)
+ {
+ insideBrackets--;
+ }
+ if (c=='{' && !backslashed && !insideQuotes && !(ignoreOutermostBraces && j==0))
+ {
+ insideBraces++;
+ }
+ if (c=='}' && !backslashed && !insideQuotes && insideBraces>0)
+ {
+ insideBraces--;
+ }
+ if (c=='"' && !backslashed && insideBraces==0)
+ {
+ insideQuotes=!insideQuotes;
+ }
+ // all output, depending on state and input
+ if (c=='[' && !backslashed && insideBrackets==1 && insideBraces==0)
+ {
+ // the first opening bracket, output what we have so far
+ myStr+=c;
+ myScan = tcl_codify_token(myScan, "NULL", myStr);
+ myStr="";
+ }
+ else if (c==']' && !backslashed && insideBrackets==0 && insideBraces==0)
+ {
+ // the last closing bracket, start recursion, switch to deferred
+ myScan = tcl_codify_token(myScan, "script", myStr);
+ myStr="";
+ myStr+=c;
+ }
+ else
+ {
+ myStr+=c;
+ }
+ }
+ if (i == 0 && myScan == NULL)
+ {
+ tcl_codify_link(myStr);
+ }
+ else
+ {
+ myScan = tcl_codify_token(myScan, "NULL", myStr);
+ }
+ }
+ return (myScan);
+}
+
+//! Handle internal tcl commands.
+// "eval arg ?arg ...?"
+static void tcl_command_EVAL()
+{
+D
+ tcl_codify_cmd("keyword", 0);
+ tcl_scan *myScan = tcl.scan.at(0);
+ QCString myString = "";
+ // we simply rescan the line without the eval
+ // we include leading whitespace because tcl_scan_start will examine
+ // the first char. If it finds a bracket it will assume one expression in brackets.
+ // Example: eval [list set] [list NotInvoked] [Invoked NotInvoked]
+ for (unsigned int i = 1; i < tcl.list_commandwords.count(); i++)
+ {
+ myString += (*tcl.list_commandwords.at(i)).utf8();
+ }
+ myScan = tcl_scan_start('?', myString,
+ myScan->ns, myScan->entry_cl, myScan->entry_fn);
+}
+
+//! Handle internal tcl commands.
+// switch ?options? string pattern body ?pattern body ...?
+// switch ?options? string {pattern body ?pattern body ...?}
+static void tcl_command_SWITCH()
+{
+D
+ tcl_codify_cmd("keyword",0);
+ tcl_codify_cmd(NULL,1);
+ tcl_scan *myScan=NULL;
+ unsigned int i;
+ QCString token;
+ // first: find the last option token
+ unsigned int lastOptionIndex = 0;
+ for (i = 2; i<tcl.list_commandwords.count(); i += 2)
+ {
+ token = (*tcl.list_commandwords.at(i)).utf8();
+ if (token == "--")
+ {
+ lastOptionIndex = i;
+ break;
+ }
+ if (token[0] == '-' && i - lastOptionIndex == 2)
+ {
+ // options start with dash and should form a continuous chain
+ lastOptionIndex = i;
+ }
+ }
+ // second: eat up options
+ for (i = 2; i <= lastOptionIndex; i++)
+ {
+ myScan = tcl_command_ARG(myScan, i, false);
+ }
+ // third: how many tokens are left?
+ if (tcl.list_commandwords.count() - lastOptionIndex == 5)
+ {
+ //printf("syntax: switch ?options? string {pattern body ?pattern body ...?}\n");
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 3, false);
+ // walk trough the list step by step
+ // this way we can preserve whitespace
+ bool inBraces = false;
+ bool nextIsPattern = true;
+ int size;
+ const char *elem;
+ const char *next;
+ token = (*tcl.list_commandwords.at(lastOptionIndex + 4)).utf8();
+ if (token[0] == '{')
+ {
+ inBraces = true;
+ token = token.mid(1, token.length() - 2);
+ myScan = tcl_codify_token(myScan, "NULL", QCString("{"));
+ }
+ // ToDo: check if multibyte chars are handled correctly
+ while (token.length() > 0)
+ {
+ TclFindElement((const char*)token, token.length(), &elem, &next, &size, NULL);
+ //printf("%s\nstart=%d, elem=%d, next=%d, size=%d, brace=%d\n",
+ // (const char*) token, (const char*) token, elem, next, size, brace);
+ //
+ // handle leading whitespace/opening brace/double quotes
+ if (elem - token > 0)
+ {
+ myScan = tcl_codify_token(myScan, "NULL", token.left(elem - token));
+ }
+ // handle actual element without braces/double quotes
+ if (nextIsPattern)
+ {
+ myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token,size));
+ //printf("pattern=%s\n",(const char*) token.mid(elem - token, size));
+ }
+ else {
+ myScan = tcl_codify_token(myScan, "script", token.mid(elem - token, size));
+ //printf("script =%s\n", (const char*) token.mid(elem - token, size));
+ }
+ // handle trailing whitespace/closing brace/double quotes
+ if (next - elem - size > 0)
+ {
+ myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token + size, next - elem - size));
+ }
+ nextIsPattern = !nextIsPattern;
+ token = token.mid(next - token);
+ }
+ if (inBraces)
+ {
+ myScan = tcl_codify_token(myScan, "NULL", QCString("}"));
+ }
+ if (!nextIsPattern)
+ {
+ tcl_war("Invalid switch syntax: last token is not a list of even elements.\n");
+ //tcl_war("%s\n", tcl.list_commandwords.join(" ").ascii());
+ }
+ }
+ else if ((tcl.list_commandwords.count() - lastOptionIndex > 6) &&
+ ((tcl.list_commandwords.count() - lastOptionIndex-3) % 4 == 0))
+ {
+ //printf("detected: switch ?options? string pattern body ?pattern body ...?\n");
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
+ //printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2)).utf8());
+ for (i = lastOptionIndex + 3; i < tcl.list_commandwords.count(); i += 4)
+ {
+ myScan = tcl_command_ARG(myScan, i + 0, false); // whitespace
+ myScan = tcl_command_ARG(myScan, i + 1, false); // pattern
+ myScan = tcl_command_ARG(myScan, i + 2, false); // whitespace
+ myScan = tcl_codify_token(myScan, "script", (*tcl.list_commandwords.at(i+3)).utf8()); // script
+ //printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1)).utf8());
+ //printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3)).utf8());
+ }
+ }
+ else
+ {
+ // not properly detected syntax
+ tcl_war("Invalid switch syntax: %d options followed by %d tokens.\n",
+ lastOptionIndex / 2, (tcl.list_commandwords.count() - 1) / 2 - lastOptionIndex / 2);
+ for (i = lastOptionIndex + 1; i <= tcl.list_commandwords.count(); i++)
+ {
+ myScan = tcl_command_ARG(myScan, i, false);
+ }
+ }
+}
+
+//! Handle internal tcl commands.
+// "catch script ?resultVarName? ?optionsVarName?"
+static void tcl_command_CATCH()
+{
+D
+ tcl_codify_cmd("keyword", 0);
+ tcl_codify_cmd(NULL, 1);
+ tcl_scan *myScan = tcl.scan.at(0);
+ myScan = tcl_scan_start('?', *tcl.list_commandwords.at(2),
+ myScan->ns, myScan->entry_cl, myScan->entry_fn);
+ for (unsigned int i = 3; i < tcl.list_commandwords.count(); i++)
+ {
+ myScan = tcl_command_ARG(myScan, i, false);
+ }
+}
+
//! Handle internal tcl commands.
// "if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?"
static void tcl_command_IF(QStringList type)
@@ -1672,12 +2003,27 @@ static void tcl_command_IF(QStringList type)
D
tcl_codify_cmd("keyword",0);
tcl_codify_cmd(NULL,1);
- tcl_scan *myScan=tcl.scan.at(0);
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
+ tcl_scan *myScan = NULL;
+ myScan = tcl_command_ARG(myScan, 2, true);
for (unsigned int i = 3;i<tcl.list_commandwords.count();i++)
{
- myScan->after << type[i] << tcl.list_commandwords[i];
+ if (type[i] == "expr")
+ {
+ myScan = tcl_command_ARG(myScan, i, true);
+ }
+ else
+ {
+ if (myScan!=0)
+ {
+ myScan->after << type[i] << tcl.list_commandwords[i];
+ }
+ else
+ {
+ myScan=tcl.scan.at(0);
+ myScan = tcl_scan_start('?',*tcl.list_commandwords.at(i),
+ myScan->ns,myScan->entry_cl,myScan->entry_fn);
+ }
+ }
}
}
//! Handle internal tcl commands.
@@ -1691,7 +2037,7 @@ D
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
myScan->ns,myScan->entry_cl,myScan->entry_fn);
myScan->after << "NULL" << tcl.list_commandwords[3];
- myScan->after << "script" << tcl.list_commandwords[4];
+ myScan = tcl_command_ARG(myScan, 4, true);
myScan->after << "NULL" << tcl.list_commandwords[5];
myScan->after << "script" << tcl.list_commandwords[6];
myScan->after << "NULL" << tcl.list_commandwords[7];
@@ -1705,14 +2051,22 @@ static void tcl_command_FOREACH()
{
D
unsigned int i;
+ tcl_scan *myScan=NULL;
tcl_codify_cmd("keyword",0);
for (i = 1;i<tcl.list_commandwords.count()-1;i++)
{
- tcl_codify_cmd(NULL,i);
+ myScan = tcl_command_ARG(myScan, i, false);
+ }
+ if (myScan!=0)
+ {
+ myScan->after << "script" << tcl.list_commandwords[tcl.list_commandwords.count()-1];
+ }
+ else
+ {
+ myScan=tcl.scan.at(0);
+ myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1),
+ myScan->ns,myScan->entry_cl,myScan->entry_fn);
}
- tcl_scan *myScan=tcl.scan.at(0);
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
}
///! Handle internal tcl commands.
@@ -1722,68 +2076,29 @@ static void tcl_command_WHILE()
D
tcl_codify_cmd("keyword",0);
tcl_codify_cmd(NULL,1);
- tcl_scan *myScan=tcl.scan.at(0);
- myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
+ tcl_scan *myScan = NULL;
+ myScan = tcl_command_ARG(myScan, 2, true);
+ myScan = tcl_command_ARG(myScan, 3, false);
+ if (myScan!=0)
+ {
+ myScan->after << "script" << tcl.list_commandwords[4];
+ }
+ else
+ {
+ myScan=tcl.scan.at(0);
+ myScan = tcl_scan_start('?',*tcl.list_commandwords.at(4),
myScan->ns,myScan->entry_cl,myScan->entry_fn);
- myScan->after << "NULL" << tcl.list_commandwords[3];
- myScan->after << "script" << tcl.list_commandwords[4];
+ }
}
//! Handle all other commands.
// Create links of first command word or first command word inside [].
static void tcl_command_OTHER()
{
- if (tcl.code == NULL) return;
-D
- QCString myName;
+ tcl_scan *myScan=NULL;
for (unsigned int i=0; i< tcl.list_commandwords.count(); i++)
{
- myName = (*tcl.list_commandwords.at(i)).utf8();
- if (i==0)
- {
- tcl_codify_link(myName);
- }
- else if (i%2 != 0)
- {
- tcl_codify(NULL,myName);
- }
- else
- {
- QCString myStr="";
- int myCmd=0;
- unsigned int i;
- for (i=0;i<myName.length();i++)
- {
- QChar c = myName[i];
- if (myCmd)
- {
- if (c==' '||c=='\t'||c=='\n'||c==']')
- {//end of command
- tcl_codify_link(myStr);
- myStr="";
- myCmd=0;
- }
- myStr+=c;
- }
- else
- {
- myStr+=c;
- if (c=='[')
- {//start of command
- for (;i<myName.length();i++)
- {
- c = myName[i+1];
- if (c!=' ' && c!='\t' && c!='\n') break;
- myStr+=c;
- }
- tcl_codify(NULL,myStr);
- myStr="";
- myCmd=1;
- }
- }
- }
- tcl_codify(NULL,myStr);
- }
+ myScan = tcl_command_ARG(myScan, i, false);
}
}
@@ -1802,7 +2117,7 @@ D
tcl_codify_cmd(NULL,3);
tcl_codify_cmd(NULL,4);
tcl_codify_cmd(NULL,5);
- tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName);
+ tcl_name_SnippetAware(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName);
if (myNs.length())
{
myEntryNs = tcl_entry_namespace(myNs);
@@ -2060,15 +2375,62 @@ D
}
myEntryCl = tcl_entry_class(myName);
myStr = (*tcl.list_commandwords.at(4)).utf8();
- if (tcl.list_commandwords.count() > 5)
+ //
+ // special cases first
+ // oo::define classname method methodname args script
+ // oo::define classname constructor argList bodyScript
+ // oo::define classname destructor bodyScript
+ unsigned int n =tcl.list_commandwords.count();
+ if ((myStr == "method" && n == 11) ||
+ (myStr == "constructor" && n == 9) ||
+ (myStr == "destructor" && n == 7))
+ {
+ for (unsigned int i = 4; i < n-1; i++)
+ {
+ tcl_codify_cmd("NULL",i);
+ }
+ Entry *myEntry;
+ QCString myMethod;
+ tcl_name(myScan->ns,(*tcl.list_commandwords.at(n==11?6:4)).utf8(),myNs,myMethod);
+ // code snippet taken from tcl_command_METHOD()/tcl_command_CONSTRUCTOR
+ tcl.fn.remove(myMethod);
+ tcl.entry_current->section = Entry::FUNCTION_SEC;
+ tcl.entry_current->mtype = Method;
+ tcl.entry_current->name = myMethod;
+ tcl.entry_current->startLine = tcl.line_command;
+ tcl.entry_current->bodyLine = tcl.line_body0;
+ tcl.entry_current->endBodyLine = tcl.line_body1;
+ tcl_protection(tcl.entry_current);
+ if (n==11)
+ {
+ tcl_command_ARGLIST(*tcl.list_commandwords.at(8));
+ }
+ else if (n==9)
+ {
+ tcl_command_ARGLIST(*tcl.list_commandwords.at(6));
+ }
+ if (myEntryCl) myEntryCl->addSubEntry(tcl.entry_current);
+ tcl.fn.insert(myMethod,tcl.entry_current);
+ myEntry = tcl.entry_current;
+ myScan = tcl_scan_start('?',*tcl.list_commandwords.at(n-1),
+ myNs, myEntryCl, myEntry);
+ }
+ else
{
- for (uint i=5;i<tcl.list_commandwords.count();i++)
+ // The general case
+ // Simply concat all arguments into a script.
+ // Note: all documentation collected just before the
+ // oo::define command is lost
+ if (tcl.list_commandwords.count() > 5)
{
- myStr.append((*tcl.list_commandwords.at(i)).utf8());
+ for (uint i=5;i<tcl.list_commandwords.count();i++)
+ {
+ myStr.append((*tcl.list_commandwords.at(i)).utf8());
+ }
+ tcl.word_is=' ';
}
- tcl.word_is=' ';
+ myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL);
}
- myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL);
}
//! Handle \c variable statements.
@@ -2165,13 +2527,14 @@ tcl_inf("->\n");
// check command
QCString myStr = (*tcl.list_commandwords.at(0)).utf8();
+ tcl_scan *myScanBackup=tcl.scan.at(0);
int myLevel = 0;
Protection myProt = tcl.protection;
if (tcl.list_commandwords.count() < 3)
{
tcl_command_OTHER();
- goto command_text;
+ goto command_end;
}
// remove leading "::" and apply TCL_SUBST
if (myStr.left(2)=="::") myStr = myStr.mid(2);
@@ -2259,7 +2622,7 @@ tcl_inf("->\n");
goto command_end;
}
tcl_command_OTHER();
- goto command_text;
+ goto command_end;
}
if (myStr=="itcl::class")
{
@@ -2282,7 +2645,7 @@ tcl_inf("->\n");
goto command_end;
}
tcl_command_OTHER();
- goto command_text;
+ goto command_end;
}
if (myStr=="oo::define")
{
@@ -2296,7 +2659,7 @@ tcl_inf("->\n");
if (tcl.scan.at(0)->entry_fn == NULL)
{// only parsed outside functions
tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="");
- goto command_text;
+ goto command_end;
}
}
if (myStr=="common")
@@ -2305,7 +2668,7 @@ tcl_inf("->\n");
if (tcl.scan.at(0)->entry_fn == NULL)
{// only parsed outside functions
tcl_command_VARIABLE(0);
- goto command_text;
+ goto command_end;
}
}
if (myStr=="inherit" || myStr=="superclass")
@@ -2322,9 +2685,26 @@ tcl_inf("->\n");
}
/*
* Start of internal tcl keywords
- * Ready: if, for, foreach, while
- * TODO: switch, eval, ?
+ * Ready: switch, eval, catch, if, for, foreach, while
*/
+ if (myStr=="switch")
+ {
+ if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;}
+ tcl_command_SWITCH();
+ goto command_end;
+ }
+ if (myStr=="eval")
+ {
+ if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
+ tcl_command_EVAL();
+ goto command_end;
+ }
+ if (myStr=="catch")
+ {
+ if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
+ tcl_command_CATCH();
+ goto command_end;
+ }
if (myStr=="for")
{
if (tcl.list_commandwords.count() != 9) {myLine=__LINE__;goto command_warn;}
@@ -2343,7 +2723,7 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
if (myStr=="if" && tcl.list_commandwords.count() > 4)
{
QStringList myType;
- myType << "keyword" << "NULL" << "script" << "NULL";
+ myType << "keyword" << "NULL" << "expr" << "NULL";
char myState='x';// last word: e'x'pr 't'hen 'b'ody 'e'lse else'i'f..
for (unsigned int i = 4; i < tcl.list_commandwords.count(); i = i + 2)
{
@@ -2392,7 +2772,7 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
else if (myState=='i')
{
myState='x';
- myType << "script" << "NULL";
+ myType << "expr" << "NULL";
}
}
if (myState != 'b') {myLine=__LINE__;goto command_warn;}
@@ -2406,15 +2786,22 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
goto command_end;
}
tcl_command_OTHER();
- goto command_text;
+ goto command_end;
command_warn:// print warning message because of wrong used syntax
tcl_war("%d count=%d: %s\n",myLine,tcl.list_commandwords.count(),tcl.list_commandwords.join(" ").ascii());
tcl_command_OTHER();
- command_text:// print remaining text as comment
- if (!myText.isEmpty()) tcl_codify("comment",myText);
- myText = "";
command_end:// add remaining text to current context
- if (!myText.isEmpty()) tcl.scan.at(0)->after << "comment" << myText;
+ if (!myText.isEmpty())
+ {
+ if(myScanBackup==tcl.scan.at(0))
+ {
+ tcl_codify("comment",myText);
+ }
+ else
+ {
+ tcl.scan.at(0)->after << "comment" << myText;
+ }
+ }
tcl.list_commandwords.clear();
tcl.command = 0;
tcl.protection = myProt;
@@ -2634,6 +3021,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli
return;
}
tcl_init();
+ tcl.collectXRefs = collectXRefs;
tcl.memberdef = memberDef;
tcl.code = &codeOutIntf;
if (startLine<0)
diff --git a/src/util.cpp b/src/util.cpp
index fecf632..0113e62 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1798,8 +1798,9 @@ nextChar:
)
)
{
+ if (c=='\t') c=' ';
if (c=='*' || c=='&' || c=='@' || c=='$')
- {
+ {
//uint rl=result.length();
uint rl=growBuf.getPos();
if ((rl>0 && (isId(growBuf.at(rl-1)) || growBuf.at(rl-1)=='>')) &&
@@ -1827,8 +1828,8 @@ nextChar:
}
}
}
- //printf("removeRedundantWhiteSpace(`%s')=`%s'\n",s.data(),result.data());
growBuf.addChar(0);
+ //printf("removeRedundantWhiteSpace(`%s')=`%s'\n",s.data(),growBuf.get());
//result.resize(resultPos);
return growBuf.get();
}
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index f74a6a2..c36042b 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -678,9 +678,10 @@ void XmlDocVisitor::visitPre(DocImage *img)
m_t << "<image type=\"";
switch(img->type())
{
- case DocImage::Html: m_t << "html"; break;
- case DocImage::Latex: m_t << "latex"; break;
- case DocImage::Rtf: m_t << "rtf"; break;
+ case DocImage::Html: m_t << "html"; break;
+ case DocImage::Latex: m_t << "latex"; break;
+ case DocImage::Rtf: m_t << "rtf"; break;
+ case DocImage::DocBook: m_t << "docbook"; break;
}
m_t << "\"";
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index efddcd4..2bb5734 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -727,10 +727,26 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
if (md->isGettable()) t << "yes"; else t << "no";
t << "\"";
+ t << " privategettable=\"";
+ if (md->isPrivateGettable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " protectedgettable=\"";
+ if (md->isProtectedGettable()) t << "yes"; else t << "no";
+ t << "\"";
+
t << " settable=\"";
if (md->isSettable()) t << "yes"; else t << "no";
t << "\"";
+ t << " privatesettable=\"";
+ if (md->isPrivateSettable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " protectedsettable=\"";
+ if (md->isProtectedSettable()) t << "yes"; else t << "no";
+ t << "\"";
+
if (md->isAssign() || md->isCopy() || md->isRetain() || md->isStrong() || md->isWeak())
{
t << " accessor=\"";