diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2005-03-07 21:07:13 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2005-03-07 21:07:13 (GMT) |
commit | 5a6400835bc92fb56ef65126785cbe75f092f2d1 (patch) | |
tree | 3f86b13900ced91ef5e802650b33a38767bf6c11 /src | |
parent | d745dd3737ece0f328e515b1cf10306da0901597 (diff) | |
download | Doxygen-5a6400835bc92fb56ef65126785cbe75f092f2d1.zip Doxygen-5a6400835bc92fb56ef65126785cbe75f092f2d1.tar.gz Doxygen-5a6400835bc92fb56ef65126785cbe75f092f2d1.tar.bz2 |
Release-1.4.1-20050307
Diffstat (limited to 'src')
-rw-r--r-- | src/code.l | 24 | ||||
-rw-r--r-- | src/commentcnv.l | 75 | ||||
-rw-r--r-- | src/commentscan.l | 61 | ||||
-rw-r--r-- | src/doxygen.cpp | 145 | ||||
-rw-r--r-- | src/htmlgen.cpp | 9 | ||||
-rw-r--r-- | src/index.cpp | 77 | ||||
-rw-r--r-- | src/memberdef.cpp | 33 | ||||
-rw-r--r-- | src/memberdef.h | 4 | ||||
-rw-r--r-- | src/pre.l | 11 | ||||
-rw-r--r-- | src/scanner.l | 25 | ||||
-rw-r--r-- | src/tagreader.cpp | 122 | ||||
-rw-r--r-- | src/translator.h | 6 | ||||
-rw-r--r-- | src/translator_adapter.h | 12 | ||||
-rw-r--r-- | src/translator_br.h | 2 | ||||
-rw-r--r-- | src/translator_cn.h | 69 | ||||
-rw-r--r-- | src/translator_cz.h | 2 | ||||
-rw-r--r-- | src/translator_de.h | 2 | ||||
-rw-r--r-- | src/translator_en.h | 13 | ||||
-rw-r--r-- | src/translator_fr.h | 2 | ||||
-rw-r--r-- | src/translator_hr.h | 47 | ||||
-rw-r--r-- | src/translator_hu.h | 2 | ||||
-rw-r--r-- | src/translator_it.h | 2 | ||||
-rw-r--r-- | src/translator_nl.h | 13 | ||||
-rw-r--r-- | src/translator_pl.h | 2 | ||||
-rw-r--r-- | src/translator_ro.h | 276 | ||||
-rw-r--r-- | src/translator_ru.h | 2 | ||||
-rw-r--r-- | src/translator_se.h | 2 | ||||
-rw-r--r-- | src/translator_sr.h | 2 | ||||
-rw-r--r-- | src/translator_ua.h | 2 | ||||
-rw-r--r-- | src/util.cpp | 255 | ||||
-rw-r--r-- | src/util.h | 2 |
31 files changed, 793 insertions, 508 deletions
@@ -133,6 +133,8 @@ static int g_braceCount=0; static void saveObjCContext(); static void restoreObjCContext(); + + //------------------------------------------------------------------- /*! Represents a stack of variable to class mappings as found in the @@ -252,10 +254,15 @@ void VariableContext::addVariable(const QCString &type,const QCString &name) addVariable(typeName,name); } } - else // add a dummy entry so the name is hidden to avoid false links + else { - DBG_CTX((stderr,"** addVariable: dummy context\n")); - scope->append(lname,dummyContext); + if (m_scopes.count()>0) // for local variables add a dummy entry so the name + // is hidden to avoid false links to global variables with the same name + // TODO: make this work for namespaces as well! + { + DBG_CTX((stderr,"** addVariable: dummy context\n")); + scope->append(lname,dummyContext); + } } } @@ -281,9 +288,8 @@ ClassDef *VariableContext::findVariable(const QCString &name) return result; } -const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8; - static VariableContext g_theVarContext; +const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8; //------------------------------------------------------------------- @@ -848,6 +854,7 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName, } ClassDef *cd=0,*lcd=0; MemberDef *md=0; + bool isLocal=FALSE; //fprintf(stderr,"generateClassOrGlobalLink(className=%s)\n",className.data()); if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable @@ -859,7 +866,7 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName, { cd=getResolvedClass(d,g_sourceFileDef,className.left(i),&md); } - //print("is found as a type %s\n",cd?cd->name().data():"<null>"); + //printf("is found as a type %s\n",cd?cd->name().data():"<null>"); if (cd==0 && md==0) // also see if it is variable or enum or enum value { if (getLink(g_classScope,clName,ol,clName)) @@ -874,7 +881,8 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName, { g_theCallContext.setClass(lcd); } - //fprintf(stderr,"is a local variable!\n"); + isLocal=TRUE; + //fprintf(stderr,"is a local variable cd=%p!\n",cd); } if (cd && cd->isLinkable()) // is it a linkable class { @@ -907,7 +915,7 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName, else // not a class, maybe a global member { //printf("class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly); - if (md!=0 || (cd==0 && !typeOnly)) // not a class, see if it is a global enum/variable/typedef. + if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef. { if (md==0) // not found as a typedef { diff --git a/src/commentcnv.l b/src/commentcnv.l index cf38954..10973aa 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -57,6 +57,8 @@ static QCString g_fileName; static int g_lineNr; static int g_condCtx; static QStack<CondCtx> g_condStack; +static QCString g_blockName; +static int g_lastCommentContext; static void replaceCommentMarker(const char *s,int len) { @@ -217,6 +219,32 @@ static QCString handleCondCmdInAliases(const QCString &s) return result; } +/** copies string \a s with length \a len to the output, while + * replacing any alias commands found in the string. + */ +static void replaceAliases(const char *s,int len) +{ + static QRegExp cmd("[@\\\\][a-z_A-Z][a-z_A-Z0-9]*"); + QCString in=s; + int p=0,i,l; + while ((i=cmd.match(in,p,&l))!=-1) + { + copyToOutput(s+p,i-p); + QCString *pValue=Doxygen::aliasDict[in.mid(i+1,l-1)]; + if (pValue) + { + QCString val = handleCondCmdInAliases(*pValue); + copyToOutput(val.data(),val.length()); + } + else + { + copyToOutput(s+i,l); + } + p=i+l; + } + copyToOutput(s+p,len-p); +} + #undef YY_INPUT #define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); @@ -245,7 +273,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) %x Verbatim %x ReadLine %x CondLine -%x SkipLang %% @@ -271,7 +298,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) } g_blockHeadCol=g_col; copyToOutput("/**",3); - copyToOutput(yytext+i,yyleng-i); + //copyToOutput(yytext+i,yyleng-i); + replaceAliases(yytext+i,yyleng-i); BEGIN(SComment); } <Scan>"//##Documentation".*/\n { /* Start of Rational Rose ANSI C++ comment block */ @@ -279,7 +307,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) int i=17; //=strlen("//##Documentation"); g_blockHeadCol=g_col; copyToOutput("/**",3); - copyToOutput(yytext+i,yyleng-i); + //copyToOutput(yytext+i,yyleng-i); + replaceAliases(yytext+i,yyleng-i); BEGIN(SComment); } <Scan>"//"/.*\n { /* one line C++ comment */ @@ -291,16 +320,21 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) copyToOutput(yytext,yyleng); BEGIN(CComment); } -<Scan>[\\@]"verbatim" { /* start of a verbatim block */ +<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code") { /* start of a verbatim block */ copyToOutput(yytext,yyleng); + g_blockName=&yytext[1]; + g_lastCommentContext = YY_START; BEGIN(Verbatim); } <Scan>. { /* any other character */ copyToOutput(yytext,yyleng); } -<Verbatim>[\\@]"endverbatim" { /* end of verbatim block */ +<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode") { /* end of verbatim block */ copyToOutput(yytext,yyleng); - BEGIN(Scan); + if (&yytext[4]==g_blockName) + { + BEGIN(g_lastCommentContext); + } } <Verbatim>[^@\\\n]* { /* any character not a backslash or new line */ copyToOutput(yytext,yyleng); @@ -311,25 +345,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) <Verbatim>. { /* any other character */ copyToOutput(yytext,yyleng); } -<SkipLang>[\\@]"~"[a-zA-Z]* { /* end of verbatim block */ - QCString langId = &yytext[2]; - if (langId.isEmpty() || - stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0) - { // enable language specific section - BEGIN(CComment); - } - } -<SkipLang>[^*@\\\n]* { /* any character not a *, @, backslash or new line */ - } -<SkipLang>\n { /* new line in verbatim block */ - copyToOutput(yytext,yyleng); - } -<SkipLang>"*/" { /* end of comment block */ - copyToOutput(yytext,yyleng); - BEGIN(Scan); - } -<SkipLang>. { /* any other character */ - } <SkipString>\\. { /* escaped character in string */ copyToOutput(yytext,yyleng); } @@ -411,14 +426,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) <CComment,ReadLine>("\\\\"|"@@")[~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command copyToOutput(yytext,yyleng); } -<CComment>[@\\]"~"[a-zA-Z]* { // language switch - QCString langId = &yytext[2]; - if (!langId.isEmpty() && - stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0) - { - BEGIN(SkipLang); - } - } <CComment,ReadLine>[\\@]"cond"[ \t]+ { // conditional section g_condCtx = YY_START; BEGIN(CondLine); @@ -492,7 +499,7 @@ void replaceComment(int offset) } } -/*! This function does two things: +/*! This function does three things: * -# It converts multi-line C++ style comment blocks (that are aligned) * to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO). * -# It replaces aliases with their definition (see ALIASES) diff --git a/src/commentscan.l b/src/commentscan.l index f25af0f..59b13ce 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -161,7 +161,9 @@ static DocCmdMap docCmdMap[] = { "verbatim", &handleFormatBlock }, { "latexonly", &handleFormatBlock }, { "htmlonly", &handleFormatBlock }, + { "xmlonly", &handleFormatBlock }, { "rtfonly", &handleFormatBlock }, + { "manonly", &handleFormatBlock }, { "dot", &handleFormatBlock }, { "code", &handleFormatBlock }, { "addindex", &handleAddIndex }, @@ -316,7 +318,6 @@ static QCString xrefItemTitle; static QCString xrefListTitle; static Protection protection; -static bool xrefAppendToPrev; static bool xrefAppendFlag; //----------------------------------------------------------------------------- @@ -405,8 +406,8 @@ static void addXRefItem(const char *listName,const char *itemTitle, { Entry *docEntry = current; // inBody && previous ? previous : current; if (listName==0) return; - //printf("addXRefItem(%s,%s,%s,%d)\n",listName,itemTitle,listTitle,append); + ListItemInfo *lii=0; RefList *refList = Doxygen::xrefLists->find(listName); if (refList==0) // new list @@ -539,17 +540,20 @@ static void addSection() // selects the output to write to static inline void setOutput(OutputContext ctx) { + bool xrefAppendToPrev = xrefAppendFlag; + // determine append flag for the next item (i.e. the end of this item) + xrefAppendFlag = ctx==OutputXRef && newXRefKind==xrefKind && + (xrefKind!=XRef_Item || newXRefItemKey==xrefItemKey); + //printf("refKind=%d newXRefKind=%d xrefAppendToPrev=%d xrefAppendFlag=%d\n", + // xrefKind,newXRefKind,xrefAppendToPrev,xrefAppendFlag); + xrefItemKey = newXRefItemKey; + //printf("setOutput(inContext=%d ctx=%d)\n",inContext,ctx); if (inContext==OutputXRef) // end of XRef section => add the item { // See if we can append this new xref item to the previous one. // We know this at the start of the next item of the same // type and need to remember this until the end of that item. - xrefAppendToPrev = xrefAppendFlag; - xrefAppendFlag = ctx==OutputXRef && newXRefKind==xrefKind && - (xrefKind!=XRef_Item || newXRefItemKey==xrefItemKey); - //printf("refKind=%d newXRefKind=%d xrefAppendToPrev=%d xrefAppendFlag=%d\n", - // xrefKind,newXRefKind,xrefAppendToPrev,xrefAppendFlag); switch(xrefKind) { case XRef_Todo: @@ -604,7 +608,7 @@ static inline void setOutput(OutputContext ctx) case OutputXRef: pOutputString = &outputXRef; // first item found, so can't append to previous - xrefAppendFlag = FALSE; + //xrefAppendFlag = FALSE; break; } } @@ -641,8 +645,7 @@ static int yyread(char *buf,int max_size) /* start command character */ CMD ("\\"|"@") -DETAILEDCMD {CMD}("arg"|"attention"|"author"|"bug"|"code"|"date"|"deprecated"|"dot"|"dotfile"|"example"|"htmlinclude"|"htmlonly"|"image"|"include"|"includelineno"|"internal"|"invariant"|"latexonly"|"li"|"line"|manonly"|"name"|"note"|"par"|"paragraph"|"param"|"post"|"pre"|"remarks"|"relate"[sd]"("also")?|"remarks"|"return"[s]?|"retval"|"sa"|"section"|"see"|"since"|"subsection"|"subsubsection"|"test"|"throw"|"todo"|"until"|"verbatim"|"verbinclude"|"version"|"warning"|"xmlonly"|"xrefitem") - /* ("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"latexonly"|"htmlonly"|"xmlonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">") */ +DETAILEDCMD {CMD}("arg"|"attention"|"author"|"bug"|"code"|"date"|"deprecated"|"dot"|"dotfile"|"example"|"htmlinclude"|"htmlonly"|"image"|"include"|"includelineno"|"internal"|"invariant"|"latexonly"|"li"|"line"|manonly"|"name"|"note"|"par"|"paragraph"|"param"|"post"|"pre"|"remarks"|"relate"[sd]"("also")?|"remarks"|"return"[s]?|"retval"|"sa"|"section"|"see"|"since"|"subsection"|"subsubsection"|"test"|"throw"|"todo"|"until"|"verbatim"|"verbinclude"|"version"|"warning"|"xrefitem") PRE [pP][rR][eE] TABLE [tT][aA][bB][lL][eE] P [pP] @@ -706,6 +709,7 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) %x ReadFormulaLong %x AnchorLabel %x HtmlComment +%x SkipLang %% @@ -720,11 +724,15 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) * end of brief description due to some command (@command, or <command>). * words and whitespace and other characters (#,?!, etc). * grouping commands (e.g. @{ and @}) + * language switch (e.g. \~english or \~). */ <Comment>{CMD}{CMD}[a-z_A-Z]+{B}* { // escaped command addOutput(yytext); } +<Comment>{CMD}{CMD}"~"[a-z_A-Z]* { // escaped command + addOutput(yytext); + } <Comment>("\\"[a-z_A-Z]+)+"\\" { // directory (or chain of commands!) addOutput(yytext); } @@ -757,6 +765,14 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) <Comment>("\\\\"|"@@")"f"[$\[{] { // escaped formula command addOutput(yytext); } +<Comment>{CMD}"~"[a-z_A-Z]* { // language switch command + QCString langId = &yytext[2]; + if (!langId.isEmpty() && + stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0) + { // enable language specific section + BEGIN(SkipLang); + } + } <Comment>{CMD}"f{"[^}\n]+"}" { // start of a formula with custom environment formulaText="\\begin"; formulaEnv=&yytext[2]; @@ -793,7 +809,7 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) addOutput(yytext[0]); addOutput(yytext[2]); } -<Comment>\n({B}*\n)+ { // at least one blank line +<Comment>(\n|\\_linebr)({B}*(\n|\\_linebr))+ { // at least one blank line (or blank line command) if (inContext) { setOutput(OutputDoc); @@ -1091,7 +1107,6 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) <XRefItemParam1>{ID} { // first argument newXRefItemKey=yytext; setOutput(OutputXRef); - xrefItemKey==yytext; BEGIN(XRefItemParam2); } <XRefItemParam1>{LC} { // line continuation @@ -1274,7 +1289,7 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) /* ----- handle arguments of the preformatted block commands ------- */ -<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddot"|"endcode")/{NW} { // possible ends +<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode")/{NW} { // possible ends addOutput(yytext); if (&yytext[4]==blockName) // found end of the block { @@ -1429,6 +1444,7 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) } <NameParam>. { // ignore other stuff nameHeader+=*yytext; + current->name+=*yytext; } /* ----- handle argument of ingroup command ------- */ @@ -1523,6 +1539,25 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) BEGIN(Comment); } + /* ----- handle language specific sections ------- */ + +<SkipLang>[\\@]"~"[a-zA-Z]* { /* language switch */ + QCString langId = &yytext[2]; + if (langId.isEmpty() || + stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0) + { // enable language specific section + BEGIN(Comment); + } + } +<SkipLang>[^*@\\\n]* { /* any character not a *, @, backslash or new line */ + } +<SkipLang>{DOCNL} { /* new line in verbatim block */ + if (*yytext=='\n') yyLineNr++; + } +<SkipLang>. { /* any other character */ + } + + %% //---------------------------------------------------------------------------- diff --git a/src/doxygen.cpp b/src/doxygen.cpp index a245cf0..c2ed7c1 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -653,16 +653,23 @@ static void addClassToContext(Entry *root) // see if the using statement was found inside a namespace or inside // the global file scope. + QCString scName; if (root->parent->section == Entry::NAMESPACE_SEC) { - QCString scName=root->parent->name; + scName=root->parent->name; if (!scName.isEmpty()) { nd = getResolvedNamespace(scName); } } QCString fullName = root->name; - ClassDef *cd = getResolvedClass(nd,fd,root->name,0,0,TRUE); + + ClassDef *cd = getResolvedClass( nd,fd, + // normally we could use root->name to find the class, but since we did not yet resolve + // the class/namespace nesting relations we have to use the fully qualified name here. + scName.isEmpty() ? root->name : scName+"::"+root->name, + 0,0,TRUE); + Debug::print(Debug::Classes,0, " Found class with name %s (cd=%p)\n", cd ? cd->name().data() : root->name.data(), cd); @@ -1501,11 +1508,7 @@ static MemberDef *addVariableToClass( root->type,name,root->args,0, prot,Normal,root->stat,related, mtype,0,0); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); md->setMemberClass(cd); //md->setDefFile(root->fileName); //md->setDefLine(root->startLine); @@ -1662,11 +1665,7 @@ static MemberDef *addVariableToFile( root->type,name,root->args,0, Public, Normal,root->stat,FALSE, mtype,0,0); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); md->setDocumentation(root->doc,root->docFile,root->docLine); md->setBriefDescription(root->brief,root->briefFile,root->briefLine); md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine); @@ -1774,7 +1773,11 @@ static bool isVarWithConstructor(Entry *root) } if (root->parent->name) ctx=Doxygen::namespaceSDict.find(root->parent->name); type = root->type; - if (type.left(6)=="const ") type=type.right(type.length()-6); + // remove qualifiers + findAndRemoveWord(type,"const"); + findAndRemoveWord(type,"static"); + findAndRemoveWord(type,"volatile"); + //if (type.left(6)=="const ") type=type.right(type.length()-6); typeIsClass=getResolvedClass(ctx,fd,type)!=0; if (!typeIsClass && (ti=type.find('<'))!=-1) { @@ -2096,11 +2099,7 @@ static void addMethodToClass(Entry *root,ClassDef *cd, root->type,name,root->args,root->exception, root->protection,root->virt,root->stat,!root->relates.isEmpty(), mtype,root->tArgLists ? root->tArgLists->last() : 0,root->argList); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); md->setMemberClass(cd); md->setDocumentation(root->doc,root->docFile,root->docLine); md->setDocsForDefinition(!root->proto); @@ -2237,6 +2236,7 @@ static void buildFunctionList(Entry *root) bool isFriend=root->type.find("friend ")!=-1; QCString rname = removeRedundantWhiteSpace(root->name); + //printf("rname=%s\n",rname.data()); if (!rname.isEmpty()) { @@ -2247,10 +2247,12 @@ static void buildFunctionList(Entry *root) //printf("root->parent=`%s' %x cd=%p root->type.find(re,0)=%d\n", // root->parent->name.data(),root->parent->section,getClass(root->parent->name), // root->type.find(re,0)); - QCString scope=stripAnonymousNamespaceScope(root->parent->name); + QCString scope=root->parent->name; //stripAnonymousNamespaceScope(root->parent->name); scope=stripTemplateSpecifiersFromScope(scope,FALSE); + //printf("scope=%s\n",scope.data()); cd=getClass(scope); + //printf("cd=%p\n",cd); if (cd && scope+"::"==rname.left(scope.length()+2)) // found A::f inside A { // strip scope from name @@ -2423,11 +2425,7 @@ static void buildFunctionList(Entry *root) MemberDef::Function,tArgList,root->argList); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); //md->setDefFile(root->fileName); //md->setDefLine(root->startLine); md->setDocumentation(root->doc,root->docFile,root->docLine); @@ -4131,63 +4129,6 @@ static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd, const char *scopeName) { ClassDef *tcd = getResolvedClass(nd,fd,scopeName,0,0,TRUE); -#if 0 - if (tcd==0) // try using declaration - { - ClassSDict *cl = 0; - if (nd) - { - cl=nd->getUsedClasses(); - } - else if (fd) - { - cl=fd->getUsedClasses(); - } - if (cl) - { - ClassSDict::Iterator cli(*cl); - ClassDef *cd; - for (;(cd=cli.current()) && tcd==0;++cli) - { - QCString scName = scopeName; - int scopeOffset = scName.length(); - do - { - QCString scope=scName.left(scopeOffset); - //printf("`%s'<->`%s' `%s'\n",cd->name().data(),scope.data(),scopeName); - if (rightScopeMatch(cd->name(),scope)) - { - //printf("Trying to find `%s'\n",(cd->name()+scName.right(scName.length()-scopeOffset)).data()); - tcd = getClass(cd->name()+scName.right(scName.length()-scopeOffset)); - } - scopeOffset=scName.findRev("::",scopeOffset-1); - } while (scopeOffset>=0 && tcd==0); - } - } - } - if (tcd==0) // try using directive - { - NamespaceSDict *nl = 0; - if (nd) - { - nl=nd->getUsedNamespaces(); - } - else if (fd) - { - nl=fd->getUsedNamespaces(); - } - if (nl) - { - NamespaceSDict::Iterator nli(*nl); - NamespaceDef *nd; - for (;(nd=nli.current()) && tcd==0;++nli) - { - //printf("Trying with scope=%s\n",nd->name().data()); - tcd = getClass(nd->name()+"::"+scopeName); - } - } - } -#endif return tcd; } @@ -4708,7 +4649,8 @@ static void findMember(Entry *root, if (!namespaceName.isEmpty()) nd=getResolvedNamespace(namespaceName); ClassDef *tcd=findClassDefinition(fd,nd,scopeName); - //printf("*** cd=%s tcd=%s fd=%s\n",cd->name().data(),tcd->name().data(),fd->name().data()); + //printf("Looking for %s inside nd=%s result=%p\n", + // scopeName.data(),nd?nd->name().data():"<none>",tcd); if (cd && tcd==cd) // member's classes match { @@ -4967,7 +4909,7 @@ static void findMember(Entry *root, for (mni.toFirst();(md=mni.current());++mni) { ClassDef *cd=md->getClassDef(); - if (cd!=0 && cd->name()==className) + if (cd!=0 && rightScopeMatch(cd->name(),className)) { if (md->templateArguments()) { @@ -4998,11 +4940,7 @@ static void findMember(Entry *root, root->protection,root->virt,root->stat,FALSE, mtype,tArgList,root->argList); //printf("new specialized member %s args=`%s'\n",md->name().data(),funcArgs.data()); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); md->setMemberClass(cd); md->setTemplateSpecialization(TRUE); md->setDefinition(funcDecl); @@ -5063,11 +5001,7 @@ static void findMember(Entry *root, funcType,funcName,funcArgs,exceptions, root->protection,root->virt,root->stat,TRUE, mtype,tArgList,root->argList); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); md->setMemberClass(cd); md->setDefinition(funcDecl); md->enableCallGraph(root->callGraph); @@ -5173,11 +5107,7 @@ static void findMember(Entry *root, funcType,funcName,funcArgs,exceptions, root->protection,root->virt,root->stat,TRUE, mtype,tArgList,funcArgs.isEmpty() ? 0 : root->argList); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); //printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n", // funcName.data(),funcDecl.data(),root->bodyLine); @@ -5274,11 +5204,7 @@ localObjCMethod: funcType,funcName,funcArgs,exceptions, root->protection,root->virt,root->stat,FALSE, MemberDef::Function,0,root->argList); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); md->makeImplementationDetail(); md->setMemberClass(cd); md->setDefinition(funcDecl); @@ -5559,11 +5485,7 @@ static void findEnums(Entry *root) 0,name,0,0, root->protection,Normal,FALSE,isRelated,MemberDef::Enumeration, 0,0); - if (root->tagInfo) - { - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); - } + md->setTagInfo(root->tagInfo); if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd); md->setBodySegment(root->bodyLine,root->endBodyLine); bool ambig; @@ -6480,8 +6402,7 @@ static void findDefineDocumentation(Entry *root) MemberDef *md=new MemberDef("<tagfile>",1, "#define",root->name,root->args,0, Public,Normal,FALSE,FALSE,MemberDef::Define,0,0); - md->setAnchor(root->tagInfo->anchor); - md->setReference(root->tagInfo->tagName); + md->setTagInfo(root->tagInfo); bool ambig; QCString filePathName = root->parent->fileName; FileDef *fd=findFileDef(Doxygen::inputNameDict,filePathName,ambig); @@ -8610,6 +8531,10 @@ void parseInput() buildClassList(root); buildClassDocList(root); resolveClassNestingRelations(); + // calling buildClassList may result in cached relations that + // become invalid after resolveClassNestingRelation(), that's why + // we need to clear the cache here + Doxygen::lookupCache.clear(); msg("Searching for members imported via using declarations...\n"); findUsingDeclImports(root); diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index a9583e6..1bea909 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -125,7 +125,8 @@ static const char *defaultStyleSheet = "A:hover { text-decoration: none; background-color: #f2f2ff }\n" "DL.el { margin-left: -1cm }\n" ".fragment {\n" -" font-family: monospace\n" +" font-family: Fixed, monospace;\n" +" font-size: 90%;\n" "}\n" "PRE.fragment {\n" " border: 1px solid #CCCCCC;\n" @@ -843,8 +844,10 @@ void HtmlGenerator::codify(const char *str) t << spaces.left(spacesToNextTabStop); col+=spacesToNextTabStop; break; - case '\n': t << '\n'; col=0; + case '\n': t << "\n"; col=0; break; + //case '\n': t << "<br>"; col=0; + // break; case '\r': break; case '<': t << "<"; col++; break; @@ -852,6 +855,8 @@ void HtmlGenerator::codify(const char *str) break; case '&': t << "&"; col++; break; + //case ' ': t << " "; col++; + // break; case '\\': if (*p=='<') { t << "<"; p++; } diff --git a/src/index.cpp b/src/index.cpp index b4f2d36..fefd232 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1707,34 +1707,24 @@ static void writeMemberIndexFiltered(OutputList &ol, ClassMemberHighlight hl) numPages=127; } - struct + struct CmhlInfo { + CmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} const char *fname; QCString title; } cmhlInfo[] = { - { "functions", 0 }, - { "functions_func",0 }, - { "functions_vars",0 }, - { "functions_type",0 }, - { "functions_enum",0 }, - { "functions_eval",0 }, - { "functions_rela",0 }, - { "functions_prop",0 }, - { "functions_evnt",0 }, - { "functions_rela",0 }, + CmhlInfo("functions", theTranslator->trAll()), + CmhlInfo("functions_func",theTranslator->trFunctions()), + CmhlInfo("functions_vars",theTranslator->trVariables()), + CmhlInfo("functions_type",theTranslator->trTypedefs()), + CmhlInfo("functions_enum",theTranslator->trEnumerations()), + CmhlInfo("functions_eval",theTranslator->trEnumerationValues()), + CmhlInfo("functions_prop",theTranslator->trProperties()), + CmhlInfo("functions_evnt",theTranslator->trEvents()), + CmhlInfo("functions_rela",theTranslator->trRelatedFunctions()) }; - cmhlInfo[0].title=theTranslator->trAll(); - cmhlInfo[1].title=theTranslator->trFunctions(); - cmhlInfo[2].title=theTranslator->trVariables(); - cmhlInfo[3].title=theTranslator->trTypedefs(); - cmhlInfo[4].title=theTranslator->trEnumerations(); - cmhlInfo[5].title=theTranslator->trEnumerationValues(); - cmhlInfo[6].title=theTranslator->trProperties(); - cmhlInfo[7].title=theTranslator->trEvents(); - cmhlInfo[8].title=theTranslator->trRelatedFunctions(); - ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); @@ -2114,27 +2104,21 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) numPages=127; } - struct + struct FmhlInfo { + FmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} const char *fname; QCString title; } fmhlInfo[] = { - { "globals", 0 }, - { "globals_func",0 }, - { "globals_vars",0 }, - { "globals_type",0 }, - { "globals_enum",0 }, - { "globals_eval",0 }, - { "globals_defs",0 } + FmhlInfo("globals", theTranslator->trAll()), + FmhlInfo("globals_func",theTranslator->trFunctions()), + FmhlInfo("globals_vars",theTranslator->trVariables()), + FmhlInfo("globals_type",theTranslator->trTypedefs()), + FmhlInfo("globals_enum",theTranslator->trEnumerations()), + FmhlInfo("globals_eval",theTranslator->trEnumerationValues()), + FmhlInfo("globals_defs",theTranslator->trDefines()) }; - fmhlInfo[0].title=theTranslator->trAll(); - fmhlInfo[1].title=theTranslator->trFunctions(); - fmhlInfo[2].title=theTranslator->trVariables(); - fmhlInfo[3].title=theTranslator->trTypedefs(); - fmhlInfo[4].title=theTranslator->trEnumerations(); - fmhlInfo[5].title=theTranslator->trEnumerationValues(); - fmhlInfo[6].title=theTranslator->trDefines(); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); @@ -2241,25 +2225,20 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, numPages=127; } - struct + struct NmhlInfo { + NmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} const char *fname; QCString title; } nmhlInfo[] = { - { "namespacemembers", 0 }, - { "namespacemembers_func",0 }, - { "namespacemembers_vars",0 }, - { "namespacemembers_type",0 }, - { "namespacemembers_enum",0 }, - { "namespacemembers_eval",0 } + NmhlInfo("namespacemembers", theTranslator->trAll()), + NmhlInfo("namespacemembers_func",theTranslator->trFunctions()), + NmhlInfo("namespacemembers_vars",theTranslator->trVariables()), + NmhlInfo("namespacemembers_type",theTranslator->trTypedefs()), + NmhlInfo("namespacemembers_enum",theTranslator->trEnumerations()), + NmhlInfo("namespacemembers_eval",theTranslator->trEnumerationValues()) }; - nmhlInfo[0].title=theTranslator->trAll(); - nmhlInfo[1].title=theTranslator->trFunctions(); - nmhlInfo[2].title=theTranslator->trVariables(); - nmhlInfo[3].title=theTranslator->trTypedefs(); - nmhlInfo[4].title=theTranslator->trEnumerations(); - nmhlInfo[5].title=theTranslator->trEnumerationValues(); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 10f8898..ef01fff 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -509,7 +509,11 @@ bool MemberDef::hasExamples() QCString MemberDef::getOutputFileBase() const { QCString baseName; - if (m_templateMaster) + if (explicitOutputFileBase) + { + return explicitOutputFileBase; + } + else if (m_templateMaster) { return m_templateMaster->getOutputFileBase(); } @@ -835,6 +839,10 @@ void MemberDef::writeDeclaration(OutputList &ol, // hide members whose brief section should not be visible //if (!isBriefSectionVisible()) return; + Definition *d=0; + ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something + if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd; + // write tag file information of this member if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { @@ -875,6 +883,7 @@ void MemberDef::writeDeclaration(OutputList &ol, Doxygen::tagFile << "\">" << endl; Doxygen::tagFile << " <type>" << convertToXML(typeString()) << "</type>" << endl; Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl; + Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl; Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl; Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl; writeDocAnchorsToTagFile(); @@ -889,9 +898,6 @@ void MemberDef::writeDeclaration(OutputList &ol, Doxygen::searchIndex->addWord(qualifiedName(),FALSE); } - Definition *d=0; - ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something - if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd; QCString cname = d->name(); QCString cfname = getOutputFileBase(); QCString osname = cname; @@ -2080,11 +2086,14 @@ void MemberDef::addListReference(Definition *) } QCString memName = name(); Definition *pd=getOuterScope(); - if ((!Config_getBool("HIDE_SCOPE_NAMES") && // there is a scope + if (!isRelated() && + ( + (!Config_getBool("HIDE_SCOPE_NAMES") && // there is a scope pd && pd!=Doxygen::globalScope) // and we can show it - || - ((pd=getClassDef()) && !isRelated()) // it's a class so we + || + (pd=getClassDef()) // it's a class so we // show the scope anyway + ) ) { if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) @@ -2328,3 +2337,13 @@ QCString MemberDef::qualifiedName() } } +void MemberDef::setTagInfo(TagInfo *ti) +{ + if (ti) + { + setAnchor(ti->anchor); + setReference(ti->tagName); + explicitOutputFileBase = stripExtension(ti->fileName); + } +} + diff --git a/src/memberdef.h b/src/memberdef.h index e90a975..98be73c 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -182,6 +182,7 @@ class MemberDef : public Definition void setHasDocumentedParams(bool b) { m_hasDocumentedParams = b; } void setHasDocumentedReturnType(bool b) { m_hasDocumentedReturnType = b; } void setInheritsDocsFrom(MemberDef *md) { m_docProvider = md; } + void setTagInfo(TagInfo *i); // output generation void writeLink(OutputList &ol, @@ -400,6 +401,9 @@ class MemberDef : public Definition // documentation inheritance MemberDef *m_docProvider; + + // to store the output file base from tag files + QCString explicitOutputFileBase; }; #endif @@ -100,6 +100,7 @@ static bool g_expandOnlyPredef; // from the configuration static int g_commentCount; static bool g_insideComment; static bool g_isImported; +static QCString g_blockName; static void setFileName(const char *name) @@ -1776,13 +1777,17 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) outputChar('/');outputChar('*'); //g_commentCount++; } -<SkipCComment>[\\@]"verbatim"{BN}+ { +<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ { outputArray(yytext,yyleng); + g_blockName=&yytext[1]; BEGIN(SkipVerbatim); } -<SkipVerbatim>[\\@]"endverbatim" { +<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode") { /* end of verbatim block */ outputArray(yytext,yyleng); - BEGIN(SkipCComment); + if (&yytext[4]==g_blockName) + { + BEGIN(SkipCComment); + } } <SkipCComment,SkipVerbatim>[^*\x06\n\/]+ { outputArray(yytext,yyleng); diff --git a/src/scanner.l b/src/scanner.l index c06225a..1f8aa80 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -2121,7 +2121,12 @@ IDLATTR ("["[^\]]*"]"){BN}* <FindMembers,FindFields>("//"([!/]?){B}*{CMD}"{")|("/*"([!*]?){B}*{CMD}"{") { #ifdef COMMENTSCAN - REJECT; + Entry *tmp = current; + current = previous; + handleGroupStartCommand(current->name); + current = tmp; + initEntry(); + #else startGroup(); tmpDocType=-1; @@ -2154,7 +2159,7 @@ IDLATTR ("["[^\]]*"]"){BN}* } <FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/" { #ifdef COMMENTSCAN - REJECT; + handleGroupEndCommand(); #else if (memberGroupId==DOX_NOGROUP && autoGroupStack.isEmpty()) { @@ -3266,7 +3271,7 @@ IDLATTR ("["[^\]]*"]"){BN}* <FuncQual>[{:;,] { if ( strcmp(yytext,";")==0 && insidePHP && - current->type.left(8) != "function" ) + !containsWord(current->type,"function") ) { current->reset(); initEntry(); @@ -3497,26 +3502,24 @@ IDLATTR ("["[^\]]*"]"){BN}* //printf("Adding entry `%s'\n",current->name.data()); if ( insidePHP) { - if (current->type.left(6) == "final " ) + if (findAndRemoveWord(current->type,"final")) { - current->type = current->type.mid(6); current->memSpec |= Entry::Final; } - if (current->type.left(9) == "abstract " ) + if (findAndRemoveWord(current->type,"abstract")) { - current->type = current->type.mid(9); current->memSpec |= Entry::Abstract; } } - if ( insidePHP && current->type.left(8) != "function" ) + if ( insidePHP && !containsWord(current->type,"function")) { initEntry(); } else { - if ( insidePHP && current->type.left(8) == "function" ) + if ( insidePHP) { - current->type = current->type.mid(8); + findAndRemoveWord(current->type,"function"); } previous = current; current_root->addSubEntry(current); @@ -4303,7 +4306,7 @@ IDLATTR ("["[^\]]*"]"){BN}* <FindMembers>"{" { if (insideCS && !current->name.isEmpty() && !current->type.isEmpty()) { - if (current->type.left(6)=="event " || current->type.find("event")!=-1) // event + if (containsWord(current->type,"event")) // event { current->mtype = mtype = Event; } diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 368d799..9fd90d4 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -19,6 +19,8 @@ #include "tagreader.h" #include <stdio.h> +#include <stdarg.h> + #include <qxml.h> #include <qstack.h> #include <qdict.h> @@ -58,6 +60,7 @@ class TagMemberInfo TagMemberInfo() : prot(Public), virt(Normal), isStatic(FALSE) {} QString type; QString name; + QString anchorFile; QString anchor; QString arglist; QString kind; @@ -80,6 +83,7 @@ class TagClassInfo QList<BaseInfo> *bases; QList<TagMemberInfo> members; QList<QString> *templateArguments; + QStringList classList; Kind kind; bool isObjC; }; @@ -91,9 +95,10 @@ class TagNamespaceInfo TagNamespaceInfo() { members.setAutoDelete(TRUE); } QString name; QString filename; + QStringList classList; + QStringList namespaceList; TagAnchorInfoList docAnchors; QList<TagMemberInfo> members; - QStringList classList; }; /*! Container for package specific info that can be read from a tagfile */ @@ -201,6 +206,7 @@ class TagFileParser : public QXmlDefaultHandler TagFileParser *m_parent; Handler m_handler; }; + class EndElementHandler { typedef void (TagFileParser::*Handler)(); @@ -220,6 +226,24 @@ class TagFileParser : public QXmlDefaultHandler m_startElementHandlers.setAutoDelete(TRUE); m_endElementHandlers.setAutoDelete(TRUE); } + + void setDocumentLocator ( QXmlLocator * locator ) + { + m_locator = locator; + } + + void setFileName( const QString &fileName ) + { + m_inputFileName = fileName; + } + + void warn(const char *fmt,...) + { + va_list args; + va_start(args, fmt); + ::warn(m_inputFileName,m_locator->lineNumber(),fmt,args); + va_end(args); + } void startCompound( const QXmlAttributes& attrib ) { @@ -300,13 +324,14 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unknown compound attribute `%s' found!\n",kind.data()); + warn("Warning: Unknown compound attribute `%s' found!\n",kind.data()); } if (isObjC=="yes" && m_curClass) { m_curClass->isObjC = TRUE; } } + void endCompound() { switch (m_state) @@ -326,9 +351,10 @@ class TagFileParser : public QXmlDefaultHandler case InPackage: m_tagFilePackages.append(m_curPackage); m_curPackage=0; break; default: - err("Error: tag `compound' was not expected!\n"); + warn("Warning: tag `compound' was not expected!\n"); } } + void startMember( const QXmlAttributes& attrib) { m_curMember = new TagMemberInfo; @@ -371,11 +397,10 @@ class TagFileParser : public QXmlDefaultHandler case InNamespace: m_curNamespace->members.append(m_curMember); break; case InGroup: m_curGroup->members.append(m_curMember); break; case InPackage: m_curPackage->members.append(m_curMember); break; - default: err("Error: Unexpected tag `member' found\n"); break; + default: warn("Warning: Unexpected tag `member' found\n"); break; } } - void endDocAnchor() { switch(m_state) @@ -388,63 +413,73 @@ class TagFileParser : public QXmlDefaultHandler case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break; case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break; case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break; - default: err("Error: Unexpected tag `member' found\n"); break; + default: warn("Warning: Unexpected tag `member' found\n"); break; } } + void endClass() { switch(m_state) { + case InClass: m_curClass->classList.append(m_curString); break; case InFile: m_curFile->classList.append(m_curString); break; case InNamespace: m_curNamespace->classList.append(m_curString); break; case InGroup: m_curGroup->classList.append(m_curString); break; case InPackage: m_curPackage->classList.append(m_curString); break; - default: err("Error: Unexpected tag `class' found\n"); break; + default: warn("Warning: Unexpected tag `class' found\n"); break; } } + void endNamespace() { switch(m_state) { + case InNamespace: m_curNamespace->classList.append(m_curString); break; case InFile: m_curFile->namespaceList.append(m_curString); break; case InGroup: m_curGroup->namespaceList.append(m_curString); break; - default: err("Error: Unexpected tag `namespace' found\n"); break; + default: warn("Warning: Unexpected tag `namespace' found\n"); break; } } + void endFile() { switch(m_state) { case InGroup: m_curGroup->fileList.append(m_curString); break; case InDir: m_curDir->fileList.append(m_curString); break; - default: err("Error: Unexpected tag `file' found\n"); break; + default: warn("Warning: Unexpected tag `file' found\n"); break; } } + void endPage() { switch(m_state) { case InGroup: m_curGroup->fileList.append(m_curString); break; - default: err("Error: Unexpected tag `page' found\n"); break; + default: warn("Warning: Unexpected tag `page' found\n"); break; } } + void endDir() { switch(m_state) { case InDir: m_curDir->subdirList.append(m_curString); break; - default: err("Error: Unexpected tag `page' found\n"); break; + default: warn("Warning: Unexpected tag `page' found\n"); break; } } + void startStringValue(const QXmlAttributes& ) { m_curString = ""; } + void startDocAnchor(const QXmlAttributes& attrib ) { m_fileName = attrib.value("file"); m_curString = ""; } + void endType() { if (m_state==InMember) @@ -453,9 +488,10 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `type' found\n"); + warn("Warning: Unexpected tag `type' found\n"); } } + void endName() { switch (m_state) @@ -468,9 +504,10 @@ class TagFileParser : public QXmlDefaultHandler case InDir: m_curDir->name = m_curString; break; case InMember: m_curMember->name = m_curString; break; case InPackage: m_curPackage->name = m_curString; break; - default: err("Error: Unexpected tag `name' found\n"); break; + default: warn("Warning: Unexpected tag `name' found\n"); break; } } + void startBase(const QXmlAttributes& attrib ) { m_curString=""; @@ -501,9 +538,10 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `base' found\n"); + warn("Warning: Unexpected tag `base' found\n"); } } + void endBase() { if (m_state==InClass && m_curClass) @@ -512,9 +550,10 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `base' found\n"); + warn("Warning: Unexpected tag `base' found\n"); } } + void startIncludes(const QXmlAttributes& attrib ) { if (m_state==InFile && m_curFile) @@ -528,14 +567,16 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `includes' found\n"); + warn("Warning: Unexpected tag `includes' found\n"); } m_curString=""; } + void endIncludes() { m_curIncludes->text = m_curString; } + void endTemplateArg() { if (m_state==InClass && m_curClass) @@ -549,9 +590,10 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `templarg' found\n"); + warn("Warning: Unexpected tag `templarg' found\n"); } } + void endFilename() { switch (m_state) @@ -563,18 +605,20 @@ class TagFileParser : public QXmlDefaultHandler case InPage: m_curPage->filename = m_curString; break; case InPackage: m_curPackage->filename = m_curString; break; case InDir: m_curDir->filename = m_curString; break; - default: err("Error: Unexpected tag `filename' found\n"); break; + default: warn("Warning: Unexpected tag `filename' found\n"); break; } } + void endPath() { switch (m_state) { case InFile: m_curFile->path = m_curString; break; case InDir: m_curDir->path = m_curString; break; - default: err("Error: Unexpected tag `path' found\n"); break; + default: warn("Warning: Unexpected tag `path' found\n"); break; } } + void endAnchor() { if (m_state==InMember) @@ -583,9 +627,22 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `anchor' found\n"); + warn("Warning: Unexpected tag `anchor' found\n"); + } + } + + void endAnchorFile() + { + if (m_state==InMember) + { + m_curMember->anchorFile = m_curString; + } + else + { + warn("Warning: Unexpected tag `anchorfile' found\n"); } } + void endArglist() { if (m_state==InMember) @@ -594,7 +651,7 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `arglist' found\n"); + warn("Warning: Unexpected tag `arglist' found\n"); } } void endTitle() @@ -603,9 +660,10 @@ class TagFileParser : public QXmlDefaultHandler { case InGroup: m_curGroup->title = m_curString; break; case InPage: m_curPage->title = m_curString; break; - default: err("Error: Unexpected tag `title' found\n"); break; + default: warn("Warning: Unexpected tag `title' found\n"); break; } } + void endSubgroup() { if (m_state==InGroup) @@ -614,12 +672,14 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unexpected tag `subgroup' found\n"); + warn("Warning: Unexpected tag `subgroup' found\n"); } } + void startIgnoreElement(const QXmlAttributes& ) { } + void endIgnoreElement() { } @@ -652,6 +712,7 @@ class TagFileParser : public QXmlDefaultHandler m_startElementHandlers.insert("filename", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("includes", new StartElementHandler(this,&TagFileParser::startIncludes)); m_startElementHandlers.insert("path", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("anchorfile", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("anchor", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("arglist", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("title", new StartElementHandler(this,&TagFileParser::startStringValue)); @@ -673,6 +734,7 @@ class TagFileParser : public QXmlDefaultHandler m_endElementHandlers.insert("filename", new EndElementHandler(this,&TagFileParser::endFilename)); m_endElementHandlers.insert("includes", new EndElementHandler(this,&TagFileParser::endIncludes)); m_endElementHandlers.insert("path", new EndElementHandler(this,&TagFileParser::endPath)); + m_endElementHandlers.insert("anchorfile", new EndElementHandler(this,&TagFileParser::endAnchorFile)); m_endElementHandlers.insert("anchor", new EndElementHandler(this,&TagFileParser::endAnchor)); m_endElementHandlers.insert("arglist", new EndElementHandler(this,&TagFileParser::endArglist)); m_endElementHandlers.insert("title", new EndElementHandler(this,&TagFileParser::endTitle)); @@ -689,6 +751,7 @@ class TagFileParser : public QXmlDefaultHandler return TRUE; } + bool startElement( const QString&, const QString&, const QString&name, const QXmlAttributes& attrib ) { @@ -700,10 +763,11 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unknown tag `%s' found!\n",name.data()); + warn("Warning: Unknown tag `%s' found!\n",name.data()); } return TRUE; } + bool endElement( const QString&, const QString&, const QString& name ) { //printf("endElement `%s'\n",name.data()); @@ -714,15 +778,17 @@ class TagFileParser : public QXmlDefaultHandler } else { - err("Error: Unknown tag `%s' found!\n",name.data()); + warn("Warning: Unknown tag `%s' found!\n",name.data()); } return TRUE; } + bool characters ( const QString & ch ) { m_curString+=ch; return TRUE; } + void dump(); void buildLists(Entry *root); void addIncludes(); @@ -753,6 +819,8 @@ class TagFileParser : public QXmlDefaultHandler QString m_fileName; State m_state; QStack<State> m_stateStack; + QXmlLocator *m_locator; + QString m_inputFileName; }; /*! Error handler for the XML tag file parser. @@ -971,7 +1039,7 @@ void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l) } else { - err("Duplicate anchor %s found\n",ta->label.data()); + warn("Duplicate anchor %s found\n",ta->label.data()); } } } @@ -1004,6 +1072,7 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members) TagInfo *ti = new TagInfo; ti->tagName = m_tagName; ti->anchor = tmi->anchor; + ti->fileName = tmi->anchorFile; me->tagInfo = ti; if (tmi->kind=="define") { @@ -1315,6 +1384,7 @@ void parseTagFile(Entry *root,const char *fullName,const char *tagName) QFileInfo fi(fullName); if (!fi.exists()) return; TagFileParser handler( tagName ); + handler.setFileName(fullName); TagFileErrorHandler errorHandler; QFile xmlFile( fullName ); QXmlInputSource source( xmlFile ); diff --git a/src/translator.h b/src/translator.h index 360d35b..831679b 100644 --- a/src/translator.h +++ b/src/translator.h @@ -433,6 +433,12 @@ class Translator virtual QCString trDirReference(const char *dirName) = 0; virtual QCString trDir(bool first_capital, bool singular) = 0; +////////////////////////////////////////////////////////////////////////// +// new since 1.4.1 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trOverloadText() = 0; + }; #endif diff --git a/src/translator_adapter.h b/src/translator_adapter.h index c32f6dc..fa6f8a2 100644 --- a/src/translator_adapter.h +++ b/src/translator_adapter.h @@ -40,7 +40,17 @@ class TranslatorAdapterBase : public Translator }; -class TranslatorAdapter_1_3_9 : public TranslatorAdapterBase +class TranslatorAdapter_1_4_1 : public TranslatorAdapterBase +{ + public: + virtual QCString updateNeededMessage() + { return createUpdateNeededMessage(idLanguage(),"release 1.4.1"); } + + virtual QCString trOverloadText() + { return english.trOverloadText(); } +}; + +class TranslatorAdapter_1_3_9 : public TranslatorAdapter_1_4_1 { public: virtual QCString updateNeededMessage() diff --git a/src/translator_br.h b/src/translator_br.h index 073fe5d..807ed9d 100644 --- a/src/translator_br.h +++ b/src/translator_br.h @@ -34,7 +34,7 @@ #ifndef TRANSLATOR_BR_H #define TRANSLATOR_BR_H -class TranslatorBrazilian : public Translator +class TranslatorBrazilian : public TranslatorAdapter_1_4_1 { public: diff --git a/src/translator_cn.h b/src/translator_cn.h index 0f273bd..b78bc8b 100644 --- a/src/translator_cn.h +++ b/src/translator_cn.h @@ -24,7 +24,7 @@ */ #define CN_SPC -class TranslatorChinese : public Translator +class TranslatorChinese : public TranslatorAdapter_1_4_1 { public: /*! Used for identification of the language. The identification @@ -83,9 +83,6 @@ class TranslatorChinese : public Translator virtual QCString trMemberEnumerationDocumentation() { return "łÉԱöŸÙÀàĐÍÎÄ””"; } - virtual QCString trEnumerationValueDocumentation() - { return "łÉԱöŸÙÖ”ÎÄ””"; } - /*! header that is put before the list of member function. */ virtual QCString trMemberFunctionDocumentation() { return "łÉÔ±șŻÊęÎÄ””"; } @@ -173,11 +170,6 @@ class TranslatorChinese : public Translator virtual QCString trFileList() { return "ÎÄŒțÁбí"; } - - /*! This is put above each page as a link to the list of all verbatim headers */ - virtual QCString trHeaderFiles() - { return "Í·ÎÄŒț"; } - /*! This is put above each page as a link to all members of compounds. */ virtual QCString trCompoundMembers() { @@ -286,9 +278,6 @@ class TranslatorChinese : public Translator return result; } - virtual QCString trHeaderFilesDescription() - { return "ŐâÀïÁĐłöŚéłÉAPI”ÄÍ·ÎÄŒțŁș"; } - virtual QCString trExamplesDescription() { return "ŐâÀïÁĐłöËùÓĐÊŸÀęŁș"; } @@ -298,9 +287,6 @@ class TranslatorChinese : public Translator virtual QCString trModulesDescription() { return "ŐâÀïÁĐłöËùÓĐÄŁżé"; } - virtual QCString trNoDescriptionAvailable() - { return "ÎȚżÉÓĂÎÄ””"; } - virtual QCString trDocumentation() { return "ÎÄ””"; } @@ -422,16 +408,9 @@ class TranslatorChinese : public Translator virtual QCString trForInternalUseOnly() { return "œöÏȚÄÚČżÊčÓĂĄŁ"; } - virtual QCString trReimplementedForInternalReasons() - { return "ÓÉÓÚÄÚČżÔÒò±»ÖŰÔŰŁ»”«Č»Ó°ÏìAPI"; - } - virtual QCString trWarning() { return "ŸŻžæ"; } - virtual QCString trBugsAndLimitations() - { return "BUG"CN_SPC"ÓëŸÖÏȚ"; } - virtual QCString trVersion() { return "°æ±Ÿ"; } @@ -698,12 +677,7 @@ class TranslatorChinese : public Translator // new since 0.49-991106 ////////////////////////////////////////////////////////////////////////// - virtual QCString trSources() - { - return "ÔŽŽúÂë"; - } - - virtual QCString trDefinedAtLineInSourceFile() + virtual QCString trDefinedAtLineInSourceFile() { return "ÔÚÎÄŒț"CN_SPC"@1"CN_SPC"”Ú"CN_SPC"@0"CN_SPC"ĐжšÒ楣"; } @@ -1025,12 +999,6 @@ class TranslatorChinese : public Translator // new since 1.2.4 ////////////////////////////////////////////////////////////////////////// - /*! Used for Java interfaces in the summary section of Java packages */ - virtual QCString trInterfaces() - { - return "œÓżÚ"; - } - /*! Used for Java classes in the summary section of Java packages */ virtual QCString trClasses() { @@ -1068,12 +1036,6 @@ class TranslatorChinese : public Translator return "°ü"; } - /*! Used as a chapter title for Latex & RTF output */ - virtual QCString trPackageDocumentation() - { - return "°ü”ÄÎÄ””"; - } - /*! Text shown before a multi-line define */ virtual QCString trDefineValue() { @@ -1232,20 +1194,6 @@ class TranslatorChinese : public Translator * be followed by a single name or by a list of names * of the category. */ - virtual QCString trField(bool /*first_capital*/, bool /*singular*/) - { - /* - QCString result((first_capital ? "Field" : "field")); - if (!singular) result+="s"; - return result; - */ - return "ŚÖ¶Î"; - } - - /*! This is used for translation of the word that will possibly - * be followed by a single name or by a list of names - * of the category. - */ virtual QCString trGlobal(bool /*first_capital*/, bool /*singular*/) { /* @@ -1492,7 +1440,7 @@ class TranslatorChinese : public Translator virtual QCString trDirIndex() /* { return "Directory Hierarchy"; } */ { - return "$(BL\\ÂŒœá$(DC((B"; + return "ÄżÂŒœáčč"; } /*! This is used as the name of the chapter containing the documentation @@ -1501,7 +1449,7 @@ class TranslatorChinese : public Translator virtual QCString trDirDocumentation() /* { return "Directory Documentation"; } */ { - return "$(BL\\ÂŒJ8[c(B"; + return "ÄżÂŒÎÄ””"; } /*! This is used as the title of the directory index and also in the @@ -1510,7 +1458,7 @@ class TranslatorChinese : public Translator virtual QCString trDirectories() /* { return "Directories"; } */ { - return "$(BL\\ÂŒ(B"; + return "ÄżÂŒ"; } /*! This returns a sentences that introduces the directory hierarchy. @@ -1521,7 +1469,7 @@ class TranslatorChinese : public Translator /* "but not completely, alphabetically:"; */ /* } */ { - return "$(BL\\ÂŒœá$(DC(œöŸčę$(BBgCWE*GSNs!$VuL$40A40D;zJlËł=x(B"; + return "ÄżÂŒœáččœöŸčęŽÖÂÔ”ÄĆĆĐò"; } /*! This returns the title of a directory page. The name of the @@ -1531,7 +1479,7 @@ class TranslatorChinese : public Translator /* { QCString result=dirName; result+=" Directory Reference"; return result; } */ { QCString result=dirName; - result+=CN_SPC"$(BL\\ÂŒ;29M(B"; + result+=CN_SPC"ÄżÂŒČÎżŒ"; return result; } @@ -1543,9 +1491,10 @@ class TranslatorChinese : public Translator /* QCString result((first_capital ? "Director" : "director")); */ /* if (singular) result+="y"; else result+="ies"; */ /* return result; */ - return "$(BL\\ÂŒ(B"; + return "ÄżÂŒ"; } }; #endif + diff --git a/src/translator_cz.h b/src/translator_cz.h index 5984e80..54436eb 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -151,7 +151,7 @@ // Windows version. The version which does not call the function is // probably slightly faster. -class TranslatorCzech : public Translator +class TranslatorCzech : public TranslatorAdapter_1_4_1 { private: /*! The decode() inline assumes the source written in the diff --git a/src/translator_de.h b/src/translator_de.h index e704f53..e3335ab 100644 --- a/src/translator_de.h +++ b/src/translator_de.h @@ -102,7 +102,7 @@ #ifndef TRANSLATOR_DE_H #define TRANSLATOR_DE_H -class TranslatorGerman : public Translator +class TranslatorGerman : public TranslatorAdapter_1_4_1 { public: diff --git a/src/translator_en.h b/src/translator_en.h index 46b7793..ca1ff03 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -1602,6 +1602,19 @@ class TranslatorEnglish : public Translator return result; } +////////////////////////////////////////////////////////////////////////// +// new since 1.4.1 +////////////////////////////////////////////////////////////////////////// + + /*! This text is added to the documentation when the \\overload command + * is used for a overloaded function. + */ + virtual QCString trOverloadText() + { + return "This is an overloaded member function, " + "provided for convenience. It differs from the above " + "function only in what argument(s) it accepts."; + } }; #endif diff --git a/src/translator_fr.h b/src/translator_fr.h index 89fcb09..7c6c8ed 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -85,7 +85,7 @@ // Translator class (by the local maintainer) when the localized // translator is made up-to-date again. -class TranslatorFrench : public Translator +class TranslatorFrench : public TranslatorAdapter_1_4_1 { public: diff --git a/src/translator_hr.h b/src/translator_hr.h index 4876bc3..ef4fce6 100644 --- a/src/translator_hr.h +++ b/src/translator_hr.h @@ -58,11 +58,15 @@ // // 2004/09/15 // - Added strings for 1.3.9 +// +// 2005/02/28 +// - Removed obsolete (unused) methods +// #ifndef TRANSLATOR_HR_H #define TRANSLATOR_HR_H -class TranslatorCroatian : public Translator +class TranslatorCroatian : public TranslatorAdapter_1_4_1 { private: /*! to avoid macro redefinition from translator_cz.h */ @@ -104,10 +108,8 @@ class TranslatorCroatian : public Translator { return decode("Dokumentacija typedef èlanova"); } QCString trMemberEnumerationDocumentation() { return decode("Dokumentacija enumeracijskih èlanova"); } - QCString trEnumerationValueDocumentation() - { return "Dokumentacija enumeracijskih vrijednosti"; } QCString trMemberFunctionDocumentation() - { return "Dokumentacija funkcija"; } + { return "Dokumentacija funkcija"; } QCString trMemberDataDocumentation() { return "Documentacija varijabli"; } QCString trMore() @@ -149,8 +151,6 @@ class TranslatorCroatian : public Translator } QCString trFileList() { return "Popis datoteka"; } - QCString trHeaderFiles() - { return "Header datoteke"; } QCString trCompoundMembers() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) @@ -217,16 +217,12 @@ class TranslatorCroatian : public Translator result+="datoteke u kojima se nalaze:"; return decode(result); } - QCString trHeaderFilesDescription() - { return decode("Popis header datoteka koje èine API :"); } QCString trExamplesDescription() { return "Popis primjera :"; } QCString trRelatedPagesDescription() { return "Popis povezanih stranica:"; } QCString trModulesDescription() { return "Popis svih modula:"; } - QCString trNoDescriptionAvailable() - { return "Opis nije dostupan"; } QCString trDocumentation() { return "Dokumentacija"; } @@ -314,14 +310,8 @@ class TranslatorCroatian : public Translator } QCString trForInternalUseOnly() { return decode("Iskljuèivo za internu uporabu."); } - QCString trReimplementedForInternalReasons() - { return decode("Reimplementirano zbog internih razloga; " - "Nema utjecaja na API."); - } QCString trWarning() { return "Upozorenje"; } - QCString trBugsAndLimitations() - { return decode("Grečke i ogranièenja"); } QCString trVersion() { return "Verzija"; } QCString trDate() @@ -563,10 +553,6 @@ class TranslatorCroatian : public Translator // new since 0.49-991106 ////////////////////////////////////////////////////////////////////////// - QCString trSources() - { - return "Izvorne datoteke"; - } QCString trDefinedAtLineInSourceFile() { return "Definirano u liniji @0 datoteke @1."; @@ -852,11 +838,6 @@ class TranslatorCroatian : public Translator // new since 1.2.4 ////////////////////////////////////////////////////////////////////////// - /*! Used for Java interfaces in the summary section of Java packages */ - virtual QCString trInterfaces() - { - return decode("Suèelja (interfaces)"); - } /*! Used for Java classes in the summary section of Java packages */ virtual QCString trClasses() { @@ -882,11 +863,6 @@ class TranslatorCroatian : public Translator { return "Paketi"; } - /*! Used as a chapter title for Latex & RTF output */ - virtual QCString trPackageDocumentation() - { - return "Dokumentacija paketa"; - } /*! Text shown before a multi-line define */ virtual QCString trDefineValue() { @@ -1000,17 +976,6 @@ class TranslatorCroatian : public Translator * be followed by a single name or by a list of names * of the category. */ - virtual QCString trField(bool first_capital, bool singular) - { - QCString result((first_capital ? "Polj" : "polj")); - result+= (singular ? "e" : "a"); - return result; - } - - /*! This is used for translation of the word that will possibly - * be followed by a single name or by a list of names - * of the category. - */ virtual QCString trGlobal(bool first_capital, bool singular) { QCString result((first_capital ? "G" : "g")); diff --git a/src/translator_hu.h b/src/translator_hu.h index 921aeee..9f823b1 100644 --- a/src/translator_hu.h +++ b/src/translator_hu.h @@ -29,7 +29,7 @@ #ifndef TRANSLATOR_HU_H #define TRANSLATOR_HU_H -class TranslatorHungarian : public Translator +class TranslatorHungarian : public TranslatorAdapter_1_4_1 { private: const char * zed(char c) diff --git a/src/translator_it.h b/src/translator_it.h index dee5846..04cbc06 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -72,7 +72,7 @@ #ifndef TRANSLATOR_IT_H #define TRANSLATOR_IT_H -class TranslatorItalian : public Translator +class TranslatorItalian : public TranslatorAdapter_1_4_1 { public: diff --git a/src/translator_nl.h b/src/translator_nl.h index 2f2ddc9..3d637e2 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -1200,6 +1200,19 @@ class TranslatorDutch : public Translator return result; } +////////////////////////////////////////////////////////////////////////// +// new since 1.4.1 +////////////////////////////////////////////////////////////////////////// + + /*! This text is added to the documentation when the \\overload command + * is used for a function. + */ + virtual QCString trOverloadText() + { + return "Deze functie is overloaded en is beschikbaar gemaakt om het " + "gebruik te vergemakkelijken. Ze verschilt alleen van de " + "bovenstaande functie wat betreft de parameterlijst."; + } }; diff --git a/src/translator_pl.h b/src/translator_pl.h index bc7c57c..ac4b16d 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -20,7 +20,7 @@ #ifndef TRANSLATOR_PL_H #define TRANSLATOR_PL_H -class TranslatorPolish : public Translator +class TranslatorPolish : public TranslatorAdapter_1_4_1 { private: /*! to avoid macro redefinition from translator_pl.h */ diff --git a/src/translator_ro.h b/src/translator_ro.h index 2154ade..1ab2b7b 100644 --- a/src/translator_ro.h +++ b/src/translator_ro.h @@ -18,42 +18,44 @@ /* The translation from English to Romanian by Alexandru Iosup [aiosup@yahoo.com]. * * Disclaimer: I hope I translated these to Romanian keeping - * the meaning of the sentences intact. Keep in mind that I used C-words were possible, - * (e.g. the romanian for typedef is much unexpressive than the original), since we are - * producing C-documentation of our projects. + * the meaning of the sentences intact. I used C-words were possible, + * (e.g. the Romanian "definire de tip" for "typedef" is too long and + * unexpressive). * * If you have suggestions, please mail the comments and text proposals to the address * shown aprox.10 lines above * * ------------------------------------------- * Project start : 20.Sep.2k - * Last Doxygen version covered : 1.2.14 - * Last revision : 07.Mar.2k2 + * Last Doxygen version covered : 1.4.1 + * Last revision : 01.Mar.2k5 * ------------------------------------------- * * Revision history * ---------------- - * 20.Sep.2k First version, covering Doxygen 1.2.1 + * 01.Mar.2k5 Third revision, covering Doxygen 1.4.1 * * 07.Mar.2k2 Second revision, covering Doxygen 1.2.14 * - fixed some bugs + * + * 20.Sep.2k First version, covering Doxygen 1.2.1 + * */ #ifndef TRANSLATOR_RO_H #define TRANSLATOR_RO_H -class TranslatorRomanian: public TranslatorAdapter_1_2_16 +class TranslatorRomanian : public TranslatorAdapter_1_4_1 { public: // --- Language control methods ------------------- - /*! Used for identification of the language. May resemble - * the string returned by latexBabelPackage(), but it is not used - * for the same purpose. The identification should not be translated. - * It should be replaced by the name of the language in English - * (e.g. Czech, Japanese, Russian, etc.). It should be equal to - * the identification in language.h. + /*! Used for identification of the language. The identification + * should not be translated. It should be replaced by the name + * of the language in English using lower-case characters only + * (e.g. "czech", "japanese", "russian", etc.). It should be equal to + * the identification used in language.cpp. */ virtual QCString idLanguage() { return "romanian"; } @@ -136,7 +138,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! this is the first part of a sentence that is followed by a class name */ virtual QCString trThisIsTheListOfAllMembers() - { return "Aceasta este lista completă a membrilor din "; } + { return "Lista completă a membrilor din "; } /*! this is the remainder of the sentence after the class name */ virtual QCString trIncludingInheritedMembers() @@ -247,7 +249,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! This is an introduction to the list with all files. */ virtual QCString trFileListDescription(bool extractAll) { - QCString result="Aceasta este lista tuturor "; + QCString result="Lista tuturor "; result+="fișierelor"; if (!extractAll) result+=" documentate"; result+=", cu scurte descrieri:"; @@ -259,11 +261,11 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { - return "Acestea sunt structurile de date, cu scurte descrieri:"; + return "Lista structurilor de date, cu scurte descrieri:"; } else { - return "Acestea sunt clasele, structurile, uniunile și interfețele" + return "Lista claselor, structurilor, uniunilor și interfețelor" ", cu scurte descrieri:"; } @@ -272,7 +274,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! This is an introduction to the page with all class members. */ virtual QCString trCompoundMembersDescription(bool extractAll) { - QCString result="Aceasta este lista tuturor "; + QCString result="Lista tuturor "; if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { @@ -316,7 +318,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! This is an introduction to the page with all file members. */ virtual QCString trFileMembersDescription(bool extractAll) { - QCString result="Aceasta este lista tuturor "; + QCString result="Lista tuturor "; if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { result+="funcțiilor, variabilelor, define-urilor, enum-urilor și typedef-urilor"; @@ -339,19 +341,19 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! This is an introduction to the page with the list of all header files. */ virtual QCString trHeaderFilesDescription() - { return "Aceastea sunt fișierele Header care fac parte din API:"; } + { return "Lista fișierele Header care fac parte din API:"; } /*! This is an introduction to the page with the list of all examples */ virtual QCString trExamplesDescription() - { return "Aceasta este lista tuturor exemplelor:"; } + { return "Lista tuturor exemplelor:"; } /*! This is an introduction to the page with the list of related pages */ virtual QCString trRelatedPagesDescription() - { return "Aceasta este lista tuturor documentațiilor înrudite:"; } + { return "Lista tuturor documentațiilor înrudite:"; } /*! This is an introduction to the page with the list of class/file groups */ virtual QCString trModulesDescription() - { return "Aceasta este lista tuturor modulelor:"; } + { return "Lista tuturor modulelor:"; } /*! This sentences is used in the annotated class/file lists if no brief * description is given. @@ -389,7 +391,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 } else { - return "Indexul Componenților"; + return "Indexul Claselor"; } } @@ -620,7 +622,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! used as an introduction to the namespace list */ virtual QCString trNamespaceListDescription(bool extractAll) { - QCString result="Aceasta este lista tuturor "; + QCString result="Lista tuturor "; result+="namespace-urilor "; if (!extractAll) result+="documentate "; result+=", cu scurte descrieri:"; @@ -689,7 +691,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 virtual QCString trPublicMembers() { return "Metode Publice"; } virtual QCString trPublicSlots() - { return "Sloturi Publice"; } + { return "Conectori (slots) Publici"; } virtual QCString trSignals() { return "Semnale"; } virtual QCString trStaticPublicMembers() @@ -703,7 +705,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 virtual QCString trPrivateMembers() { return "Metode Private"; } virtual QCString trPrivateSlots() - { return "Sloturi Private"; } + { return "Conectori (slots) Privați"; } virtual QCString trStaticPrivateMembers() { return "Metode Statice Private"; } @@ -771,7 +773,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! This is an introduction to the page with all namespace members */ virtual QCString trNamespaceMemberDescription(bool extractAll) { - QCString result="Aceasta este lista tuturor membrilor "; + QCString result="Lista tuturor membrilor "; if (!extractAll) result+="documentați "; result+="din toate namespace-urile, cu legături către "; @@ -962,7 +964,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 } virtual QCString trPublicTypes() { - return "Tipuri publice"; + return "Tipuri Publice"; } virtual QCString trPublicAttribs() { @@ -1017,7 +1019,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! Used as the header of the todo list */ virtual QCString trTodoList() { - return "Lista lucrurilor rămase de făcut"; + return "Lista lucrurilor de făcut"; } ////////////////////////////////////////////////////////////////////////// @@ -1192,7 +1194,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! The description of the package index page */ virtual QCString trPackageListDescription() { - return "Acestea sunt pachetele, însoțite, acolo unde este cazul, de scurte descrieri:"; + return "Lista pachetelor, însoțită de scurte explicații, acolo unde acestea există:"; } /*! The link name in the Quick links header for each page */ virtual QCString trPackages() @@ -1217,12 +1219,12 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 /*! Used as a marker that is put before a \\bug item */ virtual QCString trBug() { - return "Bug"; + return "Problema (Bug)"; } /*! Used as the header of the bug list */ virtual QCString trBugList() { - return "Lista de Buguri"; + return "Lista de Probleme (Bugs)"; } ////////////////////////////////////////////////////////////////////////// @@ -1406,6 +1408,214 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16 return "Implementat în "+trWriteList(numEntries)+"."; } +////////////////////////////////////////////////////////////////////////// +// new since 1.2.16 +////////////////////////////////////////////////////////////////////////// + + /*! used in RTF documentation as a heading for the Table + * of Contents. + */ + virtual QCString trRTFTableOfContents() + { + return "Conținut"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.17 +////////////////////////////////////////////////////////////////////////// + + /*! Used as the header of the list of item that have been + * flagged deprecated + */ + virtual QCString trDeprecatedList() + { + return "Lista elementelor învechite (deprecated)"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.18 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a header for declaration section of the events found in + * a C# program + */ + virtual QCString trEvents() + { + return "Evenimente"; + } + /*! Header used for the documentation section of a class' events. */ + virtual QCString trEventDocumentation() + { + return "Documentația aferentă evenimentelor"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a heading for a list of Java class types with package scope. + */ + virtual QCString trPackageTypes() + { + return "Tipuri în pachet"; + } + /*! Used as a heading for a list of Java class functions with package + * scope. + */ + virtual QCString trPackageMembers() + { + return "Funcții în pachet"; + } + /*! Used as a heading for a list of static Java class functions with + * package scope. + */ + virtual QCString trStaticPackageMembers() + { + return "Funcții statice în pachet"; + } + /*! Used as a heading for a list of Java class variables with package + * scope. + */ + virtual QCString trPackageAttribs() + { + return "Atribute în pachet"; + } + /*! Used as a heading for a list of static Java class variables with + * package scope. + */ + virtual QCString trStaticPackageAttribs() + { + return "Atribute statice în pachet"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.1 +////////////////////////////////////////////////////////////////////////// + + /*! Used in the quick index of a class/file/namespace member list page + * to link to the unfiltered list of all members. + */ + virtual QCString trAll() + { + return "Toate"; + } + /*! Put in front of the call graph for a function. */ + virtual QCString trCallGraph() + { + return "Graful de apel al acestei funcții:"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.3 +////////////////////////////////////////////////////////////////////////// + + /*! When the search engine is enabled this text is put in the header + * of each page before the field where one can enter the text to search + * for. + */ + virtual QCString trSearchForIndex() + { + return "Caută"; + } + /*! This string is used as the title for the page listing the search + * results. + */ + virtual QCString trSearchResultsTitle() + { + return "Rezultatele căutarii"; + } + /*! This string is put just before listing the search results. The + * text can be different depending on the number of documents found. + * Inside the text you can put the special marker $num to insert + * the number representing the actual number of search results. + * The @a numDocuments parameter can be either 0, 1 or 2, where the + * value 2 represents 2 or more matches. HTML markup is allowed inside + * the returned string. + */ + virtual QCString trSearchResults(int numDocuments) + { + if (numDocuments==0) + { + return "Din pacate nu am găsit nici un document care să corespundă cererii."; + } + else if (numDocuments==1) + { + return "Am găsit <b>1</b> document corespunzând cererii."; + } + else + { + return "Am găsit <b>$num</b> documente corespunzând cererii. " + "Lista documentelor găsite, sortate după relevanță."; + } + } + /*! This string is put before the list of matched words, for each search + * result. What follows is the list of words that matched the query. + */ + virtual QCString trSearchMatches() + { + return "Găsite:"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.8 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in HTML as the title of page with source code for file filename + */ + virtual QCString trSourceFile(QCString& filename) + { + return " Fișierul sursă " + filename; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Ierarhia directoarelor"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Documentația directoarelor"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Directoare"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Această ierarhie de directoare este sortată, " + "per nivel, in ordine alfabetică:"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { + QCString result="Director-referință "; result+=dirName; + return result; + } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool singular) + { + QCString result((first_capital ? "Directo" : "directo")); + if (singular) result+="r"; else result="are"; + return result; + } + }; #endif diff --git a/src/translator_ru.h b/src/translator_ru.h index 0f7b898..3736a93 100644 --- a/src/translator_ru.h +++ b/src/translator_ru.h @@ -49,7 +49,7 @@ #ifndef TRANSLATOR_RU_H #define TRANSLATOR_RU_H -class TranslatorRussian : public Translator +class TranslatorRussian : public TranslatorAdapter_1_4_1 { private: /*! The Decode() inline assumes the source written in the diff --git a/src/translator_se.h b/src/translator_se.h index 0670e61..6cbd487 100644 --- a/src/translator_se.h +++ b/src/translator_se.h @@ -69,7 +69,7 @@ Problem! #ifndef TRANSLATOR_SE_H #define TRANSLATOR_SE_H -class TranslatorSwedish : public Translator +class TranslatorSwedish : public TranslatorAdapter_1_4_1 { public: diff --git a/src/translator_sr.h b/src/translator_sr.h index c1469a0..ce14ae8 100644 --- a/src/translator_sr.h +++ b/src/translator_sr.h @@ -21,7 +21,7 @@ // translation by Dejan D. M. Milosavljevic <dmilos@email.com>;<dmilosx@ptt.yu>;<office@ddmrm.com> // // 10x 2 Ivana Miletic for gramatical consutation. -class TranslatorSerbian : public Translator +class TranslatorSerbian : public TranslatorAdapter_1_4_1 { private: QCString decode(const QCString& sInput) diff --git a/src/translator_ua.h b/src/translator_ua.h index fac3a10..132955c 100644 --- a/src/translator_ua.h +++ b/src/translator_ua.h @@ -20,7 +20,7 @@ #ifndef TRANSLATOR_UA_H #define TRANSLATOR_UA_H -class TranslatorUkrainian : public Translator +class TranslatorUkrainian : public TranslatorAdapter_1_4_1 { private: /*! The Decode() inline assumes the source written in the diff --git a/src/util.cpp b/src/util.cpp index 36ae599..37da875 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -752,6 +752,8 @@ static Definition *followPath(Definition *start,FileDef *fileScope,const QCStrin if (current==0) break; // failed to follow the path ps=is+l; } + //printf("followPath(start=%s,path=%s) result=%s\n", + // start->name().data(),path.data(),current?current->name().data():"<null>"); return current; // path could be followed } @@ -1101,7 +1103,7 @@ ClassDef *getResolvedClassRec(Definition *scope, g_visitedNamespaces.clear(); // test accessibility of definition within scope. int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart); - //printf("distance %s is %d\n",d->name().data(),distance); + //printf(" distance %s is %d\n",d->name().data(),distance); if (distance!=-1) // definition is accessible { // see if we are dealing with a class or a typedef @@ -1398,7 +1400,9 @@ void linkifyText(const TextGeneratorIntf &out,Definition *scope, int floatingIndex=0; if (strLen==0) return; // read a word from the text string - while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1) + while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1 && + (newIndex==0 || !(txtStr.at(newIndex-1)>='0' && txtStr.at(newIndex-1)<='9')) // avoid matching part of hex numbers + ) { // add non-word part to the result floatingIndex+=newIndex-skipIndex; @@ -2979,7 +2983,6 @@ bool getDefs(const QCString &scName,const QCString &memberName, //printf("mScope=`%s' mName=`%s'\n",mScope.data(),mName.data()); - if (mName.isEmpty()) printf("memberName=%s\n",memberName.data()); MemberName *mn = Doxygen::memberNameSDict[mName]; if (!forceEmptyScope && mn && !(scopeName.isEmpty() && mScope.isEmpty())) { @@ -3016,8 +3019,8 @@ bool getDefs(const QCString &scName,const QCString &memberName, } for (mmli.toFirst();(mmd=mmli.current());++mmli) { - if (mmd->isLinkable()) - { + //if (mmd->isLinkable()) + //{ bool match=args==0 || matchArguments(mmd->argumentList(),argList,className,0,checkCV); //printf("match=%d\n",match); @@ -3032,7 +3035,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, md=mmd; } } - } + //} } if (argList) { @@ -3044,27 +3047,36 @@ bool getDefs(const QCString &scName,const QCString &memberName, //printf(" >Searching for arbitrary member\n"); for (mmli.toFirst();(mmd=mmli.current());++mmli) { - if (mmd->isLinkable()) - { + //if (mmd->isLinkable()) + //{ ClassDef *mcd=mmd->getClassDef(); //printf(" >Class %s found\n",mcd->name().data()); int m=minClassDistance(fcd,mcd); - if (m<mdist && mcd->isLinkable()) + if (m<mdist /* && mcd->isLinkable()*/ ) { //printf("Class distance %d\n",m); mdist=m; cd=mcd; md=mmd; } - } + //} } } //printf(" >Succes=%d\n",mdist<maxInheritanceDepth); if (mdist<maxInheritanceDepth) { - gd=md->getGroupDef(); - if (gd) cd=0; - return TRUE; /* found match */ + if (!md->isLinkable()) + { + md=0; // avoid returning things we cannot link to + cd=0; + return FALSE; // match found, but was not linkable + } + else + { + gd=md->getGroupDef(); + if (gd) cd=0; + return TRUE; /* found match */ + } } } /* go to the parent scope */ @@ -3115,7 +3127,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, { //printf("mmd->getNamespaceDef()=%p fnd=%p\n", // mmd->getNamespaceDef(),fnd); - if (mmd->getNamespaceDef()==fnd && mmd->isLinkable()) + if (mmd->getNamespaceDef()==fnd /* && mmd->isLinkable() */ ) { // namespace is found bool match=TRUE; ArgumentList *argList=0; @@ -3144,7 +3156,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, { for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli) { - if (mmd->getNamespaceDef()==fnd && mmd->isLinkable()) + if (mmd->getNamespaceDef()==fnd /*&& mmd->isLinkable() */ ) { nd=fnd; md=mmd; @@ -3154,9 +3166,18 @@ bool getDefs(const QCString &scName,const QCString &memberName, } if (found) { - gd=md->getGroupDef(); - if (gd && gd->isLinkable()) nd=0; else gd=0; - return TRUE; + if (!md->isLinkable()) + { + md=0; // avoid returning things we cannot link to + nd=0; + return FALSE; // match found but not linkable + } + else + { + gd=md->getGroupDef(); + if (gd && gd->isLinkable()) nd=0; else gd=0; + return TRUE; + } } } if (scopeOffset==0) @@ -3168,100 +3189,101 @@ bool getDefs(const QCString &scName,const QCString &memberName, scopeOffset=0; } } while (scopeOffset>=0); - //else // no scope => global function + + //else // no scope => global function + { + QList<MemberDef> members; + + //printf(" Function with global scope name `%s' args=`%s'\n",memberName.data(),args); + MemberListIterator mli(*mn); + for (mli.toFirst();(md=mli.current());++mli) { - QList<MemberDef> members; - - //printf(" Function with global scope name `%s' args=`%s'\n",memberName.data(),args); - MemberListIterator mli(*mn); - for (mli.toFirst();(md=mli.current());++mli) - { - if (md->isLinkable()) + //if (md->isLinkable()) + //{ + fd=md->getFileDef(); + gd=md->getGroupDef(); + //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p\n", + // md->name().data(),args,fd,gd); + if ( + (gd && gd->isLinkable()) || (fd && fd->isLinkable()) + ) { - fd=md->getFileDef(); - gd=md->getGroupDef(); - //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p\n", - // md->name().data(),args,fd,gd); - if ( - (gd && gd->isLinkable()) || (fd && fd->isLinkable()) - ) + //printf(" fd=%p gd=%p args=`%s'\n",fd,gd,args); + bool match=TRUE; + ArgumentList *argList=0; + if (args && !md->isDefine() && strcmp(args,"()")!=0) { - //printf(" fd=%p gd=%p args=`%s'\n",fd,gd,args); - bool match=TRUE; - ArgumentList *argList=0; - if (args && !md->isDefine() && strcmp(args,"()")!=0) - { - argList=new ArgumentList; - stringToArgumentList(args,argList); - match=matchArguments(md->argumentList(),argList,0,0,checkCV); - delete argList; argList=0; - } - if (match) - { - //printf("Found match!\n"); - members.append(md); - } + argList=new ArgumentList; + stringToArgumentList(args,argList); + match=matchArguments(md->argumentList(),argList,0,0,checkCV); + delete argList; argList=0; } - } - } - if (members.count()!=1 && args && !strcmp(args,"()")) - { - // no exact match found, but if args="()" an arbitrary - // member will do - md=mn->last(); - while (md && md->isLinkable()) - { - //printf("Found member `%s'\n",md->name().data()); - //printf("member is linkable md->name()=`%s'\n",md->name().data()); - fd=md->getFileDef(); - gd=md->getGroupDef(); - if ( - (gd && gd->isLinkable()) || (fd && fd->isLinkable()) - ) + if (match) { + //printf("Found match!\n"); members.append(md); } - md=mn->prev(); } + //} + } + if (members.count()!=1 && args && !strcmp(args,"()")) + { + // no exact match found, but if args="()" an arbitrary + // member will do + md=mn->last(); + while (md /* && md->isLinkable()*/) + { + //printf("Found member `%s'\n",md->name().data()); + //printf("member is linkable md->name()=`%s'\n",md->name().data()); + fd=md->getFileDef(); + gd=md->getGroupDef(); + if ( + (gd && gd->isLinkable()) || (fd && fd->isLinkable()) + ) + { + members.append(md); + } + md=mn->prev(); } - //printf("found %d candidate members\n",members.count()); - if (members.count()==1 || currentFile!=0) + } + //printf("found %d candidate members\n",members.count()); + if (members.count()==1 || currentFile!=0) + { + md=members.first(); + } + else if (members.count()>1) + { + //printf("Found more than one matching member!\n"); + // use some C scoping rules to determine the correct link + // 1. member in current file + // 2. non-static member in different file + if (currentFile==0) { - md=members.first(); + bool ambig; + currentFile = findFileDef(Doxygen::inputNameDict,0/*namespaceName*/,ambig); } - else if (members.count()>1) + MemberDef *bmd = 0; + for (md=members.first(); md; md=members.next()) { - //printf("Found more than one matching member!\n"); - // use some C scoping rules to determine the correct link - // 1. member in current file - // 2. non-static member in different file - if (currentFile==0) - { - bool ambig; - currentFile = findFileDef(Doxygen::inputNameDict,0/*namespaceName*/,ambig); - } - MemberDef *bmd = 0; - for (md=members.first(); md; md=members.next()) + if (md->getFileDef() == currentFile) { - if (md->getFileDef() == currentFile) - { - bmd = 0; - break; - } - if (!(md->isStatic()) || Config_getBool("EXTRACT_STATIC")) bmd = md; + bmd = 0; + break; } - if (bmd) md=bmd; - } - if (md && !md->isLinkable()) md=0; // ignore things we cannot link to - if (md) // found a matching global member - { - fd=md->getFileDef(); - gd=md->getGroupDef(); - //printf("fd=%p gd=%p gd->isLinkable()=%d\n",fd,gd,gd->isLinkable()); - if (gd && gd->isLinkable()) fd=0; else gd=0; - return TRUE; + if (!(md->isStatic()) || Config_getBool("EXTRACT_STATIC")) bmd = md; } + if (bmd) md=bmd; + } + if (md && !md->isLinkable()) md=0; // ignore things we cannot link to + if (md) // found a matching global member + { + fd=md->getFileDef(); + gd=md->getGroupDef(); + //printf("fd=%p gd=%p gd->isLinkable()=%d\n",fd,gd,gd->isLinkable()); + if (gd && gd->isLinkable()) fd=0; else gd=0; + return TRUE; } + } } // no nothing found @@ -4234,9 +4256,10 @@ QCString convertToHtml(const char *s) */ const char *getOverloadDocs() { - return "This is an overloaded member function, " - "provided for convenience. It differs from the above " - "function only in what argument(s) it accepts."; + return theTranslator->trOverloadText(); + //"This is an overloaded member function, " + // "provided for convenience. It differs from the above " + // "function only in what argument(s) it accepts."; } void addMembersToMemberGroup(MemberList *ml, @@ -5216,3 +5239,37 @@ QCString stripPath(const char *s) } return result; } + +/** returns \c TRUE iff string \a s contains word \a w */ +bool containsWord(const QCString &s,const QCString &word) +{ + static QRegExp wordExp("[a-z_A-Z]+"); + int p=0,i,l; + while ((i=wordExp.match(s,p,&l))!=-1) + { + if (s.mid(i,l)==word) return TRUE; + p=i+l; + } + return FALSE; +} + +bool findAndRemoveWord(QCString &s,const QCString &word) +{ + static QRegExp wordExp("[a-z_A-Z]+"); + int p=0,i,l; + while ((i=wordExp.match(s,p,&l))!=-1) + { + if (s.mid(i,l)==word) + { + if (i>0 && isspace(s.at(i-1))) + i--,l++; + else if (i+l<(int)s.length() && isspace(s.at(i+l))) + l++; + s = s.left(i)+s.mid(i+l); // remove word + spacing + return TRUE; + } + p=i+l; + } + return FALSE; +} + @@ -228,6 +228,8 @@ QCString relativePathToRoot(const char *name); #define REL_PATH_TO_ROOT "../../" void createSubDirs(QDir &d); QCString stripPath(const char *s); +bool containsWord(const QCString &s,const QCString &word); +bool findAndRemoveWord(QCString &s,const QCString &word); #endif |