diff options
Diffstat (limited to 'src')
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(); @@ -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<include "+pd->name()+">"); + 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)) { @@ -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 @@ -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=\""; |