summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp12
-rw-r--r--src/config.l10
-rw-r--r--src/docparser.cpp15
-rw-r--r--src/doctokenizer.l12
-rw-r--r--src/doxygen.cpp4
-rw-r--r--src/filedef.cpp8
-rw-r--r--src/htmlgen.cpp2
-rw-r--r--src/mangen.cpp1
-rw-r--r--src/namespacedef.cpp8
-rw-r--r--src/pre.l18
-rw-r--r--src/scanner.l86
-rw-r--r--src/translator_sr.h18
-rw-r--r--src/util.cpp85
13 files changed, 225 insertions, 54 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index f4b0c9a..bfe7cac 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -727,7 +727,13 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
!documentation().isEmpty())
{
- ol.newParagraph();
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.newParagraph();
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
}
// write documentation
if (!documentation().isEmpty())
@@ -1032,14 +1038,12 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.endDotGraph(usageImplGraph);
if (Config_getBool("GENERATE_LEGEND"))
{
- ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<center><font size=\"2\">[");
ol.startHtmlLink("graph_legend"+Doxygen::htmlFileExtension);
ol.docify(theTranslator->trLegend());
ol.endHtmlLink();
ol.writeString("]</font></center>");
- ol.popGeneratorState();
}
ol.popGeneratorState();
}
@@ -1051,11 +1055,13 @@ void ClassDef::writeDocumentation(OutputList &ol)
/* && !Config_getBool("INLINE_INHERITED_MEMB") */
)
{
+ ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.startTextLink(m_memListFileName,0);
ol.parseText(theTranslator->trListOfAllMembers());
ol.endTextLink();
ol.enableAll();
+ ol.popGeneratorState();
}
ol.endTextBlock();
diff --git a/src/config.l b/src/config.l
index a2ace80..88442d2 100644
--- a/src/config.l
+++ b/src/config.l
@@ -1396,7 +1396,7 @@ void Config::create()
"overviews. This option has no effect if EXTRACT_ALL is enabled. \n",
FALSE
);
- cb = addBool(
+ cb = addBool(
"HIDE_FRIEND_COMPOUNDS",
"If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n"
"friend (class|struct|union) declarations. \n"
@@ -1405,6 +1405,14 @@ void Config::create()
FALSE
);
cb = addBool(
+ "HIDE_IN_BODY_DOCS",
+ "If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n"
+ "documentation blocks found inside the body of a function. \n"
+ "If set to NO (the default) these blocks will be appended to the \n"
+ "function's detailed documentation block. \n",
+ FALSE
+ );
+ cb = addBool(
"BRIEF_MEMBER_DESC",
"If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n"
"include brief member descriptions after the members that are listed in \n"
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 4b15a2b..53f58bc 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -423,7 +423,11 @@ static bool findDocsForMemberOrCompound(const char *commandName,
NamespaceDef *nd=0;
GroupDef *gd=0;
PageInfo *pi=0;
- bool found = getDefs(g_context.latin1(),name.latin1(),args,md,cd,fd,nd,gd,FALSE,0,TRUE);
+ bool found = getDefs(
+ g_context.find('.')==-1?g_context.latin1():"", // `find('.') is a hack to detect files
+ name.latin1(),
+ args.isEmpty()?0:args.latin1(),
+ md,cd,fd,nd,gd,FALSE,0,TRUE);
if (found && md)
{
*pDoc=md->documentation();
@@ -4371,6 +4375,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
// pretty print the result
PrintDocVisitor *v = new PrintDocVisitor;
root->accept(v);
+ delete v;
}
checkUndocumentedParams();
@@ -4413,6 +4418,14 @@ DocNode *validatingParseText(const char *input)
DocText *txt = new DocText;
txt->parse();
+ if (Debug::isFlagSet(Debug::PrintTree))
+ {
+ // pretty print the result
+ PrintDocVisitor *v = new PrintDocVisitor;
+ txt->accept(v);
+ delete v;
+ }
+
delete g_token;
return txt;
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index f92a6f3..879ca2c 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -319,7 +319,7 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
g_token->name=yytext;
return TK_URL;
}
-<St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9.-]+ {
+<St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9-]+"."[a-z_A-Z0-9.-]+ {
g_token->name=yytext;
return TK_URL;
}
@@ -383,7 +383,10 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
<St_Para,St_Text>{WORD1} |
<St_Para,St_Text>{WORD2} { /* function call */
- g_token->name = yytext;
+ if (yytext[0]=='%') // strip % if present
+ g_token->name = &yytext[1];
+ else
+ g_token->name = yytext;
return TK_WORD;
/* the following is dummy code to please the
@@ -465,7 +468,10 @@ HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
}
<St_TitleN>{WORD1} |
<St_TitleN>{WORD2} { /* word */
- g_token->name = yytext;
+ if (yytext[0]=='%') // strip % if present
+ g_token->name = &yytext[1];
+ else
+ g_token->name = yytext;
return TK_WORD;
}
<St_TitleN>[ \t]+ {
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 22b12e5..e32300c 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -4556,7 +4556,7 @@ static void findMember(Entry *root,
warn_cont("%s ",md->typeString());
}
warn_cont("%s::%s%s\n",
- cd->name().data(),
+ cd->qualifiedNameWithTemplateParameters().data(),
md->name().data(),md->argsString());
}
}
@@ -7806,6 +7806,7 @@ void generateOutput()
msg("Generating group index...\n");
writeGroupIndex(*outputList);
+
//msg("Generating package index...\n");
//generatePackageDocs();
@@ -7831,6 +7832,7 @@ void generateOutput()
generateSearchIndex();
msg("Generating style sheet...\n");
+ //printf("writing style info\n");
outputList->writeStyleInfo(0); // write first part
outputList->disableAllBut(OutputGenerator::Latex);
outputList->parseText(
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 02716ee..e2e6be0 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -122,7 +122,13 @@ void FileDef::writeDetailedDocumentation(OutputList &ol)
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
!documentation().isEmpty())
{
- ol.newParagraph();
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.newParagraph();
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
}
if (!documentation().isEmpty())
{
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index fd2ef70..02f2b91 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -313,10 +313,12 @@ void HtmlGenerator::endProjectNumber()
void HtmlGenerator::writeStyleInfo(int part)
{
+ //printf("writeStyleInfo(%d)\n",part);
if (part==0)
{
if (Config_getString("HTML_STYLESHEET").isEmpty()) // write default style sheet
{
+ //printf("write doxygen.css\n");
startPlainFile("doxygen.css");
// alternative, cooler looking titles
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 8712328..06f0204 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -619,6 +619,5 @@ void ManGenerator::printDoc(DocNode *n)
ManDocVisitor *visitor = new ManDocVisitor(t,*this);
n->accept(visitor);
delete visitor;
- t << endl;
}
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 0f32a94..b0842f5 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -207,7 +207,13 @@ void NamespaceDef::writeDetailedDocumentation(OutputList &ol)
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
!documentation().isEmpty())
{
- ol.newParagraph();
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.newParagraph();
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
}
if (!documentation().isEmpty())
{
diff --git a/src/pre.l b/src/pre.l
index 8123ae2..d85023f 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -971,11 +971,11 @@ static void readIncludeFile(const QCString &inc)
g_includeStack.push(fs);
// set the scanner to the include file
- // TODO: Enable this to deal with file changes due to
+ // Deal with file changes due to
// #include's within { .. } blocks
- //QCString lineStr;
- //lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
- //outputArray(lineStr.data(),lineStr.length());
+ QCString lineStr;
+ lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
+ outputArray(lineStr.data(),lineStr.length());
//fprintf(stderr,"Switching to include file %s\n",incFileName.data());
preYYin=f;
@@ -1624,9 +1624,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
BEGIN(SkipCPPComment);
}
<SkipCComment>"*/" {
+ outputChar('*');outputChar('/');
if (--g_commentCount<=0)
{
- outputChar('*');outputChar('/');
BEGIN(g_lastCContext);
}
}
@@ -1803,11 +1803,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
setFileName(fs->fileName.copy());
//fprintf(stderr,"######## FileName %s\n",g_yyFileName.data());
- // TODO: Enable this to deal with file changes due to
+ // Deal with file changes due to
// #include's within { .. } blocks
- //QCString lineStr;
- //lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data());
- //outputArray(lineStr.data(),lineStr.length());
+ QCString lineStr;
+ lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data());
+ outputArray(lineStr.data(),lineStr.length());
delete fs; fs=0;
}
diff --git a/src/scanner.l b/src/scanner.l
index 6d055eb..67ec602 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -657,6 +657,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
%x GetCallType
%x JavaImport
%x CSAccessorDecl
+%x PreLineCtrl
%%
@@ -1356,6 +1357,17 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current->bodyLine = yyLineNr;
BEGIN( Define );
}
+<FindMembers>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */
+ yyLineNr = atoi(&yytext[1]);
+ BEGIN( PreLineCtrl );
+ }
+<PreLineCtrl>"\""[^\n\"]*"\"" {
+ strncpy(yyFileName,stripQuotes(yytext),4096);
+ }
+<PreLineCtrl>. {}
+<PreLineCtrl>\n {
+ BEGIN(FindMembers);
+ }
<SkipCPP>.
<SkipCPP>\\[\r]*"\n"[\r]* { yyLineNr++ ; }
<SkipCPP>[\r]*\n[\r]* { yyLineNr++ ;
@@ -2587,6 +2599,14 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
else
{
+ if (!Config_getBool("HIDE_IN_BODY_DOCS") &&
+ !current->doc.isEmpty())
+ {
+ // copy documentation found inside the body
+ // to the previous item
+ previous->doc += current->doc;
+ current->doc.resize(0);
+ }
previous->endBodyLine=yyLineNr;
BEGIN( lastCurlyContext ) ;
}
@@ -2943,16 +2963,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
//printf("Start doc block at %d\n",yyLineNr);
removeSlashes=(yytext[1]=='/');
tmpDocType=-1;
- if (YY_START==ReadBody)
- {
- current->doc+="\n\n";
- }
- else
+ if (YY_START!=SkipCurly)
{
- current->doc.resize(0);
+ current->doc.resize(0);
+ current->docLine = yyLineNr;
+ current->docFile = yyFileName;
}
- current->docLine = yyLineNr;
- current->docFile = yyFileName;
lastDocContext = YY_START;
if (current_root->section & Entry::SCOPE_MASK)
{
@@ -2978,27 +2994,27 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
if (!Config_getBool("JAVADOC_AUTOBRIEF")) // use the Qt style
{
tmpDocType=-1;
- if (YY_START==ReadBody)
+ if (!Config_getBool("HIDE_IN_BODY_DOCS") &&
+ YY_START==SkipCurly) // inside body
{
current->doc+="\n\n";
}
else
{
current->doc.resize(0);
+ current->docLine = yyLineNr;
+ current->docFile = yyFileName;
}
- current->docLine = yyLineNr;
- current->docFile = yyFileName;
BEGIN( Doc );
}
else // Use the javadoc style
{
- if (YY_START==ReadBody)
+ if (!Config_getBool("HIDE_IN_BODY_DOCS") &&
+ YY_START==SkipCurly) // inside body
{
tmpDocType=-1;
current->doc+="\n\n";
- lastDocContext = ReadBody;
- current->docLine = yyLineNr;
- current->docFile = yyFileName;
+ lastDocContext = SkipCurly;
BEGIN( Doc );
}
else
@@ -3014,10 +3030,13 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
}
}
-<FindMembers,FindFields,MemberSpec,FuncQual,Operator,ClassVar,Bases>"//!" {
- current->brief.resize(0);
- current->briefFile=yyFileName;
- current->briefLine=yyLineNr;
+<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases>"//!" {
+ if (YY_START!=SkipCurly)
+ {
+ current->brief.resize(0);
+ current->briefFile=yyFileName;
+ current->briefLine=yyLineNr;
+ }
tmpDocType=-1;
lastDocContext = YY_START;
if (current_root->section & Entry::SCOPE_MASK)
@@ -3030,10 +3049,13 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
BEGIN( LineDoc );
}
-<FindMembers,FindFields,MemberSpec,FuncQual,Operator,ClassVar,Bases>"///"/[^/] {
- current->brief.resize(0);
- current->briefFile=yyFileName;
- current->briefLine=yyLineNr;
+<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases>"///"/[^/] {
+ if (YY_START!=SkipCurly)
+ {
+ current->brief.resize(0);
+ current->briefFile=yyFileName;
+ current->briefLine=yyLineNr;
+ }
tmpDocType=-1;
lastDocContext = YY_START;
if (current_root->section & Entry::SCOPE_MASK)
@@ -4089,6 +4111,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
else
{
current->brief += " ";
+ if (!current->doc.isEmpty())
+ {
+ current->doc += "<p>";
+ }
yyLineNr++ ;
}
}
@@ -4194,6 +4220,16 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<LineDoc>[\n\r]+{B}*"//"[!/] { lineCount(); }
<LineDoc>\n {
yyLineNr++;
+ if (!Config_getBool("HIDE_IN_BODY_DOCS") &&
+ lastDocContext==SkipCurly) // inside body
+ {
+ if (!previous->doc.isEmpty())
+ {
+ previous->doc+="<p>";
+ }
+ previous->doc += current->brief;
+ current->brief.resize(0);
+ }
BEGIN( lastDocContext );
}
<DefLineDoc>\n {
@@ -4318,6 +4354,10 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
checkDocs();
current->doc += "\n\n";
//printf("End of docs at line %d\n",yyLineNr);
+ if (lastDocContext==SkipCurly && Config_getBool("HIDE_IN_BODY_DOCS"))
+ {
+ current->doc.resize(0);
+ }
BEGIN( lastDocContext );
}
<JavaDoc>"*/" {
diff --git a/src/translator_sr.h b/src/translator_sr.h
index 3047274..dab7d15 100644
--- a/src/translator_sr.h
+++ b/src/translator_sr.h
@@ -272,7 +272,7 @@ private:
result+="članova klasa";
}
result+=" sa linkovima na ";
- if (!extractAll)
+ if (extractAll)
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
@@ -331,7 +331,7 @@ private:
/*! This is an introduction to the page with the list of related pages */
virtual QCString trRelatedPagesDescription()
- { return decode( "Spisak svih slčinih stranica:" ); }
+ { return decode( "Spisak svih sličnih stranica:" ); }
/*! This is an introduction to the page with the list of class/file groups */
virtual QCString trModulesDescription()
@@ -945,11 +945,11 @@ private:
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "Član" );
+ return decode( "Članovi" );
}
else
{
- return decode( "Javni član" );
+ return decode( "Javni članovi" );
}
}
virtual QCString trStaticPublicAttribs()
@@ -1403,7 +1403,17 @@ private:
return decode( "Sadržaj" );
}
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return decode( "Spisak zastarelih funkcija članica" );
+ }
};
diff --git a/src/util.cpp b/src/util.cpp
index 56f61c3..b445c34 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -308,7 +308,7 @@ void writePageRef(OutputDocInterface &od,const char *cn,const char *mn)
QCString generateMarker(int id)
{
QCString result;
- result.sprintf("@%d\n",id);
+ result.sprintf("@%d",id);
return result;
}
@@ -1228,7 +1228,69 @@ static QCString trimTemplateSpecifiers(
return result;
}
-// removes the (one and only) occurrence of name:: from s.
+/*!
+ * @param pattern pattern to look for
+ * @param s string to search in
+ * @param p position to start
+ * @param len resulting pattern length
+ * @returns position on which string is found, or -1 if not found
+ */
+static int findScopePattern(const QCString &pattern,const QCString &s,
+ int p,int *len)
+{
+ int sl=s.length();
+ int pl=pattern.length();
+ int sp=0;
+ *len=0;
+ while (p<sl)
+ {
+ sp=p; // start of match
+ int pp=0; // pattern position
+ while (p<sl && pp<pl)
+ {
+ if (s.at(p)=='<') // skip template arguments while matching
+ {
+ int bc=1;
+ //printf("skipping pos=%d c=%c\n",p,s.at(p));
+ p++;
+ while (p<sl)
+ {
+ if (s.at(p)=='<') bc++;
+ else if (s.at(p)=='>')
+ {
+ bc--;
+ if (bc==0)
+ {
+ p++;
+ break;
+ }
+ }
+ //printf("skipping pos=%d c=%c\n",p,s.at(p));
+ p++;
+ }
+ }
+ else if (s.at(p)==pattern.at(pp))
+ {
+ //printf("match at position p=%d pp=%d c=%c\n",p,pp,s.at(p));
+ p++;
+ pp++;
+ }
+ else // no match
+ {
+ //printf("restarting at %d c=%c pat=%s\n",p,s.at(p),pattern.data());
+ p=sp+1;
+ break;
+ }
+ }
+ if (pp==pl) // whole pattern matches
+ {
+ *len=p-sp;
+ return sp;
+ }
+ }
+ return -1;
+}
+
static QCString trimScope(const QCString &name,const QCString &s)
{
int scopeOffset=name.length();
@@ -1239,11 +1301,11 @@ static QCString trimScope(const QCString &name,const QCString &s)
QCString scope=name.left(scopeOffset)+"::";
//printf("Trying with scope=`%s'\n",scope.data());
- int i,p=0;
- while ((i=result.find(scope,p))!=-1) // for each occurrence
+ int i,p=0,l;
+ while ((i=findScopePattern(scope,result,p,&l))!=-1) // for each occurrence
{
tmp+=result.mid(p,i-p); // add part before pattern
- p=i+scope.length();
+ p=i+l;
}
tmp+=result.right(result.length()-p); // add trailing part
@@ -1462,6 +1524,17 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
stripIrrelevantConstVolatile(srcAType);
stripIrrelevantConstVolatile(dstAType);
+ // strip typename keyword
+ if (strncmp(srcAType,"typename ",9)==0)
+ {
+ srcAType = srcAType.right(srcAType.length()-9);
+ }
+ if (strncmp(dstAType,"typename ",9)==0)
+ {
+ dstAType = dstAType.right(dstAType.length()-9);
+ }
+
+
srcAType = removeRedundantWhiteSpace(srcAType);
dstAType = removeRedundantWhiteSpace(dstAType);
@@ -2146,7 +2219,6 @@ bool getDefs(const QCString &scName,const QCString &memberName,
}
}
}
- //printf("found %d candidate members\n",members.count());
if (members.count()!=1 && !strcmp(args,"()"))
{
// no exact match found, but if args="()" an arbitrary
@@ -2167,6 +2239,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
md=mn->prev();
}
}
+ //printf("found %d candidate members\n",members.count());
if (members.count()==1 || currentFile!=0)
{
md=members.first();