summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2005-03-07 21:07:13 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2005-03-07 21:07:13 (GMT)
commit5a6400835bc92fb56ef65126785cbe75f092f2d1 (patch)
tree3f86b13900ced91ef5e802650b33a38767bf6c11 /src
parentd745dd3737ece0f328e515b1cf10306da0901597 (diff)
downloadDoxygen-5a6400835bc92fb56ef65126785cbe75f092f2d1.zip
Doxygen-5a6400835bc92fb56ef65126785cbe75f092f2d1.tar.gz
Doxygen-5a6400835bc92fb56ef65126785cbe75f092f2d1.tar.bz2
Release-1.4.1-20050307
Diffstat (limited to 'src')
-rw-r--r--src/code.l24
-rw-r--r--src/commentcnv.l75
-rw-r--r--src/commentscan.l61
-rw-r--r--src/doxygen.cpp145
-rw-r--r--src/htmlgen.cpp9
-rw-r--r--src/index.cpp77
-rw-r--r--src/memberdef.cpp33
-rw-r--r--src/memberdef.h4
-rw-r--r--src/pre.l11
-rw-r--r--src/scanner.l25
-rw-r--r--src/tagreader.cpp122
-rw-r--r--src/translator.h6
-rw-r--r--src/translator_adapter.h12
-rw-r--r--src/translator_br.h2
-rw-r--r--src/translator_cn.h69
-rw-r--r--src/translator_cz.h2
-rw-r--r--src/translator_de.h2
-rw-r--r--src/translator_en.h13
-rw-r--r--src/translator_fr.h2
-rw-r--r--src/translator_hr.h47
-rw-r--r--src/translator_hu.h2
-rw-r--r--src/translator_it.h2
-rw-r--r--src/translator_nl.h13
-rw-r--r--src/translator_pl.h2
-rw-r--r--src/translator_ro.h276
-rw-r--r--src/translator_ru.h2
-rw-r--r--src/translator_se.h2
-rw-r--r--src/translator_sr.h2
-rw-r--r--src/translator_ua.h2
-rw-r--r--src/util.cpp255
-rw-r--r--src/util.h2
31 files changed, 793 insertions, 508 deletions
diff --git a/src/code.l b/src/code.l
index 3d17bd1..1b15170 100644
--- a/src/code.l
+++ b/src/code.l
@@ -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 << "&lt;"; col++;
break;
@@ -852,6 +855,8 @@ void HtmlGenerator::codify(const char *str)
break;
case '&': t << "&amp;"; col++;
break;
+ //case ' ': t << "&nbsp;"; col++;
+ // break;
case '\\':
if (*p=='<')
{ t << "&lt;"; 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
diff --git a/src/pre.l b/src/pre.l
index fdf569d..cb23bb8 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -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;
+}
+
diff --git a/src/util.h b/src/util.h
index f6d177e..21d630c 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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