Commit c7d553e7 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.3.5-20040125

parent ee63f0e0
# Doxyfile 1.2.12-20011209 # Doxyfile 1.3.5
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# General configuration options # Project related configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
PROJECT_NAME = Doxygen PROJECT_NAME = Doxygen
PROJECT_NUMBER = PROJECT_NUMBER =
OUTPUT_DIRECTORY = doxygen_docs OUTPUT_DIRECTORY = doxygen_docs
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
EXTRACT_ALL = YES USE_WINDOWS_ENCODING = NO
EXTRACT_PRIVATE = NO
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
BRIEF_MEMBER_DESC = YES BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES REPEAT_BRIEF = YES
ABBREVIATE_BRIEF =
ALWAYS_DETAILED_SEC = NO ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES FULL_PATH_NAMES = YES
STRIP_FROM_PATH = $(PWD)/ STRIP_FROM_PATH = $(PWD)/
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
MULTILINE_CPP_IS_BRIEF = NO
DETAILS_AT_TOP = NO
INHERIT_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO
TAB_SIZE = 8
ALIASES =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
SUBGROUPING = YES
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = YES
EXTRACT_PRIVATE = NO
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO INTERNAL_DOCS = NO
STRIP_CODE_COMMENTS = YES
CASE_SENSE_NAMES = NO CASE_SENSE_NAMES = NO
SHORT_NAMES = NO
HIDE_SCOPE_NAMES = NO HIDE_SCOPE_NAMES = NO
VERBATIM_HEADERS = YES
SHOW_INCLUDE_FILES = YES SHOW_INCLUDE_FILES = YES
JAVADOC_AUTOBRIEF = YES
INHERIT_DOCS = YES
INLINE_INFO = YES INLINE_INFO = YES
SORT_MEMBER_DOCS = YES SORT_MEMBER_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO SORT_BRIEF_DOCS = NO
TAB_SIZE = 8
GENERATE_TODOLIST = YES GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES GENERATE_BUGLIST = YES
ALIASES = GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS = ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30 MAX_INITIALIZER_LINES = 30
OPTIMIZE_OUTPUT_FOR_C = NO
SHOW_USED_FILES = YES SHOW_USED_FILES = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to warning and progress messages # configuration options related to warning and progress messages
...@@ -46,6 +57,7 @@ SHOW_USED_FILES = YES ...@@ -46,6 +57,7 @@ SHOW_USED_FILES = YES
QUIET = NO QUIET = NO
WARNINGS = YES WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_FORMAT = "$file:$line: $text" WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE = WARN_LOGFILE =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -65,7 +77,7 @@ EXCLUDE = src/code.cpp \ ...@@ -65,7 +77,7 @@ EXCLUDE = src/code.cpp \
src/pre.cpp \ src/pre.cpp \
src/scanner.cpp \ src/scanner.cpp \
src/tag.cpp \ src/tag.cpp \
src/doctokenizer.cpp \ src/doctokenizer.cpp \
src/logos.cpp \ src/logos.cpp \
src/doxysearch.cpp \ src/doxysearch.cpp \
src/suffixtree.cpp \ src/suffixtree.cpp \
...@@ -73,6 +85,7 @@ EXCLUDE = src/code.cpp \ ...@@ -73,6 +85,7 @@ EXCLUDE = src/code.cpp \
src/searchindex.cpp \ src/searchindex.cpp \
src/searchindex.h \ src/searchindex.h \
src/commentcnv.cpp src/commentcnv.cpp
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS = EXCLUDE_PATTERNS =
EXAMPLE_PATH = EXAMPLE_PATH =
EXAMPLE_PATTERNS = EXAMPLE_PATTERNS =
...@@ -85,8 +98,10 @@ FILTER_SOURCE_FILES = NO ...@@ -85,8 +98,10 @@ FILTER_SOURCE_FILES = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
SOURCE_BROWSER = YES SOURCE_BROWSER = YES
INLINE_SOURCES = NO INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES REFERENCES_RELATION = YES
VERBATIM_HEADERS = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the alphabetical class index # configuration options related to the alphabetical class index
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -98,11 +113,14 @@ IGNORE_PREFIX = ...@@ -98,11 +113,14 @@ IGNORE_PREFIX =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_HTML = YES GENERATE_HTML = YES
HTML_OUTPUT = HTML_OUTPUT =
HTML_FILE_EXTENSION = .html
HTML_HEADER = HTML_HEADER =
HTML_FOOTER = HTML_FOOTER =
HTML_STYLESHEET = HTML_STYLESHEET =
HTML_ALIGN_MEMBERS = YES HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO GENERATE_CHI = NO
BINARY_TOC = NO BINARY_TOC = NO
TOC_EXPAND = NO TOC_EXPAND = NO
...@@ -115,6 +133,8 @@ TREEVIEW_WIDTH = 250 ...@@ -115,6 +133,8 @@ TREEVIEW_WIDTH = 250
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_LATEX = NO GENERATE_LATEX = NO
LATEX_OUTPUT = LATEX_OUTPUT =
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO COMPACT_LATEX = NO
PAPER_TYPE = a4wide PAPER_TYPE = a4wide
EXTRA_PACKAGES = EXTRA_PACKAGES =
...@@ -122,6 +142,7 @@ LATEX_HEADER = ...@@ -122,6 +142,7 @@ LATEX_HEADER =
PDF_HYPERLINKS = YES PDF_HYPERLINKS = YES
USE_PDFLATEX = NO USE_PDFLATEX = NO
LATEX_BATCHMODE = NO LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the RTF output # configuration options related to the RTF output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
...@@ -142,11 +163,22 @@ MAN_LINKS = NO ...@@ -142,11 +163,22 @@ MAN_LINKS = NO
# configuration options related to the XML output # configuration options related to the XML output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_XML = YES GENERATE_XML = YES
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output # configuration options for the AutoGen Definitions output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO GENERATE_AUTOGEN_DEF = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor # Configuration options related to the preprocessor
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES ENABLE_PREPROCESSING = YES
...@@ -159,32 +191,36 @@ PREDEFINED = ...@@ -159,32 +191,36 @@ PREDEFINED =
EXPAND_AS_DEFINED = EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES SKIP_FUNCTION_MACROS = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration::addtions related to external references # Configuration::additions related to external references
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
TAGFILES = qtools_docs/qtools.tag=../../qtools_docs/html TAGFILES = qtools_docs/qtools.tag=../../qtools_docs/html
GENERATE_TAGFILE = GENERATE_TAGFILE =
ALLEXTERNALS = NO ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl PERL_PATH = /usr/bin/perl
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the dot tool # Configuration options related to the dot tool
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO CLASS_DIAGRAMS = NO
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO HAVE_DOT = NO
CLASS_GRAPH = YES CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES COLLABORATION_GRAPH = YES
UML_LOOK = NO
TEMPLATE_RELATIONS = YES TEMPLATE_RELATIONS = YES
HIDE_UNDOC_RELATIONS = YES
INCLUDE_GRAPH = YES INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = NO INCLUDED_BY_GRAPH = NO
CALL_GRAPH = NO
GRAPHICAL_HIERARCHY = YES GRAPHICAL_HIERARCHY = YES
DOT_IMAGE_FORMAT = png DOT_IMAGE_FORMAT = png
DOT_PATH = DOT_PATH =
DOTFILE_DIRS = DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_WIDTH = 1024
MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_HEIGHT = 1024
MAX_DOT_GRAPH_DEPTH = 0
GENERATE_LEGEND = YES GENERATE_LEGEND = YES
DOT_CLEANUP = YES DOT_CLEANUP = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration::addtions related to the search engine # Configuration::additions related to the search engine
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
SEARCHENGINE = YES SEARCHENGINE = YES
DOXYGEN Version 1.3.5-20040105 DOXYGEN Version 1.3.5-20040125
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (05 January 2004) Dimitri van Heesch (25 January 2004)
DOXYGEN Version 1.3.5_20040105 DOXYGEN Version 1.3.5_20040125
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (05 January 2004) Dimitri van Heesch (dimitri@stack.nl) (25 January 2004)
1.3.5-20040105 1.3.5-20040125
...@@ -52,6 +52,9 @@ ...@@ -52,6 +52,9 @@
class \c A has a member variable \c m_a of type class \c B, then class \c A has a member variable \c m_a of type class \c B, then
\c A has an arrow to \c B with \c m_a as label). \c A has an arrow to \c B with \c m_a as label).
</ul> </ul>
<li>if \ref cfg_call_graph "CALL_GRAPH" is set to YES, a
graphical call graph is drawn for each function showing the
functions that the function directly or indirectly calls.
</ul> </ul>
The elements in the class diagrams in HTML and RTF The elements in the class diagrams in HTML and RTF
......
...@@ -302,6 +302,8 @@ class ClassDef : public Definition ...@@ -302,6 +302,8 @@ class ClassDef : public Definition
* \param fName the file name as found in the tag file. * \param fName the file name as found in the tag file.
* This overwrites the file that doxygen normally * This overwrites the file that doxygen normally
* generates based on the compound type & name. * 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, ClassDef(const char *fileName,int startLine,
const char *name,CompoundType ct, const char *name,CompoundType ct,
......
...@@ -30,26 +30,29 @@ ClassList::~ClassList() ...@@ -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 *c1=(ClassDef *)item1;
ClassDef *c2=(ClassDef *)item2; ClassDef *c2=(ClassDef *)item2;
//return stricmp(c1->localName().data()+getPrefixIndex(c1->localName()), int p1=0,p2=0;
// c2->localName().data()+getPrefixIndex(c2->localName()) static bool b = Config_getBool("SORT_BY_SCOPE_NAME");
// ); if (!b)
return stricmp(c1->className().data()+getPrefixIndex(c1->className()), {
c2->className().data()+getPrefixIndex(c2->className())); 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) int ClassSDict::compareItems(GCI item1, GCI item2)
{ {
ClassDef *c1=(ClassDef *)item1; return compItems(item1,item2);
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()));
} }
ClassListIterator::ClassListIterator(const ClassList &cllist) : ClassListIterator::ClassListIterator(const ClassList &cllist) :
......
...@@ -1074,7 +1074,7 @@ static int yyread(char *buf,int max_size) ...@@ -1074,7 +1074,7 @@ static int yyread(char *buf,int max_size)
B [ \t] B [ \t]
BN [ \t\n\r] 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}) SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID}) SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
...@@ -1543,7 +1543,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1543,7 +1543,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext); g_code->codify(yytext);
endFontClass(); endFontClass();
} }
<Body>"this->" { g_code->codify(yytext); } <Body>"$"?"this->" { g_code->codify(yytext); }
<Body>"."|"->" { <Body>"."|"->" {
g_code->codify(yytext); g_code->codify(yytext);
g_memCallContext = YY_START; g_memCallContext = YY_START;
......
...@@ -897,33 +897,40 @@ void Config::check() ...@@ -897,33 +897,40 @@ void Config::check()
// expand the relative stripFromPath values // expand the relative stripFromPath values
QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH"); QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH");
char *sfp = stripFromPath.first(); char *sfp = stripFromPath.first();
while (sfp) if (sfp==0) // by default use the current path
{ {
register char *p = sfp; stripFromPath.append(QDir::currentDirPath()+"/");
if (p) }
else
{
while (sfp)
{ {
char c; register char *p = sfp;
while ((c=*p)) if (p)
{ {
if (c=='\\') *p='/'; char c;
p++; while ((c=*p))
{
if (c=='\\') *p='/';
p++;
}
} }
} QCString path = sfp;
QCString path = sfp; if (path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':'))
if (path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':'))
{
QFileInfo fi(path);
if (fi.exists() && fi.isDir())
{ {
int i = stripFromPath.at(); QFileInfo fi(path);
stripFromPath.remove(); if (fi.exists() && fi.isDir())
if (stripFromPath.at()==i) // did not remove last item {
stripFromPath.insert(i,fi.absFilePath()+"/"); int i = stripFromPath.at();
else stripFromPath.remove();
stripFromPath.append(fi.absFilePath()+"/"); 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() ...@@ -1475,7 +1482,9 @@ void Config::create()
"If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n" "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" "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" "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"); cl->addDependency("FULL_PATH_NAMES");
cb = addBool( cb = addBool(
...@@ -1682,6 +1691,18 @@ void Config::create() ...@@ -1682,6 +1691,18 @@ void Config::create()
"declaration order. \n", "declaration order. \n",
FALSE 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( cb = addBool(
"GENERATE_TODOLIST", "GENERATE_TODOLIST",
"The GENERATE_TODOLIST tag can be used to enable (YES) or \n" "The GENERATE_TODOLIST tag can be used to enable (YES) or \n"
......
...@@ -699,7 +699,8 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children) ...@@ -699,7 +699,8 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
Definition *compound=0; Definition *compound=0;
MemberDef *member=0; MemberDef *member=0;
QString name = linkToText(g_token->name,TRUE); 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()); //printf("resolveRef %s = %p (linkable?=%d)\n",g_token->name.data(),member,member->isLinkable());
if (member) // member link if (member) // member link
...@@ -3998,7 +3999,11 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag ...@@ -3998,7 +3999,11 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
} }
else if (opt->name=="href") // <a href=url>..</a> 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); m_children.append(href);
g_insideHtmlLink=TRUE; g_insideHtmlLink=TRUE;
retval = href->parse(); retval = href->parse();
......
...@@ -691,16 +691,18 @@ class DocLanguage : public CompAccept<DocLanguage>, public DocNode ...@@ -691,16 +691,18 @@ class DocLanguage : public CompAccept<DocLanguage>, public DocNode
class DocHRef : public CompAccept<DocHRef>, public DocNode class DocHRef : public CompAccept<DocHRef>, public DocNode
{ {
public: public:
DocHRef(DocNode *parent,const QString &url) : DocHRef(DocNode *parent,const HtmlAttribList &attribs,const QString &url) :
m_parent(parent), m_url(url) {} m_parent(parent), m_attribs(attribs), m_url(url) {}
int parse(); int parse();
QString url() const { return m_url; } QString url() const { return m_url; }
Kind kind() const { return Kind_HRef; } Kind kind() const { return Kind_HRef; }
DocNode *parent() const { return m_parent; } DocNode *parent() const { return m_parent; }
void accept(DocVisitor *v) { CompAccept<DocHRef>::accept(this,v); } void accept(DocVisitor *v) { CompAccept<DocHRef>::accept(this,v); }
const HtmlAttribList &attribs() const { return m_attribs; }
private: private:
DocNode * m_parent; DocNode * m_parent;
HtmlAttribList m_attribs;
QString m_url; QString m_url;
}; };
......
...@@ -117,6 +117,7 @@ double Doxygen::sysElapsedTime = 0.0; ...@@ -117,6 +117,7 @@ double Doxygen::sysElapsedTime = 0.0;
QTime Doxygen::runningTime; QTime Doxygen::runningTime;
SearchIndex * Doxygen::searchIndex=0; SearchIndex * Doxygen::searchIndex=0;
SDict<DefinitionList> *Doxygen::symbolMap; SDict<DefinitionList> *Doxygen::symbolMap;
bool Doxygen::outputToWizard=FALSE;
static StringList inputFiles; static StringList inputFiles;
static StringDict excludeNameDict(1009); // sections static StringDict excludeNameDict(1009); // sections
...@@ -7039,9 +7040,12 @@ static int readDir(QFileInfo *fi, ...@@ -7039,9 +7040,12 @@ static int readDir(QFileInfo *fi,
if (exclDict==0 || exclDict->find(cfi->absFilePath())==0) if (exclDict==0 || exclDict->find(cfi->absFilePath())==0)
{ // file should not be excluded { // file should not be excluded
//printf("killDict->find(%s)\n",cfi->absFilePath().data()); //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() && else if (cfi->isFile() &&
(!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) && (!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
...@@ -7159,9 +7163,12 @@ static int readFileOrDirectory(const char *s, ...@@ -7159,9 +7163,12 @@ static int readFileOrDirectory(const char *s,
{ {
if (exclDict==0 || exclDict->find(fi.absFilePath())==0) 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()) else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink())
{ {
...@@ -7542,6 +7549,7 @@ void readConfiguration(int argc, char **argv) ...@@ -7542,6 +7549,7 @@ void readConfiguration(int argc, char **argv)
break; break;
case 'b': case 'b':
setvbuf(stdout,NULL,_IONBF,0); setvbuf(stdout,NULL,_IONBF,0);
Doxygen::outputToWizard=TRUE;
break; break;
case 'h': case 'h':
case '?': case '?':
......
...@@ -100,6 +100,7 @@ class Doxygen ...@@ -100,6 +100,7 @@ class Doxygen
static QTime runningTime; static QTime runningTime;
static SearchIndex *searchIndex; static SearchIndex *searchIndex;
static SDict<DefinitionList> *symbolMap; static SDict<DefinitionList> *symbolMap;
static bool outputToWizard;
}; };
void initDoxygen(); void initDoxygen();
......
...@@ -38,8 +38,9 @@ class DevNullCodeDocInterface : public BaseCodeDocInterface ...@@ -38,8 +38,9 @@ class DevNullCodeDocInterface : public BaseCodeDocInterface
{ {
public: public:
virtual void codify(const char *) {} virtual void codify(const char *) {}
virtual void writeCodeLink(const char *,const char *, virtual void writeCodeLink(const char *ref,const char *file,
const char *,const char *) {} const char *anchor,const char *name)
{ ref=ref; file=file; anchor=anchor; name=name; }
virtual void writeLineNumber(const char *,const char *, virtual void writeLineNumber(const char *,const char *,
const char *,int) {} const char *,int) {}
virtual void startCodeLine() {} virtual void startCodeLine() {}
......
...@@ -660,7 +660,8 @@ void HtmlDocVisitor::visitPost(DocInternal *) ...@@ -660,7 +660,8 @@ void HtmlDocVisitor::visitPost(DocInternal *)
void HtmlDocVisitor::visitPre(DocHRef *href) void HtmlDocVisitor::visitPre(DocHRef *href)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "<a href=\"" << href->url() << "\">"; m_t << "<a href=\"" << href->url() << "\""
<< htmlAttribsToString(href->attribs()) << ">";
} }
void HtmlDocVisitor::visitPost(DocHRef *) void HtmlDocVisitor::visitPost(DocHRef *)
......
...@@ -3018,6 +3018,16 @@ void writeGroupIndex(OutputList &ol) ...@@ -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) void writeIndex(OutputList &ol)
{ {
// save old generator state // save old generator state
...@@ -3040,11 +3050,11 @@ void writeIndex(OutputList &ol) ...@@ -3040,11 +3050,11 @@ void writeIndex(OutputList &ol)
Doxygen::mainPage ? Doxygen::mainPage->getDefLine() : 1; Doxygen::mainPage ? Doxygen::mainPage->getDefLine() : 1;
QCString title; QCString title;
if (!Doxygen::mainPage || Doxygen::mainPage->title().isEmpty()) if (!mainPageHasTitle())
{ {
title = theTranslator->trMainPage(); title = theTranslator->trMainPage();
} }
else if (Doxygen::mainPage) else
{ {
title = substitute(Doxygen::mainPage->title(),"%",""); title = substitute(Doxygen::mainPage->title(),"%","");
} }
...@@ -3149,7 +3159,7 @@ void writeIndex(OutputList &ol) ...@@ -3149,7 +3159,7 @@ void writeIndex(OutputList &ol)
if (Doxygen::mainPage) if (Doxygen::mainPage)
{ {
ol.startIndexSection(isMainPage); ol.startIndexSection(isMainPage);
if (!Doxygen::mainPage->title().isEmpty()) if (mainPageHasTitle())
{ {
ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Doxygen::mainPage->title(),FALSE,FALSE); ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Doxygen::mainPage->title(),FALSE,FALSE);
} }
......
...@@ -294,7 +294,7 @@ void LatexDocVisitor::visit(DocVerbatim *s) ...@@ -294,7 +294,7 @@ void LatexDocVisitor::visit(DocVerbatim *s)
void LatexDocVisitor::visit(DocAnchor *anc) void LatexDocVisitor::visit(DocAnchor *anc)
{ {
if (m_hide) return; 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")) if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
{ {
m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor() m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
...@@ -526,7 +526,7 @@ void LatexDocVisitor::visitPre(DocSection *s) ...@@ -526,7 +526,7 @@ void LatexDocVisitor::visitPre(DocSection *s)
} }
m_t << "\\" << getSectionName(s->level()) << "{"; m_t << "\\" << getSectionName(s->level()) << "{";
filter(s->title()); filter(s->title());
m_t << "}\\label{" << s->anchor() << "}" << endl; m_t << "}\\label{" << s->file() << "_" << s->anchor() << "}" << endl;
} }
void LatexDocVisitor::visitPost(DocSection *) void LatexDocVisitor::visitPost(DocSection *)
...@@ -810,7 +810,7 @@ void LatexDocVisitor::visitPre(DocSecRefItem *) ...@@ -810,7 +810,7 @@ void LatexDocVisitor::visitPre(DocSecRefItem *)
void LatexDocVisitor::visitPost(DocSecRefItem *ref) void LatexDocVisitor::visitPost(DocSecRefItem *ref)
{ {
if (m_hide) return; if (m_hide) return;
m_t << "}{\\ref{" << ref->anchor() << "}}{}" << endl; m_t << "}{\\ref{" << ref->file() << "_" << ref->anchor() << "}}{}" << endl;
} }
void LatexDocVisitor::visitPre(DocSecRefList *) void LatexDocVisitor::visitPre(DocSecRefList *)
...@@ -976,7 +976,8 @@ void LatexDocVisitor::endLink(const QString &ref,const QString &file,const QStri ...@@ -976,7 +976,8 @@ void LatexDocVisitor::endLink(const QString &ref,const QString &file,const QStri
m_t << "}"; m_t << "}";
if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS")) if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS"))
{ {
m_t << "{\\rm ("; filter(theTranslator->trPageAbbreviation()); m_t << "{\\rm (";
filter(theTranslator->trPageAbbreviation());
m_t << "\\,\\pageref{" << file; m_t << "\\,\\pageref{" << file;
if (!anchor.isEmpty()) m_t << "_" << anchor; if (!anchor.isEmpty()) m_t << "_" << anchor;
m_t << "})}"; m_t << "})}";
......
...@@ -113,7 +113,7 @@ void msg(const char *fmt, ...) ...@@ -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) 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 if (!Config_getBool(tag)) return; // warning type disabled
char text[4096]; char text[40960];
vsprintf(text, fmt, args); vsprintf(text, fmt, args);
if (file==0) file="<unknown>"; if (file==0) file="<unknown>";
switch(warnFormatOrder) switch(warnFormatOrder)
......
...@@ -36,64 +36,17 @@ OutputList::OutputList(bool) ...@@ -36,64 +36,17 @@ OutputList::OutputList(bool)
outputs->setAutoDelete(TRUE); 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() OutputList::~OutputList()
{ {
//printf("OutputList::~OutputList()\n"); //printf("OutputList::~OutputList()\n");
delete outputs; 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) void OutputList::add(const OutputGenerator *og)
{ {
if (og) outputs->append(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) void OutputList::disableAllBut(OutputGenerator::OutputType o)
{ {
OutputGenerator *og=outputs->first(); OutputGenerator *og=outputs->first();
...@@ -156,21 +109,6 @@ bool OutputList::isEnabled(OutputGenerator::OutputType o) ...@@ -156,21 +109,6 @@ bool OutputList::isEnabled(OutputGenerator::OutputType o)
return result; 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() void OutputList::pushGeneratorState()
{ {
OutputGenerator *og=outputs->first(); OutputGenerator *og=outputs->first();
......
...@@ -1921,7 +1921,7 @@ void PerlModGenerator::generatePerlModForGroup(GroupDef *gd) ...@@ -1921,7 +1921,7 @@ void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
GroupDef *sgd; GroupDef *sgd;
for (gli.toFirst();(sgd=gli.current());++gli) for (gli.toFirst();(sgd=gli.current());++gli)
m_output.openHash() m_output.openHash()
.addFieldQuotedString("title", gd->groupTitle()) .addFieldQuotedString("title", sgd->groupTitle())
.closeHash(); .closeHash();
m_output.closeList(); m_output.closeList();
} }
......
...@@ -500,12 +500,85 @@ static bool checkForKnRstyleC() ...@@ -500,12 +500,85 @@ static bool checkForKnRstyleC()
return TRUE; 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 /*! 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 * function the type is found \e after the argument list, so this routine
* in needed to fix up. * in needed to fix up.
*/ */
void addKnRArgInfo(const QCString &type,const QCString &name, static void addKnRArgInfo(const QCString &type,const QCString &name,
const QCString &brief,const QCString &docs) const QCString &brief,const QCString &docs)
{ {
if (current->argList==0) return; if (current->argList==0) return;
ArgumentListIterator ali(*current->argList); ArgumentListIterator ali(*current->argList);
...@@ -564,7 +637,7 @@ BS ^(({B}*"//")?)(({B}*"*"+)?){B}* ...@@ -564,7 +637,7 @@ BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+] FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
FILEECHAR [a-z_A-Z0-9\-\+] FILEECHAR [a-z_A-Z0-9\-\+]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"") 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\-]* LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?) SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*"::"{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_;] ...@@ -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 <FuncQual>{ID} { // typically a K&R style C function
if (checkForKnRstyleC()) if (checkForKnRstyleC())
{ {
fprintf(stderr,"===> got a K&R style function\n"); //fprintf(stderr,"===> got a K&R style function\n");
current->args = yytext; current->args = yytext;
oldStyleArgType.resize(0); oldStyleArgType.resize(0);
BEGIN(OldStyleArgs); BEGIN(OldStyleArgs);
...@@ -2863,41 +2936,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2863,41 +2936,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<OldStyleArgs>[,;] { <OldStyleArgs>[,;] {
QCString oldStyleArgPtr; QCString oldStyleArgPtr;
QCString oldStyleArgName; QCString oldStyleArgName;
if (oldStyleArgType.isEmpty()) splitKnRArg(oldStyleArgPtr,oldStyleArgName);
{
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());
QCString doc,brief; QCString doc,brief;
if (current->doc!=docBackup) if (current->doc!=docBackup)
{ {
...@@ -2909,7 +2948,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -2909,7 +2948,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
brief=current->brief.copy(); brief=current->brief.copy();
current->brief=briefBackup; current->brief=briefBackup;
} }
addKnRArgInfo(oldStyleArgType+oldStyleArgPtr,oldStyleArgName,brief,doc); addKnRArgInfo(oldStyleArgType+oldStyleArgPtr,
oldStyleArgName,brief,doc);
current->args.resize(0); current->args.resize(0);
if (*yytext==';') oldStyleArgType.resize(0); if (*yytext==';') oldStyleArgType.resize(0);
} }
...@@ -4404,7 +4444,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -4404,7 +4444,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
} }
<SkipVerbatim><<EOF>> { <SkipVerbatim><<EOF>> {
warn(yyFileName,yyLineNr, 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(); yyterminate();
} }
...@@ -4452,7 +4492,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -4452,7 +4492,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
} }
<SkipCode><<EOF>> { <SkipCode><<EOF>> {
warn(yyFileName,yyLineNr, 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() g_skipBlockName.data()
); );
yyterminate(); yyterminate();
......
...@@ -847,15 +847,53 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item, ...@@ -847,15 +847,53 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item,
Definition *newScope = followPath(scope,fileScope,explicitScopePart); Definition *newScope = followPath(scope,fileScope,explicitScopePart);
if (newScope) // explicitScope is inside scope => newScope is the result 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) if (item->getOuterScope()==newScope)
{ {
//printf("> found it\n"); //printf("> found it\n");
} }
else else
{ {
// repeat for the parent scope
int i=-1; 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) if (scope!=Doxygen::globalScope)
{ {
i = isAccessibleFrom(scope->getOuterScope(),fileScope,item,explicitScopePart); i = isAccessibleFrom(scope->getOuterScope(),fileScope,item,explicitScopePart);
...@@ -1381,17 +1419,24 @@ QCString argListToString(ArgumentList *al) ...@@ -1381,17 +1419,24 @@ QCString argListToString(ArgumentList *al)
result+="("; result+="(";
while (a) 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()) if (!a->attrib.isEmpty())
{ {
result+=a->attrib+" "; result+=a->attrib+" ";
} }
if (!a->name.isEmpty() || !a->array.isEmpty()) if (!a->name.isEmpty() || !a->array.isEmpty())
{ {
result+= a->type+" "+a->name+a->array; result+= type1+" "+a->name+type2+a->array;
} }
else else
{ {
result+= a->type; result+= type1+type2;
} }
if (!a->defval.isEmpty()) if (!a->defval.isEmpty())
{ {
......
...@@ -1467,8 +1467,16 @@ static void generateXMLForPage(PageDef *pd,QTextStream &ti,bool isExample) ...@@ -1467,8 +1467,16 @@ static void generateXMLForPage(PageDef *pd,QTextStream &ti,bool isExample)
t << " <title>" << convertToXML(si->title) << "</title>" << endl; t << " <title>" << convertToXML(si->title) << "</title>" << endl;
} }
t << " <detaileddescription>" << endl; t << " <detaileddescription>" << endl;
writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0, if (isExample)
pd->documentation()+"\n\\include "+pd->name()); {
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 << " </detaileddescription>" << endl;
t << " </compounddef>" << endl; t << " </compounddef>" << endl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment