summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp18
-rw-r--r--src/classdef.h6
-rw-r--r--src/code.l110
-rw-r--r--src/definition.cpp2
-rw-r--r--src/dot.cpp21
-rw-r--r--src/doxygen.cpp269
-rw-r--r--src/filedef.cpp47
-rw-r--r--src/groupdef.cpp73
-rw-r--r--src/htmlgen.cpp100
-rw-r--r--src/htmlgen.h2
-rw-r--r--src/index.cpp44
-rw-r--r--src/language.cpp5
-rw-r--r--src/latexgen.cpp251
-rw-r--r--src/latexgen.h10
-rw-r--r--src/memberdef.cpp42
-rw-r--r--src/memberdef.h142
-rw-r--r--src/memberlist.cpp8
-rw-r--r--src/membername.cpp8
-rw-r--r--src/namespacedef.cpp62
-rw-r--r--src/pre.l17
-rw-r--r--src/rtfgen.cpp8
-rw-r--r--src/scanner.l45
-rw-r--r--src/translator_cz.h266
-rw-r--r--src/translator_nl.h111
-rw-r--r--src/translator_pt.h884
-rw-r--r--src/util.cpp41
26 files changed, 2015 insertions, 577 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 9d66246..8fd8d92 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -779,9 +779,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
- ol.writeString("<font size=2><center>[");
+ ol.writeString("<center><font size=\"2\">[");
ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
- ol.writeString("]</center></font>");
+ ol.writeString("]</font></center>");
ol.popGeneratorState();
}
ol.popGeneratorState();
@@ -811,9 +811,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
- ol.writeString("<font size=2><center>[");
+ ol.writeString("<center><font size=\"2\">[");
ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
- ol.writeString("]</center></font>");
+ ol.writeString("]</font></center>");
ol.popGeneratorState();
}
ol.popGeneratorState();
@@ -1123,7 +1123,7 @@ void ClassDef::writeMemberList(OutputList &ol)
while (mi)
{
MemberDef *md=mi->memberDef;
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
// compute the protection level for this member
Protection protect=md->protection();
@@ -1301,7 +1301,7 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
//ol.insertMemberAlign();
//printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup);
- if (inGroup && md && md->memberClass()==this) return;
+ if (inGroup && md && md->getClassDef()==this) return;
switch(compType)
{
@@ -1447,13 +1447,13 @@ void ClassDef::mergeMembers(/*ClassDef *cd,BaseClassList *bcl*/)
bool hidden=FALSE;
MemberNameInfoIterator dstMnii(*dstMni);
MemberInfo *dstMi;
- ClassDef *srcCd = srcMd->memberClass();
+ ClassDef *srcCd = srcMd->getClassDef();
for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii )
{
MemberDef *dstMd = dstMi->memberDef;
if (srcMd!=dstMd) // different members
{
- ClassDef *dstCd = dstMd->memberClass();
+ ClassDef *dstCd = dstMd->getClassDef();
//printf("Is %s a base class of %s?\n",srcCd->name(),dstCd->name());
if (srcCd==dstCd || dstCd->isBaseClass(srcCd))
// member is in the same or a base class
@@ -1565,7 +1565,7 @@ void ClassDef::mergeMembers(/*ClassDef *cd,BaseClassList *bcl*/)
Specifier virt=mi->virt;
if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
MemberInfo *newMi=new MemberInfo(mi->memberDef,bcd->prot,virt);
- //if (mi->memberDef->memberClass()!=bClass)
+ //if (mi->memberDef->getClassDef()!=bClass)
newMi->scopePath=bClass->name()+"::"+mi->scopePath;
newMi->ambigClass=mi->ambigClass;
newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy();
diff --git a/src/classdef.h b/src/classdef.h
index 9fde96d..a52173d 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -102,10 +102,12 @@ class ClassDef : public Definition
ArgumentList *outerTemplateArguments() const;
void setTemplateArguments(ArgumentList *al);
//QCString getTemplateNameString();
+
+ NamespaceDef *getNamespaceDef() { return nspace; }
+ FileDef *getFileDef() const { return fileDef; }
+
void setNamespace(NamespaceDef *nd) { nspace = nd; }
- NamespaceDef *getNamespace() { return nspace; }
void setFileDef(FileDef *fd) { fileDef=fd; }
- FileDef *getFileDef() const { return fileDef; }
void mergeMembers();
bool isBaseClass(ClassDef *bcd);
void determineImplUsageRelation();
diff --git a/src/code.l b/src/code.l
index 39ff64d..db0f554 100644
--- a/src/code.l
+++ b/src/code.l
@@ -96,6 +96,7 @@ static int g_lastStringContext;
static int g_bracketCount = 0;
static int g_curlyCount = 0;
static int g_sharpCount = 0;
+static bool g_insideTemplate = FALSE;
static QCString g_type;
static QCString g_name;
static QCString g_args;
@@ -254,6 +255,14 @@ static void setClassScope(const QCString &name)
//printf("setClassScope(%s)\n",name.data());
QCString n=name;
n=n.simplifyWhiteSpace();
+ int ts=n.find('<'); // start of template
+ int te=n.findRev('>'); // end of template
+ //printf("ts=%d te=%d\n",ts,te);
+ if (ts!=-1 && te!=-1 && te>ts)
+ {
+ // remove template from scope
+ n=n.left(ts)+n.right(n.length()-te-1);
+ }
int index;
if ((index=n.findRev("::"))!=-1)
g_classScope=n.left(index);
@@ -273,7 +282,7 @@ static void addVariable()
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]))
+ if ((getResolvedClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
{
g_cvd.classScope=g_classScope;
g_codeVarList.append(new CodeVarDef(g_cvd)); // add it to a list
@@ -436,11 +445,11 @@ static bool generateClassMemberLink(OutputList &ol,ClassDef *mcd,const char *mem
int mdist=maxInheritanceDepth;
for (;(mmd=mmni.current());++mmni)
{
- int m=minClassDistance(mcd,mmd->memberClass());
- if (m<mdist && mmd->memberClass()->isLinkable())
+ int m=minClassDistance(mcd,mmd->getClassDef());
+ if (m<mdist && mmd->getClassDef()->isLinkable())
{
mdist=m;
- xcd=mmd->memberClass();
+ xcd=mmd->getClassDef();
xmd=mmd;
}
}
@@ -507,33 +516,36 @@ static void generateMemberLink(OutputList &ol,const char *varName,
}
else
{
+ //printf("Class not found!\n");
OutputList result(&ol);
+ //printf("cvd->type=`%s'\n",cvd->type.data());
if (getLink(cvd->type,memName,result))
{
ol+=result;
}
else
{
- codifyLines(memName);
+ codifyLines(memName);
}
return;
}
}
else
{
- ClassDef *vcd = getClass(g_classScope);
+ ClassDef *vcd = getResolvedClass(g_classScope);
if (vcd && vcd->isLinkable())
{
//printf("Found class for variable `%s'\n",varName);
MemberName *vmn=memberNameDict[varName];
if (vmn)
{
+ //printf("There is a variable with name `%s'\n",varName);
MemberNameIterator vmni(*vmn);
MemberDef *vmd;
for (;(vmd=vmni.current());++vmni)
{
if ((vmd->isVariable() || vmd->isFunction()) &&
- vmd->memberClass()==vcd)
+ vmd->getClassDef()==vcd)
{
//printf("Found variable type=%s\n",vmd->typeString());
ClassDef *mcd=stripClassName(vmd->typeString());
@@ -552,11 +564,11 @@ static void generateMemberLink(OutputList &ol,const char *varName,
int mdist=maxInheritanceDepth;
for (;(mmd=mmni.current());++mmni)
{
- int m=minClassDistance(mcd,mmd->memberClass());
- if (m<mdist && mmd->memberClass()->isLinkable())
+ int m=minClassDistance(mcd,mmd->getClassDef());
+ if (m<mdist && mmd->getClassDef()->isLinkable())
{
mdist=m;
- xcd=mmd->memberClass();
+ xcd=mmd->getClassDef();
xmd=mmd;
}
}
@@ -609,6 +621,14 @@ static void generateFunctionLink(OutputList &ol,char *funcName)
{
locScope=locFunc.left(i);
locFunc=locFunc.right(locFunc.length()-i-2);
+ int ts=locScope.find('<'); // start of template
+ int te=locScope.findRev('>'); // end of template
+ //printf("ts=%d te=%d\n",ts,te);
+ if (ts!=-1 && te!=-1 && te>ts)
+ {
+ // remove template from scope
+ locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1);
+ }
}
//printf("generateFunctionLink(%s) classScope=%s\n",locFunc.data(),locScope.data());
if (!locScope.isEmpty() && (ccd=g_codeClassDict[locScope]))
@@ -684,7 +704,9 @@ B [ \t]
BN [ \t\n\r]
ID [a-z_A-Z][a-z_A-Z0-9]*
SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
-SCOPEPREFIX {ID}{B}*"::"({B}*{ID}{B}*"::")*
+TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
+SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
+SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+
KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile")
FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"try"|"while")
TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t")
@@ -720,7 +742,8 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
codifyLines(yytext);
endFontClass();
//g_code->codify(yytext);
- BEGIN( ClassName );
+ if (!g_insideTemplate)
+ BEGIN( ClassName );
}
<ReadInclude>[a-z_A-Z0-9.]+(("/"[a-z_A-Z0-9.]+)*)/(">"|"\"") {
//FileInfo *f;
@@ -753,7 +776,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<SkipCPP>\\\n {
codifyLines(yytext);
}
-<SkipCPP>\n {
+<SkipCPP>\n/.*\n {
codifyLines(yytext);
endFontClass();
BEGIN( Body ) ;
@@ -852,7 +875,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
-<Body>{SCOPEPREFIX}*{B}*"operator"{B}*"()"{B}*/"(" {
+<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" {
addType();
generateFunctionLink(*g_code,yytext);
g_bracketCount=1;
@@ -860,7 +883,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_name+=yytext;
BEGIN( FuncCall );
}
-<Body>{SCOPEPREFIX}*{B}*"operator"{B}*[^\(\n]+/"(" {
+<Body>{SCOPEPREFIX}?"operator"{B}*[^\(\n]+/"(" {
addType();
generateFunctionLink(*g_code,yytext);
g_bracketCount=1;
@@ -868,6 +891,13 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_name+=yytext;
BEGIN( FuncCall );
}
+<Body>"template"/([^a-zA-Z0-9]) {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ g_insideTemplate=TRUE;
+ g_sharpCount=0;
+ }
<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
startFontClass("keyword");
codifyLines(yytext);
@@ -918,13 +948,15 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
addType();
g_name+=yytext;
}
-<Body>{SCOPENAME}{B}*"<"[^\"\}\{\(\)\/\n\>]*">"/{B}* {
+ /*
+<Body>{SCOPETNAME}/{B}* {
int i;
generateClassLink(*g_code,yytext,&i);
addType();
QCString text=yytext;
g_name+=text.left(i);
}
+ */
<Body>{SCOPENAME}/{B}* { // p->func()
generateClassLink(*g_code,yytext);
addType();
@@ -944,7 +976,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
addType();
g_name+=varname;
}
-<Body>{SCOPENAME}/{B}*"(" { // func1()->func2()
+<Body>{SCOPETNAME}/{B}*"(" { // a() or c::a() or t<A,B>::a()
addType();
generateFunctionLink(*g_code,yytext);
g_bracketCount=1;
@@ -976,6 +1008,23 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext);
g_name.resize(0);g_type.resize(0);
}
+<Body>"<" {
+ if (g_insideTemplate)
+ {
+ g_sharpCount++;
+ }
+ g_code->codify(yytext);
+ }
+<Body>">" {
+ if (g_insideTemplate)
+ {
+ if (--g_sharpCount<=0)
+ {
+ g_insideTemplate=FALSE;
+ }
+ }
+ g_code->codify(yytext);
+ }
<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" {
startFontClass("charliteral");
g_code->codify(yytext);
@@ -986,7 +1035,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext);
BEGIN( MemberCall );
}
-<MemberCall>{SCOPENAME}/{B}*"(" {
+<MemberCall>{SCOPETNAME}/{B}*"(" {
if (!g_name.isEmpty())
{
generateMemberLink(*g_code,g_name,yytext);
@@ -1273,7 +1322,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
else
{
- g_lastCContext = YY_START ;
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
@@ -1336,7 +1389,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
else
{
- g_lastCContext = YY_START ;
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
@@ -1350,7 +1407,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
else
{
- g_lastCContext = YY_START ;
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
@@ -1366,7 +1427,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<*>"/*" {
startFontClass("comment");
g_code->codify(yytext);
- g_lastCContext = YY_START ;
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
BEGIN( SkipComment ) ;
}
<*>"//" {
@@ -1430,6 +1495,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s,
g_bodyCurlyCount = 0;
g_bracketCount = 0;
g_sharpCount = 0;
+ g_insideTemplate = FALSE;
g_classVar = 0;
g_classScope = className;
g_exampleBlock = exBlock;
diff --git a/src/definition.cpp b/src/definition.cpp
index 22a5826..3ce5893 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -357,7 +357,7 @@ void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
{
QCString scope=md->getScopeString();
QCString name=md->name();
- //printf("class=%p scope=%s scopeName=%s\n",md->memberClass(),scope.data(),scopeName);
+ //printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName);
if (!scope.isEmpty() && scope!=scopeName)
{
name.prepend(scope+"::");
diff --git a/src/dot.cpp b/src/dot.cpp
index 37d06f1..02a0b07 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -1104,7 +1104,20 @@ void DotClassGraph::writeGraph(QTextStream &out,
return;
}
out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#"
- << m_startNode->m_label << "_" << mapName << "\"></center>" << endl;
+ << m_startNode->m_label << "_" << mapName << "\" alt=\"";
+ switch (m_graphType)
+ {
+ case Implementation:
+ out << "Collaboration graph";
+ break;
+ case Interface:
+ out << "Interface dependency graph";
+ break;
+ case Inheritance:
+ out << "Inheritance graph";
+ break;
+ }
+ out << "\"></center>" << endl;
out << "<map name=\"" << m_startNode->m_label << "_" << mapName << "\">" << endl;
convertMapFile(out,baseName+".map");
out << "</map><p>" << endl;
@@ -1140,7 +1153,7 @@ void DotClassGraph::writeGraph(QTextStream &out,
"\\end{center}\n"
"\\end{figure}\n";
}
- //thisDir.remove(baseName+".dot");
+ thisDir.remove(baseName+".dot");
QDir::setCurrent(oldDir);
}
@@ -1280,7 +1293,9 @@ void DotInclDepGraph::writeGraph(QTextStream &out,
}
out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#"
- << mapName << "_map\">";
+ << mapName << "_map\" alt=\"";
+ if (m_inverse) out << "Included by dependency graph"; else out << "Include dependency graph";
+ out << "\">";
out << "</center>" << endl;
out << "<map name=\"" << mapName << "_map\">" << endl;
convertMapFile(out,baseName+".map");
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 47d54dd..c756ba8 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -952,7 +952,7 @@ static MemberDef *addVariableToClass(
MemberDef *md=mn->first();
while (md)
{
- if (md->memberClass()==cd && root->type==md->typeString())
+ if (md->getClassDef()==cd && root->type==md->typeString())
// member already in the scope
{
addMemberDocs(root,md,def,0,FALSE);
@@ -1085,7 +1085,7 @@ static MemberDef *addVariableToFile(
{
nd = namespaceDict[nscope];
}
- if (nd==0 || md->getNamespace()==nd)
+ if (nd==0 || md->getNamespaceDef()==nd)
// variable already in the scope
{
addMemberDocs(root,md,def,0,FALSE);
@@ -1352,8 +1352,9 @@ static void buildMemberList(Entry *root)
);
bool isFriend=root->type.find("friend ")!=-1;
+ QCString rname = removeRedundantWhiteSpace(root->name);
- if (!root->name.isEmpty())
+ if (!rname.isEmpty())
{
ClassDef *cd=0;
@@ -1365,18 +1366,18 @@ static void buildMemberList(Entry *root)
QCString scope=stripAnnonymousNamespaceScope(root->parent->name.copy());
bool isMember=FALSE;
- int memIndex=root->name.find("::");
+ int memIndex=rname.find("::");
if (memIndex!=-1)
{
- int ts=root->name.find('<');
- int te=root->name.find('>');
+ int ts=rname.find('<');
+ int te=rname.find('>');
if (ts==-1 || te==-1)
{
isMember=TRUE;
}
else
{
- isMember=memIndex<ts && memIndex<te;
+ isMember=memIndex<ts || memIndex>te;
}
}
@@ -1398,7 +1399,7 @@ static void buildMemberList(Entry *root)
root->type=root->type.left(i+l);
}
- QCString name=removeRedundantWhiteSpace(root->name);
+ QCString name=removeRedundantWhiteSpace(rname);
if (name.left(2)=="::") name=name.right(name.length()-2);
MemberDef::MemberType mtype;
@@ -1417,7 +1418,7 @@ static void buildMemberList(Entry *root)
//if (Config::includeSourceFlag && !root->body.isEmpty())
//{
// printf("Function: %s\n-----------------\n%s\n------------------\n",
- // root->name.data(),root->body.data());
+ // rname.data(),root->body.data());
//}
// new member function, signal or slot.
@@ -1500,7 +1501,7 @@ static void buildMemberList(Entry *root)
" def=`%s'\n",
root->type.data(),
root->parent->name.data(),
- root->name.data(),
+ rname.data(),
root->args.data(),
root->proto,
def.data()
@@ -1532,7 +1533,7 @@ static void buildMemberList(Entry *root)
!(root->parent->section & Entry::COMPOUND_MASK) &&
!isMember &&
- //root->name.find("::")==-1 && // TODO: remove this check
+ //rname.find("::")==-1 && // TODO: remove this check
// // it breaks cases like
// // func<A::B>(), but it is needed
// // for detect that A::func() is a member
@@ -1550,23 +1551,37 @@ static void buildMemberList(Entry *root)
bool found=FALSE;
MemberName *mn;
//MemberDef *fmd;
- if ((mn=functionNameDict[root->name]))
+ if ((mn=functionNameDict[rname]))
{
- //printf("--> function %s already found!\n",root->name.data());
+ //printf("--> function %s already found!\n",rname.data());
MemberDef *md=mn->first();
while (md && !found)
{
- NamespaceDef *nd = md->getNamespace();
+ NamespaceDef *nd = md->getNamespaceDef();
+ NamespaceDef *rnd = 0;
+ if (!root->parent->name.isEmpty())
+ {
+ rnd = namespaceDict[root->parent->name];
+ }
FileDef *fd = md->getFileDef();
- QCString nsName = nd ? nd->name().data() : "";
- //printf("namespace `%s'\n",nsName.data());
+ QCString nsName,rnsName;
+ if (nd) nsName = nd->name().copy();
+ if (rnd) rnsName = rnd->name().copy();
+ //printf("namespace `%s' `%s'\n",nsName.data(),rnsName.data());
if (
matchArguments(md->argumentList(),root->argList,0,nsName)
)
{
- // function already found in the same file, one is probably
- // a prototype.
- found=nd || fd->absFilePath()==root->fileName;
+ // see if we need to create a new member
+ found=nsName==rnsName && // members are in the same namespace
+ ((fd!=0 && // no external reference
+ fd->absFilePath()==root->fileName // prototype in the same file
+ ) ||
+ md->getGroupDef()!=0 // member is part of a group
+ );
+ // otherwise, allow a duplicate global member with the same argument list
+
+ // merge members documentation and properties
mergeArguments(root->argList,md->argumentList());
if (!md->documentation() && !root->doc.isEmpty())
{
@@ -1590,10 +1605,10 @@ static void buildMemberList(Entry *root)
if (!found) /* global function is unique with respect to the file */
{
//printf("New function type=`%s' name=`%s' args=`%s' bodyLine=%d\n",
- // root->type.data(),root->name.data(),root->args.data(),root->bodyLine);
+ // root->type.data(),rname.data(),root->args.data(),root->bodyLine);
// new global function
- QCString name=removeRedundantWhiteSpace(root->name);
+ QCString name=removeRedundantWhiteSpace(rname);
MemberDef *md=new MemberDef(
root->fileName,root->startLine,
root->type,name,root->args,root->exception,
@@ -1641,7 +1656,7 @@ static void buildMemberList(Entry *root)
" def=`%s'\n",
root->type.data(),
root->parent->name.data(),
- root->name.data(),
+ rname.data(),
root->args.data(),
root->proto,
def.data()
@@ -1705,10 +1720,10 @@ static void buildMemberList(Entry *root)
}
//printf("unrelated function %d `%s' `%s' `%s'\n",
- // root->parent->section,root->type.data(),root->name.data(),root->args.data());
+ // root->parent->section,root->type.data(),rname.data(),root->args.data());
}
}
- else if (root->name.isEmpty())
+ else if (rname.isEmpty())
{
warn(root->fileName,root->startLine,
"Warning: Illegal member name found."
@@ -1748,11 +1763,11 @@ static void findFriends()
//printf("Checking for matching arguments
// mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
// mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
- NamespaceDef *nd=mmd->getNamespace();
+ NamespaceDef *nd=mmd->getNamespaceDef();
if ((mmd->isFriend() || (mmd->isRelated() && mmd->isFunction())) &&
matchArguments(mmd->argumentList(),
fmd->argumentList(),
- mmd->memberClass()->name(),
+ mmd->getClassDef()->name(),
nd ? nd->name().data() : 0
)
) // if the member is related and the arguments match then the
@@ -1951,7 +1966,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
}
bool found=baseClass!=0 && baseClass!=cd;
- NamespaceDef *nd=cd->getNamespace();
+ NamespaceDef *nd=cd->getNamespaceDef();
if (!found)
{
FileDef *fd=cd->getFileDef();
@@ -2166,8 +2181,8 @@ static void addMemberDocs(Entry *root,
// strip extern specifier
if (fDecl.left(7)=="extern ") fDecl=fDecl.right(fDecl.length()-7);
md->setDefinition(fDecl);
- ClassDef *cd=md->memberClass();
- NamespaceDef *nd=md->getNamespace();
+ ClassDef *cd=md->getClassDef();
+ NamespaceDef *nd=md->getNamespaceDef();
if (al)
{
mergeArguments(md->argumentList(),al);
@@ -2390,7 +2405,7 @@ static bool findUnrelatedFunction(Entry *root,
while (md)
{
bool ambig;
- NamespaceDef *nd=md->getNamespace();
+ NamespaceDef *nd=md->getNamespaceDef();
//printf("Namespace namespaceName=%s nd=%s\n",
// namespaceName.data(),nd ? nd->name().data() : "<none>");
FileDef *fd=findFileDef(inputNameDict,root->fileName,ambig);
@@ -2897,7 +2912,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
{
Debug::print(Debug::FindMembers,0,
"3. member definition found scopeName=`%s'\n",scopeName.data());
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
//printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data());
ClassDef *tcd=0;
@@ -3036,7 +3051,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
md=mn->first();
while (md)
{
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
if (cd!=0 && cd->name()==className) candidates++;
md=mn->next();
}
@@ -3047,7 +3062,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
md=mn->first();
while (md)
{
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
if (cd!=0 && cd->name()==className)
{
warn_cont(" %s",md->declaration());
@@ -3075,14 +3090,14 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
// however be avoided, because it is error prone
MemberDef *md=mn->first();
ASSERT(md);
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
ASSERT(cd);
QCString className=cd->name().copy();
md=mn->next();
bool unique=TRUE;
while (md)
{
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
if (className!=cd->name()) unique=FALSE;
md=mn->next();
}
@@ -3519,7 +3534,7 @@ static void findEnums(Entry *root)
{
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{
- NamespaceDef *fnd=fmd->getNamespace();
+ NamespaceDef *fnd=fmd->getNamespaceDef();
if (fnd==nd) // enum value is inside a namespace
{
md->insertEnumField(fmd);
@@ -3537,7 +3552,7 @@ static void findEnums(Entry *root)
}
else
{
- ClassDef *fcd=fmd->memberClass();
+ ClassDef *fcd=fmd->getClassDef();
if (fcd==cd) // enum value is inside a class
{
md->insertEnumField(fmd); // add field def to list
@@ -3605,7 +3620,7 @@ static void findEnumDocumentation(Entry *root)
MemberDef *md=mn->first();
while (md && !found)
{
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
if (cd && cd->name()==className)
{
// documentation outside a compound overrides the documentation inside it
@@ -3729,8 +3744,8 @@ static void computeMemberRelations()
for ( ; bmdi.current() ; ++bmdi) // for each other member with that signature
{
MemberDef *bmd=bmdi.current();
- ClassDef *bmcd = bmd->memberClass();
- ClassDef *mcd = md->memberClass();
+ ClassDef *bmcd = bmd->getClassDef();
+ ClassDef *mcd = md->getClassDef();
//printf("Check relation between `%s'::`%s' and `%s'::`%s'\n",
// mcd->name().data(),md->name().data(),
// bmcd->name().data(),bmd->name().data()
@@ -3750,7 +3765,7 @@ static void computeMemberRelations()
{
MemberDef *rmd;
if ((rmd=md->reimplements())==0 ||
- minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->memberClass())
+ minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->getClassDef())
)
{
//printf("setting (new) reimplements member\n");
@@ -3905,13 +3920,13 @@ static void addSourceReferences()
MemberDef *md=0;
for (mni.toFirst();(md=mni.current());++mni)
{
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
FileDef *fd=md->getBodyDef();
if (fd && cd && cd->isLinkableInProject() && md->getStartBodyLine()!=-1 &&
md->isLinkableInProject())
{
Definition *d=cd;
- if (d==0) d=md->getNamespace();
+ if (d==0) d=md->getNamespaceDef();
if (d==0) d=md->getFileDef();
fd->addSourceRef(md->getStartBodyLine(),d,md);
}
@@ -3924,9 +3939,9 @@ static void addSourceReferences()
MemberDef *md=0;
for (mni.toFirst();(md=mni.current());++mni)
{
- NamespaceDef *nd=md->getNamespace();
+ NamespaceDef *nd=md->getNamespaceDef();
FileDef *fd=md->getBodyDef();
- GroupDef *gd=md->groupDef();
+ GroupDef *gd=md->getGroupDef();
if (md->getStartBodyLine()!=-1 && md->isLinkableInProject() &&
((nd && nd->isLinkableInProject()) ||
(fd && fd->isLinkableInProject()) ||
@@ -4641,22 +4656,17 @@ static void generateSearchIndex()
//----------------------------------------------------------------------------
-/*! Generate a template version of the configuration file.
- * If the \a shortList parameter is TRUE a configuration file without
- * comments will be generated.
- */
-static void generateConfigFile(const char *configFile,bool shortList)
+static bool openOutputFile(const char *outFile,QFile &f)
{
- QFile f;
bool fileOpened=FALSE;
- bool writeToStdout=(configFile[0]=='-' && configFile[1]==0);
+ bool writeToStdout=(outFile[0]=='-' && outFile[1]=='\0');
if (writeToStdout) // write to stdout
{
fileOpened = f.open(IO_WriteOnly,stdout);
}
else // write to file
{
- QFileInfo fi(configFile);
+ QFileInfo fi(outFile);
if (fi.exists()) // create a backup
{
QDir dir=fi.dir();
@@ -4665,14 +4675,24 @@ static void generateConfigFile(const char *configFile,bool shortList)
dir.remove(backup.fileName());
dir.rename(fi.fileName(),fi.fileName()+".bak");
}
- f.setName(configFile);
+ f.setName(outFile);
fileOpened = f.open(IO_WriteOnly);
}
-
+ return fileOpened;
+}
+
+/*! Generate a template version of the configuration file.
+ * If the \a shortList parameter is TRUE a configuration file without
+ * comments will be generated.
+ */
+static void generateConfigFile(const char *configFile,bool shortList)
+{
+ QFile f;
+ bool fileOpened=openOutputFile(configFile,f);
+ bool writeToStdout=(configFile[0]=='-' && configFile[1]=='\0');
if (fileOpened)
{
writeTemplateConfig(&f,shortList);
- f.close();
if (!writeToStdout)
{
msg("\n\nConfiguration file `%s' created.\n\n",configFile);
@@ -4692,60 +4712,6 @@ static void generateConfigFile(const char *configFile,bool shortList)
}
//----------------------------------------------------------------------------
-
-/*! Generate a template stylesheet
- */
-static void generateStyleSheetFile(OutputGenerator::OutputType outType,const char *sheetName)
-{
- QFile f;
- bool fileOpened=FALSE;
- bool writeToStdout = strcmp(sheetName,"-")==0;
- if (writeToStdout) // write to stdout
- {
- fileOpened = f.open(IO_WriteOnly,stdout);
- }
- else // write to file
- {
- QFileInfo fi(sheetName);
- if (fi.exists()) // create a backup
- {
- QDir dir=fi.dir();
- QFileInfo backup(fi.fileName()+".bak");
- if (backup.exists()) // remove existing backup
- dir.remove(backup.fileName());
- dir.rename(fi.fileName(),fi.fileName()+".bak");
- }
- f.setName(sheetName);
- fileOpened = f.open(IO_WriteOnly);
- }
-
- if (fileOpened)
- {
- switch(outType)
- {
- case OutputGenerator::RTF:
- RTFGenerator::writeStyleSheetFile(f);
- break;
- case OutputGenerator::Html:
- HtmlGenerator::writeStyleSheetFile(f);
- break;
- case OutputGenerator::Latex:
- LatexGenerator::writeStyleSheetFile(f);
- break;
- default:
- break;
- }
- f.close();
- }
- else
- {
- err("Error: Cannot open file %s for writing\n",sheetName);
- exit(1);
- }
-}
-
-
-//----------------------------------------------------------------------------
// read and parse a tag file
//static bool readLineFromFile(QFile &f,QCString &s)
@@ -5189,8 +5155,9 @@ static void usage(const char *name)
msg(" %s [configName]\n\n",name);
msg(" If - is used for configName doxygen will read from standard input.\n\n");
msg("4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
- msg(" %s -w rtf|html|latex outputFileName [configName]\n",name);
- msg(" If - is used for outputFileName doxygen will write to standard output.\n\n");
+ msg(" RTF: %s -w rtf styleSheetFile\n",name);
+ msg(" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
+ msg(" LaTeX: %s -w latex headerFile styleSheetFile [configFile]\n\n",name);
msg("If -s is specified the comments in the config file will be omitted.\n");
msg("If configName is omitted `Doxyfile' will be used as a default.\n\n");
exit(1);
@@ -5261,28 +5228,65 @@ int main(int argc,char **argv)
err("Error: option -w is missing format specifier rtf, html or latex\n");
exit(1);
}
- if (optind+1>=argc)
- {
- err("Error: option -w is missing a configuration file name\n");
- exit(1);
- }
if (stricmp(formatName,"rtf")==0)
{
- generateStyleSheetFile(OutputGenerator::RTF,argv[optind+1]);
+ if (optind+1>=argc)
+ {
+ err("Error: option \"-w rtf\" is missing a style sheet file name\n");
+ exit(1);
+ }
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ RTFGenerator::writeStyleSheetFile(f);
+ }
exit(1);
}
else if (stricmp(formatName,"html")==0)
{
- generateStyleSheetFile(OutputGenerator::Html,argv[optind+1]);
+ if (optind+4<argc)
+ {
+ QCString configFile=fileToString(argv[optind+4]);
+ if (configFile.isEmpty()) exit(1);
+ parseConfig(fileToString(argv[optind+4]));
+ configStrToVal();
+ substituteEnvironmentVars();
+ checkConfig();
+ }
+ else
+ {
+ Config::init();
+ setTranslator("English");
+ }
+ if (optind+3>=argc)
+ {
+ err("Error: option \"-w html\" does not have enough arguments\n");
+ exit(1);
+ }
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ HtmlGenerator::writeHeaderFile(f);
+ }
+ f.close();
+ if (openOutputFile(argv[optind+2],f))
+ {
+ HtmlGenerator::writeFooterFile(f);
+ }
+ f.close();
+ if (openOutputFile(argv[optind+3],f))
+ {
+ HtmlGenerator::writeStyleSheetFile(f);
+ }
exit(1);
}
else if (stricmp(formatName,"latex")==0)
{
- if (optind+2<argc) // use config file to get settings
+ if (optind+3<argc) // use config file to get settings
{
- QCString configFile=fileToString(argv[optind+2]);
+ QCString configFile=fileToString(argv[optind+3]);
if (configFile.isEmpty()) exit(1);
- parseConfig(fileToString(argv[optind+2]));
+ parseConfig(fileToString(argv[optind+3]));
configStrToVal();
substituteEnvironmentVars();
checkConfig();
@@ -5292,7 +5296,21 @@ int main(int argc,char **argv)
Config::init();
setTranslator("English");
}
- generateStyleSheetFile(OutputGenerator::Latex,argv[optind+1]);
+ if (optind+2>=argc)
+ {
+ err("Error: option \"-w html\" does not have enough arguments\n");
+ exit(1);
+ }
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ LatexGenerator::writeHeaderFile(f);
+ }
+ f.close();
+ if (openOutputFile(argv[optind+2],f))
+ {
+ LatexGenerator::writeStyleSheetFile(f);
+ }
exit(1);
}
else
@@ -5356,7 +5374,7 @@ int main(int argc,char **argv)
else
{
QFileInfo fi(argv[optind]);
- if (fi.exists())
+ if (fi.exists() || strcmp(argv[optind],"-")==0)
{
config=fileToString(argv[optind]);
configName=argv[optind];
@@ -5765,8 +5783,7 @@ int main(int argc,char **argv)
msg("Combining RTF output...\n");
if (!RTFGenerator::preProcessFileInplace(Config::rtfOutputDir,"refman.rtf"))
{
- err("Error processing RTF files!\n");
- exit(1);
+ err("An error occurred during post-processing the RTF files!\n");
}
}
diff --git a/src/filedef.cpp b/src/filedef.cpp
index ac174f3..eefb1ad 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -508,25 +508,46 @@ void FileDef::insertMember(MemberDef *md)
switch(md->memberType())
{
case MemberDef::Variable:
- varMembers.inSort(md);
+ if (Config::sortMembersFlag)
+ varMembers.inSort(md);
+ else
+ varMembers.append(md);
break;
- case MemberDef::Function:
- funcMembers.inSort(md);
+ case MemberDef::Function:
+ if (Config::sortMembersFlag)
+ funcMembers.inSort(md);
+ else
+ funcMembers.append(md);
break;
case MemberDef::Typedef:
- typedefMembers.inSort(md);
+ if (Config::sortMembersFlag)
+ typedefMembers.inSort(md);
+ else
+ typedefMembers.append(md);
break;
case MemberDef::Enumeration:
- enumMembers.inSort(md);
+ if (Config::sortMembersFlag)
+ enumMembers.inSort(md);
+ else
+ enumMembers.append(md);
break;
case MemberDef::EnumValue:
- enumValMembers.inSort(md);
+ if (Config::sortMembersFlag)
+ enumValMembers.inSort(md);
+ else
+ enumValMembers.append(md);
break;
case MemberDef::Prototype:
- protoMembers.inSort(md);
+ if (Config::sortMembersFlag)
+ protoMembers.inSort(md);
+ else
+ protoMembers.append(md);
break;
case MemberDef::Define:
- defineMembers.inSort(md);
+ if (Config::sortMembersFlag)
+ defineMembers.inSort(md);
+ else
+ defineMembers.append(md);
break;
default:
err("FileDef::insertMembers(): unexpected member insert in file!\n");
@@ -537,7 +558,10 @@ void FileDef::insertMember(MemberDef *md)
/*! Adds compound definition \a cd to the list of all compounds of this file */
void FileDef::insertClass(ClassDef *cd)
{
- classList->inSort(cd);
+ if (Config::sortMembersFlag)
+ classList->inSort(cd);
+ else
+ classList->append(cd);
}
/*! Adds namespace definition \a nd to the list of all compounds of this file */
@@ -545,7 +569,10 @@ void FileDef::insertNamespace(NamespaceDef *nd)
{
if (!nd->name().isEmpty() && namespaceDict->find(nd->name())==0)
{
- namespaceList->inSort(nd);
+ if (Config::sortMembersFlag)
+ namespaceList->inSort(nd);
+ else
+ namespaceList->append(nd);
namespaceDict->insert(nd->name(),nd);
}
}
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 7857cc9..72529d0 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -78,17 +78,26 @@ void GroupDef::distributeMemberGroupDocumentation()
void GroupDef::addFile(const FileDef *def)
{
- fileList->append(def);
+ if (Config::sortMembersFlag)
+ fileList->inSort(def);
+ else
+ fileList->append(def);
}
void GroupDef::addClass(const ClassDef *def)
{
- classList->append(def);
+ if (Config::sortMembersFlag)
+ classList->inSort(def);
+ else
+ classList->append(def);
}
void GroupDef::addNamespace(const NamespaceDef *def)
{
- namespaceList->append(def);
+ if (Config::sortMembersFlag)
+ namespaceList->inSort(def);
+ else
+ namespaceList->append(def);
}
void GroupDef::addMemberListToGroup(MemberList *ml,
@@ -142,15 +151,50 @@ void GroupDef::insertMember(MemberDef *md)
allMemberDict->insert(funcDecl,md);
switch(md->memberType())
{
- case MemberDef::Variable: varMembers.inSort(md); break;
- case MemberDef::Function: funcMembers.inSort(md); break;
- case MemberDef::Typedef: typedefMembers.inSort(md); break;
- case MemberDef::Enumeration: enumMembers.inSort(md); break;
- case MemberDef::EnumValue: enumValMembers.inSort(md); break;
- case MemberDef::Prototype: protoMembers.inSort(md); break;
- case MemberDef::Define: defineMembers.inSort(md); break;
+ case MemberDef::Variable:
+ if (Config::sortMembersFlag)
+ varMembers.inSort(md);
+ else
+ varMembers.append(md);
+ break;
+ case MemberDef::Function:
+ if (Config::sortMembersFlag)
+ funcMembers.inSort(md);
+ else
+ funcMembers.append(md);
+ break;
+ case MemberDef::Typedef:
+ if (Config::sortMembersFlag)
+ typedefMembers.inSort(md);
+ else
+ typedefMembers.append(md);
+ break;
+ case MemberDef::Enumeration:
+ if (Config::sortMembersFlag)
+ enumMembers.inSort(md);
+ else
+ enumMembers.append(md);
+ break;
+ case MemberDef::EnumValue:
+ if (Config::sortMembersFlag)
+ enumValMembers.inSort(md);
+ else
+ enumValMembers.append(md);
+ break;
+ case MemberDef::Prototype:
+ if (Config::sortMembersFlag)
+ protoMembers.inSort(md);
+ else
+ protoMembers.append(md);
+ break;
+ case MemberDef::Define:
+ if (Config::sortMembersFlag)
+ defineMembers.inSort(md);
+ else
+ defineMembers.append(md);
+ break;
default:
- err("FileDef::insertMembers(): unexpected member insert in file!\n");
+ err("FileDef::insertMembers(): unexpected member insert in file!\n");
}
//addMemberToGroup(md,groupId);
}
@@ -158,7 +202,10 @@ void GroupDef::insertMember(MemberDef *md)
void GroupDef::addGroup(const GroupDef *def)
{
- groupList->append(def);
+ if (Config::sortMembersFlag)
+ groupList->inSort(def);
+ else
+ groupList->append(def);
}
int GroupDef::countMembers() const
@@ -450,7 +497,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
{
- GroupDef *mgd = md->groupDef();
+ GroupDef *mgd = md->getGroupDef();
if (mgd==0)
{
gd->insertMember(md);
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 89e9b2c..913ec2f 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -45,7 +45,7 @@ static const char *defaultStyleSheet =
"A.codeRef { font-weight: normal; color: #4444ee }\n"
"DL.el { margin-left: -1cm }\n"
"DIV.fragment { width: 100%; border: none; background-color: #eeeeee }\n"
- "DIV.in { margin-left: 16 }\n"
+ //"DIV.in { margin-left: 16 }\n"
"DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }\n"
"TD.md { background-color: #f2f2ff }\n"
"DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold }\n"
@@ -96,6 +96,61 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file)
QTextStream t(&file);
t << defaultStyleSheet;
}
+
+static void writeDefaultHeaderFile(QTextStream &t,const char *title,
+ bool external)
+{
+ t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
+ "<html><head><meta name=\"robots\" content=\"noindex\">\n"
+ "<meta http-equiv=\"Content-Type\" content=\"text/html;charset="
+ << theTranslator->idLanguageCharset() << "\">\n"
+ "<title>" << title << "</title>\n";
+ t << "<link ";
+ if (external)
+ t << "doxygen=\"_doc:" << Config::docURL
+ << "\" href=\"" << Config::docURL << "/";
+ else
+ t << "href=\"";
+ if (Config::htmlStyleSheet.isEmpty())
+ {
+ t << "doxygen.css";
+ }
+ else
+ {
+ QFileInfo cssfi(Config::htmlStyleSheet);
+ if (!cssfi.exists())
+ {
+ err("Error: user specified HTML style sheet file does not exist!\n");
+ }
+ t << cssfi.fileName();
+ }
+ t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
+ "</head><body bgcolor=\"#ffffff\">\n";
+}
+
+
+void HtmlGenerator::writeHeaderFile(QFile &file)
+{
+ QTextStream t(&file);
+ writeDefaultHeaderFile(t,"$title",FALSE);
+}
+
+void HtmlGenerator::writeFooterFile(QFile &file)
+{
+ QTextStream t(&file);
+ t << "<hr><address><small>\n";
+ t << "Generated at $datetime for $projectname ";
+ t << " by <a href=\"http://www.stack.nl/~dimitri/doxygen/index.html\">\n"
+ << "<img src=\"doxygen.gif\" alt=\"doxygen\" "
+ << "align=\"middle\" border=0 width=110 height=53>\n"
+ << "</a> $doxygenversion written by"
+ << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n"
+ << " &copy;&nbsp;1997-2000</small></address>\n"
+ << "</body>\n"
+ << "</html>\n";
+}
+
+
void HtmlGenerator::startFile(const char *name,const char *title,bool external)
{
QCString fileName=name;
@@ -105,28 +160,7 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
lastFile = fileName;
if (header.isEmpty())
{
- t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
- "<html><head><meta name=\"robots\" content=\"noindex\">\n"
- "<meta http-equiv=\"Content-Type\" content=\"text/html;charset="
- << theTranslator->idLanguageCharset() << "\">\n"
- "<title>" << title << "</title>\n";
- t << "<link ";
- if (external)
- t << "doxygen=\"_doc:" << Config::docURL
- << "\" href=\"" << Config::docURL << "/";
- else
- t << "href=\"";
- if (Config::htmlStyleSheet.isEmpty())
- {
- t << "doxygen.css";
- }
- else
- {
- QFileInfo cssfi(Config::htmlStyleSheet);
- t << cssfi.fileName();
- }
- t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
- "</head><body bgcolor=\"#ffffff\">\n";
+ writeDefaultHeaderFile(t,title,external);
}
else
{
@@ -190,13 +224,13 @@ void HtmlGenerator::writeFooter(int part,bool external)
t << "src=\"";
}
t << "doxygen.gif\" alt=\"doxygen\" "
- << "align=center border=0 " << endl <<
+ << "align=\"middle\" border=0 " << endl <<
"width=110 height=53></a>" << versionString <<" ";
}
break;
default:
if (footer.isEmpty())
- t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n &copy; "
+ t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n &copy;&nbsp;"
"1997-2000</small></address>\n</body>\n</html>\n";
break;
@@ -561,7 +595,15 @@ void HtmlGenerator::endColorFont()
void HtmlGenerator::writeFormula(const char *n,const char *text)
{
if (text && text[0]=='\\') t << "<p><center>" << endl;
- t << "<img align=\"top\" src=\"" << n << "\">" << endl;
+ t << "<img align=";
+#if !defined(_WIN32)
+ t << "\"top\""; // assume Unix users use Netscape 4.x which does
+ // not seem to support align == "middle" :-((
+#else
+ t << "\"middle\""; // assume Windows users use IE or HtmlHelp which only
+ // displays formulas nicely with align == "middle"
+#endif
+ t << " src=\"" << n << "\">" << endl;
if (text && text[0]=='\\') t << "</center><p>" << endl;
}
@@ -899,7 +941,13 @@ void HtmlGenerator::endMemberGroup(bool)
void HtmlGenerator::startIndent()
{
+ // I really wanted to use CSS here to provide an indented section, but
+ // alas, Netscape is buggy enough to sometimes "forget" to end the
+ // indent cause a staircase effect where the indent continuously increases.
+ // It's back to abusing tables :-(
+
//t << "<div class=\"in\">" << endl;
+
t << "<table cellspacing=5 cellpadding=0 border=0>\n"
" <tr>\n"
" <td>\n"
diff --git a/src/htmlgen.h b/src/htmlgen.h
index cda2982..780c7d7 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -31,6 +31,8 @@ class HtmlGenerator : public OutputGenerator
~HtmlGenerator();
static void init();
static void writeStyleSheetFile(QFile &f);
+ static void writeHeaderFile(QFile &f);
+ static void writeFooterFile(QFile &f);
OutputGenerator *copy() { return new HtmlGenerator; }
//OutputGenerator *clone() { return new HtmlGenerator(*this); }
diff --git a/src/index.cpp b/src/index.cpp
index 3a76956..9e13091 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -947,7 +947,7 @@ void writeMemberList(OutputList &ol)
//!md->isReference() && md->hasDocumentation() &&
// md->name()[0]!='@' &&
md->isLinkableInProject() &&
- (cd=md->memberClass()) &&
+ (cd=md->getClassDef()) &&
cd->isLinkableInProject()
)
{
@@ -968,7 +968,7 @@ void writeMemberList(OutputList &ol)
QCString prevName;
while (md)
{
- ClassDef *cd=md->memberClass();
+ ClassDef *cd=md->getClassDef();
if (//cd && (md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) &&
//!md->isReference() && md->hasDocumentation() &&
md->isLinkableInProject() &&
@@ -1009,10 +1009,10 @@ int countClassMembers()
{
if (//(md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) &&
//!md->isReference() && !md->isRelated() && md->hasDocumentation() &&
- //md->name()[0]!='@' && (cd=md->memberClass()) && cd->isLinkable())
+ //md->name()[0]!='@' && (cd=md->getClassDef()) && cd->isLinkable())
md->isLinkableInProject() &&
!md->isRelated() &&
- (cd=md->memberClass()) &&
+ (cd=md->getClassDef()) &&
cd->isLinkableInProject()
)
{
@@ -1025,10 +1025,10 @@ int countClassMembers()
// otherMd=md;
//if (//(md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) &&
// //!md->isReference() && md->isRelated() && md->hasDocumentation() &&
- // //md->name()[0]!='@' && (cd=md->memberClass()) && cd->isLinkable()
+ // //md->name()[0]!='@' && (cd=md->getClassDef()) && cd->isLinkable()
// md->isLinkableInProject() &&
// md->isRelated() &&
- // (cd=md->memberClass()) &&
+ // (cd=md->getClassDef()) &&
// cd->isLinkableInProject()
// )
// found=TRUE;
@@ -1073,10 +1073,9 @@ void writeFileMemberList(OutputList &ol)
bool found=FALSE;
while (md && !found)
{
- FileDef *fd=md->getFileDef() ? md->getFileDef() : md->getFileDec();
- bool hasDocs =
- (md->getFileDef() && md->getFileDef()->isLinkableInProject()) ||
- (md->getFileDec() && md->getFileDec()->isLinkableInProject());
+ FileDef *fd=md->getFileDef();
+ bool hasDocs = md->getFileDef() &&
+ md->getFileDef()->isLinkableInProject();
if (fd && hasDocs &&
md->isLinkableInProject()
@@ -1099,10 +1098,9 @@ void writeFileMemberList(OutputList &ol)
QCString prevName;
while (md)
{
- FileDef *fd=md->getFileDef() ? md->getFileDef() : md->getFileDec();
- bool hasDocs =
- (md->getFileDef() && md->getFileDef()->isLinkableInProject()) ||
- (md->getFileDec() && md->getFileDec()->isLinkableInProject());
+ FileDef *fd=md->getFileDef();
+ bool hasDocs = md->getFileDef() &&
+ md->getFileDef()->isLinkableInProject();
if (fd && hasDocs &&
md->isLinkableInProject() &&
//!md->isReference() &&
@@ -1143,7 +1141,7 @@ void writeNamespaceMemberList(OutputList &ol)
bool found=FALSE;
while (md && !found)
{
- NamespaceDef *nd=md->getNamespace();
+ NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() && md->isLinkableInProject())
found=TRUE;
else
@@ -1161,7 +1159,7 @@ void writeNamespaceMemberList(OutputList &ol)
QCString prevName;
while (md)
{
- NamespaceDef *nd=md->getNamespace();
+ NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() && md->isLinkableInProject() &&
prevName!=nd->name()
)
@@ -1195,7 +1193,7 @@ int countNamespaceMembers()
bool found=FALSE;
while (md && !found)
{
- NamespaceDef *nd=md->getNamespace();
+ NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() && md->isLinkableInProject())
found=TRUE;
else
@@ -1220,11 +1218,9 @@ int countFileMembers()
bool found=FALSE;
while (md && !found)
{
- if (md->isLinkableInProject() &&
- (((fd=md->getFileDef()) && fd->isLinkableInProject())
- ||
- ((fd=md->getFileDec()) && fd->isLinkableInProject())
- )
+ if (md->isLinkableInProject() &&
+ (fd=md->getFileDef()) &&
+ fd->isLinkableInProject()
)
found=TRUE;
else
@@ -1243,8 +1239,6 @@ void writeFileMemberIndex(OutputList &ol)
if (documentedFunctions==0) return;
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
- //ol.disable(OutputGenerator::Man);
- //ol.disable(OutputGenerator::Latex);
startFile(ol,"globals","File Member Index");
startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trFileMembers());
@@ -1252,8 +1246,6 @@ void writeFileMemberIndex(OutputList &ol)
parseText(ol,theTranslator->trFileMembersDescription(Config::extractAllFlag));
writeFileMemberList(ol);
endFile(ol);
- //ol.enable(OutputGenerator::Latex);
- //ol.enable(OutputGenerator::Man);
ol.popGeneratorState();
}
diff --git a/src/language.cpp b/src/language.cpp
index 08704d3..186edae 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -30,6 +30,7 @@
#include "translator_ru.h"
#include "translator_hr.h"
#include "translator_pl.h"
+#include "translator_pt.h"
#endif
#define L_EQUAL(a) !stricmp(langName,a)
@@ -95,6 +96,10 @@ bool setTranslator(const char *langName)
{
theTranslator=new TranslatorPolish;
}
+ else if (L_EQUAL("portuguese"))
+ {
+ theTranslator=new TranslatorPortuguese;
+ }
#endif
else // use the default language (i.e. english)
{
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 1a19618..1f2e1a2 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -96,6 +96,7 @@ LatexGenerator::LatexGenerator() : OutputGenerator()
col=0;
//printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
insideTabbing=FALSE;
+ firstDescItem=TRUE;
}
LatexGenerator::~LatexGenerator()
@@ -113,6 +114,7 @@ void LatexGenerator::append(const OutputGenerator *g)
t << g->getContents();
col+=((LatexGenerator *)g)->col;
insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing;
+ firstDescItem = ((LatexGenerator *)g)->firstDescItem;
//printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
// insideTabbing ? "TRUE" : "FALSE" );
}
@@ -175,7 +177,7 @@ void LatexGenerator::init()
<< "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out" << endl;
}
-static void writeDefaultsStyleSheetPart1(QTextStream &t)
+static void writeDefaultHeaderPart1(QTextStream &t)
{
// part 1
@@ -252,7 +254,7 @@ static void writeDefaultsStyleSheetPart1(QTextStream &t)
}
-static void writeDefaultsStyleSheetPart2(QTextStream &t)
+static void writeDefaultHeaderPart2(QTextStream &t)
{
// part 2
t << "}\\\\" << endl
@@ -260,7 +262,7 @@ static void writeDefaultsStyleSheetPart2(QTextStream &t)
<< "{\\large ";
}
-static void writeDefaultsStyleSheetPart3(QTextStream &t)
+static void writeDefaultHeaderPart3(QTextStream &t)
{
// part 3
t << " Doxygen " << versionString << "}\\\\" << endl
@@ -275,16 +277,112 @@ static void writeDefaultsStyleSheetPart3(QTextStream &t)
t << "\\pagenumbering{arabic}\n";
}
-void LatexGenerator::writeStyleSheetFile(QFile &f)
+static void writeDefaultStyleSheetPart1(QTextStream &t)
+{
+ // part 1
+ t << "\\NeedsTeXFormat{LaTeX2e}\n";
+ t << "\\ProvidesPackage{doxygen}\n";
+ t << "\\RequirePackage{calc}\n";
+ t << "\\RequirePackage{array}\n";
+ t << "\\pagestyle{fancyplain}\n";
+ t << "\\addtolength{\\headwidth}{\\marginparsep}\n";
+ t << "\\addtolength{\\headwidth}{\\marginparwidth}\n";
+ t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}";
+ t << "\\cleardoublepage}}\n";
+ if (!Config::compactLatexFlag)
+ t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n";
+ t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n";
+ t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n";
+ t << " {\\fancyplain{}{\\bfseries\\rightmark}}\n";
+ t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n";
+ t << " {\\fancyplain{}{\\bfseries\\thepage}}\n";
+ t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize ";
+}
+
+static void writeDefaultStyleSheetPart2(QTextStream &t)
+{
+ t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
+}
+
+static void writeDefaultStyleSheetPart3(QTextStream &t)
+{
+ t << "}}\n";
+ t << "\\cfoot{}\n";
+ t << "\\newenvironment{CompactList}\n";
+ t << "{\\begin{list}{}{\n";
+ t << " \\setlength{\\leftmargin}{0.5cm}\n";
+ t << " \\setlength{\\itemsep}{0pt}\n";
+ t << " \\setlength{\\parsep}{0pt}\n";
+ t << " \\setlength{\\topsep}{0pt}\n";
+ t << " \\renewcommand{\\makelabel}{}}}\n";
+ t << "{\\end{list}}\n";
+ t << "\\newenvironment{CompactItemize}\n";
+ t << "{\n";
+ t << " \\begin{itemize}\n";
+ t << " \\setlength{\\itemsep}{-3pt}\n";
+ t << " \\setlength{\\parsep}{0pt}\n";
+ t << " \\setlength{\\topsep}{0pt}\n";
+ t << " \\setlength{\\partopsep}{0pt}\n";
+ t << "}\n";
+ t << "{\\end{itemize}}\n";
+ t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
+ t << "\\newlength{\\tmplength}\n";
+ t << "\\newenvironment{TabularC}[1]\n";
+ t << "{\n";
+ t << "\\setlength{\\tmplength}\n";
+ t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
+ t << " \\par\\begin{tabular*}{\\linewidth}\n";
+ t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
+ t << "}\n";
+ t << "{\\end{tabular*}\\par}\n";
+ t << "\\newcommand{\\entrylabel}[1]{\n";
+ t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n";
+ t << "\\newenvironment{Desc}\n";
+ t << "{\\begin{list}{}\n";
+ t << " {\n";
+ t << " \\settowidth{\\labelwidth}{40pt}\n";
+ t << " \\setlength{\\leftmargin}{\\labelwidth}\n";
+ t << " \\setlength{\\parsep}{0pt}\n";
+ t << " \\setlength{\\itemsep}{-4pt}\n";
+ t << " \\renewcommand{\\makelabel}{\\entrylabel}\n";
+ t << " }\n";
+ t << "}\n";
+ t << "{\\end{list}}\n";
+
+ t << "\\newenvironment{Indent}\n";
+ t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
+ t << " \\item[]\\ignorespaces}\n";
+ t << " {\\unskip\\end{list}}\n";
+
+ t << "\\setlength{\\parindent}{0cm}\n";
+ t << "\\setlength{\\parskip}{0.2cm}\n";
+ t << "\\addtocounter{secnumdepth}{1}\n";
+ t << "\\sloppy\n";
+}
+
+void LatexGenerator::writeHeaderFile(QFile &f)
{
QTextStream t(&f);
- writeDefaultsStyleSheetPart1(t);
+ writeDefaultHeaderPart1(t);
t << "Your title here";
- writeDefaultsStyleSheetPart2(t);
+ writeDefaultHeaderPart2(t);
t << "Generated by";
- writeDefaultsStyleSheetPart3(t);
+ writeDefaultHeaderPart3(t);
}
+void LatexGenerator::writeStyleSheetFile(QFile &f)
+{
+ QTextStream t(&f);
+ writeDefaultStyleSheetPart1(t);
+ t << "Generated at " << dateToString(TRUE);
+ if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " ";
+ t << "by doxygen written by Dimitri van Heesch \\copyright{} 1997-2000";
+ writeDefaultStyleSheetPart2(t);
+ t << "Generated at " << dateToString(TRUE);
+ if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " ";
+ t << "by doxygen written by Dimitri van Heesch \\copyright{} 1997-2000";
+ writeDefaultStyleSheetPart3(t);
+}
void LatexGenerator::startFile(const char *name,const char *,bool)
{
@@ -316,7 +414,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
{
if (Config::latexHeaderFile.isEmpty())
{
- writeDefaultsStyleSheetPart1(t);
+ writeDefaultHeaderPart1(t);
}
else
{
@@ -328,7 +426,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
case isTitlePageAuthor:
if (Config::latexHeaderFile.isEmpty())
{
- writeDefaultsStyleSheetPart2(t);
+ writeDefaultHeaderPart2(t);
}
break;
case isMainPage:
@@ -365,7 +463,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (gd && !found)
{
- if (gd->isLinkableInProject() || gd->countMembers()>0)
+ if (gd->countMembers()>0)
{
if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Module Documentation}\n";
@@ -381,7 +479,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
- if (nd->isLinkableInProject())
+ if (nd->isLinkableInProject() && nd->countMembers()>0)
{
if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; // Namespace Documentation}\n":
@@ -458,7 +556,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
case isTitlePageAuthor:
if (Config::latexHeaderFile.isEmpty())
{
- writeDefaultsStyleSheetPart3(t);
+ writeDefaultHeaderPart3(t);
}
break;
case isMainPage:
@@ -512,7 +610,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
- if (nd->isLinkableInProject() || nd->countMembers()>0)
+ if (nd->isLinkableInProject() && nd->countMembers()>0)
{
t << "}\n\\input{" << nd->getOutputFileBase() << "}\n";
found=TRUE;
@@ -521,7 +619,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
}
while (nd)
{
- if (nd->isLinkableInProject() || nd->countMembers()>0)
+ if (nd->isLinkableInProject() && nd->countMembers()>0)
{
if (Config::compactLatexFlag) t << "\\input"; else t << "\\include";
t << "{" << nd->getOutputFileBase() << "}\n";
@@ -640,23 +738,7 @@ void LatexGenerator::writeStyleInfo(int part)
{
//QCString pname=Config::projectName.stripWhiteSpace();
startPlainFile("doxygen.sty");
- t << "\\NeedsTeXFormat{LaTeX2e}\n";
- t << "\\ProvidesPackage{doxygen}\n";
- t << "\\RequirePackage{calc}\n";
- t << "\\RequirePackage{array}\n";
- t << "\\pagestyle{fancyplain}\n";
- t << "\\addtolength{\\headwidth}{\\marginparsep}\n";
- t << "\\addtolength{\\headwidth}{\\marginparwidth}\n";
- t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}";
- t << "\\cleardoublepage}}\n";
- if (!Config::compactLatexFlag)
- t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n";
- t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n";
- t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n";
- t << " {\\fancyplain{}{\\bfseries\\rightmark}}\n";
- t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n";
- t << " {\\fancyplain{}{\\bfseries\\thepage}}\n";
- t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize ";
+ writeDefaultStyleSheetPart1(t);
}
break;
case 1:
@@ -665,83 +747,15 @@ void LatexGenerator::writeStyleInfo(int part)
break;
case 2:
{
- t << " Dimitri van Heesch \\copyright{} 1997-2000}]{}\n";
- //QCString dtString=dateToString(FALSE);
- t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
+ t << " Dimitri van Heesch \\copyright{} 1997-2000";
+ t << "}]{}\n";
+ writeDefaultStyleSheetPart2(t);
}
break;
case 4:
{
- t << " Dimitri van Heesch \\copyright{} 1997-2000}}\n";
- t << "\\cfoot{}\n";
- t << "\\newenvironment{CompactList}\n";
- t << "{\\begin{list}{}{\n";
- t << " \\setlength{\\leftmargin}{0.5cm}\n";
- t << " \\setlength{\\itemsep}{0pt}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\topsep}{0pt}\n";
- t << " \\renewcommand{\\makelabel}{}}}\n";
- t << "{\\end{list}}\n";
- t << "\\newenvironment{CompactItemize}\n";
- t << "{\n";
- t << " \\begin{itemize}\n";
- t << " \\setlength{\\itemsep}{-3pt}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\topsep}{0pt}\n";
- t << " \\setlength{\\partopsep}{0pt}\n";
- t << "}\n";
- t << "{\\end{itemize}}\n";
- t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
- t << "\\newlength{\\tmplength}\n";
- t << "\\newenvironment{TabularC}[1]\n";
- t << "{\n";
- t << "\\setlength{\\tmplength}\n";
- t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
- t << " \\par\\begin{tabular*}{\\linewidth}\n";
- t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
- t << "}\n";
- t << "{\\end{tabular*}\\par}\n";
- t << "\\newcommand{\\entrylabel}[1]{\n";
- t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n";
- t << "\\newenvironment{Desc}\n";
- t << "{\\begin{list}{}\n";
- t << " {\n";
- t << " \\settowidth{\\labelwidth}{40pt}\n";
- t << " \\setlength{\\leftmargin}{\\labelwidth}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\itemsep}{-4pt}\n";
- t << " \\renewcommand{\\makelabel}{\\entrylabel}\n";
- t << " }\n";
- t << "}\n";
- t << "{\\end{list}}\n";
-
- t << "\\newenvironment{Indent}\n";
- t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
- t << " \\item[]\\ignorespaces}\n";
- t << " {\\unskip\\end{list}}\n";
-
- t << "\\setlength{\\parindent}{0cm}\n";
- t << "\\setlength{\\parskip}{0.2cm}\n";
- t << "\\addtocounter{secnumdepth}{1}\n";
- //if (!Config::compactLatexFlag)
- //{
- // t << "\\renewcommand{\\subsection}{\\@startsection{subsection}{2}{\\z@}\n";
- // t << " {-3.25ex \\@plus -1ex \\@minus -.2ex}\n";
- // t << " {1.5ex \\@plus.2ex}\n";
- // t << " {\\normalfont\\large\\bfseries\\medskip\n";
- // t << " \\vspace{0.6cm}\\hrule\\vspace{-0.6cm}}\n";
- // t << " }\n";
- //}
- //else
- //{
- // t << "\\renewcommand{\\subsubsection}{\\@startsection{subsubsection}{3}{\\z@}\n";
- // t << " {-3.25ex \\@plus -1ex \\@minus -.2ex}\n";
- // t << " {1.5ex \\@plus.2ex}\n";
- // t << " {\\normalfont\\normalsize\\bfseries\\medskip\n";
- // t << " \\vspace{0.6cm}\\hrule\\vspace{-0.6cm}}\n";
- // t << " }\n";
- //}
- t << "\\sloppy\n";
+ t << " Dimitri van Heesch \\copyright{} 1997-2000";
+ writeDefaultStyleSheetPart3(t);
endPlainFile();
}
break;
@@ -1435,4 +1449,33 @@ void LatexGenerator::endInclDepGraph(DotInclDepGraph &g)
g.writeGraph(t,EPS,Config::latexOutputDir);
}
+void LatexGenerator::startDescription()
+{
+ t << "\\begin{description}" << endl;
+}
+
+void LatexGenerator::endDescription()
+{
+ t << "\\end{description}" << endl;
+ firstDescItem=TRUE;
+}
+
+void LatexGenerator::startDescItem()
+{
+ firstDescItem=TRUE;
+ t << "\\item[";
+}
+
+void LatexGenerator::endDescItem()
+{
+ if (firstDescItem)
+ {
+ t << "]" << endl;
+ firstDescItem=FALSE;
+ }
+ else
+ {
+ lineBreak();
+ }
+}
diff --git a/src/latexgen.h b/src/latexgen.h
index 63af7f5..cb0ab81 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -29,6 +29,7 @@ class LatexGenerator : public OutputGenerator
~LatexGenerator();
static void init();
static void writeStyleSheetFile(QFile &f);
+ static void writeHeaderFile(QFile &f);
OutputGenerator *copy();
//OutputGenerator *clone() { return new LatexGenerator(*this); }
@@ -117,10 +118,10 @@ class LatexGenerator : public OutputGenerator
void endEmphasis() { t << "}"; }
void startBold() { t << "{\\bf "; }
void endBold() { t << "}"; }
- void startDescription() { t << "\\begin{description}" << endl; }
- void endDescription() { t << "\\end{description}" << endl; }
- void startDescItem() { t << "\\item["; }
- void endDescItem() { t << "]" << endl; }
+ void startDescription();
+ void endDescription();
+ void startDescItem();
+ void endDescItem();
void lineBreak() { t << "\\par\n"; }
void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc();
@@ -236,6 +237,7 @@ class LatexGenerator : public OutputGenerator
LatexGenerator &operator=(const LatexGenerator &);
int col;
bool insideTabbing;
+ bool firstDescItem;
};
#endif
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 6311c8a..396692a 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -236,7 +236,7 @@ MemberDef::MemberDef(const char *df,int dl,
//printf("++++++ MemberDef(%s file=%s,line=%d) ++++++ \n",na,df,dl);
classDef=0;
fileDef=0;
- fileDec=0;
+ //fileDec=0;
redefines=0;
redefinedBy=0;
nspace=0;
@@ -392,10 +392,10 @@ QCString MemberDef::getOutputFileBase() const
{
return fileDef->getOutputFileBase();
}
- else if (fileDec)
- {
- return fileDec->getOutputFileBase();
- }
+ //else if (fileDec)
+ //{
+ // return fileDec->getOutputFileBase();
+ //}
else if (nspace)
{
return nspace->getOutputFileBase();
@@ -703,10 +703,10 @@ void MemberDef::writeDeclaration(OutputList &ol,
{
//printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
annMemb->writeLink(ol,
- annMemb->memberClass(),
- annMemb->getNamespace(),
+ annMemb->getClassDef(),
+ annMemb->getNamespaceDef(),
annMemb->getFileDef(),
- annMemb->groupDef()
+ annMemb->getGroupDef()
);
annMemb->annUsed=annUsed=TRUE;
}
@@ -794,7 +794,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
const char *scopeName)
{
- if (memberClass()==0 && isStatic() && !Config::extractStaticFlag) return;
+ if (getClassDef()==0 && isStatic() && !Config::extractStaticFlag) return;
bool hasDocs = detailsAreVisible();
//printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition());
if (
@@ -806,8 +806,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
)
{
// get definition. TODO: make a method of this
- NamespaceDef *nd=getNamespace();
- ClassDef *cd=memberClass();
+ NamespaceDef *nd=getNamespaceDef();
+ ClassDef *cd=getClassDef();
FileDef *fd=getFileDef();
Definition *d = 0;
if (cd) d=cd; else if (nd) d=nd; else d=fd;
@@ -1160,7 +1160,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
MemberDef *bmd=reimplements();
ClassDef *bcd=0;
- if (bmd && (bcd=bmd->memberClass()))
+ if (bmd && (bcd=bmd->getClassDef()))
{
#if 0
if (lvirt!=Normal) // search for virtual member of the deepest base class
@@ -1168,7 +1168,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
MemberDef *lastBmd=bmd;
while (lastBmd)
{
- ClassDef *lastBcd = lastBmd->memberClass();
+ ClassDef *lastBcd = lastBmd->getClassDef();
if (lastBmd->virtualness()!=Normal &&
lastBmd->isLinkable() &&
lastBcd->isLinkable()
@@ -1227,7 +1227,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
MemberDef *bmd=0;
uint count=0;
ClassDef *bcd=0;
- for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->memberClass());++mli)
+ for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->getClassDef());++mli)
{
// count the members that directly inherit from md and for
// which the member and class are visible in the docs.
@@ -1253,7 +1253,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
count=0;
// find the entryIndex-th documented entry in the inheritance list.
- for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->memberClass());--mli)
+ for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli)
{
if ( bmd->isLinkable() && bcd->isLinkable())
{
@@ -1310,10 +1310,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
void MemberDef::warnIfUndocumented()
{
if (memberGroup) return;
- ClassDef *cd = memberClass();
- NamespaceDef *nd = getNamespace();
+ ClassDef *cd = getClassDef();
+ NamespaceDef *nd = getNamespaceDef();
FileDef *fd = getFileDef();
- GroupDef *gd = groupDef();
+ GroupDef *gd = getGroupDef();
Definition *d=0;
const char *t=0;
if (cd)
@@ -1348,7 +1348,7 @@ bool MemberDef::isLinkable()
bool MemberDef::detailsAreVisible() const
{
return !documentation().isEmpty() || // has detailed docs
- /*(Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) || // has reference to sources */
+ (Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) || // has reference to sources
(mtype==Enumeration && docEnumValues) || // has enum values
(mtype==EnumValue && !briefDescription().isEmpty()) || // is doc enum value
(!briefDescription().isEmpty() &&
@@ -1385,7 +1385,7 @@ bool MemberDef::visibleMemberGroup(bool hideNoHeader)
QCString MemberDef::getScopeString() const
{
QCString result;
- if (memberClass()) result=memberClass()->name();
- else if (getNamespace()) result=getNamespace()->name();
+ if (getClassDef()) result=getClassDef()->name();
+ else if (getNamespaceDef()) result=getNamespaceDef()->name();
return result;
}
diff --git a/src/memberdef.h b/src/memberdef.h
index d827eb0..c8cab13 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -72,6 +72,71 @@ class MemberDef : public Definition
const ArgumentList *al);
~MemberDef();
+ QCString getOutputFileBase() const;
+ const char *declaration() const { return decl; }
+ const char *definition() const { return def; }
+ const char *typeString() const { return type; }
+ const char *argsString() const { return args; }
+ const char *excpString() const { return exception; }
+ const char *anchor() const { return anc; }
+ const QCString &initializer() const { return init; }
+ int initializerLines() const { return initLines; }
+ int getMemberSpecifiers() const { return memSpec; }
+ MemberList *getSectionList() const { return section; }
+
+ // scope query members
+ ClassDef *getClassDef() const { return classDef; }
+ GroupDef *getGroupDef() const { return group; }
+ FileDef *getFileDef() const { return fileDef; }
+ NamespaceDef* getNamespaceDef() const { return nspace; }
+
+ // direct kind info
+ Protection protection() const { return prot; }
+ Specifier virtualness() const { return virt; }
+ MemberType memberType() const { return mtype; }
+
+ // convenience methods
+ bool isSignal() const { return mtype==Signal; }
+ bool isSlot() const { return mtype==Slot; }
+ bool isVariable() const { return mtype==Variable; }
+ bool isEnumerate() const { return mtype==Enumeration; }
+ bool isEnumValue() const { return mtype==EnumValue; }
+ bool isTypedef() const { return mtype==Typedef; }
+ bool isFunction() const { return mtype==Function; }
+ bool isDefine() const { return mtype==Define; }
+ bool isFriend() const { return mtype==Friend; }
+ bool isRelated() const { return related; }
+ bool isStatic() const { return stat; }
+ bool isInline() const { return (memSpec&Entry::Inline)!=0; }
+ bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; }
+ bool isMutable() const { return (memSpec&Entry::Mutable)!=0; }
+
+ // output info
+ bool isLinkableInProject();
+ bool isLinkable();
+ bool detailsAreVisible() const;
+ bool hasDocumentation(); // overrides hasDocumentation in definition.h
+
+ // set functions
+ void setMemberType(MemberType t) { mtype=t; }
+ void setDefinition(const char *d) { def=d; }
+ void setFileDef(FileDef *fd) { fileDef=fd; }
+ void setAnchor(const char *a) { anc=a; }
+ void setProtection(Protection p) { prot=p; }
+ void setMemberSpecifiers(int s) { memSpec=s; }
+ void mergeMemberSpecifiers(int s) { memSpec|=s; }
+ void setInitializer(const char *i) { init=i;
+ init=init.stripWhiteSpace();
+ initLines=init.contains('\n');
+ }
+ void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; }
+ void setMemberClass(ClassDef *cd) { classDef=cd; }
+ void setSectionList(MemberList *sl) { section=sl; }
+ void setGroupDef(GroupDef *gd) { group=gd; }
+
+ void makeRelated() { related=TRUE; }
+
+ // output generatation
void writeLink(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
void writeDeclaration(OutputList &ol,
@@ -81,56 +146,11 @@ class MemberDef : public Definition
const char *scopeName/*,MemberType m*/);
void warnIfUndocumented();
- QCString getOutputFileBase() const;
- const char *declaration() const { return decl; }
- const char *definition() const { return def; }
- const char *typeString() const { return type; }
- const char *argsString() const { return args; }
- const char *excpString() const { return exception; }
- const char *anchor() const { return anc; }
- const QCString &initializer() const { return init; }
- int initializerLines() const { return initLines; }
- ClassDef *memberClass() const { return classDef; }
- Protection protection() const { return prot; }
- Specifier virtualness() const { return virt; }
- MemberType memberType() const { return mtype; }
- GroupDef *groupDef() const { return group; }
- FileDef *getFileDef() { return fileDef; }
- FileDef *getFileDec() { return fileDec; }
- bool isRelated() const { return related; }
- bool isStatic() const { return stat; }
- bool isInline() const { return (memSpec&Entry::Inline)!=0; }
- bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; }
- bool isMutable() const { return (memSpec&Entry::Mutable)!=0; }
- MemberList *getSectionList() const { return section; }
- void setMemberType(MemberType t) { mtype=t; }
- void setDefinition(const char *d) { def=d; }
- void setFileDef(FileDef *fd) { fileDef=fd; }
- void setFileDec(FileDef *fd) { fileDec=fd; }
- void setAnchor(const char *a) { anc=a; }
- void setProtection(Protection p) { prot=p; }
- void setMemberSpecifiers(int s) { memSpec=s; }
- int getMemberSpecifiers() const { return memSpec; }
- void mergeMemberSpecifiers(int s) { memSpec|=s; }
- void setInitializer(const char *i) { init=i;
- init=init.stripWhiteSpace();
- initLines=init.contains('\n');
- }
- void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; }
- void setMemberClass(ClassDef *cd) { classDef=cd; }
- void setSectionList(MemberList *sl) { section=sl; }
- void makeRelated() { related=TRUE; }
- void setGroupDef(GroupDef *gd) { group=gd; }
- bool hasDocumentation(); // overrides hasDocumentation in definition.h
- bool isLinkableInProject();
- bool isLinkable();
-
- bool detailsAreVisible() const;
// relation to other members
- void setReimplements(MemberDef *md) { redefines=md; }
+ void setReimplements(MemberDef *md) { redefines=md; }
void insertReimplementedBy(MemberDef *md);
- MemberDef *reimplements() const { return redefines; }
- MemberList *reimplementedBy() const { return redefinedBy; }
+ MemberDef *reimplements() const { return redefines; }
+ MemberList *reimplementedBy() const { return redefinedBy; }
// enumeration specific members
void insertEnumField(MemberDef *md);
@@ -148,20 +168,9 @@ class MemberDef : public Definition
// example related members
bool addExample(const char *anchor,const char *name,const char *file);
- //void writeExample(OutputList &ol);
bool hasExamples();
ExampleList *getExampleList() const { return exampleList; }
- // convenience members
- bool isSignal() const { return mtype==Signal; }
- bool isSlot() const { return mtype==Slot; }
- bool isVariable() const { return mtype==Variable; }
- bool isEnumerate() const { return mtype==Enumeration; }
- bool isEnumValue() const { return mtype==EnumValue; }
- bool isTypedef() const { return mtype==Typedef; }
- bool isFunction() const { return mtype==Function; }
- bool isDefine() const { return mtype==Define; }
- bool isFriend() const { return mtype==Friend; }
// prototype related members
void setPrototype(bool p) { proto=p; }
@@ -178,10 +187,8 @@ class MemberDef : public Definition
ArgumentList *scopeDefTemplateArguments() const { return scopeTAL; }
void setMemberDefTemplateArguments(ArgumentList *t);
ArgumentList *memberDefTemplateArguments() const { return membTAL; }
- //QCString getScopeTemplateNameString();
// namespace related members
- NamespaceDef *getNamespace() const { return nspace; }
void setNamespace(NamespaceDef *nd) { nspace=nd; }
// member group related members
@@ -190,6 +197,7 @@ class MemberDef : public Definition
void setMemberGroupId(int id) { grpId=id; }
int getMemberGroupId() const { return grpId; }
+ // annonymous scope members
void setFromAnnonymousScope(bool b) { annScope=b; }
void setFromAnnonymousMember(MemberDef *m) { annMemb=m; }
bool fromAnnonymousScope() const { return annScope; }
@@ -204,7 +212,6 @@ class MemberDef : public Definition
private:
ClassDef *classDef; // member of or related to
FileDef *fileDef; // member of file definition
- FileDef *fileDec; // member of file declaration
MemberDef *redefines; // the member that is redefined by this one
MemberDef *enumScope; // the enclosing scope, if this is an enum field
MemberDef *annEnumType; // the annonymous enum that is the type of this member
@@ -225,8 +232,6 @@ class MemberDef : public Definition
QCString declFile; // file where the declaration was found
int declLine; // line where the declaration was found
QCString def; // member definition in code (fully qualified name)
- //QCString defFile; // file where the definition was found
- //int defLine; // line where the definition was found
QCString anc; // HTML anchor name
Specifier virt; // normal/virtual/pure virtual
Protection prot; // protection type [Public/Protected/Private]
@@ -237,10 +242,10 @@ class MemberDef : public Definition
bool eUsed; // is the enumerate already placed in a list
bool proto; // is it a prototype;
bool docEnumValues; // is an enum with documented enum values.
- bool annScope;
- bool annUsed;
- bool annShown;
- int indDepth;
+ bool annScope; // member is part of an annoymous scope
+ bool annUsed;
+ bool annShown;
+ int indDepth; // indentation depth for this member if inside an annonymous scope
int maxInitLines; // when the initializer will be displayed
MemberList *section; // declation list containing this member
MemberDef *annMemb;
@@ -249,7 +254,6 @@ class MemberDef : public Definition
ArgumentList *scopeTAL; // template argument list of class template
ArgumentList *membTAL; // template argument list of class template
int grpId; // group id
- //QCString grpHeader; // group header
MemberGroup *memberGroup; // group's member definition
GroupDef *group; // group in which this member is in
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index e49b0ef..2ec52f1 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -54,7 +54,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe
{
//printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n",
// md,md->name().data(),inGroup,md->getMemberGroup());
- if (!(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag) &&
+ if (!(md->getClassDef()==0 && md->isStatic() && !Config::extractStaticFlag) &&
(!Config::hideMemberFlag || md->hasDocumentation()) &&
(
(!Config::hideMemberFlag || !md->documentation().isEmpty() ||
@@ -73,7 +73,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe
case MemberDef::Variable: varCnt++,m_count++; break;
case MemberDef::Function: // fall through
case MemberDef::Signal: // fall through
- case MemberDef::Slot: if (!md->isRelated() || md->memberClass())
+ case MemberDef::Slot: if (!md->isRelated() || md->getClassDef())
funcCnt++,m_count++;
break;
case MemberDef::Enumeration: enumCnt++,m_count++; break;
@@ -119,7 +119,7 @@ void MemberList::countDocMembers()
//printf("%s MemberList::countDocMembers() details=%d\n",
// md->name().data(),md->detailsAreVisible());
bool visibleIfStatic =
- !(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag);
+ !(md->getClassDef()==0 && md->isStatic() && !Config::extractStaticFlag);
if (visibleIfStatic &&
(Config::extractAllFlag || md->detailsAreVisible())
@@ -410,7 +410,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
{
if (
( md->isFunction() || md->isSignal() || md->isSlot()) &&
- ( !md->isRelated() || md->memberClass() ) &&
+ ( !md->isRelated() || md->getClassDef() ) &&
inGroup==md->visibleMemberGroup(sectionPerType)
)
{
diff --git a/src/membername.cpp b/src/membername.cpp
index e62e629..3c3a3d0 100644
--- a/src/membername.cpp
+++ b/src/membername.cpp
@@ -33,8 +33,8 @@ int MemberName::compareItems(GCI item1, GCI item2)
{
MemberDef *m1=(MemberDef *)item1;
MemberDef *m2=(MemberDef *)item2;
- ClassDef *c1=m1->memberClass();
- ClassDef *c2=m2->memberClass();
+ ClassDef *c1=m1->getClassDef();
+ ClassDef *c2=m2->getClassDef();
FileDef *f1=m1->getFileDef();
FileDef *f2=m2->getFileDef();
if (c1 && c2)
@@ -55,8 +55,8 @@ int MemberNameInfo::compareItems(GCI item1, GCI item2)
{
MemberInfo *m1=(MemberInfo *)item1;
MemberInfo *m2=(MemberInfo *)item2;
- ClassDef *c1=m1->memberDef->memberClass();
- ClassDef *c2=m2->memberDef->memberClass();
+ ClassDef *c1=m1->memberDef->getClassDef();
+ ClassDef *c2=m2->memberDef->getClassDef();
FileDef *f1=m1->memberDef->getFileDef();
FileDef *f2=m2->memberDef->getFileDef();
if (c1 && c2)
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 366e49b..54aa1e6 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -66,14 +66,23 @@ void NamespaceDef::distributeMemberGroupDocumentation()
}
void NamespaceDef::insertUsedFile(const char *f)
{
- if (files.find(f)==-1) files.append(f);
+ if (files.find(f)==-1)
+ {
+ if (Config::sortMembersFlag)
+ files.inSort(f);
+ else
+ files.append(f);
+ }
}
void NamespaceDef::insertClass(ClassDef *cd)
{
if (classDict->find(cd->name())==0)
{
- classList->append(cd);
+ if (Config::sortMembersFlag)
+ classList->inSort(cd);
+ else
+ classList->append(cd);
classDict->insert(cd->name(),cd);
}
}
@@ -121,13 +130,48 @@ void NamespaceDef::insertMember(MemberDef *md)
allMemberList.append(md);
switch(md->memberType())
{
- case MemberDef::Variable: varMembers.inSort(md); break;
- case MemberDef::Function: funcMembers.inSort(md); break;
- case MemberDef::Typedef: typedefMembers.inSort(md); break;
- case MemberDef::Enumeration: enumMembers.inSort(md); break;
- case MemberDef::EnumValue: enumValMembers.inSort(md); break;
- case MemberDef::Prototype: protoMembers.inSort(md); break;
- case MemberDef::Define: defineMembers.inSort(md); break;
+ case MemberDef::Variable:
+ if (Config::sortMembersFlag)
+ varMembers.inSort(md);
+ else
+ varMembers.append(md);
+ break;
+ case MemberDef::Function:
+ if (Config::sortMembersFlag)
+ funcMembers.inSort(md);
+ else
+ funcMembers.append(md);
+ break;
+ case MemberDef::Typedef:
+ if (Config::sortMembersFlag)
+ typedefMembers.inSort(md);
+ else
+ typedefMembers.append(md);
+ break;
+ case MemberDef::Enumeration:
+ if (Config::sortMembersFlag)
+ enumMembers.inSort(md);
+ else
+ enumMembers.append(md);
+ break;
+ case MemberDef::EnumValue:
+ if (Config::sortMembersFlag)
+ enumValMembers.inSort(md);
+ else
+ enumValMembers.append(md);
+ break;
+ case MemberDef::Prototype:
+ if (Config::sortMembersFlag)
+ protoMembers.inSort(md);
+ else
+ protoMembers.append(md);
+ break;
+ case MemberDef::Define:
+ if (Config::sortMembersFlag)
+ defineMembers.inSort(md);
+ else
+ defineMembers.append(md);
+ break;
default:
err("NamespaceDef::insertMembers(): unexpected member inserted in namespace!\n");
}
diff --git a/src/pre.l b/src/pre.l
index cc80748..cf4df3b 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -51,8 +51,6 @@
#define YY_NEVER_INTERACTIVE 1
-#define DUMP_OUTPUT 1 // set this to one to see what the preprocessor
- // produces.
#define SHOW_INCLUDES 0 // set this to one to list all parsed include files
struct FileState
@@ -590,10 +588,10 @@ static void expandExpression(QCString &expr,QCString *rest,int pos)
if (g_expandedDict->find(macroName)==0) // expand macro
{
Define *def=isDefined(macroName);
- //printf("name is not an expanded macro def=%s\n",def ? def->name.data() : 0);
if (def && def->nargs==-1) // simple macro
{
// substitute the definition of the macro
+ //printf("macro `%s'->`%s'\n",macroName.data(),def->definition.data());
expMacro=def->definition.stripWhiteSpace();
replaced=TRUE;
len=l;
@@ -774,6 +772,7 @@ Define *newDefine()
def->fileName = g_yyFileName;
def->lineNr = g_yyLineNr;
def->varArgs = g_defVarArgs;
+ //printf("newDefine: `%s'->`%s'\n",def->name.data(),def->definition.data());
if (!def->name.isEmpty() && expandAsDefinedDict[def->name])
{
def->isPredefined=TRUE;
@@ -1520,7 +1519,7 @@ BN [ \t\r\n]
g_defLitText+=yytext;
outputChar('\n');
Define *def=0;
- //printf("Define name=`%s' text=`%s'\n",g_defName.data(),g_defText.data());
+ //printf("Define name=`%s' text=`%s' litTexti=`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data());
if (g_includeStack.isEmpty())
{
addDefine();
@@ -1528,10 +1527,12 @@ BN [ \t\r\n]
def=g_fileDefineDict->find(g_defName);
if (def==0) // new define
{
+ //printf("new define!\n");
g_fileDefineDict->insert(g_defName,newDefine());
}
else if (def)// name already exists
{
+ //printf("existing define!\n");
//printf("define found\n");
if (def->undef) // undefined name
{
@@ -1860,23 +1861,21 @@ void preprocessFile(const char *fileName,BufStr &output)
else
pclose(preYYin);
-//#if DUMP_OUTPUT
if (Debug::isFlagSet(Debug::Preprocessor))
{
char *orgPos=output.data()+orgOffset;
char *newPos=output.data()+output.curPos();
- printf("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
+ msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
int line=1;
- printf("---------\n00001 ");
+ msg("---------\n00001 ");
while (orgPos<newPos)
{
putchar(*orgPos);
if (*orgPos=='\n') printf("%05d ",++line);
orgPos++;
}
- printf("\n---------\n");
+ msg("\n---------\n");
}
-//#endif
}
extern "C" { // some bogus code to keep the compiler happy
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 1dc7e87..5239ffd 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -650,7 +650,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (gd && !found)
{
- if (gd->isLinkableInProject() || gd->countMembers()>0)
+ if (gd->countMembers()>0)
{
beginRTFChapter();
found=TRUE;
@@ -666,7 +666,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
- if (nd->isLinkableInProject())
+ if (nd->isLinkableInProject() && nd->countMembers()>0)
{
beginRTFChapter();
found=TRUE;
@@ -840,7 +840,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
- if (nd->isLinkableInProject() || nd->countMembers()>0)
+ if (nd->isLinkableInProject() && nd->countMembers()>0)
{
t << "\\par " << Rtf_Style["Reset"] << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
@@ -852,7 +852,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
}
while (nd)
{
- if (nd->isLinkableInProject() || nd->countMembers()>0)
+ if (nd->isLinkableInProject() && nd->countMembers()>0)
{
t << "\\par " << Rtf_Style["Reset"] << endl;
beginRTFSection();
diff --git a/src/scanner.l b/src/scanner.l
index 9967667..ba99f5b 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -2449,7 +2449,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
lineCount();
BEGIN( CompoundName );
}
-<FindMembers>{B}*("disp")?"interface"{BN}+ { // M$/Corba IDL interface
+<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL interface
isTypedef=FALSE;
current->section = Entry::INTERFACE_SEC;
addType( current ) ;
@@ -3157,24 +3157,31 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
//printf("adding `%s' `%s' `%s' to enum `%s' (mGrpId=%d)\n",
// current->type.data(), current->name.data(),
// current->args.data(), current_root->name.data(),current->mGrpId);
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->type = "@"; // enum marker
- current->args = current->args.simplifyWhiteSpace();
- current->name = current->name.stripWhiteSpace();
- current->section = Entry::VARIABLE_SEC;
- // add to the scope of the enum
- current_root->addSubEntry(current);
- current = new Entry(*current);
- // add to the scope surrounding the enum (copy!)
- current_root->parent->addSubEntry(current);
- current = new Entry ;
- current->protection = protection ;
- current->sig = sig;
- current->virt = virt;
- current->stat = gstat;
- current->slot = slot;
- current->mGrpId = memberGroupId;
+ if (!current->name.isEmpty())
+ {
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type = "@"; // enum marker
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ // add to the scope of the enum
+ current_root->addSubEntry(current);
+ current = new Entry(*current);
+ // add to the scope surrounding the enum (copy!)
+ current_root->parent->addSubEntry(current);
+ current = new Entry ;
+ current->protection = protection ;
+ current->sig = sig;
+ current->virt = virt;
+ current->stat = gstat;
+ current->slot = slot;
+ current->mGrpId = memberGroupId;
+ }
+ else // probably a redundant ,
+ {
+ current->reset();
+ }
}
/*
<FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); }
diff --git a/src/translator_cz.h b/src/translator_cz.h
index 0678483..dba350b 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -27,74 +27,43 @@
//
// havran@fel.cvut.cz, 1999/04/11
//
-// The first version of Czech strings with diacritics was implemented by
-// Petr Prikryl (prikrylp@skil.cz). Vlastimil Havran is still
-// the maintainer. The translation was based on translator.h
-// of Doxygen versison 1.1.4 (from scratch) and updated for 1.1.5
-// (including important updates of the up-to-1.1.4 strings).
-//
-// The Czech strings in this file were first written in Windows 1250
-// encoding. The conditional compilation ensures or the neutral
-// functionality of the macro DECODE, or calling the WinToISO()
-// method for on-line encoding conversion. If you want to maintain
-// the source in the ISO Latin-2, do convert the source, change the
-// conditional definition of the DECODE macro using the method
-// ISOToWin() -- for conversion of strings for the Windows version.
-// The version which does not call the function is slightly faster.
+// Updates:
+// --------
+// 2000/06/20
+// - The prototype version of Czech strings with diacritics implemented by
+// Petr Prikryl (prikrylp@skil.cz). (Vlastimil Havran is still
+// the maintainer.) The translation was based on translator.h
+// of Doxygen versison 1.1.4 (from scratch).
//
-// Notice: Only one of the following tables is necessary for
-// the support as well as the only one conversion private method
-// of the TranslatorCzech class. However, the prototype was created
-// under WindowsNT thus using Windows 1250 encoding. The second
-// table and the method are here to switch to the ISO Latin-2
-// smoothly. And also, there is not a big loose of space when both
-// tables and methods are supported.
-
-/*! Translation tables for characters >127. They should work,
- * but I would not put my hand into fire for that.
- */
-static const char WinToISOTab[] = {
- '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
- '\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC',
- '\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97',
- '\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC',
- '\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7',
- '\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF',
- '\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7',
- '\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF',
- '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
- '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
- '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
- '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
- '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
- '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
- '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D',
- '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
- '\0'
-};
-
-static const char ISOToWinTab[] = {
- '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
- '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F',
- '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97',
- '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F',
- '\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7',
- '\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF',
- '\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7',
- '\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF',
- '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
- '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
- '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
- '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
- '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
- '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
- '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7',
- '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
- '\0'
-};
+// 2000/07/10 (Petr Prikryl)
+// - Updated version based on 1.1.5 sources (including important updates
+// of the up-to-1.1.4 strings). Czech strings this file were written
+// in windows-1250 encoding. On-line decoding into iso-8859-2 ensured
+// via conditional compilation if the sources are compiled under UNIX.
+//
+// 2000/07/19 (Petr Prikryl)
+// - Encoding conversion tables moved to the methods that use them.
+// - Updates for "new since 1.1.5".
+//
+// Notices:
+// --------
+// The conditional compilation ensures or the neutral functionality
+// of the macro DECODE, or calling the WinToISO() method for
+// on-line encoding conversion. If you want to maintain the source
+// in the iso-8859-2, do convert the source, change the conditional
+// definition of the DECODE macro using the method ISOToWin() --
+// for conversion of strings for the Windows version. The version
+// which does not call the function is slightly faster.
+//
+// Only one of the private method WinToISO() and ISOToWin() is
+// necessary depending on whether this source is maintained in
+// windows-1250 or iso-8859-2 encoding. However, there is not a
+// big loose of space when both methods with the conversion tables
+// are supported. The other (not used now) may be handy in future.
+// Do not erase it.
-// Here the DECODE macro assumes the source written in Win1250 encoding.
+// Here the DECODE macro assumes the source written in Windows encoding.
//
#ifdef _WIN32
#define DECODE(sInput) sInput
@@ -103,13 +72,34 @@ static const char ISOToWinTab[] = {
#endif
-
class TranslatorCzech : public Translator
{
private:
- /*! returns the string converted from Win1250 to ISO Latin-2 */
+ /*! returns the string converted from windows-1250 to iso-8859-2 */
QCString WinToISO(const QCString sInput)
{
+ // The conversion table for characters >127
+ //
+ static const char WinToISOTab[] = {
+ '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
+ '\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC',
+ '\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97',
+ '\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC',
+ '\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7',
+ '\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF',
+ '\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7',
+ '\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF',
+ '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
+ '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
+ '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
+ '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
+ '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
+ '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
+ '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D',
+ '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
+ '\0'
+ };
+
QCString result;
int len = sInput.length();
@@ -121,9 +111,30 @@ class TranslatorCzech : public Translator
return result;
}
- /*! returns the string converted from ISO Latin-2 to Win1250 */
+ /*! returns the string converted from iso-8859-2 to windows-1250 */
QCString ISOToWin(const QCString sInput)
{
+ // The conversion table for characters >127
+ //
+ static const char ISOToWinTab[] = {
+ '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
+ '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F',
+ '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97',
+ '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F',
+ '\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7',
+ '\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF',
+ '\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7',
+ '\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF',
+ '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
+ '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
+ '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
+ '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
+ '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
+ '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
+ '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7',
+ '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
+ '\0'
+ };
QCString result;
int len = sInput.length();
@@ -136,6 +147,8 @@ class TranslatorCzech : public Translator
}
public:
+ // --- Language contol methods -------------------
+
virtual QCString idLanguage()
{ return "czech"; }
@@ -146,6 +159,18 @@ class TranslatorCzech : public Translator
virtual QCString latexBabelPackage()
{ return ""; }
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+#ifdef _WIN32
+ return "windows-1250";
+#else
+ return "iso-8859-2";
+#endif
+ }
+
+ // --- Language translation methods -------------------
+
/*! used in the compound documentation before a list of related functions. */
virtual QCString trRelatedFunctions()
{ return DECODE("Související funkce"); }
@@ -567,7 +592,7 @@ class TranslatorCzech : public Translator
/*! this text is generated when the \return command is used. */
virtual QCString trReturns()
- { return DECODE("Vrací"); }
+ { return DECODE("Návratová hodnota"); }
/*! this text is generated when the \sa command is used. */
virtual QCString trSeeAlso()
@@ -642,7 +667,7 @@ class TranslatorCzech : public Translator
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const char *fileName)
{
- QCString result="Dokumentace souboru ";
+ QCString result("Dokumentace souboru ");
result+=fileName;
return DECODE(result);
}
@@ -650,7 +675,7 @@ class TranslatorCzech : public Translator
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const char *namespaceName)
{
- QCString result("Dokumentace prostroru jmen ");
+ QCString result("Dokumentace prostoru jmen ");
result+=namespaceName;
return DECODE(result);
}
@@ -718,7 +743,10 @@ class TranslatorCzech : public Translator
*/
virtual QCString trInheritedByList(int numEntries)
{
- return DECODE("Zdìdìna tøídami "+trWriteList(numEntries)+".");
+ QCString result("Zdìdìna ");
+ result += (numEntries == 1) ? "tøídou " : "tøídami ";
+ result += trWriteList(numEntries)+".";
+ return DECODE(result);
}
/*! used in member documentation blocks to produce a list of
@@ -726,7 +754,10 @@ class TranslatorCzech : public Translator
*/
virtual QCString trReimplementedFromList(int numEntries)
{
- return DECODE("Reimplementace metody tøídy "+trWriteList(numEntries)+".");
+ QCString result("Reimplementuje ");
+ result += (numEntries == 1) ? "metodu tøídy " : "metody tøíd ";
+ result += trWriteList(numEntries)+".";
+ return DECODE(result);
}
/*! used in member documentation blocks to produce a list of
@@ -734,7 +765,10 @@ class TranslatorCzech : public Translator
*/
virtual QCString trReimplementedInList(int numEntries)
{
- return DECODE("Reimplementováno v "+trWriteList(numEntries)+".");
+ QCString result("Reimplementováno ");
+ result += (numEntries == 1) ? "tøídou " : "tøídami ";
+ result += trWriteList(numEntries)+".";
+ return DECODE(result);
}
/*! This is put above each page as a link to all members of namespaces. */
@@ -1010,6 +1044,90 @@ class TranslatorCzech : public Translator
{
return DECODE("Od"); // ??? not checked in a context
}
+
+////////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return DECODE("Vysvìtlivky ke grafu");
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ QCString result(
+ "Zde naleznete vysvìtlení, jak mají být interpretovány grafy, "
+ "které byly generovány programem doxygen.<p>\n"
+ "Uvažujte následující pøíklad:\n"
+ "\\code\n"
+ "/*! Neviditelná tøída, která se v grafu nezobrazuje, protože "
+ "došlo k oøezání grafu. */\n"
+ "class Invisible { };\n\n"
+ "/*! Tøída, u které došlo k oøezání grafu. Vztah dìdiènosti "
+ "je skryt. */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Tøída, která není dokumentována komentáøi programu doxygen. */\n"
+ "class Undocumented { };\n\n"
+ "/*! Odvozená tøída s veøejným (public) dìdìním bázové tøídy. */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Odvozená tøída s chránìným (protected) dìdìním bázové tøídy. */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Odvozená tøída s privátním dìdìním bázové tøídy. */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Tøída, která je využívána tøídou Inherited. */\n"
+ "class Used { };\n\n"
+ "/*! Odvozená tøída, která rùzným zpùsobem dìdí z více bázových "
+ "tøíd. */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Pokud je položka \\c MAX_DOT_GRAPH_HEIGHT konfiguraèního souboru "
+ "nastavena na hodnotu 200, bude vygenerován následující graf:"
+ "<p><center><img src=\"graph_legend.gif\"></center>\n"
+ "<p>\n"
+ "Bloky (tj. uzly) v uvedeném grafu mají následující význam:\n"
+ "<ul>\n"
+ "<li>Èernì vyplnìný obdélník reprezentuje strukturu nebo tøídu, "
+ "pro kterou byl graf generován.\n"
+ "<li>Obdélník s èerným obrysem oznaèuje dokumentovanou "
+ "strukturu nebo tøídu.\n"
+ "<li>Obdélník s šedým obrysem oznaèuje nedokumentovanou "
+ "strukturu nebo tøídu.\n"
+ "<li>Obdélník s èerveným obrysem oznaèuje dokumentovanou "
+ "strukturu nebo tøídu, pro kterou\n"
+ "nejsou zobrazeny všechny vztahy dìdiènosti nebo obsažení. "
+ "Graf je oøezán v pøípadì, kdy jej\n"
+ "není možné umístit do vymezených hranic.\n"
+ "</ul>\n"
+ "Šipky (tj. hrany grafu) mají následující význam:\n"
+ "<ul>\n"
+ "<li>Tmavì modrá šipka se používá pro oznaèení vztahu veøejné "
+ "dìdiènosti mezi dvìma tøídami.\n"
+ "<li>Tmavì zelená šipka oznaèuje vztah chránìné dìdiènosti "
+ "(protected).\n"
+ "<li>Tmavì èervená šipka oznaèuje vztah privátní dìdiènosti.\n"
+ "<li>Purpurová šipka kreslená èárkovanì se používá v pøípadì, "
+ "kdy je tøída obsažena v jiné tøídì,\n"
+ "nebo kdy je používána jinou tøídou. Je oznaèena identifikátorem "
+ "jedné nebo více promìných, pøes které\n"
+ "je tøída nebo struktura zpøístupnìna.\n"
+ "</ul>\n");
+
+ return DECODE(result);
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return DECODE("vysvìtlivky");
+ }
};
#endif // TRANSLATOR_CZ_H
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 99812f2..1112ce8 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -583,10 +583,119 @@ class TranslatorDutch : public Translator
return "Static Private Attributen";
}
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ QCString trTodo()
+ {
+ return "Todo";
+ }
+ /*! Used as the header of the todo list */
+ QCString trTodoList()
+ {
+ return "Todo Lijst";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trReferencedBy()
+ {
+ return "Wordt aangeroepen door";
+ }
+ QCString trRemarks()
+ {
+ return "Opmerkingen";
+ }
+ QCString trAttention()
+ {
+ return "Attentie";
+ }
+ QCString trInclByDepGraph()
+ {
+ return "Deze graaf geeft aan welke files direct of "
+ "indirect afhankelijk zijn van deze file:";
+ }
+ QCString trSince()
+ {
+ return "Sinds";
+ }
+
//////////////////////////////////////////////////////////////////////////
-// new since 1.1.1
+// new since 1.1.5
//////////////////////////////////////////////////////////////////////////
+ /*! title of the graph legend page */
+ QCString trLegendTitle()
+ {
+ return "Graaf Legenda";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ QCString trLegendDocs()
+ {
+ return
+ "Deze pagina legt uit hoe de grafen die gegenereerd worden door doxygen "
+ "ge&iuml;nterpreteerd dienen te worden.<p>\n"
+ "Beschouw het volgende voorbeeld:\n"
+ "\\code\n"
+ "/*! Onzichtbare klasse vanwege afkappen van de graaf */\n"
+ "class Invisible { };\n\n"
+ "/*! Afgekapte klasse, overervingsrelatie is verborgen */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Klasse is niet gedocumenteerd met doxygen commentaar */\n"
+ "class Undocumented { };\n\n"
+ "/*! Klasse met public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Klasse met protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klasse met private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klasse die wordt gebruikt door de klasse Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Super klasse die overerft van een aantal andere klassen */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Als de \\c MAX_DOT_GRAPH_HEIGHT tag in the configuratie file "
+ "op 200 gezet is, zal het bestaande voorbeeld resulteren in de volgende graaf:"
+ "<p><center><img src=\"graph_legend.gif\"></center>\n"
+ "<p>\n"
+ "De rechthoeken in the bovenstaande graaf hebben de volgende betekenis:\n"
+ "<ul>\n"
+ "<li>Een gevulde zwarte rechthoek representeert de structure of klasse waarvoor "
+ "de graaf is gegeneerd.\n"
+ "<li>Een rechthoek met een zwarte rand representeert een gedocumenteerde structure of klasse.\n"
+ "<li>Een rechthoek met een grijze rand representeert een ongedocumenteerde structure of klasse.\n"
+ "<li>Een rechthoek met een rode rand representeert een gedocumenteerde structure or klasse waarvoor\n"
+ "niet alle overervings- of gebruiksrelaties konden worden getoond. Een graaf wordt "
+ "afgekapt als hij niet past binnen de gespecificeerde grenzen."
+ "</ul>\n"
+ "De pijlen hebben de volgende betekenis:\n"
+ "<ul>\n"
+ "<li>Een donkerblauwe pijl visualizeert een public inheritance "
+ "relatie tussen twee klassen.\n"
+ "<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n"
+ "<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n"
+ "<li>Een paars gestreepte pijl wordt gebruikt indien een klasse bevat is of gebruikt wordt "
+ "door een andere klasse. De pijl is gelabeled met de variable(n) "
+ "die toegang geven tot de aangewezen klasse of structure. \n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ QCString trLegend()
+ {
+ return "legenda";
+ }
};
#endif
diff --git a/src/translator_pt.h b/src/translator_pt.h
new file mode 100644
index 0000000..8b6e3af
--- /dev/null
+++ b/src/translator_pt.h
@@ -0,0 +1,884 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The translation into Portuguese was provided by
+ * Rui Godinho Lopes <ruiglopes@yahoo.com>
+ */
+
+#ifndef TRANSLATOR_PT_H
+#define TRANSLATOR_PT_H
+
+#include "translator.h"
+
+class TranslatorPortuguese : public Translator
+{
+ public:
+ QCString idLanguage()
+ { return "portuguese"; }
+ /*! returns the name of the package that is included by LaTeX */
+ QCString latexBabelPackage()
+ { return "portuguese"; }
+
+ /*! used in the compound documentation before a list of related functions. */
+ QCString trRelatedFunctions()
+ { return "Funções associadas"; }
+
+ /*! subscript for the related functions. */
+ QCString trRelatedSubscript()
+ { return "(Note que não são funções membro)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ QCString trDetailedDescription()
+ { return "Descrição detalhada"; }
+
+ /*! header that is put before the list of typedefs. */
+ QCString trMemberTypedefDocumentation()
+ { return "Documentação de tipos definidos"; }
+
+ /*! header that is put before the list of enumerations. */
+ QCString trMemberEnumerationDocumentation()
+ { return "Documentação da enumerações"; }
+
+ /*! header that is put before the list of member functions. */
+ QCString trMemberFunctionDocumentation()
+ { return "Documentação dos métodos"; }
+
+ /*! header that is put before the list of member attributes. */
+ QCString trMemberDataDocumentation()
+ { return "Documentação dos dados"; }
+
+ /*! this is the text of a link put after brief descriptions. */
+ QCString trMore()
+ { return "Mais..."; }
+
+ /*! put in the class documentation */
+ QCString trListOfAllMembers()
+ { return "Mostrar lista completa dos membros"; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ QCString trMemberList()
+ { return "Lista dos membros"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ QCString trThisIsTheListOfAllMembers()
+ { return "Esta é a lista completa dos membros de "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ QCString trIncludingInheritedMembers()
+ { return ", incluindo todos os membros herdados."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Gerado automaticamente por Doxygen";
+ if (s) result+=(QCString)" para "+s;
+ result+=" a partir do código fonte.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ QCString trEnumName()
+ { return "enumeração"; }
+
+ /*! put after an enum value in the list of all members */
+ QCString trEnumValue()
+ { return "valor enumerado"; }
+
+ /*! put after an undocumented member in the list of all members */
+ QCString trDefinedIn()
+ { return "definido em"; }
+
+ /*! put as in introduction in the verbatim header file of a class.
+ * parameter f is the name of the include file.
+ */
+ QCString trIncludeFile()
+ { return "Ficheiro incluído"; }
+ QCString trVerbatimText(const char *f)
+ { return (QCString)"Este texto foi originado pelo ficheiro incluído "+f+"."; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \group command).
+ */
+ QCString trModules()
+ { return "Módulos"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ QCString trClassHierarchy()
+ { return "Hierarquia de classes"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ QCString trCompoundList()
+ { return "Lista de componentes";
+
+ /*! This is put above each page as a link to the list of documented files */}
+ QCString trFileList()
+ { return "Lista de ficheiros"; }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ QCString trHeaderFiles()
+ { return "Ficheiros Incluídos"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ QCString trCompoundMembers()
+ { return "Componentes"; }
+
+ /*! This is put above each page as a link to all members of files. */
+ QCString trFileMembers()
+ { return "Declarações"; }
+
+ /*! This is put above each page as a link to all related pages. */
+ QCString trRelatedPages()
+ { return "Paginas relacionadas"; }
+
+ /*! This is put above each page as a link to all examples. */
+ QCString trExamples()
+ { return "Exemplos"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ QCString trSearch()
+ { return "Localizar"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ QCString trClassHierarchyDescription()
+ { return "Esta lista de heranças está organizada, dentro do possível, por ordem alfabética:"; }
+
+ /*! This is an introduction to the list with all files. */
+ QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Lista de todos os ficheiros ";
+ if (!extractAll) result+="documentados ";
+ result+="com uma breve descrição:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ QCString trCompoundListDescription()
+ { return "Lista da classes, estruturas, uniões e interfaces com uma breve descrição:";
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Lista de todas as funções membro ";
+ if (!extractAll) result+="documentadas ";
+ result+="com links para ";
+ if (extractAll) result+="a documentação da classe correspondente:";
+ else result+="o ficheiro a que pertencem:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Lista de todas as funções membro ";
+ if (!extractAll) result+="documentadas ";
+ result+="com links para ";
+ if (extractAll) result+="a documentação correspondente:";
+ else result+="os ficheiros onde foram definidas:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ QCString trHeaderFilesDescription()
+ { return "Lista de todos os ficheiros cabeçalho que constituem a API:"; }
+
+ /*! This is an introduction to the page with the list of all examples */
+ QCString trExamplesDescription()
+ { return "Lista de todos os exemplos:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ QCString trRelatedPagesDescription()
+ { return "Lista de documentação relacionada:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ QCString trModulesDescription()
+ { return "Lista de todos os módulos:"; }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ QCString trNoDescriptionAvailable()
+ { return "Nenhuma descrição disponível"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ QCString trDocumentation()
+ { return "Documentação"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ QCString trModuleIndex()
+ { return "Índice dos módulos"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ QCString trHierarchicalIndex()
+ { return "Índice da hierarquia"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ QCString trCompoundIndex()
+ { return "Índice dos componentes"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ QCString trFileIndex()
+ { return "Índice dos ficheiros"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ QCString trModuleDocumentation()
+ { return "Documentação do módulo"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ QCString trClassDocumentation()
+ { return "Documentação da classe"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ QCString trFileDocumentation()
+ { return "Documentação do ficheiro"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ QCString trExampleDocumentation()
+ { return "Documentação do exemplo"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ QCString trPageDocumentation()
+ { return "Documentação da página"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ QCString trReferenceManual()
+ { return "Manual de referência"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ QCString trDefines()
+ { return "Definição de macros"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ QCString trFuncProtos()
+ { return "Protótipos de funções"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ QCString trTypedefs()
+ { return "Definição de tipos"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ QCString trEnumerations()
+ { return "Enumerações"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ QCString trFunctions()
+ { return "Funções"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trVariables()
+ { return "Variáveis"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trEnumerationValues()
+ { return "Valores da enumeração"; }
+
+ /*! This is used in man pages as the author section. */
+ QCString trAuthor()
+ { return "Autor"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ QCString trDefineDocumentation()
+ { return "Documentação da macro"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ QCString trFunctionPrototypeDocumentation()
+ { return "Documentação do protótipo da função"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ QCString trTypedefDocumentation()
+ { return "Documentação do tipo"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ QCString trEnumerationTypeDocumentation()
+ { return "Documentação do tipo de enumeração"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ QCString trEnumerationValueDocumentation()
+ { return "Documentação dos elementos da enumeração"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ QCString trFunctionDocumentation()
+ { return "Documentação da função"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ QCString trVariableDocumentation()
+ { return "Documentação da variável"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ QCString trCompounds()
+ { return "Componentes"; }
+
+ /*! This is used in the documentation of a group before the list of
+ * links to documented files
+ */
+ QCString trFiles()
+ { return "Ficheiros"; }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Gerado em "+date;
+ if (projName) result+=(QCString)" para "+projName;
+ result+=(QCString)" por";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ QCString trWrittenBy()
+ {
+ return "escrito por";
+ }
+
+ /*! this text is put before a class diagram */
+ QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de heranças da classe "+clName;
+ }
+
+ /*! this text is generated when the \internal command is used. */
+ QCString trForInternalUseOnly()
+ { return "Apenas para uso interno."; }
+
+ /*! this text is generated when the \reimp command is used. */
+ QCString trReimplementedForInternalReasons()
+ { return "Redefinido por razões internas; o interface não é afectado";
+ }
+
+ /*! this text is generated when the \warning command is used. */
+ QCString trWarning()
+ { return "Aviso"; }
+
+ /*! this text is generated when the \bug command is used. */
+ QCString trBugsAndLimitations()
+ { return "Bugs e limitações"; }
+
+ /*! this text is generated when the \version command is used. */
+ QCString trVersion()
+ { return "Versão"; }
+
+ /*! this text is generated when the \date command is used. */
+ QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \author command is used. */
+ QCString trAuthors()
+ { return "Autor(es)"; }
+
+ /*! this text is generated when the \return command is used. */
+ QCString trReturns()
+ { return "Retorna"; }
+
+ /*! this text is generated when the \sa command is used. */
+ QCString trSeeAlso()
+ { return "Veja também"; }
+
+ /*! this text is generated when the \param command is used. */
+ QCString trParameters()
+ { return "Parâmetros"; }
+
+ /*! this text is generated when the \exception command is used. */
+ QCString trExceptions()
+ { return "Excepções"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ QCString trGeneratedBy()
+ { return "Gerado por"; }
+
+ // new since 0.49-990307
+
+ virtual QCString trNamespaceList()
+ { return "Lista de namespaces"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Lista ";
+ if (!extractAll) result+="de toda a documentação ";
+ result+="dos namespaces com uma breve descrição:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Amigos"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Documentação das funções relacionadas e classes amigas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referencia ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="à classe "; break;
+ case ClassDef::Struct: result+="à estrutura "; break;
+ case ClassDef::Union: result+="à união "; break;
+ case ClassDef::Interface: result+="ao interface "; break;
+ case ClassDef::Exception: result+="à excepção "; break;
+ }
+
+ if (isTemplate)
+ result+="<template> ";
+
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result= "Referencia ao ficheiro ";
+ result += fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result= "Referencia ao namespace ";
+ result += namespaceName;
+ return result;
+ }
+
+ /*! \mgroup Class sections
+ * these are for the member sections of a class, struct or union
+ */
+ virtual QCString trPublicMembers()
+ { return "Membros públicos"; }
+ virtual QCString trPublicSlots()
+ { return "Slots públicos"; }
+ virtual QCString trSignals()
+ { return "Sinais"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Membros públicos estáticos"; }
+ virtual QCString trProtectedMembers()
+ { return "Membros protegidos"; }
+ virtual QCString trProtectedSlots()
+ { return "Slots protegidos"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Membros protegidos estáticos"; }
+ virtual QCString trPrivateMembers()
+ { return "Membros privados"; }
+ virtual QCString trPrivateSlots()
+ { return "Slots privados"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Membros privados estáticos"; }
+ /*! \endmgroup */
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", e ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Derivada de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Herdado por "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementado de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementado em "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Membros do namespace"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Lista ";
+ if (extractAll) result+="de todos os ";
+ else result+="de toda a documentação dos ";
+ result+="membros do namespace com links para ";
+ if (extractAll) result+="a documentação de cada membro:";
+ else result+="o namespace correspondente:";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Índice dos namespaces"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Documentação dos namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"A documentação para ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="esta classe"; break;
+ case ClassDef::Struct: result+="esta estrutura"; break;
+ case ClassDef::Union: result+="esta união"; break;
+ case ClassDef::Interface: result+="este interface"; break;
+ case ClassDef::Exception: result+="esta excepção"; break;
+ }
+ result+=" foi gerada a partir ";
+ if (single) result+=" do seguinte ficheiro:";
+ else result+="dos seguintes ficheiros:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ {
+ return "Lista alfabética";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Valores retornados"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Página principal"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p. "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSources()
+ {
+ return "Fontes";
+ }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definido na linha @0 do ficheiro @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definido no ficheiro @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Desaprovado";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de colaboração para "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Diagrama de dependências de inclusão para "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Documentação do Construtor & Destrutor";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Ir para o código fonte deste ficheiro.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Ir para a documentação deste ficheiro.";
+ }
+ /*! Text for the \pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Precondição";
+ }
+ /*! Text for the \post command */
+ virtual QCString trPostcondition()
+ {
+ return "Poscondição";
+ }
+ /*! Text for the \invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariante";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Valor inicial:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "código";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Representação gráfica da hiearquia da classe";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Ir para a representação gráfica da hierarquia da classe";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Ir para a representação textual da hierarquia da classe";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Índice da página";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Nota";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Tipos Públicos";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ return "Atributos Públicos";
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Atributos Públicos Estáticos";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Tipos Protegidos";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Atributos Protegidos";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Atributos Protegidos Estáticos";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Tipos Privados";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Atributos Privados";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Atributos Privados Estáticos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Tarefa";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Lista de tarefas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referenciado por";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Observações";
+ }
+ virtual QCString trAttention()
+ {
+ return "Atenção";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Este gráfico mostra quais são os ficheiros que incluem directamente ou indirectamente este ficheiro:";
+ }
+ virtual QCString trSince()
+ {
+ return "Desde";
+ }
+
+};
+#endif
diff --git a/src/util.cpp b/src/util.cpp
index 563c0e6..8d29fd4 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -300,13 +300,19 @@ QCString removeRedundantWhiteSpace(const QCString &s)
for (i=0;i<l;i++)
{
char c=s.at(i);
- if (i<l-2 && c=='<' && (isId(s.at(i+1)) || isspace(s.at(i+1))))
+ if (i<l-2 && c=='<' && // current char is a <
+ (isId(s.at(i+1)) || isspace(s.at(i+1))) && // next char is a id char or space
+ (i<8 || s.mid(i-8,8)!="operator") // string in front is not "operator"
+ )
{
- result+="< ";
+ result+="< "; // insert extra space for layouting (nested) templates
}
- else if (i>0 && c=='>' && (isId(s.at(i-1)) || isspace(s.at(i-1))))
+ else if (i>0 && c=='>' && // current char is a >
+ (isId(s.at(i-1)) || isspace(s.at(i-1))) && // prev char is a id char or space
+ (i<8 || s.mid(i-8,8)!="operator") // string in front is not "operator"
+ )
{
- result+=" >";
+ result+=" >"; // insert extra space for layouting (nested) templates
}
else if (c!=' ' ||
(i!=0 && i!=l-1 && isId(s.at(i-1)) && isId(s.at(i+1)))
@@ -1480,7 +1486,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
//printf("Trying class scope %s\n",className.data());
ClassDef *fcd=0;
- if ((fcd=getClass(className)) && // is it a documented class
+ if ((fcd=getResolvedClass(className)) && // is it a documented class
fcd->isLinkable()
)
{
@@ -1501,7 +1507,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
//printf("match=%d\n",match);
if (match)
{
- ClassDef *mcd=mmd->memberClass();
+ ClassDef *mcd=mmd->getClassDef();
int m=minClassDistance(fcd,mcd);
if (m<mdist && mcd->isLinkable())
{
@@ -1533,7 +1539,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
mmd->isLinkable()
)
{
- ClassDef *mcd=mmd->memberClass();
+ ClassDef *mcd=mmd->getClassDef();
//printf(" >Class %s found\n",mcd->name().data());
int m=minClassDistance(fcd,mcd);
if (m<mdist && mcd->isLinkable())
@@ -1594,9 +1600,9 @@ bool getDefs(const QCString &scName,const QCString &memberName,
MemberDef *mmd=mn->first();
while (mmd && !found)
{
- //printf("mmd->getNamespace()=%p fnd=%p\n",
- // mmd->getNamespace(),fnd);
- if (mmd->getNamespace()==fnd &&
+ //printf("mmd->getNamespaceDef()=%p fnd=%p\n",
+ // mmd->getNamespaceDef(),fnd);
+ if (mmd->getNamespaceDef()==fnd &&
//(mmd->isReference() || mmd->hasDocumentation())
mmd->isLinkable()
)
@@ -1630,7 +1636,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
// the first defined!
while (mmd && !found)
{
- if (mmd->getNamespace()==fnd &&
+ if (mmd->getNamespaceDef()==fnd &&
//(mmd->isReference() || mmd->hasDocumentation())
mmd->isLinkable()
)
@@ -1646,14 +1652,14 @@ bool getDefs(const QCString &scName,const QCString &memberName,
}
else // no scope => global function
{
- //printf("Function with global scope `%s'\n",namespaceName.data());
+ //printf("Function with global scope `%s' args=`%s'\n",namespaceName.data(),args);
md=mn->first();
while (md)
{
if (md->isLinkable())
{
fd=md->getFileDef();
- gd=md->groupDef();
+ gd=md->getGroupDef();
//printf("md->name()=`%s' md->args=`%s' fd=%p gd=%p\n",
// md->name().data(),args,fd,gd);
bool inGroup=FALSE;
@@ -1688,13 +1694,14 @@ bool getDefs(const QCString &scName,const QCString &memberName,
md=mn->last();
while (md)
{
- if (md->isLinkable())
+ //printf("Found member `%s'\n",md->name().data());
+ if (1 /* md->isLinkable() */)
{
- //printf("md->name()=`%s'\n",md->name().data());
+ //printf("member is linkable md->name()=`%s'\n",md->name().data());
fd=md->getFileDef();
- gd=md->groupDef();
+ gd=md->getGroupDef();
bool inGroup=FALSE;
- if ((fd && fd->isLinkable()) |+
+ if ((fd && fd->isLinkable()) ||
(inGroup=(gd && gd->isLinkable()))
)
{