Commit 3b8b750f authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.1.2-20000430

parent a790b4ae
DOXYGEN Version 1.1.2-20000423 DOXYGEN Version 1.1.2-20000430
CONTENTS CONTENTS
-------- --------
...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX: ...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have: 1. Unpack the archive, unless you already have:
gunzip doxygen-1.1.2-20000423.src.tar.gz # uncompress the archive gunzip doxygen-1.1.2-20000430.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.2-20000423.src.tar # unpack it tar xf doxygen-1.1.2-20000430.src.tar # unpack it
2. Run the configure script: 2. Run the configure script:
...@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at ...@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (23 April 2000) Dimitri van Heesch (30 April 2000)
DOXYGEN Version 1.1.2-20000423 DOXYGEN Version 1.1.2-20000430
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at ...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (23 April 2000) Dimitri van Heesch (30 April 2000)
1.1.2-20000423 1.1.2-20000430
...@@ -335,8 +335,17 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -335,8 +335,17 @@ static void substEnvVarsInStrList(QStrList &sl)
while (s) while (s)
{ {
QCString result(s); QCString result(s);
bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
substEnvVarsInString(result); substEnvVarsInString(result);
if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll
add to sl. If the orginal string already
contained multiple elements no splitting is done! */
{
int l=result.length(); int l=result.length();
int i,p=0; int i,p=0;
// skip spaces // skip spaces
...@@ -395,6 +404,11 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -395,6 +404,11 @@ static void substEnvVarsInStrList(QStrList &sl)
else // just removed last item else // just removed last item
s = 0; s = 0;
} }
else // just goto the next element in the list
{
s=sl.next();
}
}
} }
......
...@@ -21,9 +21,10 @@ ...@@ -21,9 +21,10 @@
#include <qfile.h> #include <qfile.h>
#include <qlist.h> #include <qlist.h>
#include <qdict.h> #include <qdict.h>
#include <qstringlist.h> #include <qstrlist.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
static QString spaces=" "; static QString spaces=" ";
...@@ -122,7 +123,9 @@ class ConfigOption ...@@ -122,7 +123,9 @@ class ConfigOption
stringToC(t,longDesc," t << \"# ","\\n\";"); stringToC(t,longDesc," t << \"# ","\\n\";");
t << " t << \"\\n\";" << endl; t << " t << \"\\n\";" << endl;
t << " }" << endl; t << " }" << endl;
t << " t << \"" << cfgName << " = \";" << endl; t << " t << \"" << cfgName;
t << spaces.left(22-cfgName.length());
t << "= \";" << endl;
t << " " << writeFunc << "(t,Config::" << varName << ");" << endl; t << " " << writeFunc << "(t,Config::" << varName << ");" << endl;
t << " t << \"\\n\";" << endl; t << " t << \"\\n\";" << endl;
} }
...@@ -406,9 +409,11 @@ class ConfigString : public ConfigOption ...@@ -406,9 +409,11 @@ class ConfigString : public ConfigOption
<< ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl;
if (m_values.count()>0) if (m_values.count()>0)
{ {
for ( QStringList::Iterator it = m_values.begin(); it != m_values.end(); ++it ) char *s = m_values.first();
while (s)
{ {
t << " " << varName << "->addValue(\"" << (*it) << "\");" << endl; t << " " << varName << "->addValue(\"" << s << "\");" << endl;
s = m_values.next();
} }
} }
} }
...@@ -434,7 +439,7 @@ class ConfigString : public ConfigOption ...@@ -434,7 +439,7 @@ class ConfigString : public ConfigOption
private: private:
ConfigInfo *m_parent; ConfigInfo *m_parent;
WidgetType m_widgetType; WidgetType m_widgetType;
QStringList m_values; QStrList m_values;
}; };
class ConfigInt : public ConfigOption class ConfigInt : public ConfigOption
......
...@@ -51,7 +51,7 @@ PageWidget::PageWidget( QTabWidget *parent, const char *name ) ...@@ -51,7 +51,7 @@ PageWidget::PageWidget( QTabWidget *parent, const char *name )
m_parent->addTab( this, name ); m_parent->addTab( this, name );
} }
void PageWidget::addStretch(int stretch=0) void PageWidget::addStretch(int stretch)
{ {
lay->addStretch(stretch); lay->addStretch(stretch);
//printf("Viewport SizeHint %d,%d\n",viewport()->sizeHint().width(),viewport()->sizeHint().height()); //printf("Viewport SizeHint %d,%d\n",viewport()->sizeHint().width(),viewport()->sizeHint().height());
......
...@@ -106,6 +106,7 @@ The special HTML characters entities that are recognized by Doxygen: ...@@ -106,6 +106,7 @@ The special HTML characters entities that are recognized by Doxygen:
writes a character with a circumflex accent (like &acirc;). writes a character with a circumflex accent (like &acirc;).
<li>\c &?tilde; where ? is one of {A,N,O,a,n,o}, <li>\c &?tilde; where ? is one of {A,N,O,a,n,o},
writes a character with a tilde accent (like &atilde;). writes a character with a tilde accent (like &atilde;).
<li>\c &szlig; write a sharp s (i.e. &szlig;) to the output.
</ul> </ul>
*/ */
......
...@@ -164,6 +164,18 @@ Here is a list of the languages and their current maintainers: ...@@ -164,6 +164,18 @@ Here is a list of the languages and their current maintainers:
snob@NOSPAM.int.spb.ru</a> snob@NOSPAM.int.spb.ru</a>
</TD> </TD>
</TR> </TR>
<TR BGCOLOR="#ffffff">
<TD>
Croatian
</TD>
<TD>
Boris Bralo
</TD>
<TD>
<a href="mailto:boris.bralo@NOSPAM.zg.tel.hr">
boris.bralo@NOSPAM.zg.tel.hr</a>
</TD>
</TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
<TD> <TD>
...@@ -205,9 +217,11 @@ Here is a list of the languages and their current maintainers: ...@@ -205,9 +217,11 @@ Here is a list of the languages and their current maintainers:
\hline \hline
Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} \\ Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} \\
\hline \hline
Finish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} \\ Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} \\
\hline
Russian & Nickolay Semyonov & {\tt snob@int.spb.ru} \\
\hline \hline
Russian & Vladimir Vodolazkiy & {\tt voldemarus@geocities.com} \\ Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} \\
\hline \hline
Dutch & Dimitri van Heesch & {\tt dimitri@stack.nl} \\ Dutch & Dimitri van Heesch & {\tt dimitri@stack.nl} \\
\hline \hline
......
Name: doxygen Name: doxygen
Version: 1.1.2-20000423 Version: 1.1.2-20000430
Summary: documentation system for C, C++ and IDL Summary: documentation system for C, C++ and IDL
Release: 1 Release: 1
Source0: doxygen-%{version}.src.tar.gz Source0: doxygen-%{version}.src.tar.gz
......
...@@ -774,9 +774,9 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -774,9 +774,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write detailed description // write detailed description
bool exampleFlag=hasExamples(); bool exampleFlag=hasExamples();
if (!briefDescription().isEmpty() || if ((!briefDescription().isEmpty() && Config::repeatBriefFlag) ||
!documentation().isEmpty() || !documentation().isEmpty() ||
(startBodyLine!=-1 && bodyDef) || /*(Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) ||*/
exampleFlag) exampleFlag)
{ {
ol.writeRuler(); ol.writeRuler();
...@@ -884,15 +884,15 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -884,15 +884,15 @@ void ClassDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name()); enumMembers.writeDocumentation(ol,name());
} }
enumValMembers.countDocMembers(); //enumValMembers.countDocMembers();
if (enumValMembers.totalCount()>0) //if (enumValMembers.totalCount()>0)
{ //{
ol.writeRuler(); // ol.writeRuler();
ol.startGroupHeader(); // ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation()); // parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader(); // ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name()); // enumValMembers.writeDocumentation(ol,name());
} //}
constructors.countDocMembers(); constructors.countDocMembers();
if (constructors.totalCount()>0) if (constructors.totalCount()>0)
......
...@@ -18,6 +18,9 @@ ...@@ -18,6 +18,9 @@
#include "classlist.h" #include "classlist.h"
#include "config.h" #include "config.h"
#include "util.h" #include "util.h"
#include "outputlist.h"
#include "language.h"
#include "scanner.h"
ClassList::ClassList() : QList<ClassDef>() ClassList::ClassList() : QList<ClassDef>()
{ {
...@@ -43,3 +46,59 @@ ClassListIterator::ClassListIterator(const ClassList &cllist) : ...@@ -43,3 +46,59 @@ ClassListIterator::ClassListIterator(const ClassList &cllist) :
QListIterator<ClassDef>(cllist) QListIterator<ClassDef>(cllist)
{ {
} }
void ClassList::writeDeclaration(OutputList &ol)
{
if (count()>0)
{
ClassDef *cd=first();
bool found=FALSE;
while (cd)
{
if (cd->name().find('@')==-1)
{
bool isLink = cd->isLinkable();
if (isLink || !Config::hideClassFlag)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
ol.startMemberItem(FALSE);
switch (cd->compoundType())
{
case ClassDef::Class: ol.writeString("class"); break;
case ClassDef::Struct: ol.writeString("struct"); break;
case ClassDef::Union: ol.writeString("union"); break;
case ClassDef::Interface: ol.writeString("interface"); break;
case ClassDef::Exception: ol.writeString("exception"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (isLink)
{
ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),
0,
cd->name()
);
}
else
{
ol.startBold();
ol.docify(cd->name());
ol.endBold();
}
ol.endMemberItem(FALSE);
}
}
cd=next();
}
if (found) ol.endMemberList();
}
}
...@@ -30,6 +30,7 @@ class ClassList : public QList<ClassDef> ...@@ -30,6 +30,7 @@ class ClassList : public QList<ClassDef>
~ClassList(); ~ClassList();
int compareItems(GCI item1,GCI item2); int compareItems(GCI item1,GCI item2);
void writeDeclaration(OutputList &ol);
}; };
class ClassListIterator : public QListIterator<ClassDef> class ClassListIterator : public QListIterator<ClassDef>
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include "outputlist.h" #include "outputlist.h"
#include "util.h" #include "util.h"
#define YY_NO_UNPUT
#define YY_NEVER_INTERACTIVE 1 #define YY_NEVER_INTERACTIVE 1
class CodeClassDef class CodeClassDef
...@@ -107,12 +106,17 @@ static QCString g_exampleFile; ...@@ -107,12 +106,17 @@ static QCString g_exampleFile;
static int g_anchorCount; static int g_anchorCount;
static FileDef * g_sourceFileDef; static FileDef * g_sourceFileDef;
static bool g_includeCodeFragment; static bool g_includeCodeFragment;
static const char * g_currentFontClass;
// start a new line of code, inserting a line number if g_sourceFileDef // start a new line of code, inserting a line number if g_sourceFileDef
// is TRUE. If a definition starts at the current line, then the line // is TRUE. If a definition starts at the current line, then the line
// number is linked to the documentation of that definition. // number is linked to the documentation of that definition.
static void startCodeLine(OutputList &ol) static void startCodeLine(OutputList &ol)
{ {
if (g_currentFontClass)
{
g_code->endFontClass();
}
if (g_sourceFileDef) if (g_sourceFileDef)
{ {
QCString lineNumber,lineAnchor; QCString lineNumber,lineAnchor;
...@@ -135,6 +139,10 @@ static void startCodeLine(OutputList &ol) ...@@ -135,6 +139,10 @@ static void startCodeLine(OutputList &ol)
} }
} }
ol.startCodeLine(); ol.startCodeLine();
if (g_currentFontClass)
{
g_code->startFontClass(g_currentFontClass);
}
} }
// write a code fragment `text' that may span multiple lines, inserting // write a code fragment `text' that may span multiple lines, inserting
...@@ -175,8 +183,7 @@ static void writeMultiLineCodeLink(OutputList &ol, ...@@ -175,8 +183,7 @@ static void writeMultiLineCodeLink(OutputList &ol,
const char *anchor,const char *text) const char *anchor,const char *text)
{ {
bool done=FALSE; bool done=FALSE;
QCString ts = text; char *p=(char *)text;
char *p=ts.data();
while (!done) while (!done)
{ {
char *sp=p; char *sp=p;
...@@ -226,7 +233,7 @@ static void setClassScope(const QCString &name) ...@@ -226,7 +233,7 @@ static void setClassScope(const QCString &name)
QCString n=name; QCString n=name;
n=n.simplifyWhiteSpace(); n=n.simplifyWhiteSpace();
int index; int index;
if ((index=n.find("::"))!=-1) if ((index=n.findRev("::"))!=-1)
g_classScope=n.left(index); g_classScope=n.left(index);
else else
g_classScope.resize(0); g_classScope.resize(0);
...@@ -238,12 +245,18 @@ static void addVariable() ...@@ -238,12 +245,18 @@ static void addVariable()
g_cvd.name=g_name.copy().simplifyWhiteSpace(); g_cvd.name=g_name.copy().simplifyWhiteSpace();
g_cvd.type=g_type.copy().simplifyWhiteSpace(); g_cvd.type=g_type.copy().simplifyWhiteSpace();
if (g_type.isEmpty()) if (g_type.isEmpty())
{
return; return;
else if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type])) }
else
{
//printf("adding variable `%s' `%s'\n",g_cvd.type.data(),g_cvd.name.data());
if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
{ {
g_cvd.classScope=g_classScope; g_cvd.classScope=g_classScope;
g_codeVarList.append(new CodeVarDef(g_cvd)); // add it to a list g_codeVarList.append(new CodeVarDef(g_cvd)); // add it to a list
} }
}
} }
static void addParameter() static void addParameter()
...@@ -251,20 +264,32 @@ static void addParameter() ...@@ -251,20 +264,32 @@ static void addParameter()
g_cvd.name=g_parmName.copy().simplifyWhiteSpace(); g_cvd.name=g_parmName.copy().simplifyWhiteSpace();
g_cvd.type=g_parmType.copy().simplifyWhiteSpace(); g_cvd.type=g_parmType.copy().simplifyWhiteSpace();
if (g_cvd.type.isEmpty()) if (g_cvd.type.isEmpty())
{
return; return;
else if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type])) }
else
{
//printf("adding parameter `%s' `%s'\n",g_cvd.type.data(),g_cvd.name.data());
if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
{ {
g_cvd.classScope=g_classScope; g_cvd.classScope=g_classScope;
g_codeParmList.append(new CodeVarDef(g_cvd)); // add it to a list g_codeParmList.append(new CodeVarDef(g_cvd)); // add it to a list
} }
}
} }
static void generateClassLink(OutputList &ol,char *clName) static void generateClassLink(OutputList &ol,char *clName,int *clNameLen=0)
{ {
int i=0;
QCString className=clName; QCString className=clName;
if (clNameLen) *clNameLen=0;
if (className.isEmpty()) return; if (className.isEmpty()) return;
ClassDef *cd; ClassDef *cd=getClass(className);
if ((cd=getClass(className)) && cd->isLinkable()) if (cd==0 && (i=className.find('<'))!=-1)
{
cd=getClass(className.left(i));
}
if (cd && cd->isLinkable())
{ {
if (g_exampleBlock) if (g_exampleBlock)
{ {
...@@ -285,12 +310,13 @@ static void generateClassLink(OutputList &ol,char *clName) ...@@ -285,12 +310,13 @@ static void generateClassLink(OutputList &ol,char *clName)
g_anchorCount++; g_anchorCount++;
} }
} }
//ol.writeCodeLink(cd->getReference(),cd->getOutputFileBase(),0,className);
writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,className); writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,className);
if (clNameLen) *clNameLen=className.length()-i-1;
} }
else else
{ {
codifyLines(clName); codifyLines(clName);
if (clNameLen) *clNameLen=className.length()-1;
} }
} }
...@@ -330,11 +356,9 @@ static bool getLink(const char *className, ...@@ -330,11 +356,9 @@ static bool getLink(const char *className,
Definition *d=0; Definition *d=0;
if (cd) d=cd; else if (cd) d=nd; else if (fd) d=fd; else d=gd; if (cd) d=cd; else if (cd) d=nd; else if (fd) d=fd; else d=gd;
if (d) if (d && d->isLinkable())
{ {
//printf("d->getOutputBase()=`%s' name=`%s'\n",d->getOutputFileBase().data(),md->name().data()); //printf("d->getOutputBase()=`%s' name=`%s'\n",d->getOutputFileBase().data(),md->name().data());
//result.writeCodeLink(d->getReference(),d->getOutputFileBase(),
// md->anchor(),text ? text : memberName);
writeMultiLineCodeLink(result,d->getReference(),d->getOutputFileBase(), writeMultiLineCodeLink(result,d->getReference(),d->getOutputFileBase(),
md->anchor(),text ? text : memberName); md->anchor(),text ? text : memberName);
return TRUE; return TRUE;
...@@ -413,7 +437,7 @@ static void generateMemberLink(OutputList &ol,const char *varName, ...@@ -413,7 +437,7 @@ static void generateMemberLink(OutputList &ol,const char *varName,
else else
{ {
ClassDef *vcd = getClass(g_classScope); ClassDef *vcd = getClass(g_classScope);
if (vcd) if (vcd && vcd->isLinkable())
{ {
//printf("Found class for variable `%s'\n",varName); //printf("Found class for variable `%s'\n",varName);
MemberName *vmn=memberNameDict[varName]; MemberName *vmn=memberNameDict[varName];
...@@ -427,7 +451,7 @@ static void generateMemberLink(OutputList &ol,const char *varName, ...@@ -427,7 +451,7 @@ static void generateMemberLink(OutputList &ol,const char *varName,
{ {
//printf("Found variable type=%s\n",vmd->typeString()); //printf("Found variable type=%s\n",vmd->typeString());
ClassDef *mcd=stripClassName(vmd->typeString()); ClassDef *mcd=stripClassName(vmd->typeString());
if (mcd) if (mcd && mcd->isLinkable())
{ {
MemberName *mmn=memberNameDict[memName]; MemberName *mmn=memberNameDict[memName];
if (mmn) if (mmn)
...@@ -438,8 +462,6 @@ static void generateMemberLink(OutputList &ol,const char *varName, ...@@ -438,8 +462,6 @@ static void generateMemberLink(OutputList &ol,const char *varName,
{ {
if (mmd->memberClass()==mcd) if (mmd->memberClass()==mcd)
{ {
//ol.writeCodeLink(mcd->getReference(),mcd->getOutputFileBase(),
// mmd->anchor(),memName);
writeMultiLineCodeLink(ol,mcd->getReference(), writeMultiLineCodeLink(ol,mcd->getReference(),
mcd->getOutputFileBase(),mmd->anchor(),memName); mcd->getOutputFileBase(),mmd->anchor(),memName);
return; return;
...@@ -519,6 +541,22 @@ static int countLines() ...@@ -519,6 +541,22 @@ static int countLines()
return count; return count;
} }
static void endFontClass()
{
if (g_currentFontClass)
{
g_code->endFontClass();
g_currentFontClass=0;
}
}
static void startFontClass(const char *s)
{
endFontClass();
g_code->startFontClass(s);
g_currentFontClass=s;
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
*/ */
#undef YY_INPUT #undef YY_INPUT
...@@ -541,6 +579,8 @@ B [ \t] ...@@ -541,6 +579,8 @@ B [ \t]
BN [ \t\n\r] BN [ \t\n\r]
ID [a-z_A-Z][a-z_A-Z0-9]* ID [a-z_A-Z][a-z_A-Z0-9]*
SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
KEYWORD ("asm"|"auto"|"break"|"case"|"catch"|"class"|"const_cast"|"continue"|"default"|"delete"|"do"|"dynamic_cast"|"else"|"enum"|"explicit"|"extern"|"false"|"for"|"friend"|"goto"|"if"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"return"|"sizeof"|"static"|"static_cast"|"struct"|"switch"|"template"|"this"|"throw"|"true"|"try"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"while")
TYPEKW ("bool"|"char"|"const"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t")
%option noyywrap %option noyywrap
...@@ -564,11 +604,14 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -564,11 +604,14 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
<*>\x0d <*>\x0d
<Body>^([ \t]*"#"[ \t]"include"[ \t]*)("<"|"\"") { <Body>^([ \t]*"#"[ \t]"include"[ \t]*)("<"|"\"") {
startFontClass("preprocessor");
g_code->codify(yytext); g_code->codify(yytext);
BEGIN( ReadInclude ); BEGIN( ReadInclude );
} }
<Body>("class"|"struct"|"union")[ \t\n]+ { <Body>("class"|"struct"|"union")[ \t\n]+ {
startFontClass("keyword");
codifyLines(yytext); codifyLines(yytext);
endFontClass();
//g_code->codify(yytext); //g_code->codify(yytext);
BEGIN( ClassName ); BEGIN( ClassName );
} }
...@@ -589,9 +632,11 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -589,9 +632,11 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
QCString text; QCString text;
text+=c; text+=c;
g_code->codify(text); g_code->codify(text);
endFontClass();
BEGIN( Body ); BEGIN( Body );
} }
<Body>^[ \t]*"#" { <Body>^[ \t]*"#" {
startFontClass("preprocessor");
g_code->codify(yytext); g_code->codify(yytext);
BEGIN( SkipCPP ) ; BEGIN( SkipCPP ) ;
} }
...@@ -603,6 +648,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -603,6 +648,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
} }
<SkipCPP>\n { <SkipCPP>\n {
codifyLines(yytext); codifyLines(yytext);
endFontClass();
BEGIN( Body ) ; BEGIN( Body ) ;
} }
<SkipCPP>"//" { <SkipCPP>"//" {
...@@ -653,17 +699,10 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -653,17 +699,10 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
} }
BEGIN( Body ); BEGIN( Body );
} }
<Bases>"virtual" { <Bases>"virtual"|"public"|"protected"|"private" {
g_code->codify(yytext); startFontClass("keyword");
}
<Bases>"public" {
g_code->codify(yytext);
}
<Bases>"protected" {
g_code->codify(yytext);
}
<Bases>"private" {
g_code->codify(yytext); g_code->codify(yytext);
endFontClass();
} }
<Bases>{ID} { <Bases>{ID} {
//printf("%s:addBase(%s)\n",g_ccd.name.data(),yytext); //printf("%s:addBase(%s)\n",g_ccd.name.data(),yytext);
...@@ -689,12 +728,24 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -689,12 +728,24 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
} }
<Body>("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*)/"(" { <Body>{KEYWORD}/([^a-z_A-Z0-9]) {
startFontClass("keyword");
codifyLines(yytext); codifyLines(yytext);
g_name.resize(0);g_type.resize(0); endFontClass();
}
<Body>{KEYWORD}/{B}* {
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
} }
<Body>("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*) { <Body>{KEYWORD}/{B}*"(" {
startFontClass("keyword");
codifyLines(yytext); codifyLines(yytext);
endFontClass();
g_name.resize(0);g_type.resize(0);
}
<Body>[\\|\)\+\-\/\%\~\!] {
g_code->codify(yytext);
g_name.resize(0);g_type.resize(0); g_name.resize(0);g_type.resize(0);
} }
/* /*
...@@ -704,7 +755,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -704,7 +755,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
name+=yytext; name+=yytext;
} }
*/ */
<Body>{SCOPENAME}/[ \t\n]* { <Body>{TYPEKW}/{B}* {
startFontClass("keyword");
g_code->codify(yytext);
endFontClass();
addType();
g_name+=yytext;
}
<Body>{SCOPENAME}{B}*"<"[^\}\{\(\)\/\n\>]*">"/{B}* {
int i;
generateClassLink(*g_code,yytext,&i);
addType();
QCString text=yytext;
g_name+=text.left(i);
}
<Body>{SCOPENAME}/{B}* {
generateClassLink(*g_code,yytext); generateClassLink(*g_code,yytext);
//codifyLines(yytext); //codifyLines(yytext);
addType(); addType();
...@@ -778,6 +843,13 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -778,6 +843,13 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
<Body>[0-9]+ { <Body>[0-9]+ {
g_code->codify(yytext); g_code->codify(yytext);
} }
<MemberCall2,FuncCall>({KEYWORD}|{TYPEKW})/([^a-z_A-Z0-9]) {
addParmType();
g_parmName=yytext;
startFontClass("keyword");
g_code->codify(yytext);
endFontClass();
}
<MemberCall2,FuncCall>[a-z_A-Z][:a-z_A-Z0-9]* { <MemberCall2,FuncCall>[a-z_A-Z][:a-z_A-Z0-9]* {
addParmType(); addParmType();
g_parmName=yytext; g_parmName=yytext;
...@@ -808,15 +880,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -808,15 +880,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
g_parmType.resize(0);g_parmName.resize(0); g_parmType.resize(0);g_parmName.resize(0);
BEGIN( Body ); BEGIN( Body );
} }
<MemberCall2,FuncCall>")"[ \t\n]*"{" { <MemberCall2,FuncCall>")"({BN}"const"|"volatile")*{BN}*"{" {
addParameter(); addParameter();
g_parmType.resize(0);g_parmName.resize(0); g_parmType.resize(0);g_parmName.resize(0);
if (g_name.find("::")!=-1) setClassScope(g_name); if (g_name.find("::")!=-1) setClassScope(g_name);
codifyLines(yytext); g_code->codify(")");
startFontClass("keyword");
yytext[yyleng-1]='\0';
codifyLines(yytext+1);
endFontClass();
g_code->codify("{");
g_curlyCount++; g_curlyCount++;
g_type.resize(0); g_name.resize(0); g_type.resize(0); g_name.resize(0);
BEGIN( Body ); BEGIN( Body );
} }
/*
<MemberCall2,FuncCall>")"[ \t\n]*":" { <MemberCall2,FuncCall>")"[ \t\n]*":" {
addParameter(); addParameter();
g_parmType.resize(0);g_parmName.resize(0); g_parmType.resize(0);g_parmName.resize(0);
...@@ -825,6 +903,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -825,6 +903,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
g_type.resize(0); g_name.resize(0); g_type.resize(0); g_name.resize(0);
BEGIN( SkipInits ); BEGIN( SkipInits );
} }
*/
<SkipInits>"{" { <SkipInits>"{" {
g_code->codify(yytext); g_code->codify(yytext);
g_curlyCount++; g_curlyCount++;
...@@ -861,13 +940,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -861,13 +940,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
} }
<SkipComment>[ \t]*"*/" { <SkipComment>[ \t]*"*/" {
g_code->codify(yytext); g_code->codify(yytext);
endFontClass();
BEGIN( g_lastCContext ) ; BEGIN( g_lastCContext ) ;
} }
<SkipCxxComment>.*/\n { <SkipCxxComment>[^\r\n]* {
//codifyLines(yytext);
g_code->codify(yytext); g_code->codify(yytext);
}
<SkipCxxComment>\r
<SkipCxxComment>\n {
unput('\n');
endFontClass();
BEGIN( g_lastCContext ) ; BEGIN( g_lastCContext ) ;
} }
<SkipCxxComment>. {
g_code->codify(yytext);
}
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*{B}*"/*"[*!]/[^/*] { <RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*{B}*"/*"[*!]/[^/*] {
g_yyLineNr+=QCString(yytext).contains('\n'); g_yyLineNr+=QCString(yytext).contains('\n');
} }
...@@ -899,7 +986,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -899,7 +986,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
} }
else else
{ {
startFontClass("comment");
codifyLines(yytext); codifyLines(yytext);
endFontClass();
} }
} }
<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment <*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
...@@ -914,7 +1003,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -914,7 +1003,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
} }
else else
{ {
startFontClass("comment");
codifyLines(yytext); codifyLines(yytext);
endFontClass();
} }
} }
<*>"//"[!/][^\n]*\n { // strip special one-line comment <*>"//"[!/][^\n]*\n { // strip special one-line comment
...@@ -925,7 +1016,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -925,7 +1016,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
} }
else else
{ {
startFontClass("comment");
codifyLines(yytext); codifyLines(yytext);
endFontClass();
} }
} }
<*>\n{B}*"/*"[!*]/[^/*] { <*>\n{B}*"/*"[!*]/[^/*] {
...@@ -938,6 +1031,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -938,6 +1031,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
else else
{ {
g_lastCContext = YY_START ; g_lastCContext = YY_START ;
startFontClass("comment");
codifyLines(yytext); codifyLines(yytext);
BEGIN(SkipComment); BEGIN(SkipComment);
} }
...@@ -951,6 +1045,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -951,6 +1045,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
else else
{ {
g_lastCContext = YY_START ; g_lastCContext = YY_START ;
startFontClass("comment");
g_code->codify(yytext); g_code->codify(yytext);
BEGIN(SkipComment); BEGIN(SkipComment);
} }
...@@ -964,21 +1059,26 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) ...@@ -964,21 +1059,26 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
else else
{ {
g_lastCContext = YY_START ; g_lastCContext = YY_START ;
startFontClass("comment");
g_code->codify(yytext); g_code->codify(yytext);
BEGIN(SkipComment); BEGIN(SkipComment);
} }
} }
<*>"/*"("!"?)"*/" { if (!Config::stripCommentsFlag) <*>"/*"("!"?)"*/" { if (!Config::stripCommentsFlag)
{ {
startFontClass("comment");
g_code->codify(yytext); g_code->codify(yytext);
endFontClass();
} }
} }
<*>"/*" { <*>"/*" {
startFontClass("comment");
g_code->codify(yytext); g_code->codify(yytext);
g_lastCContext = YY_START ; g_lastCContext = YY_START ;
BEGIN( SkipComment ) ; BEGIN( SkipComment ) ;
} }
<*>"//" { <*>"//" {
startFontClass("comment");
g_code->codify(yytext); g_code->codify(yytext);
g_lastCContext = YY_START ; g_lastCContext = YY_START ;
BEGIN( SkipCxxComment ) ; BEGIN( SkipCxxComment ) ;
...@@ -1025,6 +1125,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s, ...@@ -1025,6 +1125,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s,
if (s.isEmpty()) return; if (s.isEmpty()) return;
g_inputString = s; g_inputString = s;
g_inputPosition = 0; g_inputPosition = 0;
g_currentFontClass = 0;
if (endLine!=-1) if (endLine!=-1)
g_inputLines = endLine+1; g_inputLines = endLine+1;
else else
...@@ -1051,6 +1152,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s, ...@@ -1051,6 +1152,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s,
codeYYrestart( codeYYin ); codeYYrestart( codeYYin );
BEGIN( Body ); BEGIN( Body );
codeYYlex(); codeYYlex();
endFontClass();
//if (g_yyLineNr<=g_inputLines) code->endCodeLine(); //if (g_yyLineNr<=g_inputLines) code->endCodeLine();
ol+=*g_code; ol+=*g_code;
delete g_code; delete g_code;
......
...@@ -1808,8 +1808,17 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -1808,8 +1808,17 @@ static void substEnvVarsInStrList(QStrList &sl)
while (s) while (s)
{ {
QCString result(s); QCString result(s);
bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
substEnvVarsInString(result); substEnvVarsInString(result);
if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll
add to sl. If the orginal string already
contained multiple elements no splitting is done! */
{
int l=result.length(); int l=result.length();
int i,p=0; int i,p=0;
// skip spaces // skip spaces
...@@ -1868,6 +1877,11 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -1868,6 +1877,11 @@ static void substEnvVarsInStrList(QStrList &sl)
else // just removed last item else // just removed last item
s = 0; s = 0;
} }
else // just goto the next element in the list
{
s=sl.next();
}
}
} }
......
...@@ -56,7 +56,7 @@ static void addType() ...@@ -56,7 +56,7 @@ static void addType()
//printf("addType() type=`%s' scope=`%s' name=`%s'\n", //printf("addType() type=`%s' scope=`%s' name=`%s'\n",
// type.data(),scope.data(),name.data()); // type.data(),scope.data(),name.data());
if (name.isEmpty() && scope.isEmpty()) return; if (name.isEmpty() && scope.isEmpty()) return;
if (!type.isEmpty()) type+=' '; if (!type.isEmpty()) type+=" ";
if (!scope.isEmpty()) type+=scope+"::"; if (!scope.isEmpty()) type+=scope+"::";
type+=name; type+=name;
scope.resize(0); scope.resize(0);
......
...@@ -48,9 +48,12 @@ class Definition ...@@ -48,9 +48,12 @@ class Definition
/*! sets a new \a name for the definition */ /*! sets a new \a name for the definition */
void setName(const char *name) { n=name; } void setName(const char *name) { n=name; }
/*! sets the documentation of this definition to \a d. */ /*! sets the documentation of this definition to \a d. */
void setDocumentation(const char *d) void setDocumentation(const char *d,bool stripWhiteSpace=TRUE)
{ {
if (stripWhiteSpace)
doc=((QCString)d).stripWhiteSpace(); doc=((QCString)d).stripWhiteSpace();
else
doc=d;
} }
/*! sets the brief description of this definition to \a b. /*! sets the brief description of this definition to \a b.
* A dot is added to the sentence if not available. * A dot is added to the sentence if not available.
......
...@@ -196,7 +196,14 @@ DiagramItem::~DiagramItem() ...@@ -196,7 +196,14 @@ DiagramItem::~DiagramItem()
QCString DiagramItem::label() const QCString DiagramItem::label() const
{ {
return classDef->name()+templSpec; if (!templSpec.isEmpty())
{
return insertTemplateSpecifierInScope(classDef->name(),templSpec);
}
else
{
return classDef->name();
}
} }
QCString DiagramItem::fileName() const QCString DiagramItem::fileName() const
......
...@@ -277,6 +277,19 @@ void DotNode::deleteNode(DotNodeList &deletedList) ...@@ -277,6 +277,19 @@ void DotNode::deleteNode(DotNodeList &deletedList)
deletedList.append(this); deletedList.append(this);
} }
static QCString convertLabel(const QCString &l)
{
QCString result;
const char *p=l.data();
char c;
while ((c=*p++))
{
if (c=='\\') result+="\\\\";
else result+=c;
}
return result;
}
void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren) void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren)
{ {
const char *labCol = const char *labCol =
...@@ -284,7 +297,8 @@ void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren) ...@@ -284,7 +297,8 @@ void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren)
( (
(hasNonReachableChildren) ? "red" : "black" (hasNonReachableChildren) ? "red" : "black"
); );
t << " Node" << m_number << " [shape=\"box\",label=\"" << m_label t << " Node" << m_number << " [shape=\"box\",label=\""
<< convertLabel(m_label)
<< "\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\""; << "\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\"";
t << ",color=\"" << labCol << "\""; t << ",color=\"" << labCol << "\"";
if (m_isRoot) if (m_isRoot)
......
...@@ -258,7 +258,10 @@ void buildFileList(Entry *root) ...@@ -258,7 +258,10 @@ void buildFileList(Entry *root)
} }
else else
{ {
fd->setDocumentation(root->doc); // using FALSE in setDocumentation is small hack to make sure a file
// is documented even if a \file command is used without further
// documentation
fd->setDocumentation(root->doc,FALSE);
fd->setBriefDescription(root->brief); fd->setBriefDescription(root->brief);
fd->addSectionsToDefinition(root->anchors); fd->addSectionsToDefinition(root->anchors);
QListIterator<QCString> sli(*root->groups); QListIterator<QCString> sli(*root->groups);
...@@ -1729,12 +1732,13 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, ...@@ -1729,12 +1732,13 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
if (baseClassName!=root->name) // check for base class with the same name, if (baseClassName!=root->name) // check for base class with the same name,
// look in the outer scope for a match // look in the outer scope for a match
{ {
//printf("baseClass %s of %s found (%s and %s)\n", Debug::print(
// baseClassName.data(), Debug::Classes,0,"baseClass %s of %s found (%s and %s)\n",
// root->name.data(), baseClassName.data(),
// (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"), root->name.data(),
// (bi->virt==Normal)?"normal":"virtual" (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
// ); (bi->virt==Normal)?"normal":"virtual"
);
int i; int i;
QCString templSpec; QCString templSpec;
...@@ -1743,12 +1747,16 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, ...@@ -1743,12 +1747,16 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
{ {
// TODO: here we should try to find the correct template specialization // TODO: here we should try to find the correct template specialization
// but for now, we only look for the unspecializated base class. // but for now, we only look for the unspecializated base class.
templSpec=baseClassName.right(baseClassName.length()-i); int e = baseClassName.find('>');
baseClassName=baseClassName.left(i); if (e!=-1)
{
templSpec=baseClassName.mid(i,e-i+1);
baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e-1);
baseClass=getResolvedClass(baseClassName); baseClass=getResolvedClass(baseClassName);
//printf("baseClass=%p baseClass=%s templSpec=%s\n", //printf("baseClass=%p baseClass=%s templSpec=%s\n",
// baseClass,baseClassName.data(),templSpec.data()); // baseClass,baseClassName.data(),templSpec.data());
} }
}
bool found=baseClass!=0 && baseClass!=cd; bool found=baseClass!=0 && baseClass!=cd;
NamespaceDef *nd=cd->getNamespace(); NamespaceDef *nd=cd->getNamespace();
...@@ -1819,7 +1827,6 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, ...@@ -1819,7 +1827,6 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
} }
else else
{ {
//printf(">>> base class %s not found!\n",bi->name.data());
Debug::print(Debug::Classes,0," Base class `%s' not found\n",bi->name.data()); Debug::print(Debug::Classes,0," Base class `%s' not found\n",bi->name.data());
} }
} }
...@@ -2063,33 +2070,6 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, ...@@ -2063,33 +2070,6 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
} }
} }
//----------------------------------------------------------------------
static QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ)
{
QCString result=scope.copy();
if (!templ.isEmpty() && scope.find('<')==-1)
{
int si,pi=0;
while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ)
&& !getClass(scope.left(si)))
{ //printf("Tried `%s'\n",(scope.left(si)+templ).data());
pi=si+2;
}
if (si==-1) // not nested => append template specifier
{
result+=templ;
}
else // nested => insert template specifier before after first class name
{
result=scope.left(si) + templ + scope.right(scope.length()-si);
}
}
//printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n",
// scope.data(),templ.data(),result.data());
return result;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// find a class definition given the scope name and (optionally) a // find a class definition given the scope name and (optionally) a
// template list specifier // template list specifier
...@@ -2573,9 +2553,6 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2573,9 +2553,6 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
QCString fullFuncDecl=funcDecl.copy(); QCString fullFuncDecl=funcDecl.copy();
if (isFunc) fullFuncDecl+=argListToString(root->argList); if (isFunc) fullFuncDecl+=argListToString(root->argList);
//printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
//printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
// destructor => do backward class name substitution if needed // destructor => do backward class name substitution if needed
//if (!funcName.isEmpty() && funcName[0]=='~') //if (!funcName.isEmpty() && funcName[0]=='~')
// funcName="~"+resolveDefines(className); // funcName="~"+resolveDefines(className);
...@@ -3681,12 +3658,6 @@ void generateClassDocs() ...@@ -3681,12 +3658,6 @@ void generateClassDocs()
msg("Generating hierarchical class index...\n"); msg("Generating hierarchical class index...\n");
writeHierarchicalIndex(*outputList); writeHierarchicalIndex(*outputList);
//if (documentedIncludeFiles>0)
//{
// msg("Generating header index...\n");
// writeHeaderIndex(*outputList);
//}
msg("Generating member index...\n"); msg("Generating member index...\n");
writeMemberIndex(*outputList); writeMemberIndex(*outputList);
...@@ -3706,11 +3677,6 @@ void generateClassDocs() ...@@ -3706,11 +3677,6 @@ void generateClassDocs()
cd->writeDocumentation(*outputList); cd->writeDocumentation(*outputList);
cd->writeMemberList(*outputList); cd->writeMemberList(*outputList);
//DotGfxUsageGraph usageIntfGraph(cd,FALSE,1);
//usageIntfGraph.writeGraph(Config::htmlOutputDir,FALSE);
//if (Config::verbatimHeaderFlag) cd->writeIncludeFile(*outputList);
} }
} }
} }
...@@ -4262,12 +4228,13 @@ void generateSearchIndex() ...@@ -4262,12 +4228,13 @@ void generateSearchIndex()
err("Error: Cannot open file %s for writing\n",fileName.data()); err("Error: Cannot open file %s for writing\n",fileName.data());
} }
//outputList->generateExternalIndex(); //outputList->generateExternalIndex();
outputList->pushGeneratorState();
outputList->disableAllBut(OutputGenerator::Html); outputList->disableAllBut(OutputGenerator::Html);
startFile(*outputList,"header.html","Search Engine",TRUE); startFile(*outputList,"header.html","Search Engine",TRUE);
outputList->endPlainFile(); outputList->endPlainFile();
outputList->startPlainFile("footer.html"); outputList->startPlainFile("footer.html");
endFile(*outputList,TRUE); endFile(*outputList,TRUE);
outputList->enableAll(); outputList->popGeneratorState();
} }
} }
...@@ -5161,9 +5128,6 @@ int main(int argc,char **argv) ...@@ -5161,9 +5128,6 @@ int main(int argc,char **argv)
msg("Generating group documentation...\n"); msg("Generating group documentation...\n");
generateGroupDocs(); generateGroupDocs();
//msg("Generating member group documentation...\n");
//generateMemberGroupDocs();
msg("Generating namespace index...\n"); msg("Generating namespace index...\n");
generateNamespaceDocs(); generateNamespaceDocs();
...@@ -5186,6 +5150,7 @@ int main(int argc,char **argv) ...@@ -5186,6 +5150,7 @@ int main(int argc,char **argv)
generateSearchIndex(); generateSearchIndex();
msg("Generating style sheet...\n"); msg("Generating style sheet...\n");
//outputList->enable(OutputGenerator::Latex);
outputList->writeStyleInfo(0); // write first part outputList->writeStyleInfo(0); // write first part
outputList->disableAllBut(OutputGenerator::Latex); outputList->disableAllBut(OutputGenerator::Latex);
parseText(*outputList, parseText(*outputList,
......
...@@ -247,53 +247,8 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -247,53 +247,8 @@ void FileDef::writeDocumentation(OutputList &ol)
} }
if (found) ol.endMemberList(); if (found) ol.endMemberList();
} }
if (classList->count()>0)
{ classList->writeDeclaration(ol);
ClassDef *cd=classList->first();
bool found=FALSE;
while (cd)
{
if (cd->name().find('@')==-1)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
ol.startMemberItem(FALSE);
switch (cd->compoundType())
{
case ClassDef::Class: ol.writeString("class"); break;
case ClassDef::Struct: ol.writeString("struct"); break;
case ClassDef::Union: ol.writeString("union"); break;
case ClassDef::Interface: ol.writeString("interface"); break;
case ClassDef::Exception: ol.writeString("exception"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (cd->isLinkable())
{
ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),
0,
cd->name()
);
}
else
{
ol.startBold();
ol.docify(cd->name());
ol.endBold();
}
ol.endMemberItem(FALSE);
}
cd=classList->next();
}
if (found) ol.endMemberList();
}
/* write user defined member groups */ /* write user defined member groups */
MemberGroupListIterator mgli(*memberGroupList); MemberGroupListIterator mgli(*memberGroupList);
...@@ -309,8 +264,10 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -309,8 +264,10 @@ void FileDef::writeDocumentation(OutputList &ol)
//doc=doc.stripWhiteSpace(); //doc=doc.stripWhiteSpace();
//int bl=brief.length(); //int bl=brief.length();
//int dl=doc.length(); //int dl=doc.length();
if (!briefDescription().isEmpty() || !documentation().isEmpty() || if ((!briefDescription().isEmpty() && Config::repeatBriefFlag) ||
startBodyLine!=-1) !documentation().isEmpty()
/* || startBodyLine!=-1 */
)
{ {
ol.writeRuler(); ol.writeRuler();
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -395,15 +352,15 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -395,15 +352,15 @@ void FileDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name()); enumMembers.writeDocumentation(ol,name());
} }
enumValMembers.countDocMembers(); //enumValMembers.countDocMembers();
if (enumValMembers.totalCount()>0 ) //if (enumValMembers.totalCount()>0 )
{ //{
ol.writeRuler(); // ol.writeRuler();
ol.startGroupHeader(); // ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation()); // parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader(); // ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name()); // enumValMembers.writeDocumentation(ol,name());
} //}
funcMembers.countDocMembers(); funcMembers.countDocMembers();
if (funcMembers.totalCount()>0 ) if (funcMembers.totalCount()>0 )
......
...@@ -188,45 +188,9 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -188,45 +188,9 @@ void GroupDef::writeDocumentation(OutputList &ol)
} }
ol.endMemberList(); ol.endMemberList();
} }
if (classList->count()>0)
{ classList->writeDeclaration(ol);
ClassDef *cd=classList->first();
bool found=FALSE;
while (cd)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
QCString type;
switch (cd->compoundType())
{
case ClassDef::Class: type="class"; break;
case ClassDef::Struct: type="struct"; break;
case ClassDef::Union: type="union"; break;
case ClassDef::Interface: type="interface"; break;
case ClassDef::Exception: type="exception"; break;
}
ol.startMemberItem(0);
ol.docify(type);
ol.insertMemberAlign();
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
ol.endMemberItem(FALSE);
if (!cd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,0,0,cd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
cd=classList->next();
}
if (found) ol.endMemberList();
}
if (allMemberList->count()>0) if (allMemberList->count()>0)
{ {
/* write user defined member groups */ /* write user defined member groups */
...@@ -306,15 +270,15 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -306,15 +270,15 @@ void GroupDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name()); enumMembers.writeDocumentation(ol,name());
} }
enumValMembers.countDocMembers(); //enumValMembers.countDocMembers();
if (enumValMembers.totalCount()>0 ) //if (enumValMembers.totalCount()>0 )
{ //{
ol.writeRuler(); // ol.writeRuler();
ol.startGroupHeader(); // ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation()); // parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader(); // ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name()); // enumValMembers.writeDocumentation(ol,name());
} //}
funcMembers.countDocMembers(); funcMembers.countDocMembers();
if (funcMembers.totalCount()>0 ) if (funcMembers.totalCount()>0 )
......
...@@ -207,6 +207,9 @@ void HtmlGenerator::writeStyleInfo(int part) ...@@ -207,6 +207,9 @@ void HtmlGenerator::writeStyleInfo(int part)
t << "TD.md { background-color: #f2f2ff }" << endl; t << "TD.md { background-color: #f2f2ff }" << endl;
t << "DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold }" << endl; t << "DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold }" << endl;
t << "DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller }" << endl; t << "DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller }" << endl;
t << "FONT.keyword { color: #008000 }" << endl;
t << "FONT.comment { color: #800000 }" << endl;
t << "FONT.preprocessor { color: #806020 }" << endl;
//t << "TD.groupLine { background-color: #3080ff }" << endl; //t << "TD.groupLine { background-color: #3080ff }" << endl;
t << endl; t << endl;
endPlainFile(); endPlainFile();
......
...@@ -227,6 +227,9 @@ class HtmlGenerator : public OutputGenerator ...@@ -227,6 +227,9 @@ class HtmlGenerator : public OutputGenerator
void startParameter(bool first); void startParameter(bool first);
void endParameter(bool last); void endParameter(bool last);
void startFontClass(const char *s) { t << "<font class=\"" << s << "\">"; }
void endFontClass() { t << "</font>"; }
private: private:
QCString header; QCString header;
QCString footer; QCString footer;
......
...@@ -828,15 +828,16 @@ void writeAlphabeticalClassList(OutputList &ol) ...@@ -828,15 +828,16 @@ void writeAlphabeticalClassList(OutputList &ol)
void writeAlphabeticalIndex(OutputList &ol) void writeAlphabeticalIndex(OutputList &ol)
{ {
ol.disableAllBut(OutputGenerator::Html);
if (annotatedClasses==0) return; if (annotatedClasses==0) return;
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
startFile(ol,"classes.html","Alphabetical index"); startFile(ol,"classes.html","Alphabetical index");
startTitle(ol,0); startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trCompoundIndex()); parseText(ol,Config::projectName+" "+theTranslator->trCompoundIndex());
endTitle(ol,0,0); endTitle(ol,0,0);
writeAlphabeticalClassList(ol); writeAlphabeticalClassList(ol);
endFile(ol); endFile(ol);
ol.enableAll(); ol.popGeneratorState();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "translator_es.h" #include "translator_es.h"
#include "translator_fi.h" #include "translator_fi.h"
#include "translator_ru.h" #include "translator_ru.h"
#include "translator_hr.h"
#endif #endif
#define L_EQUAL(a) !stricmp(langName,a) #define L_EQUAL(a) !stricmp(langName,a)
...@@ -80,6 +81,10 @@ bool setTranslator(const char *langName) ...@@ -80,6 +81,10 @@ bool setTranslator(const char *langName)
{ {
theTranslator=new TranslatorRussian; theTranslator=new TranslatorRussian;
} }
else if (L_EQUAL("croatian"))
{
theTranslator=new TranslatorCroatian;
}
#endif #endif
else // use the default language (i.e. english) else // use the default language (i.e. english)
{ {
......
...@@ -195,7 +195,11 @@ void LatexGenerator::startIndexSection(IndexSections is) ...@@ -195,7 +195,11 @@ void LatexGenerator::startIndexSection(IndexSections is)
{ {
if (theTranslator->latexBabelPackage()=="russian") if (theTranslator->latexBabelPackage()=="russian")
{ {
t << "\\usepackage{inputenc}\n"; #if defined(_WIN32)
t << "\\usepackage[cp1251]{inputenc}\n";
#else
t << "\\usepackage[koi8-r]{inputenc}\n";
#endif
} }
t << "\\usepackage[" << theTranslator->latexBabelPackage() << "]{babel}\n"; t << "\\usepackage[" << theTranslator->latexBabelPackage() << "]{babel}\n";
} }
......
...@@ -222,6 +222,9 @@ class LatexGenerator : public OutputGenerator ...@@ -222,6 +222,9 @@ class LatexGenerator : public OutputGenerator
void startParameter(bool) {} void startParameter(bool) {}
void endParameter(bool) {} void endParameter(bool) {}
void startFontClass(const char *) {}
void endFontClass() {}
private: private:
LatexGenerator(const LatexGenerator &); LatexGenerator(const LatexGenerator &);
LatexGenerator &operator=(const LatexGenerator &); LatexGenerator &operator=(const LatexGenerator &);
......
...@@ -209,6 +209,9 @@ class ManGenerator : public OutputGenerator ...@@ -209,6 +209,9 @@ class ManGenerator : public OutputGenerator
void startParameter(bool) {} void startParameter(bool) {}
void endParameter(bool) {} void endParameter(bool) {}
void startFontClass(const char *) {}
void endFontClass() {}
private: private:
bool firstCol; bool firstCol;
bool paragraph; bool paragraph;
......
...@@ -259,6 +259,7 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e, ...@@ -259,6 +259,7 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
annMemb=0; annMemb=0;
annUsed=FALSE; annUsed=FALSE;
annShown=FALSE; annShown=FALSE;
annEnumType=0;
indDepth=0; indDepth=0;
section=0; section=0;
docEnumValues=FALSE; docEnumValues=FALSE;
...@@ -463,7 +464,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -463,7 +464,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
// name().data(),cd->name().data(),annScope,annMemb); // name().data(),cd->name().data(),annScope,annMemb);
//} //}
// hide members in annonymous scopes // hide members in anonymous scopes
// (they are displayed by there parent placeholder) // (they are displayed by there parent placeholder)
if (annScope) return; if (annScope) return;
// hide undocumented members unless overwritten by the configuration // hide undocumented members unless overwritten by the configuration
...@@ -535,16 +536,16 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -535,16 +536,16 @@ void MemberDef::writeDeclaration(OutputList &ol,
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag; bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance(); if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
// search for the last annonymous scope in the member type // search for the last anonymous scope in the member type
ClassDef *annoClassDef=0; ClassDef *annoClassDef=0;
//while (i!=-1 && cname.find(type.mid(i,l))!=-1) //while (i!=-1 && cname.find(type.mid(i,l))!=-1)
//{ //{
// i=r.match(type,i+l,&l); // i=r.match(type,i+l,&l);
//} //}
int il=i-1,ir=i+l; int il=i-1,ir=i+l;
if (i!=-1) // found annonymous scope in type if (i!=-1) // found anonymous scope in type
{ {
// extract annonymous scope // extract anonymous scope
while (il>=0 && (isId(type.at(il)) || type.at(il)==':' || type.at(il)=='@')) il--; while (il>=0 && (isId(type.at(il)) || type.at(il)==':' || type.at(il)=='@')) il--;
if (il>0) il++; if (il>0) il++;
while (ir<(int)type.length() && (isId(type.at(ir)) || type.at(ir)==':' || type.at(ir)=='@')) ir++; while (ir<(int)type.length() && (isId(type.at(ir)) || type.at(ir)==':' || type.at(ir)=='@')) ir++;
...@@ -569,7 +570,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -569,7 +570,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
} }
// start a new member declaration // start a new member declaration
ol.startMemberItem(/* gId!=-1,*/(annoClassDef || annMemb) ? 1 : 0); ol.startMemberItem((annoClassDef || annMemb || annEnumType) ? 1 : 0);
// If there is no detailed description we need to write the anchor here. // If there is no detailed description we need to write the anchor here.
bool detailsVisible = detailsAreVisible(); bool detailsVisible = detailsAreVisible();
...@@ -605,12 +606,12 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -605,12 +606,12 @@ void MemberDef::writeDeclaration(OutputList &ol,
writeTemplatePrefix(ol,tArgList,FALSE); writeTemplatePrefix(ol,tArgList,FALSE);
} }
if (i!=-1) // render member with annonymous componound as result type. if (i!=-1) // member has an anonymous type
{ {
//printf("annoClassDef=%p annMemb=%p scopeName=`%s' annonymous=`%s'\n", //printf("annoClassDef=%p annMemb=%p scopeName=`%s' anonymous=`%s'\n",
// annoClassDef,annMemb,cname.data(),type.mid(i,l).data()); // annoClassDef,annMemb,cname.data(),type.mid(i,l).data());
if (annoClassDef) if (annoClassDef) // type is an anonymous compound
{ {
//printf("class found!\n"); //printf("class found!\n");
annoClassDef->writeDeclaration(ol,annMemb,inGroup); annoClassDef->writeDeclaration(ol,annMemb,inGroup);
...@@ -632,11 +633,20 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -632,11 +633,20 @@ void MemberDef::writeDeclaration(OutputList &ol,
} }
} }
else else
{
if (getAnonymousEnumType()) // type is an anonymous enum
{
linkifyText(ol,cname,name(),type.left(i),TRUE);
ol+=*getAnonymousEnumType()->enumDecl();
linkifyText(ol,cname,name(),type.right(type.length()-i-l),TRUE);
}
else
{ {
type = type.left(i) + " { ... } " + type.right(type.length()-i-l); type = type.left(i) + " { ... } " + type.right(type.length()-i-l);
linkifyText(ol,cname,name(),type,TRUE); linkifyText(ol,cname,name(),type,TRUE);
} }
} }
}
else else
{ {
linkifyText(ol,cname,name(),type,TRUE); linkifyText(ol,cname,name(),type,TRUE);
...@@ -749,7 +759,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -749,7 +759,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.endDoxyAnchor(); ol.endDoxyAnchor();
} }
ol.endMemberItem(annoClassDef!=0 && indDepth==0); ol.endMemberItem((annoClassDef!=0 && indDepth==0) || annEnumType);
//ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb); //ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb);
// write brief description // write brief description
...@@ -775,7 +785,9 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -775,7 +785,9 @@ void MemberDef::writeDeclaration(OutputList &ol,
warnIfUndocumented(); warnIfUndocumented();
} }
/*! Writes the "detailed documentation" section of this member to
* all active output formats.
*/
void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
const char *scopeName) const char *scopeName)
{ {
...@@ -783,37 +795,52 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -783,37 +795,52 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
bool hasDocs = detailsAreVisible(); bool hasDocs = detailsAreVisible();
//printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition()); //printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition());
if ( if (
(/*memberType()==m &&*/ // filter member type Config::extractAllFlag || hasDocs
(Config::extractAllFlag || hasDocs) || /* member is part of an anonymous scope that is the type of
/*&& groupId()==-1 */ // not in a group
) || /* member is part of an annonymous scope that is the type of
* another member in the list. * another member in the list.
*/ */
(!hasDocs && !briefDescription().isEmpty() && annUsed) (!hasDocs && !briefDescription().isEmpty() && annUsed)
) )
{ {
// get definition. TODO: make a method of this
NamespaceDef *nd=getNamespace(); NamespaceDef *nd=getNamespace();
ClassDef *cd=memberClass(); ClassDef *cd=memberClass();
FileDef *fd=getFileDef(); FileDef *fd=getFileDef();
Definition *d = 0; Definition *d = 0;
if (cd) d=cd; else if (nd) d=nd; else d=fd; if (cd) d=cd; else if (nd) d=nd; else d=fd;
ASSERT(d!=0);
QCString cname = d->name(); QCString cname = d->name();
QCString cfname = d->getOutputFileBase(); QCString cfname = d->getOutputFileBase();
// get member name // get member name
QCString doxyName=name().copy(); QCString doxyName=name().copy();
// prepend scope if there is any // prepend scope if there is any. TODO: make this optional for C only docs
if (scopeName) doxyName.prepend((QCString)scopeName+"::"); if (scopeName) doxyName.prepend((QCString)scopeName+"::");
QCString def = definition(); QCString def = definition();
if (isEnumerate()) def.prepend("enum "); if (isEnumerate())
MemberDef *smd; {
if (isEnumValue() && def[0]=='@') def = def.right(def.length()-2); if (name().at(0)=='@')
int i=0,l,dummy; {
def = "anonymous enum";
}
else
{
def.prepend("enum ");
}
}
int i=0,l;
static QRegExp r("@[0-9]+"); static QRegExp r("@[0-9]+");
if (isEnumerate() && r.match(def,0,&l)!=-1) return;
if (isEnumValue() && (smd = getEnumScope()) //ENUM
&& r.match(smd->name(),0,&dummy)==-1) return; if (isEnumValue()) return;
//if (isEnumValue() && def[0]=='@') def = def.right(def.length()-2);
//int dummy;
//if (isEnumerate() && r.match(def,0,&l)!=-1) return;
//MemberDef *smd;
//if (isEnumValue() && (smd = getEnumScope())
// && r.match(smd->name(),0,&dummy)==-1) return;
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -823,7 +850,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -823,7 +850,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if ((isVariable() || isTypedef()) && (i=r.match(def,0,&l))!=-1) if ((isVariable() || isTypedef()) && (i=r.match(def,0,&l))!=-1)
{ {
// find enum type an insert it in the definition // find enum type and insert it in the definition
MemberListIterator vmli(*ml); MemberListIterator vmli(*ml);
MemberDef *vmd; MemberDef *vmd;
bool found=FALSE; bool found=FALSE;
...@@ -840,7 +867,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -840,7 +867,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
linkifyText(ol,scopeName,name(),def.left(i)); linkifyText(ol,scopeName,name(),def.left(i));
ol+=*vmd->enumDecl(); ol+=*vmd->enumDecl();
linkifyText(ol,scopeName,name(),def.right(def.length()-i-l)); linkifyText(ol,scopeName,name(),def.right(def.length()-i-l));
//ol.endDoxyAnchor();
found=TRUE; found=TRUE;
} }
...@@ -854,7 +880,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -854,7 +880,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
{ {
htmlHelp->addIndexItem(cname,name(),cfname,anchor()); htmlHelp->addIndexItem(cname,name(),cfname,anchor());
} }
// strip annonymous compound names from definition // strip anonymous compound names from definition
int si=def.find(' '),pi,ei=i+l; int si=def.find(' '),pi,ei=i+l;
if (si==-1) si=0; if (si==-1) si=0;
while ((pi=r.match(def,i+l,&l))!=-1) ei=i=pi+l; while ((pi=r.match(def,i+l,&l))!=-1) ei=i=pi+l;
...@@ -1329,6 +1355,7 @@ bool MemberDef::detailsAreVisible() const ...@@ -1329,6 +1355,7 @@ bool MemberDef::detailsAreVisible() const
void MemberDef::setEnumDecl(OutputList &ed) void MemberDef::setEnumDecl(OutputList &ed)
{ {
enumDeclList=new OutputList(&ed); enumDeclList=new OutputList(&ed);
*enumDeclList+=ed;
} }
bool MemberDef::hasDocumentation() bool MemberDef::hasDocumentation()
......
...@@ -133,6 +133,8 @@ class MemberDef : public Definition ...@@ -133,6 +133,8 @@ class MemberDef : public Definition
MemberList *enumFieldList() { return enumFields; } MemberList *enumFieldList() { return enumFields; }
void setDocumentedEnumValues(bool value) { docEnumValues=value; } void setDocumentedEnumValues(bool value) { docEnumValues=value; }
bool hasDocumentedEnumValues() const { return docEnumValues; } bool hasDocumentedEnumValues() const { return docEnumValues; }
void setAnonymousEnumType(MemberDef *md) { annEnumType = md; }
MemberDef *getAnonymousEnumType() { return annEnumType; }
// example related members // example related members
bool addExample(const char *anchor,const char *name,const char *file); bool addExample(const char *anchor,const char *name,const char *file);
...@@ -199,6 +201,7 @@ class MemberDef : public Definition ...@@ -199,6 +201,7 @@ class MemberDef : public Definition
FileDef *fileDec; // member of file declaration FileDef *fileDec; // member of file declaration
MemberDef *redefines; // the member that is redefined by this one MemberDef *redefines; // the member that is redefined by this one
MemberDef *enumScope; // the enclosing scope, if this is an enum field MemberDef *enumScope; // the enclosing scope, if this is an enum field
MemberDef *annEnumType; // the annonymous enum that is the type of this member
MemberList *redefinedBy; // the list of members that redefine this one MemberList *redefinedBy; // the list of members that redefine this one
MemberDef *memDef; // member definition for this declaration MemberDef *memDef; // member definition for this declaration
MemberDef *memDec; // member declaration for this definition MemberDef *memDec; // member declaration for this definition
......
...@@ -304,19 +304,25 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -304,19 +304,25 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.startMemberList(); ol.startMemberList();
} }
MemberListIterator mli(*this); MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli ) for ( ; (md=mli.current()) ; ++mli ) // iterate through the members
{ {
// see if member is hidden by protection
if (md->protection()==Private && !Config::extractPrivateFlag) continue; if (md->protection()==Private && !Config::extractPrivateFlag) continue;
/*bool hasDocs=md->hasDocumentation();*/
QCString type=md->typeString(); QCString type=md->typeString();
type=type.stripWhiteSpace(); type=type.stripWhiteSpace(); // TODO: is this really needed?
// filter out enums that are in a group iff inGroup holds
if (md->isEnumerate() && inGroup==(md->getMemberGroup()!=0) /*&& (hasDocs || !Config::hideMemberFlag)*/) if (md->isEnumerate() && inGroup==(md->getMemberGroup()!=0) /*&& (hasDocs || !Config::hideMemberFlag)*/)
{ {
if (!Config::hideMemberFlag || // do not hide undocumented members or // filter out invisible enums
if ( !Config::hideMemberFlag || // do not hide undocumented members or
!md->documentation().isEmpty() || // member has detailed descr. or !md->documentation().isEmpty() || // member has detailed descr. or
md->hasDocumentedEnumValues() || // member has documented enum vales. md->hasDocumentedEnumValues() || // member has documented enum vales.
Config::briefMemDescFlag || // brief descr. is shown or (
Config::repeatBriefFlag // brief descr. is repeated. !md->briefDescription().isEmpty() &&
Config::briefMemDescFlag // brief descr. is shown or
)
) )
{ {
OutputList typeDecl(&ol); OutputList typeDecl(&ol);
...@@ -325,15 +331,6 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -325,15 +331,6 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (i!=-1) name=name.right(name.length()-i-2); // strip scope if (i!=-1) name=name.right(name.length()-i-2); // strip scope
if (name[0]!='@') // not an anonymous enum if (name[0]!='@') // not an anonymous enum
{ {
//if (Config::extractAllFlag ||
// (md->briefDescription().isEmpty() || !Config::briefMemDescFlag) &&
// (!md->documentation().isEmpty() || md->hasDocumentedEnumValues() ||
// (!md->briefDescription().isEmpty() &&
// !Config::briefMemDescFlag &&
// Config::repeatBriefFlag
// )
// )
// )
if (md->isLinkableInProject() || md->hasDocumentedEnumValues()) if (md->isLinkableInProject() || md->hasDocumentedEnumValues())
{ {
if (!Config::genTagFile.isEmpty()) if (!Config::genTagFile.isEmpty())
...@@ -400,23 +397,29 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -400,23 +397,29 @@ void MemberList::writePlainDeclarations(OutputList &ol,
for ( ; (vmd=vmli.current()) ; ++vmli) for ( ; (vmd=vmli.current()) ; ++vmli)
{ {
QCString vtype=vmd->typeString(); QCString vtype=vmd->typeString();
if ((vtype.find(name))!=-1) enumVars++; if ((vtype.find(name))!=-1)
{
enumVars++;
vmd->setAnonymousEnumType(md);
}
} }
} }
if (enumVars==0) // no variable of this enum type // if this is an annoymous enum and there are variable of this
// enum type (i.e. enumVars>0), then we do not show the enum here.
if (enumVars==0) // show enum here
{ {
ol.startMemberItem(0); ol.startMemberItem(0);
ol.writeString("enum "); ol.writeString("enum ");
ol.insertMemberAlign(); ol.insertMemberAlign();
ol+=typeDecl; ol+=typeDecl; // append the enum values.
ol.endMemberItem(FALSE); ol.endMemberItem(FALSE);
//QCString brief=md->briefDescription();
//brief=brief.stripWhiteSpace();
if (!md->briefDescription().isEmpty() && Config::briefMemDescFlag) if (!md->briefDescription().isEmpty() && Config::briefMemDescFlag)
{ {
ol.startMemberDescription(); ol.startMemberDescription();
parseDoc(ol,cd?cd->name().data():0, parseDoc(ol,
md->name().data(),md->briefDescription()); cd?cd->name().data():0,md->name().data(),
md->briefDescription()
);
if (!md->documentation().isEmpty() || md->hasDocumentedEnumValues()) if (!md->documentation().isEmpty() || md->hasDocumentedEnumValues())
{ {
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
...@@ -429,9 +432,6 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -429,9 +432,6 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.enableAll(); ol.enableAll();
} }
ol.endMemberDescription(); ol.endMemberDescription();
//ol.disable(OutputGenerator::Man);
//ol.newParagraph();
//ol.enable(OutputGenerator::Man);
} }
} }
md->warnIfUndocumented(); md->warnIfUndocumented();
......
...@@ -148,59 +148,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -148,59 +148,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
ol.endTextBlock(); ol.endTextBlock();
ol.startMemberSections(); ol.startMemberSections();
if (classList->count()>0) classList->writeDeclaration(ol);
{
ClassDef *cd=classList->first();
bool found=FALSE;
while (cd)
{
if (cd->name().find('@')==-1)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
QCString clName=cd->name().copy();
if (clName.left(name().length()+2)==name()+"::")
{
clName = clName.right(clName.length()-name().length()-2);
}
ol.startMemberItem(0);
switch (cd->compoundType())
{
case ClassDef::Class: ol.writeString("class"); break;
case ClassDef::Struct: ol.writeString("struct"); break;
case ClassDef::Union: ol.writeString("union"); break;
case ClassDef::Interface: ol.writeString("interface"); break;
case ClassDef::Exception: ol.writeString("exception"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (cd->isLinkable())
{
ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),
0,
clName
);
}
else
{
ol.startBold();
ol.docify(clName);
ol.endBold();
}
ol.endMemberItem(FALSE);
}
cd=classList->next();
}
if (found) ol.endMemberList();
}
/* write user defined member groups */ /* write user defined member groups */
MemberGroupListIterator mgli(*memberGroupList); MemberGroupListIterator mgli(*memberGroupList);
...@@ -213,7 +161,8 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -213,7 +161,8 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
allMemberList.writeDeclarations(ol,0,this,0,0,0,0); allMemberList.writeDeclarations(ol,0,this,0,0,0,0);
ol.endMemberSections(); ol.endMemberSections();
if (!briefDescription().isEmpty() || !documentation().isEmpty()) if ((!briefDescription().isEmpty() && Config::repeatBriefFlag) ||
!documentation().isEmpty())
{ {
ol.writeRuler(); ol.writeRuler();
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -281,15 +230,15 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -281,15 +230,15 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name()); enumMembers.writeDocumentation(ol,name());
} }
enumValMembers.countDocMembers(); //enumValMembers.countDocMembers();
if ( enumValMembers.totalCount()>0 ) //if ( enumValMembers.totalCount()>0 )
{ //{
ol.writeRuler(); // ol.writeRuler();
ol.startGroupHeader(); // ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation()); // parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader(); // ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name()); // enumValMembers.writeDocumentation(ol,name());
} //}
funcMembers.countDocMembers(); funcMembers.countDocMembers();
if ( funcMembers.totalCount()>0 ) if ( funcMembers.totalCount()>0 )
......
...@@ -213,6 +213,9 @@ class OutputGenerator ...@@ -213,6 +213,9 @@ class OutputGenerator
virtual void startParameter(bool) = 0; virtual void startParameter(bool) = 0;
virtual void endParameter(bool) = 0; virtual void endParameter(bool) = 0;
virtual void startFontClass(const char *) = 0;
virtual void endFontClass() = 0;
void clear() { b.close(); a.resize(0); b.setBuffer(a); void clear() { b.close(); a.resize(0); b.setBuffer(a);
b.open(IO_WriteOnly); t.setDevice(&b); } b.open(IO_WriteOnly); t.setDevice(&b); }
......
...@@ -369,6 +369,11 @@ class OutputList ...@@ -369,6 +369,11 @@ class OutputList
void endParameter(bool last) void endParameter(bool last)
{ forall(&OutputGenerator::endParameter,last); } { forall(&OutputGenerator::endParameter,last); }
void startFontClass(const char *c)
{ forall(&OutputGenerator::startFontClass,c); }
void endFontClass()
{ forall(&OutputGenerator::endFontClass); }
private: private:
void debug(); void debug();
void clear(); void clear();
......
...@@ -125,7 +125,15 @@ static void decrLevel() ...@@ -125,7 +125,15 @@ static void decrLevel()
static bool otherCaseDone() static bool otherCaseDone()
{ {
if (g_level==0)
{
err("Error: Found an #else without a preceding #if.\n");
return TRUE;
}
else
{
return g_levelGuard[g_level-1]; return g_levelGuard[g_level-1];
}
} }
static void setCaseDone(bool value) static void setCaseDone(bool value)
...@@ -1079,7 +1087,7 @@ BN [ \t\r\n] ...@@ -1079,7 +1087,7 @@ BN [ \t\r\n]
g_guardExpr.resize(0); g_guardExpr.resize(0);
BEGIN(Guard); BEGIN(Guard);
} }
<Command>"elif"/[ \t(] { <Command>("elif"|"else"{B}*"if")/[ \t(] {
if (!otherCaseDone()) if (!otherCaseDone())
{ {
g_guardExpr.resize(0); g_guardExpr.resize(0);
...@@ -1107,7 +1115,7 @@ BN [ \t\r\n] ...@@ -1107,7 +1115,7 @@ BN [ \t\r\n]
<Command>"undef"{B}+ { <Command>"undef"{B}+ {
BEGIN(Ung_defName); BEGIN(Ung_defName);
} }
<Command>"elif"/[ \t(] { <Command>("elif"|"else"{B}*"if")/[ \t(] {
if (!otherCaseDone()) if (!otherCaseDone())
{ {
g_guardExpr.resize(0); g_guardExpr.resize(0);
...@@ -1208,7 +1216,7 @@ BN [ \t\r\n] ...@@ -1208,7 +1216,7 @@ BN [ \t\r\n]
BEGIN(Start); BEGIN(Start);
} }
} }
<SkipCommand>"elif"/[ \t(] { <SkipCommand>("elif"|"else"{B}*"if")/[ \t(] {
if (g_ifcount==0) if (g_ifcount==0)
{ {
if (!otherCaseDone()) if (!otherCaseDone())
...@@ -1693,6 +1701,7 @@ void preprocessFile(const char *fileName,BufStr &output) ...@@ -1693,6 +1701,7 @@ void preprocessFile(const char *fileName,BufStr &output)
char *defStr = Config::predefined.first(); char *defStr = Config::predefined.first();
while (defStr) while (defStr)
{ {
//printf("Predefined: `%s'\n",defStr);
QCString ds = defStr; QCString ds = defStr;
int i_equals=ds.find('='); int i_equals=ds.find('=');
int i_obrace=ds.find('('); int i_obrace=ds.find('(');
......
...@@ -528,41 +528,44 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -528,41 +528,44 @@ void RTFGenerator::endIndexSection(IndexSections is)
break; break;
case isMainPage: case isMainPage:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"index.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"index.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isModuleIndex: case isModuleIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isNamespaceIndex: case isNamespaceIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isClassHierarchyIndex: case isClassHierarchyIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v Hierarchical Index}"<< endl;; t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isCompoundIndex: case isCompoundIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v Compound Index}"<< endl;; t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isFileIndex: case isFileIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v File Index}"<< endl;; t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isPageIndex: case isPageIndex:
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v Page Index}"<< endl;; t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break; break;
case isModuleDocumentation: case isModuleDocumentation:
{ {
GroupDef *gd=groupList.first(); GroupDef *gd=groupList.first();
bool found=FALSE; bool found=FALSE;
t << "{\\tc \\v Module Documentation}"<< endl;; t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl;
while (gd && !found) while (gd && !found)
{ {
if (gd->isLinkableInProject() || gd->countMembers()>0) if (gd->isLinkableInProject() || gd->countMembers()>0)
...@@ -625,7 +628,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -625,7 +628,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
ClassDef *cd=classList.first(); ClassDef *cd=classList.first();
bool found=FALSE; bool found=FALSE;
t << "{\\tc \\v Class Documentation}"<< endl;; t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}"<< endl;
while (cd && !found) while (cd && !found)
{ {
if (cd->isLinkableInProject()) if (cd->isLinkableInProject())
...@@ -657,7 +660,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -657,7 +660,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
bool isFirst=TRUE; bool isFirst=TRUE;
FileName *fn=inputNameList.first(); FileName *fn=inputNameList.first();
t << "{\\tc \\v File Documentation}"<< endl; t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl;
while (fn) while (fn)
{ {
FileDef *fd=fn->first(); FileDef *fd=fn->first();
...@@ -692,6 +695,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -692,6 +695,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{ {
//t << "}\n"; //t << "}\n";
PageInfo *pi=exampleList.first(); PageInfo *pi=exampleList.first();
t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl;
if (pi) if (pi)
{ {
t << "\\par " << Rtf_Style_Reset << endl; t << "\\par " << Rtf_Style_Reset << endl;
...@@ -713,7 +717,7 @@ void RTFGenerator::endIndexSection(IndexSections is) ...@@ -713,7 +717,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
break; break;
case isPageDocumentation: case isPageDocumentation:
{ {
t << "{\\tc \\v Page Documentation}"<< endl;; t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl;
PageInfo *pi=pageList.first(); PageInfo *pi=pageList.first();
if (pi) if (pi)
{ {
...@@ -1346,7 +1350,7 @@ void RTFGenerator::startDescList() ...@@ -1346,7 +1350,7 @@ void RTFGenerator::startDescList()
{ {
t << "{\\comment (startDescList)}" << endl; t << "{\\comment (startDescList)}" << endl;
t << "{"; t << "{";
/*if (!m_omitParagraph)*/ newParagraph(); ///*if (!m_omitParagraph)*/ newParagraph();
} }
void RTFGenerator::endDescTitle() void RTFGenerator::endDescTitle()
...@@ -1378,6 +1382,7 @@ void RTFGenerator::endDescList() ...@@ -1378,6 +1382,7 @@ void RTFGenerator::endDescList()
void RTFGenerator::writeSection(const char *lab,const char *title,bool sub) void RTFGenerator::writeSection(const char *lab,const char *title,bool sub)
{ {
t << "{\\comment (writeSection)}" << endl; t << "{\\comment (writeSection)}" << endl;
t << "{";
t<< Rtf_Style_Reset; t<< Rtf_Style_Reset;
if (sub) if (sub)
{ {
...@@ -1404,12 +1409,19 @@ void RTFGenerator::writeSection(const char *lab,const char *title,bool sub) ...@@ -1404,12 +1409,19 @@ void RTFGenerator::writeSection(const char *lab,const char *title,bool sub)
newParagraph(); newParagraph();
// make bookmark // make bookmark
writeAnchor(lab); writeAnchor(lab);
t << "}";
} }
void RTFGenerator::writeSectionRef(const char *,const char *lab, void RTFGenerator::writeSectionRef(const char *,const char *lab,
const char *) const char *title)
{ {
startBold();
docify(title);
endBold();
t << " (";
docify(theTranslator->trPageAbbreviation());
WriteRTFReference(lab); WriteRTFReference(lab);
t << ")" << endl;
} }
void RTFGenerator::writeSectionRefItem(const char *,const char *lab, void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
...@@ -1421,13 +1433,10 @@ void RTFGenerator::writeSectionRefItem(const char *,const char *lab, ...@@ -1421,13 +1433,10 @@ void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
t << endl; t << endl;
} }
void RTFGenerator::writeSectionRefAnchor(const char *,const char *lab, void RTFGenerator::writeSectionRefAnchor(const char *name,const char *lab,
const char *title) const char *title)
{ {
startBold(); writeSectionRef(name,lab,title);
docify(title);
endBold();
t << " (p.~\\pageref{" << lab << "})" << endl;
} }
void RTFGenerator::docify(const char *str) void RTFGenerator::docify(const char *str)
......
...@@ -211,6 +211,9 @@ class RTFGenerator : public OutputGenerator ...@@ -211,6 +211,9 @@ class RTFGenerator : public OutputGenerator
void startParameter(bool) {} void startParameter(bool) {}
void endParameter(bool) {} void endParameter(bool) {}
void startFontClass(const char *) {}
void endFontClass() {}
static bool preProcessFileInplace(const char *path,const char *name); static bool preProcessFileInplace(const char *path,const char *name);
private: private:
......
...@@ -3773,16 +3773,17 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -3773,16 +3773,17 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<BasesProt>"private" { baseProt = Private; } <BasesProt>"private" { baseProt = Private; }
<BasesProt>{BN} { lineCount(); } <BasesProt>{BN} { lineCount(); }
<BasesProt>. { unput(*yytext); BEGIN(Bases); } <BasesProt>. { unput(*yytext); BEGIN(Bases); }
<Bases>("::")*{BN}*({ID}{BN}*"::"{BN}*)*{ID} { <Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
//current->extends->append( //current->extends->append(
// new BaseInfo(yytext,baseProt,baseVirt) // new BaseInfo(yytext,baseProt,baseVirt)
//) ; //) ;
if (*yytext != ':') bool globalScope = *yytext==':' && baseName.isEmpty();
if (!globalScope)
baseName += yytext; baseName += yytext;
else else
baseName += (yytext+2); baseName += (yytext+2);
current->args += ' '; current->args += ' ';
if (*yytext != ':') if (!globalScope)
current->args += yytext; current->args += yytext;
else else
current->args += (yytext+2); current->args += (yytext+2);
...@@ -4492,7 +4493,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4492,7 +4493,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
); );
} }
<DocBaseClass>\n { yyLineNr++; BEGIN( ClassDoc ); } <DocBaseClass>\n { yyLineNr++; BEGIN( ClassDoc ); }
<ClassDocBrief>{BS}{BL} { <ClassDocBrief>{BS}({BL}|"\\n\\n") {
current->brief=current->brief.stripWhiteSpace(); current->brief=current->brief.stripWhiteSpace();
if (!current->doc.isEmpty()) current->doc+="<p>"; if (!current->doc.isEmpty()) current->doc+="<p>";
yyLineNr++; yyLineNr++;
...@@ -4659,13 +4660,26 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4659,13 +4660,26 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
unput(afterDocTerminator); unput(afterDocTerminator);
BEGIN(lastAfterDocContext); BEGIN(lastAfterDocContext);
} }
<ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,FileDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" { <ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" {
current->doc += "\n\n"; current->doc += "\n\n";
err("Warning: unexpected end of " err("Warning: unexpected end of "
"documentation block found in " "documentation block found in "
"file %s at line %d\n",yyFileName,yyLineNr); "file %s at line %d\n",yyFileName,yyLineNr);
BEGIN( lastDocContext ); BEGIN( lastDocContext );
} }
<FileDocArg1>"*/" {
current->name = yyFileName;
current->doc += "\n\n";
current_root->addSubEntry(current);
current = new Entry ;
current->protection = protection ;
current->sig = sig;
current->virt = virt;
current->stat = gstat;
current->slot = slot;
current->mGrpId = memberGroupId;
BEGIN( FindMembers );
}
<Doc>"*/" { <Doc>"*/" {
checkDocs(); checkDocs();
current->doc += "\n\n"; current->doc += "\n\n";
......
...@@ -48,7 +48,7 @@ class TranslatorGerman : public Translator ...@@ -48,7 +48,7 @@ class TranslatorGerman : public Translator
QCString latexBabelPackage() QCString latexBabelPackage()
// returns the name of the package that is included by LaTeX // returns the name of the package that is included by LaTeX
{ return "deutsch"; } { return "german"; }
QCString trRelatedFunctions() QCString trRelatedFunctions()
// used in the compound documentation before a list of related functions. // used in the compound documentation before a list of related functions.
......
...@@ -248,7 +248,7 @@ QCString removeRedundantWhiteSpace(const QCString &s) ...@@ -248,7 +248,7 @@ QCString removeRedundantWhiteSpace(const QCString &s)
(i!=0 && i!=s.length()-1 && isId(s.at(i-1)) && isId(s.at(i+1))) (i!=0 && i!=s.length()-1 && isId(s.at(i-1)) && isId(s.at(i+1)))
) )
{ {
if ((c=='*' || c=='&') && if ((c=='*' || c=='&' || c=='@') &&
!result.isEmpty() && isId(result.at(result.length()-1)) !result.isEmpty() && isId(result.at(result.length()-1))
) result+=' '; ) result+=' ';
result+=c; result+=c;
...@@ -535,7 +535,7 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext) ...@@ -535,7 +535,7 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
//bool texEnabled = ol.isEnabled(OutputGenerator::Latex); //bool texEnabled = ol.isEnabled(OutputGenerator::Latex);
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
QCString extLink,absPath; QCString extLink,absPath;
if (ext) { extLink="_doc:"; absPath="/"; } if (ext) { extLink="_doc"; absPath="/"; }
//if (manEnabled) ol.disable(OutputGenerator::Man); //if (manEnabled) ol.disable(OutputGenerator::Man);
//if (texEnabled) ol.disable(OutputGenerator::Latex); //if (texEnabled) ol.disable(OutputGenerator::Latex);
if (compact) ol.startCenter(); else ol.startItemList(); if (compact) ol.startCenter(); else ol.startItemList();
...@@ -2217,3 +2217,27 @@ void extractNamespaceName(const QCString &scopeName, ...@@ -2217,3 +2217,27 @@ void extractNamespaceName(const QCString &scopeName,
return; return;
} }
QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ)
{
QCString result=scope.copy();
if (!templ.isEmpty() && scope.find('<')==-1)
{
int si,pi=0;
while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ)
&& !getClass(scope.left(si)))
{ //printf("Tried `%s'\n",(scope.left(si)+templ).data());
pi=si+2;
}
if (si==-1) // not nested => append template specifier
{
result+=templ;
}
else // nested => insert template specifier before after first class name
{
result=scope.left(si) + templ + scope.right(scope.length()-si);
}
}
//printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n",
// scope.data(),templ.data(),result.data());
return result;
}
...@@ -93,5 +93,6 @@ int minClassDistance(ClassDef *cd,ClassDef *bcd,int level=0); ...@@ -93,5 +93,6 @@ int minClassDistance(ClassDef *cd,ClassDef *bcd,int level=0);
QCString convertNameToFile(const char *name); QCString convertNameToFile(const char *name);
void extractNamespaceName(const QCString &scopeName, void extractNamespaceName(const QCString &scopeName,
QCString &className,QCString &namespaceName); QCString &className,QCString &namespaceName);
QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ);
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment