summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2004-01-25 21:11:43 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2004-01-25 21:11:43 (GMT)
commit3ced61065d252f4f8a3cf5f310f30094d91ac83c (patch)
tree5e3ff29c80e73d69c88e8b33d670753c31eed4b2 /src
parent29348f280d674693e74e30ae55ca63ab3b97372e (diff)
downloadDoxygen-3ced61065d252f4f8a3cf5f310f30094d91ac83c.zip
Doxygen-3ced61065d252f4f8a3cf5f310f30094d91ac83c.tar.gz
Doxygen-3ced61065d252f4f8a3cf5f310f30094d91ac83c.tar.bz2
Release-1.3.5-20040125
Diffstat (limited to 'src')
-rw-r--r--src/classdef.h2
-rw-r--r--src/classlist.cpp29
-rw-r--r--src/code.l4
-rw-r--r--src/config.l63
-rw-r--r--src/docparser.cpp9
-rw-r--r--src/docparser.h6
-rw-r--r--src/doxygen.cpp16
-rw-r--r--src/doxygen.h1
-rw-r--r--src/filedef.cpp5
-rw-r--r--src/htmldocvisitor.cpp3
-rw-r--r--src/index.cpp16
-rw-r--r--src/latexdocvisitor.cpp9
-rw-r--r--src/message.cpp2
-rw-r--r--src/outputlist.cpp62
-rw-r--r--src/perlmodgen.cpp2
-rw-r--r--src/scanner.l125
-rw-r--r--src/util.cpp53
-rw-r--r--src/xmlgen.cpp12
18 files changed, 253 insertions, 166 deletions
diff --git a/src/classdef.h b/src/classdef.h
index fbd4cf7..ae42993 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -302,6 +302,8 @@ class ClassDef : public Definition
* \param fName the file name as found in the tag file.
* This overwrites the file that doxygen normally
* generates based on the compound type & name.
+ * \param isSymbol If TRUE this class name is added as a publicly
+ * visible (and referencable) symbol.
*/
ClassDef(const char *fileName,int startLine,
const char *name,CompoundType ct,
diff --git a/src/classlist.cpp b/src/classlist.cpp
index c9fc0d1..7a52556 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -30,26 +30,29 @@ ClassList::~ClassList()
{
}
-int ClassList::compareItems(GCI item1, GCI item2)
+static int compItems(void *item1,void *item2)
{
ClassDef *c1=(ClassDef *)item1;
ClassDef *c2=(ClassDef *)item2;
- //return stricmp(c1->localName().data()+getPrefixIndex(c1->localName()),
- // c2->localName().data()+getPrefixIndex(c2->localName())
- // );
- return stricmp(c1->className().data()+getPrefixIndex(c1->className()),
- c2->className().data()+getPrefixIndex(c2->className()));
+ int p1=0,p2=0;
+ static bool b = Config_getBool("SORT_BY_SCOPE_NAME");
+ if (!b)
+ {
+ p1=getPrefixIndex(c1->className());
+ p2=getPrefixIndex(c2->className());
+ }
+ return stricmp(c1->className().data()+p1,
+ c2->className().data()+p2);
+}
+
+int ClassList::compareItems(GCI item1, GCI item2)
+{
+ return compItems(item1,item2);
}
int ClassSDict::compareItems(GCI item1, GCI item2)
{
- ClassDef *c1=(ClassDef *)item1;
- ClassDef *c2=(ClassDef *)item2;
- //return stricmp(c1->localName().data()+getPrefixIndex(c1->localName()),
- // c2->localName().data()+getPrefixIndex(c2->localName())
- // );
- return stricmp(c1->className().data()+getPrefixIndex(c1->className()),
- c2->className().data()+getPrefixIndex(c2->className()));
+ return compItems(item1,item2);
}
ClassListIterator::ClassListIterator(const ClassList &cllist) :
diff --git a/src/code.l b/src/code.l
index 44f5d21..2f3b501 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1074,7 +1074,7 @@ static int yyread(char *buf,int max_size)
B [ \t]
BN [ \t\n\r]
-ID [a-z_A-Z][a-z_A-Z0-9]*
+ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
@@ -1543,7 +1543,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext);
endFontClass();
}
-<Body>"this->" { g_code->codify(yytext); }
+<Body>"$"?"this->" { g_code->codify(yytext); }
<Body>"."|"->" {
g_code->codify(yytext);
g_memCallContext = YY_START;
diff --git a/src/config.l b/src/config.l
index 7b097f6..3e11d90 100644
--- a/src/config.l
+++ b/src/config.l
@@ -897,33 +897,40 @@ void Config::check()
// expand the relative stripFromPath values
QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH");
char *sfp = stripFromPath.first();
- while (sfp)
+ if (sfp==0) // by default use the current path
{
- register char *p = sfp;
- if (p)
+ stripFromPath.append(QDir::currentDirPath()+"/");
+ }
+ else
+ {
+ while (sfp)
{
- char c;
- while ((c=*p))
+ register char *p = sfp;
+ if (p)
{
- if (c=='\\') *p='/';
- p++;
+ char c;
+ while ((c=*p))
+ {
+ if (c=='\\') *p='/';
+ p++;
+ }
}
- }
- QCString path = sfp;
- if (path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':'))
- {
- QFileInfo fi(path);
- if (fi.exists() && fi.isDir())
+ QCString path = sfp;
+ if (path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':'))
{
- int i = stripFromPath.at();
- stripFromPath.remove();
- if (stripFromPath.at()==i) // did not remove last item
- stripFromPath.insert(i,fi.absFilePath()+"/");
- else
- stripFromPath.append(fi.absFilePath()+"/");
+ QFileInfo fi(path);
+ if (fi.exists() && fi.isDir())
+ {
+ int i = stripFromPath.at();
+ stripFromPath.remove();
+ if (stripFromPath.at()==i) // did not remove last item
+ stripFromPath.insert(i,fi.absFilePath()+"/");
+ else
+ stripFromPath.append(fi.absFilePath()+"/");
+ }
}
+ sfp = stripFromPath.next();
}
- sfp = stripFromPath.next();
}
@@ -1475,7 +1482,9 @@ void Config::create()
"If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n"
"can be used to strip a user-defined part of the path. Stripping is \n"
"only done if one of the specified strings matches the left-hand part of \n"
- "the path. It is allowed to use relative paths in the argument list.\n"
+ "the path. It is allowed to use relative paths in the argument list. \n"
+ "If left blank the directory from which doxygen is run is used as the \n"
+ "path to strip. \n"
);
cl->addDependency("FULL_PATH_NAMES");
cb = addBool(
@@ -1683,6 +1692,18 @@ void Config::create()
FALSE
);
cb = addBool(
+ "SORT_BY_SCOPE_NAME",
+ "If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n"
+ "sorted by fully-qualified names, including namespaces. If set to \n"
+ "NO (the default), the class list will be sorted only by class name, \n"
+ "not including the namespace part. \n"
+ "Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n"
+ "Note: This option applies only to the class list, not to the \n"
+ "alphabetical list.\n",
+ FALSE
+ );
+
+ cb = addBool(
"GENERATE_TODOLIST",
"The GENERATE_TODOLIST tag can be used to enable (YES) or \n"
"disable (NO) the todo list. This list is created by putting \\todo \n"
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 8bc853e..80bea8d 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -699,7 +699,8 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
Definition *compound=0;
MemberDef *member=0;
QString name = linkToText(g_token->name,TRUE);
- if (resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member))
+ if (!g_insideHtmlLink &&
+ resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member))
{
//printf("resolveRef %s = %p (linkable?=%d)\n",g_token->name.data(),member,member->isLinkable());
if (member) // member link
@@ -3998,7 +3999,11 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
}
else if (opt->name=="href") // <a href=url>..</a> tag
{
- DocHRef *href = new DocHRef(this,opt->value);
+ // copy attributes
+ HtmlAttribList attrList = tagHtmlAttribs;
+ // and remove the href attribute
+ attrList.remove(opt);
+ DocHRef *href = new DocHRef(this,attrList,opt->value);
m_children.append(href);
g_insideHtmlLink=TRUE;
retval = href->parse();
diff --git a/src/docparser.h b/src/docparser.h
index d4c20f6..8742ed5 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -691,16 +691,18 @@ class DocLanguage : public CompAccept<DocLanguage>, public DocNode
class DocHRef : public CompAccept<DocHRef>, public DocNode
{
public:
- DocHRef(DocNode *parent,const QString &url) :
- m_parent(parent), m_url(url) {}
+ DocHRef(DocNode *parent,const HtmlAttribList &attribs,const QString &url) :
+ m_parent(parent), m_attribs(attribs), m_url(url) {}
int parse();
QString url() const { return m_url; }
Kind kind() const { return Kind_HRef; }
DocNode *parent() const { return m_parent; }
void accept(DocVisitor *v) { CompAccept<DocHRef>::accept(this,v); }
+ const HtmlAttribList &attribs() const { return m_attribs; }
private:
DocNode * m_parent;
+ HtmlAttribList m_attribs;
QString m_url;
};
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 872517a..640ce0f 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -117,6 +117,7 @@ double Doxygen::sysElapsedTime = 0.0;
QTime Doxygen::runningTime;
SearchIndex * Doxygen::searchIndex=0;
SDict<DefinitionList> *Doxygen::symbolMap;
+bool Doxygen::outputToWizard=FALSE;
static StringList inputFiles;
static StringDict excludeNameDict(1009); // sections
@@ -7039,9 +7040,12 @@ static int readDir(QFileInfo *fi,
if (exclDict==0 || exclDict->find(cfi->absFilePath())==0)
{ // file should not be excluded
//printf("killDict->find(%s)\n",cfi->absFilePath().data());
- if ((!cfi->exists() || !cfi->isReadable()) && errorIfNotExist)
+ if (!cfi->exists() || !cfi->isReadable())
{
- err("Error: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
+ if (errorIfNotExist)
+ {
+ err("Error: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
+ }
}
else if (cfi->isFile() &&
(!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
@@ -7159,9 +7163,12 @@ static int readFileOrDirectory(const char *s,
{
if (exclDict==0 || exclDict->find(fi.absFilePath())==0)
{
- if ((!fi.exists() || !fi.isReadable()) && errorIfNotExist)
+ if (!fi.exists() || !fi.isReadable())
{
- err("Error: source %s is not a readable file or directory... skipping.\n",s);
+ if (errorIfNotExist)
+ {
+ err("Error: source %s is not a readable file or directory... skipping.\n",s);
+ }
}
else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink())
{
@@ -7542,6 +7549,7 @@ void readConfiguration(int argc, char **argv)
break;
case 'b':
setvbuf(stdout,NULL,_IONBF,0);
+ Doxygen::outputToWizard=TRUE;
break;
case 'h':
case '?':
diff --git a/src/doxygen.h b/src/doxygen.h
index 48c9154..f593470 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -100,6 +100,7 @@ class Doxygen
static QTime runningTime;
static SearchIndex *searchIndex;
static SDict<DefinitionList> *symbolMap;
+ static bool outputToWizard;
};
void initDoxygen();
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 10851a1..c8e3839 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -38,8 +38,9 @@ class DevNullCodeDocInterface : public BaseCodeDocInterface
{
public:
virtual void codify(const char *) {}
- virtual void writeCodeLink(const char *,const char *,
- const char *,const char *) {}
+ virtual void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name)
+ { ref=ref; file=file; anchor=anchor; name=name; }
virtual void writeLineNumber(const char *,const char *,
const char *,int) {}
virtual void startCodeLine() {}
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 287831e..03ca662 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -660,7 +660,8 @@ void HtmlDocVisitor::visitPost(DocInternal *)
void HtmlDocVisitor::visitPre(DocHRef *href)
{
if (m_hide) return;
- m_t << "<a href=\"" << href->url() << "\">";
+ m_t << "<a href=\"" << href->url() << "\""
+ << htmlAttribsToString(href->attribs()) << ">";
}
void HtmlDocVisitor::visitPost(DocHRef *)
diff --git a/src/index.cpp b/src/index.cpp
index 9a4966b..fa080ac 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -3018,6 +3018,16 @@ void writeGroupIndex(OutputList &ol)
//----------------------------------------------------------------------------
+static bool mainPageHasTitle()
+{
+ if (Doxygen::mainPage==0) return FALSE;
+ if (Doxygen::mainPage->title().isEmpty()) return FALSE;
+ if (Doxygen::mainPage->title().lower()=="notitle") return FALSE;
+ return TRUE;
+}
+
+//----------------------------------------------------------------------------
+
void writeIndex(OutputList &ol)
{
// save old generator state
@@ -3040,11 +3050,11 @@ void writeIndex(OutputList &ol)
Doxygen::mainPage ? Doxygen::mainPage->getDefLine() : 1;
QCString title;
- if (!Doxygen::mainPage || Doxygen::mainPage->title().isEmpty())
+ if (!mainPageHasTitle())
{
title = theTranslator->trMainPage();
}
- else if (Doxygen::mainPage)
+ else
{
title = substitute(Doxygen::mainPage->title(),"%","");
}
@@ -3149,7 +3159,7 @@ void writeIndex(OutputList &ol)
if (Doxygen::mainPage)
{
ol.startIndexSection(isMainPage);
- if (!Doxygen::mainPage->title().isEmpty())
+ if (mainPageHasTitle())
{
ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Doxygen::mainPage->title(),FALSE,FALSE);
}
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 16998c9..17fc3cc 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -294,7 +294,7 @@ void LatexDocVisitor::visit(DocVerbatim *s)
void LatexDocVisitor::visit(DocAnchor *anc)
{
if (m_hide) return;
- m_t << "\\label{" << anc->anchor() << "}" << endl;
+ m_t << "\\label{" << anc->file() << "_" << anc->anchor() << "}" << endl;
if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
{
m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
@@ -526,7 +526,7 @@ void LatexDocVisitor::visitPre(DocSection *s)
}
m_t << "\\" << getSectionName(s->level()) << "{";
filter(s->title());
- m_t << "}\\label{" << s->anchor() << "}" << endl;
+ m_t << "}\\label{" << s->file() << "_" << s->anchor() << "}" << endl;
}
void LatexDocVisitor::visitPost(DocSection *)
@@ -810,7 +810,7 @@ void LatexDocVisitor::visitPre(DocSecRefItem *)
void LatexDocVisitor::visitPost(DocSecRefItem *ref)
{
if (m_hide) return;
- m_t << "}{\\ref{" << ref->anchor() << "}}{}" << endl;
+ m_t << "}{\\ref{" << ref->file() << "_" << ref->anchor() << "}}{}" << endl;
}
void LatexDocVisitor::visitPre(DocSecRefList *)
@@ -976,7 +976,8 @@ void LatexDocVisitor::endLink(const QString &ref,const QString &file,const QStri
m_t << "}";
if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS"))
{
- m_t << "{\\rm ("; filter(theTranslator->trPageAbbreviation());
+ m_t << "{\\rm (";
+ filter(theTranslator->trPageAbbreviation());
m_t << "\\,\\pageref{" << file;
if (!anchor.isEmpty()) m_t << "_" << anchor;
m_t << "})}";
diff --git a/src/message.cpp b/src/message.cpp
index e049523..8f85b8c 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -113,7 +113,7 @@ void msg(const char *fmt, ...)
static void do_warn(const char *tag, const char *file, int line, const char *fmt, va_list args)
{
if (!Config_getBool(tag)) return; // warning type disabled
- char text[4096];
+ char text[40960];
vsprintf(text, fmt, args);
if (file==0) file="<unknown>";
switch(warnFormatOrder)
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
index 5ea69f2..1629a52 100644
--- a/src/outputlist.cpp
+++ b/src/outputlist.cpp
@@ -36,64 +36,17 @@ OutputList::OutputList(bool)
outputs->setAutoDelete(TRUE);
}
-//OutputList::OutputList(const OutputList *olist)
-//{
-// //printf("OutputList::OutputList() deep copy\n");
-// outputs = new QList<OutputGenerator>;
-// outputs->setAutoDelete(TRUE);
-//
-// QList<OutputGenerator> *ol=olist->outputs;
-// OutputGenerator *og=ol->first();
-// while (og)
-// {
-// OutputGenerator *ogc=og->copy();
-// outputs->append(ogc);
-// if (og->isEnabled()) ogc->enable(); else ogc->disable();
-// og=ol->next();
-// }
-// //printf("OutputList::OutputList dst=%d res=%d\n",ol->count(),outputs->count());
-//}
-
OutputList::~OutputList()
{
//printf("OutputList::~OutputList()\n");
delete outputs;
}
-//OutputList &OutputList::operator=(const OutputList &olist)
-//{
-// if (this!=&olist)
-// {
-// QList<OutputGenerator> *ol=olist.outputs;
-// OutputGenerator *ogsrc=ol->first();
-// OutputGenerator *ogdst=outputs->first();
-// //printf("OutputList::operator= src=%d dst=%d\n",outputs->count(),ol->count());
-// while (ogdst)
-// {
-// ogdst=ogsrc->copy();
-// ogsrc=ol->next();
-// ogdst=outputs->next();
-// }
-// }
-// return *this;
-//}
-
void OutputList::add(const OutputGenerator *og)
{
if (og) outputs->append(og);
}
-//HtmlGenerator *OutputList::getHtmlGenerator()
-//{
-// OutputGenerator *og=outputs->first();
-// while (og)
-// {
-// if (og->get(OutputGenerator::Html)) return (HtmlGenerator *)og;
-// og=outputs->next();
-// }
-// return 0; // should not happen!
-//}
-
void OutputList::disableAllBut(OutputGenerator::OutputType o)
{
OutputGenerator *og=outputs->first();
@@ -156,21 +109,6 @@ bool OutputList::isEnabled(OutputGenerator::OutputType o)
return result;
}
-//OutputList &OutputList::operator+=(const OutputList &outputList)
-//{
-// OutputList *ol=(OutputList *)&outputList;
-// OutputGenerator *ogsrc=ol->outputs->first();
-// OutputGenerator *ogdst=outputs->first();
-// //printf("OutputList::operator+= src=%d dst=%d\n",outputs->count(),ol->outputs->count());
-// while (ogdst && ogsrc)
-// {
-// ogdst->append(ogsrc);
-// ogsrc=ol->outputs->next();
-// ogdst=outputs->next();
-// }
-// return *this;
-//}
-
void OutputList::pushGeneratorState()
{
OutputGenerator *og=outputs->first();
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index fedb290..8072a53 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -1921,7 +1921,7 @@ void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
GroupDef *sgd;
for (gli.toFirst();(sgd=gli.current());++gli)
m_output.openHash()
- .addFieldQuotedString("title", gd->groupTitle())
+ .addFieldQuotedString("title", sgd->groupTitle())
.closeHash();
m_output.closeList();
}
diff --git a/src/scanner.l b/src/scanner.l
index e4ac633..beb2ac6 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -500,12 +500,85 @@ static bool checkForKnRstyleC()
return TRUE;
}
+static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
+{
+ int si = current->args.length();
+ if (oldStyleArgType.isEmpty()) // new argument
+ {
+ static QRegExp re("([^)]*)");
+ int bi1 = current->args.findRev(re);
+ int bi2 = bi1!=-1 ? current->args.findRev(re,bi1-1) : -1;
+ char c;
+ if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)"
+ {
+ int s=bi2+1;
+ oldStyleArgType = current->args.left(s);
+ int i=s;
+ while (i<si && ((c=current->args.at(i))=='*' || isspace(c))) i++;
+ oldStyleArgType += current->args.mid(s,i-s);
+ s=i;
+ while (i<si && isId(current->args.at(i))) i++;
+ oldStyleArgName = current->args.mid(s,i-s);
+ oldStyleArgType+=current->args.mid(i);
+ }
+ else if (bi1!=-1) // redundant braces like in "int (*var)"
+ {
+ int s=bi1;
+ oldStyleArgType = current->args.left(s);
+ s++;
+ int i=s+1;
+ while (i<si && ((c=current->args.at(i))=='*' || isspace(c))) i++;
+ oldStyleArgType += current->args.mid(s,i-s);
+ s=i;
+ while (i<si && isId(current->args.at(i))) i++;
+ oldStyleArgName = current->args.mid(s,i-s);
+ }
+ else // normal "int *var"
+ {
+ int l=si,i=l-1,j;
+ char c;
+ // look for start of name in "type *name"
+ while (i>=0 && isId(current->args.at(i))) i--;
+ j=i+1;
+ // look for start of *'s
+ while (i>=0 && ((c=current->args.at(i))=='*' || isspace(c))) i--;
+ i++;
+ if (i!=l)
+ {
+ oldStyleArgType=current->args.left(i);
+ oldStyleArgPtr=current->args.mid(i,j-i);
+ oldStyleArgName=current->args.mid(j).stripWhiteSpace();
+ }
+ else
+ {
+ oldStyleArgName=current->args.copy().stripWhiteSpace();
+ }
+ }
+ }
+ else // continuation like *arg2 in "int *args,*arg2"
+ {
+ int l=si,j=0;
+ char c;
+ while (j<l && ((c=current->args.at(j))=='*' || isspace(c))) j++;
+ if (j>0)
+ {
+ oldStyleArgPtr=current->args.left(j);
+ oldStyleArgName=current->args.mid(j).stripWhiteSpace();
+ }
+ else
+ {
+ oldStyleArgName=current->args.copy().stripWhiteSpace();
+ }
+ }
+ //fprintf(stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data());
+}
+
/*! Update the argument \a name with additional \a type info. For K&R style
* function the type is found \e after the argument list, so this routine
* in needed to fix up.
*/
-void addKnRArgInfo(const QCString &type,const QCString &name,
- const QCString &brief,const QCString &docs)
+static void addKnRArgInfo(const QCString &type,const QCString &name,
+ const QCString &brief,const QCString &docs)
{
if (current->argList==0) return;
ArgumentListIterator ali(*current->argList);
@@ -564,7 +637,7 @@ BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
FILEECHAR [a-z_A-Z0-9\-\+]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"")
-ID [a-z_A-Z][a-z_A-Z0-9]*
+ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
@@ -2850,7 +2923,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<FuncQual>{ID} { // typically a K&R style C function
if (checkForKnRstyleC())
{
- fprintf(stderr,"===> got a K&R style function\n");
+ //fprintf(stderr,"===> got a K&R style function\n");
current->args = yytext;
oldStyleArgType.resize(0);
BEGIN(OldStyleArgs);
@@ -2863,41 +2936,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<OldStyleArgs>[,;] {
QCString oldStyleArgPtr;
QCString oldStyleArgName;
- if (oldStyleArgType.isEmpty())
- {
- int l=current->args.length(),i=l-1,j;
- char c;
- while (i>=0 && isId(current->args.at(i))) i--;
- j=i+1;
- while (i>=0 && ((c=current->args.at(i))=='*' || isspace(c))) i--;
- i++;
- if (i!=l)
- {
- oldStyleArgType=current->args.left(i);
- oldStyleArgPtr=current->args.mid(i,j-i);
- oldStyleArgName=current->args.mid(j).stripWhiteSpace();
- }
- else
- {
- oldStyleArgName=current->args.copy().stripWhiteSpace();
- }
- }
- else
- {
- int l=current->args.length(),j=0;
- char c;
- while (j<l && ((c=current->args.at(j))=='*' || isspace(c))) j++;
- if (j>0)
- {
- oldStyleArgPtr=current->args.left(j);
- oldStyleArgName=current->args.mid(j).stripWhiteSpace();
- }
- else
- {
- oldStyleArgName=current->args.copy().stripWhiteSpace();
- }
- }
- fprintf(stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data());
+ splitKnRArg(oldStyleArgPtr,oldStyleArgName);
QCString doc,brief;
if (current->doc!=docBackup)
{
@@ -2909,7 +2948,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
brief=current->brief.copy();
current->brief=briefBackup;
}
- addKnRArgInfo(oldStyleArgType+oldStyleArgPtr,oldStyleArgName,brief,doc);
+ addKnRArgInfo(oldStyleArgType+oldStyleArgPtr,
+ oldStyleArgName,brief,doc);
current->args.resize(0);
if (*yytext==';') oldStyleArgType.resize(0);
}
@@ -4404,7 +4444,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
}
<SkipVerbatim><<EOF>> {
warn(yyFileName,yyLineNr,
- "Warning: reached end of file while inside a @%s block; check for missing @end%s!",g_skipBlockName.data(),g_skipBlockName.data()
+ "Warning: reached end of file while inside a @%s block; check for missing @end%s tag!",g_skipBlockName.data(),g_skipBlockName.data()
);
yyterminate();
}
@@ -4452,7 +4492,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
}
<SkipCode><<EOF>> {
warn(yyFileName,yyLineNr,
- "Warning: reached end of file while inside a %s block; check for missing end tag!",
+ "Warning: reached end of file while inside a @%s block; check for missing @end%s tag!",
+ g_skipBlockName.data(),
g_skipBlockName.data()
);
yyterminate();
diff --git a/src/util.cpp b/src/util.cpp
index 94180f2..ff0ec8d 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -847,15 +847,53 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item,
Definition *newScope = followPath(scope,fileScope,explicitScopePart);
if (newScope) // explicitScope is inside scope => newScope is the result
{
- //printf("scope traversal successful!\n");
+ //printf("scope traversal successful %s<->%s!\n",item->getOuterScope()->name().data(),newScope->name().data());
if (item->getOuterScope()==newScope)
{
//printf("> found it\n");
}
else
{
- // repeat for the parent scope
int i=-1;
+ if (newScope->definitionType()==Definition::TypeNamespace)
+ {
+ // this part deals with the case where item is a class
+ // A::B::C but is explicit referenced as A::C, where B is imported
+ // in A via a using directive.
+ //printf("newScope is a namespace: %s!\n",newScope->name().data());
+ NamespaceDef *nscope = (NamespaceDef*)newScope;
+ ClassSDict *cl = nscope->getUsedClasses();
+ if (cl)
+ {
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ i = isAccessibleFrom(scope,fileScope,item,cd->name());
+ if (i!=-1)
+ {
+ //printf("> found via explicit scope of used class\n");
+ goto done;
+ }
+ }
+ }
+ NamespaceSDict *nl = nscope->getUsedNamespaces();
+ if (nl)
+ {
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ i = isAccessibleFrom(scope,fileScope,item,nd->name());
+ if (i!=-1)
+ {
+ //printf("> found via explicit scope of used namespace\n");
+ goto done;
+ }
+ }
+ }
+ }
+ // repeat for the parent scope
if (scope!=Doxygen::globalScope)
{
i = isAccessibleFrom(scope->getOuterScope(),fileScope,item,explicitScopePart);
@@ -1381,17 +1419,24 @@ QCString argListToString(ArgumentList *al)
result+="(";
while (a)
{
+ QCString type1 = a->type, type2;
+ int i=type1.find(")("); // hack to deal with function pointers
+ if (i!=-1)
+ {
+ type2=type1.mid(i);
+ type1=type1.left(i);
+ }
if (!a->attrib.isEmpty())
{
result+=a->attrib+" ";
}
if (!a->name.isEmpty() || !a->array.isEmpty())
{
- result+= a->type+" "+a->name+a->array;
+ result+= type1+" "+a->name+type2+a->array;
}
else
{
- result+= a->type;
+ result+= type1+type2;
}
if (!a->defval.isEmpty())
{
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 5f014ec..f28bf7a 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -1467,8 +1467,16 @@ static void generateXMLForPage(PageDef *pd,QTextStream &ti,bool isExample)
t << " <title>" << convertToXML(si->title) << "</title>" << endl;
}
t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
- pd->documentation()+"\n\\include "+pd->name());
+ if (isExample)
+ {
+ writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+ pd->documentation()+"\n\\include "+pd->name());
+ }
+ else
+ {
+ writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+ pd->documentation());
+ }
t << " </detaileddescription>" << endl;
t << " </compounddef>" << endl;