diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/classdef.cpp | 18 | ||||
-rw-r--r-- | src/classdef.h | 6 | ||||
-rw-r--r-- | src/code.l | 110 | ||||
-rw-r--r-- | src/definition.cpp | 2 | ||||
-rw-r--r-- | src/dot.cpp | 21 | ||||
-rw-r--r-- | src/doxygen.cpp | 269 | ||||
-rw-r--r-- | src/filedef.cpp | 47 | ||||
-rw-r--r-- | src/groupdef.cpp | 73 | ||||
-rw-r--r-- | src/htmlgen.cpp | 100 | ||||
-rw-r--r-- | src/htmlgen.h | 2 | ||||
-rw-r--r-- | src/index.cpp | 44 | ||||
-rw-r--r-- | src/language.cpp | 5 | ||||
-rw-r--r-- | src/latexgen.cpp | 251 | ||||
-rw-r--r-- | src/latexgen.h | 10 | ||||
-rw-r--r-- | src/memberdef.cpp | 42 | ||||
-rw-r--r-- | src/memberdef.h | 142 | ||||
-rw-r--r-- | src/memberlist.cpp | 8 | ||||
-rw-r--r-- | src/membername.cpp | 8 | ||||
-rw-r--r-- | src/namespacedef.cpp | 62 | ||||
-rw-r--r-- | src/pre.l | 17 | ||||
-rw-r--r-- | src/rtfgen.cpp | 8 | ||||
-rw-r--r-- | src/scanner.l | 45 | ||||
-rw-r--r-- | src/translator_cz.h | 266 | ||||
-rw-r--r-- | src/translator_nl.h | 111 | ||||
-rw-r--r-- | src/translator_pt.h | 884 | ||||
-rw-r--r-- | src/util.cpp | 41 |
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(); @@ -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" + << " © 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 © " + t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n © " "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"); } @@ -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ï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())) ) { |